]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
eth: fbnic: factor out clearing the action TCAM
authorJakub Kicinski <kuba@kernel.org>
Tue, 16 Sep 2025 23:14:14 +0000 (16:14 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 18 Sep 2025 09:37:23 +0000 (11:37 +0200)
We'll want to wipe the driver TCAM state after FW crash, to force
a re-programming. Factor out the clearing logic. Remove the micro-
-optimization to skip clearing the BMC entry twice, it doesn't hurt.

Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Link: https://patch.msgid.link/20250916231420.1693955-4-kuba@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/meta/fbnic/fbnic_rpc.c

index 4284b3cb7fccfd4208cdbf58e26f30316a139624..d944d0fdd3b7096f2658e2141f55d4a15fc87c19 100644 (file)
@@ -1124,13 +1124,25 @@ void fbnic_write_ip_addr(struct fbnic_dev *fbd)
        }
 }
 
-void fbnic_clear_rules(struct fbnic_dev *fbd)
+static void fbnic_clear_valid_act_tcam(struct fbnic_dev *fbd)
 {
-       u32 dest = FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK,
-                             FBNIC_RPC_ACT_TBL0_DEST_BMC);
        int i = FBNIC_RPC_TCAM_ACT_NUM_ENTRIES - 1;
        struct fbnic_act_tcam *act_tcam;
 
+       /* Work from the bottom up deleting all other rules from hardware */
+       do {
+               act_tcam = &fbd->act_tcam[i];
+
+               if (act_tcam->state != FBNIC_TCAM_S_VALID)
+                       continue;
+
+               fbnic_clear_act_tcam(fbd, i);
+               act_tcam->state = FBNIC_TCAM_S_UPDATE;
+       } while (i--);
+}
+
+void fbnic_clear_rules(struct fbnic_dev *fbd)
+{
        /* Clear MAC rules */
        fbnic_clear_macda(fbd);
 
@@ -1145,6 +1157,11 @@ void fbnic_clear_rules(struct fbnic_dev *fbd)
         * the interface back up.
         */
        if (fbnic_bmc_present(fbd)) {
+               u32 dest = FIELD_PREP(FBNIC_RPC_ACT_TBL0_DEST_MASK,
+                                     FBNIC_RPC_ACT_TBL0_DEST_BMC);
+               int i = FBNIC_RPC_TCAM_ACT_NUM_ENTRIES - 1;
+               struct fbnic_act_tcam *act_tcam;
+
                act_tcam = &fbd->act_tcam[i];
 
                if (act_tcam->state == FBNIC_TCAM_S_VALID &&
@@ -1153,21 +1170,10 @@ void fbnic_clear_rules(struct fbnic_dev *fbd)
                        wr32(fbd, FBNIC_RPC_ACT_TBL1(i), 0);
 
                        act_tcam->state = FBNIC_TCAM_S_UPDATE;
-
-                       i--;
                }
        }
 
-       /* Work from the bottom up deleting all other rules from hardware */
-       do {
-               act_tcam = &fbd->act_tcam[i];
-
-               if (act_tcam->state != FBNIC_TCAM_S_VALID)
-                       continue;
-
-               fbnic_clear_act_tcam(fbd, i);
-               act_tcam->state = FBNIC_TCAM_S_UPDATE;
-       } while (i--);
+       fbnic_clear_valid_act_tcam(fbd);
 }
 
 static void fbnic_delete_act_tcam(struct fbnic_dev *fbd, unsigned int idx)