* [PATCH -next] bnx2: Use netif_carrier_off() to prevent timeout.
@ 2010-05-13 14:48 Michael Chan
2010-05-18 0:34 ` David Miller
0 siblings, 1 reply; 2+ messages in thread
From: Michael Chan @ 2010-05-13 14:48 UTC (permalink / raw)
To: davem; +Cc: sgruszka, netdev
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>
---
drivers/net/bnx2.c | 14 +++++---------
1 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index ab0068c..188e356 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -656,19 +656,11 @@ bnx2_netif_stop(struct bnx2 *bp, bool stop_cnic)
if (stop_cnic)
bnx2_cnic_stop(bp);
if (netif_running(bp->dev)) {
- int i;
-
bnx2_napi_disable(bp);
netif_tx_disable(bp->dev);
- /* prevent tx timeout */
- for (i = 0; i < bp->dev->num_tx_queues; i++) {
- struct netdev_queue *txq;
-
- txq = netdev_get_tx_queue(bp->dev, i);
- txq->trans_start = jiffies;
- }
}
bnx2_disable_int_sync(bp);
+ netif_carrier_off(bp->dev); /* prevent tx timeout */
}
static void
@@ -677,6 +669,10 @@ bnx2_netif_start(struct bnx2 *bp, bool start_cnic)
if (atomic_dec_and_test(&bp->intr_sem)) {
if (netif_running(bp->dev)) {
netif_tx_wake_all_queues(bp->dev);
+ spin_lock_bh(&bp->phy_lock);
+ if (bp->link_up)
+ netif_carrier_on(bp->dev);
+ spin_unlock_bh(&bp->phy_lock);
bnx2_napi_enable(bp);
bnx2_enable_int(bp);
if (start_cnic)
--
1.6.4.GIT
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH -next] bnx2: Use netif_carrier_off() to prevent timeout.
2010-05-13 14:48 [PATCH -next] bnx2: Use netif_carrier_off() to prevent timeout Michael Chan
@ 2010-05-18 0:34 ` David Miller
0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2010-05-18 0:34 UTC (permalink / raw)
To: mchan; +Cc: sgruszka, netdev
From: "Michael Chan" <mchan@broadcom.com>
Date: Thu, 13 May 2010 07:48:35 -0700
> 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>
Applied, thanks.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-05-18 0:34 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-13 14:48 [PATCH -next] bnx2: Use netif_carrier_off() to prevent timeout Michael Chan
2010-05-18 0:34 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox