Commit b0a20ded authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Jeff Garzik

[PATCH] sky2: msi enhancements.

If using Message Signaled Interrupts (MSI) then the IRQ will never
be shared. Don't call pci_disable_msi() unless using MSI.
Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 794b2bd2
...@@ -3311,7 +3311,7 @@ static irqreturn_t __devinit sky2_test_intr(int irq, void *dev_id) ...@@ -3311,7 +3311,7 @@ static irqreturn_t __devinit sky2_test_intr(int irq, void *dev_id)
return IRQ_NONE; return IRQ_NONE;
if (status & Y2_IS_IRQ_SW) { if (status & Y2_IS_IRQ_SW) {
hw->msi_detected = 1; hw->msi = 1;
wake_up(&hw->msi_wait); wake_up(&hw->msi_wait);
sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ); sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ);
} }
...@@ -3330,7 +3330,7 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw) ...@@ -3330,7 +3330,7 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw)
sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW); sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW);
err = request_irq(pdev->irq, sky2_test_intr, IRQF_SHARED, DRV_NAME, hw); err = request_irq(pdev->irq, sky2_test_intr, 0, DRV_NAME, hw);
if (err) { if (err) {
printk(KERN_ERR PFX "%s: cannot assign irq %d\n", printk(KERN_ERR PFX "%s: cannot assign irq %d\n",
pci_name(pdev), pdev->irq); pci_name(pdev), pdev->irq);
...@@ -3340,9 +3340,9 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw) ...@@ -3340,9 +3340,9 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw)
sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ); sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ);
sky2_read8(hw, B0_CTST); sky2_read8(hw, B0_CTST);
wait_event_timeout(hw->msi_wait, hw->msi_detected, HZ/10); wait_event_timeout(hw->msi_wait, hw->msi, HZ/10);
if (!hw->msi_detected) { if (!hw->msi) {
/* MSI test failed, go back to INTx mode */ /* MSI test failed, go back to INTx mode */
printk(KERN_INFO PFX "%s: No interrupt generated using MSI, " printk(KERN_INFO PFX "%s: No interrupt generated using MSI, "
"switching to INTx mode.\n", "switching to INTx mode.\n",
...@@ -3475,7 +3475,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev, ...@@ -3475,7 +3475,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
goto err_out_free_netdev; goto err_out_free_netdev;
} }
err = request_irq(pdev->irq, sky2_intr, IRQF_SHARED, dev->name, hw); err = request_irq(pdev->irq, sky2_intr, hw->msi ? 0 : IRQF_SHARED,
dev->name, hw);
if (err) { if (err) {
printk(KERN_ERR PFX "%s: cannot assign irq %d\n", printk(KERN_ERR PFX "%s: cannot assign irq %d\n",
pci_name(pdev), pdev->irq); pci_name(pdev), pdev->irq);
...@@ -3505,6 +3506,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev, ...@@ -3505,6 +3506,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
return 0; return 0;
err_out_unregister: err_out_unregister:
if (hw->msi)
pci_disable_msi(pdev); pci_disable_msi(pdev);
unregister_netdev(dev); unregister_netdev(dev);
err_out_free_netdev: err_out_free_netdev:
...@@ -3548,6 +3550,7 @@ static void __devexit sky2_remove(struct pci_dev *pdev) ...@@ -3548,6 +3550,7 @@ static void __devexit sky2_remove(struct pci_dev *pdev)
sky2_read8(hw, B0_CTST); sky2_read8(hw, B0_CTST);
free_irq(pdev->irq, hw); free_irq(pdev->irq, hw);
if (hw->msi)
pci_disable_msi(pdev); pci_disable_msi(pdev);
pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma);
pci_release_regions(pdev); pci_release_regions(pdev);
......
...@@ -1900,7 +1900,7 @@ struct sky2_hw { ...@@ -1900,7 +1900,7 @@ struct sky2_hw {
dma_addr_t st_dma; dma_addr_t st_dma;
struct timer_list idle_timer; struct timer_list idle_timer;
int msi_detected; int msi;
wait_queue_head_t msi_wait; wait_queue_head_t msi_wait;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment