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

Commit 5452b2df authored by Lendacky, Thomas's avatar Lendacky, Thomas Committed by David S. Miller
Browse files

amd-xgbe: Add additional stats to be reported via ethtool



Add additional/extended statistics beyond what is provided by the
hardware to be reported via ethtool. The new stats focus on the
calls into ndo_start_xmit and the napi_poll routine.

Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6eaf9d18
Loading
Loading
Loading
Loading
+9 −3
Original line number Original line Diff line number Diff line
@@ -1533,6 +1533,8 @@ static void xgbe_dev_xmit(struct xgbe_channel *channel)
				  packet->tcp_payload_len);
				  packet->tcp_payload_len);
		XGMAC_SET_BITS_LE(rdesc->desc3, TX_NORMAL_DESC3, TCPHDRLEN,
		XGMAC_SET_BITS_LE(rdesc->desc3, TX_NORMAL_DESC3, TCPHDRLEN,
				  packet->tcp_header_len / 4);
				  packet->tcp_header_len / 4);

		pdata->ext_stats.tx_tso_packets++;
	} else {
	} else {
		/* Enable CRC and Pad Insertion */
		/* Enable CRC and Pad Insertion */
		XGMAC_SET_BITS_LE(rdesc->desc3, TX_NORMAL_DESC3, CPC, 0);
		XGMAC_SET_BITS_LE(rdesc->desc3, TX_NORMAL_DESC3, CPC, 0);
@@ -1618,11 +1620,12 @@ static void xgbe_dev_xmit(struct xgbe_channel *channel)


static int xgbe_dev_read(struct xgbe_channel *channel)
static int xgbe_dev_read(struct xgbe_channel *channel)
{
{
	struct xgbe_prv_data *pdata = channel->pdata;
	struct xgbe_ring *ring = channel->rx_ring;
	struct xgbe_ring *ring = channel->rx_ring;
	struct xgbe_ring_data *rdata;
	struct xgbe_ring_data *rdata;
	struct xgbe_ring_desc *rdesc;
	struct xgbe_ring_desc *rdesc;
	struct xgbe_packet_data *packet = &ring->packet_data;
	struct xgbe_packet_data *packet = &ring->packet_data;
	struct net_device *netdev = channel->pdata->netdev;
	struct net_device *netdev = pdata->netdev;
	unsigned int err, etlt, l34t;
	unsigned int err, etlt, l34t;


	DBGPR("-->xgbe_dev_read: cur = %d\n", ring->cur);
	DBGPR("-->xgbe_dev_read: cur = %d\n", ring->cur);
@@ -1661,9 +1664,12 @@ static int xgbe_dev_read(struct xgbe_channel *channel)
			       CONTEXT_NEXT, 1);
			       CONTEXT_NEXT, 1);


	/* Get the header length */
	/* Get the header length */
	if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, FD))
	if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, FD)) {
		rdata->rx.hdr_len = XGMAC_GET_BITS_LE(rdesc->desc2,
		rdata->rx.hdr_len = XGMAC_GET_BITS_LE(rdesc->desc2,
						      RX_NORMAL_DESC2, HL);
						      RX_NORMAL_DESC2, HL);
		if (rdata->rx.hdr_len)
			pdata->ext_stats.rx_split_header_packets++;
	}


	/* Get the RSS hash */
	/* Get the RSS hash */
	if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, RSV)) {
	if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, RSV)) {
@@ -1700,7 +1706,7 @@ static int xgbe_dev_read(struct xgbe_channel *channel)
		       INCOMPLETE, 0);
		       INCOMPLETE, 0);


	/* Set checksum done indicator as appropriate */
	/* Set checksum done indicator as appropriate */
	if (channel->pdata->netdev->features & NETIF_F_RXCSUM)
	if (netdev->features & NETIF_F_RXCSUM)
		XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
		XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
			       CSUM_DONE, 1);
			       CSUM_DONE, 1);


+8 −0
Original line number Original line Diff line number Diff line
@@ -133,6 +133,12 @@ struct xgbe_stats {
	  offsetof(struct xgbe_prv_data, mmc_stats._var),	\
	  offsetof(struct xgbe_prv_data, mmc_stats._var),	\
	}
	}


