sky2: Refactor down/up code out of sky2_restart()
authorMike McCormack <mikem@ring3k.org>
Thu, 13 May 2010 06:12:51 +0000 (06:12 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 May 2010 10:06:21 +0000 (03:06 -0700)
Code to bring down all sky2 interfaces and bring it up
again can be reused in sky2_suspend and sky2_resume.

Factor the code to bring the interfaces down into
sky2_all_down and the up code into sky2_all_up.

Signed-off-by: Mike McCormack <mikem@ring3k.org>
Acked-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sky2.c

index f13a45f..cc6f312 100644 (file)
@@ -3312,15 +3312,11 @@ static int sky2_reattach(struct net_device *dev)
        return err;
 }
 
-static void sky2_restart(struct work_struct *work)
+static void sky2_all_down(struct sky2_hw *hw)
 {
-       struct sky2_hw *hw = container_of(work, struct sky2_hw, restart_work);
-       u32 imask;
        int i;
 
-       rtnl_lock();
-
-       imask = sky2_read32(hw, B0_IMSK);
+       sky2_read32(hw, B0_IMSK);
        sky2_write32(hw, B0_IMSK, 0);
        synchronize_irq(hw->pdev->irq);
        napi_disable(&hw->napi);
@@ -3336,8 +3332,12 @@ static void sky2_restart(struct work_struct *work)
                netif_tx_disable(dev);
                sky2_hw_down(sky2);
        }
+}
 
-       sky2_reset(hw);
+static void sky2_all_up(struct sky2_hw *hw)
+{
+       u32 imask = Y2_IS_BASE;
+       int i;
 
        for (i = 0; i < hw->ports; i++) {
                struct net_device *dev = hw->dev[i];
@@ -3348,6 +3348,7 @@ static void sky2_restart(struct work_struct *work)
 
                sky2_hw_up(sky2);
                sky2_set_multicast(dev);
+               imask |= portirq_msk[i];
                netif_wake_queue(dev);
        }
 
@@ -3356,6 +3357,17 @@ static void sky2_restart(struct work_struct *work)
 
        sky2_read32(hw, B0_Y2_SP_LISR);
        napi_enable(&hw->napi);
+}
+
+static void sky2_restart(struct work_struct *work)
+{
+       struct sky2_hw *hw = container_of(work, struct sky2_hw, restart_work);
+
+       rtnl_lock();
+
+       sky2_all_down(hw);
+       sky2_reset(hw);
+       sky2_all_up(hw);
 
        rtnl_unlock();
 }