Possible solution for USB EHCI IRQ problems

Hans Petter Selasky hselasky at c2i.net
Thu Oct 14 22:52:58 UTC 2010


Hi,

Anyone out there experiencing so-called EHCI-hangs, can try applying the 
following patch by hand:

http://p4web.freebsd.org/@@184749?ac=10

==== //depot/projects/usb/src/sys/dev/usb/controller/ehci.c#62 (text+ko) ====

@@ -1589,6 +1589,10 @@
                usb_callout_reset(&sc->sc_tmo_pcd, hz,
                    (void *)&ehci_pcd_enable, sc);
        }
+       /* if there was a doorbell, clear the doorbell busy flag */
+       if (status & EHCI_STS_IAA)
+               sc->sc_flags &= ~EHCI_SCFLG_IAADBUSY;
+
        status &= ~(EHCI_STS_INT | EHCI_STS_ERRINT | EHCI_STS_PCD | 
EHCI_STS_IAA);
 
        if (status != 0) {
@@ -2313,7 +2317,7 @@
         * XXX Certain nVidia chipsets choke when using the IAAD
         * feature too frequently.
         */
-       if (sc->sc_flags & EHCI_SCFLG_IAADBUG)
+       if (sc->sc_flags & (EHCI_SCFLG_IAADBUG | EHCI_SCFLG_IAADBUSY))
                return;
 
        /* XXX Performance quirk: Some Host Controllers have a too low
@@ -2321,8 +2325,10 @@
         * Controller after queueing the BULK transfer.
         */
        temp = EOREAD4(sc, EHCI_USBCMD);
-       if (!(temp & EHCI_CMD_IAAD))
+       if (!(temp & EHCI_CMD_IAAD)) {
                EOWRITE4(sc, EHCI_USBCMD, temp | EHCI_CMD_IAAD);
+               sc->sc_flags |= EHCI_SCFLG_IAADBUSY;
+       }
 }
 
 struct usb_pipe_methods ehci_device_bulk_methods =

==== //depot/projects/usb/src/sys/dev/usb/controller/ehci.h#20 (text+ko) ====

@@ -347,6 +347,7 @@
 #define        EHCI_SCFLG_TT           0x0020  /* transaction translator 
present */
 #define        EHCI_SCFLG_LOSTINTRBUG  0x0040  /* workaround for VIA / ATI 
chipsets */
 #define        EHCI_SCFLG_IAADBUG      0x0080  /* workaround for nVidia 
chipsets */
+#define        EHCI_SCFLG_IAADBUSY     0x0100  /* doorbell is busy */
 
        uint8_t sc_offs;                /* offset to operational registers */
        uint8_t sc_doorbell_disable;    /* set on doorbell failure */


--HPS


More information about the freebsd-current mailing list