Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Oct 2010 00:46:46 +0200
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        freebsd-usb@freebsd.org
Subject:   Possible solution for USB EHCI IRQ problems
Message-ID:  <201010150046.46203.hselasky@c2i.net>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010150046.46203.hselasky>