From 5b039e681b8c5f30aac9cc04385cc94be45d0823 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Tue, 6 Sep 2005 15:16:22 -0700 Subject: [PATCH] 3c59x PM fixes This patch adds some missing pci-related calls to the suspend and resume routines of the 3c59x driver. It also makes the driver free/request IRQ on suspend/resume, in accordance with the proposal at: http://lists.osdl.org/pipermail/linux-pm/2005-May/000955.html Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/net/3c59x.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'drivers/net/3c59x.c') diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index 07746b95fd8..de0dc4ab6e5 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c @@ -973,6 +973,11 @@ static int vortex_suspend (struct pci_dev *pdev, pm_message_t state) netif_device_detach(dev); vortex_down(dev, 1); } + pci_save_state(pdev); + pci_enable_wake(pdev, pci_choose_state(pdev, state), 0); + free_irq(dev->irq, dev); + pci_disable_device(pdev); + pci_set_power_state(pdev, pci_choose_state(pdev, state)); } return 0; } @@ -980,8 +985,19 @@ static int vortex_suspend (struct pci_dev *pdev, pm_message_t state) static int vortex_resume (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); + struct vortex_private *vp = netdev_priv(dev); - if (dev && dev->priv) { + if (dev && vp) { + pci_set_power_state(pdev, PCI_D0); + pci_restore_state(pdev); + pci_enable_device(pdev); + pci_set_master(pdev); + if (request_irq(dev->irq, vp->full_bus_master_rx ? + &boomerang_interrupt : &vortex_interrupt, SA_SHIRQ, dev->name, dev)) { + printk(KERN_WARNING "%s: Could not reserve IRQ %d\n", dev->name, dev->irq); + pci_disable_device(pdev); + return -EBUSY; + } if (netif_running(dev)) { vortex_up(dev); netif_device_attach(dev); -- cgit v1.2.3-70-g09d2 From 2de93fbf3c427df010b5a923c302e20c143d60cf Mon Sep 17 00:00:00 2001 From: "Tommy S. Christensen" Date: Tue, 6 Sep 2005 15:17:28 -0700 Subject: [PATCH] 3c59x: read current link status from phy The phy status register must be read twice in order to get the actual link state. Signed-off-by: Tommy S. Christensen Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/net/3c59x.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/net/3c59x.c') diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index de0dc4ab6e5..455ba915ede 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c @@ -1889,6 +1889,7 @@ vortex_timer(unsigned long data) { spin_lock_bh(&vp->lock); mii_status = mdio_read(dev, vp->phys[0], 1); + mii_status = mdio_read(dev, vp->phys[0], 1); ok = 1; if (vortex_debug > 2) printk(KERN_DEBUG "%s: MII transceiver has status %4.4x.\n", -- cgit v1.2.3-70-g09d2