Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Dec 2015 09:40:29 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r292683 - head/sys/dev/usb/controller
Message-ID:  <201512240940.tBO9eTeQ093781@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Thu Dec 24 09:40:29 2015
New Revision: 292683
URL: https://svnweb.freebsd.org/changeset/base/292683

Log:
  Ads support to the xhci pci attachment to use MSI-X interrupts when
  available. As with MSI interrupts these can be disabled by setting
  hw.usb.xhci.msix to 0 in the loader.
  
  MSI-X interrupts are needed on some hardware, for example the Cavium
  ThunderX only supports them, and with this we don't fall back to polling.
  
  PR:		204378
  Reviewed by:	hselasky, jhb
  MFC after:	1 week (after r292669)
  Sponsored by:	ABT Systems Ltd
  Differential Revision:	https://reviews.freebsd.org/D4698

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

Modified: head/sys/dev/usb/controller/xhci.h
==============================================================================
--- head/sys/dev/usb/controller/xhci.h	Thu Dec 24 06:22:41 2015	(r292682)
+++ head/sys/dev/usb/controller/xhci.h	Thu Dec 24 09:40:29 2015	(r292683)
@@ -465,6 +465,7 @@ struct xhci_softc {
 	struct usb_device	*sc_devices[XHCI_MAX_DEVICES];
 	struct resource		*sc_io_res;
 	struct resource		*sc_irq_res;
+	struct resource		*sc_msix_res;
 
 	void			*sc_intr_hdl;
 	bus_size_t		sc_io_size;

Modified: head/sys/dev/usb/controller/xhci_pci.c
==============================================================================
--- head/sys/dev/usb/controller/xhci_pci.c	Thu Dec 24 06:22:41 2015	(r292682)
+++ head/sys/dev/usb/controller/xhci_pci.c	Thu Dec 24 09:40:29 2015	(r292683)
@@ -148,6 +148,8 @@ xhci_pci_probe(device_t self)
 
 static int xhci_use_msi = 1;
 TUNABLE_INT("hw.usb.xhci.msi", &xhci_use_msi);
+static int xhci_use_msix = 1;
+TUNABLE_INT("hw.usb.xhci.msix", &xhci_use_msix);
 
 static void
 xhci_interrupt_poll(void *_sc)
@@ -188,7 +190,7 @@ static int
 xhci_pci_attach(device_t self)
 {
 	struct xhci_softc *sc = device_get_softc(self);
-	int count, err, rid;
+	int count, err, msix_table, rid;
 	uint8_t usemsi = 1;
 	uint8_t usedma32 = 0;
 
@@ -240,7 +242,27 @@ xhci_pci_attach(device_t self)
 	usb_callout_init_mtx(&sc->sc_callout, &sc->sc_bus.bus_mtx, 0);
 
 	rid = 0;
-	if (xhci_use_msi && usemsi) {
+	if (xhci_use_msix && (msix_table = pci_msix_table_bar(self)) >= 0) {
+		sc->sc_msix_res = bus_alloc_resource_any(self, SYS_RES_MEMORY,
+		    &msix_table, RF_ACTIVE);
+		if (sc->sc_msix_res == NULL) {
+			/* May not be enabled */
+			device_printf(self,
+			    "Unable to map MSI-X table \n");
+		} else {
+			count = 1;
+			if (pci_alloc_msix(self, &count) == 0) {
+				if (bootverbose)
+					device_printf(self, "MSI-X enabled\n");
+				rid = 1;
+			} else {
+				bus_release_resource(self, SYS_RES_MEMORY,
+				    msix_table, sc->sc_msix_res);
+				sc->sc_msix_res = NULL;
+			}
+		}
+	}
+	if (rid == 0 && xhci_use_msi && usemsi) {
 		count = 1;
 		if (pci_alloc_msi(self, &count) == 0) {
 			if (bootverbose)
@@ -341,6 +363,11 @@ xhci_pci_detach(device_t self)
 		    sc->sc_io_res);
 		sc->sc_io_res = NULL;
 	}
+	if (sc->sc_msix_res) {
+		bus_release_resource(self, SYS_RES_MEMORY,
+		    rman_get_rid(sc->sc_msix_res), sc->sc_msix_res);
+		sc->sc_msix_res = NULL;
+	}
 
 	xhci_uninit(sc);
 



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