Commit 64931534 authored by Justin Chen's avatar Justin Chen Committed by David S. Miller
Browse files

net: bcmasp: Add support for ethtool standard stats



Add support for eth_mac_stats, rmon_stats, and eth_ctrl_stats.

Signed-off-by: default avatarJustin Chen <justin.chen@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 550e6f34
Loading
Loading
Loading
Loading
+77 −0
Original line number Diff line number Diff line
@@ -250,6 +250,80 @@ static int bcmasp_set_eee(struct net_device *dev, struct ethtool_eee *e)
	return phy_ethtool_set_eee(dev->phydev, e);
}

static void bcmasp_get_eth_mac_stats(struct net_device *dev,
				     struct ethtool_eth_mac_stats *mac_stats)
{
	struct bcmasp_intf *intf = netdev_priv(dev);

	mac_stats->FramesTransmittedOK = umac_rl(intf, UMC_GTPOK);
	mac_stats->SingleCollisionFrames = umac_rl(intf, UMC_GTSCL);
	mac_stats->MultipleCollisionFrames = umac_rl(intf, UMC_GTMCL);
	mac_stats->FramesReceivedOK = umac_rl(intf, UMC_GRPOK);
	mac_stats->FrameCheckSequenceErrors = umac_rl(intf, UMC_GRFCS);
	mac_stats->AlignmentErrors = umac_rl(intf, UMC_GRALN);
	mac_stats->OctetsTransmittedOK = umac_rl(intf, UMC_GTBYT);
	mac_stats->FramesWithDeferredXmissions = umac_rl(intf, UMC_GTDRF);
	mac_stats->LateCollisions = umac_rl(intf, UMC_GTLCL);
	mac_stats->FramesAbortedDueToXSColls = umac_rl(intf, UMC_GTXCL);
	mac_stats->OctetsReceivedOK = umac_rl(intf, UMC_GRBYT);
	mac_stats->MulticastFramesXmittedOK = umac_rl(intf, UMC_GTMCA);
	mac_stats->BroadcastFramesXmittedOK = umac_rl(intf, UMC_GTBCA);
	mac_stats->FramesWithExcessiveDeferral = umac_rl(intf, UMC_GTEDF);
	mac_stats->MulticastFramesReceivedOK = umac_rl(intf, UMC_GRMCA);
	mac_stats->BroadcastFramesReceivedOK = umac_rl(intf, UMC_GRBCA);
}

static const struct ethtool_rmon_hist_range bcmasp_rmon_ranges[] = {
	{    0,   64},
	{   65,  127},
	{  128,  255},
	{  256,  511},
	{  512, 1023},
	{ 1024, 1518},
	{ 1519, 1522},
	{}
};

static void bcmasp_get_rmon_stats(struct net_device *dev,
				  struct ethtool_rmon_stats *rmon_stats,
				  const struct ethtool_rmon_hist_range **ranges)
{
	struct bcmasp_intf *intf = netdev_priv(dev);

	*ranges = bcmasp_rmon_ranges;

	rmon_stats->undersize_pkts = umac_rl(intf, UMC_RRUND);
	rmon_stats->oversize_pkts = umac_rl(intf, UMC_GROVR);
	rmon_stats->fragments = umac_rl(intf, UMC_RRFRG);
	rmon_stats->jabbers = umac_rl(intf, UMC_GRJBR);

	rmon_stats->hist[0] = umac_rl(intf, UMC_GR64);
	rmon_stats->hist[1] = umac_rl(intf, UMC_GR127);
	rmon_stats->hist[2] = umac_rl(intf, UMC_GR255);
	rmon_stats->hist[3] = umac_rl(intf, UMC_GR511);
	rmon_stats->hist[4] = umac_rl(intf, UMC_GR1023);
	rmon_stats->hist[5] = umac_rl(intf, UMC_GR1518);
	rmon_stats->hist[6] = umac_rl(intf, UMC_GRMGV);

	rmon_stats->hist_tx[0] = umac_rl(intf, UMC_TR64);
	rmon_stats->hist_tx[1] = umac_rl(intf, UMC_TR127);
	rmon_stats->hist_tx[2] = umac_rl(intf, UMC_TR255);
	rmon_stats->hist_tx[3] = umac_rl(intf, UMC_TR511);
	rmon_stats->hist_tx[4] = umac_rl(intf, UMC_TR1023);
	rmon_stats->hist_tx[5] = umac_rl(intf, UMC_TR1518);
	rmon_stats->hist_tx[6] = umac_rl(intf, UMC_TRMGV);
}

