int mlx5e_reporter_rx_create(struct mlx5e_priv *priv);
 void mlx5e_reporter_rx_destroy(struct mlx5e_priv *priv);
 void mlx5e_reporter_icosq_cqe_err(struct mlx5e_icosq *icosq);
+void mlx5e_reporter_rx_timeout(struct mlx5e_rq *rq);
 
 #define MLX5E_REPORTER_PER_Q_MAX_LEN 256
 
 
        mlx5e_health_report(priv, priv->rx_reporter, err_str, &err_ctx);
 }
 
+static int mlx5e_rx_reporter_timeout_recover(void *ctx)
+{
+       struct mlx5e_icosq *icosq;
+       struct mlx5_eq_comp *eq;
+       struct mlx5e_rq *rq;
+       int err;
+
+       rq = ctx;
+       icosq = &rq->channel->icosq;
+       eq = rq->cq.mcq.eq;
+       err = mlx5e_health_channel_eq_recover(eq, rq->channel);
+       if (err)
+               clear_bit(MLX5E_SQ_STATE_ENABLED, &icosq->state);
+
+       return err;
+}
+
+void mlx5e_reporter_rx_timeout(struct mlx5e_rq *rq)
+{
+       struct mlx5e_icosq *icosq = &rq->channel->icosq;
+       struct mlx5e_priv *priv = rq->channel->priv;
+       char err_str[MLX5E_REPORTER_PER_Q_MAX_LEN];
+       struct mlx5e_err_ctx err_ctx = {};
+
+       err_ctx.ctx = rq;
+       err_ctx.recover = mlx5e_rx_reporter_timeout_recover;
+       sprintf(err_str, "RX timeout on channel: %d, ICOSQ: 0x%x RQ: 0x%x, CQ: 0x%x\n",
+               icosq->channel->ix, icosq->sqn, rq->rqn, rq->cq.mcq.cqn);
+
+       mlx5e_health_report(priv, priv->rx_reporter, err_str, &err_ctx);
+}
+
 static int mlx5e_rx_reporter_recover_from_ctx(struct mlx5e_err_ctx *err_ctx)
 {
        return err_ctx->recover(err_ctx->ctx);
 
        netdev_warn(c->netdev, "Failed to get min RX wqes on Channel[%d] RQN[0x%x] wq cur_sz(%d) min_rx_wqes(%d)\n",
                    c->ix, rq->rqn, mlx5e_rqwq_get_cur_sz(rq), min_wqes);
 
+       mlx5e_reporter_rx_timeout(rq);
        return -ETIMEDOUT;
 }