From nobody Fri Dec 19 16:42:13 2025 Received: from out-189.mta1.migadu.com (out-189.mta1.migadu.com [95.215.58.189]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 783FA1940A1 for ; Fri, 14 Feb 2025 21:27:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.189 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739568435; cv=none; b=kYw2nuOiM0hSGYzF5YdC8JInhdnZ2jk7BdwyOrsOKdHhdqCd8dh5zj6Aof5JmP8bo6KFY7JEK0WjvWe8zPH2q/wTTnvCR7NFqpKyTwEKJ+0OWwd3rA5E5HxD56SmOJH3luRQSbORJi+GA9YGhPyF5psFEv7TbUvy19irRakSr2c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739568435; c=relaxed/simple; bh=rPRNaVxBaPYWuZr6tdQuppzRL4OSoxO+uL2qcDFAF3c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CFXCFHD2wmdPpJYs9NL8zmtY7of10rZy7sF0j9UlX/fNN0o3GR4DtwsE3AHr0bfN9aBJQrARx+9uRQ7t7uJEz7TDCyFRrbrj7hoDOjQ4yyqUZ9D9CM2WanhNriESUkKHNU6C0wk/n7CFTi3bCK/hzuXwD2emuOEO+IaO8kl3s/Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=WTPuNtqt; arc=none smtp.client-ip=95.215.58.189 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="WTPuNtqt" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1739568431; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wyd2iepNjyNFaxGpEG+1YRTZxev9qIZluSyTxS3vQlc=; b=WTPuNtqtUPTUS15X59nKe1Yihi/M5sgPI0KGnMma4NZndyCYh7FRG1+GBFEmHV8fJmaYcO dPfdaLtBo/X+SbPxht+avBu2ZKMUqTB1CVHcQW8CH9QftBSN1N3lOFRvvbjADMJUNmxAJ3 Wsdyr/dqqT3OYdz0FZZsJUCVth7nAlQ= From: Sean Anderson To: Nicolas Ferre , Claudiu Beznea , netdev@vger.kernel.org Cc: "David S . Miller" , Eric Dumazet , Andrew Lunn , Paolo Abeni , Jakub Kicinski , linux-kernel@vger.kernel.org, Sean Anderson Subject: [PATCH net-next 1/2] net: cadence: macb: Convert to get_stats64 Date: Fri, 14 Feb 2025 16:27:02 -0500 Message-Id: <20250214212703.2618652-2-sean.anderson@linux.dev> In-Reply-To: <20250214212703.2618652-1-sean.anderson@linux.dev> References: <20250214212703.2618652-1-sean.anderson@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Convert the existing get_stats implementation to get_stats64. Since we now report 64-bit values, increase the counters to 64-bits as well. Signed-off-by: Sean Anderson --- drivers/net/ethernet/cadence/macb.h | 132 +++++++++++------------ drivers/net/ethernet/cadence/macb_main.c | 34 +++--- 2 files changed, 81 insertions(+), 85 deletions(-) diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cad= ence/macb.h index 5740c98d8c9f..b4aa2b165bf3 100644 --- a/drivers/net/ethernet/cadence/macb.h +++ b/drivers/net/ethernet/cadence/macb.h @@ -951,75 +951,75 @@ struct macb_tx_skb { * device stats by a periodic timer. */ struct macb_stats { - u32 rx_pause_frames; - u32 tx_ok; - u32 tx_single_cols; - u32 tx_multiple_cols; - u32 rx_ok; - u32 rx_fcs_errors; - u32 rx_align_errors; - u32 tx_deferred; - u32 tx_late_cols; - u32 tx_excessive_cols; - u32 tx_underruns; - u32 tx_carrier_errors; - u32 rx_resource_errors; - u32 rx_overruns; - u32 rx_symbol_errors; - u32 rx_oversize_pkts; - u32 rx_jabbers; - u32 rx_undersize_pkts; - u32 sqe_test_errors; - u32 rx_length_mismatch; - u32 tx_pause_frames; + u64 rx_pause_frames; + u64 tx_ok; + u64 tx_single_cols; + u64 tx_multiple_cols; + u64 rx_ok; + u64 rx_fcs_errors; + u64 rx_align_errors; + u64 tx_deferred; + u64 tx_late_cols; + u64 tx_excessive_cols; + u64 tx_underruns; + u64 tx_carrier_errors; + u64 rx_resource_errors; + u64 rx_overruns; + u64 rx_symbol_errors; + u64 rx_oversize_pkts; + u64 rx_jabbers; + u64 rx_undersize_pkts; + u64 sqe_test_errors; + u64 rx_length_mismatch; + u64 tx_pause_frames; }; =20 struct gem_stats { - u32 tx_octets_31_0; - u32 tx_octets_47_32; - u32 tx_frames; - u32 tx_broadcast_frames; - u32 tx_multicast_frames; - u32 tx_pause_frames; - u32 tx_64_byte_frames; - u32 tx_65_127_byte_frames; - u32 tx_128_255_byte_frames; - u32 tx_256_511_byte_frames; - u32 tx_512_1023_byte_frames; - u32 tx_1024_1518_byte_frames; - u32 tx_greater_than_1518_byte_frames; - u32 tx_underrun; - u32 tx_single_collision_frames; - u32 tx_multiple_collision_frames; - u32 tx_excessive_collisions; - u32 tx_late_collisions; - u32 tx_deferred_frames; - u32 tx_carrier_sense_errors; - u32 rx_octets_31_0; - u32 rx_octets_47_32; - u32 rx_frames; - u32 rx_broadcast_frames; - u32 rx_multicast_frames; - u32 rx_pause_frames; - u32 rx_64_byte_frames; - u32 rx_65_127_byte_frames; - u32 rx_128_255_byte_frames; - u32 rx_256_511_byte_frames; - u32 rx_512_1023_byte_frames; - u32 rx_1024_1518_byte_frames; - u32 rx_greater_than_1518_byte_frames; - u32 rx_undersized_frames; - u32 rx_oversize_frames; - u32 rx_jabbers; - u32 rx_frame_check_sequence_errors; - u32 rx_length_field_frame_errors; - u32 rx_symbol_errors; - u32 rx_alignment_errors; - u32 rx_resource_errors; - u32 rx_overruns; - u32 rx_ip_header_checksum_errors; - u32 rx_tcp_checksum_errors; - u32 rx_udp_checksum_errors; + u64 tx_octets_31_0; + u64 tx_octets_47_32; + u64 tx_frames; + u64 tx_broadcast_frames; + u64 tx_multicast_frames; + u64 tx_pause_frames; + u64 tx_64_byte_frames; + u64 tx_65_127_byte_frames; + u64 tx_128_255_byte_frames; + u64 tx_256_511_byte_frames; + u64 tx_512_1023_byte_frames; + u64 tx_1024_1518_byte_frames; + u64 tx_greater_than_1518_byte_frames; + u64 tx_underrun; + u64 tx_single_collision_frames; + u64 tx_multiple_collision_frames; + u64 tx_excessive_collisions; + 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_frames; + u64 rx_broadcast_frames; + u64 rx_multicast_frames; + u64 rx_pause_frames; + u64 rx_64_byte_frames; + u64 rx_65_127_byte_frames; + u64 rx_128_255_byte_frames; + u64 rx_256_511_byte_frames; + u64 rx_512_1023_byte_frames; + u64 rx_1024_1518_byte_frames; + u64 rx_greater_than_1518_byte_frames; + u64 rx_undersized_frames; + u64 rx_oversize_frames; + u64 rx_jabbers; + u64 rx_frame_check_sequence_errors; + u64 rx_length_field_frame_errors; + u64 rx_symbol_errors; + u64 rx_alignment_errors; + u64 rx_resource_errors; + u64 rx_overruns; + u64 rx_ip_header_checksum_errors; + u64 rx_tcp_checksum_errors; + u64 rx_udp_checksum_errors; }; =20 /* Describes the name and offset of an individual statistic register, as diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/etherne= t/cadence/macb_main.c index 48496209fb16..86f0d705e354 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -990,8 +990,8 @@ static int macb_mii_init(struct macb *bp) =20 static void macb_update_stats(struct macb *bp) { - u32 *p =3D &bp->hw_stats.macb.rx_pause_frames; - u32 *end =3D &bp->hw_stats.macb.tx_pause_frames + 1; + u64 *p =3D &bp->hw_stats.macb.rx_pause_frames; + u64 *end =3D &bp->hw_stats.macb.tx_pause_frames + 1; int offset =3D MACB_PFR; =20 WARN_ON((unsigned long)(end - p - 1) !=3D (MACB_TPF - MACB_PFR) / 4); @@ -3071,7 +3071,7 @@ static void gem_update_stats(struct macb *bp) unsigned int i, q, idx; unsigned long *stat; =20 - u32 *p =3D &bp->hw_stats.gem.tx_octets_31_0; + u64 *p =3D &bp->hw_stats.gem.tx_octets_31_0; =20 for (i =3D 0; i < GEM_STATS_LEN; ++i, ++p) { u32 offset =3D gem_statistics[i].offset; @@ -3094,15 +3094,12 @@ static void gem_update_stats(struct macb *bp) bp->ethtool_stats[idx++] =3D *stat; } =20 -static struct net_device_stats *gem_get_stats(struct macb *bp) +static void gem_get_stats(struct macb *bp, struct rtnl_link_stats64 *nstat) { struct gem_stats *hwstat =3D &bp->hw_stats.gem; - struct net_device_stats *nstat =3D &bp->dev->stats; =20 - if (!netif_running(bp->dev)) - return nstat; - - gem_update_stats(bp); + if (netif_running(bp->dev)) + gem_update_stats(bp); =20 nstat->rx_errors =3D (hwstat->rx_frame_check_sequence_errors + hwstat->rx_alignment_errors + @@ -3131,8 +3128,6 @@ static struct net_device_stats *gem_get_stats(struct = macb *bp) nstat->tx_aborted_errors =3D hwstat->tx_excessive_collisions; nstat->tx_carrier_errors =3D hwstat->tx_carrier_sense_errors; nstat->tx_fifo_errors =3D hwstat->tx_underrun; - - return nstat; } =20 static void gem_get_ethtool_stats(struct net_device *dev, @@ -3183,14 +3178,17 @@ static void gem_get_ethtool_strings(struct net_devi= ce *dev, u32 sset, u8 *p) } } =20 -static struct net_device_stats *macb_get_stats(struct net_device *dev) +static void macb_get_stats(struct net_device *dev, + struct rtnl_link_stats64 *nstat) { struct macb *bp =3D netdev_priv(dev); - struct net_device_stats *nstat =3D &bp->dev->stats; struct macb_stats *hwstat =3D &bp->hw_stats.macb; =20 - if (macb_is_gem(bp)) - return gem_get_stats(bp); + netdev_stats_to_stats64(nstat, &bp->dev->stats); + if (macb_is_gem(bp)) { + gem_get_stats(bp, nstat); + return; + } =20 /* read stats from hardware */ macb_update_stats(bp); @@ -3226,8 +3224,6 @@ static struct net_device_stats *macb_get_stats(struct= net_device *dev) nstat->tx_carrier_errors =3D hwstat->tx_carrier_errors; nstat->tx_fifo_errors =3D hwstat->tx_underruns; /* Don't know about heartbeat or window errors... */ - - return nstat; } =20 static int macb_get_regs_len(struct net_device *netdev) @@ -3910,7 +3906,7 @@ static const struct net_device_ops macb_netdev_ops = =3D { .ndo_stop =3D macb_close, .ndo_start_xmit =3D macb_start_xmit, .ndo_set_rx_mode =3D macb_set_rx_mode, - .ndo_get_stats =3D macb_get_stats, + .ndo_get_stats64 =3D macb_get_stats, .ndo_eth_ioctl =3D macb_ioctl, .ndo_validate_addr =3D eth_validate_addr, .ndo_change_mtu =3D macb_change_mtu, @@ -4571,7 +4567,7 @@ static const struct net_device_ops at91ether_netdev_o= ps =3D { .ndo_open =3D at91ether_open, .ndo_stop =3D at91ether_close, .ndo_start_xmit =3D at91ether_start_xmit, - .ndo_get_stats =3D macb_get_stats, + .ndo_get_stats64 =3D macb_get_stats, .ndo_set_rx_mode =3D macb_set_rx_mode, .ndo_set_mac_address =3D eth_mac_addr, .ndo_eth_ioctl =3D macb_ioctl, --=20 2.35.1.1320.gc452695387.dirty From nobody Fri Dec 19 16:42:13 2025 Received: from out-171.mta1.migadu.com (out-171.mta1.migadu.com [95.215.58.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C3181DACA1 for ; Fri, 14 Feb 2025 21:27:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739568437; cv=none; b=VQjVWyvOfMYM2sahq1qeOI1lTsbWXOuU+u/5PTVqK0HTBfbJqV9m0/+j4+Sqb1I6dRLyI50eVZs1DqtFRPlhFVWpZMtOJimcKfGJ1ti4cdpy3rK1tHLt+sAX2TBN45eDG/Toa0qRJDcn8jSKq3EyzPoyB7rDqRNQ7TbuOZoU4Gk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739568437; c=relaxed/simple; bh=hCzyfzUROt4a9mkKV0lKDC394459bcSKy8q3FqL8Sdw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Kjr4pJO6zJBN23WB0l8kUuNBQ+f0y/hVVO1Dmg5B+/M6rAoKXLtb5x+Rpmd/Kj7RvrqyCiR3HMHwe09WjIt5kW3SrV6H2px1u8UW5K4/4Rppg0VQcD0uievJXp66lIlps8+LB2+A7Hn/aeobe7nVSpLi6azg/PTRJIJ+jC+Hx0M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=jLWZ4b5I; arc=none smtp.client-ip=95.215.58.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="jLWZ4b5I" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1739568433; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jgusWkP0+qXEvqupBIggvyxEHsHYn2aCO8MEKD61Ll0=; b=jLWZ4b5IgGpxIr02EJIYz214CpKqE7E7aW1ydQIC9JwzUOIjmKglR/xeellRJl1cxjegOH svsGYM6euCNDrgw7qnwsgVjI2dlpIHSpwiDfD8U83HXhYF/FD0idcUK2I8+AHgWDCG/q5v aCAzbFu428b1RNGR4OjW1QZ7v9+Mq4A= From: Sean Anderson To: Nicolas Ferre , Claudiu Beznea , netdev@vger.kernel.org Cc: "David S . Miller" , Eric Dumazet , Andrew Lunn , Paolo Abeni , Jakub Kicinski , linux-kernel@vger.kernel.org, Sean Anderson Subject: [PATCH net-next 2/2] net: cadence: macb: Report standard stats Date: Fri, 14 Feb 2025 16:27:03 -0500 Message-Id: <20250214212703.2618652-3-sean.anderson@linux.dev> In-Reply-To: <20250214212703.2618652-1-sean.anderson@linux.dev> References: <20250214212703.2618652-1-sean.anderson@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" 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 --- drivers/net/ethernet/cadence/macb.h | 6 +- drivers/net/ethernet/cadence/macb_main.c | 160 ++++++++++++++++++++++- 2 files changed, 160 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cad= ence/macb.h index b4aa2b165bf3..f69b2b7c8802 100644 --- a/drivers/net/ethernet/cadence/macb.h +++ b/drivers/net/ethernet/cadence/macb.h @@ -975,8 +975,7 @@ struct macb_stats { }; =20 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; diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/etherne= t/cadence/macb_main.c index 86f0d705e354..4878c14121fb 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -3071,7 +3071,7 @@ static void gem_update_stats(struct macb *bp) unsigned int i, q, idx; unsigned long *stat; =20 - u64 *p =3D &bp->hw_stats.gem.tx_octets_31_0; + u64 *p =3D &bp->hw_stats.gem.tx_octets; =20 for (i =3D 0; i < GEM_STATS_LEN; ++i, ++p) { u32 offset =3D gem_statistics[i].offset; @@ -3084,7 +3084,7 @@ static void gem_update_stats(struct macb *bp) /* Add GEM_OCTTXH, GEM_OCTRXH */ val =3D bp->macb_reg_readl(bp, offset + 4); bp->ethtool_stats[i] +=3D ((u64)val) << 32; - *(++p) +=3D val; + *(p++) +=3D ((u64)val) << 32; } } =20 @@ -3226,6 +3226,154 @@ static void macb_get_stats(struct net_device *dev, /* Don't know about heartbeat or window errors... */ } =20 +static void macb_get_pause_stats(struct net_device *dev, + struct ethtool_pause_stats *pause_stats) +{ + struct macb *bp =3D netdev_priv(dev); + struct macb_stats *hwstat =3D &bp->hw_stats.macb; + + macb_update_stats(bp); + pause_stats->tx_pause_frames =3D hwstat->tx_pause_frames; + pause_stats->rx_pause_frames =3D hwstat->rx_pause_frames; +} + +static void gem_get_pause_stats(struct net_device *dev, + struct ethtool_pause_stats *pause_stats) +{ + struct macb *bp =3D netdev_priv(dev); + struct gem_stats *hwstat =3D &bp->hw_stats.gem; + + gem_update_stats(bp); + pause_stats->tx_pause_frames =3D hwstat->tx_pause_frames; + pause_stats->rx_pause_frames =3D 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 =3D netdev_priv(dev); + struct macb_stats *hwstat =3D &bp->hw_stats.macb; + + macb_update_stats(bp); + mac_stats->FramesTransmittedOK =3D hwstat->tx_ok; + mac_stats->SingleCollisionFrames =3D hwstat->tx_single_cols; + mac_stats->MultipleCollisionFrames =3D hwstat->tx_multiple_cols; + mac_stats->FramesReceivedOK =3D hwstat->rx_ok; + mac_stats->FrameCheckSequenceErrors =3D hwstat->rx_fcs_errors; + mac_stats->AlignmentErrors =3D hwstat->rx_align_errors; + mac_stats->FramesWithDeferredXmissions =3D hwstat->tx_deferred; + mac_stats->LateCollisions =3D hwstat->tx_late_cols; + mac_stats->FramesAbortedDueToXSColls =3D hwstat->tx_excessive_cols; + mac_stats->FramesLostDueToIntMACXmitError =3D hwstat->tx_underruns; + mac_stats->CarrierSenseErrors =3D hwstat->tx_carrier_errors; + mac_stats->FramesLostDueToIntMACRcvError =3D hwstat->rx_overruns; + mac_stats->InRangeLengthErrors =3D hwstat->rx_length_mismatch; + mac_stats->FrameTooLongErrors =3D 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 =3D netdev_priv(dev); + struct gem_stats *hwstat =3D &bp->hw_stats.gem; + + gem_update_stats(bp); + mac_stats->FramesTransmittedOK =3D hwstat->tx_frames; + mac_stats->SingleCollisionFrames =3D hwstat->tx_single_collision_frames; + mac_stats->MultipleCollisionFrames =3D + hwstat->tx_multiple_collision_frames; + mac_stats->FramesReceivedOK =3D hwstat->rx_frames; + mac_stats->FrameCheckSequenceErrors =3D + hwstat->rx_frame_check_sequence_errors; + mac_stats->AlignmentErrors =3D hwstat->rx_alignment_errors; + mac_stats->OctetsTransmittedOK =3D hwstat->tx_octets; + mac_stats->FramesWithDeferredXmissions =3D hwstat->tx_deferred_frames; + mac_stats->LateCollisions =3D hwstat->tx_late_collisions; + mac_stats->FramesAbortedDueToXSColls =3D hwstat->tx_excessive_collisions; + mac_stats->FramesLostDueToIntMACXmitError =3D hwstat->tx_underrun; + mac_stats->CarrierSenseErrors =3D hwstat->tx_carrier_sense_errors; + mac_stats->OctetsReceivedOK =3D hwstat->rx_octets; + mac_stats->MulticastFramesXmittedOK =3D hwstat->tx_multicast_frames; + mac_stats->BroadcastFramesXmittedOK =3D hwstat->tx_broadcast_frames; + mac_stats->MulticastFramesReceivedOK =3D hwstat->rx_multicast_frames; + mac_stats->BroadcastFramesReceivedOK =3D hwstat->rx_broadcast_frames; + mac_stats->InRangeLengthErrors =3D hwstat->rx_length_field_frame_errors; + mac_stats->FrameTooLongErrors =3D 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 =3D netdev_priv(dev); + struct macb_stats *hwstat =3D &bp->hw_stats.macb; + + macb_update_stats(bp); + phy_stats->SymbolErrorDuringCarrier =3D 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 =3D netdev_priv(dev); + struct gem_stats *hwstat =3D &bp->hw_stats.gem; + + gem_update_stats(bp); + phy_stats->SymbolErrorDuringCarrier =3D 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 =3D netdev_priv(dev); + struct macb_stats *hwstat =3D &bp->hw_stats.macb; + + macb_update_stats(bp); + rmon_stats->undersize_pkts =3D hwstat->rx_undersize_pkts; + rmon_stats->oversize_pkts =3D hwstat->rx_oversize_pkts; + rmon_stats->jabbers =3D hwstat->rx_jabbers; +} + +static const struct ethtool_rmon_hist_range gem_rmon_ranges[] =3D { + { 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 =3D netdev_priv(dev); + struct gem_stats *hwstat =3D &bp->hw_stats.gem; + + gem_update_stats(bp); + rmon_stats->undersize_pkts =3D hwstat->rx_undersized_frames; + rmon_stats->oversize_pkts =3D hwstat->rx_oversize_frames; + rmon_stats->jabbers =3D hwstat->rx_jabbers; + rmon_stats->hist[0] =3D hwstat->rx_64_byte_frames; + rmon_stats->hist[1] =3D hwstat->rx_65_127_byte_frames; + rmon_stats->hist[2] =3D hwstat->rx_128_255_byte_frames; + rmon_stats->hist[3] =3D hwstat->rx_256_511_byte_frames; + rmon_stats->hist[4] =3D hwstat->rx_512_1023_byte_frames; + rmon_stats->hist[5] =3D hwstat->rx_1024_1518_byte_frames; + rmon_stats->hist[6] =3D hwstat->rx_greater_than_1518_byte_frames; + rmon_stats->hist_tx[0] =3D hwstat->tx_64_byte_frames; + rmon_stats->hist_tx[1] =3D hwstat->tx_65_127_byte_frames; + rmon_stats->hist_tx[2] =3D hwstat->tx_128_255_byte_frames; + rmon_stats->hist_tx[3] =3D hwstat->tx_256_511_byte_frames; + rmon_stats->hist_tx[4] =3D hwstat->tx_512_1023_byte_frames; + rmon_stats->hist_tx[5] =3D hwstat->tx_1024_1518_byte_frames; + rmon_stats->hist_tx[6] =3D hwstat->tx_greater_than_1518_byte_frames; + *ranges =3D gem_rmon_ranges; +} + static int macb_get_regs_len(struct net_device *netdev) { return MACB_GREGS_NBR * sizeof(u32); @@ -3752,6 +3900,10 @@ static const struct ethtool_ops macb_ethtool_ops =3D= { .get_regs =3D macb_get_regs, .get_link =3D ethtool_op_get_link, .get_ts_info =3D ethtool_op_get_ts_info, + .get_pause_stats =3D macb_get_pause_stats, + .get_eth_mac_stats =3D macb_get_eth_mac_stats, + .get_eth_phy_stats =3D macb_get_eth_phy_stats, + .get_rmon_stats =3D macb_get_rmon_stats, .get_wol =3D macb_get_wol, .set_wol =3D macb_set_wol, .get_link_ksettings =3D macb_get_link_ksettings, @@ -3770,6 +3922,10 @@ static const struct ethtool_ops gem_ethtool_ops =3D { .get_ethtool_stats =3D gem_get_ethtool_stats, .get_strings =3D gem_get_ethtool_strings, .get_sset_count =3D gem_get_sset_count, + .get_pause_stats =3D gem_get_pause_stats, + .get_eth_mac_stats =3D gem_get_eth_mac_stats, + .get_eth_phy_stats =3D gem_get_eth_phy_stats, + .get_rmon_stats =3D gem_get_rmon_stats, .get_link_ksettings =3D macb_get_link_ksettings, .set_link_ksettings =3D macb_set_link_ksettings, .get_ringparam =3D macb_get_ringparam, --=20 2.35.1.1320.gc452695387.dirty