]> err.no Git - linux-2.6/blobdiff - drivers/net/sky2.c
sky2: power management/MSI workaround
[linux-2.6] / drivers / net / sky2.c
index 4fb3db99bcd1e4cbe837eb9fcd06b29fbbbe9f8b..93cb39388a1bcdfeb00e55b91d5bd4b85f1d6d7e 100644 (file)
@@ -3638,6 +3638,29 @@ static int sky2_resume(struct pci_dev *pdev)
 out:
        return err;
 }
+
+/* BIOS resume runs after device (it's a bug in PM)
+ * as a temporary workaround on suspend/resume leave MSI disabled
+ */
+static int sky2_suspend_late(struct pci_dev *pdev, pm_message_t state)
+{
+       struct sky2_hw *hw = pci_get_drvdata(pdev);
+
+       free_irq(pdev->irq, hw);
+       if (hw->msi) {
+               pci_disable_msi(pdev);
+               hw->msi = 0;
+       }
+       return 0;
+}
+
+static int sky2_resume_early(struct pci_dev *pdev)
+{
+       struct sky2_hw *hw = pci_get_drvdata(pdev);
+       struct net_device *dev = hw->dev[0];
+
+       return request_irq(pdev->irq, sky2_intr, IRQF_SHARED, dev->name, hw);
+}
 #endif
 
 static struct pci_driver sky2_driver = {
@@ -3648,6 +3671,8 @@ static struct pci_driver sky2_driver = {
 #ifdef CONFIG_PM
        .suspend = sky2_suspend,
        .resume = sky2_resume,
+       .suspend_late = sky2_suspend_late,
+       .resume_early = sky2_resume_early,
 #endif
 };