int mlx5e_open_rq(struct mlx5e_params *params, struct mlx5e_rq_param *param,
                  struct mlx5e_xsk_param *xsk, int node,
                  struct mlx5e_rq *rq);
+#define MLX5E_RQ_WQES_TIMEOUT 20000 /* msecs */
 int mlx5e_wait_for_min_rx_wqes(struct mlx5e_rq *rq, int wait_time);
 void mlx5e_close_rq(struct mlx5e_rq *rq);
 int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param);
 
 
        mlx5e_rx_res_xsk_update(priv->rx_res, &priv->channels, ix, true);
 
+       mlx5e_deactivate_rq(&c->rq);
+       mlx5e_flush_rq(&c->rq, MLX5_RQC_STATE_RDY);
+
        return 0;
 
 err_remove_pool:
                goto remove_pool;
 
        c = priv->channels.c[ix];
+
+       mlx5e_activate_rq(&c->rq);
+       mlx5e_trigger_napi_icosq(c);
+       mlx5e_wait_for_min_rx_wqes(&c->rq, MLX5E_RQ_WQES_TIMEOUT);
+
        mlx5e_rx_res_xsk_update(priv->rx_res, &priv->channels, ix, false);
+
        mlx5e_deactivate_xsk(c);
        mlx5e_close_xsk(c);
 
 
                mlx5e_activate_txqsq(&c->sq[tc]);
        mlx5e_activate_icosq(&c->icosq);
        mlx5e_activate_icosq(&c->async_icosq);
-       mlx5e_activate_rq(&c->rq);
 
        if (test_bit(MLX5E_CHANNEL_STATE_XSK, c->state))
                mlx5e_activate_xsk(c);
+       else
+               mlx5e_activate_rq(&c->rq);
 
        mlx5e_trigger_napi_icosq(c);
 }
 
        if (test_bit(MLX5E_CHANNEL_STATE_XSK, c->state))
                mlx5e_deactivate_xsk(c);
+       else
+               mlx5e_deactivate_rq(&c->rq);
 
-       mlx5e_deactivate_rq(&c->rq);
        mlx5e_deactivate_icosq(&c->async_icosq);
        mlx5e_deactivate_icosq(&c->icosq);
        for (tc = 0; tc < c->num_tc; tc++)
                mlx5e_ptp_activate_channel(chs->ptp);
 }
 
-#define MLX5E_RQ_WQES_TIMEOUT 20000 /* msecs */
-
 static int mlx5e_wait_channels_min_rx_wqes(struct mlx5e_channels *chs)
 {
        int err = 0;
 
        for (i = 0; i < chs->num; i++) {
                int timeout = err ? 0 : MLX5E_RQ_WQES_TIMEOUT;
+               struct mlx5e_channel *c = chs->c[i];
+
+               if (test_bit(MLX5E_CHANNEL_STATE_XSK, c->state))
+                       continue;
 
-               err |= mlx5e_wait_for_min_rx_wqes(&chs->c[i]->rq, timeout);
+               err |= mlx5e_wait_for_min_rx_wqes(&c->rq, timeout);
 
                /* Don't wait on the XSK RQ, because the newer xdpsock sample
                 * doesn't provide any Fill Ring entries at the setup stage.