From 2f39471c4321ca35535eebedea9c8fc2df2b328d Mon Sep 17 00:00:00 2001 From: Tim Bisson Date: Sun, 18 Mar 2012 19:39:37 -0700 Subject: [PATCH] Use MSI if device supports it. RT8168E supports MSI. --- sys/dev/netif/re/if_re.c | 19 ++++++++++++++----- sys/dev/netif/re/if_revar.h | 2 ++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index 34d7b9a..bcd8665 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -383,9 +383,11 @@ DRIVER_MODULE(miibus, re, miibus_driver, miibus_devclass, NULL, NULL); static int re_rx_desc_count = RE_RX_DESC_CNT_DEF; static int re_tx_desc_count = RE_TX_DESC_CNT_DEF; +static int re_msi_enable = 1; TUNABLE_INT("hw.re.rx_desc_count", &re_rx_desc_count); TUNABLE_INT("hw.re.tx_desc_count", &re_tx_desc_count); +TUNABLE_INT("hw.re.msi.enable", &re_msi_enable); #define EE_SET(x) \ CSR_WRITE_1(sc, RE_EECMD, CSR_READ_1(sc, RE_EECMD) | (x)) @@ -1302,6 +1304,7 @@ re_attach(device_t dev) struct ifnet *ifp; uint8_t eaddr[ETHER_ADDR_LEN]; int error = 0, rid, qlen; + u_int irq_flags; callout_init(&sc->re_timer); sc->re_dev = dev; @@ -1432,10 +1435,11 @@ re_attach(device_t dev) sc->re_bhandle = rman_get_bushandle(sc->re_res); /* Allocate interrupt */ - rid = 0; - sc->re_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_SHAREABLE | RF_ACTIVE); - + sc->re_irq_type = pci_alloc_1intr(dev, re_msi_enable, + &sc->re_irq_rid, &irq_flags); + + sc->re_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->re_irq_rid, + irq_flags); if (sc->re_irq == NULL) { device_printf(dev, "couldn't map interrupt\n"); error = ENXIO; @@ -1655,7 +1659,12 @@ re_detach(device_t dev) sysctl_ctx_free(&sc->re_sysctl_ctx); if (sc->re_irq) - bus_release_resource(dev, SYS_RES_IRQ, 0, sc->re_irq); + bus_release_resource(dev, SYS_RES_IRQ, sc->re_irq_rid, + sc->re_irq); + + if (sc->re_irq_type == PCI_INTR_TYPE_MSI) + pci_release_msi(dev); + if (sc->re_res) { bus_release_resource(dev, SYS_RES_IOPORT, RE_PCI_LOIO, sc->re_res); diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index 124407f..40e4b56 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -184,6 +184,8 @@ struct re_softc { int rxcycles; int re_rxbuf_size; int (*re_newbuf)(struct re_softc *, int, int); + int re_irq_type; + int re_irq_rid; uint32_t re_flags; /* see RE_F_ */ int re_if_flags; /* saved ifnet.if_flags */ -- 1.6.6