Recover from MSI-X errors by automatically falling back on regular interrupt,
instead of asking the user to do this manually. This makes it possible to
enable MSI-X by default, and will make it possible to get rid of msi_x module
option in the future.
Signed-off-by: Michael S. Tsirkin <[EMAIL PROTECTED]>
---
Index: linux-2.6/drivers/infiniband/hw/mthca/mthca_main.c
===================================================================
--- linux-2.6.orig/drivers/infiniband/hw/mthca/mthca_main.c 2007-08-02
10:23:24.000000000 +0300
+++ linux-2.6/drivers/infiniband/hw/mthca/mthca_main.c 2007-08-07
16:09:36.000000000 +0300
@@ -61,7 +61,7 @@ MODULE_PARM_DESC(debug_level, "Enable de
#ifdef CONFIG_PCI_MSI
-static int msi_x = 0;
+static int msi_x = 1;
module_param(msi_x, int, 0444);
MODULE_PARM_DESC(msi_x, "attempt to use MSI-X if nonzero");
@@ -838,7 +838,7 @@ static int mthca_setup_hca(struct mthca_
dev->eq_table.eq[MTHCA_EQ_CMD].msi_x_vector :
dev->pdev->irq);
if (dev->mthca_flags & (MTHCA_FLAG_MSI | MTHCA_FLAG_MSI_X))
- mthca_err(dev, "Try again with MSI/MSI-X disabled.\n");
+ mthca_warn(dev, "Trying again with MSI/MSI-X
disabled.\n");
else
mthca_err(dev, "BIOS or ACPI interrupt routing
problem?\n");
@@ -1115,24 +1115,6 @@ static int __mthca_init_one(struct pci_d
goto err_free_dev;
}
- if (msi_x && !mthca_enable_msi_x(mdev))
- mdev->mthca_flags |= MTHCA_FLAG_MSI_X;
- else if (msi) {
- static int warned;
-
- if (!warned) {
- printk(KERN_WARNING PFX "WARNING: MSI support will be "
- "removed from the ib_mthca driver in January
2008.\n");
- printk(KERN_WARNING " If you are using MSI and
cannot "
- "switch to MSI-X, please tell "
- "<[email protected]>.\n");
- ++warned;
- }
-
- if (!pci_enable_msi(pdev))
- mdev->mthca_flags |= MTHCA_FLAG_MSI;
- }
-
if (mthca_cmd_init(mdev)) {
mthca_err(mdev, "Failed to init command interface,
aborting.\n");
goto err_free_dev;
@@ -1156,7 +1138,36 @@ static int __mthca_init_one(struct pci_d
mthca_warn(mdev, "If you have problems, try updating your HCA
FW.\n");
}
+ if (msi_x && !mthca_enable_msi_x(mdev))
+ mdev->mthca_flags |= MTHCA_FLAG_MSI_X;
+ else if (msi) {
+ static int warned;
+
+ if (!warned) {
+ printk(KERN_WARNING PFX "WARNING: MSI support will be "
+ "removed from the ib_mthca driver in January
2008.\n");
+ printk(KERN_WARNING " If you are using MSI and
cannot "
+ "switch to MSI-X, please tell "
+ "<[email protected]>.\n");
+ ++warned;
+ }
+
+ if (!pci_enable_msi(pdev))
+ mdev->mthca_flags |= MTHCA_FLAG_MSI;
+ }
+
err = mthca_setup_hca(mdev);
+ if (err == -EBUSY && (mdev->mthca_flags & (MTHCA_FLAG_MSI |
MTHCA_FLAG_MSI_X))) {
+ mthca_warn(mdev, "Trying again with MSI/MSI-X disabled.\n");
+ if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
+ pci_disable_msix(pdev);
+ if (mdev->mthca_flags & MTHCA_FLAG_MSI)
+ pci_disable_msi(pdev);
+ mdev->mthca_flags &= ~(MTHCA_FLAG_MSI_X | MTHCA_FLAG_MSI);
+
+ err = mthca_setup_hca(mdev);
+ }
+
if (err)
goto err_close;
@@ -1192,17 +1203,17 @@ err_cleanup:
mthca_cleanup_uar_table(mdev);
err_close:
+ if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
+ pci_disable_msix(pdev);
+ if (mdev->mthca_flags & MTHCA_FLAG_MSI)
+ pci_disable_msi(pdev);
+
mthca_close_hca(mdev);
err_cmd:
mthca_cmd_cleanup(mdev);
err_free_dev:
- if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
- pci_disable_msix(pdev);
- if (mdev->mthca_flags & MTHCA_FLAG_MSI)
- pci_disable_msi(pdev);
-
ib_dealloc_device(&mdev->ib_dev);
err_free_res:
--
MST
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general