aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2010-05-17 20:34:43 -0400
committerDavid S. Miller <davem@davemloft.net>2010-05-17 20:34:43 -0400
commita0ba676008d9f050f1de9ede8d1ee4bf6820bfc9 (patch)
tree46aa7a4dc2c110ee0d211b384eda91adc7729ad9
parenta931d294042b5bbd8e390c59741b968c11856ac1 (diff)
bnx2: Use netif_carrier_off() to prevent timeout.
Based on original patch from Stanislaw Gruszka <sgruszka@redhat.com>. Using netif_carrier_off() is better than updating all the ->trans_start on all the tx queues. netif_carrier_off() needs to be called after bnx2_disable_int_sync() to guarantee no race conditions with the serdes timers that can modify the carrier state. If the chip or phy is reset, carrier will turn back on when we get the link interrupt. If there is no reset, we need to turn carrier back on in bnx2_netif_start(). Again, the phy_lock prevents race conditions with the serdes timers. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: Matt Carlson <mcarlson@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/bnx2.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index ab0068c7070a..188e356c30a3 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -656,19 +656,11 @@ bnx2_netif_stop(struct bnx2 *bp, bool stop_cnic)
656 if (stop_cnic) 656 if (stop_cnic)
657 bnx2_cnic_stop(bp); 657 bnx2_cnic_stop(bp);
658 if (netif_running(bp->dev)) { 658 if (netif_running(bp->dev)) {
659 int i;
660
661 bnx2_napi_disable(bp); 659 bnx2_napi_disable(bp);
662 netif_tx_disable(bp->dev); 660 netif_tx_disable(bp->dev);
663 /* prevent tx timeout */
664 for (i = 0; i < bp->dev->num_tx_queues; i++) {
665 struct netdev_queue *txq;
666
667 txq = netdev_get_tx_queue(bp->dev, i);
668 txq->trans_start = jiffies;
669 }
670 } 661 }
671 bnx2_disable_int_sync(bp); 662 bnx2_disable_int_sync(bp);
663 netif_carrier_off(bp->dev); /* prevent tx timeout */
672} 664}
673 665
674static void 666static void
@@ -677,6 +669,10 @@ bnx2_netif_start(struct bnx2 *bp, bool start_cnic)
677 if (atomic_dec_and_test(&bp->intr_sem)) { 669 if (atomic_dec_and_test(&bp->intr_sem)) {
678 if (netif_running(bp->dev)) { 670 if (netif_running(bp->dev)) {
679 netif_tx_wake_all_queues(bp->dev); 671 netif_tx_wake_all_queues(bp->dev);
672 spin_lock_bh(&bp->phy_lock);
673 if (bp->link_up)
674 netif_carrier_on(bp->dev);
675 spin_unlock_bh(&bp->phy_lock);
680 bnx2_napi_enable(bp); 676 bnx2_napi_enable(bp);
681 bnx2_enable_int(bp); 677 bnx2_enable_int(bp);
682 if (start_cnic) 678 if (start_cnic)