]> err.no Git - linux-2.6/blobdiff - drivers/net/sky2.c
Pull bugzilla-5737 into release branch
[linux-2.6] / drivers / net / sky2.c
index b680e64ad2ca33c9948436048eac0225fe82f0df..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];
 
@@ -3442,6 +3449,7 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
                }
        }
 
+       sky2_write32(hw, B0_IMSK, 0);
        pci_save_state(pdev);
        sky2_set_power_state(hw, pstate);
        return 0;
@@ -3460,6 +3468,8 @@ static int sky2_resume(struct pci_dev *pdev)
        if (err)
                goto out;
 
+       sky2_write32(hw, B0_IMSK, Y2_IS_BASE);
+
        for (i = 0; i < hw->ports; i++) {
                struct net_device *dev = hw->dev[i];
                if (dev && netif_running(dev)) {
@@ -3469,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;
 }