From acfd9a05ce807eb61b105e33e68b4cc2dfc96980 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Wed, 20 Dec 2006 13:06:34 -0800 Subject: [PATCH] --- yaml --- r: 45047 b: refs/heads/master c: 44ade178249fe53d055fd92113eaa271e06acddd h: refs/heads/master i: 45045: 72756b5ceaadf81724d976643687b210300f3467 45043: 7f1f155bee061cd6134839a5646b16b31dda0616 45039: 8db77dadfab8fc9b8b7ff793f01f3a8eb026bf46 v: v3 --- [refs] | 2 +- trunk/drivers/net/sky2.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index e02708659118..7d107c3d9ed5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 25d82d7a2fc20cc4be414d738139594dc0adf179 +refs/heads/master: 44ade178249fe53d055fd92113eaa271e06acddd diff --git a/trunk/drivers/net/sky2.c b/trunk/drivers/net/sky2.c index 4fb3db99bcd1..93cb39388a1b 100644 --- a/trunk/drivers/net/sky2.c +++ b/trunk/drivers/net/sky2.c @@ -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 };