aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/bnx2x
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x.h16
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c10
2 files changed, 22 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
index 52f33b8c41e5..dbe97918a7fd 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
@@ -614,6 +614,22 @@ struct bnx2x_fastpath {
614#define TX_BD(x) ((x) & MAX_TX_BD) 614#define TX_BD(x) ((x) & MAX_TX_BD)
615#define TX_BD_POFF(x) ((x) & MAX_TX_DESC_CNT) 615#define TX_BD_POFF(x) ((x) & MAX_TX_DESC_CNT)
616 616
617/* number of NEXT_PAGE descriptors may be required during placement */
618#define NEXT_CNT_PER_TX_PKT(bds) \
619 (((bds) + MAX_TX_DESC_CNT - 1) / \
620 MAX_TX_DESC_CNT * NEXT_PAGE_TX_DESC_CNT)
621/* max BDs per tx packet w/o next_pages:
622 * START_BD - describes packed
623 * START_BD(splitted) - includes unpaged data segment for GSO
624 * PARSING_BD - for TSO and CSUM data
625 * Frag BDs - decribes pages for frags
626 */
627#define BDS_PER_TX_PKT 3
628#define MAX_BDS_PER_TX_PKT (MAX_SKB_FRAGS + BDS_PER_TX_PKT)
629/* max BDs per tx packet including next pages */
630#define MAX_DESC_PER_TX_PKT (MAX_BDS_PER_TX_PKT + \
631 NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))
632
617/* The RX BD ring is special, each bd is 8 bytes but the last one is 16 */ 633/* The RX BD ring is special, each bd is 8 bytes but the last one is 16 */
618#define NUM_RX_RINGS 8 634#define NUM_RX_RINGS 8
619#define RX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct eth_rx_bd)) 635#define RX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct eth_rx_bd))
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 5aeb034fa05c..e879e19eb0d6 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -221,7 +221,7 @@ int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata)
221 221
222 if ((netif_tx_queue_stopped(txq)) && 222 if ((netif_tx_queue_stopped(txq)) &&
223 (bp->state == BNX2X_STATE_OPEN) && 223 (bp->state == BNX2X_STATE_OPEN) &&
224 (bnx2x_tx_avail(bp, txdata) >= MAX_SKB_FRAGS + 4)) 224 (bnx2x_tx_avail(bp, txdata) >= MAX_DESC_PER_TX_PKT))
225 netif_tx_wake_queue(txq); 225 netif_tx_wake_queue(txq);
226 226
227 __netif_tx_unlock(txq); 227 __netif_tx_unlock(txq);
@@ -2948,7 +2948,9 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
2948 txdata->cid, fp_index, txdata_index, txdata, fp); */ 2948 txdata->cid, fp_index, txdata_index, txdata, fp); */
2949 2949
2950 if (unlikely(bnx2x_tx_avail(bp, txdata) < 2950 if (unlikely(bnx2x_tx_avail(bp, txdata) <
2951 (skb_shinfo(skb)->nr_frags + 3))) { 2951 skb_shinfo(skb)->nr_frags +
2952 BDS_PER_TX_PKT +
2953 NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))) {
2952 bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++; 2954 bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++;
2953 netif_tx_stop_queue(txq); 2955 netif_tx_stop_queue(txq);
2954 BNX2X_ERR("BUG! Tx ring full when queue awake!\n"); 2956 BNX2X_ERR("BUG! Tx ring full when queue awake!\n");
@@ -3223,7 +3225,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
3223 3225
3224 txdata->tx_bd_prod += nbd; 3226 txdata->tx_bd_prod += nbd;
3225 3227
3226 if (unlikely(bnx2x_tx_avail(bp, txdata) < MAX_SKB_FRAGS + 4)) { 3228 if (unlikely(bnx2x_tx_avail(bp, txdata) < MAX_DESC_PER_TX_PKT)) {
3227 netif_tx_stop_queue(txq); 3229 netif_tx_stop_queue(txq);
3228 3230
3229 /* paired memory barrier is in bnx2x_tx_int(), we have to keep 3231 /* paired memory barrier is in bnx2x_tx_int(), we have to keep
@@ -3232,7 +3234,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
3232 smp_mb(); 3234 smp_mb();
3233 3235
3234 bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++; 3236 bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++;
3235 if (bnx2x_tx_avail(bp, txdata) >= MAX_SKB_FRAGS + 4) 3237 if (bnx2x_tx_avail(bp, txdata) >= MAX_DESC_PER_TX_PKT)
3236 netif_tx_wake_queue(txq); 3238 netif_tx_wake_queue(txq);
3237 } 3239 }
3238 txdata->tx_pkt++; 3240 txdata->tx_pkt++;