octeontx2-af: RPM: fix stale RSFEC counters
authorHariprasad Kelam <hkelam@marvell.com>
Fri, 22 Nov 2024 16:20:33 +0000 (21:50 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 26 Nov 2024 11:09:40 +0000 (12:09 +0100)
The earlier patch sets the 'Stats control register' for RPM
receive/transmit statistics instead of RSFEC statistics,
causing the driver to return stale FEC counters.

Fixes: 84ad3642115d ("octeontx2-af: Add FEC stats for RPM/RPM_USX block")
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/marvell/octeontx2/af/rpm.c
drivers/net/ethernet/marvell/octeontx2/af/rpm.h

index 22dd50a..70629f9 100644 (file)
@@ -699,6 +699,10 @@ int rpm_get_fec_stats(void *rpmd, int lmac_id, struct cgx_fec_stats_rsp *rsp)
        if (rpm->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_NONE)
                return 0;
 
+       /* latched registers FCFECX_CW_HI/RSFEC_STAT_FAST_DATA_HI_CDC are common
+        * for all counters. Acquire lock to ensure serialized reads
+        */
+       mutex_lock(&rpm->lock);
        if (rpm->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_BASER) {
                val_lo = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_VL0_CCW_LO);
                val_hi = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_CW_HI);
@@ -725,20 +729,21 @@ int rpm_get_fec_stats(void *rpmd, int lmac_id, struct cgx_fec_stats_rsp *rsp)
                }
        } else {
                /* enable RS-FEC capture */
-               cfg = rpm_read(rpm, 0, RPMX_MTI_STAT_STATN_CONTROL);
+               cfg = rpm_read(rpm, 0, RPMX_MTI_RSFEC_STAT_STATN_CONTROL);
                cfg |= RPMX_RSFEC_RX_CAPTURE | BIT(lmac_id);
-               rpm_write(rpm, 0, RPMX_MTI_STAT_STATN_CONTROL, cfg);
+               rpm_write(rpm, 0, RPMX_MTI_RSFEC_STAT_STATN_CONTROL, cfg);
 
                val_lo = rpm_read(rpm, 0,
                                  RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2);
-               val_hi = rpm_read(rpm, 0, RPMX_MTI_STAT_DATA_HI_CDC);
+               val_hi = rpm_read(rpm, 0, RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC);
                rsp->fec_corr_blks = (val_hi << 32 | val_lo);
 
                val_lo = rpm_read(rpm, 0,
                                  RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3);
-               val_hi = rpm_read(rpm, 0, RPMX_MTI_STAT_DATA_HI_CDC);
+               val_hi = rpm_read(rpm, 0, RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC);
                rsp->fec_uncorr_blks = (val_hi << 32 | val_lo);
        }
+       mutex_unlock(&rpm->lock);
 
        return 0;
 }
index 34b11de..a5773fb 100644 (file)
 /* FEC stats */
 #define RPMX_MTI_STAT_STATN_CONTROL                    0x10018
 #define RPMX_MTI_STAT_DATA_HI_CDC                      0x10038
-#define RPMX_RSFEC_RX_CAPTURE                          BIT_ULL(27)
+#define RPMX_RSFEC_RX_CAPTURE                          BIT_ULL(28)
 #define RPMX_CMD_CLEAR_RX                              BIT_ULL(30)
 #define RPMX_CMD_CLEAR_TX                              BIT_ULL(31)
+#define RPMX_MTI_RSFEC_STAT_STATN_CONTROL               0x40018
+#define RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC            0x40000
 #define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2          0x40050
 #define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3          0x40058
 #define RPMX_MTI_FCFECX_VL0_CCW_LO                     0x38618