|
@@ -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
|
|
|
};
|
|
|
|