health->timer.expires = jiffies + msecs_to_jiffies(poll_interval_ms);
        add_timer(&health->timer);
-
-       if (mlx5_core_is_pf(dev) && MLX5_CAP_MCAM_REG(dev, mrtc))
-               queue_delayed_work(health->wq, &health->update_fw_log_ts_work, 0);
 }
 
 void mlx5_stop_health_poll(struct mlx5_core_dev *dev, bool disable_health)
        del_timer_sync(&health->timer);
 }
 
+void mlx5_start_health_fw_log_up(struct mlx5_core_dev *dev)
+{
+       struct mlx5_core_health *health = &dev->priv.health;
+
+       if (mlx5_core_is_pf(dev) && MLX5_CAP_MCAM_REG(dev, mrtc))
+               queue_delayed_work(health->wq, &health->update_fw_log_ts_work, 0);
+}
+
 void mlx5_drain_health_wq(struct mlx5_core_dev *dev)
 {
        struct mlx5_core_health *health = &dev->priv.health;
 
        mlx5_devcom_unregister_device(dev->priv.devcom);
 }
 
-static int mlx5_function_setup(struct mlx5_core_dev *dev, u64 timeout)
+static int mlx5_function_setup(struct mlx5_core_dev *dev, bool boot, u64 timeout)
 {
        int err;
 
 
        mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_UP);
 
+       mlx5_start_health_poll(dev);
+
        err = mlx5_core_enable_hca(dev, 0);
        if (err) {
                mlx5_core_err(dev, "enable hca failed\n");
-               goto err_cmd_cleanup;
+               goto stop_health_poll;
        }
 
        err = mlx5_core_set_issi(dev);
                mlx5_core_err(dev, "query hca failed\n");
                goto reclaim_boot_pages;
        }
-
-       mlx5_start_health_poll(dev);
+       mlx5_start_health_fw_log_up(dev);
 
        return 0;
 
        mlx5_reclaim_startup_pages(dev);
 err_disable_hca:
        mlx5_core_disable_hca(dev, 0);
+stop_health_poll:
+       mlx5_stop_health_poll(dev, boot);
 err_cmd_cleanup:
        mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_DOWN);
        mlx5_cmd_cleanup(dev);
 {
        int err;
 
-       mlx5_stop_health_poll(dev, boot);
        err = mlx5_cmd_teardown_hca(dev);
        if (err) {
                mlx5_core_err(dev, "tear_down_hca failed, skip cleanup\n");
        }
        mlx5_reclaim_startup_pages(dev);
        mlx5_core_disable_hca(dev, 0);
+       mlx5_stop_health_poll(dev, boot);
        mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_DOWN);
        mlx5_cmd_cleanup(dev);
 
        mutex_lock(&dev->intf_state_mutex);
        dev->state = MLX5_DEVICE_STATE_UP;
 
-       err = mlx5_function_setup(dev, mlx5_tout_ms(dev, FW_PRE_INIT_TIMEOUT));
+       err = mlx5_function_setup(dev, true, mlx5_tout_ms(dev, FW_PRE_INIT_TIMEOUT));
        if (err)
                goto err_function;
 
                timeout = mlx5_tout_ms(dev, FW_PRE_INIT_ON_RECOVERY_TIMEOUT);
        else
                timeout = mlx5_tout_ms(dev, FW_PRE_INIT_TIMEOUT);
-       err = mlx5_function_setup(dev, timeout);
+       err = mlx5_function_setup(dev, false, timeout);
        if (err)
                goto err_function;
 
 
 int mlx5_health_init(struct mlx5_core_dev *dev);
 void mlx5_start_health_poll(struct mlx5_core_dev *dev);
 void mlx5_stop_health_poll(struct mlx5_core_dev *dev, bool disable_health);
+void mlx5_start_health_fw_log_up(struct mlx5_core_dev *dev);
 void mlx5_drain_health_wq(struct mlx5_core_dev *dev);
 void mlx5_trigger_health_work(struct mlx5_core_dev *dev);
 int mlx5_frag_buf_alloc_node(struct mlx5_core_dev *dev, int size,