From owner-svn-src-all@FreeBSD.ORG Mon Jan 21 07:25:38 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id DF025E73; Mon, 21 Jan 2013 07:25:38 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id B477FF34; Mon, 21 Jan 2013 07:25:38 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r0L7Pcki007522; Mon, 21 Jan 2013 07:25:38 GMT (envelope-from hselasky@svn.freebsd.org) Received: (from hselasky@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r0L7Pc3T007521; Mon, 21 Jan 2013 07:25:38 GMT (envelope-from hselasky@svn.freebsd.org) Message-Id: <201301210725.r0L7Pc3T007521@svn.freebsd.org> From: Hans Petter Selasky Date: Mon, 21 Jan 2013 07:25:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r245732 - stable/9/sys/dev/usb/controller X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Jan 2013 07:25:39 -0000 Author: hselasky Date: Mon Jan 21 07:25:38 2013 New Revision: 245732 URL: http://svnweb.freebsd.org/changeset/base/245732 Log: MFC r245132 and r245175: Optimise the XHCI interrupt handling. This patch will save CPU time when the XHCI interrupt is shared with other devices. Only check event rings when interrupt bits are set. Otherwise would indicate hiding possible hardware fault(s). Tested by: sos @ Submitted by: sos @ Modified: stable/9/sys/dev/usb/controller/xhci.c Directory Properties: stable/9/sys/ (props changed) stable/9/sys/dev/ (props changed) Modified: stable/9/sys/dev/usb/controller/xhci.c ============================================================================== --- stable/9/sys/dev/usb/controller/xhci.c Mon Jan 21 07:22:45 2013 (r245731) +++ stable/9/sys/dev/usb/controller/xhci.c Mon Jan 21 07:25:38 2013 (r245732) @@ -1440,26 +1440,37 @@ 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 (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); + } - DPRINTFN(16, "real interrupt (sts=0x%08x, " - "iman=0x%08x)\n", status, temp); + if (status & (XHCI_STS_PCD | XHCI_STS_HCH | + XHCI_STS_HSE | XHCI_STS_HCE)) { - if (status != 0) { if (status & XHCI_STS_PCD) { xhci_root_intr(sc); } @@ -1479,9 +1490,7 @@ xhci_interrupt(struct xhci_softc *sc) __FUNCTION__); } } - - xhci_interrupt_poll(sc); - +done: USB_BUS_UNLOCK(&sc->sc_bus); }