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
    Does this fix it?
    ---
    drivers/net/sky2.c | 43 ++++++++++++++++++-------------------------
    1 file changed, 18 insertions(+), 25 deletions(-)

    --- sky2-2.6.orig/drivers/net/sky2.c 2007-01-29 10:05:12.000000000 -0800
    +++ sky2-2.6/drivers/net/sky2.c 2007-01-29 10:29:56.000000000 -0800
    @@ -3675,6 +3675,12 @@
    sky2_write32(hw, B0_IMSK, 0);
    sky2_power_aux(hw);

    + /* Turn off IRQ to avoid power management bug (see resume) */
    + if (hw->msi) {
    + free_irq(pdev->irq, hw);
    + pci_disable_msi(pdev);
    + }
    +
    pci_save_state(pdev);
    pci_enable_wake(pdev, pci_choose_state(pdev, state), wol);
    pci_set_power_state(pdev, pci_choose_state(pdev, state));
    @@ -3700,6 +3706,18 @@

    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)) {
    @@ -3721,29 +3739,6 @@
    pci_disable_device(pdev);
    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 void sky2_shutdown(struct pci_dev *pdev)
    @@ -3783,8 +3778,6 @@
    #ifdef CONFIG_PM
    .suspend = sky2_suspend,
    .resume = sky2_resume,
    - .suspend_late = sky2_suspend_late,
    - .resume_early = sky2_resume_early,
    #endif
    .shutdown = sky2_shutdown,
    };
    -
    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 20:37    [W:0.025 / U:0.380 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site