|
@@ -1757,11 +1757,19 @@ static int tulip_suspend (struct pci_dev *pdev, pm_message_t state)
|
|
|
{
|
|
|
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;
|
|
|
}
|
|
|
|
|
@@ -1769,15 +1777,26 @@ static int tulip_suspend (struct pci_dev *pdev, pm_message_t state)
|
|
|
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;
|
|
|
}
|
|
|
|