void *cqc = param->cqc;
 
        MLX5_SET(cqc, cqc, uar_page, priv->mdev->priv.uar->index);
+       if (MLX5_CAP_GEN(priv->mdev, cqe_128_always) && cache_line_size() >= 128)
+               MLX5_SET(cqc, cqc, cqe_sz, CQE_STRIDE_128_PAD);
 }
 
 static void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv,
 
                     void *cqc, struct mlx5_cqwq *wq,
                     struct mlx5_wq_ctrl *wq_ctrl)
 {
-       u8 log_wq_stride = MLX5_GET(cqc, cqc, cqe_sz) + 6;
+       /* CQE_STRIDE_128 and CQE_STRIDE_128_PAD both mean 128B stride */
+       u8 log_wq_stride = MLX5_GET(cqc, cqc, cqe_sz) == CQE_STRIDE_64 ? 6 : 7;
        u8 log_wq_sz     = MLX5_GET(cqc, cqc, log_cq_size);
        int err;
 
 
 
 static inline struct mlx5_cqe64 *mlx5_cqwq_get_wqe(struct mlx5_cqwq *wq, u32 ix)
 {
-       return mlx5_frag_buf_get_wqe(&wq->fbc, ix);
+       struct mlx5_cqe64 *cqe = mlx5_frag_buf_get_wqe(&wq->fbc, ix);
+
+       /* For 128B CQEs the data is in the last 64B */
+       cqe += wq->fbc.log_stride == 7;
+
+       return cqe;
 }
 
 static inline u32 mlx5_cqwq_get_ctr_wrap_cnt(struct mlx5_cqwq *wq, u32 ctr)
 
 };
 
 enum {
-       CQE_SIZE_64 = 0,
-       CQE_SIZE_128 = 1,
-       CQE_SIZE_128_PAD = 2,
+       CQE_STRIDE_64 = 0,
+       CQE_STRIDE_128 = 1,
+       CQE_STRIDE_128_PAD = 2,
 };
 
 #define MLX5_MAX_CQ_PERIOD (BIT(__mlx5_bit_sz(cqc, cq_period)) - 1)
 
 static inline int cqe_sz_to_mlx_sz(u8 size, int padding_128_en)
 {
-       return padding_128_en ? CQE_SIZE_128_PAD :
-                               size == 64 ? CQE_SIZE_64 : CQE_SIZE_128;
+       return padding_128_en ? CQE_STRIDE_128_PAD :
+                               size == 64 ? CQE_STRIDE_64 : CQE_STRIDE_128;
 }
 
 static inline void mlx5_cq_set_ci(struct mlx5_core_cq *cq)