}
 }
 
+static int mlxsw_sp_adj_trap_entry_init(struct mlxsw_sp *mlxsw_sp)
+{
+       enum mlxsw_reg_ratr_trap_action trap_action;
+       char ratr_pl[MLXSW_REG_RATR_LEN];
+       int err;
+
+       err = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1,
+                                 &mlxsw_sp->router->adj_trap_index);
+       if (err)
+               return err;
+
+       trap_action = MLXSW_REG_RATR_TRAP_ACTION_TRAP;
+       mlxsw_reg_ratr_pack(ratr_pl, MLXSW_REG_RATR_OP_WRITE_WRITE_ENTRY, true,
+                           MLXSW_REG_RATR_TYPE_ETHERNET,
+                           mlxsw_sp->router->adj_trap_index,
+                           mlxsw_sp->router->lb_rif_index);
+       mlxsw_reg_ratr_trap_action_set(ratr_pl, trap_action);
+       mlxsw_reg_ratr_trap_id_set(ratr_pl, MLXSW_TRAP_ID_RTR_EGRESS0);
+       err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ratr), ratr_pl);
+       if (err)
+               goto err_ratr_write;
+
+       return 0;
+
+err_ratr_write:
+       mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1,
+                          mlxsw_sp->router->adj_trap_index);
+       return err;
+}
+
+static void mlxsw_sp_adj_trap_entry_fini(struct mlxsw_sp *mlxsw_sp)
+{
+       mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1,
+                          mlxsw_sp->router->adj_trap_index);
+}
+
+static int mlxsw_sp_nexthop_group_inc(struct mlxsw_sp *mlxsw_sp)
+{
+       int err;
+
+       if (refcount_inc_not_zero(&mlxsw_sp->router->num_groups))
+               return 0;
+
+       err = mlxsw_sp_adj_trap_entry_init(mlxsw_sp);
+       if (err)
+               return err;
+
+       refcount_set(&mlxsw_sp->router->num_groups, 1);
+
+       return 0;
+}
+
+static void mlxsw_sp_nexthop_group_dec(struct mlxsw_sp *mlxsw_sp)
+{
+       if (!refcount_dec_and_test(&mlxsw_sp->router->num_groups))
+               return;
+
+       mlxsw_sp_adj_trap_entry_fini(mlxsw_sp);
+}
+
 static void
 mlxsw_sp_nh_grp_activity_get(struct mlxsw_sp *mlxsw_sp,
                             const struct mlxsw_sp_nexthop_group *nh_grp,
                if (err)
                        goto err_nexthop_obj_init;
        }
+       err = mlxsw_sp_nexthop_group_inc(mlxsw_sp);
+       if (err)
+               goto err_group_inc;
        err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
        if (err) {
                NL_SET_ERR_MSG_MOD(info->extack, "Failed to write adjacency entries to the device");
        return 0;
 
 err_group_refresh:
+       mlxsw_sp_nexthop_group_dec(mlxsw_sp);
+err_group_inc:
        i = nhgi->count;
 err_nexthop_obj_init:
        for (i--; i >= 0; i--) {
                        cancel_delayed_work(&router->nh_grp_activity_dw);
        }
 
+       mlxsw_sp_nexthop_group_dec(mlxsw_sp);
        for (i = nhgi->count - 1; i >= 0; i--) {
                struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i];
 
                if (err)
                        goto err_nexthop4_init;
        }
+       err = mlxsw_sp_nexthop_group_inc(mlxsw_sp);
+       if (err)
+               goto err_group_inc;
        err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
        if (err)
                goto err_group_refresh;
        return 0;
 
 err_group_refresh:
+       mlxsw_sp_nexthop_group_dec(mlxsw_sp);
+err_group_inc:
        i = nhgi->count;
 err_nexthop4_init:
        for (i--; i >= 0; i--) {
        struct mlxsw_sp_nexthop_group_info *nhgi = nh_grp->nhgi;
        int i;
 
+       mlxsw_sp_nexthop_group_dec(mlxsw_sp);
        for (i = nhgi->count - 1; i >= 0; i--) {
                struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i];
 
                mlxsw_sp_rt6 = list_next_entry(mlxsw_sp_rt6, list);
        }
        nh_grp->nhgi = nhgi;
+       err = mlxsw_sp_nexthop_group_inc(mlxsw_sp);
+       if (err)
+               goto err_group_inc;
        err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
        if (err)
                goto err_group_refresh;
        return 0;
 
 err_group_refresh:
+       mlxsw_sp_nexthop_group_dec(mlxsw_sp);
+err_group_inc:
        i = nhgi->count;
 err_nexthop6_init:
        for (i--; i >= 0; i--) {
        struct mlxsw_sp_nexthop_group_info *nhgi = nh_grp->nhgi;
        int i;
 
+       mlxsw_sp_nexthop_group_dec(mlxsw_sp);
        for (i = nhgi->count - 1; i >= 0; i--) {
                struct mlxsw_sp_nexthop *nh = &nhgi->nexthops[i];