Index: if_em.c =================================================================== RCS file: /zork/cvs/src/sys/dev/em/if_em.c,v retrieving revision 1.65.2.22 diff -u -r1.65.2.22 if_em.c --- if_em.c 1 Mar 2007 17:32:27 -0000 1.65.2.22 +++ if_em.c 19 Apr 2007 19:31:48 -0000 @@ -2160,7 +2160,12 @@ rman_get_bushandle(adapter->flash_mem); } - rid = 0x0; + val = pci_msi_count(dev); + if (val == 1 && pci_alloc_msi(dev, &val) == 0) { + rid = 1; + adapter->msi = 1; + } else + rid = 0; adapter->res_interrupt = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE); if (adapter->res_interrupt == NULL) { @@ -2250,8 +2255,11 @@ device_t dev = adapter->dev; if (adapter->res_interrupt != NULL) - bus_release_resource(dev, SYS_RES_IRQ, - 0, adapter->res_interrupt); + bus_release_resource(dev, SYS_RES_IRQ, adapter->msi ? 1 : 0, + adapter->res_interrupt); + + if (adapter->msi) + pci_release_msi(dev); if (adapter->res_memory != NULL) bus_release_resource(dev, SYS_RES_MEMORY, Index: if_em.h =================================================================== RCS file: /zork/cvs/src/sys/dev/em/if_em.h,v retrieving revision 1.32.2.6 diff -u -r1.32.2.6 if_em.h --- if_em.h 10 Nov 2006 09:30:27 -0000 1.32.2.6 +++ if_em.h 19 Apr 2007 18:14:55 -0000 @@ -331,6 +331,7 @@ struct callout tx_fifo_timer; int watchdog_timer; int io_rid; + int msi; int if_flags; struct mtx mtx; int em_insert_vlan_header;