dev_kfree_skb(skb);
 }
 
-static const struct mlxsw_rx_listener mlxsw_emad_rx_listener = {
-       .func = mlxsw_emad_rx_listener_func,
-       .local_port = MLXSW_PORT_DONT_CARE,
-       .trap_id = MLXSW_TRAP_ID_ETHEMAD,
-};
-
-static int mlxsw_emad_traps_set(struct mlxsw_core *mlxsw_core)
-{
-       char htgt_pl[MLXSW_REG_HTGT_LEN];
-       char hpkt_pl[MLXSW_REG_HPKT_LEN];
-       int err;
-
-       mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_EMAD);
-       err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
-       if (err)
-               return err;
-
-       mlxsw_reg_hpkt_pack(hpkt_pl, MLXSW_REG_HPKT_ACTION_TRAP_TO_CPU,
-                           MLXSW_TRAP_ID_ETHEMAD,
-                           MLXSW_REG_HTGT_TRAP_GROUP_EMAD, false);
-       return mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
-}
+static const struct mlxsw_listener mlxsw_emad_rx_listener =
+       MLXSW_RXL(mlxsw_emad_rx_listener_func, ETHEMAD, TRAP_TO_CPU, false,
+                 EMAD, DISCARD);
 
 static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
 {
        INIT_LIST_HEAD(&mlxsw_core->emad.trans_list);
        spin_lock_init(&mlxsw_core->emad.trans_list_lock);
 
-       err = mlxsw_core_rx_listener_register(mlxsw_core,
-                                             &mlxsw_emad_rx_listener,
-                                             mlxsw_core);
+       err = mlxsw_core_trap_register(mlxsw_core, &mlxsw_emad_rx_listener,
+                                      mlxsw_core);
        if (err)
                return err;
 
-       err = mlxsw_emad_traps_set(mlxsw_core);
+       err = mlxsw_core->driver->basic_trap_groups_set(mlxsw_core);
        if (err)
                goto err_emad_trap_set;
-
        mlxsw_core->emad.use_emad = true;
 
        return 0;
 
 err_emad_trap_set:
-       mlxsw_core_rx_listener_unregister(mlxsw_core,
-                                         &mlxsw_emad_rx_listener,
-                                         mlxsw_core);
+       mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,
+                                  mlxsw_core);
        return err;
 }
 
 static void mlxsw_emad_fini(struct mlxsw_core *mlxsw_core)
 {
-       char hpkt_pl[MLXSW_REG_HPKT_LEN];
 
        if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX))
                return;
 
        mlxsw_core->emad.use_emad = false;
-       mlxsw_reg_hpkt_pack(hpkt_pl, MLXSW_REG_HPKT_ACTION_DISCARD,
-                           MLXSW_TRAP_ID_ETHEMAD,
-                           MLXSW_REG_HTGT_TRAP_GROUP_EMAD, false);
-       mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
-
-       mlxsw_core_rx_listener_unregister(mlxsw_core,
-                                         &mlxsw_emad_rx_listener,
-                                         mlxsw_core);
+       mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,
+                                  mlxsw_core);
 }
 
 static struct sk_buff *mlxsw_emad_alloc(const struct mlxsw_core *mlxsw_core,
 
        int (*init)(struct mlxsw_core *mlxsw_core,
                    const struct mlxsw_bus_info *mlxsw_bus_info);
        void (*fini)(struct mlxsw_core *mlxsw_core);
+       int (*basic_trap_groups_set)(struct mlxsw_core *mlxsw_core);
        int (*port_type_set)(struct mlxsw_core *mlxsw_core, u8 local_port,
                             enum devlink_port_type new_type);
        int (*port_split)(struct mlxsw_core *mlxsw_core, u8 local_port,
 
        kfree(mlxsw_sp->lags);
 }
 
+static int mlxsw_sp_basic_trap_groups_set(struct mlxsw_core *mlxsw_core)
+{
+       char htgt_pl[MLXSW_REG_HTGT_LEN];
+
+       mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_EMAD);
+       return mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
+}
+
 static int mlxsw_sp_init(struct mlxsw_core *mlxsw_core,
                         const struct mlxsw_bus_info *mlxsw_bus_info)
 {
        .priv_size                      = sizeof(struct mlxsw_sp),
        .init                           = mlxsw_sp_init,
        .fini                           = mlxsw_sp_fini,
+       .basic_trap_groups_set          = mlxsw_sp_basic_trap_groups_set,
        .port_split                     = mlxsw_sp_port_split,
        .port_unsplit                   = mlxsw_sp_port_unsplit,
        .sb_pool_get                    = mlxsw_sp_sb_pool_get,
 
        }
 }
 
+static int mlxsw_sib_basic_trap_groups_set(struct mlxsw_core *mlxsw_core)
+{
+       char htgt_pl[MLXSW_REG_HTGT_LEN];
+
+       mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_EMAD);
+       return mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
+}
+
 static int mlxsw_sib_init(struct mlxsw_core *mlxsw_core,
                          const struct mlxsw_bus_info *mlxsw_bus_info)
 {
        .priv_size              = sizeof(struct mlxsw_sib),
        .init                   = mlxsw_sib_init,
        .fini                   = mlxsw_sib_fini,
+       .basic_trap_groups_set  = mlxsw_sib_basic_trap_groups_set,
        .txhdr_construct        = mlxsw_sib_tx_v1_hdr_construct,
        .txhdr_len              = MLXSW_TXHDR_LEN,
        .profile                = &mlxsw_sib_config_profile,
        .priv_size              = sizeof(struct mlxsw_sib),
        .init                   = mlxsw_sib_init,
        .fini                   = mlxsw_sib_fini,
+       .basic_trap_groups_set  = mlxsw_sib_basic_trap_groups_set,
        .txhdr_construct        = mlxsw_sib_tx_v1_hdr_construct,
        .txhdr_len              = MLXSW_TXHDR_LEN,
        .profile                = &mlxsw_sib_config_profile,
 
        return mlxsw_reg_write(mlxsw_sx->core, MLXSW_REG(sgcr), sgcr_pl);
 }
 
+static int mlxsw_sx_basic_trap_groups_set(struct mlxsw_core *mlxsw_core)
+{
+       char htgt_pl[MLXSW_REG_HTGT_LEN];
+
+       mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_EMAD);
+       return mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
+}
+
 static int mlxsw_sx_init(struct mlxsw_core *mlxsw_core,
                         const struct mlxsw_bus_info *mlxsw_bus_info)
 {
        .priv_size              = sizeof(struct mlxsw_sx),
        .init                   = mlxsw_sx_init,
        .fini                   = mlxsw_sx_fini,
+       .basic_trap_groups_set  = mlxsw_sx_basic_trap_groups_set,
        .txhdr_construct        = mlxsw_sx_txhdr_construct,
        .txhdr_len              = MLXSW_TXHDR_LEN,
        .profile                = &mlxsw_sx_config_profile,