@@ -1971,8 +1971,13 @@ static int irdma_resize_cq(struct ib_cq *ibcq, int entries,
19711971
19721972 if (!iwcq -> user_mode ) {
19731973 entries ++ ;
1974- if (rf -> sc_dev .hw_attrs .uk_attrs .hw_rev >= IRDMA_GEN_2 )
1974+
1975+ if (!iwcq -> sc_cq .cq_uk .avoid_mem_cflct &&
1976+ dev -> hw_attrs .uk_attrs .hw_rev >= IRDMA_GEN_2 )
19751977 entries *= 2 ;
1978+
1979+ if (entries & 1 )
1980+ entries += 1 ; /* cq size must be an even number */
19761981 }
19771982
19781983 info .cq_size = max (entries , 4 );
@@ -2115,6 +2120,7 @@ static int irdma_create_cq(struct ib_cq *ibcq,
21152120 unsigned long flags ;
21162121 int err_code ;
21172122 int entries = attr -> cqe ;
2123+ bool cqe_64byte_ena ;
21182124
21192125 err_code = cq_validate_flags (attr -> flags , dev -> hw_attrs .uk_attrs .hw_rev );
21202126 if (err_code )
@@ -2138,6 +2144,9 @@ static int irdma_create_cq(struct ib_cq *ibcq,
21382144 info .dev = dev ;
21392145 ukinfo -> cq_size = max (entries , 4 );
21402146 ukinfo -> cq_id = cq_num ;
2147+ cqe_64byte_ena = dev -> hw_attrs .uk_attrs .feature_flags & IRDMA_FEATURE_64_BYTE_CQE ?
2148+ true : false;
2149+ ukinfo -> avoid_mem_cflct = cqe_64byte_ena ;
21412150 iwcq -> ibcq .cqe = info .cq_uk_init_info .cq_size ;
21422151 if (attr -> comp_vector < rf -> ceqs_count )
21432152 info .ceq_id = attr -> comp_vector ;
@@ -2213,11 +2222,18 @@ static int irdma_create_cq(struct ib_cq *ibcq,
22132222 }
22142223
22152224 entries ++ ;
2216- if (dev -> hw_attrs .uk_attrs .hw_rev >= IRDMA_GEN_2 )
2225+ if (! cqe_64byte_ena && dev -> hw_attrs .uk_attrs .hw_rev >= IRDMA_GEN_2 )
22172226 entries *= 2 ;
2227+
2228+ if (entries & 1 )
2229+ entries += 1 ; /* cq size must be an even number */
2230+
22182231 ukinfo -> cq_size = entries ;
22192232
2220- rsize = info .cq_uk_init_info .cq_size * sizeof (struct irdma_cqe );
2233+ if (cqe_64byte_ena )
2234+ rsize = info .cq_uk_init_info .cq_size * sizeof (struct irdma_extended_cqe );
2235+ else
2236+ rsize = info .cq_uk_init_info .cq_size * sizeof (struct irdma_cqe );
22212237 iwcq -> kmem .size = ALIGN (round_up (rsize , 256 ), 256 );
22222238 iwcq -> kmem .va = dma_alloc_coherent (dev -> hw -> device ,
22232239 iwcq -> kmem .size ,
@@ -3784,8 +3800,12 @@ static void irdma_process_cqe(struct ib_wc *entry,
37843800 if (cq_poll_info -> q_type == IRDMA_CQE_QTYPE_SQ ) {
37853801 set_ib_wc_op_sq (cq_poll_info , entry );
37863802 } else {
3787- set_ib_wc_op_rq (cq_poll_info , entry ,
3788- qp -> qp_uk .qp_caps & IRDMA_SEND_WITH_IMM );
3803+ if (qp -> dev -> hw_attrs .uk_attrs .hw_rev <= IRDMA_GEN_2 )
3804+ set_ib_wc_op_rq (cq_poll_info , entry ,
3805+ qp -> qp_uk .qp_caps & IRDMA_SEND_WITH_IMM ?
3806+ true : false);
3807+ else
3808+ set_ib_wc_op_rq_gen_3 (cq_poll_info , entry );
37893809 if (qp -> qp_uk .qp_type != IRDMA_QP_TYPE_ROCE_UD &&
37903810 cq_poll_info -> stag_invalid_set ) {
37913811 entry -> ex .invalidate_rkey = cq_poll_info -> inv_stag ;
0 commit comments