Deleted Added
full compact
34c34
< __FBSDID("$FreeBSD: head/sys/dev/re/if_re.c 171263 2007-07-06 00:05:12Z yongari $");
---
> __FBSDID("$FreeBSD: head/sys/dev/re/if_re.c 171560 2007-07-24 01:24:03Z yongari $");
162a163,166
> /* Tunables. */
> static int msi_disable = 0;
> TUNABLE_INT("hw.re.msi_disable", &msi_disable);
>
1161a1166
> int msic, reg;
1188,1191c1193,1208
< /* Allocate interrupt */
< rid = 0;
< sc->rl_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
< RF_SHAREABLE | RF_ACTIVE);
---
> msic = 0;
> if (pci_find_extcap(dev, PCIY_EXPRESS, &reg) == 0) {
> msic = pci_msi_count(dev);
> if (bootverbose)
> device_printf(dev, "MSI count : %d\n", msic);
> }
> if (msic == RL_MSI_MESSAGES && msi_disable == 0) {
> if (pci_alloc_msi(dev, &msic) == 0) {
> if (msic == RL_MSI_MESSAGES) {
> device_printf(dev, "Using %d MSI messages\n",
> msic);
> sc->rl_msi = 1;
> } else
> pci_release_msi(dev);
> }
> }
1193,1196c1210,1231
< if (sc->rl_irq == NULL) {
< device_printf(dev, "couldn't map interrupt\n");
< error = ENXIO;
< goto fail;
---
> /* Allocate interrupt */
> if (sc->rl_msi == 0) {
> rid = 0;
> sc->rl_irq[0] = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
> RF_SHAREABLE | RF_ACTIVE);
> if (sc->rl_irq[0] == NULL) {
> device_printf(dev, "couldn't allocate IRQ resources\n");
> error = ENXIO;
> goto fail;
> }
> } else {
> for (i = 0, rid = 1; i < RL_MSI_MESSAGES; i++, rid++) {
> sc->rl_irq[i] = bus_alloc_resource_any(dev,
> SYS_RES_IRQ, &rid, RF_ACTIVE);
> if (sc->rl_irq[i] == NULL) {
> device_printf(dev,
> "couldn't llocate IRQ resources for "
> "message %d\n", rid);
> error = ENXIO;
> goto fail;
> }
> }
1323,1324c1358,1370
< error = bus_setup_intr(dev, sc->rl_irq, INTR_TYPE_NET | INTR_MPSAFE,
< re_intr, NULL, sc, &sc->rl_intrhand);
---
> if (sc->rl_msi == 0)
> error = bus_setup_intr(dev, sc->rl_irq[0],
> INTR_TYPE_NET | INTR_MPSAFE, re_intr, NULL, sc,
> &sc->rl_intrhand[0]);
> else {
> for (i = 0; i < RL_MSI_MESSAGES; i++) {
> error = bus_setup_intr(dev, sc->rl_irq[i],
> INTR_TYPE_NET | INTR_MPSAFE, re_intr, NULL, sc,
> &sc->rl_intrhand[i]);
> if (error != 0)
> break;
> }
> }
1351c1397
< int i;
---
> int i, rid;
1396,1397c1442,1448
< if (sc->rl_intrhand)
< bus_teardown_intr(dev, sc->rl_irq, sc->rl_intrhand);
---
> for (i = 0; i < RL_MSI_MESSAGES; i++) {
> if (sc->rl_intrhand[i] != NULL) {
> bus_teardown_intr(dev, sc->rl_irq[i],
> sc->rl_intrhand[i]);
> sc->rl_intrhand[i] = NULL;
> }
> }
1400,1401c1451,1466
< if (sc->rl_irq)
< bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq);
---
> if (sc->rl_msi == 0) {
> if (sc->rl_irq[0] != NULL) {
> bus_release_resource(dev, SYS_RES_IRQ, 0,
> sc->rl_irq[0]);
> sc->rl_irq[0] = NULL;
> }
> } else {
> for (i = 0, rid = 1; i < RL_MSI_MESSAGES; i++, rid++) {
> if (sc->rl_irq[i] != NULL) {
> bus_release_resource(dev, SYS_RES_IRQ, rid,
> sc->rl_irq[i]);
> sc->rl_irq[i] = NULL;
> }
> }
> pci_release_msi(dev);
> }