Date: Wed, 5 Dec 2001 10:18:48 +0100 (CET) From: b@etek.chalmers.se To: FreeBSD-gnats-submit@freebsd.org Cc: b@etek.chalmers.se Subject: kern/32530: Fix for midi(4) causing hang at boot with some SB AWE64 cards Message-ID: <200112050918.fB59Imi42578@scrooge.etek.chalmers.se>
next in thread | raw e-mail | index | archive | help
>Number: 32530
>Category: kern
>Synopsis: Fix for midi(4) causing hang at boot with some SB AWE64 cards
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Dec 05 01:20:08 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: Magnus Backstrom
>Release: FreeBSD 5.0-CURRENT i386
>Organization:
Chalmers UofT
>Environment:
FreeBSD knase19.etek.chalmers.se 5.0-CURRENT FreeBSD 5.0-CURRENT #4: Wed Dec 5 09:33:11 CET 2001 root@knase19.etek.chalmers.se:/usr/src/sys/i386/compile/FNATT i386
>Description:
I tried configuring a kernel with midi. The machine stopped dead while
booting, right after finding the emu8000 wavetable chip on a SB AWE64 PNP
card in the machine.
It turns out the card has a bug which results in some I/O registers not
getting configured by PNP. The driver did not correctly recognize the
situation, and got stuck in a loop while interviewing the card.
I located and fixed the immediate problem. Please see the patches
below, and advise.
>How-To-Repeat:
Configure midi into a 5.0-CURRENT kernel, and have an AWE64 in your machine
that isn't known by sys/isa/pnp.c->pnp_quirks.
>Fix:
Two patches. One for the driver, one to update a table of PNP IDs a bit:
Patch #1, repairs the emu8000 resource allocation so that an
incorrectly PNP-configured card gets rejected gracefully instead of
causing a hang.
================================================================
--- sys/dev/sound/isa/emu8000.c.ctm Fri Nov 16 16:34:19 2001
+++ sys/dev/sound/isa/emu8000.c Wed Dec 5 09:08:48 2001
@@ -1895,30 +1895,39 @@
static int
emu_allocres(sc_p scp, device_t dev)
{
- int iobase;
+ int i;
- if (scp->io[0] == NULL) {
- scp->io_rid[0] = 0;
- scp->io[0] = bus_alloc_resource(dev, SYS_RES_IOPORT, &scp->io_rid[0], 0, ~0, 4, RF_ACTIVE);
- }
- if (scp->io[0] == NULL)
- return (1);
- iobase = rman_get_start(scp->io[0]);
- if (scp->io[1] == NULL) {
- scp->io_rid[1] = 1;
- scp->io[1] = bus_alloc_resource(dev, SYS_RES_IOPORT, &scp->io_rid[1], iobase + 0x400, iobase + 0x400 + 3, 4, RF_ACTIVE);
- }
- if (scp->io[2] == NULL) {
- scp->io_rid[2] = 2;
- scp->io[2] = bus_alloc_resource(dev, SYS_RES_IOPORT, &scp->io_rid[2], iobase + 0x800, iobase + 0x800 + 3, 4, RF_ACTIVE);
+ /*
+ * Attempt to allocate the EMU8000's three I/O port ranges.
+ */
+ for (i = 0; i < 3; i++)
+ {
+ if (scp->io[i] == NULL)
+ {
+ scp->io_rid[i] = i;
+ scp->io[i] = bus_alloc_resource(dev, SYS_RES_IOPORT,
+ &(scp->io_rid[i]),
+ 0, ~0, 4, RF_ACTIVE);
+ }
}
- if (scp->io[0] == NULL || scp->io[1] == NULL || scp->io[2] == NULL) {
- printf("emu_allocres: failed.\n");
- return (1);
+ /*
+ * Fail if any of the I/O ranges failed (I.e. weren't identified and
+ * configured by PNP, which can happen if the ID of the card isn't
+ * known by the PNP quirk-handling logic)
+ */
+ if (scp->io[0] == NULL || scp->io[1] == NULL || scp->io[2] == NULL)
+ {
+ printf("emu%d: Resource alloc failed, pnp_quirks "
+ "may need { 0x%08x, 0x%08x }\n",
+ device_get_unit(dev),
+ isa_get_vendorid(dev),
+ isa_get_logicalid(dev));
+
+ return 1;
}
- return (0);
+ return 0;
}
/* Releases resources. */
================================================================
Patch #2, adds the Vendor and Logical IDs of the particular kind of
AWE64 board that I have to the pnp_quirks table in sys/isa/pnp.c,
thus enabling correct probe/attach of the card.
================================================================
--- sys/isa/pnp.c.ctm Fri Nov 16 16:34:35 2001
+++ sys/isa/pnp.c Wed Dec 5 09:31:18 2001
@@ -83,6 +83,8 @@
PNP_QUIRK_EXTRA_IO, 0x400, 0x800 },
{ 0xc1008c0e /* SB64(CTL00c1) */, 0x22008c0e,
PNP_QUIRK_EXTRA_IO, 0x400, 0x800 },
+ { 0xc5008c0e /* SB64(CTL00c5) */, 0x22008c0e,
+ PNP_QUIRK_EXTRA_IO, 0x400, 0x800 },
{ 0xe4008c0e /* SB64(CTL00e4) */, 0x22008c0e,
PNP_QUIRK_EXTRA_IO, 0x400, 0x800 },
================================================================
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200112050918.fB59Imi42578>
