if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_NO_CSUM_COMPLETE) || c->xdp)
                __set_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state);
 
+       /* For CQE compression on striding RQ, use stride index provided by
+        * HW if capability is supported.
+        */
+       if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_STRIDING_RQ) &&
+           MLX5_CAP_GEN(c->mdev, mini_cqe_resp_stride_index))
+               __set_bit(MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX, &c->rq.state);
+
        return 0;
 
 err_destroy_rq:
                             struct mlx5e_cq_param *param)
 {
        struct mlx5_core_dev *mdev = priv->mdev;
+       bool hw_stridx = false;
        void *cqc = param->cqc;
        u8 log_cq_size;
 
        case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ:
                log_cq_size = mlx5e_mpwqe_get_log_rq_size(params, xsk) +
                        mlx5e_mpwqe_get_log_num_strides(mdev, params, xsk);
+               hw_stridx = MLX5_CAP_GEN(mdev, mini_cqe_resp_stride_index);
                break;
        default: /* MLX5_WQ_TYPE_CYCLIC */
                log_cq_size = params->log_rq_mtu_frames;
 
        MLX5_SET(cqc, cqc, log_cq_size, log_cq_size);
        if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS)) {
-               MLX5_SET(cqc, cqc, mini_cqe_res_format, MLX5_CQE_FORMAT_CSUM);
+               MLX5_SET(cqc, cqc, mini_cqe_res_format, hw_stridx ?
+                        MLX5_CQE_FORMAT_CSUM_STRIDX : MLX5_CQE_FORMAT_CSUM);
                MLX5_SET(cqc, cqc, cqe_comp_en, 1);
        }
 
 
        title->check_sum    = mini_cqe->checksum;
        title->op_own      &= 0xf0;
        title->op_own      |= 0x01 & (cqcc >> wq->fbc.log_sz);
-       title->wqe_counter  = cpu_to_be16(cqd->wqe_counter);
 
+       /* state bit set implies linked-list striding RQ wq type and
+        * HW stride index capability supported
+        */
+       if (test_bit(MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX, &rq->state)) {
+               title->wqe_counter = mini_cqe->stridx;
+               return;
+       }
+
+       /* HW stride index capability not supported */
+       title->wqe_counter = cpu_to_be16(cqd->wqe_counter);
        if (rq->wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ)
                cqd->wqe_counter += mpwrq_get_cqe_consumed_strides(title);
        else