]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
tg3: add tx_dropped counter
authorJoe Jin <joe.jin@oracle.com>
Tue, 15 May 2012 13:16:48 +0000 (21:16 +0800)
committerJoe Jin <joe.jin@oracle.com>
Wed, 16 May 2012 02:26:50 +0000 (10:26 +0800)
If a frame cant be transmitted, it is silently discarded.

Add a counter to report these errors to user.

(backport from commit 48855432047c9de7ea9987349de4c47d48ade8d1)
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Joe Jin <joe.jin@oracle.com>
drivers/net/tg3.c
drivers/net/tg3.h

index 77adaf4ec4646bbff587e2b8a4153db9b0656f25..88c819dd8cf218877f885982b723845d5901755f 100644 (file)
@@ -6677,10 +6677,8 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
                u32 tcp_opt_len, hdr_len;
 
                if (skb_header_cloned(skb) &&
-                   pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
-                       dev_kfree_skb(skb);
-                       goto out_unlock;
-               }
+                   pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
+                       goto drop;
 
                iph = ip_hdr(skb);
                tcp_opt_len = tcp_optlen(skb);
@@ -6754,10 +6752,9 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
        len = skb_headlen(skb);
 
        mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
-       if (pci_dma_mapping_error(tp->pdev, mapping)) {
-               dev_kfree_skb(skb);
-               goto out_unlock;
-       }
+       if (pci_dma_mapping_error(tp->pdev, mapping))
+               goto drop;
+
 
        tnapi->tx_buffers[entry].skb = skb;
        dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping, mapping);
@@ -6815,7 +6812,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
                budget = tg3_tx_avail(tnapi);
                if (tigon3_dma_hwbug_workaround(tnapi, &skb, &entry, &budget,
                                                base_flags, mss, vlan))
-                       goto out_unlock;
+                       goto drop_nofree;
        }
 
        /* Packets are ready, update Tx producer idx local and on card. */
@@ -6835,15 +6832,16 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
                        netif_tx_wake_queue(txq);
        }
 
-out_unlock:
        mmiowb();
-
        return NETDEV_TX_OK;
 
 dma_error:
        tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, i);
-       dev_kfree_skb(skb);
        tnapi->tx_buffers[tnapi->tx_prod].skb = NULL;
+drop:
+       dev_kfree_skb(skb);
+drop_nofree:
+       tp->tx_dropped++;
        return NETDEV_TX_OK;
 }
 
@@ -10017,6 +10015,7 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
                get_stat64(&hw_stats->rx_discards);
 
        stats->rx_dropped = tp->rx_dropped;
+       stats->tx_dropped = tp->tx_dropped;
 
        return stats;
 }
index 9f2432c52f8bd3ad11c58c98fac709f644f76808..3923531743a9ecdea765042e831a4cb570d5cff3 100644 (file)
@@ -2990,6 +2990,7 @@ struct tg3 {
 
        /* begin "everything else" cacheline(s) section */
        unsigned long                   rx_dropped;
+       unsigned long                   tx_dropped;
        struct rtnl_link_stats64        net_stats_prev;
        struct tg3_ethtool_stats        estats;
        struct tg3_ethtool_stats        estats_prev;