diff options
| author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-10-24 03:53:03 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-10-24 18:40:14 -0400 |
| commit | 48855432047c9de7ea9987349de4c47d48ade8d1 (patch) | |
| tree | 6c6d7d05c62f3426e288089bbeb33a1f45520b07 | |
| parent | 752961a11e847e604aeaaa798cac438c1e671ba4 (diff) | |
|PATCH net-next] tg3: add tx_dropped counter
If a frame cant be transmitted, it is silently discarded.
Add a counter to report these errors to user.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 23 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/tg3.h | 1 |
2 files changed, 12 insertions, 12 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index b865e9fdd089..161cbbb4814a 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
| @@ -6671,10 +6671,8 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 6671 | u32 tcp_opt_len, hdr_len; | 6671 | u32 tcp_opt_len, hdr_len; |
| 6672 | 6672 | ||
| 6673 | if (skb_header_cloned(skb) && | 6673 | if (skb_header_cloned(skb) && |
| 6674 | pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { | 6674 | pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) |
| 6675 | dev_kfree_skb(skb); | 6675 | goto drop; |
| 6676 | goto out_unlock; | ||
| 6677 | } | ||
| 6678 | 6676 | ||
| 6679 | iph = ip_hdr(skb); | 6677 | iph = ip_hdr(skb); |
| 6680 | tcp_opt_len = tcp_optlen(skb); | 6678 | tcp_opt_len = tcp_optlen(skb); |
| @@ -6746,10 +6744,9 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 6746 | len = skb_headlen(skb); | 6744 | len = skb_headlen(skb); |
| 6747 | 6745 | ||
| 6748 | mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); | 6746 | mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); |
| 6749 | if (pci_dma_mapping_error(tp->pdev, mapping)) { | 6747 | if (pci_dma_mapping_error(tp->pdev, mapping)) |
| 6750 | dev_kfree_skb(skb); | 6748 | goto drop; |
| 6751 | goto out_unlock; | 6749 | |
| 6752 | } | ||
| 6753 | 6750 | ||
| 6754 | tnapi->tx_buffers[entry].skb = skb; | 6751 | tnapi->tx_buffers[entry].skb = skb; |
| 6755 | dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping, mapping); | 6752 | dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping, mapping); |
| @@ -6805,7 +6802,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 6805 | budget = tg3_tx_avail(tnapi); | 6802 | budget = tg3_tx_avail(tnapi); |
| 6806 | if (tigon3_dma_hwbug_workaround(tnapi, &skb, &entry, &budget, | 6803 | if (tigon3_dma_hwbug_workaround(tnapi, &skb, &entry, &budget, |
| 6807 | base_flags, mss, vlan)) | 6804 | base_flags, mss, vlan)) |
| 6808 | goto out_unlock; | 6805 | goto drop_nofree; |
| 6809 | } | 6806 | } |
| 6810 | 6807 | ||
| 6811 | skb_tx_timestamp(skb); | 6808 | skb_tx_timestamp(skb); |
| @@ -6827,15 +6824,16 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 6827 | netif_tx_wake_queue(txq); | 6824 | netif_tx_wake_queue(txq); |
| 6828 | } | 6825 | } |
| 6829 | 6826 | ||
| 6830 | out_unlock: | ||
| 6831 | mmiowb(); | 6827 | mmiowb(); |
| 6832 | |||
| 6833 | return NETDEV_TX_OK; | 6828 | return NETDEV_TX_OK; |
| 6834 | 6829 | ||
| 6835 | dma_error: | 6830 | dma_error: |
| 6836 | tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, i); | 6831 | tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, i); |
| 6837 | dev_kfree_skb(skb); | ||
| 6838 | tnapi->tx_buffers[tnapi->tx_prod].skb = NULL; | 6832 | tnapi->tx_buffers[tnapi->tx_prod].skb = NULL; |
| 6833 | drop: | ||
| 6834 | dev_kfree_skb(skb); | ||
| 6835 | drop_nofree: | ||
| 6836 | tp->tx_dropped++; | ||
| 6839 | return NETDEV_TX_OK; | 6837 | return NETDEV_TX_OK; |
| 6840 | } | 6838 | } |
| 6841 | 6839 | ||
| @@ -10009,6 +10007,7 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | |||
| 10009 | get_stat64(&hw_stats->rx_discards); | 10007 | get_stat64(&hw_stats->rx_discards); |
| 10010 | 10008 | ||
| 10011 | stats->rx_dropped = tp->rx_dropped; | 10009 | stats->rx_dropped = tp->rx_dropped; |
| 10010 | stats->tx_dropped = tp->tx_dropped; | ||
| 10012 | 10011 | ||
| 10013 | return stats; | 10012 | return stats; |
| 10014 | } | 10013 | } |
diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index d2976f39b2fc..f32f288134c7 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h | |||
| @@ -2990,6 +2990,7 @@ struct tg3 { | |||
| 2990 | 2990 | ||
| 2991 | /* begin "everything else" cacheline(s) section */ | 2991 | /* begin "everything else" cacheline(s) section */ |
| 2992 | unsigned long rx_dropped; | 2992 | unsigned long rx_dropped; |
| 2993 | unsigned long tx_dropped; | ||
| 2993 | struct rtnl_link_stats64 net_stats_prev; | 2994 | struct rtnl_link_stats64 net_stats_prev; |
| 2994 | struct tg3_ethtool_stats estats; | 2995 | struct tg3_ethtool_stats estats; |
| 2995 | struct tg3_ethtool_stats estats_prev; | 2996 | struct tg3_ethtool_stats estats_prev; |
