Author: hselasky
Date: Tue Jan  8 19:38:57 2013
New Revision: 245175
URL: http://svnweb.freebsd.org/changeset/base/245175
Log:
  Shave off another register write to save some more
  microseconds of PCI access time.
  
  Tested by:    sos @
  Submitted by: sos @
  MFC after:    1 week

Modified:
  head/sys/dev/usb/controller/xhci.c

Modified: head/sys/dev/usb/controller/xhci.c
==============================================================================
--- head/sys/dev/usb/controller/xhci.c  Tue Jan  8 19:16:28 2013        
(r245174)
+++ head/sys/dev/usb/controller/xhci.c  Tue Jan  8 19:38:57 2013        
(r245175)
@@ -1440,24 +1440,33 @@ void
 xhci_interrupt(struct xhci_softc *sc)
 {
        uint32_t status;
-       uint32_t temp;
+       uint32_t iman;
 
        USB_BUS_LOCK(&sc->sc_bus);
 
        status = XREAD4(sc, oper, XHCI_USBSTS);
+       if (status == 0)
+               goto done;
 
        /* acknowledge interrupts */
 
        XWRITE4(sc, oper, XHCI_USBSTS, status);
 
-       temp = XREAD4(sc, runt, XHCI_IMAN(0));
-
-       /* acknowledge pending event */
-
-       XWRITE4(sc, runt, XHCI_IMAN(0), temp);
-
-       DPRINTFN(16, "real interrupt (sts=0x%08x, "
-           "iman=0x%08x)\n", status, temp);
+       DPRINTFN(16, "real interrupt (status=0x%08x)\n", status);
+ 
+       if (status & XHCI_STS_EINT) {
+
+               /* acknowledge pending event */
+               iman = XREAD4(sc, runt, XHCI_IMAN(0));
+
+               /* reset interrupt */
+               XWRITE4(sc, runt, XHCI_IMAN(0), iman);
+ 
+               DPRINTFN(16, "real interrupt (iman=0x%08x)\n", iman);
+ 
+               /* check for event(s) */
+               xhci_interrupt_poll(sc);
+       }
 
        if (status & (XHCI_STS_PCD | XHCI_STS_HCH |
            XHCI_STS_HSE | XHCI_STS_HCE)) {
@@ -1481,11 +1490,7 @@ xhci_interrupt(struct xhci_softc *sc)
                           __FUNCTION__);
                }
        }
-
-       /* check if we need to check the event rings */
-       if ((status != 0) || (temp & XHCI_IMAN_INTR_PEND))
-               xhci_interrupt_poll(sc);
-
+done:
        USB_BUS_UNLOCK(&sc->sc_bus);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to