struct list_head nexthop_list; /* list of nexthops using
                                        * this neigh entry
                                        */
+       struct list_head nexthop_neighs_list_node;
 };
 
 static const struct rhashtable_params mlxsw_sp_neigh_ht_params = {
        }
 }
 
-static void
-mlxsw_sp_router_neighs_update_work_schedule(struct mlxsw_sp *mlxsw_sp)
+static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp)
 {
-       unsigned long interval = mlxsw_sp->router.neighs_update.interval;
-
-       mlxsw_core_schedule_dw(&mlxsw_sp->router.neighs_update.dw,
-                              msecs_to_jiffies(interval));
-}
-
-static void mlxsw_sp_router_neighs_update_work(struct work_struct *work)
-{
-       struct mlxsw_sp *mlxsw_sp;
        char *rauhtd_pl;
        u8 num_rec;
        int i, err;
 
        rauhtd_pl = kmalloc(MLXSW_REG_RAUHTD_LEN, GFP_KERNEL);
        if (!rauhtd_pl)
-               return;
-
-       mlxsw_sp = container_of(work, struct mlxsw_sp,
-                               router.neighs_update.dw.work);
+               return -ENOMEM;
 
        /* Make sure the neighbour's netdev isn't removed in the
         * process.
        rtnl_unlock();
 
        kfree(rauhtd_pl);
+       return err;
+}
+
+static void mlxsw_sp_router_neighs_update_nh(struct mlxsw_sp *mlxsw_sp)
+{
+       struct mlxsw_sp_neigh_entry *neigh_entry;
+
+       /* Take RTNL mutex here to prevent lists from changes */
+       rtnl_lock();
+       list_for_each_entry(neigh_entry, &mlxsw_sp->router.nexthop_neighs_list,
+                           nexthop_neighs_list_node) {
+               /* If this neigh have nexthops, make the kernel think this neigh
+                * is active regardless of the traffic.
+                */
+               if (!list_empty(&neigh_entry->nexthop_list))
+                       neigh_event_send(neigh_entry->n, NULL);
+       }
+       rtnl_unlock();
+}
+
+static void
+mlxsw_sp_router_neighs_update_work_schedule(struct mlxsw_sp *mlxsw_sp)
+{
+       unsigned long interval = mlxsw_sp->router.neighs_update.interval;
+
+       mlxsw_core_schedule_dw(&mlxsw_sp->router.neighs_update.dw,
+                              msecs_to_jiffies(interval));
+}
+
+static void mlxsw_sp_router_neighs_update_work(struct work_struct *work)
+{
+       struct mlxsw_sp *mlxsw_sp = container_of(work, struct mlxsw_sp,
+                                                router.neighs_update.dw.work);
+       int err;
+
+       err = mlxsw_sp_router_neighs_update_rauhtd(mlxsw_sp);
+       if (err)
+               dev_err(mlxsw_sp->bus_info->dev, "Could not update kernel for neigh activity");
+
+       mlxsw_sp_router_neighs_update_nh(mlxsw_sp);
+
        mlxsw_sp_router_neighs_update_work_schedule(mlxsw_sp);
 }
 
                n = neigh_entry->n;
                neigh_clone(n);
        }
+
+       /* If that is the first nexthop connected to that neigh, add to
+        * nexthop_neighs_list
+        */
+       if (list_empty(&neigh_entry->nexthop_list))
+               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);
        struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry;
 
        list_del(&nh->neigh_list_node);
+
+       /* If that is the last nexthop connected to that neigh, remove from
+        * nexthop_neighs_list
+        */
+       if (list_empty(&nh->neigh_entry->nexthop_list))
+               list_del(&nh->neigh_entry->nexthop_neighs_list_node);
+
        neigh_release(neigh_entry->n);
 }
 
 {
        int err;
 
+       INIT_LIST_HEAD(&mlxsw_sp->router.nexthop_neighs_list);
        INIT_LIST_HEAD(&mlxsw_sp->router.nexthop_group_list);
        err = __mlxsw_sp_router_init(mlxsw_sp);
        if (err)