]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/sky2.c
[PATCH] sky2: stop/start hardware idle timer on suspend/resume
[linux-2.6-omap-h63xx.git] / drivers / net / sky2.c
index df899dcbd5b0f12505e891abf4d73b39b6637f30..97fe95666f3b8bbe0a660b7bdc2187f954de1fd8 100644 (file)
@@ -2161,6 +2161,13 @@ static void sky2_descriptor_error(struct sky2_hw *hw, unsigned port,
 /* If idle then force a fake soft NAPI poll once a second
  * to work around cases where sharing an edge triggered interrupt.
  */
+static inline void sky2_idle_start(struct sky2_hw *hw)
+{
+       if (idle_timeout > 0)
+               mod_timer(&hw->idle_timer,
+                         jiffies + msecs_to_jiffies(idle_timeout));
+}
+
 static void sky2_idle(unsigned long arg)
 {
        struct sky2_hw *hw = (struct sky2_hw *) arg;
@@ -3350,9 +3357,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
        sky2_write32(hw, B0_IMSK, Y2_IS_BASE);
 
        setup_timer(&hw->idle_timer, sky2_idle, (unsigned long) hw);
-       if (idle_timeout > 0)
-               mod_timer(&hw->idle_timer,
-                         jiffies + msecs_to_jiffies(idle_timeout));
+       sky2_idle_start(hw);
 
        pci_set_drvdata(pdev, hw);
 
@@ -3430,6 +3435,8 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
        if (!(pstate == PCI_D3hot || pstate == PCI_D3cold))
                return -EINVAL;
 
+       del_timer_sync(&hw->idle_timer);
+
        for (i = 0; i < hw->ports; i++) {
                struct net_device *dev = hw->dev[i];
 
@@ -3472,10 +3479,12 @@ static int sky2_resume(struct pci_dev *pdev)
                                printk(KERN_ERR PFX "%s: could not up: %d\n",
                                       dev->name, err);
                                dev_close(dev);
-                               break;
+                               goto out;
                        }
                }
        }
+
+       sky2_idle_start(hw);
 out:
        return err;
 }