ESS Maestro3 no sound

Pyun YongHyeon pyunyh at gmail.com
Fri Jul 1 02:32:54 GMT 2005


On Wed, Jun 29, 2005 at 09:07:59AM -0600, Scott Long wrote:

[...]

 > 
 > It looks like yet more decay in the driver.  When I wrote it, I was lazy
 > and didn't want to figure out which chip versions preferred IOPORT
 > mapping and which ones preferred MEMIO, so I just had it try MEMIO first
 > (since that is a better choice) and then fail back to IOPORT.  The
 > resource manager seemed to tolerate this back then, but apparently it
 > doesn't now.  My guess is that the first call to bus_alloc_resource
 > returns success but actually fails, and in the process it leaks the
 > resource out of the resource manager.  Then when you unload and load
 > again, the resource is unavailable (since it was leaked) so the first
 > call to fails, prompting it to go to the second call which succeeds
 > fully.  This would mean that there are now a number of bugs in the
 > resource manager which need to be fixed.
 > 
 > Based on what I've seen over the years, it might be safe to assume that
 > BAR0 on both the meastro3 and allegro1 is IOPORT and that BAR1 on the
 > maestro3 is MEMIO.  Thus, the easiest change might be to just remove
 > the first bus_alloc_resource call and force the driver to always use
 > IOPORT.  I'd still like to use this as a test case for fixing the deeper
 > bugs in the resource manager, though.
 > 

Thanks for detailed explanation. :-)
Here is patch. Muzaffar, does the patch change your situation?

Btw, I encountered dreasful message "play interrupt timeout, channel dead"
again. Unloading the driver and then reloading the driver fixed it.
Since I see "pci_link2: Unable to choose an IRQ" during driver load
I can't sure it's fault of maestro3(4) driver.

 > Scott

PS. Due to mail server issues I sent again.
-- 
Regards,
Pyun YongHyeon
-------------- next part --------------
--- maestro3.c.orig	Mon May 23 15:27:07 2005
+++ maestro3.c	Thu Jun 30 14:55:02 2005
@@ -1203,19 +1203,21 @@
 		}
 	}
 
+	pci_enable_busmaster(dev);
 	data = pci_read_config(dev, PCIR_COMMAND, 2);
-	data |= (PCIM_CMD_PORTEN | PCIM_CMD_MEMEN | PCIM_CMD_BUSMASTEREN);
+	data |= (PCIM_CMD_PORTEN | PCIM_CMD_MEMEN);
 	pci_write_config(dev, PCIR_COMMAND, data, 2);
 
 	sc->regid = PCIR_BAR(0);
-	sc->regtype = SYS_RES_MEMORY;
+	data = pci_read_config(dev, PCIR_COMMAND, 2);
+	device_printf(dev,"PCIR_COMMAND = 0x%x\n", data);
+	sc->regtype = SYS_RES_IOPORT;
+	if ((data & PCIM_CMD_PORTEN) == 0) {
+		sc->regtype = SYS_RES_MEMORY;
+		device_printf(dev,"using memory mapped I/O\n");
+	}
 	sc->reg = bus_alloc_resource_any(dev, sc->regtype, &sc->regid,
 					 RF_ACTIVE);
-	if (!sc->reg) {
-		sc->regtype = SYS_RES_IOPORT;
-		sc->reg = bus_alloc_resource_any(dev, sc->regtype, &sc->regid,
-						 RF_ACTIVE);
-	}
 	if (!sc->reg) {
 		device_printf(dev, "unable to allocate register space\n");
 		goto bad;


More information about the freebsd-multimedia mailing list