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