de2104x: fix power management
authorOndrej Zary <linux@rainbow-software.org>
Fri, 24 Sep 2010 23:57:02 +0000 (23:57 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 26 Sep 2010 22:49:38 +0000 (15:49 -0700)
At least my 21041 cards come out of suspend with bus mastering disabled so
they did not work after resume(no data transferred).
After adding pci_set_master(), the driver oopsed immediately on resume -
because de_clean_rings() is called on suspend but de_init_rings() call
was missing in resume.

Also disable link (reset SIA) before sleep (de4x5 does this too).

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
Acked-by: Jeff Garzik <jgarzik@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/tulip/de2104x.c

index 9d6b7e9c7a6b506f77727ce56403b737f7c7f512..a0be7c28c587bfce40d3ecc8dd0cf0a776cccbb7 100644 (file)
@@ -1231,6 +1231,7 @@ static void de_adapter_sleep (struct de_private *de)
        if (de->de21040)
                return;
 
+       dw32(CSR13, 0); /* Reset phy */
        pci_read_config_dword(de->pdev, PCIPM, &pmctl);
        pmctl |= PM_Sleep;
        pci_write_config_dword(de->pdev, PCIPM, pmctl);
@@ -2166,6 +2167,8 @@ static int de_resume (struct pci_dev *pdev)
                dev_err(&dev->dev, "pci_enable_device failed in resume\n");
                goto out;
        }
+       pci_set_master(pdev);
+       de_init_rings(de);
        de_init_hw(de);
 out_attach:
        netif_device_attach(dev);