summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/controller/xhci_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/controller/xhci_pci.c')
-rw-r--r--sys/dev/usb/controller/xhci_pci.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/sys/dev/usb/controller/xhci_pci.c b/sys/dev/usb/controller/xhci_pci.c
index e6f937f..0a8a95b 100644
--- a/sys/dev/usb/controller/xhci_pci.c
+++ b/sys/dev/usb/controller/xhci_pci.c
@@ -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);
OpenPOWER on IntegriCloud