lkml.org 
[lkml]   [2007]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: Linux 2.6.20-rc6 - sky2 resume breakage
    On Mon, 29 Jan 2007 21:10:30 +0100
    Thomas Gleixner <tglx@linutronix.de> 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 majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-01-29 22:45    [W:0.029 / U:220.548 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site