From eef3992f290163440110c41b15ba6b301ac03878 Mon Sep 17 00:00:00 2001 From: Andy Gospodarek Date: Mon, 14 Apr 2008 10:42:46 -0400 Subject: [PATCH] forcedeth hack to fix broken MSI on rhel5 RHBZ 428696 This fix will free and request interrupts on forcedeth hardware using MSI/MSI-X since enabling and disabling MSI interrupts doesn't work correctly on rhel5/2.6.18. Changes were made in 2.6.19 to address these problems and we hope to include them in a later update, but massive testing will be required to accept a chance like this to any rhel update. --- drivers/net/forcedeth.c | 35 +++++++++++++++-------------------- 1 files changed, 15 insertions(+), 20 deletions(-) diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index eb28c62..1d1be3a 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c @@ -949,36 +949,31 @@ static int using_multi_irqs(struct net_device *dev) return 1; } +static int nv_request_irq(struct net_device *dev, int intr_test); +static void nv_free_irq(struct net_device *dev); + static void nv_enable_irq(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); - if (!using_multi_irqs(dev)) { - if (np->msi_flags & NV_MSI_X_ENABLED) - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); - else - enable_irq(np->pci_dev->irq); - } else { - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); - } + /* MSI doesn't work well on 2.6.18, request new irq if using + MSI or MSI-X */ + if (np->msi_flags && (NV_MSI_X_ENABLED | NV_MSI_ENABLED)) + nv_request_irq(dev, 0); + else + enable_irq(np->pci_dev->irq); } static void nv_disable_irq(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); - if (!using_multi_irqs(dev)) { - if (np->msi_flags & NV_MSI_X_ENABLED) - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); - else - disable_irq(np->pci_dev->irq); - } else { - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); - } + /* MSI doesn't work well on 2.6.18, free irq if using MSI or + MSI-X */ + if (np->msi_flags && (NV_MSI_X_ENABLED | NV_MSI_ENABLED)) + nv_free_irq(dev); + else + disable_irq(np->pci_dev->irq); } /* In MSIX mode, a write to irqmask behaves as XOR */ -- 1.5.2.1