em/emx: Retry interrupt allocation with MSI
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 18 Jan 2017 09:09:04 +0000 (17:09 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 18 Jan 2017 09:09:04 +0000 (17:09 +0800)
Reported-by: jh32
sys/dev/netif/em/if_em.c
sys/dev/netif/emx/if_emx.c

index ec22e86..6c5a755 100644 (file)
@@ -2334,7 +2334,7 @@ em_alloc_pci_res(struct adapter *adapter)
             adapter->hw.mac.type == e1000_82571 ||
             adapter->hw.mac.type == e1000_82572))
                msi_enable = 0;
-
+again:
        adapter->intr_type = pci_alloc_1intr(dev, msi_enable,
            &adapter->intr_rid, &intr_flags);
 
@@ -2356,8 +2356,15 @@ em_alloc_pci_res(struct adapter *adapter)
        adapter->intr_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
            &adapter->intr_rid, intr_flags);
        if (adapter->intr_res == NULL) {
-               device_printf(dev, "Unable to allocate bus resource: "
-                   "interrupt\n");
+               device_printf(dev, "Unable to allocate bus resource: %s\n",
+                   adapter->intr_type == PCI_INTR_TYPE_MSI ?
+                   "MSI" : "legacy intr");
+               if (!msi_enable) {
+                       /* Retry with MSI. */
+                       msi_enable = 1;
+                       adapter->flags &= ~EM_FLAG_SHARED_INTR;
+                       goto again;
+               }
                return (ENXIO);
        }
 
index 41f95d9..187081e 100644 (file)
@@ -538,7 +538,7 @@ emx_attach(device_t dev)
            (sc->hw.mac.type == e1000_82571 ||
             sc->hw.mac.type == e1000_82572))
                msi_enable = 0;
-
+again:
        /*
         * Allocate interrupt
         */
@@ -563,8 +563,14 @@ emx_attach(device_t dev)
        sc->intr_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->intr_rid,
            intr_flags);
        if (sc->intr_res == NULL) {
-               device_printf(dev, "Unable to allocate bus resource: "
-                   "interrupt\n");
+               device_printf(dev, "Unable to allocate bus resource: %s\n",
+                   sc->intr_type == PCI_INTR_TYPE_MSI ? "MSI" : "legacy intr");
+               if (!msi_enable) {
+                       /* Retry with MSI. */
+                       msi_enable = 1;
+                       sc->flags &= ~EMX_FLAG_SHARED_INTR;
+                       goto again;
+               }
                error = ENXIO;
                goto fail;
        }