Loading drivers/net/bnx2.c +17 −14 Original line number Diff line number Diff line Loading @@ -226,7 +226,7 @@ static struct flash_spec flash_5709 = { MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); static inline u32 bnx2_tx_avail(struct bnx2 *bp) static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_napi *bnapi) { u32 diff; Loading @@ -235,7 +235,7 @@ static inline u32 bnx2_tx_avail(struct bnx2 *bp) /* The ring uses 256 indices for 255 entries, one of them * needs to be skipped. */ diff = bp->tx_prod - bp->tx_cons; diff = bp->tx_prod - bnapi->tx_cons; if (unlikely(diff >= TX_DESC_CNT)) { diff &= 0xffff; if (diff == TX_DESC_CNT) Loading Loading @@ -2358,7 +2358,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi) int tx_free_bd = 0; hw_cons = bnx2_get_hw_tx_cons(bnapi); sw_cons = bp->tx_cons; sw_cons = bnapi->tx_cons; while (sw_cons != hw_cons) { struct sw_bd *tx_buf; Loading Loading @@ -2412,8 +2412,8 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi) hw_cons = bnx2_get_hw_tx_cons(bnapi); } bp->hw_tx_cons = hw_cons; bp->tx_cons = sw_cons; bnapi->hw_tx_cons = hw_cons; bnapi->tx_cons = sw_cons; /* Need to make the tx_cons update visible to bnx2_start_xmit() * before checking for netif_queue_stopped(). Without the * memory barrier, there is a small possibility that bnx2_start_xmit() Loading @@ -2422,10 +2422,10 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi) smp_mb(); if (unlikely(netif_queue_stopped(bp->dev)) && (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) { (bnx2_tx_avail(bp, bnapi) > bp->tx_wake_thresh)) { netif_tx_lock(bp->dev); if ((netif_queue_stopped(bp->dev)) && (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) (bnx2_tx_avail(bp, bnapi) > bp->tx_wake_thresh)) netif_wake_queue(bp->dev); netif_tx_unlock(bp->dev); } Loading Loading @@ -2846,7 +2846,7 @@ bnx2_has_work(struct bnx2_napi *bnapi) struct status_block *sblk = bp->status_blk; if ((bnx2_get_hw_rx_cons(bnapi) != bp->rx_cons) || (bnx2_get_hw_tx_cons(bnapi) != bp->hw_tx_cons)) (bnx2_get_hw_tx_cons(bnapi) != bnapi->hw_tx_cons)) return 1; if ((sblk->status_attn_bits & STATUS_ATTN_EVENTS) != Loading Loading @@ -2876,7 +2876,7 @@ static int bnx2_poll_work(struct bnx2 *bp, struct bnx2_napi *bnapi, REG_RD(bp, BNX2_HC_COMMAND); } if (bnx2_get_hw_tx_cons(bnapi) != bp->hw_tx_cons) if (bnx2_get_hw_tx_cons(bnapi) != bnapi->hw_tx_cons) bnx2_tx_int(bp, bnapi); if (bnx2_get_hw_rx_cons(bnapi) != bp->rx_cons) Loading Loading @@ -4381,6 +4381,7 @@ bnx2_init_tx_ring(struct bnx2 *bp) { struct tx_bd *txbd; u32 cid; struct bnx2_napi *bnapi = &bp->bnx2_napi; bp->tx_wake_thresh = bp->tx_ring_size / 2; Loading @@ -4390,8 +4391,8 @@ bnx2_init_tx_ring(struct bnx2 *bp) txbd->tx_bd_haddr_lo = (u64) bp->tx_desc_mapping & 0xffffffff; bp->tx_prod = 0; bp->tx_cons = 0; bp->hw_tx_cons = 0; bnapi->tx_cons = 0; bnapi->hw_tx_cons = 0; bp->tx_prod_bseq = 0; cid = TX_CID; Loading Loading @@ -5440,8 +5441,10 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) u32 len, vlan_tag_flags, last_frag, mss; u16 prod, ring_prod; int i; struct bnx2_napi *bnapi = &bp->bnx2_napi; if (unlikely(bnx2_tx_avail(bp) < (skb_shinfo(skb)->nr_frags + 1))) { if (unlikely(bnx2_tx_avail(bp, bnapi) < (skb_shinfo(skb)->nr_frags + 1))) { netif_stop_queue(dev); printk(KERN_ERR PFX "%s: BUG! Tx ring full when queue awake!\n", dev->name); Loading Loading @@ -5556,9 +5559,9 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) bp->tx_prod = prod; dev->trans_start = jiffies; if (unlikely(bnx2_tx_avail(bp) <= MAX_SKB_FRAGS)) { if (unlikely(bnx2_tx_avail(bp, bnapi) <= MAX_SKB_FRAGS)) { netif_stop_queue(dev); if (bnx2_tx_avail(bp) > bp->tx_wake_thresh) if (bnx2_tx_avail(bp, bnapi) > bp->tx_wake_thresh) netif_wake_queue(dev); } Loading drivers/net/bnx2.h +3 −3 Original line number Diff line number Diff line Loading @@ -6509,6 +6509,9 @@ struct bnx2_napi { struct status_block *status_blk; u32 last_status_idx; u32 int_num; u16 tx_cons; u16 hw_tx_cons; }; struct bnx2 { Loading Loading @@ -6539,9 +6542,6 @@ struct bnx2 { u32 tx_bidx_addr; u32 tx_bseq_addr; u16 tx_cons __attribute__((aligned(L1_CACHE_BYTES))); u16 hw_tx_cons; struct bnx2_napi bnx2_napi; #ifdef BCM_VLAN Loading Loading
drivers/net/bnx2.c +17 −14 Original line number Diff line number Diff line Loading @@ -226,7 +226,7 @@ static struct flash_spec flash_5709 = { MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); static inline u32 bnx2_tx_avail(struct bnx2 *bp) static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_napi *bnapi) { u32 diff; Loading @@ -235,7 +235,7 @@ static inline u32 bnx2_tx_avail(struct bnx2 *bp) /* The ring uses 256 indices for 255 entries, one of them * needs to be skipped. */ diff = bp->tx_prod - bp->tx_cons; diff = bp->tx_prod - bnapi->tx_cons; if (unlikely(diff >= TX_DESC_CNT)) { diff &= 0xffff; if (diff == TX_DESC_CNT) Loading Loading @@ -2358,7 +2358,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi) int tx_free_bd = 0; hw_cons = bnx2_get_hw_tx_cons(bnapi); sw_cons = bp->tx_cons; sw_cons = bnapi->tx_cons; while (sw_cons != hw_cons) { struct sw_bd *tx_buf; Loading Loading @@ -2412,8 +2412,8 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi) hw_cons = bnx2_get_hw_tx_cons(bnapi); } bp->hw_tx_cons = hw_cons; bp->tx_cons = sw_cons; bnapi->hw_tx_cons = hw_cons; bnapi->tx_cons = sw_cons; /* Need to make the tx_cons update visible to bnx2_start_xmit() * before checking for netif_queue_stopped(). Without the * memory barrier, there is a small possibility that bnx2_start_xmit() Loading @@ -2422,10 +2422,10 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi) smp_mb(); if (unlikely(netif_queue_stopped(bp->dev)) && (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) { (bnx2_tx_avail(bp, bnapi) > bp->tx_wake_thresh)) { netif_tx_lock(bp->dev); if ((netif_queue_stopped(bp->dev)) && (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) (bnx2_tx_avail(bp, bnapi) > bp->tx_wake_thresh)) netif_wake_queue(bp->dev); netif_tx_unlock(bp->dev); } Loading Loading @@ -2846,7 +2846,7 @@ bnx2_has_work(struct bnx2_napi *bnapi) struct status_block *sblk = bp->status_blk; if ((bnx2_get_hw_rx_cons(bnapi) != bp->rx_cons) || (bnx2_get_hw_tx_cons(bnapi) != bp->hw_tx_cons)) (bnx2_get_hw_tx_cons(bnapi) != bnapi->hw_tx_cons)) return 1; if ((sblk->status_attn_bits & STATUS_ATTN_EVENTS) != Loading Loading @@ -2876,7 +2876,7 @@ static int bnx2_poll_work(struct bnx2 *bp, struct bnx2_napi *bnapi, REG_RD(bp, BNX2_HC_COMMAND); } if (bnx2_get_hw_tx_cons(bnapi) != bp->hw_tx_cons) if (bnx2_get_hw_tx_cons(bnapi) != bnapi->hw_tx_cons) bnx2_tx_int(bp, bnapi); if (bnx2_get_hw_rx_cons(bnapi) != bp->rx_cons) Loading Loading @@ -4381,6 +4381,7 @@ bnx2_init_tx_ring(struct bnx2 *bp) { struct tx_bd *txbd; u32 cid; struct bnx2_napi *bnapi = &bp->bnx2_napi; bp->tx_wake_thresh = bp->tx_ring_size / 2; Loading @@ -4390,8 +4391,8 @@ bnx2_init_tx_ring(struct bnx2 *bp) txbd->tx_bd_haddr_lo = (u64) bp->tx_desc_mapping & 0xffffffff; bp->tx_prod = 0; bp->tx_cons = 0; bp->hw_tx_cons = 0; bnapi->tx_cons = 0; bnapi->hw_tx_cons = 0; bp->tx_prod_bseq = 0; cid = TX_CID; Loading Loading @@ -5440,8 +5441,10 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) u32 len, vlan_tag_flags, last_frag, mss; u16 prod, ring_prod; int i; struct bnx2_napi *bnapi = &bp->bnx2_napi; if (unlikely(bnx2_tx_avail(bp) < (skb_shinfo(skb)->nr_frags + 1))) { if (unlikely(bnx2_tx_avail(bp, bnapi) < (skb_shinfo(skb)->nr_frags + 1))) { netif_stop_queue(dev); printk(KERN_ERR PFX "%s: BUG! Tx ring full when queue awake!\n", dev->name); Loading Loading @@ -5556,9 +5559,9 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) bp->tx_prod = prod; dev->trans_start = jiffies; if (unlikely(bnx2_tx_avail(bp) <= MAX_SKB_FRAGS)) { if (unlikely(bnx2_tx_avail(bp, bnapi) <= MAX_SKB_FRAGS)) { netif_stop_queue(dev); if (bnx2_tx_avail(bp) > bp->tx_wake_thresh) if (bnx2_tx_avail(bp, bnapi) > bp->tx_wake_thresh) netif_wake_queue(dev); } Loading
drivers/net/bnx2.h +3 −3 Original line number Diff line number Diff line Loading @@ -6509,6 +6509,9 @@ struct bnx2_napi { struct status_block *status_blk; u32 last_status_idx; u32 int_num; u16 tx_cons; u16 hw_tx_cons; }; struct bnx2 { Loading Loading @@ -6539,9 +6542,6 @@ struct bnx2 { u32 tx_bidx_addr; u32 tx_bseq_addr; u16 tx_cons __attribute__((aligned(L1_CACHE_BYTES))); u16 hw_tx_cons; struct bnx2_napi bnx2_napi; #ifdef BCM_VLAN Loading