emx: Don't enable MSI on 82571/82572
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 5 Jul 2012 06:48:40 +0000 (14:48 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 5 Jul 2012 06:48:40 +0000 (14:48 +0800)
You could still forcefully enable MSI by using hw.emX.msi.enable;
useful certain systems

Obtained-from: OpenBSD

sys/dev/netif/emx/if_emx.c

index ee8f8bc..baca0ca 100644 (file)
@@ -413,7 +413,7 @@ emx_attach(device_t dev)
 {
        struct emx_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
-       int error = 0, i, throttle;
+       int error = 0, i, throttle, msi_enable;
        u_int intr_flags;
        uint16_t eeprom_data, device_id, apme_mask;
 
@@ -465,10 +465,20 @@ emx_attach(device_t dev)
        /* XXX This is quite goofy, it is not actually used */
        sc->hw.hw_addr = (uint8_t *)&sc->osdep.mem_bus_space_handle;
 
+       /*
+        * Don't enable MSI on 82571/82572, see:
+        * 82571EB/82572EI specification update
+        */
+       msi_enable = emx_msi_enable;
+       if (msi_enable &&
+           (sc->hw.mac.type == e1000_82571 ||
+            sc->hw.mac.type == e1000_82572))
+               msi_enable = 0;
+
        /*
         * Allocate interrupt
         */
-       sc->intr_type = pci_alloc_1intr(dev, emx_msi_enable,
+       sc->intr_type = pci_alloc_1intr(dev, msi_enable,
            &sc->intr_rid, &intr_flags);
 
        sc->intr_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->intr_rid,