svn commit: r367411 - stable/12/sys/dev/usb/controller

Konstantin Belousov kib at FreeBSD.org
Fri Nov 6 00:35:37 UTC 2020


Author: kib
Date: Fri Nov  6 00:35:36 2020
New Revision: 367411
URL: https://svnweb.freebsd.org/changeset/base/367411

Log:
  MFC r366978:
  xhci: Handle the case when MSI-X BAR is the same as IO BAR.

Modified:
  stable/12/sys/dev/usb/controller/xhci_pci.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/usb/controller/xhci_pci.c
==============================================================================
--- stable/12/sys/dev/usb/controller/xhci_pci.c	Fri Nov  6 00:15:52 2020	(r367410)
+++ stable/12/sys/dev/usb/controller/xhci_pci.c	Fri Nov  6 00:35:36 2020	(r367411)
@@ -281,21 +281,29 @@ xhci_pci_attach(device_t self)
 
 	rid = 0;
 	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");
+		if (msix_table == PCI_XHCI_CBMEM) {
+			sc->sc_msix_res = sc->sc_io_res;
 		} else {
+			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");
+			}
+		}
+		if (sc->sc_msix_res != NULL) {
 			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);
+				if (sc->sc_msix_res != sc->sc_io_res) {
+					bus_release_resource(self,
+					    SYS_RES_MEMORY,
+					    msix_table, sc->sc_msix_res);
+				}
 				sc->sc_msix_res = NULL;
 			}
 		}
@@ -391,15 +399,15 @@ xhci_pci_detach(device_t self)
 		sc->sc_irq_res = NULL;
 		pci_release_msi(self);
 	}
+	if (sc->sc_msix_res != NULL && sc->sc_msix_res != sc->sc_io_res) {
+		bus_release_resource(self, SYS_RES_MEMORY,
+		    rman_get_rid(sc->sc_msix_res), sc->sc_msix_res);
+		sc->sc_msix_res = NULL;
+	}
 	if (sc->sc_io_res) {
 		bus_release_resource(self, SYS_RES_MEMORY, PCI_XHCI_CBMEM,
 		    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);


More information about the svn-src-stable mailing list