mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-03 17:51:23 +00:00
net: cadence: macb: Report standard stats
Report standard statistics using the dedicated callbacks instead of get_ethtool_stats. OCTTX is split over two registers. Accumulating these registers separately in gem_stats just means we need to combine them again later. Instead, combine these stats before saving them, like is done for ethtool_stats. Signed-off-by: Sean Anderson <sean.anderson@linux.dev> Link: https://patch.msgid.link/20250214212703.2618652-3-sean.anderson@linux.dev Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
75696dd0fd
commit
f6af690a29
@ -975,8 +975,7 @@ struct macb_stats {
|
||||
};
|
||||
|
||||
struct gem_stats {
|
||||
u64 tx_octets_31_0;
|
||||
u64 tx_octets_47_32;
|
||||
u64 tx_octets;
|
||||
u64 tx_frames;
|
||||
u64 tx_broadcast_frames;
|
||||
u64 tx_multicast_frames;
|
||||
@ -995,8 +994,7 @@ struct gem_stats {
|
||||
u64 tx_late_collisions;
|
||||
u64 tx_deferred_frames;
|
||||
u64 tx_carrier_sense_errors;
|
||||
u64 rx_octets_31_0;
|
||||
u64 rx_octets_47_32;
|
||||
u64 rx_octets;
|
||||
u64 rx_frames;
|
||||
u64 rx_broadcast_frames;
|
||||
u64 rx_multicast_frames;
|
||||
|
@ -3069,7 +3069,7 @@ static void gem_update_stats(struct macb *bp)
|
||||
unsigned int i, q, idx;
|
||||
unsigned long *stat;
|
||||
|
||||
u64 *p = &bp->hw_stats.gem.tx_octets_31_0;
|
||||
u64 *p = &bp->hw_stats.gem.tx_octets;
|
||||
|
||||
for (i = 0; i < GEM_STATS_LEN; ++i, ++p) {
|
||||
u32 offset = gem_statistics[i].offset;
|
||||
@ -3082,7 +3082,7 @@ static void gem_update_stats(struct macb *bp)
|
||||
/* Add GEM_OCTTXH, GEM_OCTRXH */
|
||||
val = bp->macb_reg_readl(bp, offset + 4);
|
||||
bp->ethtool_stats[i] += ((u64)val) << 32;
|
||||
*(++p) += val;
|
||||
*(p++) += ((u64)val) << 32;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3224,6 +3224,154 @@ static void macb_get_stats(struct net_device *dev,
|
||||
/* Don't know about heartbeat or window errors... */
|
||||
}
|
||||
|
||||
static void macb_get_pause_stats(struct net_device *dev,
|
||||
struct ethtool_pause_stats *pause_stats)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
struct macb_stats *hwstat = &bp->hw_stats.macb;
|
||||
|
||||
macb_update_stats(bp);
|
||||
pause_stats->tx_pause_frames = hwstat->tx_pause_frames;
|
||||
pause_stats->rx_pause_frames = hwstat->rx_pause_frames;
|
||||
}
|
||||
|
||||
static void gem_get_pause_stats(struct net_device *dev,
|
||||
struct ethtool_pause_stats *pause_stats)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
struct gem_stats *hwstat = &bp->hw_stats.gem;
|
||||
|
||||
gem_update_stats(bp);
|
||||
pause_stats->tx_pause_frames = hwstat->tx_pause_frames;
|
||||
pause_stats->rx_pause_frames = hwstat->rx_pause_frames;
|
||||
}
|
||||
|
||||
static void macb_get_eth_mac_stats(struct net_device *dev,
|
||||
struct ethtool_eth_mac_stats *mac_stats)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
struct macb_stats *hwstat = &bp->hw_stats.macb;
|
||||
|
||||
macb_update_stats(bp);
|
||||
mac_stats->FramesTransmittedOK = hwstat->tx_ok;
|
||||
mac_stats->SingleCollisionFrames = hwstat->tx_single_cols;
|
||||
mac_stats->MultipleCollisionFrames = hwstat->tx_multiple_cols;
|
||||
mac_stats->FramesReceivedOK = hwstat->rx_ok;
|
||||
mac_stats->FrameCheckSequenceErrors = hwstat->rx_fcs_errors;
|
||||
mac_stats->AlignmentErrors = hwstat->rx_align_errors;
|
||||
mac_stats->FramesWithDeferredXmissions = hwstat->tx_deferred;
|
||||
mac_stats->LateCollisions = hwstat->tx_late_cols;
|
||||
mac_stats->FramesAbortedDueToXSColls = hwstat->tx_excessive_cols;
|
||||
mac_stats->FramesLostDueToIntMACXmitError = hwstat->tx_underruns;
|
||||
mac_stats->CarrierSenseErrors = hwstat->tx_carrier_errors;
|
||||
mac_stats->FramesLostDueToIntMACRcvError = hwstat->rx_overruns;
|
||||
mac_stats->InRangeLengthErrors = hwstat->rx_length_mismatch;
|
||||
mac_stats->FrameTooLongErrors = hwstat->rx_oversize_pkts;
|
||||
}
|
||||
|
||||
static void gem_get_eth_mac_stats(struct net_device *dev,
|
||||
struct ethtool_eth_mac_stats *mac_stats)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
struct gem_stats *hwstat = &bp->hw_stats.gem;
|
||||
|
||||
gem_update_stats(bp);
|
||||
mac_stats->FramesTransmittedOK = hwstat->tx_frames;
|
||||
mac_stats->SingleCollisionFrames = hwstat->tx_single_collision_frames;
|
||||
mac_stats->MultipleCollisionFrames =
|
||||
hwstat->tx_multiple_collision_frames;
|
||||
mac_stats->FramesReceivedOK = hwstat->rx_frames;
|
||||
mac_stats->FrameCheckSequenceErrors =
|
||||
hwstat->rx_frame_check_sequence_errors;
|
||||
mac_stats->AlignmentErrors = hwstat->rx_alignment_errors;
|
||||
mac_stats->OctetsTransmittedOK = hwstat->tx_octets;
|
||||
mac_stats->FramesWithDeferredXmissions = hwstat->tx_deferred_frames;
|
||||
mac_stats->LateCollisions = hwstat->tx_late_collisions;
|
||||
mac_stats->FramesAbortedDueToXSColls = hwstat->tx_excessive_collisions;
|
||||
mac_stats->FramesLostDueToIntMACXmitError = hwstat->tx_underrun;
|
||||
mac_stats->CarrierSenseErrors = hwstat->tx_carrier_sense_errors;
|
||||
mac_stats->OctetsReceivedOK = hwstat->rx_octets;
|
||||
mac_stats->MulticastFramesXmittedOK = hwstat->tx_multicast_frames;
|
||||
mac_stats->BroadcastFramesXmittedOK = hwstat->tx_broadcast_frames;
|
||||
mac_stats->MulticastFramesReceivedOK = hwstat->rx_multicast_frames;
|
||||
mac_stats->BroadcastFramesReceivedOK = hwstat->rx_broadcast_frames;
|
||||
mac_stats->InRangeLengthErrors = hwstat->rx_length_field_frame_errors;
|
||||
mac_stats->FrameTooLongErrors = hwstat->rx_oversize_frames;
|
||||
}
|
||||
|
||||
/* TODO: Report SQE test errors when added to phy_stats */
|
||||
static void macb_get_eth_phy_stats(struct net_device *dev,
|
||||
struct ethtool_eth_phy_stats *phy_stats)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
struct macb_stats *hwstat = &bp->hw_stats.macb;
|
||||
|
||||
macb_update_stats(bp);
|
||||
phy_stats->SymbolErrorDuringCarrier = hwstat->rx_symbol_errors;
|
||||
}
|
||||
|
||||
static void gem_get_eth_phy_stats(struct net_device *dev,
|
||||
struct ethtool_eth_phy_stats *phy_stats)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
struct gem_stats *hwstat = &bp->hw_stats.gem;
|
||||
|
||||
gem_update_stats(bp);
|
||||
phy_stats->SymbolErrorDuringCarrier = hwstat->rx_symbol_errors;
|
||||
}
|
||||
|
||||
static void macb_get_rmon_stats(struct net_device *dev,
|
||||
struct ethtool_rmon_stats *rmon_stats,
|
||||
const struct ethtool_rmon_hist_range **ranges)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
struct macb_stats *hwstat = &bp->hw_stats.macb;
|
||||
|
||||
macb_update_stats(bp);
|
||||
rmon_stats->undersize_pkts = hwstat->rx_undersize_pkts;
|
||||
rmon_stats->oversize_pkts = hwstat->rx_oversize_pkts;
|
||||
rmon_stats->jabbers = hwstat->rx_jabbers;
|
||||
}
|
||||
|
||||
static const struct ethtool_rmon_hist_range gem_rmon_ranges[] = {
|
||||
{ 64, 64 },
|
||||
{ 65, 127 },
|
||||
{ 128, 255 },
|
||||
{ 256, 511 },
|
||||
{ 512, 1023 },
|
||||
{ 1024, 1518 },
|
||||
{ 1519, 16384 },
|
||||
{ },
|
||||
};
|
||||
|
||||
static void gem_get_rmon_stats(struct net_device *dev,
|
||||
struct ethtool_rmon_stats *rmon_stats,
|
||||
const struct ethtool_rmon_hist_range **ranges)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
struct gem_stats *hwstat = &bp->hw_stats.gem;
|
||||
|
||||
gem_update_stats(bp);
|
||||
rmon_stats->undersize_pkts = hwstat->rx_undersized_frames;
|
||||
rmon_stats->oversize_pkts = hwstat->rx_oversize_frames;
|
||||
rmon_stats->jabbers = hwstat->rx_jabbers;
|
||||
rmon_stats->hist[0] = hwstat->rx_64_byte_frames;
|
||||
rmon_stats->hist[1] = hwstat->rx_65_127_byte_frames;
|
||||
rmon_stats->hist[2] = hwstat->rx_128_255_byte_frames;
|
||||
rmon_stats->hist[3] = hwstat->rx_256_511_byte_frames;
|
||||
rmon_stats->hist[4] = hwstat->rx_512_1023_byte_frames;
|
||||
rmon_stats->hist[5] = hwstat->rx_1024_1518_byte_frames;
|
||||
rmon_stats->hist[6] = hwstat->rx_greater_than_1518_byte_frames;
|
||||
rmon_stats->hist_tx[0] = hwstat->tx_64_byte_frames;
|
||||
rmon_stats->hist_tx[1] = hwstat->tx_65_127_byte_frames;
|
||||
rmon_stats->hist_tx[2] = hwstat->tx_128_255_byte_frames;
|
||||
rmon_stats->hist_tx[3] = hwstat->tx_256_511_byte_frames;
|
||||
rmon_stats->hist_tx[4] = hwstat->tx_512_1023_byte_frames;
|
||||
rmon_stats->hist_tx[5] = hwstat->tx_1024_1518_byte_frames;
|
||||
rmon_stats->hist_tx[6] = hwstat->tx_greater_than_1518_byte_frames;
|
||||
*ranges = gem_rmon_ranges;
|
||||
}
|
||||
|
||||
static int macb_get_regs_len(struct net_device *netdev)
|
||||
{
|
||||
return MACB_GREGS_NBR * sizeof(u32);
|
||||
@ -3750,6 +3898,10 @@ static const struct ethtool_ops macb_ethtool_ops = {
|
||||
.get_regs = macb_get_regs,
|
||||
.get_link = ethtool_op_get_link,
|
||||
.get_ts_info = ethtool_op_get_ts_info,
|
||||
.get_pause_stats = macb_get_pause_stats,
|
||||
.get_eth_mac_stats = macb_get_eth_mac_stats,
|
||||
.get_eth_phy_stats = macb_get_eth_phy_stats,
|
||||
.get_rmon_stats = macb_get_rmon_stats,
|
||||
.get_wol = macb_get_wol,
|
||||
.set_wol = macb_set_wol,
|
||||
.get_link_ksettings = macb_get_link_ksettings,
|
||||
@ -3768,6 +3920,10 @@ static const struct ethtool_ops gem_ethtool_ops = {
|
||||
.get_ethtool_stats = gem_get_ethtool_stats,
|
||||
.get_strings = gem_get_ethtool_strings,
|
||||
.get_sset_count = gem_get_sset_count,
|
||||
.get_pause_stats = gem_get_pause_stats,
|
||||
.get_eth_mac_stats = gem_get_eth_mac_stats,
|
||||
.get_eth_phy_stats = gem_get_eth_phy_stats,
|
||||
.get_rmon_stats = gem_get_rmon_stats,
|
||||
.get_link_ksettings = macb_get_link_ksettings,
|
||||
.set_link_ksettings = macb_set_link_ksettings,
|
||||
.get_ringparam = macb_get_ringparam,
|
||||
|
Loading…
Reference in New Issue
Block a user