From nobody Sat Feb 7 12:35:09 2026 Received: from mail-ej1-f50.google.com (mail-ej1-f50.google.com [209.85.218.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 11E8B255E2B; Tue, 13 May 2025 14:41:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747147305; cv=none; b=O/FfxvFBCDbDvD9XoWSXJhlDQ6HvcFf+SET1qZwvCM3/S2jVHYI+5bVErF5qg+QXKeWf71FGRsveqOzzEp5g88pngVfajWqn+J646d945XyWbXFWrBZB4537AiN3u/Q3vQ4dv2tBEAOSs0oAz3/p1+wdFUZ41rzHX9y9QRZ6H/Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747147305; c=relaxed/simple; bh=lXIupedkAwdhkbPaYwqYzVsmNDKrY17anDrGj9I0iVs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=keCGyE5k7PMB4JHI2ilkJT8rgRo6ktOV7AOcdBw5S8L8e+qcnL4ZaJNvGSlLgqJh8Lp/KyWFi/G8h/x5rLf/KsDd0H4CGbZRV5HTRencOymc6WE11jZ0k+n6MDZ22zfer6XPjLZlO/0hnUoTCOyL8rj0KM8qfJELaUe9cU0Ohys= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=MSszfGQs; arc=none smtp.client-ip=209.85.218.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="MSszfGQs" Received: by mail-ej1-f50.google.com with SMTP id a640c23a62f3a-ad220f139adso741261766b.1; Tue, 13 May 2025 07:41:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747147301; x=1747752101; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hXKdZ1JxtICE+bq1htmlKHTvOuap/JS5mHr73NItHeU=; b=MSszfGQs1pWC7kaIfeG70QKWBMwBKo0iS8gY1yGI+QLTKP12xDhQic1AaLd3pSuE1f X/7Efd4viAFP263dIrUkn/80LuIeLIRebcSHEQuBa1ctDRV3KP0Vgu4gRm7Zeqbg1AOi WelaM7r8eOyvQlQqFizN46h+ckXVweetc1txj1RB/yHzGPZZWMkFf2mb8M4tbX0yXGxp lG6Vt17id2okiFSl44i+z/9RvWSoKzPLTVKZMAxRO8FOyauQvgSwm3CP34/MIE7XIPh9 cFon4Z2/zgaeKaeZEPZFRiZ6zo7r3761gGv6XNBg3Zy2yN8uiy1TZYgIog9GwL1nRxfw zeVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747147301; x=1747752101; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hXKdZ1JxtICE+bq1htmlKHTvOuap/JS5mHr73NItHeU=; b=ahPj6BpZ27p+KoA7eWH5vQt0muQxzj5/fMwBMtjewF0I51Qy2W/mK5MnibnW6fw/bu +Ip8UvKYlJaIwlblHsinYRWsbS3PJUZryl7b1MFRDxGoxNpJYeDtkYM/ONXsP1qRRbsV F7Qe9edGumOhNWEqt0wzP6Rmmek6PaNAGJ1wJl9vFKelPNg34FYzDMc8n+tUecq1/Iju Z4epNtV6EVZ1s1qewIQfRanDwV4kRuuU4s6ftiAtpfCWFX7g6j3xs1S60mNEpICc4jD5 F2eGrMlTsBd6vVS13eLSomlFwMsxDE/O/4beLiHnjD4JPQE2fXIWfigB56DpyCj0JnHn AHyw== X-Forwarded-Encrypted: i=1; AJvYcCV6qrBrsyaOzJD+C1opbK3HQpRI2FiaQBmWJh67SxDa5xwTt4pYkVUUAC2MWVWG9PBjZkKNQF7BUj7uLw0=@vger.kernel.org, AJvYcCWORYxbGe1x8stQNp6tLlC1UUF9PYQMXUfEm40gt3/rjti4CzeJd4wYjWs8U9CbDTooxMe/toJs@vger.kernel.org X-Gm-Message-State: AOJu0YxWCqbmvLYiUrJu4GBH1/nOlL6a0mHjP6o+w21qnwOlsuoN8WB8 nybxVkePeBXOEzqfD6LfzjRCkW7NRKrq/Zy9cE+VMIyX5DpklF48 X-Gm-Gg: ASbGnctS7OxTv3mayc/bcKs25IwExqap7d1L9o+VGAWqqvguerH3CqP4obdsKFxeyHS SajVAhUqjlBaHN33lZiDYXGl9Gnf2qE6srxRLCLpp+7f4hGWg74mT8427gRmlmeDkwdDEC/Qcxg RNutaFTZJOwYg1Glwd7U3kuNlyPGd5xPIrUUORKAP3H4L0GVopyZP9lMJQnXYlibKXKRz4Qj5Wk /30DPs941yHv8oYgWLPzC1WepUQ2Fry63htkqQwOVzdfuS/55H94hV87mp9C15QXULecs04VBD3 tiV4Pr2cOJUHO6fOfiefoiRQXFiDPSYz0Sx3YHcxEBbI1XyM8kgxpVwY6flhPQ2Wzhzia+xe X-Google-Smtp-Source: AGHT+IFzOSoEeWGRpOJcsgbqmkbs930+bArl4UCx4aMPEHw0rGrtM9LCebcTTf+fTyjHXghr7XJLQw== X-Received: by 2002:a17:906:7309:b0:ad2:4b33:ae67 with SMTP id a640c23a62f3a-ad24b33b891mr938462866b.4.1747147300871; Tue, 13 May 2025 07:41:40 -0700 (PDT) Received: from debian-vm.localnet ([2a01:4b00:d20c:cddd:20c:29ff:fe56:c86]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fc9d700e56sm7301556a12.57.2025.05.13.07.41.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 07:41:40 -0700 (PDT) From: Zak Kemble To: Doug Berger , Florian Fainelli , Broadcom internal kernel review list , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Zak Kemble Subject: [PATCH 1/3] net: bcmgenet: switch to use 64bit statistics Date: Tue, 13 May 2025 15:41:05 +0100 Message-Id: <20250513144107.1989-2-zakkemble@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250513144107.1989-1-zakkemble@gmail.com> References: <20250513144107.1989-1-zakkemble@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Update the driver to use ndo_get_stats64, rtnl_link_stats64 and u64_stats_t counters for statistics. Signed-off-by: Zak Kemble --- .../net/ethernet/broadcom/genet/bcmgenet.c | 235 ++++++++++++------ .../net/ethernet/broadcom/genet/bcmgenet.h | 32 ++- 2 files changed, 186 insertions(+), 81 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/e= thernet/broadcom/genet/bcmgenet.c index 73d78dcb7..80ef973e1 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -969,12 +969,13 @@ static int bcmgenet_set_pauseparam(struct net_device = *dev, =20 /* standard ethtool support functions. */ enum bcmgenet_stat_type { - BCMGENET_STAT_NETDEV =3D -1, + BCMGENET_STAT_RTNL =3D -1, BCMGENET_STAT_MIB_RX, BCMGENET_STAT_MIB_TX, BCMGENET_STAT_RUNT, BCMGENET_STAT_MISC, BCMGENET_STAT_SOFT, + BCMGENET_STAT_SOFT64, }; =20 struct bcmgenet_stats { @@ -984,13 +985,15 @@ struct bcmgenet_stats { enum bcmgenet_stat_type type; /* reg offset from UMAC base for misc counters */ u16 reg_offset; + /* sync for u64 stats counters */ + int syncp_offset; }; =20 -#define STAT_NETDEV(m) { \ +#define STAT_RTNL(m) { \ .stat_string =3D __stringify(m), \ - .stat_sizeof =3D sizeof(((struct net_device_stats *)0)->m), \ - .stat_offset =3D offsetof(struct net_device_stats, m), \ - .type =3D BCMGENET_STAT_NETDEV, \ + .stat_sizeof =3D sizeof(((struct rtnl_link_stats64 *)0)->m), \ + .stat_offset =3D offsetof(struct rtnl_link_stats64, m), \ + .type =3D BCMGENET_STAT_RTNL, \ } =20 #define STAT_GENET_MIB(str, m, _type) { \ @@ -1000,6 +1003,14 @@ struct bcmgenet_stats { .type =3D _type, \ } =20 +#define STAT_GENET_SOFT_MIB64(str, s, m) { \ + .stat_string =3D str, \ + .stat_sizeof =3D sizeof(((struct bcmgenet_priv *)0)->s.m), \ + .stat_offset =3D offsetof(struct bcmgenet_priv, s.m), \ + .type =3D BCMGENET_STAT_SOFT64, \ + .syncp_offset =3D offsetof(struct bcmgenet_priv, s.syncp), \ +} + #define STAT_GENET_MIB_RX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB= _RX) #define STAT_GENET_MIB_TX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB= _TX) #define STAT_GENET_RUNT(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_RUNT) @@ -1014,18 +1025,18 @@ struct bcmgenet_stats { } =20 #define STAT_GENET_Q(num) \ - STAT_GENET_SOFT_MIB("txq" __stringify(num) "_packets", \ - tx_rings[num].packets), \ - STAT_GENET_SOFT_MIB("txq" __stringify(num) "_bytes", \ - tx_rings[num].bytes), \ - STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_bytes", \ - rx_rings[num].bytes), \ - STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_packets", \ - rx_rings[num].packets), \ - STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_errors", \ - rx_rings[num].errors), \ - STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_dropped", \ - rx_rings[num].dropped) + STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_packets", \ + tx_rings[num].stats64, packets), \ + STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_bytes", \ + tx_rings[num].stats64, bytes), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_bytes", \ + rx_rings[num].stats64, bytes), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_packets", \ + rx_rings[num].stats64, packets), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_errors", \ + rx_rings[num].stats64, errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_dropped", \ + rx_rings[num].stats64, dropped) =20 /* There is a 0xC gap between the end of RX and beginning of TX stats and = then * between the end of TX stats and the beginning of the RX RUNT @@ -1037,15 +1048,15 @@ struct bcmgenet_stats { */ static const struct bcmgenet_stats bcmgenet_gstrings_stats[] =3D { /* general stats */ - STAT_NETDEV(rx_packets), - STAT_NETDEV(tx_packets), - STAT_NETDEV(rx_bytes), - STAT_NETDEV(tx_bytes), - STAT_NETDEV(rx_errors), - STAT_NETDEV(tx_errors), - STAT_NETDEV(rx_dropped), - STAT_NETDEV(tx_dropped), - STAT_NETDEV(multicast), + STAT_RTNL(rx_packets), + STAT_RTNL(tx_packets), + STAT_RTNL(rx_bytes), + STAT_RTNL(tx_bytes), + STAT_RTNL(rx_errors), + STAT_RTNL(tx_errors), + STAT_RTNL(rx_dropped), + STAT_RTNL(tx_dropped), + STAT_RTNL(multicast), /* UniMAC RSV counters */ STAT_GENET_MIB_RX("rx_64_octets", mib.rx.pkt_cnt.cnt_64), STAT_GENET_MIB_RX("rx_65_127_oct", mib.rx.pkt_cnt.cnt_127), @@ -1216,8 +1227,9 @@ static void bcmgenet_update_mib_counters(struct bcmge= net_priv *priv) =20 s =3D &bcmgenet_gstrings_stats[i]; switch (s->type) { - case BCMGENET_STAT_NETDEV: + case BCMGENET_STAT_RTNL: case BCMGENET_STAT_SOFT: + case BCMGENET_STAT_SOFT64: continue; case BCMGENET_STAT_RUNT: offset +=3D BCMGENET_STAT_OFFSET; @@ -1250,29 +1262,41 @@ static void bcmgenet_update_mib_counters(struct bcm= genet_priv *priv) } } =20 + + static void bcmgenet_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) { struct bcmgenet_priv *priv =3D netdev_priv(dev); + struct u64_stats_sync *syncp; + struct rtnl_link_stats64 stats64; + unsigned int start; int i; =20 if (netif_running(dev)) bcmgenet_update_mib_counters(priv); =20 - dev->netdev_ops->ndo_get_stats(dev); + dev_get_stats(dev, &stats64); =20 for (i =3D 0; i < BCMGENET_STATS_LEN; i++) { const struct bcmgenet_stats *s; char *p; =20 s =3D &bcmgenet_gstrings_stats[i]; - if (s->type =3D=3D BCMGENET_STAT_NETDEV) - p =3D (char *)&dev->stats; + if (s->type =3D=3D BCMGENET_STAT_RTNL) + p =3D (char *)&stats64; else p =3D (char *)priv; p +=3D s->stat_offset; - if (sizeof(unsigned long) !=3D sizeof(u32) && + if (s->type =3D=3D BCMGENET_STAT_SOFT64) { + syncp =3D (struct u64_stats_sync *)(p - s->stat_offset + + s->syncp_offset); + do { + start =3D u64_stats_fetch_begin(syncp); + data[i] =3D u64_stats_read((u64_stats_t *)p); + } while (u64_stats_fetch_retry(syncp, start)); + } else if (sizeof(unsigned long) !=3D sizeof(u32) && s->stat_sizeof =3D=3D sizeof(unsigned long)) data[i] =3D *(unsigned long *)p; else @@ -1857,6 +1881,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_= device *dev, struct bcmgenet_tx_ring *ring) { struct bcmgenet_priv *priv =3D netdev_priv(dev); + struct bcmgenet_tx_stats64 *stats =3D &ring->stats64; unsigned int txbds_processed =3D 0; unsigned int bytes_compl =3D 0; unsigned int pkts_compl =3D 0; @@ -1896,8 +1921,10 @@ static unsigned int __bcmgenet_tx_reclaim(struct net= _device *dev, ring->free_bds +=3D txbds_processed; ring->c_index =3D c_index; =20 - ring->packets +=3D pkts_compl; - ring->bytes +=3D bytes_compl; + u64_stats_update_begin(&stats->syncp); + u64_stats_add(&stats->packets, pkts_compl); + u64_stats_add(&stats->bytes, bytes_compl); + u64_stats_update_end(&stats->syncp); =20 netdev_tx_completed_queue(netdev_get_tx_queue(dev, ring->index), pkts_compl, bytes_compl); @@ -1983,9 +2010,11 @@ static void bcmgenet_tx_reclaim_all(struct net_devic= e *dev) * the transmit checksum offsets in the descriptors */ static struct sk_buff *bcmgenet_add_tsb(struct net_device *dev, - struct sk_buff *skb) + struct sk_buff *skb, + struct bcmgenet_tx_ring *ring) { struct bcmgenet_priv *priv =3D netdev_priv(dev); + struct bcmgenet_tx_stats64 *stats =3D &ring->stats64; struct status_64 *status =3D NULL; struct sk_buff *new_skb; u16 offset; @@ -2001,7 +2030,9 @@ static struct sk_buff *bcmgenet_add_tsb(struct net_de= vice *dev, if (!new_skb) { dev_kfree_skb_any(skb); priv->mib.tx_realloc_tsb_failed++; - dev->stats.tx_dropped++; + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->dropped); + u64_stats_update_end(&stats->syncp); return NULL; } dev_consume_skb_any(skb); @@ -2089,7 +2120,7 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb,= struct net_device *dev) GENET_CB(skb)->bytes_sent =3D skb->len; =20 /* add the Transmit Status Block */ - skb =3D bcmgenet_add_tsb(dev, skb); + skb =3D bcmgenet_add_tsb(dev, skb, ring); if (!skb) { ret =3D NETDEV_TX_OK; goto out; @@ -2233,6 +2264,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, { struct bcmgenet_priv *priv =3D ring->priv; struct net_device *dev =3D priv->dev; + struct bcmgenet_rx_stats64 *stats =3D &ring->stats64; struct enet_cb *cb; struct sk_buff *skb; u32 dma_length_status; @@ -2253,7 +2285,9 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, DMA_P_INDEX_DISCARD_CNT_MASK; if (discards > ring->old_discards) { discards =3D discards - ring->old_discards; - ring->errors +=3D discards; + u64_stats_update_begin(&stats->syncp); + u64_stats_add(&stats->errors, discards); + u64_stats_update_end(&stats->syncp); ring->old_discards +=3D discards; =20 /* Clear HW register when we reach 75% of maximum 0xFFFF */ @@ -2279,7 +2313,9 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, skb =3D bcmgenet_rx_refill(priv, cb); =20 if (unlikely(!skb)) { - ring->dropped++; + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->dropped); + u64_stats_update_end(&stats->syncp); goto next; } =20 @@ -2306,8 +2342,9 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, =20 if (unlikely(len > RX_BUF_LENGTH)) { netif_err(priv, rx_status, dev, "oversized packet\n"); - dev->stats.rx_length_errors++; - dev->stats.rx_errors++; + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->length_errors); + u64_stats_update_end(&stats->syncp); dev_kfree_skb_any(skb); goto next; } @@ -2315,7 +2352,9 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, if (unlikely(!(dma_flag & DMA_EOP) || !(dma_flag & DMA_SOP))) { netif_err(priv, rx_status, dev, "dropping fragmented packet!\n"); - ring->errors++; + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->fragmented_errors); + u64_stats_update_end(&stats->syncp); dev_kfree_skb_any(skb); goto next; } @@ -2328,15 +2367,22 @@ static unsigned int bcmgenet_desc_rx(struct bcmgene= t_rx_ring *ring, DMA_RX_RXER))) { netif_err(priv, rx_status, dev, "dma_flag=3D0x%x\n", (unsigned int)dma_flag); + u64_stats_update_begin(&stats->syncp); if (dma_flag & DMA_RX_CRC_ERROR) - dev->stats.rx_crc_errors++; + u64_stats_inc(&stats->crc_errors); if (dma_flag & DMA_RX_OV) - dev->stats.rx_over_errors++; + u64_stats_inc(&stats->over_errors); if (dma_flag & DMA_RX_NO) - dev->stats.rx_frame_errors++; + u64_stats_inc(&stats->frame_errors); if (dma_flag & DMA_RX_LG) - dev->stats.rx_length_errors++; - dev->stats.rx_errors++; + u64_stats_inc(&stats->length_errors); + if ((dma_flag & (DMA_RX_CRC_ERROR | + DMA_RX_OV | + DMA_RX_NO | + DMA_RX_LG | + DMA_RX_RXER)) =3D=3D DMA_RX_RXER) + u64_stats_inc(&stats->errors); + u64_stats_update_end(&stats->syncp); dev_kfree_skb_any(skb); goto next; } /* error packet */ @@ -2356,10 +2402,13 @@ static unsigned int bcmgenet_desc_rx(struct bcmgene= t_rx_ring *ring, =20 /*Finish setting up the received SKB and send it to the kernel*/ skb->protocol =3D eth_type_trans(skb, priv->dev); - ring->packets++; - ring->bytes +=3D len; + + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->packets); + u64_stats_add(&stats->bytes, len); if (dma_flag & DMA_RX_MULT) - dev->stats.multicast++; + u64_stats_inc(&stats->multicast); + u64_stats_update_end(&stats->syncp); =20 /* Notify kernel */ napi_gro_receive(&ring->napi, skb); @@ -3402,6 +3451,7 @@ static void bcmgenet_dump_tx_queue(struct bcmgenet_tx= _ring *ring) static void bcmgenet_timeout(struct net_device *dev, unsigned int txqueue) { struct bcmgenet_priv *priv =3D netdev_priv(dev); + struct bcmgenet_tx_stats64 *stats =3D &priv->tx_rings[txqueue].stats64; u32 int1_enable =3D 0; unsigned int q; =20 @@ -3420,7 +3470,9 @@ static void bcmgenet_timeout(struct net_device *dev, = unsigned int txqueue) =20 netif_trans_update(dev); =20 - dev->stats.tx_errors++; + u64_stats_update_begin(&stats->syncp); + u64_stats_inc(&stats->errors); + u64_stats_update_end(&stats->syncp); =20 netif_tx_wake_all_queues(dev); } @@ -3509,39 +3561,72 @@ static int bcmgenet_set_mac_addr(struct net_device = *dev, void *p) return 0; } =20 -static struct net_device_stats *bcmgenet_get_stats(struct net_device *dev) +static void bcmgenet_get_stats64(struct net_device *dev, + struct rtnl_link_stats64 *stats) { struct bcmgenet_priv *priv =3D netdev_priv(dev); - unsigned long tx_bytes =3D 0, tx_packets =3D 0; - unsigned long rx_bytes =3D 0, rx_packets =3D 0; - unsigned long rx_errors =3D 0, rx_dropped =3D 0; - struct bcmgenet_tx_ring *tx_ring; - struct bcmgenet_rx_ring *rx_ring; + u64 tx_bytes =3D 0, tx_packets =3D 0; + u64 tx_errors =3D 0, tx_dropped =3D 0; + u64 rx_bytes =3D 0, rx_packets =3D 0; + u64 rx_errors =3D 0, rx_dropped =3D 0; + u64 rx_length_errors =3D 0; + u64 rx_over_errors =3D 0, rx_crc_errors =3D 0; + u64 rx_frame_errors =3D 0, rx_fragmented_errors =3D 0; + u64 multicast =3D 0; + struct bcmgenet_tx_stats64 *tx_stats; + struct bcmgenet_rx_stats64 *rx_stats; unsigned int q; + unsigned int start; =20 for (q =3D 0; q <=3D priv->hw_params->tx_queues; q++) { - tx_ring =3D &priv->tx_rings[q]; - tx_bytes +=3D tx_ring->bytes; - tx_packets +=3D tx_ring->packets; + tx_stats =3D &priv->tx_rings[q].stats64; + do { + =09 + start =3D u64_stats_fetch_begin(&tx_stats->syncp); + tx_bytes =3D u64_stats_read(&tx_stats->bytes); + tx_packets =3D u64_stats_read(&tx_stats->packets); + tx_errors =3D u64_stats_read(&tx_stats->errors); + tx_dropped =3D u64_stats_read(&tx_stats->dropped); + } while (u64_stats_fetch_retry(&tx_stats->syncp, start)); + + stats->tx_bytes +=3D tx_bytes; + stats->tx_packets +=3D tx_packets; + stats->tx_errors +=3D tx_errors; + stats->tx_dropped +=3D tx_dropped; } =20 for (q =3D 0; q <=3D priv->hw_params->rx_queues; q++) { - rx_ring =3D &priv->rx_rings[q]; - - rx_bytes +=3D rx_ring->bytes; - rx_packets +=3D rx_ring->packets; - rx_errors +=3D rx_ring->errors; - rx_dropped +=3D rx_ring->dropped; + rx_stats =3D &priv->rx_rings[q].stats64; + do { + start =3D u64_stats_fetch_begin(&rx_stats->syncp); + rx_bytes =3D u64_stats_read(&rx_stats->bytes); + rx_packets =3D u64_stats_read(&rx_stats->packets); + rx_errors =3D u64_stats_read(&rx_stats->errors); + rx_dropped =3D u64_stats_read(&rx_stats->dropped); + rx_length_errors =3D u64_stats_read(&rx_stats->length_errors); + rx_over_errors =3D u64_stats_read(&rx_stats->over_errors); + rx_crc_errors =3D u64_stats_read(&rx_stats->crc_errors); + rx_frame_errors =3D u64_stats_read(&rx_stats->frame_errors); + rx_fragmented_errors =3D u64_stats_read(&rx_stats->fragmented_errors); + multicast =3D u64_stats_read(&rx_stats->multicast); + } while (u64_stats_fetch_retry(&rx_stats->syncp, start)); + + rx_errors +=3D rx_length_errors; + rx_errors +=3D rx_crc_errors; + rx_errors +=3D rx_frame_errors; + rx_errors +=3D rx_fragmented_errors; + + stats->rx_bytes +=3D rx_bytes; + stats->rx_packets +=3D rx_packets; + stats->rx_errors +=3D rx_errors; + stats->rx_dropped +=3D rx_dropped; + stats->rx_missed_errors +=3D rx_errors; + stats->rx_length_errors +=3D rx_length_errors; + stats->rx_over_errors +=3D rx_over_errors; + stats->rx_crc_errors +=3D rx_crc_errors; + stats->rx_frame_errors +=3D rx_frame_errors; + stats->multicast +=3D multicast; } - - dev->stats.tx_bytes =3D tx_bytes; - dev->stats.tx_packets =3D tx_packets; - dev->stats.rx_bytes =3D rx_bytes; - dev->stats.rx_packets =3D rx_packets; - dev->stats.rx_errors =3D rx_errors; - dev->stats.rx_missed_errors =3D rx_errors; - dev->stats.rx_dropped =3D rx_dropped; - return &dev->stats; } =20 static int bcmgenet_change_carrier(struct net_device *dev, bool new_carrie= r) @@ -3569,7 +3654,7 @@ static const struct net_device_ops bcmgenet_netdev_op= s =3D { .ndo_set_mac_address =3D bcmgenet_set_mac_addr, .ndo_eth_ioctl =3D phy_do_ioctl_running, .ndo_set_features =3D bcmgenet_set_features, - .ndo_get_stats =3D bcmgenet_get_stats, + .ndo_get_stats64 =3D bcmgenet_get_stats64, .ndo_change_carrier =3D bcmgenet_change_carrier, }; =20 diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/e= thernet/broadcom/genet/bcmgenet.h index 10c631bbe..5ec397977 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -155,6 +155,30 @@ struct bcmgenet_mib_counters { u32 tx_realloc_tsb_failed; }; =20 +struct bcmgenet_tx_stats64 { + struct u64_stats_sync syncp; + u64_stats_t packets; + u64_stats_t bytes; + u64_stats_t errors; + u64_stats_t dropped; +}; + +struct bcmgenet_rx_stats64 { + struct u64_stats_sync syncp; + u64_stats_t bytes; + u64_stats_t packets; + u64_stats_t errors; + u64_stats_t dropped; + u64_stats_t multicast; + u64_stats_t broadcast; + u64_stats_t missed; + u64_stats_t length_errors; + u64_stats_t over_errors; + u64_stats_t crc_errors; + u64_stats_t frame_errors; + u64_stats_t fragmented_errors; +}; + #define UMAC_MIB_START 0x400 =20 #define UMAC_MDIO_CMD 0x614 @@ -515,8 +539,7 @@ struct bcmgenet_skb_cb { struct bcmgenet_tx_ring { spinlock_t lock; /* ring lock */ struct napi_struct napi; /* NAPI per tx queue */ - unsigned long packets; - unsigned long bytes; + struct bcmgenet_tx_stats64 stats64; unsigned int index; /* ring index */ struct enet_cb *cbs; /* tx ring buffer control block*/ unsigned int size; /* size of each tx ring */ @@ -540,10 +563,7 @@ struct bcmgenet_net_dim { =20 struct bcmgenet_rx_ring { struct napi_struct napi; /* Rx NAPI struct */ - unsigned long bytes; - unsigned long packets; - unsigned long errors; - unsigned long dropped; + struct bcmgenet_rx_stats64 stats64; unsigned int index; /* Rx ring index */ struct enet_cb *cbs; /* Rx ring buffer control block */ unsigned int size; /* Rx ring size */ --=20 2.39.5 From nobody Sat Feb 7 12:35:09 2026 Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 737692BE100; Tue, 13 May 2025 14:41:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747147313; cv=none; b=ulQ76kodyCN0SJoVbQS76jvJ/r+HwgZRS+poTDYE85+4OuBYCJNGfS51d9rfV0DrZqg4cTjPk5Ggkf3Jf03X/zdszSLlXKwI/hR9NdyhiYbFDQ6MXh2mtPPQpVLCyHVYOexQeis1y5hly1D2Me/nIixUv+dvHSyFExjzpu/Ut6c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747147313; c=relaxed/simple; bh=Ta1VOb3JFrR4uLqIYluRSoPODEXu5Nl2ArRwe5+E3g0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PPeQB9LZ77KGeaeTkFTlo+OXPt3Dyfw1cC9rar1bn++MGcav+9phgbHJgIeD2qEPn9k18/dcAliErHKXQTLz6X5wj4YTu8Pp+OlkR1KbZ6+OsRGnauUiJwpUEprtjXeXJdE5slKtRetYvd4rLXqcXXrQeYxsAdqB+URQiUVYfqs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mWKDkZ43; arc=none smtp.client-ip=209.85.208.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mWKDkZ43" Received: by mail-ed1-f42.google.com with SMTP id 4fb4d7f45d1cf-5fcf1dc8737so7201920a12.1; Tue, 13 May 2025 07:41:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747147310; x=1747752110; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FsaGBIAwQmVTmuw2s6ILc5WhGz884w7UxCLCf4aI+Ho=; b=mWKDkZ43zHSYIWE5m3zHv/hx/fsqidi3190vUxUQKD+5EKQ+Jyi5WphRxQH6VUVvuS +fxu5d2sCM1RNjKAe9usI9zFMu1TzpfwboJW0mvc3fITqYhQ+Fd2dEYksj7Eh/asoXzV WAEl4wiXdKnBnmsq4qbNiEfop/YgCOOo/TtNr0bAV9xgLeWEe6VrOw6LEs+U/Dr4VaeD ku4TLezaT/CPGA4r8/nsUr/1vlgFDI36dKNxzyX8FPcrzrCFcMeQGBmxyfFKwTJUpp+6 EIdKxM19QlFyjcD0rpN8NRo2jdYmox9/2zOfWLpoVONBKQNmdjXjA1h29UHETtKC9bAd K/dQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747147310; x=1747752110; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FsaGBIAwQmVTmuw2s6ILc5WhGz884w7UxCLCf4aI+Ho=; b=pASvGcjW/qjA2YXC3aE+uQT4py9UVnJtlYy3aaypRFrMszhiSk1myZTGwd+v62hjK3 0M6W5HejHzXJ69w/BurZx8I+ZZC+8PI0T25NNjADyXD6rbECVLk1mK8TB/EMBfrK/3yA gL3SYjPts41S44MZgYugx2xPUuCiIQwJP3Z1xWeDL84q5tjK0MDpBe/q6i56/YvjvYBW UxbnikQYoHPmB2Sscs1ya0UJJRmkYMWjUMAbYuC610KXJZXCfUu2knTZEIkCR+zbPr/T CnuXd8Rys4HrlXvSFAjf5ttu1cBGIEVIdQy6u3Irg/sUGUgzmstyBqbGKyUtfHRyExvS N5ew== X-Forwarded-Encrypted: i=1; AJvYcCUAp5sC6uJzQ6yB5Jeq7RdJb8wtlrIYmwI/b1+ddhfsdc5y3QAkucJuLirPEFyNqMK4DYqBV9ZorBBXRjM=@vger.kernel.org, AJvYcCW40yLFejDpx9qpWwUoQGnukqkhF+Gi7vWen/N9QB7N2GAD+wAHbBxswrYRMrfh8nk09L/YACoI@vger.kernel.org X-Gm-Message-State: AOJu0YyJGy0Qx0irtcVspe3t8sP8c4lAgkMsQcljWyO0CIFY0CJh+1Gh fWXcVEm7ppG4cC5i4lI/Y2cswZXt8Odun+TrDyqm6F5TYvFeN0AR X-Gm-Gg: ASbGncuvGdj38IhEcrD/n5egHQQSGskIH4m+gYCrIcPl3bKpc1/x1n2rKkereZDVAPW gL0vZ62vQf42+LOYhLRzRJ3LofC33Eiu+qmndyIX0MZl7TNxlH15MS3uWL+euYjJjRPQ12Rnyur 5TOV7XtTku14EWbBmDf0BfsU2jsQCuESvsFlLlFVya4bWEbdzbl6o2LE80SeOo5pDA3F5jqRMor misImJRcMTQXama97aLxks6u/l0OoQTpVvVCC72kSz41RtGxBhFondEb4R1+gkeUnurigNPY9ct q3mEepKzZqkUIQ6H7ooTgTo9BPxe9uEf5vOak+rDzIhJRISea7/qfj0JFJEU71tC7Qieu6oQ X-Google-Smtp-Source: AGHT+IHtUXtCUQDA66YPISmSA0d0Lh6xpiX6S1vJ8+DmjImVr8qvcleiH50BNv/+ql1V0/lb8OQEkg== X-Received: by 2002:a05:6402:358d:b0:5fc:4045:7d79 with SMTP id 4fb4d7f45d1cf-5fca07e91e3mr15193356a12.22.1747147309208; Tue, 13 May 2025 07:41:49 -0700 (PDT) Received: from debian-vm.localnet ([2a01:4b00:d20c:cddd:20c:29ff:fe56:c86]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fc9d700e56sm7301556a12.57.2025.05.13.07.41.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 07:41:49 -0700 (PDT) From: Zak Kemble To: Doug Berger , Florian Fainelli , Broadcom internal kernel review list , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Zak Kemble Subject: [PATCH 2/3] net: bcmgenet: count hw discarded packets in missed stat Date: Tue, 13 May 2025 15:41:06 +0100 Message-Id: <20250513144107.1989-3-zakkemble@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250513144107.1989-1-zakkemble@gmail.com> References: <20250513144107.1989-1-zakkemble@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Hardware discarded packets are now counted in their own missed stat instead of being lumped in with general errors. Signed-off-by: Zak Kemble --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/e= thernet/broadcom/genet/bcmgenet.c index 80ef973e1..80b1031da 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -2286,7 +2286,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, if (discards > ring->old_discards) { discards =3D discards - ring->old_discards; u64_stats_update_begin(&stats->syncp); - u64_stats_add(&stats->errors, discards); + u64_stats_add(&stats->missed, discards); u64_stats_update_end(&stats->syncp); ring->old_discards +=3D discards; =20 @@ -3569,7 +3569,7 @@ static void bcmgenet_get_stats64(struct net_device *d= ev, u64 tx_errors =3D 0, tx_dropped =3D 0; u64 rx_bytes =3D 0, rx_packets =3D 0; u64 rx_errors =3D 0, rx_dropped =3D 0; - u64 rx_length_errors =3D 0; + u64 rx_missed =3D 0, rx_length_errors =3D 0; u64 rx_over_errors =3D 0, rx_crc_errors =3D 0; u64 rx_frame_errors =3D 0, rx_fragmented_errors =3D 0; u64 multicast =3D 0; @@ -3603,6 +3603,7 @@ static void bcmgenet_get_stats64(struct net_device *d= ev, rx_packets =3D u64_stats_read(&rx_stats->packets); rx_errors =3D u64_stats_read(&rx_stats->errors); rx_dropped =3D u64_stats_read(&rx_stats->dropped); + rx_missed =3D u64_stats_read(&rx_stats->missed); rx_length_errors =3D u64_stats_read(&rx_stats->length_errors); rx_over_errors =3D u64_stats_read(&rx_stats->over_errors); rx_crc_errors =3D u64_stats_read(&rx_stats->crc_errors); @@ -3620,7 +3621,7 @@ static void bcmgenet_get_stats64(struct net_device *d= ev, stats->rx_packets +=3D rx_packets; stats->rx_errors +=3D rx_errors; stats->rx_dropped +=3D rx_dropped; - stats->rx_missed_errors +=3D rx_errors; + stats->rx_missed_errors +=3D rx_missed; stats->rx_length_errors +=3D rx_length_errors; stats->rx_over_errors +=3D rx_over_errors; stats->rx_crc_errors +=3D rx_crc_errors; --=20 2.39.5 From nobody Sat Feb 7 12:35:09 2026 Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB99E2BE10C; Tue, 13 May 2025 14:41:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747147317; cv=none; b=a4rbPG2h3UsqHdZX5k0jydfxZQBibH7EFmZf+BetsgwFq5fv49lU0YV/hV4T7v2AIxx1y0L8m/hBjTwQ/voWVSwnU48ylltqzSrzlLBgbW0IFFz2CvWhuYpasLNIpI4PQPJHasC+gk51ydXstgDEi2PP1gOHnLXLaKvq55mN4M0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747147317; c=relaxed/simple; bh=Mfe/o/ujk7XvMhycJvGf6PnnNtj9TPRT+Cu0bPP1/H8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rWgmOVlasK6AJXzTbT091xuCRAehwyvphAg7tGb+JTNZTcmLkzlJec4UsNmuAPbk6uJuquZnS9/vJUv7v78aJB8UYVwSWIMbMYm6o83L76w1Jw2tzlxsrNeE92ANnERtO+YLcJ5lf2UeBxwrPQ1l6+6gn9sxfHytJatp19T2C0Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nDOkP5IG; arc=none smtp.client-ip=209.85.208.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nDOkP5IG" Received: by mail-ed1-f52.google.com with SMTP id 4fb4d7f45d1cf-5fbe7a65609so9191908a12.0; Tue, 13 May 2025 07:41:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747147314; x=1747752114; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qzjcpGVlPiNhfCQy1SqonqHdDAwC7y+3thN4axNOI5o=; b=nDOkP5IGD3KHdAx7v4wcp9JacGfByfez8C/lXu0gyHhjDtOfTM9WXCsu6aSkWYiGz/ MHXz36FyVcMAOeWI9NXjKuY3r/naTyqPagDIPD1IecqnxdBDFGJFSNH8ofGSaC0TmQxk gXBkoZPpZp12dvndPfLnKOZXxRmcdufUCVkv0VZILZcETjGajI9UbMSVcCfuHcvtpVuT JmfPwPfEkOxdBRdJUXCPn5JYGESSI/XGE3CjUsTL9gxBwKisLAC/h0ZSh0C3RMlBnsom ystagC44LuXRb52fWKIH18Ci8OM51GDKG0LZzbdrJPoTFG5/Raw5YJ2UqZ8mWaA0oBSH LW8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747147314; x=1747752114; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qzjcpGVlPiNhfCQy1SqonqHdDAwC7y+3thN4axNOI5o=; b=mLkNS9fupIouGq8NxMWobtqTE/xAZZ7EKXaPRa+Z53Zaq7CQ5PKeFqg/2s9DWq28rT 7FTeEpu2t7i/+q0nlkyldKGDZPJDzOwx3TLTNZZlMZwUjf/Ti7opcrGjHQ9p5OyJgPVM gjzF6P1I1FI6XucdFeUnTLRPswIVSF54xDe9pbx855/FQTWDsyjvWYFn/2L6mktVnwKx aPWMNdMFOwfyNmrbbRkQtp9tTVsSStkW042y9eWsF0Y6DGMAFlMV2uJv0zT8KoOIMgKC mxqN5W4AOSBNxVRA/C1ktQ7U455fxxNg2Q68gM6q3byP8YVwc+if+vXfMBEt7VtnWJqc LA+w== X-Forwarded-Encrypted: i=1; AJvYcCWsbbaQjoA9dZnmRyNrBHjaIBYMqMSBN+3VP0TYFYzzb/klV58spmjrdxJRPZns6Zqct9I7aQbx@vger.kernel.org, AJvYcCXWkqw5LBI763NR03jRR69uys2Jpd0i+u9x4moj3AUZp21V211TFFbv6ecvm7GFnrWU+mXofbtwEbTBHmU=@vger.kernel.org X-Gm-Message-State: AOJu0YzUnGcceNg7RTRxUPAOWNdMeLatanHqTSXpExmvj8iWQr91VYdk tqowz4dw6q8xeoWNtUsRZYLHZ7qDXhQ/2ullEnmHtLP4oNnTWDOH X-Gm-Gg: ASbGncvT2AiWYCdze4H8ASpCOOj6as7YmP42oUV3W2TM0e3xti9Fb3XSZgdNsdJJuQO iOL7nGahXCX4akUNdaTkD9bpq4ZQJ/9Y4jkyVwtHEVQid4ScjvUqY5GXBo6w22+lFK19Z67Oavl LLdkF1wfIif3J98RnelRbPJb7fnd7TUr4VZ6FxMAILRNvA6UaVrqOnvSgjeN9Xn7i8sAzRXKHcU cvVuzUwgKBH2y0T0Tg1kRk88Sb9Zc+B8ALqXCp6iTUUUdqvF+8/eHDg3e/a0tYQmubWyaSNXidN tG5qqtsacne+32s6x/tfWjB6+tm5ASv4ygM21R/Bj73Fry6piCtzBp20+sTMHQ== X-Google-Smtp-Source: AGHT+IGa8HfcLnV5l28T4pdncKPX+8wlBf0z+xMRFl0KSOi65yCYhLtG1//h/VuXNDAMOEomitButw== X-Received: by 2002:a05:6402:234a:b0:5fe:6e0b:aefc with SMTP id 4fb4d7f45d1cf-5fe6e0bb0e6mr7542848a12.26.1747147313932; Tue, 13 May 2025 07:41:53 -0700 (PDT) Received: from debian-vm.localnet ([2a01:4b00:d20c:cddd:20c:29ff:fe56:c86]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5fc9d700e56sm7301556a12.57.2025.05.13.07.41.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 May 2025 07:41:53 -0700 (PDT) From: Zak Kemble To: Doug Berger , Florian Fainelli , Broadcom internal kernel review list , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Zak Kemble Subject: [PATCH 3/3] net: bcmgenet: expose more stats in ethtool Date: Tue, 13 May 2025 15:41:07 +0100 Message-Id: <20250513144107.1989-4-zakkemble@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250513144107.1989-1-zakkemble@gmail.com> References: <20250513144107.1989-1-zakkemble@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Expose more per-queue and overall stats in ethtool Signed-off-by: Zak Kemble --- .../net/ethernet/broadcom/genet/bcmgenet.c | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/e= thernet/broadcom/genet/bcmgenet.c index 80b1031da..ce224de45 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -1029,6 +1029,10 @@ struct bcmgenet_stats { tx_rings[num].stats64, packets), \ STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_bytes", \ tx_rings[num].stats64, bytes), \ + STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_errors", \ + tx_rings[num].stats64, errors), \ + STAT_GENET_SOFT_MIB64("txq" __stringify(num) "_dropped", \ + tx_rings[num].stats64, dropped), \ STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_bytes", \ rx_rings[num].stats64, bytes), \ STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_packets", \ @@ -1036,7 +1040,23 @@ struct bcmgenet_stats { STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_errors", \ rx_rings[num].stats64, errors), \ STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_dropped", \ - rx_rings[num].stats64, dropped) + rx_rings[num].stats64, dropped), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_multicast", \ + rx_rings[num].stats64, multicast), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_missed", \ + rx_rings[num].stats64, missed), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_length_errors", \ + rx_rings[num].stats64, length_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_over_errors", \ + rx_rings[num].stats64, over_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_crc_errors", \ + rx_rings[num].stats64, crc_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_frame_errors", \ + rx_rings[num].stats64, frame_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_fragmented_errors", \ + rx_rings[num].stats64, fragmented_errors), \ + STAT_GENET_SOFT_MIB64("rxq" __stringify(num) "_broadcast", \ + rx_rings[num].stats64, broadcast) =20 /* There is a 0xC gap between the end of RX and beginning of TX stats and = then * between the end of TX stats and the beginning of the RX RUNT @@ -1057,6 +1077,11 @@ static const struct bcmgenet_stats bcmgenet_gstrings= _stats[] =3D { STAT_RTNL(rx_dropped), STAT_RTNL(tx_dropped), STAT_RTNL(multicast), + STAT_RTNL(rx_missed_errors), + STAT_RTNL(rx_length_errors), + STAT_RTNL(rx_over_errors), + STAT_RTNL(rx_crc_errors), + STAT_RTNL(rx_frame_errors), /* UniMAC RSV counters */ STAT_GENET_MIB_RX("rx_64_octets", mib.rx.pkt_cnt.cnt_64), STAT_GENET_MIB_RX("rx_65_127_oct", mib.rx.pkt_cnt.cnt_127), @@ -2408,6 +2433,8 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_= rx_ring *ring, u64_stats_add(&stats->bytes, len); if (dma_flag & DMA_RX_MULT) u64_stats_inc(&stats->multicast); + else if (dma_flag & DMA_RX_BRDCAST) + u64_stats_inc(&stats->broadcast); u64_stats_update_end(&stats->syncp); =20 /* Notify kernel */ --=20 2.39.5