aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/tg3.c
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2012-09-28 03:12:41 -0400
committerDavid S. Miller <davem@davemloft.net>2012-09-30 02:10:35 -0400
commit6513859479b0fe1232cddd100db269191c1691e1 (patch)
tree87f847d79b9b0912b890cb105ce251ccbe9d65c8 /drivers/net/ethernet/broadcom/tg3.c
parentd8f4cd3880eff5a382ca6771062e91b58b2955db (diff)
tg3: Refactor tg3_close()
by introducing tg3_stop() that does the opposite of tg3_start(). This function will be useful when adding the support for changing the numbe of rx and tx rings. Reviewed-by: Nithin Nayak Sujir <nsujir@broadcom.com> Reviewed-by: Benjamin Li <benli@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c70
1 files changed, 38 insertions, 32 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index 9bd99ce46e5f..3f2197e41a52 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -10448,6 +10448,43 @@ err_out1:
10448 return err; 10448 return err;
10449} 10449}
10450 10450
10451static void tg3_stop(struct tg3 *tp)
10452{
10453 int i;
10454
10455 tg3_napi_disable(tp);
10456 tg3_reset_task_cancel(tp);
10457
10458 netif_tx_disable(tp->dev);
10459
10460 tg3_timer_stop(tp);
10461
10462 tg3_hwmon_close(tp);
10463
10464 tg3_phy_stop(tp);
10465
10466 tg3_full_lock(tp, 1);
10467
10468 tg3_disable_ints(tp);
10469
10470 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
10471 tg3_free_rings(tp);
10472 tg3_flag_clear(tp, INIT_COMPLETE);
10473
10474 tg3_full_unlock(tp);
10475
10476 for (i = tp->irq_cnt - 1; i >= 0; i--) {
10477 struct tg3_napi *tnapi = &tp->napi[i];
10478 free_irq(tnapi->irq_vec, tnapi);
10479 }
10480
10481 tg3_ints_fini(tp);
10482
10483 tg3_napi_fini(tp);
10484
10485 tg3_free_consistent(tp);
10486}
10487
10451static int tg3_open(struct net_device *dev) 10488static int tg3_open(struct net_device *dev)
10452{ 10489{
10453 struct tg3 *tp = netdev_priv(dev); 10490 struct tg3 *tp = netdev_priv(dev);
@@ -10490,45 +10527,14 @@ static int tg3_open(struct net_device *dev)
10490 10527
10491static int tg3_close(struct net_device *dev) 10528static int tg3_close(struct net_device *dev)
10492{ 10529{
10493 int i;
10494 struct tg3 *tp = netdev_priv(dev); 10530 struct tg3 *tp = netdev_priv(dev);
10495 10531
10496 tg3_napi_disable(tp); 10532 tg3_stop(tp);
10497 tg3_reset_task_cancel(tp);
10498
10499 netif_tx_stop_all_queues(dev);
10500
10501 tg3_timer_stop(tp);
10502
10503 tg3_hwmon_close(tp);
10504
10505 tg3_phy_stop(tp);
10506
10507 tg3_full_lock(tp, 1);
10508
10509 tg3_disable_ints(tp);
10510
10511 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
10512 tg3_free_rings(tp);
10513 tg3_flag_clear(tp, INIT_COMPLETE);
10514
10515 tg3_full_unlock(tp);
10516
10517 for (i = tp->irq_cnt - 1; i >= 0; i--) {
10518 struct tg3_napi *tnapi = &tp->napi[i];
10519 free_irq(tnapi->irq_vec, tnapi);
10520 }
10521
10522 tg3_ints_fini(tp);
10523 10533
10524 /* Clear stats across close / open calls */ 10534 /* Clear stats across close / open calls */
10525 memset(&tp->net_stats_prev, 0, sizeof(tp->net_stats_prev)); 10535 memset(&tp->net_stats_prev, 0, sizeof(tp->net_stats_prev));
10526 memset(&tp->estats_prev, 0, sizeof(tp->estats_prev)); 10536 memset(&tp->estats_prev, 0, sizeof(tp->estats_prev));
10527 10537
10528 tg3_napi_fini(tp);
10529
10530 tg3_free_consistent(tp);
10531
10532 tg3_power_down(tp); 10538 tg3_power_down(tp);
10533 10539
10534 netif_carrier_off(tp->dev); 10540 netif_carrier_off(tp->dev);