diff options
author | Dmitry Kravkov <dmitry@broadcom.com> | 2012-12-01 23:05:48 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-02 20:22:59 -0500 |
commit | c96bdc0c9e86ac243c5eff41c0c1418cbbc3057c (patch) | |
tree | 69f55dc016f47f432a268305b09f20ec69f530a0 /drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |
parent | 4c704899328bcb448d9c7fa709777b3e28e05f6a (diff) |
bnx2x: Filter packets on FCoE rings
Whenever bnx2x fails to transmit a packet due to a full Tx ring, if the
ring size is zero (indicating an FCoE ring) driver filters the packet out
and gracefully continues.
Driver also gathers statistics on such filtered packets.
Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index e95174d451a5..5e07aa5e1aea 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -3127,11 +3127,16 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3127 | BDS_PER_TX_PKT + | 3127 | BDS_PER_TX_PKT + |
3128 | NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))) { | 3128 | NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))) { |
3129 | /* Handle special storage cases separately */ | 3129 | /* Handle special storage cases separately */ |
3130 | if (txdata->tx_ring_size != 0) { | 3130 | if (txdata->tx_ring_size == 0) { |
3131 | BNX2X_ERR("BUG! Tx ring full when queue awake!\n"); | 3131 | struct bnx2x_eth_q_stats *q_stats = |
3132 | bnx2x_fp_qstats(bp, txdata->parent_fp); | ||
3133 | q_stats->driver_filtered_tx_pkt++; | ||
3134 | dev_kfree_skb(skb); | ||
3135 | return NETDEV_TX_OK; | ||
3136 | } | ||
3132 | bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++; | 3137 | bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++; |
3133 | netif_tx_stop_queue(txq); | 3138 | netif_tx_stop_queue(txq); |
3134 | } | 3139 | BNX2X_ERR("BUG! Tx ring full when queue awake!\n"); |
3135 | 3140 | ||
3136 | return NETDEV_TX_BUSY; | 3141 | return NETDEV_TX_BUSY; |
3137 | } | 3142 | } |