[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-bugs
Subject:    kern/162181: [patch] The kernel sound driver module snd_emu10k1.ko
From:       Geoff Bailey <baileygeoff () telus ! net>
Date:       2011-10-31 4:57:37
Message-ID: 201110310457.p9V4vbPR004366 () red ! freebsd ! org
[Download RAW message or body]


> Number:         162181
> Category:       kern
> Synopsis:       [patch] The kernel sound driver module snd_emu10k1.ko hangs when \
>                 loaded.
> Confidential:   no
> Severity:       serious
> Priority:       low
> Responsible:    freebsd-bugs
> State:          open
> Quarter:        
> Keywords:       
> Date-Required:
> Class:          sw-bug
> Submitter-Id:   current-users
> Arrival-Date:   Mon Oct 31 05:00:26 UTC 2011
> Closed-Date:
> Last-Modified:
> Originator:     Geoff Bailey
> Release:        FreeBSD 9.0-RC1 i386
> Organization:
> Environment:
System: 
FreeBSD leon 9.0-RC1 FreeBSD 9.0-RC1 #0: Tue Oct 18 18:30:38 UTC 2011 \
root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386

Sound Card: 
pcm0: <Creative EMU10K1> port 0xdf80-0xdf9f irq 9 at device 12.0 on pci2

pciconf -lbv:
pcm0@pci0:2:12:0: class=0x040100 card=0x80271102 chip=0x00021102 rev=0x08 hdr=0x00
    vendor     = 'Creative Labs'
    device     = 'SB Live! EMU10k1'
    class      = multimedia
    subclass   = audio
    bar   [10] = type I/O Port, range 32, base 0xdf80, size 32, enabled

> Description:
When you load the emu10k1 sound driver (kldload snd_emu10k1) it prints the   sndstat \
message "<Creative EMU10K1> port 0xdf80-0xdf9f irq 9 at device 12.0 on pci2" then the \
system hangs and must be powered down to continue.  
The hang usually happens in the middle of the emu_init() function while initializing \
the envelope engine, yet the problem appears not to be related to this section of \
code.  
The emu10kx driver works on my box but midi has been disabled in this driver.
> How-To-Repeat:
kldload snd_emu10k1
> Fix:
1.  In the "emu_pci_attach()" function, move the "snd_setup_intr()" call before
    the call to "emu_init()".

2.  Disable hardware midi interrupts in function "emu_midiattach()", since the 
    midi2 driver uses software interrupts.

    With Fix-1 above only, the driver continuously sends "dodgy irq" messages
    from the "emu_intr()" function and the system hangs again.
    
    
With these two changes (see attached patch), both audio and midi work as expected.

Patch attached with submission follows:

--- /usr/src/sys/dev/sound/pci/emu10k1.c Sun 30 Oct 2011 13:42:48 PDT
+++ /usr/src/sys/dev/sound/pci/emu10k1.c Sun 30 Oct 2011 13:42:48 PDT
@@ -1120,12 +1120,14 @@
 static void
 emu_midiattach(struct sc_info *sc)
 {
+	/* midi2 uses a software interupt
 	int i;
 
 	i = emu_rd(sc, INTE, 4);
 	i |= INTE_MIDIRXENABLE;
 	emu_wr(sc, INTE, i, 4);
-
+	*/
+	
 	sc->mpu = mpu401_init(&emu_mpu_class, sc, emu_intr2, &sc->mpu_intr);
 }
 /* -------------------------------------------------------------------- */
@@ -2026,7 +2028,16 @@
 		device_printf(dev, "unable to create dma tag\n");
 		goto bad;
 	}
-
+	
+	i = 0;
+	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i,
+	    RF_ACTIVE | RF_SHAREABLE);
+	if (!sc->irq ||
+	    snd_setup_intr(dev, sc->irq, INTR_MPSAFE, emu_intr, sc, &sc->ih)) {
+		device_printf(dev, "unable to map interrupt\n");
+		goto bad;
+	}
+	
 	if (emu_init(sc) == -1) {
 		device_printf(dev, "unable to initialize the card\n");
 		goto bad;
@@ -2039,15 +2050,6 @@
 
 	emu_midiattach(sc);
 
-	i = 0;
-	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i,
-	    RF_ACTIVE | RF_SHAREABLE);
-	if (!sc->irq ||
-	    snd_setup_intr(dev, sc->irq, INTR_MPSAFE, emu_intr, sc, &sc->ih)) {
-		device_printf(dev, "unable to map interrupt\n");
-		goto bad;
-	}
-
 	snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld %s",
 	    rman_get_start(sc->reg), rman_get_start(sc->irq),
 	    PCM_KLDSTRING(snd_emu10k1));


> Release-Note:
> Audit-Trail:
> Unformatted:
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscribe@freebsd.org"


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic