diff options
author | Adam Belay <ambx1@neo.rr.com> | 2005-06-20 17:28:41 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-06-27 00:46:40 -0400 |
commit | 1fe2cb32763457a829d33b38ec117ffe5c98e045 (patch) | |
tree | a0f083cb1e31898d3b5642d3b626043e3a8ee51e /drivers/net | |
parent | 05ab195c9803946931390faa6cfb714bd1c1e3dc (diff) |
[PATCH] fix tulip suspend/resume #2
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 <kkeil@suse.de>
Signed-off-by: Adam Belay <abelay@novell.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/tulip/tulip_core.c | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index 7e1fafed6b2d..08e0f80f89d5 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c | |||
@@ -1757,11 +1757,19 @@ static int tulip_suspend (struct pci_dev *pdev, pm_message_t state) | |||
1757 | { | 1757 | { |
1758 | struct net_device *dev = pci_get_drvdata(pdev); | 1758 | struct net_device *dev = pci_get_drvdata(pdev); |
1759 | 1759 | ||
1760 | if (dev && netif_running (dev) && netif_device_present (dev)) { | 1760 | if (!dev) |
1761 | netif_device_detach (dev); | 1761 | return -EINVAL; |
1762 | tulip_down (dev); | 1762 | |
1763 | /* pci_power_off(pdev, -1); */ | 1763 | if (netif_running(dev)) |
1764 | } | 1764 | tulip_down(dev); |
1765 | |||
1766 | netif_device_detach(dev); | ||
1767 | free_irq(dev->irq, dev); | ||
1768 | |||
1769 | pci_save_state(pdev); | ||
1770 | pci_disable_device(pdev); | ||
1771 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | ||
1772 | |||
1765 | return 0; | 1773 | return 0; |
1766 | } | 1774 | } |
1767 | 1775 | ||
@@ -1769,15 +1777,26 @@ static int tulip_suspend (struct pci_dev *pdev, pm_message_t state) | |||
1769 | static int tulip_resume(struct pci_dev *pdev) | 1777 | static int tulip_resume(struct pci_dev *pdev) |
1770 | { | 1778 | { |
1771 | struct net_device *dev = pci_get_drvdata(pdev); | 1779 | struct net_device *dev = pci_get_drvdata(pdev); |
1780 | int retval; | ||
1772 | 1781 | ||
1773 | if (dev && netif_running (dev) && !netif_device_present (dev)) { | 1782 | if (!dev) |
1774 | #if 1 | 1783 | return -EINVAL; |
1775 | pci_enable_device (pdev); | 1784 | |
1776 | #endif | 1785 | pci_set_power_state(pdev, PCI_D0); |
1777 | /* pci_power_on(pdev); */ | 1786 | pci_restore_state(pdev); |
1778 | tulip_up (dev); | 1787 | |
1779 | netif_device_attach (dev); | 1788 | pci_enable_device(pdev); |
1789 | |||
1790 | if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev))) { | ||
1791 | printk (KERN_ERR "tulip: request_irq failed in resume\n"); | ||
1792 | return retval; | ||
1780 | } | 1793 | } |
1794 | |||
1795 | netif_device_attach(dev); | ||
1796 | |||
1797 | if (netif_running(dev)) | ||
1798 | tulip_up(dev); | ||
1799 | |||
1781 | return 0; | 1800 | return 0; |
1782 | } | 1801 | } |
1783 | 1802 | ||