return mlxsw_sp_rx_listener_no_mark_func(skb, local_port, priv);
 }
 
-#define MLXSW_SP_RXL_NO_MARK(_trap_id, _action, _is_ctrl)              \
+#define MLXSW_SP_RXL_NO_MARK(_trap_id, _action, _trap_group, _is_ctrl) \
        MLXSW_RXL(mlxsw_sp_rx_listener_no_mark_func, _trap_id, _action, \
-                 _is_ctrl, RX, DISCARD)
+                 _is_ctrl, SP_##_trap_group, DISCARD)
 
-#define MLXSW_SP_RXL_MARK(_trap_id, _action, _is_ctrl)                 \
+#define MLXSW_SP_RXL_MARK(_trap_id, _action, _trap_group, _is_ctrl)    \
        MLXSW_RXL(mlxsw_sp_rx_listener_mark_func, _trap_id, _action,    \
-                 _is_ctrl, RX, DISCARD)
+               _is_ctrl, SP_##_trap_group, DISCARD)
+
+#define MLXSW_SP_EVENTL(_func, _trap_id)               \
+       MLXSW_EVENTL(_func, _trap_id, SP_EVENT)
 
 static const struct mlxsw_listener mlxsw_sp_listener[] = {
        /* Events */
-       MLXSW_EVENTL(mlxsw_sp_pude_event_func, PUDE, EMAD),
+       MLXSW_SP_EVENTL(mlxsw_sp_pude_event_func, PUDE),
        /* L2 traps */
-       MLXSW_SP_RXL_NO_MARK(STP, TRAP_TO_CPU, true),
-       MLXSW_SP_RXL_NO_MARK(LACP, TRAP_TO_CPU, true),
-       MLXSW_SP_RXL_NO_MARK(LLDP, TRAP_TO_CPU, true),
-       MLXSW_SP_RXL_MARK(DHCP, MIRROR_TO_CPU, false),
-       MLXSW_SP_RXL_MARK(IGMP_QUERY, MIRROR_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(IGMP_V1_REPORT, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(IGMP_V2_REPORT, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(IGMP_V2_LEAVE, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(IGMP_V3_REPORT, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_MARK(ARPBC, MIRROR_TO_CPU, false),
-       MLXSW_SP_RXL_MARK(ARPUC, MIRROR_TO_CPU, false),
+       MLXSW_SP_RXL_NO_MARK(STP, TRAP_TO_CPU, STP, true),
+       MLXSW_SP_RXL_NO_MARK(LACP, TRAP_TO_CPU, LACP, true),
+       MLXSW_SP_RXL_NO_MARK(LLDP, TRAP_TO_CPU, LLDP, true),
+       MLXSW_SP_RXL_MARK(DHCP, MIRROR_TO_CPU, DHCP, false),
+       MLXSW_SP_RXL_MARK(IGMP_QUERY, MIRROR_TO_CPU, IGMP, false),
+       MLXSW_SP_RXL_NO_MARK(IGMP_V1_REPORT, TRAP_TO_CPU, IGMP, false),
+       MLXSW_SP_RXL_NO_MARK(IGMP_V2_REPORT, TRAP_TO_CPU, IGMP, false),
+       MLXSW_SP_RXL_NO_MARK(IGMP_V2_LEAVE, TRAP_TO_CPU, IGMP, false),
+       MLXSW_SP_RXL_NO_MARK(IGMP_V3_REPORT, TRAP_TO_CPU, IGMP, false),
+       MLXSW_SP_RXL_MARK(ARPBC, MIRROR_TO_CPU, ARP, false),
+       MLXSW_SP_RXL_MARK(ARPUC, MIRROR_TO_CPU, ARP, false),
        /* L3 traps */
-       MLXSW_SP_RXL_NO_MARK(MTUERROR, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(TTLERROR, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(LBERROR, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_MARK(OSPF, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(IP2ME, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(RTR_INGRESS0, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_NO_MARK(HOST_MISS_IPV4, TRAP_TO_CPU, false),
-       MLXSW_SP_RXL_MARK(BGP_IPV4, TRAP_TO_CPU, false),
+       MLXSW_SP_RXL_NO_MARK(MTUERROR, TRAP_TO_CPU, ROUTER_EXP, false),
+       MLXSW_SP_RXL_NO_MARK(TTLERROR, TRAP_TO_CPU, ROUTER_EXP, false),
+       MLXSW_SP_RXL_NO_MARK(LBERROR, TRAP_TO_CPU, ROUTER_EXP, false),
+       MLXSW_SP_RXL_MARK(OSPF, TRAP_TO_CPU, OSPF, false),
+       MLXSW_SP_RXL_NO_MARK(IP2ME, TRAP_TO_CPU, IP2ME, false),
+       MLXSW_SP_RXL_NO_MARK(RTR_INGRESS0, TRAP_TO_CPU, REMOTE_ROUTE, false),
+       MLXSW_SP_RXL_NO_MARK(HOST_MISS_IPV4, TRAP_TO_CPU, ARP_MISS, false),
+       MLXSW_SP_RXL_NO_MARK(BGP_IPV4, TRAP_TO_CPU, BGP_IPV4, false),
 };
 
 static int mlxsw_sp_trap_groups_set(struct mlxsw_core *mlxsw_core)
 {
        char htgt_pl[MLXSW_REG_HTGT_LEN];
+       enum mlxsw_reg_htgt_trap_group i;
        int max_trap_groups;
        u8 priority, tc;
-       int i, err;
+       int err;
 
        if (!MLXSW_CORE_RES_VALID(mlxsw_core, MAX_TRAP_GROUPS))
                return -EIO;
 
        for (i = 0; i < max_trap_groups; i++) {
                switch (i) {
-               case MLXSW_REG_HTGT_TRAP_GROUP_EMAD:
-               case MLXSW_REG_HTGT_TRAP_GROUP_RX:
-               case MLXSW_REG_HTGT_TRAP_GROUP_CTRL:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_STP:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_LACP:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_LLDP:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_OSPF:
+                       priority = 5;
+                       tc = 5;
+                       break;
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_BGP_IPV4:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_DHCP:
+                       priority = 4;
+                       tc = 4;
+                       break;
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_IGMP:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME:
+                       priority = 3;
+                       tc = 3;
+                       break;
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_ARP:
+                       priority = 2;
+                       tc = 2;
+                       break;
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_ARP_MISS:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_ROUTER_EXP:
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_REMOTE_ROUTE:
+                       priority = 1;
+                       tc = 1;
+                       break;
+               case MLXSW_REG_HTGT_TRAP_GROUP_SP_EVENT:
                        priority = MLXSW_REG_HTGT_DEFAULT_PRIORITY;
                        tc = MLXSW_REG_HTGT_DEFAULT_TC;
                        break;
                default:
                        continue;
                }
+
                mlxsw_reg_htgt_pack(htgt_pl, i, MLXSW_REG_HTGT_INVALID_POLICER,
                                    priority, tc);
                err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);