Messages in this thread Patch in this message |  | | | Date | Fri, 2 Jun 2006 15:21:37 -0400 (EDT) | | From | Ravinandan Arakali <> | | Subject | [PATCH 2.6.16.18] MSI: Proposed fix for MSI/MSI-X load failure |
| |
Hi, This patch suggests a fix for the MSI/MSI-X load failure.
Please review the patch.
Symptoms: When a driver is loaded with MSI followed by MSI-X, the load fails indicating that the MSI vector is still active. And vice versa.
Suspected rootcause: This happens inspite of driver calling free_irq() followed by pci_disable_msi/pci_disable_msix. This appears to be a kernel bug wherein the pci_disable_msi and pci_disable_msix calls do not clear/unpopulate the msi_desc data structure that was populated by pci_enable_msi/pci_enable_msix.
Proposed fix: Free the MSI vector in pci_disable_msi and all allocated MSI-X vectors in pci_disable_msix.
Testing: The fix has been tested on IA64 platforms with Neterion's Xframe driver.
Signed-off-by: Ravinandan Arakali <ravinandan.arakali@neterion.com> --- diff -urpN old/drivers/pci/msi.c new/drivers/pci/msi.c --- old/drivers/pci/msi.c 2006-05-31 19:02:19.000000000 -0700 +++ new/drivers/pci/msi.c 2006-05-31 19:02:39.000000000 -0700 @@ -779,6 +779,7 @@ void pci_disable_msi(struct pci_dev* dev nr_released_vectors++; default_vector = entry->msi_attrib.default_vector; spin_unlock_irqrestore(&msi_lock, flags); + msi_free_vector(dev, dev->irq, 1); /* Restore dev->irq to its default pin-assertion vector */ dev->irq = default_vector; disable_msi_mode(dev, pci_find_capability(dev, PCI_CAP_ID_MSI), @@ -1046,6 +1047,7 @@ void pci_disable_msix(struct pci_dev* de } } + msi_remove_pci_irq_vectors(dev); } /** - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |