]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
octeontx2-af: RPM: Fix low network performance
authorHariprasad Kelam <hkelam@marvell.com>
Fri, 22 Nov 2024 16:20:32 +0000 (21:50 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 26 Nov 2024 11:09:40 +0000 (12:09 +0100)
Low network performance is observed even on RPMs with larger
FIFO lengths.

The cn10kb silicon has three RPM blocks with the following
FIFO sizes:

         --------------------
         | RPM0  |   256KB  |
         | RPM1  |   256KB  |
         | RPM2  |   128KB  |
         --------------------

The current design stores the FIFO length in a common structure for all
RPMs (mac_ops). As a result, the FIFO length of the last RPM is applied
to all RPMs, leading to reduced network performance.

This patch resolved the problem by storing the fifo length in per MAC
structure (cgx).

Fixes: b9d0fedc6234 ("octeontx2-af: cn10kb: Add RPM_USX MAC support")
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/marvell/octeontx2/af/cgx.c
drivers/net/ethernet/marvell/octeontx2/af/cgx.h
drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h
drivers/net/ethernet/marvell/octeontx2/af/rpm.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c

index 27935c54b91bc7acb1467d9a892e1c0ecbbc6399..2f621714c54e6a627cb4b891ee208f7aaa65c5f5 100644 (file)
@@ -112,6 +112,11 @@ struct mac_ops *get_mac_ops(void *cgxd)
        return ((struct cgx *)cgxd)->mac_ops;
 }
 
+u32 cgx_get_fifo_len(void *cgxd)
+{
+       return ((struct cgx *)cgxd)->fifo_len;
+}
+
 void cgx_write(struct cgx *cgx, u64 lmac, u64 offset, u64 val)
 {
        writeq(val, cgx->reg_base + (lmac << cgx->mac_ops->lmac_offset) +
@@ -501,7 +506,7 @@ static u32 cgx_get_lmac_fifo_len(void *cgxd, int lmac_id)
        u8 num_lmacs;
        u32 fifo_len;
 
-       fifo_len = cgx->mac_ops->fifo_len;
+       fifo_len = cgx->fifo_len;
        num_lmacs = cgx->mac_ops->get_nr_lmacs(cgx);
 
        switch (num_lmacs) {
@@ -1764,7 +1769,7 @@ static void cgx_populate_features(struct cgx *cgx)
        u64 cfg;
 
        cfg = cgx_read(cgx, 0, CGX_CONST);
-       cgx->mac_ops->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg);
+       cgx->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg);
        cgx->max_lmac_per_mac = FIELD_GET(CGX_CONST_MAX_LMACS, cfg);
 
        if (is_dev_rpm(cgx))
index dc9ace30554af67a5849a945101e599e648cd4d4..f9cd4b58f0c022eb89bbb0443d2b91f7150ec6c2 100644 (file)
@@ -185,4 +185,5 @@ int cgx_lmac_get_pfc_frm_cfg(void *cgxd, int lmac_id, u8 *tx_pause,
 int verify_lmac_fc_cfg(void *cgxd, int lmac_id, u8 tx_pause, u8 rx_pause,
                       int pfvf_idx);
 int cgx_lmac_reset(void *cgxd, int lmac_id, u8 pf_req_flr);
+u32 cgx_get_fifo_len(void *cgxd);
 #endif /* CGX_H */
index 9ffc6790c51307caced691e23f2e4aff24e922a5..c43ff68ef14082e11316092f07556e49b4e37a08 100644 (file)
@@ -72,7 +72,6 @@ struct mac_ops {
        u8                      irq_offset;
        u8                      int_ena_bit;
        u8                      lmac_fwi;
-       u32                     fifo_len;
        bool                    non_contiguous_serdes_lane;
        /* RPM & CGX differs in number of Receive/transmit stats */
        u8                      rx_stats_cnt;
@@ -142,6 +141,10 @@ struct cgx {
        u8                      lmac_count;
        /* number of LMACs per MAC could be 4 or 8 */
        u8                      max_lmac_per_mac;
+       /* length of fifo varies depending on the number
+        * of LMACS
+        */
+       u32                     fifo_len;
 #define MAX_LMAC_COUNT         8
        struct lmac             *lmac_idmap[MAX_LMAC_COUNT];
        struct                  work_struct cgx_cmd_work;
index 9e8c5e4389f8bae371d80f9db51589418ee33a89..22dd50a3fcd3ac3c4238126f9c27d438b14cddb9 100644 (file)
@@ -480,7 +480,7 @@ u32 rpm_get_lmac_fifo_len(void *rpmd, int lmac_id)
        u8 num_lmacs;
        u32 fifo_len;
 
-       fifo_len = rpm->mac_ops->fifo_len;
+       fifo_len = rpm->fifo_len;
        num_lmacs = rpm->mac_ops->get_nr_lmacs(rpm);
 
        switch (num_lmacs) {
@@ -533,9 +533,9 @@ u32 rpm2_get_lmac_fifo_len(void *rpmd, int lmac_id)
         */
        max_lmac = (rpm_read(rpm, 0, CGX_CONST) >> 24) & 0xFF;
        if (max_lmac > 4)
-               fifo_len = rpm->mac_ops->fifo_len / 2;
+               fifo_len = rpm->fifo_len / 2;
        else
-               fifo_len = rpm->mac_ops->fifo_len;
+               fifo_len = rpm->fifo_len;
 
        if (lmac_id < 4) {
                num_lmacs = hweight8(lmac_info & 0xF);
index 266ecbc1b97a687e025e55df8af3b396b3034116..4dcd7bfcad4e41b8b0035f98150180dc83a9c412 100644 (file)
@@ -923,13 +923,12 @@ int rvu_mbox_handler_cgx_features_get(struct rvu *rvu,
 
 u32 rvu_cgx_get_fifolen(struct rvu *rvu)
 {
-       struct mac_ops *mac_ops;
-       u32 fifo_len;
+       void *cgxd = rvu_first_cgx_pdata(rvu);
 
-       mac_ops = get_mac_ops(rvu_first_cgx_pdata(rvu));
-       fifo_len = mac_ops ? mac_ops->fifo_len : 0;
+       if (!cgxd)
+               return 0;
 
-       return fifo_len;
+       return cgx_get_fifo_len(cgxd);
 }
 
 u32 rvu_cgx_get_lmac_fifolen(struct rvu *rvu, int cgx, int lmac)