]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: stmmac: xgmac: report L3/L4 filter match count in ethtool stats
authorNazim Amirul <muhammad.nazim.amirul.nazle.asmade@altera.com>
Thu, 4 Jun 2026 08:30:37 +0000 (01:30 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 6 Jun 2026 02:17:05 +0000 (19:17 -0700)
Read the L3FM and L4FM bits from the RX descriptor status word (RDES2)
and increment the corresponding ethtool statistics counters. This allows
users to observe L3/L4 filter hit rates via ethtool -S.

Signed-off-by: Rohan G Thomas <rohan.g.thomas@altera.com>
Signed-off-by: Nazim Amirul <muhammad.nazim.amirul.nazle.asmade@altera.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20260604083037.24407-1-muhammad.nazim.amirul.nazle.asmade@altera.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c

index 51943705a2b035bcab92598d75d565418b3e0ae1..95fdf3133208751546776cd625df244111ef56c6 100644 (file)
 #define XGMAC_TDES3_VLTV               BIT(16)
 #define XGMAC_TDES3_VT                 GENMASK(15, 0)
 #define XGMAC_TDES3_FL                 GENMASK(14, 0)
+#define XGMAC_RDES2_L4FM               BIT(28)
+#define XGMAC_RDES2_L3FM               BIT(27)
 #define XGMAC_RDES2_HL                 GENMASK(9, 0)
 #define XGMAC_RDES3_OWN                        BIT(31)
 #define XGMAC_RDES3_CTXT               BIT(30)
index b5f200a8748406a585d6d5a955bf301fccac858a..6719ac6e395bce6f07c79798ac3521bf631ec4d9 100644 (file)
@@ -27,6 +27,7 @@ static int dwxgmac2_get_rx_status(struct stmmac_extra_stats *x,
                                  struct dma_desc *p)
 {
        u32 rdes3 = le32_to_cpu(p->des3);
+       u32 rdes2 = le32_to_cpu(p->des2);
 
        if (unlikely(rdes3 & XGMAC_RDES3_OWN))
                return dma_own;
@@ -37,6 +38,11 @@ static int dwxgmac2_get_rx_status(struct stmmac_extra_stats *x,
        if (unlikely((rdes3 & XGMAC_RDES3_ES) && (rdes3 & XGMAC_RDES3_LD)))
                return discard_frame;
 
+       if (rdes2 & XGMAC_RDES2_L3FM)
+               x->l3_filter_match++;
+       if (rdes2 & XGMAC_RDES2_L4FM)
+               x->l4_filter_match++;
+
        return good_frame;
 }