]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
octeontx2-af: npc: cn20k: Fix MCAM actions read
authorRatheesh Kannoth <rkannoth@marvell.com>
Wed, 29 Apr 2026 02:27:19 +0000 (07:57 +0530)
committerJakub Kicinski <kuba@kernel.org>
Fri, 1 May 2026 01:50:16 +0000 (18:50 -0700)
npc_cn20k_read_mcam_entry() always reloaded action and vtag_action from
bank 0 after programming the CAM words. Use the bank returned by
npc_get_bank() for the ACTION reads as well, and read those registers once
up front so both X2 and X4 paths share the same metadata.

Return directly from the X2 keyword path now that the action fields are
already populated.

Cc: Suman Ghosh <sumang@marvell.com>
Fixes: 6d1e70282f76 ("octeontx2-af: npc: cn20k: Use common APIs")
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
Link: https://patch.msgid.link/20260429022722.1110289-8-rkannoth@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c

index 4773277fd4098830d21027be14cc7be885e41c0a..bb0a9ac7aab3ba5cc8ad20d7191d6b7443b84350 100644 (file)
@@ -1219,6 +1219,18 @@ int npc_cn20k_read_mcam_entry(struct rvu *rvu, int blkaddr, u16 index,
        bank = npc_get_bank(mcam, index);
        index &= (mcam->banksize - 1);
 
+       cfg = rvu_read64(rvu, blkaddr,
+                        NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(index, bank, 0));
+       entry->action = cfg;
+
+       cfg = rvu_read64(rvu, blkaddr,
+                        NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(index, bank, 1));
+       entry->vtag_action = cfg;
+
+       cfg = rvu_read64(rvu, blkaddr,
+                        NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(index, bank, 2));
+       entry->action2 = cfg;
+
        cfg = rvu_read64(rvu, blkaddr,
                         NPC_AF_CN20K_MCAMEX_BANKX_CAMX_INTF_EXT(index,
                                                                 bank, 1)) & 3;
@@ -1268,7 +1280,7 @@ int npc_cn20k_read_mcam_entry(struct rvu *rvu, int blkaddr, u16 index,
                                                                        bank,
                                                                        0));
                npc_cn20k_fill_entryword(entry, kw + 3, cam0, cam1);
-               goto read_action;
+               return 0;
        }
 
        for (bank = 0; bank < mcam->banks_per_entry; bank++, kw = kw + 4) {
@@ -1313,18 +1325,6 @@ int npc_cn20k_read_mcam_entry(struct rvu *rvu, int blkaddr, u16 index,
                npc_cn20k_fill_entryword(entry, kw + 3, cam0, cam1);
        }
 
-read_action:
-       /* 'action' is set to same value for both bank '0' and '1'.
-        * Hence, reading bank '0' should be enough.
-        */
-       cfg = rvu_read64(rvu, blkaddr,
-                        NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(index, 0, 0));
-       entry->action = cfg;
-
-       cfg = rvu_read64(rvu, blkaddr,
-                        NPC_AF_CN20K_MCAMEX_BANKX_ACTIONX_EXT(index, 0, 1));
-       entry->vtag_action = cfg;
-
        return 0;
 }