diff options
| -rw-r--r-- | drivers/net/bnx2.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 4c1e51ee8ede..35eec2defadc 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
| @@ -651,9 +651,10 @@ bnx2_napi_enable(struct bnx2 *bp) | |||
| 651 | } | 651 | } |
| 652 | 652 | ||
| 653 | static void | 653 | static void |
| 654 | bnx2_netif_stop(struct bnx2 *bp) | 654 | bnx2_netif_stop(struct bnx2 *bp, bool stop_cnic) |
| 655 | { | 655 | { |
| 656 | bnx2_cnic_stop(bp); | 656 | if (stop_cnic) |
| 657 | bnx2_cnic_stop(bp); | ||
| 657 | if (netif_running(bp->dev)) { | 658 | if (netif_running(bp->dev)) { |
| 658 | int i; | 659 | int i; |
| 659 | 660 | ||
| @@ -671,14 +672,15 @@ bnx2_netif_stop(struct bnx2 *bp) | |||
| 671 | } | 672 | } |
| 672 | 673 | ||
| 673 | static void | 674 | static void |
| 674 | bnx2_netif_start(struct bnx2 *bp) | 675 | bnx2_netif_start(struct bnx2 *bp, bool start_cnic) |
| 675 | { | 676 | { |
| 676 | if (atomic_dec_and_test(&bp->intr_sem)) { | 677 | if (atomic_dec_and_test(&bp->intr_sem)) { |
| 677 | if (netif_running(bp->dev)) { | 678 | if (netif_running(bp->dev)) { |
| 678 | netif_tx_wake_all_queues(bp->dev); | 679 | netif_tx_wake_all_queues(bp->dev); |
| 679 | bnx2_napi_enable(bp); | 680 | bnx2_napi_enable(bp); |
| 680 | bnx2_enable_int(bp); | 681 | bnx2_enable_int(bp); |
| 681 | bnx2_cnic_start(bp); | 682 | if (start_cnic) |
| 683 | bnx2_cnic_start(bp); | ||
| 682 | } | 684 | } |
| 683 | } | 685 | } |
| 684 | } | 686 | } |
| @@ -6277,12 +6279,12 @@ bnx2_reset_task(struct work_struct *work) | |||
| 6277 | return; | 6279 | return; |
| 6278 | } | 6280 | } |
| 6279 | 6281 | ||
| 6280 | bnx2_netif_stop(bp); | 6282 | bnx2_netif_stop(bp, true); |
| 6281 | 6283 | ||
| 6282 | bnx2_init_nic(bp, 1); | 6284 | bnx2_init_nic(bp, 1); |
| 6283 | 6285 | ||
| 6284 | atomic_set(&bp->intr_sem, 1); | 6286 | atomic_set(&bp->intr_sem, 1); |
| 6285 | bnx2_netif_start(bp); | 6287 | bnx2_netif_start(bp, true); |
| 6286 | rtnl_unlock(); | 6288 | rtnl_unlock(); |
| 6287 | } | 6289 | } |
| 6288 | 6290 | ||
| @@ -6324,7 +6326,7 @@ bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp) | |||
| 6324 | struct bnx2 *bp = netdev_priv(dev); | 6326 | struct bnx2 *bp = netdev_priv(dev); |
| 6325 | 6327 | ||
| 6326 | if (netif_running(dev)) | 6328 | if (netif_running(dev)) |
| 6327 | bnx2_netif_stop(bp); | 6329 | bnx2_netif_stop(bp, false); |
| 6328 | 6330 | ||
| 6329 | bp->vlgrp = vlgrp; | 6331 | bp->vlgrp = vlgrp; |
| 6330 | 6332 | ||
| @@ -6335,7 +6337,7 @@ bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp) | |||
| 6335 | if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) | 6337 | if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) |
| 6336 | bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1); | 6338 | bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1); |
| 6337 | 6339 | ||
| 6338 | bnx2_netif_start(bp); | 6340 | bnx2_netif_start(bp, false); |
| 6339 | } | 6341 | } |
| 6340 | #endif | 6342 | #endif |
| 6341 | 6343 | ||
| @@ -7055,9 +7057,9 @@ bnx2_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal) | |||
| 7055 | bp->stats_ticks &= BNX2_HC_STATS_TICKS_HC_STAT_TICKS; | 7057 | bp->stats_ticks &= BNX2_HC_STATS_TICKS_HC_STAT_TICKS; |
| 7056 | 7058 | ||
| 7057 | if (netif_running(bp->dev)) { | 7059 | if (netif_running(bp->dev)) { |
| 7058 | bnx2_netif_stop(bp); | 7060 | bnx2_netif_stop(bp, true); |
| 7059 | bnx2_init_nic(bp, 0); | 7061 | bnx2_init_nic(bp, 0); |
| 7060 | bnx2_netif_start(bp); | 7062 | bnx2_netif_start(bp, true); |
| 7061 | } | 7063 | } |
| 7062 | 7064 | ||
| 7063 | return 0; | 7065 | return 0; |
| @@ -7087,7 +7089,7 @@ bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx) | |||
| 7087 | /* Reset will erase chipset stats; save them */ | 7089 | /* Reset will erase chipset stats; save them */ |
| 7088 | bnx2_save_stats(bp); | 7090 | bnx2_save_stats(bp); |
| 7089 | 7091 | ||
| 7090 | bnx2_netif_stop(bp); | 7092 | bnx2_netif_stop(bp, true); |
| 7091 | bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET); | 7093 | bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET); |
| 7092 | bnx2_free_skbs(bp); | 7094 | bnx2_free_skbs(bp); |
| 7093 | bnx2_free_mem(bp); | 7095 | bnx2_free_mem(bp); |
| @@ -7115,7 +7117,7 @@ bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx) | |||
| 7115 | bnx2_setup_cnic_irq_info(bp); | 7117 | bnx2_setup_cnic_irq_info(bp); |
| 7116 | mutex_unlock(&bp->cnic_lock); | 7118 | mutex_unlock(&bp->cnic_lock); |
| 7117 | #endif | 7119 | #endif |
| 7118 | bnx2_netif_start(bp); | 7120 | bnx2_netif_start(bp, true); |
| 7119 | } | 7121 | } |
| 7120 | return 0; | 7122 | return 0; |
| 7121 | } | 7123 | } |
| @@ -7368,7 +7370,7 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf) | |||
| 7368 | if (etest->flags & ETH_TEST_FL_OFFLINE) { | 7370 | if (etest->flags & ETH_TEST_FL_OFFLINE) { |
| 7369 | int i; | 7371 | int i; |
| 7370 | 7372 | ||
| 7371 | bnx2_netif_stop(bp); | 7373 | bnx2_netif_stop(bp, true); |
| 7372 | bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_DIAG); | 7374 | bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_DIAG); |
| 7373 | bnx2_free_skbs(bp); | 7375 | bnx2_free_skbs(bp); |
| 7374 | 7376 | ||
| @@ -7387,7 +7389,7 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf) | |||
| 7387 | bnx2_shutdown_chip(bp); | 7389 | bnx2_shutdown_chip(bp); |
| 7388 | else { | 7390 | else { |
| 7389 | bnx2_init_nic(bp, 1); | 7391 | bnx2_init_nic(bp, 1); |
| 7390 | bnx2_netif_start(bp); | 7392 | bnx2_netif_start(bp, true); |
| 7391 | } | 7393 | } |
| 7392 | 7394 | ||
| 7393 | /* wait for link up */ | 7395 | /* wait for link up */ |
| @@ -8381,7 +8383,7 @@ bnx2_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 8381 | return 0; | 8383 | return 0; |
| 8382 | 8384 | ||
| 8383 | flush_scheduled_work(); | 8385 | flush_scheduled_work(); |
| 8384 | bnx2_netif_stop(bp); | 8386 | bnx2_netif_stop(bp, true); |
| 8385 | netif_device_detach(dev); | 8387 | netif_device_detach(dev); |
| 8386 | del_timer_sync(&bp->timer); | 8388 | del_timer_sync(&bp->timer); |
| 8387 | bnx2_shutdown_chip(bp); | 8389 | bnx2_shutdown_chip(bp); |
| @@ -8403,7 +8405,7 @@ bnx2_resume(struct pci_dev *pdev) | |||
| 8403 | bnx2_set_power_state(bp, PCI_D0); | 8405 | bnx2_set_power_state(bp, PCI_D0); |
| 8404 | netif_device_attach(dev); | 8406 | netif_device_attach(dev); |
| 8405 | bnx2_init_nic(bp, 1); | 8407 | bnx2_init_nic(bp, 1); |
| 8406 | bnx2_netif_start(bp); | 8408 | bnx2_netif_start(bp, true); |
| 8407 | return 0; | 8409 | return 0; |
| 8408 | } | 8410 | } |
| 8409 | 8411 | ||
| @@ -8430,7 +8432,7 @@ static pci_ers_result_t bnx2_io_error_detected(struct pci_dev *pdev, | |||
| 8430 | } | 8432 | } |
| 8431 | 8433 | ||
| 8432 | if (netif_running(dev)) { | 8434 | if (netif_running(dev)) { |
| 8433 | bnx2_netif_stop(bp); | 8435 | bnx2_netif_stop(bp, true); |
| 8434 | del_timer_sync(&bp->timer); | 8436 | del_timer_sync(&bp->timer); |
| 8435 | bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET); | 8437 | bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET); |
| 8436 | } | 8438 | } |
| @@ -8487,7 +8489,7 @@ static void bnx2_io_resume(struct pci_dev *pdev) | |||
| 8487 | 8489 | ||
| 8488 | rtnl_lock(); | 8490 | rtnl_lock(); |
| 8489 | if (netif_running(dev)) | 8491 | if (netif_running(dev)) |
| 8490 | bnx2_netif_start(bp); | 8492 | bnx2_netif_start(bp, true); |
| 8491 | 8493 | ||
| 8492 | netif_device_attach(dev); | 8494 | netif_device_attach(dev); |
| 8493 | rtnl_unlock(); | 8495 | rtnl_unlock(); |