static void bcmasp_get_eth_ctrl_stats(struct net_device *dev,
				      struct ethtool_eth_ctrl_stats *ctrl_stats)
{
	struct bcmasp_intf *intf = netdev_priv(dev);

	ctrl_stats->MACControlFramesTransmitted = umac_rl(intf, UMC_GTXCF);
	ctrl_stats->MACControlFramesReceived = umac_rl(intf, UMC_GRXCF);
	ctrl_stats->UnsupportedOpcodesReceived = umac_rl(intf, UMC_GRXUO);
}

const struct ethtool_ops bcmasp_ethtool_ops = {
	.get_drvinfo		= bcmasp_get_drvinfo,
	.get_link		= ethtool_op_get_link,
@@ -263,4 +337,7 @@ const struct ethtool_ops bcmasp_ethtool_ops = {
	.set_rxnfc		= bcmasp_set_rxnfc,
	.set_eee		= bcmasp_set_eee,
	.get_eee		= bcmasp_get_eee,
	.get_eth_mac_stats	= bcmasp_get_eth_mac_stats,
	.get_rmon_stats		= bcmasp_get_rmon_stats,
	.get_eth_ctrl_stats	= bcmasp_get_eth_ctrl_stats,
};
+62 −1
Original line number Diff line number Diff line
@@ -45,7 +45,68 @@
#define  UMC_EEE_LPI_TIMER		0x68
#define  UMC_PAUSE_CNTRL		0x330
#define  UMC_TX_FLUSH			0x334
#define  UMC_MIB_START			0x400
#define  UMC_GR64			0x400
#define  UMC_GR127			0x404
#define  UMC_GR255			0x408
#define  UMC_GR511			0x40c
#define  UMC_GR1023			0x410
#define  UMC_GR1518			0x414
#define  UMC_GRMGV			0x418
#define  UMC_GR2047			0x41c
#define  UMC_GR4095			0x420
#define  UMC_GR9216			0x424
#define  UMC_GRPKT			0x428
#define  UMC_GRBYT			0x42c
#define  UMC_GRMCA			0x430
#define  UMC_GRBCA			0x434
#define  UMC_GRFCS			0x438
#define  UMC_GRXCF			0x43c
#define  UMC_GRXPF			0x440
#define  UMC_GRXUO			0x444
#define  UMC_GRALN			0x448
#define  UMC_GRFLR			0x44c
#define  UMC_GRCDE			0x450
#define  UMC_GRFCR			0x454
#define  UMC_GROVR			0x458
#define  UMC_GRJBR			0x45c
#define  UMC_GRMTUE			0x460
#define  UMC_GRPOK			0x464
#define  UMC_GRUC			0x468
#define  UMC_GRPPP			0x46c
#define  UMC_GRMCRC			0x470
#define  UMC_TR64			0x480
#define  UMC_TR127			0x484
#define  UMC_TR255			0x488
#define  UMC_TR511			0x48c
#define  UMC_TR1023			0x490
#define  UMC_TR1518			0x494
#define  UMC_TRMGV			0x498
#define  UMC_TR2047			0x49c
#define  UMC_TR4095			0x4a0
#define  UMC_TR9216			0x4a4
#define  UMC_GTPKT			0x4a8
#define  UMC_GTMCA			0x4ac
#define  UMC_GTBCA			0x4b0
#define  UMC_GTXPF			0x4b4
#define  UMC_GTXCF			0x4b8
#define  UMC_GTFCS			0x4bc
#define  UMC_GTOVR			0x4c0
#define  UMC_GTDRF			0x4c4
#define  UMC_GTEDF			0x4c8
#define  UMC_GTSCL			0x4cc
#define  UMC_GTMCL			0x4d0
#define  UMC_GTLCL			0x4d4
#define  UMC_GTXCL			0x4d8
#define  UMC_GTFRG			0x4dc
#define  UMC_GTNCL			0x4e0
#define  UMC_GTJBR			0x4e4
#define  UMC_GTBYT			0x4e8
#define  UMC_GTPOK			0x4ec
#define  UMC_GTUC			0x4f0
#define  UMC_RRPKT			0x500
#define  UMC_RRUND			0x504
#define  UMC_RRFRG			0x508
#define  UMC_RRBYT			0x50c
#define  UMC_MIB_CNTRL			0x580
#define   UMC_MIB_CNTRL_RX_CNT_RST	BIT(0)
#define   UMC_MIB_CNTRL_RUNT_CNT_RST	BIT(1)