#define XGMAC_EXT_STAT(_string, _var)				\
	{ _string,						\
	  FIELD_SIZEOF(struct xgbe_ext_stats, _var),		\
	  offsetof(struct xgbe_prv_data, ext_stats._var),	\
	}

static const struct xgbe_stats xgbe_gstring_stats[] = {
static const struct xgbe_stats xgbe_gstring_stats[] = {
	XGMAC_MMC_STAT("tx_bytes", txoctetcount_gb),
	XGMAC_MMC_STAT("tx_bytes", txoctetcount_gb),
	XGMAC_MMC_STAT("tx_packets", txframecount_gb),
	XGMAC_MMC_STAT("tx_packets", txframecount_gb),
@@ -140,6 +146,7 @@ static const struct xgbe_stats xgbe_gstring_stats[] = {
	XGMAC_MMC_STAT("tx_broadcast_packets", txbroadcastframes_gb),
	XGMAC_MMC_STAT("tx_broadcast_packets", txbroadcastframes_gb),
	XGMAC_MMC_STAT("tx_multicast_packets", txmulticastframes_gb),
	XGMAC_MMC_STAT("tx_multicast_packets", txmulticastframes_gb),
	XGMAC_MMC_STAT("tx_vlan_packets", txvlanframes_g),
	XGMAC_MMC_STAT("tx_vlan_packets", txvlanframes_g),
	XGMAC_EXT_STAT("tx_tso_packets", tx_tso_packets),
	XGMAC_MMC_STAT("tx_64_byte_packets", tx64octets_gb),
	XGMAC_MMC_STAT("tx_64_byte_packets", tx64octets_gb),
	XGMAC_MMC_STAT("tx_65_to_127_byte_packets", tx65to127octets_gb),
	XGMAC_MMC_STAT("tx_65_to_127_byte_packets", tx65to127octets_gb),
	XGMAC_MMC_STAT("tx_128_to_255_byte_packets", tx128to255octets_gb),
	XGMAC_MMC_STAT("tx_128_to_255_byte_packets", tx128to255octets_gb),
@@ -171,6 +178,7 @@ static const struct xgbe_stats xgbe_gstring_stats[] = {
	XGMAC_MMC_STAT("rx_fifo_overflow_errors", rxfifooverflow),
	XGMAC_MMC_STAT("rx_fifo_overflow_errors", rxfifooverflow),
	XGMAC_MMC_STAT("rx_watchdog_errors", rxwatchdogerror),
	XGMAC_MMC_STAT("rx_watchdog_errors", rxwatchdogerror),
	XGMAC_MMC_STAT("rx_pause_frames", rxpauseframes),
	XGMAC_MMC_STAT("rx_pause_frames", rxpauseframes),
	XGMAC_EXT_STAT("rx_split_header_packets", rx_split_header_packets),
};
};


#define XGBE_STATS_COUNT	ARRAY_SIZE(xgbe_gstring_stats)
#define XGBE_STATS_COUNT	ARRAY_SIZE(xgbe_gstring_stats)
+6 −0
Original line number Original line Diff line number Diff line
@@ -492,6 +492,11 @@ struct xgbe_mmc_stats {
	u64 rxwatchdogerror;
	u64 rxwatchdogerror;
};
};


struct xgbe_ext_stats {
	u64 tx_tso_packets;
	u64 rx_split_header_packets;
};

struct xgbe_hw_if {
struct xgbe_hw_if {
	int (*tx_complete)(struct xgbe_ring_desc *);
	int (*tx_complete)(struct xgbe_ring_desc *);


@@ -750,6 +755,7 @@ struct xgbe_prv_data {
	netdev_features_t netdev_features;
	netdev_features_t netdev_features;
	struct napi_struct napi;
	struct napi_struct napi;
	struct xgbe_mmc_stats mmc_stats;
	struct xgbe_mmc_stats mmc_stats;
	struct xgbe_ext_stats ext_stats;


	/* Filtering support */
	/* Filtering support */
	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];