diff options
-rw-r--r-- | drivers/net/sky2.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 4fb3db99bcd1..93cb39388a1b 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -3638,6 +3638,29 @@ static int sky2_resume(struct pci_dev *pdev) | |||
3638 | out: | 3638 | out: |
3639 | return err; | 3639 | return err; |
3640 | } | 3640 | } |
3641 | |||
3642 | /* BIOS resume runs after device (it's a bug in PM) | ||
3643 | * as a temporary workaround on suspend/resume leave MSI disabled | ||
3644 | */ | ||
3645 | static int sky2_suspend_late(struct pci_dev *pdev, pm_message_t state) | ||
3646 | { | ||
3647 | struct sky2_hw *hw = pci_get_drvdata(pdev); | ||
3648 | |||
3649 | free_irq(pdev->irq, hw); | ||
3650 | if (hw->msi) { | ||
3651 | pci_disable_msi(pdev); | ||
3652 | hw->msi = 0; | ||
3653 | } | ||
3654 | return 0; | ||
3655 | } | ||
3656 | |||
3657 | static int sky2_resume_early(struct pci_dev *pdev) | ||
3658 | { | ||
3659 | struct sky2_hw *hw = pci_get_drvdata(pdev); | ||
3660 | struct net_device *dev = hw->dev[0]; | ||
3661 | |||
3662 | return request_irq(pdev->irq, sky2_intr, IRQF_SHARED, dev->name, hw); | ||
3663 | } | ||
3641 | #endif | 3664 | #endif |
3642 | 3665 | ||
3643 | static struct pci_driver sky2_driver = { | 3666 | static struct pci_driver sky2_driver = { |
@@ -3648,6 +3671,8 @@ static struct pci_driver sky2_driver = { | |||
3648 | #ifdef CONFIG_PM | 3671 | #ifdef CONFIG_PM |
3649 | .suspend = sky2_suspend, | 3672 | .suspend = sky2_suspend, |
3650 | .resume = sky2_resume, | 3673 | .resume = sky2_resume, |
3674 | .suspend_late = sky2_suspend_late, | ||
3675 | .resume_early = sky2_resume_early, | ||
3651 | #endif | 3676 | #endif |
3652 | }; | 3677 | }; |
3653 | 3678 | ||