From c8cd00742ce0e4c69069ff1f0804152b20048a58 Mon Sep 17 00:00:00 2001 From: Michael Chan Date: Thu, 14 Dec 2006 15:56:32 -0800 Subject: [PATCH] --- yaml --- r: 44660 b: refs/heads/master c: faac9c4b753f420c02bdce0785d2657087830a12 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/bnx2.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 6d96e6edba9f..ac19f798aac4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a3d384029aa304f8f3f5355d35f0ae274454f7cd +refs/heads/master: faac9c4b753f420c02bdce0785d2657087830a12 diff --git a/trunk/drivers/net/bnx2.c b/trunk/drivers/net/bnx2.c index 7d824cf8ee2d..f296c37f29b6 100644 --- a/trunk/drivers/net/bnx2.c +++ b/trunk/drivers/net/bnx2.c @@ -217,9 +217,16 @@ static inline u32 bnx2_tx_avail(struct bnx2 *bp) u32 diff; smp_mb(); - diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons); - if (diff > MAX_TX_DESC_CNT) - diff = (diff & MAX_TX_DESC_CNT) - 1; + + /* The ring uses 256 indices for 255 entries, one of them + * needs to be skipped. + */ + diff = bp->tx_prod - bp->tx_cons; + if (unlikely(diff >= TX_DESC_CNT)) { + diff &= 0xffff; + if (diff == TX_DESC_CNT) + diff = MAX_TX_DESC_CNT; + } return (bp->tx_ring_size - diff); }