diff options
author | jdp <jdp@FreeBSD.org> | 2006-12-14 23:10:12 +0000 |
---|---|---|
committer | jdp <jdp@FreeBSD.org> | 2006-12-14 23:10:12 +0000 |
commit | 5aeb99b0439f3c59d8bf7fd3b9fc0061231e454f (patch) | |
tree | 07f1ee9de63d0aeab7db54f8b6937ea7e318c2b3 /sys/dev | |
parent | 7cc2522d0abd2b1c9374fe6e4bb2d9f24a18bb71 (diff) | |
download | FreeBSD-src-5aeb99b0439f3c59d8bf7fd3b9fc0061231e454f.zip FreeBSD-src-5aeb99b0439f3c59d8bf7fd3b9fc0061231e454f.tar.gz |
Add MSI support to the bge driver. I tested this on a Dell SC1435
running an i386 kernel, and it worked fine.
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/bge/if_bge.c | 22 | ||||
-rw-r--r-- | sys/dev/bge/if_bgereg.h | 1 |
2 files changed, 19 insertions, 4 deletions
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c index 3187f50..4022b0b 100644 --- a/sys/dev/bge/if_bge.c +++ b/sys/dev/bge/if_bge.c @@ -2113,7 +2113,7 @@ bge_attach(device_t dev) uint32_t hwcfg = 0; uint32_t mac_tmp = 0; u_char eaddr[6]; - int error = 0, rid, trys, reg; + int error = 0, msicount, rid, trys, reg; sc = device_get_softc(dev); sc->bge_dev = dev; @@ -2136,8 +2136,18 @@ bge_attach(device_t dev) sc->bge_btag = rman_get_bustag(sc->bge_res); sc->bge_bhandle = rman_get_bushandle(sc->bge_res); - /* Allocate interrupt. */ - rid = 0; + /* + * Allocate the interrupt, using MSI if possible. These devices + * support 8 MSI messages, but only the first one is used in + * normal operation. + */ + if ((msicount = pci_msi_count(dev)) > 1) + msicount = 1; + if (msicount == 1 && pci_alloc_msi(dev, &msicount) == 0) { + rid = 1; + sc->bge_flags |= BGE_FLAG_MSI; + } else + rid = 0; sc->bge_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE); @@ -2492,7 +2502,11 @@ bge_release_resources(struct bge_softc *sc) bus_teardown_intr(dev, sc->bge_irq, sc->bge_intrhand); if (sc->bge_irq != NULL) - bus_release_resource(dev, SYS_RES_IRQ, 0, sc->bge_irq); + bus_release_resource(dev, SYS_RES_IRQ, + sc->bge_flags & BGE_FLAG_MSI ? 1 : 0, sc->bge_irq); + + if (sc->bge_flags & BGE_FLAG_MSI) + pci_release_msi(dev); if (sc->bge_res != NULL) bus_release_resource(dev, SYS_RES_MEMORY, diff --git a/sys/dev/bge/if_bgereg.h b/sys/dev/bge/if_bgereg.h index 82ac370..b0259fa 100644 --- a/sys/dev/bge/if_bgereg.h +++ b/sys/dev/bge/if_bgereg.h @@ -2477,6 +2477,7 @@ struct bge_softc { #define BGE_FLAG_5705_PLUS 0x00000200 #define BGE_FLAG_5714_FAMILY 0x00000400 #define BGE_FLAG_575X_PLUS 0x00000800 +#define BGE_FLAG_MSI 0x00001000 uint32_t bge_chipid; uint8_t bge_asicrev; uint8_t bge_chiprev; |