aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/usb/controller
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2020-11-06 00:35:36 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2020-11-06 00:35:36 +0000
commit6c57f50bf572ef7b67ddcebc6b44d37d0c0ad326 (patch)
treeb7c778ce59b200a06fefc3efd10b2b62489adabf /sys/dev/usb/controller
parenta41b2dd19733bf398290fa5ac74677475856afa5 (diff)
Notes
Diffstat (limited to 'sys/dev/usb/controller')
-rw-r--r--sys/dev/usb/controller/xhci_pci.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/sys/dev/usb/controller/xhci_pci.c b/sys/dev/usb/controller/xhci_pci.c
index 5c59d7c989dc..d18a115709b1 100644
--- a/sys/dev/usb/controller/xhci_pci.c
+++ b/sys/dev/usb/controller/xhci_pci.c
@@ -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,16 +399,16 @@ 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);