On Mon, 29 Jan 2007 21:10:30 +0100 Thomas Gleixner <[EMAIL PROTECTED]> wrote:
> On Mon, 2007-01-29 at 11:31 -0800, Stephen Hemminger wrote: > > Does this fix it? > > Don't know. Sorry it was against the last patch I sent to Jeff for netdev. Here is against 2.6.20-rc6 --- drivers/net/sky2.c | 43 ++++++++++++++++++------------------------- 1 files changed, 18 insertions(+), 25 deletions(-) diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index a2e804d..d85de63 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -3598,6 +3598,12 @@ static int sky2_suspend(struct pci_dev * } } + /* Turn off IRQ to avoid power management bug (see resume) */ + if (hw->msi) { + free_irq(pdev->irq, hw); + pci_disable_msi(pdev); + } + sky2_write32(hw, B0_IMSK, 0); pci_save_state(pdev); sky2_set_power_state(hw, pstate); @@ -3619,6 +3625,18 @@ static int sky2_resume(struct pci_dev *p sky2_write32(hw, B0_IMSK, Y2_IS_BASE); + /* Can't re-enable MSI because kernel resume ordering is broken + * and calls device resume before ACPI (BIOS) is called. + * BIOS then resets device to INTx! + */ + if (hw->msi) { + err = request_irq(pdev->irq, sky2_intr, IRQF_SHARED, + hw->dev[0]->name, hw); + if (err) + goto out; + hw->msi = 0; + } + for (i = 0; i < hw->ports; i++) { struct net_device *dev = hw->dev[i]; if (netif_running(dev)) { @@ -3639,29 +3657,6 @@ static int sky2_resume(struct pci_dev *p 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 = { @@ -3672,8 +3667,6 @@ 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 }; -- 1.4.1 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/