|
@@ -253,7 +253,8 @@ static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr)
|
|
|
{
|
|
|
u32 diff;
|
|
|
|
|
|
- smp_mb();
|
|
|
+ /* Tell compiler to fetch tx_prod and tx_cons from memory. */
|
|
|
+ barrier();
|
|
|
|
|
|
/* The ring uses 256 indices for 255 entries, one of them
|
|
|
* needs to be skipped.
|
|
@@ -6534,6 +6535,13 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
if (unlikely(bnx2_tx_avail(bp, txr) <= MAX_SKB_FRAGS)) {
|
|
|
netif_tx_stop_queue(txq);
|
|
|
+
|
|
|
+ /* netif_tx_stop_queue() must be done before checking
|
|
|
+ * tx index in bnx2_tx_avail() below, because in
|
|
|
+ * bnx2_tx_int(), we update tx index before checking for
|
|
|
+ * netif_tx_queue_stopped().
|
|
|
+ */
|
|
|
+ smp_mb();
|
|
|
if (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)
|
|
|
netif_tx_wake_queue(txq);
|
|
|
}
|