aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@osdl.org>2006-02-27 16:13:54 -0500
committerJeff Garzik <jeff@garzik.org>2006-02-28 18:06:25 -0500
commit958ddb75b04b792c701b2b08acdb200d638abf4e (patch)
tree8bf0346b654d7d2a9dec60291e0a46535217e501 /drivers
parentce7eeb6b52bf1fc2a219503072732f35741d11de (diff)
[PATCH] sky2: remove MSI support
Remove Message Signaled Interrupt support (for 2.6.16). MSI is inherently edge-triggered and that is incompatiable (without more work) with NAPI. In future, will replace with smarter lockless-IRQ handling like tg3.c Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/sky2.c77
-rw-r--r--drivers/net/sky2.h1
2 files changed, 0 insertions, 78 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index ca8160d68229..72c1630977d6 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -96,10 +96,6 @@ static int copybreak __read_mostly = 256;
96module_param(copybreak, int, 0); 96module_param(copybreak, int, 0);
97MODULE_PARM_DESC(copybreak, "Receive copy threshold"); 97MODULE_PARM_DESC(copybreak, "Receive copy threshold");
98 98
99static int disable_msi = 0;
100module_param(disable_msi, int, 0);
101MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
102
103static const struct pci_device_id sky2_id_table[] = { 99static const struct pci_device_id sky2_id_table[] = {
104 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, 100 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) },
105 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, 101 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) },
@@ -3126,61 +3122,6 @@ static void __devinit sky2_show_addr(struct net_device *dev)
3126 dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); 3122 dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
3127} 3123}
3128 3124
3129/* Handle software interrupt used during MSI test */
3130static irqreturn_t __devinit sky2_test_intr(int irq, void *dev_id,
3131 struct pt_regs *regs)
3132{
3133 struct sky2_hw *hw = dev_id;
3134 u32 status = sky2_read32(hw, B0_Y2_SP_ISRC2);
3135
3136 if (status == 0)
3137 return IRQ_NONE;
3138
3139 if (status & Y2_IS_IRQ_SW) {
3140 sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ);
3141 hw->msi = 1;
3142 }
3143 sky2_write32(hw, B0_Y2_SP_ICR, 2);
3144
3145 sky2_read32(hw, B0_IMSK);
3146 return IRQ_HANDLED;
3147}
3148
3149/* Test interrupt path by forcing a a software IRQ */
3150static int __devinit sky2_test_msi(struct sky2_hw *hw)
3151{
3152 struct pci_dev *pdev = hw->pdev;
3153 int i, err;
3154
3155 sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW);
3156
3157 err = request_irq(pdev->irq, sky2_test_intr, SA_SHIRQ, DRV_NAME, hw);
3158 if (err) {
3159 printk(KERN_ERR PFX "%s: cannot assign irq %d\n",
3160 pci_name(pdev), pdev->irq);
3161 return err;
3162 }
3163
3164 sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ);
3165 wmb();
3166
3167 for (i = 0; i < 10; i++) {
3168 barrier();
3169 if (hw->msi)
3170 goto found;
3171 mdelay(1);
3172 }
3173
3174 err = -EOPNOTSUPP;
3175 sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ);
3176 found:
3177 sky2_write32(hw, B0_IMSK, 0);
3178
3179 free_irq(pdev->irq, hw);
3180
3181 return err;
3182}
3183
3184static int __devinit sky2_probe(struct pci_dev *pdev, 3125static int __devinit sky2_probe(struct pci_dev *pdev,
3185 const struct pci_device_id *ent) 3126 const struct pci_device_id *ent)
3186{ 3127{
@@ -3302,20 +3243,6 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
3302 } 3243 }
3303 } 3244 }
3304 3245
3305 if (!disable_msi && pci_enable_msi(pdev) == 0) {
3306 err = sky2_test_msi(hw);
3307 if (err == -EOPNOTSUPP) {
3308 /* MSI test failed, go back to INTx mode */
3309 printk(KERN_WARNING PFX "%s: No interrupt was generated using MSI, "
3310 "switching to INTx mode. Please report this failure to "
3311 "the PCI maintainer and include system chipset information.\n",
3312 pci_name(pdev));
3313 pci_disable_msi(pdev);
3314 }
3315 else if (err)
3316 goto err_out_unregister;
3317 }
3318
3319 err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ | SA_SAMPLE_RANDOM, 3246 err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ | SA_SAMPLE_RANDOM,
3320 DRV_NAME, hw); 3247 DRV_NAME, hw);
3321 if (err) { 3248 if (err) {
@@ -3332,8 +3259,6 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
3332 return 0; 3259 return 0;
3333 3260
3334err_out_unregister: 3261err_out_unregister:
3335 if (hw->msi)
3336 pci_disable_msi(pdev);
3337 if (dev1) { 3262 if (dev1) {
3338 unregister_netdev(dev1); 3263 unregister_netdev(dev1);
3339 free_netdev(dev1); 3264 free_netdev(dev1);
@@ -3376,8 +3301,6 @@ static void __devexit sky2_remove(struct pci_dev *pdev)
3376 sky2_read8(hw, B0_CTST); 3301 sky2_read8(hw, B0_CTST);
3377 3302
3378 free_irq(pdev->irq, hw); 3303 free_irq(pdev->irq, hw);
3379 if (hw->msi)
3380 pci_disable_msi(pdev);
3381 pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); 3304 pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma);
3382 pci_release_regions(pdev); 3305 pci_release_regions(pdev);
3383 pci_disable_device(pdev); 3306 pci_disable_device(pdev);
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
index 3edb98075e0a..dce955c76f3c 100644
--- a/drivers/net/sky2.h
+++ b/drivers/net/sky2.h
@@ -1881,7 +1881,6 @@ struct sky2_hw {
1881 u32 intr_mask; 1881 u32 intr_mask;
1882 1882
1883 int pm_cap; 1883 int pm_cap;
1884 int msi;
1885 u8 chip_id; 1884 u8 chip_id;
1886 u8 chip_rev; 1885 u8 chip_rev;
1887 u8 copper; 1886 u8 copper;