aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);