diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 16 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 10 |
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++; |