Index: msi.c =================================================================== --- msi.c (revision 194783) +++ msi.c (working copy) @@ -163,6 +163,8 @@ if (msi->msi_vector == 0) msi_assign_cpu(isrc, 0); + else + pci_remap_msi_irq(msi->msi_dev, msi->msi_irq); apic_enable_vector(msi->msi_cpu, msi->msi_vector); } @@ -287,6 +289,7 @@ msi_alloc(device_t dev, int count, int maxcount, int *irqs) { struct msi_intsrc *msi, *fsrc; + u_int vector; int cnt, i; if (!msi_enabled) @@ -333,6 +336,11 @@ /* Ok, we now have the IRQs allocated. */ KASSERT(cnt == count, ("count mismatch")); + vector = apic_alloc_vectors(0, irqs, count, count); + if (vector == 0) { + mtx_unlock(&msi_lock); + return (ENXIO); + } /* Assign IDT vectors and make these messages owned by 'dev'. */ fsrc = (struct msi_intsrc *)intr_lookup_source(irqs[0]); for (i = 0; i < count; i++) { @@ -342,6 +350,14 @@ msi->msi_first = fsrc; KASSERT(msi->msi_intsrc.is_handlers == 0, ("dead MSI has handlers")); + msi->msi_cpu = 0; + msi->msi_vector = vector++; + pci_remap_msi_irq(dev, msi->msi_irq); + if (bootverbose) + printf("msi: Assigning %s IRQ %d to local" + " APIC %u vector %u\n", + msi->msi_msix ? "MSI-X" : "MSI", msi->msi_irq, + msi->msi_cpu, msi->msi_vector); } fsrc->msi_count = count; mtx_unlock(&msi_lock);