struct mlxsw_sp_fib_key key;
        enum mlxsw_sp_fib_entry_type type;
        unsigned int ref_count;
-       u16 rif; /* used for action local */
        struct mlxsw_sp_vr *vr;
        struct fib_info *fi;
        struct list_head nexthop_group_node;
                                                */
        struct rhash_head ht_node;
        struct mlxsw_sp_nexthop_key key;
+       struct mlxsw_sp_rif *r;
        u8 should_offload:1, /* set indicates this neigh is connected and
                              * should be put to KVD linear area of this group.
                              */
        u16 ecmp_size;
        u16 count;
        struct mlxsw_sp_nexthop nexthops[0];
+#define nh_rif nexthops[0].r
 };
 
 static const struct rhashtable_params mlxsw_sp_nexthop_group_ht_params = {
 {
        struct mlxsw_sp_neigh_entry *neigh_entry;
        struct net_device *dev = fib_nh->nh_dev;
+       struct mlxsw_sp_rif *r;
        struct neighbour *n;
        u8 nud_state, dead;
        int err;
 
+       nh->nh_grp = nh_grp;
        nh->key.fib_nh = fib_nh;
        err = mlxsw_sp_nexthop_insert(mlxsw_sp, nh);
        if (err)
                return err;
 
+       r = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev);
+       if (!r)
+               return 0;
+       nh->r = r;
+
+       if (!nh_grp->gateway)
+               return 0;
+
        /* Take a reference of neigh here ensuring that neigh would
         * not be detructed before the nexthop entry is finished.
         * The reference is taken either in neigh_lookup() or
                list_add_tail(&neigh_entry->nexthop_neighs_list_node,
                              &mlxsw_sp->router.nexthop_neighs_list);
 
-       nh->nh_grp = nh_grp;
        nh->neigh_entry = neigh_entry;
        list_add_tail(&nh->neigh_list_node, &neigh_entry->nexthop_list);
        read_lock_bh(&n->lock);
        struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry;
        struct neighbour *n = neigh_entry->key.n;
 
+       if (!neigh_entry)
+               goto out;
+
        __mlxsw_sp_nexthop_neigh_update(nh, true);
        list_del(&nh->neigh_list_node);
        nh->neigh_entry = NULL;
 
        neigh_release(n);
 
+out:
        mlxsw_sp_nexthop_remove(mlxsw_sp, nh);
 }
 
                                        struct mlxsw_sp_fib_entry *fib_entry,
                                        enum mlxsw_reg_ralue_op op)
 {
+       struct mlxsw_sp_rif *r = fib_entry->nh_group->nh_rif;
        char ralue_pl[MLXSW_REG_RALUE_LEN];
        u32 *p_dip = (u32 *) fib_entry->key.addr;
        struct mlxsw_sp_vr *vr = fib_entry->vr;
                              vr->id, fib_entry->key.prefix_len, *p_dip);
        mlxsw_reg_ralue_act_local_pack(ralue_pl,
                                       MLXSW_REG_RALUE_TRAP_ACTION_NOP, 0,
-                                      fib_entry->rif);
+                                      r->rif);
        return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl);
 }
 
        struct fib_info *fi = fen_info->fi;
        struct mlxsw_sp_rif *r = NULL;
        int nhsel;
-       int err;
 
        if (fen_info->type == RTN_LOCAL || fen_info->type == RTN_BROADCAST) {
                fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_TRAP;
                return 0;
        }
 
-       if (fi->fib_nh->nh_scope != RT_SCOPE_LINK) {
+       if (fi->fib_nh->nh_scope != RT_SCOPE_LINK)
                fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_LOCAL;
-               fib_entry->rif = r->rif;
-       } else {
+       else
                fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_REMOTE;
-               err = mlxsw_sp_nexthop_group_get(mlxsw_sp, fib_entry, fi);
-               if (err)
-                       return err;
-       }
        fib_info_offload_inc(fen_info->fi);
        return 0;
 }
 {
        if (fib_entry->type != MLXSW_SP_FIB_ENTRY_TYPE_TRAP)
                fib_info_offload_dec(fib_entry->fi);
-       if (fib_entry->type == MLXSW_SP_FIB_ENTRY_TYPE_REMOTE)
-               mlxsw_sp_nexthop_group_put(mlxsw_sp, fib_entry);
 }
 
 static struct mlxsw_sp_fib_entry *
        if (err)
                goto err_fib4_entry_init;
 
+       err = mlxsw_sp_nexthop_group_get(mlxsw_sp, fib_entry, fi);
+       if (err)
+               goto err_nexthop_group_get;
+
        return fib_entry;
 
+err_nexthop_group_get:
+       mlxsw_sp_router_fib4_entry_fini(mlxsw_sp, fib_entry);
 err_fib4_entry_init:
        mlxsw_sp_fib_entry_destroy(fib_entry);
 err_fib_entry_create:
        struct mlxsw_sp_vr *vr = fib_entry->vr;
 
        if (--fib_entry->ref_count == 0) {
+               mlxsw_sp_nexthop_group_put(mlxsw_sp, fib_entry);
                mlxsw_sp_router_fib4_entry_fini(mlxsw_sp, fib_entry);
                mlxsw_sp_fib_entry_destroy(fib_entry);
        }