mlxsw: spectrum_trap: Switch to use correct packet trap group
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlxsw / spectrum.c
index 7358b5b..8e4f334 100644 (file)
@@ -43,6 +43,7 @@
 #include "spectrum_acl_flex_actions.h"
 #include "spectrum_span.h"
 #include "spectrum_ptp.h"
+#include "spectrum_trap.h"
 #include "../mlxfw/mlxfw.h"
 
 #define MLXSW_SP1_FWREV_MAJOR 13
@@ -347,19 +348,6 @@ static void mlxsw_sp_fsm_release(struct mlxfw_dev *mlxfw_dev, u32 fwhandle)
        mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(mcc), mcc_pl);
 }
 
-static void mlxsw_sp_status_notify(struct mlxfw_dev *mlxfw_dev,
-                                  const char *msg, const char *comp_name,
-                                  u32 done_bytes, u32 total_bytes)
-{
-       struct mlxsw_sp_mlxfw_dev *mlxsw_sp_mlxfw_dev =
-               container_of(mlxfw_dev, struct mlxsw_sp_mlxfw_dev, mlxfw_dev);
-       struct mlxsw_sp *mlxsw_sp = mlxsw_sp_mlxfw_dev->mlxsw_sp;
-
-       devlink_flash_update_status_notify(priv_to_devlink(mlxsw_sp->core),
-                                          msg, comp_name,
-                                          done_bytes, total_bytes);
-}
-
 static const struct mlxfw_dev_ops mlxsw_sp_mlxfw_dev_ops = {
        .component_query        = mlxsw_sp_component_query,
        .fsm_lock               = mlxsw_sp_fsm_lock,
@@ -370,7 +358,6 @@ static const struct mlxfw_dev_ops mlxsw_sp_mlxfw_dev_ops = {
        .fsm_query_state        = mlxsw_sp_fsm_query_state,
        .fsm_cancel             = mlxsw_sp_fsm_cancel,
        .fsm_release            = mlxsw_sp_fsm_release,
-       .status_notify          = mlxsw_sp_status_notify,
 };
 
 static int mlxsw_sp_firmware_flash(struct mlxsw_sp *mlxsw_sp,
@@ -382,16 +369,15 @@ static int mlxsw_sp_firmware_flash(struct mlxsw_sp *mlxsw_sp,
                        .ops = &mlxsw_sp_mlxfw_dev_ops,
                        .psid = mlxsw_sp->bus_info->psid,
                        .psid_size = strlen(mlxsw_sp->bus_info->psid),
+                       .devlink = priv_to_devlink(mlxsw_sp->core),
                },
                .mlxsw_sp = mlxsw_sp
        };
        int err;
 
        mlxsw_core_fw_flash_start(mlxsw_sp->core);
-       devlink_flash_update_begin_notify(priv_to_devlink(mlxsw_sp->core));
        err = mlxfw_firmware_flash(&mlxsw_sp_mlxfw_dev.mlxfw_dev,
                                   firmware, extack);
-       devlink_flash_update_end_notify(priv_to_devlink(mlxsw_sp->core));
        mlxsw_core_fw_flash_end(mlxsw_sp->core);
 
        return err;
@@ -1798,6 +1784,8 @@ static int mlxsw_sp_setup_tc(struct net_device *dev, enum tc_setup_type type,
                return mlxsw_sp_setup_tc_ets(mlxsw_sp_port, type_data);
        case TC_SETUP_QDISC_TBF:
                return mlxsw_sp_setup_tc_tbf(mlxsw_sp_port, type_data);
+       case TC_SETUP_QDISC_FIFO:
+               return mlxsw_sp_setup_tc_fifo(mlxsw_sp_port, type_data);
        default:
                return -EOPNOTSUPP;
        }
@@ -2243,6 +2231,15 @@ static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_rfc_3635_stats[] = {
 #define MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN \
        ARRAY_SIZE(mlxsw_sp_port_hw_rfc_3635_stats)
 
+static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_ext_stats[] = {
+       {
+               .str = "ecn_marked",
+               .getter = mlxsw_reg_ppcnt_ecn_marked_get,
+       },
+};
+
+#define MLXSW_SP_PORT_HW_EXT_STATS_LEN ARRAY_SIZE(mlxsw_sp_port_hw_ext_stats)
+
 static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_discard_stats[] = {
        {
                .str = "discard_ingress_general",
@@ -2352,6 +2349,7 @@ static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_tc_stats[] = {
                                         MLXSW_SP_PORT_HW_RFC_2863_STATS_LEN + \
                                         MLXSW_SP_PORT_HW_RFC_2819_STATS_LEN + \
                                         MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN + \
+                                        MLXSW_SP_PORT_HW_EXT_STATS_LEN + \
                                         MLXSW_SP_PORT_HW_DISCARD_STATS_LEN + \
                                         (MLXSW_SP_PORT_HW_PRIO_STATS_LEN * \
                                          IEEE_8021QAZ_MAX_TCS) + \
@@ -2413,6 +2411,12 @@ static void mlxsw_sp_port_get_strings(struct net_device *dev,
                        p += ETH_GSTRING_LEN;
                }
 
+               for (i = 0; i < MLXSW_SP_PORT_HW_EXT_STATS_LEN; i++) {
+                       memcpy(p, mlxsw_sp_port_hw_ext_stats[i].str,
+                              ETH_GSTRING_LEN);
+                       p += ETH_GSTRING_LEN;
+               }
+
                for (i = 0; i < MLXSW_SP_PORT_HW_DISCARD_STATS_LEN; i++) {
                        memcpy(p, mlxsw_sp_port_hw_discard_stats[i].str,
                               ETH_GSTRING_LEN);
@@ -2474,6 +2478,10 @@ mlxsw_sp_get_hw_stats_by_group(struct mlxsw_sp_port_hw_stats **p_hw_stats,
                *p_hw_stats = mlxsw_sp_port_hw_rfc_3635_stats;
                *p_len = MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN;
                break;
+       case MLXSW_REG_PPCNT_EXT_CNT:
+               *p_hw_stats = mlxsw_sp_port_hw_ext_stats;
+               *p_len = MLXSW_SP_PORT_HW_EXT_STATS_LEN;
+               break;
        case MLXSW_REG_PPCNT_DISCARD_CNT:
                *p_hw_stats = mlxsw_sp_port_hw_discard_stats;
                *p_len = MLXSW_SP_PORT_HW_DISCARD_STATS_LEN;
@@ -2543,6 +2551,11 @@ static void mlxsw_sp_port_get_stats(struct net_device *dev,
                                  data, data_index);
        data_index += MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN;
 
+       /* Extended Counters */
+       __mlxsw_sp_port_get_stats(dev, MLXSW_REG_PPCNT_EXT_CNT, 0,
+                                 data, data_index);
+       data_index += MLXSW_SP_PORT_HW_EXT_STATS_LEN;
+
        /* Discard Counters */
        __mlxsw_sp_port_get_stats(dev, MLXSW_REG_PPCNT_DISCARD_CNT, 0,
                                  data, data_index);
@@ -2788,27 +2801,6 @@ static u32 mlxsw_sp1_to_ptys_speed(struct mlxsw_sp *mlxsw_sp, u8 width,
        return ptys_proto;
 }
 
-static u32
-mlxsw_sp1_to_ptys_upper_speed(struct mlxsw_sp *mlxsw_sp, u32 upper_speed)
-{
-       u32 ptys_proto = 0;
-       int i;
-
-       for (i = 0; i < MLXSW_SP1_PORT_LINK_MODE_LEN; i++) {
-               if (mlxsw_sp1_port_link_mode[i].speed <= upper_speed)
-                       ptys_proto |= mlxsw_sp1_port_link_mode[i].mask;
-       }
-       return ptys_proto;
-}
-
-static int
-mlxsw_sp1_port_speed_base(struct mlxsw_sp *mlxsw_sp, u8 local_port,
-                         u32 *base_speed)
-{
-       *base_speed = MLXSW_SP_PORT_BASE_SPEED_25G;
-       return 0;
-}
-
 static void
 mlxsw_sp1_reg_ptys_eth_pack(struct mlxsw_sp *mlxsw_sp, char *payload,
                            u8 local_port, u32 proto_admin, bool autoneg)
@@ -2833,8 +2825,6 @@ mlxsw_sp1_port_type_speed_ops = {
        .from_ptys_speed_duplex         = mlxsw_sp1_from_ptys_speed_duplex,
        .to_ptys_advert_link            = mlxsw_sp1_to_ptys_advert_link,
        .to_ptys_speed                  = mlxsw_sp1_to_ptys_speed,
-       .to_ptys_upper_speed            = mlxsw_sp1_to_ptys_upper_speed,
-       .port_speed_base                = mlxsw_sp1_port_speed_base,
        .reg_ptys_eth_pack              = mlxsw_sp1_reg_ptys_eth_pack,
        .reg_ptys_eth_unpack            = mlxsw_sp1_reg_ptys_eth_unpack,
 };
@@ -3235,51 +3225,6 @@ static u32 mlxsw_sp2_to_ptys_speed(struct mlxsw_sp *mlxsw_sp,
        return ptys_proto;
 }
 
-static u32
-mlxsw_sp2_to_ptys_upper_speed(struct mlxsw_sp *mlxsw_sp, u32 upper_speed)
-{
-       u32 ptys_proto = 0;
-       int i;
-
-       for (i = 0; i < MLXSW_SP2_PORT_LINK_MODE_LEN; i++) {
-               if (mlxsw_sp2_port_link_mode[i].speed <= upper_speed)
-                       ptys_proto |= mlxsw_sp2_port_link_mode[i].mask;
-       }
-       return ptys_proto;
-}
-
-static int
-mlxsw_sp2_port_speed_base(struct mlxsw_sp *mlxsw_sp, u8 local_port,
-                         u32 *base_speed)
-{
-       char ptys_pl[MLXSW_REG_PTYS_LEN];
-       u32 eth_proto_cap;
-       int err;
-
-       /* In Spectrum-2, the speed of 1x can change from port to port, so query
-        * it from firmware.
-        */
-       mlxsw_reg_ptys_ext_eth_pack(ptys_pl, local_port, 0, false);
-       err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
-       if (err)
-               return err;
-       mlxsw_reg_ptys_ext_eth_unpack(ptys_pl, &eth_proto_cap, NULL, NULL);
-
-       if (eth_proto_cap &
-           MLXSW_REG_PTYS_EXT_ETH_SPEED_50GAUI_1_LAUI_1_50GBASE_CR_KR) {
-               *base_speed = MLXSW_SP_PORT_BASE_SPEED_50G;
-               return 0;
-       }
-
-       if (eth_proto_cap &
-           MLXSW_REG_PTYS_EXT_ETH_SPEED_25GAUI_1_25GBASE_CR_KR) {
-               *base_speed = MLXSW_SP_PORT_BASE_SPEED_25G;
-               return 0;
-       }
-
-       return -EIO;
-}
-
 static void
 mlxsw_sp2_reg_ptys_eth_pack(struct mlxsw_sp *mlxsw_sp, char *payload,
                            u8 local_port, u32 proto_admin,
@@ -3305,8 +3250,6 @@ mlxsw_sp2_port_type_speed_ops = {
        .from_ptys_speed_duplex         = mlxsw_sp2_from_ptys_speed_duplex,
        .to_ptys_advert_link            = mlxsw_sp2_to_ptys_advert_link,
        .to_ptys_speed                  = mlxsw_sp2_to_ptys_speed,
-       .to_ptys_upper_speed            = mlxsw_sp2_to_ptys_upper_speed,
-       .port_speed_base                = mlxsw_sp2_port_speed_base,
        .reg_ptys_eth_pack              = mlxsw_sp2_reg_ptys_eth_pack,
        .reg_ptys_eth_unpack            = mlxsw_sp2_reg_ptys_eth_unpack,
 };
@@ -3520,24 +3463,24 @@ static int
 mlxsw_sp_port_speed_by_width_set(struct mlxsw_sp_port *mlxsw_sp_port)
 {
        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
+       u32 eth_proto_cap, eth_proto_admin, eth_proto_oper;
        const struct mlxsw_sp_port_type_speed_ops *ops;
        char ptys_pl[MLXSW_REG_PTYS_LEN];
-       u32 eth_proto_admin;
-       u32 upper_speed;
-       u32 base_speed;
        int err;
 
        ops = mlxsw_sp->port_type_speed_ops;
 
-       err = ops->port_speed_base(mlxsw_sp, mlxsw_sp_port->local_port,
-                                  &base_speed);
+       /* Set advertised speeds to supported speeds. */
+       ops->reg_ptys_eth_pack(mlxsw_sp, ptys_pl, mlxsw_sp_port->local_port,
+                              0, false);
+       err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
        if (err)
                return err;
-       upper_speed = base_speed * mlxsw_sp_port->mapping.width;
 
-       eth_proto_admin = ops->to_ptys_upper_speed(mlxsw_sp, upper_speed);
+       ops->reg_ptys_eth_unpack(mlxsw_sp, ptys_pl, &eth_proto_cap,
+                                &eth_proto_admin, &eth_proto_oper);
        ops->reg_ptys_eth_pack(mlxsw_sp, ptys_pl, mlxsw_sp_port->local_port,
-                              eth_proto_admin, mlxsw_sp_port->link.autoneg);
+                              eth_proto_cap, mlxsw_sp_port->link.autoneg);
        return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
 }
 
@@ -4614,6 +4557,7 @@ static const struct mlxsw_listener mlxsw_sp1_listener[] = {
 
 static int mlxsw_sp_cpu_policers_set(struct mlxsw_core *mlxsw_core)
 {
+       struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
        char qpcr_pl[MLXSW_REG_QPCR_LEN];
        enum mlxsw_reg_qpcr_ir_units ir_units;
        int max_cpu_policers;
@@ -4636,7 +4580,6 @@ static int mlxsw_sp_cpu_policers_set(struct mlxsw_core *mlxsw_core)
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_LLDP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_OSPF:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_PIM:
-               case MLXSW_REG_HTGT_TRAP_GROUP_SP_RPF:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_LBERROR:
                        rate = 128;
                        burst_size = 7;
@@ -4649,7 +4592,6 @@ static int mlxsw_sp_cpu_policers_set(struct mlxsw_core *mlxsw_core)
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_BGP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_ARP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_DHCP:
-               case MLXSW_REG_HTGT_TRAP_GROUP_SP_HOST_MISS:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_ROUTER_EXP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_REMOTE_ROUTE:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_IPV6_ND:
@@ -4677,6 +4619,7 @@ static int mlxsw_sp_cpu_policers_set(struct mlxsw_core *mlxsw_core)
                        continue;
                }
 
+               __set_bit(i, mlxsw_sp->trap->policers_usage);
                mlxsw_reg_qpcr_pack(qpcr_pl, i, ir_units, is_bytes, rate,
                                    burst_size);
                err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(qpcr), qpcr_pl);
@@ -4729,19 +4672,20 @@ static int mlxsw_sp_trap_groups_set(struct mlxsw_core *mlxsw_core)
                        break;
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_ARP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_IPV6_ND:
-               case MLXSW_REG_HTGT_TRAP_GROUP_SP_RPF:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_PTP1:
                        priority = 2;
                        tc = 2;
                        break;
-               case MLXSW_REG_HTGT_TRAP_GROUP_SP_HOST_MISS:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_ROUTER_EXP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_REMOTE_ROUTE:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_MULTICAST:
-               case MLXSW_REG_HTGT_TRAP_GROUP_SP_LBERROR:
                        priority = 1;
                        tc = 1;
                        break;
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_LBERROR:
+                       priority = 0;
+                       tc = 1;
+                       break;
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_EVENT:
                        priority = MLXSW_REG_HTGT_DEFAULT_PRIORITY;
                        tc = MLXSW_REG_HTGT_DEFAULT_TC;
@@ -4805,20 +4749,32 @@ static void mlxsw_sp_traps_unregister(struct mlxsw_sp *mlxsw_sp,
 
 static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
 {
+       struct mlxsw_sp_trap *trap;
+       u64 max_policers;
        int err;
 
+       if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_CPU_POLICERS))
+               return -EIO;
+       max_policers = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_CPU_POLICERS);
+       trap = kzalloc(struct_size(trap, policers_usage,
+                                  BITS_TO_LONGS(max_policers)), GFP_KERNEL);
+       if (!trap)
+               return -ENOMEM;
+       trap->max_policers = max_policers;
+       mlxsw_sp->trap = trap;
+
        err = mlxsw_sp_cpu_policers_set(mlxsw_sp->core);
        if (err)
-               return err;
+               goto err_cpu_policers_set;
 
        err = mlxsw_sp_trap_groups_set(mlxsw_sp->core);
        if (err)
-               return err;
+               goto err_trap_groups_set;
 
        err = mlxsw_sp_traps_register(mlxsw_sp, mlxsw_sp_listener,
                                      ARRAY_SIZE(mlxsw_sp_listener));
        if (err)
-               return err;
+               goto err_traps_register;
 
        err = mlxsw_sp_traps_register(mlxsw_sp, mlxsw_sp->listeners,
                                      mlxsw_sp->listeners_count);
@@ -4830,6 +4786,10 @@ static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
 err_extra_traps_init:
        mlxsw_sp_traps_unregister(mlxsw_sp, mlxsw_sp_listener,
                                  ARRAY_SIZE(mlxsw_sp_listener));
+err_traps_register:
+err_trap_groups_set:
+err_cpu_policers_set:
+       kfree(trap);
        return err;
 }
 
@@ -4839,6 +4799,7 @@ static void mlxsw_sp_traps_fini(struct mlxsw_sp *mlxsw_sp)
                                  mlxsw_sp->listeners_count);
        mlxsw_sp_traps_unregister(mlxsw_sp, mlxsw_sp_listener,
                                  ARRAY_SIZE(mlxsw_sp_listener));
+       kfree(mlxsw_sp->trap);
 }
 
 #define MLXSW_SP_LAG_SEED_INIT 0xcafecafe
@@ -4935,16 +4896,35 @@ static const struct mlxsw_sp_span_ops mlxsw_sp1_span_ops = {
 };
 
 #define MLXSW_SP2_SPAN_EG_MIRROR_BUFFER_FACTOR 38
+#define MLXSW_SP3_SPAN_EG_MIRROR_BUFFER_FACTOR 50
+
+static u32 __mlxsw_sp_span_buffsize_get(int mtu, u32 speed, u32 buffer_factor)
+{
+       return 3 * mtu + buffer_factor * speed / 1000;
+}
 
 static u32 mlxsw_sp2_span_buffsize_get(int mtu, u32 speed)
 {
-       return 3 * mtu + MLXSW_SP2_SPAN_EG_MIRROR_BUFFER_FACTOR * speed / 1000;
+       int factor = MLXSW_SP2_SPAN_EG_MIRROR_BUFFER_FACTOR;
+
+       return __mlxsw_sp_span_buffsize_get(mtu, speed, factor);
 }
 
 static const struct mlxsw_sp_span_ops mlxsw_sp2_span_ops = {
        .buffsize_get = mlxsw_sp2_span_buffsize_get,
 };
 
+static u32 mlxsw_sp3_span_buffsize_get(int mtu, u32 speed)
+{
+       int factor = MLXSW_SP3_SPAN_EG_MIRROR_BUFFER_FACTOR;
+
+       return __mlxsw_sp_span_buffsize_get(mtu, speed, factor);
+}
+
+static const struct mlxsw_sp_span_ops mlxsw_sp3_span_ops = {
+       .buffsize_get = mlxsw_sp3_span_buffsize_get,
+};
+
 u32 mlxsw_sp_span_buffsize_get(struct mlxsw_sp *mlxsw_sp, int mtu, u32 speed)
 {
        u32 buffsize = mlxsw_sp->span_ops->buffsize_get(speed, mtu);
@@ -5223,7 +5203,7 @@ static int mlxsw_sp3_init(struct mlxsw_core *mlxsw_core,
        mlxsw_sp->sb_vals = &mlxsw_sp2_sb_vals;
        mlxsw_sp->port_type_speed_ops = &mlxsw_sp2_port_type_speed_ops;
        mlxsw_sp->ptp_ops = &mlxsw_sp2_ptp_ops;
-       mlxsw_sp->span_ops = &mlxsw_sp2_span_ops;
+       mlxsw_sp->span_ops = &mlxsw_sp3_span_ops;
        mlxsw_sp->lowest_shaper_bs = MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP3;
 
        return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
@@ -5460,8 +5440,13 @@ static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
        if (err)
                goto err_resources_span_register;
 
+       err = mlxsw_sp_counter_resources_register(mlxsw_core);
+       if (err)
+               goto err_resources_counter_register;
+
        return 0;
 
+err_resources_counter_register:
 err_resources_span_register:
        devlink_resources_unregister(priv_to_devlink(mlxsw_core), NULL);
        return err;
@@ -5479,8 +5464,13 @@ static int mlxsw_sp2_resources_register(struct mlxsw_core *mlxsw_core)
        if (err)
                goto err_resources_span_register;
 
+       err = mlxsw_sp_counter_resources_register(mlxsw_core);
+       if (err)
+               goto err_resources_counter_register;
+
        return 0;
 
+err_resources_counter_register:
 err_resources_span_register:
        devlink_resources_unregister(priv_to_devlink(mlxsw_core), NULL);
        return err;
@@ -5684,6 +5674,10 @@ static struct mlxsw_driver mlxsw_sp1_driver = {
        .trap_fini                      = mlxsw_sp_trap_fini,
        .trap_action_set                = mlxsw_sp_trap_action_set,
        .trap_group_init                = mlxsw_sp_trap_group_init,
+       .trap_policer_init              = mlxsw_sp_trap_policer_init,
+       .trap_policer_fini              = mlxsw_sp_trap_policer_fini,
+       .trap_policer_set               = mlxsw_sp_trap_policer_set,
+       .trap_policer_counter_get       = mlxsw_sp_trap_policer_counter_get,
        .txhdr_construct                = mlxsw_sp_txhdr_construct,
        .resources_register             = mlxsw_sp1_resources_register,
        .kvd_sizes_get                  = mlxsw_sp_kvd_sizes_get,
@@ -5718,6 +5712,10 @@ static struct mlxsw_driver mlxsw_sp2_driver = {
        .trap_fini                      = mlxsw_sp_trap_fini,
        .trap_action_set                = mlxsw_sp_trap_action_set,
        .trap_group_init                = mlxsw_sp_trap_group_init,
+       .trap_policer_init              = mlxsw_sp_trap_policer_init,
+       .trap_policer_fini              = mlxsw_sp_trap_policer_fini,
+       .trap_policer_set               = mlxsw_sp_trap_policer_set,
+       .trap_policer_counter_get       = mlxsw_sp_trap_policer_counter_get,
        .txhdr_construct                = mlxsw_sp_txhdr_construct,
        .resources_register             = mlxsw_sp2_resources_register,
        .params_register                = mlxsw_sp2_params_register,
@@ -5751,6 +5749,10 @@ static struct mlxsw_driver mlxsw_sp3_driver = {
        .trap_fini                      = mlxsw_sp_trap_fini,
        .trap_action_set                = mlxsw_sp_trap_action_set,
        .trap_group_init                = mlxsw_sp_trap_group_init,
+       .trap_policer_init              = mlxsw_sp_trap_policer_init,
+       .trap_policer_fini              = mlxsw_sp_trap_policer_fini,
+       .trap_policer_set               = mlxsw_sp_trap_policer_set,
+       .trap_policer_counter_get       = mlxsw_sp_trap_policer_counter_get,
        .txhdr_construct                = mlxsw_sp_txhdr_construct,
        .resources_register             = mlxsw_sp2_resources_register,
        .params_register                = mlxsw_sp2_params_register,
@@ -6316,7 +6318,7 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev,
                        return -EINVAL;
                }
                if (netif_is_macvlan(upper_dev) &&
-                   !mlxsw_sp_rif_find_by_dev(mlxsw_sp, lower_dev)) {
+                   !mlxsw_sp_rif_exists(mlxsw_sp, lower_dev)) {
                        NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces");
                        return -EOPNOTSUPP;
                }
@@ -6472,7 +6474,7 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev,
                        return -EINVAL;
                }
                if (netif_is_macvlan(upper_dev) &&
-                   !mlxsw_sp_rif_find_by_dev(mlxsw_sp, vlan_dev)) {
+                   !mlxsw_sp_rif_exists(mlxsw_sp, vlan_dev)) {
                        NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces");
                        return -EOPNOTSUPP;
                }
@@ -6549,7 +6551,7 @@ static int mlxsw_sp_netdevice_bridge_vlan_event(struct net_device *vlan_dev,
                if (!info->linking)
                        break;
                if (netif_is_macvlan(upper_dev) &&
-                   !mlxsw_sp_rif_find_by_dev(mlxsw_sp, vlan_dev)) {
+                   !mlxsw_sp_rif_exists(mlxsw_sp, vlan_dev)) {
                        NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces");
                        return -EOPNOTSUPP;
                }
@@ -6609,7 +6611,7 @@ static int mlxsw_sp_netdevice_bridge_event(struct net_device *br_dev,
                if (!info->linking)
                        break;
                if (netif_is_macvlan(upper_dev) &&
-                   !mlxsw_sp_rif_find_by_dev(mlxsw_sp, br_dev)) {
+                   !mlxsw_sp_rif_exists(mlxsw_sp, br_dev)) {
                        NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces");
                        return -EOPNOTSUPP;
                }