diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index 2beac55..23e1a14 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c @@ -885,6 +885,7 @@ match: DPRINTK ("chipset id (%d) == index %d, '%s'\n", version, i, rtl_chip_info[i].name); + RTL_W8 (Cfg9346, Cfg9346_Unlock); if (tp->chipset >= CH_8139B) { u8 new_tmp8 = tmp8 = RTL_R8 (Config1); DPRINTK("PCI PM wakeup\n"); @@ -892,25 +893,22 @@ match: (tmp8 & LWAKE)) new_tmp8 &= ~LWAKE; new_tmp8 |= Cfg1_PM_Enable; - if (new_tmp8 != tmp8) { - RTL_W8 (Cfg9346, Cfg9346_Unlock); + if (new_tmp8 != tmp8) RTL_W8 (Config1, tmp8); - RTL_W8 (Cfg9346, Cfg9346_Lock); - } if (rtl_chip_info[tp->chipset].flags & HasLWake) { tmp8 = RTL_R8 (Config4); - if (tmp8 & LWPTN) { - RTL_W8 (Cfg9346, Cfg9346_Unlock); + if (tmp8 & LWPTN) RTL_W8 (Config4, tmp8 & ~LWPTN); - RTL_W8 (Cfg9346, Cfg9346_Lock); - } } + tmp8 = RTL_R8 (Config5); + RTL_W8 (Config5, tmp8 | Cfg5_PME_STS | Cfg5_LANWake); } else { DPRINTK("Old chip wakeup\n"); tmp8 = RTL_R8 (Config1); tmp8 &= ~(SLEEP | PWRDN); RTL_W8 (Config1, tmp8); } + RTL_W8 (Cfg9346, Cfg9346_Lock); rtl8139_chip_reset (ioaddr); @@ -2564,8 +2562,6 @@ static int rtl8139_suspend (struct pci_d void __iomem *ioaddr = tp->mmio_addr; unsigned long flags; - pci_save_state (pdev); - if (!netif_running (dev)) return 0; @@ -2583,7 +2579,10 @@ static int rtl8139_suspend (struct pci_d spin_unlock_irqrestore (&tp->lock, flags); - pci_set_power_state (pdev, PCI_D3hot); + pci_save_state(pdev); + pci_enable_wake(pdev, pci_choose_state(pdev, state), + (tp->chipset >= CH_8139B)); + pci_set_power_state(pdev, pci_choose_state(pdev, state)); return 0; } @@ -2593,13 +2592,17 @@ static int rtl8139_resume (struct pci_de { struct net_device *dev = pci_get_drvdata (pdev); - pci_restore_state (pdev); - if (!netif_running (dev)) + if (!netif_running(dev)) return 0; + pci_set_power_state (pdev, PCI_D0); + pci_restore_state(pdev); + pci_enable_wake(pdev, PCI_D0, 0); + + netif_device_attach (dev); + rtl8139_init_ring (dev); rtl8139_hw_start (dev); - netif_device_attach (dev); return 0; }