drivers/net/ethernet/fungible/funeth/funeth_ethtool.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/fungible/funeth/funeth_ethtool.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/fungible/funeth/funeth_ethtool.c
Extension
.c
Size
33571 bytes
Lines
1189
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (fp->port_caps & FUN_PORT_CAP_STATS) {
			n += ARRAY_SIZE(mac_tx_stat_names) +
			     ARRAY_SIZE(mac_rx_stat_names);
		}
		return n;
	default:
		break;
	}
	return 0;
}

static void fun_get_strings(struct net_device *netdev, u32 sset, u8 *data)
{
	const struct funeth_priv *fp = netdev_priv(netdev);
	unsigned int i, j;
	u8 *p = data;

	switch (sset) {
	case ETH_SS_STATS:
		if (fp->port_caps & FUN_PORT_CAP_STATS) {
			memcpy(p, mac_tx_stat_names, sizeof(mac_tx_stat_names));
			p += sizeof(mac_tx_stat_names);
			memcpy(p, mac_rx_stat_names, sizeof(mac_rx_stat_names));
			p += sizeof(mac_rx_stat_names);
		}

		for (i = 0; i < netdev->real_num_tx_queues; i++) {
			for (j = 0; j < ARRAY_SIZE(txq_stat_names); j++)
				ethtool_sprintf(&p, "%s[%u]", txq_stat_names[j],
						i);
		}
		for (j = 0; j < ARRAY_SIZE(txq_stat_names); j++)
			ethtool_puts(&p, txq_stat_names[j]);

		for (i = 0; i < fp->num_xdpqs; i++) {
			for (j = 0; j < ARRAY_SIZE(xdpq_stat_names); j++)
				ethtool_sprintf(&p, "%s[%u]",
						xdpq_stat_names[j], i);
		}
		for (j = 0; j < ARRAY_SIZE(xdpq_stat_names); j++)
			ethtool_puts(&p, xdpq_stat_names[j]);

		for (i = 0; i < netdev->real_num_rx_queues; i++) {
			for (j = 0; j < ARRAY_SIZE(rxq_stat_names); j++)
				ethtool_sprintf(&p, "%s[%u]", rxq_stat_names[j],
						i);
		}
		for (j = 0; j < ARRAY_SIZE(rxq_stat_names); j++)
			ethtool_puts(&p, rxq_stat_names[j]);

		for (j = 0; j < ARRAY_SIZE(tls_stat_names); j++)
			ethtool_puts(&p, tls_stat_names[j]);
		break;
	default:
		break;
	}
}

static u64 *get_mac_stats(const struct funeth_priv *fp, u64 *data)
{
#define TX_STAT(s) \
	*data++ = be64_to_cpu(fp->stats[PORT_MAC_RX_STATS_MAX + PORT_MAC_TX_##s])

	TX_STAT(etherStatsOctets);
	TX_STAT(etherStatsPkts);
	TX_STAT(VLANTransmittedOK);
	TX_STAT(ifOutUcastPkts);
	TX_STAT(ifOutMulticastPkts);
	TX_STAT(ifOutBroadcastPkts);
	TX_STAT(ifOutErrors);
	TX_STAT(CBFCPAUSEFramesTransmitted_0);
	TX_STAT(CBFCPAUSEFramesTransmitted_1);
	TX_STAT(CBFCPAUSEFramesTransmitted_2);
	TX_STAT(CBFCPAUSEFramesTransmitted_3);
	TX_STAT(CBFCPAUSEFramesTransmitted_4);
	TX_STAT(CBFCPAUSEFramesTransmitted_5);
	TX_STAT(CBFCPAUSEFramesTransmitted_6);
	TX_STAT(CBFCPAUSEFramesTransmitted_7);
	TX_STAT(CBFCPAUSEFramesTransmitted_8);
	TX_STAT(CBFCPAUSEFramesTransmitted_9);
	TX_STAT(CBFCPAUSEFramesTransmitted_10);
	TX_STAT(CBFCPAUSEFramesTransmitted_11);
	TX_STAT(CBFCPAUSEFramesTransmitted_12);
	TX_STAT(CBFCPAUSEFramesTransmitted_13);
	TX_STAT(CBFCPAUSEFramesTransmitted_14);
	TX_STAT(CBFCPAUSEFramesTransmitted_15);

#define RX_STAT(s) *data++ = be64_to_cpu(fp->stats[PORT_MAC_RX_##s])

	RX_STAT(etherStatsOctets);

Annotation

Implementation Notes