mlxsw_sp->afa_ops = &mlxsw_sp1_act_afa_ops;
        mlxsw_sp->afk_ops = &mlxsw_sp1_afk_ops;
        mlxsw_sp->mr_tcam_ops = &mlxsw_sp1_mr_tcam_ops;
+       mlxsw_sp->acl_rulei_ops = &mlxsw_sp1_acl_rulei_ops;
        mlxsw_sp->acl_tcam_ops = &mlxsw_sp1_acl_tcam_ops;
        mlxsw_sp->nve_ops_arr = mlxsw_sp1_nve_ops_arr;
        mlxsw_sp->mac_mask = mlxsw_sp1_mac_mask;
        mlxsw_sp->afa_ops = &mlxsw_sp2_act_afa_ops;
        mlxsw_sp->afk_ops = &mlxsw_sp2_afk_ops;
        mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
+       mlxsw_sp->acl_rulei_ops = &mlxsw_sp2_acl_rulei_ops;
        mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
        mlxsw_sp->nve_ops_arr = mlxsw_sp2_nve_ops_arr;
        mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
        mlxsw_sp->afa_ops = &mlxsw_sp2_act_afa_ops;
        mlxsw_sp->afk_ops = &mlxsw_sp2_afk_ops;
        mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
+       mlxsw_sp->acl_rulei_ops = &mlxsw_sp2_acl_rulei_ops;
        mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
        mlxsw_sp->nve_ops_arr = mlxsw_sp2_nve_ops_arr;
        mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
 
 struct mlxsw_sp_nve;
 struct mlxsw_sp_kvdl_ops;
 struct mlxsw_sp_mr_tcam_ops;
+struct mlxsw_sp_acl_rulei_ops;
 struct mlxsw_sp_acl_tcam_ops;
 struct mlxsw_sp_nve_ops;
 struct mlxsw_sp_sb_vals;
        const struct mlxsw_afa_ops *afa_ops;
        const struct mlxsw_afk_ops *afk_ops;
        const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops;
+       const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops;
        const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops;
        const struct mlxsw_sp_nve_ops **nve_ops_arr;
        const struct mlxsw_sp_rif_ops **rif_ops_arr;
 u32 mlxsw_sp_acl_region_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp);
 int mlxsw_sp_acl_region_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp, u32 val);
 
+struct mlxsw_sp_acl_mangle_action;
+
+struct mlxsw_sp_acl_rulei_ops {
+       int (*act_mangle_field)(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_acl_rule_info *rulei,
+                               struct mlxsw_sp_acl_mangle_action *mact, u32 val,
+                               struct netlink_ext_ack *extack);
+};
+
+extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp1_acl_rulei_ops;
+extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp2_acl_rulei_ops;
+
 /* spectrum_acl_tcam.c */
 struct mlxsw_sp_acl_tcam;
 struct mlxsw_sp_acl_tcam_region;
 
        case MLXSW_SP_ACL_MANGLE_FIELD_IP_ECN:
                return mlxsw_afa_block_append_qos_ecn(rulei->act_block,
                                                      val, extack);
+       default:
+               return -EOPNOTSUPP;
        }
+}
 
-       /* We shouldn't have gotten a match in the first place! */
-       WARN_ONCE(1, "Unhandled mangle field");
-       return -EINVAL;
+static int mlxsw_sp1_acl_rulei_act_mangle_field(struct mlxsw_sp *mlxsw_sp,
+                                               struct mlxsw_sp_acl_rule_info *rulei,
+                                               struct mlxsw_sp_acl_mangle_action *mact,
+                                               u32 val, struct netlink_ext_ack *extack)
+{
+       int err;
+
+       err = mlxsw_sp_acl_rulei_act_mangle_field(mlxsw_sp, rulei, mact, val, extack);
+       if (err != -EOPNOTSUPP)
+               return err;
+
+       NL_SET_ERR_MSG_MOD(extack, "Unsupported mangle field");
+       return err;
+}
+
+static int mlxsw_sp2_acl_rulei_act_mangle_field(struct mlxsw_sp *mlxsw_sp,
+                                               struct mlxsw_sp_acl_rule_info *rulei,
+                                               struct mlxsw_sp_acl_mangle_action *mact,
+                                               u32 val, struct netlink_ext_ack *extack)
+{
+       int err;
+
+       err = mlxsw_sp_acl_rulei_act_mangle_field(mlxsw_sp, rulei, mact, val, extack);
+       if (err != -EOPNOTSUPP)
+               return err;
+
+       NL_SET_ERR_MSG_MOD(extack, "Unsupported mangle field");
+       return err;
 }
 
 int mlxsw_sp_acl_rulei_act_mangle(struct mlxsw_sp *mlxsw_sp,
                                  u32 offset, u32 mask, u32 val,
                                  struct netlink_ext_ack *extack)
 {
+       const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops = mlxsw_sp->acl_rulei_ops;
        struct mlxsw_sp_acl_mangle_action *mact;
        size_t i;
 
                    mact->offset == offset &&
                    mact->mask == mask) {
                        val >>= mact->shift;
-                       return mlxsw_sp_acl_rulei_act_mangle_field(mlxsw_sp,
-                                                                  rulei, mact,
-                                                                  val, extack);
+                       return acl_rulei_ops->act_mangle_field(mlxsw_sp,
+                                                              rulei, mact,
+                                                              val, extack);
                }
        }
 
-       NL_SET_ERR_MSG_MOD(extack, "Unsupported mangle field");
+       NL_SET_ERR_MSG_MOD(extack, "Unknown mangle field");
        return -EINVAL;
 }
 
        return mlxsw_sp_acl_tcam_vregion_rehash_intrvl_set(mlxsw_sp,
                                                           &acl->tcam, val);
 }
+
+struct mlxsw_sp_acl_rulei_ops mlxsw_sp1_acl_rulei_ops = {
+       .act_mangle_field = mlxsw_sp1_acl_rulei_act_mangle_field,
+};
+
+struct mlxsw_sp_acl_rulei_ops mlxsw_sp2_acl_rulei_ops = {
+       .act_mangle_field = mlxsw_sp2_acl_rulei_act_mangle_field,
+};