From: Adam Belay This patch allows the tulip driver to suspend and resume properly. It was originally written by Karsten Keil and then modified by Adam Belay. Signed-off-by: Karsten Keil Signed-off-by: Adam Belay Signed-off-by: Andrew Morton --- drivers/net/tulip/tulip_core.c | 43 +++++++++++++++++++++++++++++------------ 1 files changed, 31 insertions(+), 12 deletions(-) diff -puN drivers/net/tulip/tulip_core.c~fix-tulip-suspend-resume-2 drivers/net/tulip/tulip_core.c --- 25/drivers/net/tulip/tulip_core.c~fix-tulip-suspend-resume-2 2005-06-08 22:32:28.000000000 -0700 +++ 25-akpm/drivers/net/tulip/tulip_core.c 2005-06-08 22:32:28.000000000 -0700 @@ -1756,11 +1756,19 @@ static int tulip_suspend (struct pci_dev { struct net_device *dev = pci_get_drvdata(pdev); - if (dev && netif_running (dev) && netif_device_present (dev)) { - netif_device_detach (dev); - tulip_down (dev); - /* pci_power_off(pdev, -1); */ - } + if (!dev) + return -EINVAL; + + if (netif_running(dev)) + tulip_down(dev); + + netif_device_detach(dev); + free_irq(dev->irq, dev); + + pci_save_state(pdev); + pci_disable_device(pdev); + pci_set_power_state(pdev, pci_choose_state(pdev, state)); + return 0; } @@ -1768,15 +1776,26 @@ static int tulip_suspend (struct pci_dev static int tulip_resume(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); + int retval; - if (dev && netif_running (dev) && !netif_device_present (dev)) { -#if 1 - pci_enable_device (pdev); -#endif - /* pci_power_on(pdev); */ - tulip_up (dev); - netif_device_attach (dev); + if (!dev) + return -EINVAL; + + pci_set_power_state(pdev, PCI_D0); + pci_restore_state(pdev); + + pci_enable_device(pdev); + + if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev))) { + printk (KERN_ERR "tulip: request_irq failed in resume\n"); + return retval; } + + netif_device_attach(dev); + + if (netif_running(dev)) + tulip_up(dev); + return 0; } _