Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48855432 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

|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: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 752961a1
Loading
Loading
Loading
Loading
+11 −12
Original line number Original line Diff line number Diff line
@@ -6671,10 +6671,8 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
		u32 tcp_opt_len, hdr_len;
		u32 tcp_opt_len, hdr_len;


		if (skb_header_cloned(skb) &&
		if (skb_header_cloned(skb) &&
		    pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
		    pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
			dev_kfree_skb(skb);
			goto drop;
			goto out_unlock;
		}


		iph = ip_hdr(skb);
		iph = ip_hdr(skb);
		tcp_opt_len = tcp_optlen(skb);
		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)
	len = skb_headlen(skb);
	len = skb_headlen(skb);


	mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
	mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
	if (pci_dma_mapping_error(tp->pdev, mapping)) {
	if (pci_dma_mapping_error(tp->pdev, mapping))
		dev_kfree_skb(skb);
		goto drop;
		goto out_unlock;

	}


	tnapi->tx_buffers[entry].skb = skb;
	tnapi->tx_buffers[entry].skb = skb;
	dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping, mapping);
	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)
		budget = tg3_tx_avail(tnapi);
		budget = tg3_tx_avail(tnapi);
		if (tigon3_dma_hwbug_workaround(tnapi, &skb, &entry, &budget,
		if (tigon3_dma_hwbug_workaround(tnapi, &skb, &entry, &budget,
						base_flags, mss, vlan))
						base_flags, mss, vlan))
			goto out_unlock;
			goto drop_nofree;
	}
	}


	skb_tx_timestamp(skb);
	skb_tx_timestamp(skb);
@@ -6827,15 +6824,16 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
			netif_tx_wake_queue(txq);
			netif_tx_wake_queue(txq);
	}
	}


out_unlock:
	mmiowb();
	mmiowb();

	return NETDEV_TX_OK;
	return NETDEV_TX_OK;


dma_error:
dma_error:
	tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, i);
	tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, i);
	dev_kfree_skb(skb);
	tnapi->tx_buffers[tnapi->tx_prod].skb = NULL;
	tnapi->tx_buffers[tnapi->tx_prod].skb = NULL;
drop:
	dev_kfree_skb(skb);
drop_nofree:
	tp->tx_dropped++;
	return NETDEV_TX_OK;
	return NETDEV_TX_OK;
}
}


@@ -10009,6 +10007,7 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
		get_stat64(&hw_stats->rx_discards);
		get_stat64(&hw_stats->rx_discards);


	stats->rx_dropped = tp->rx_dropped;
	stats->rx_dropped = tp->rx_dropped;
	stats->tx_dropped = tp->tx_dropped;


	return stats;
	return stats;
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -2990,6 +2990,7 @@ struct tg3 {


	/* begin "everything else" cacheline(s) section */
	/* begin "everything else" cacheline(s) section */
	unsigned long			rx_dropped;
	unsigned long			rx_dropped;
	unsigned long			tx_dropped;
	struct rtnl_link_stats64	net_stats_prev;
	struct rtnl_link_stats64	net_stats_prev;
	struct tg3_ethtool_stats	estats;
	struct tg3_ethtool_stats	estats;
	struct tg3_ethtool_stats	estats_prev;
	struct tg3_ethtool_stats	estats_prev;