Commit 44ade178 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Jeff Garzik

sky2: power management/MSI workaround

MSI doesn't work properly on resume on many platforms because the
BIOS goes and changes it back to INTx mode after the sky2 driver has
restored in resume.

It is really a bug in the base power management resume code, and
this workaround is temporary until the change to PM code works it's way
through the release process.  The PM fix is non-trivial since it needs
to change when non-boot CPU's are enabled.
Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 25d82d7a
...@@ -3638,6 +3638,29 @@ static int sky2_resume(struct pci_dev *pdev) ...@@ -3638,6 +3638,29 @@ static int sky2_resume(struct pci_dev *pdev)
out: out:
return err; 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 #endif
static struct pci_driver sky2_driver = { static struct pci_driver sky2_driver = {
...@@ -3648,6 +3671,8 @@ static struct pci_driver sky2_driver = { ...@@ -3648,6 +3671,8 @@ static struct pci_driver sky2_driver = {
#ifdef CONFIG_PM #ifdef CONFIG_PM
.suspend = sky2_suspend, .suspend = sky2_suspend,
.resume = sky2_resume, .resume = sky2_resume,
.suspend_late = sky2_suspend_late,
.resume_early = sky2_resume_early,
#endif #endif
}; };
......
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