struct work_struct         update_carrier_work;
        struct work_struct         set_rx_mode_work;
        struct work_struct         tx_timeout_work;
-       struct delayed_work        update_stats_work;
+       struct work_struct         update_stats_work;
 
        struct mlx5_core_dev      *mdev;
        struct net_device         *netdev;
 int mlx5e_close(struct net_device *netdev);
 int mlx5e_open(struct net_device *netdev);
 
+void mlx5e_queue_update_stats(struct mlx5e_priv *priv);
 int mlx5e_bits_invert(unsigned long a, int size);
 
 typedef int (*change_hw_mtu_cb)(struct mlx5e_priv *priv);
 
 
 static void mlx5e_update_stats_work(struct work_struct *work)
 {
-       struct delayed_work *dwork = to_delayed_work(work);
-       struct mlx5e_priv *priv = container_of(dwork, struct mlx5e_priv,
+       struct mlx5e_priv *priv = container_of(work, struct mlx5e_priv,
                                               update_stats_work);
 
        mutex_lock(&priv->state_lock);
        mutex_unlock(&priv->state_lock);
 }
 
+void mlx5e_queue_update_stats(struct mlx5e_priv *priv)
+{
+       if (!priv->profile->update_stats)
+               return;
+
+       if (unlikely(test_bit(MLX5E_STATE_DESTROYING, &priv->state)))
+               return;
+
+       queue_work(priv->wq, &priv->update_stats_work);
+}
+
 static void mlx5e_async_event(struct mlx5_core_dev *mdev, void *vpriv,
                              enum mlx5_dev_event event, unsigned long param)
 {
        if (priv->profile->update_carrier)
                priv->profile->update_carrier(priv);
 
-       if (priv->profile->update_stats)
-               queue_delayed_work(priv->wq, &priv->update_stats_work, 0);
-
+       mlx5e_queue_update_stats(priv);
        return 0;
 
 err_clear_state_opened_flag:
        struct mlx5e_pport_stats *pstats = &priv->stats.pport;
 
        /* update HW stats in background for next time */
-       queue_delayed_work(priv->wq, &priv->update_stats_work, 0);
+       mlx5e_queue_update_stats(priv);
 
        if (mlx5e_is_uplink_rep(priv)) {
                stats->rx_packets = PPORT_802_3_GET(pstats, a_frames_received_ok);
        INIT_WORK(&priv->update_carrier_work, mlx5e_update_carrier_work);
        INIT_WORK(&priv->set_rx_mode_work, mlx5e_set_rx_mode_work);
        INIT_WORK(&priv->tx_timeout_work, mlx5e_tx_timeout_work);
-       INIT_DELAYED_WORK(&priv->update_stats_work, mlx5e_update_stats_work);
+       INIT_WORK(&priv->update_stats_work, mlx5e_update_stats_work);
 
        priv->wq = create_singlethread_workqueue("mlx5e");
        if (!priv->wq)
 
        profile->cleanup_rx(priv);
        profile->cleanup_tx(priv);
-       cancel_delayed_work_sync(&priv->update_stats_work);
+       cancel_work_sync(&priv->update_stats_work);
 }
 
 void mlx5e_destroy_netdev(struct mlx5e_priv *priv)