3434#include <stdio.h>
3535#include <string.h>
3636#include <sys/mman.h>
37+ #include <ccan/minmax.h>
3738#include "hns_roce_u.h"
3839#include "hns_roce_u_db.h"
3940#include "hns_roce_u_hw_v2.h"
@@ -416,46 +417,41 @@ static void get_opcode_for_resp(struct hns_roce_v2_cqe *cqe, struct ibv_wc *wc,
416417 wc -> opcode = wc_rcv_op_map [opcode ];
417418}
418419
419- static int handle_recv_inl_wqe (struct hns_roce_v2_cqe * cqe , struct ibv_wc * wc ,
420- struct hns_roce_qp * * cur_qp , uint32_t opcode )
420+ static void handle_recv_inl_data (struct hns_roce_v2_cqe * cqe ,
421+ struct hns_roce_rinl_buf * rinl_buf ,
422+ uint32_t wr_cnt , uint8_t * buf )
421423{
422- if (((* cur_qp )-> verbs_qp .qp .qp_type == IBV_QPT_RC ) &&
423- (opcode == HNS_ROCE_RECV_OP_SEND ||
424- opcode == HNS_ROCE_RECV_OP_SEND_WITH_IMM ||
425- opcode == HNS_ROCE_RECV_OP_SEND_WITH_INV ) &&
426- hr_reg_read (cqe , CQE_RQ_INLINE )) {
427- struct hns_roce_rinl_sge * sge_list ;
428- uint32_t wr_num , wr_cnt , sge_num , data_len ;
429- uint8_t * wqe_buf ;
430- uint32_t sge_cnt , size ;
424+ struct ibv_sge * sge_list ;
425+ uint32_t sge_num , data_len ;
426+ uint32_t sge_cnt , size ;
431427
432- wr_num = hr_reg_read ( cqe , CQE_WQE_IDX ) ;
433- wr_cnt = wr_num & (( * cur_qp ) -> rq . wqe_cnt - 1 ) ;
428+ sge_list = rinl_buf -> wqe_list [ wr_cnt ]. sg_list ;
429+ sge_num = rinl_buf -> wqe_list [ wr_cnt ]. sge_cnt ;
434430
435- sge_list = (* cur_qp )-> rq_rinl_buf .wqe_list [wr_cnt ].sg_list ;
436- sge_num = (* cur_qp )-> rq_rinl_buf .wqe_list [wr_cnt ].sge_cnt ;
437- wqe_buf = (uint8_t * )get_recv_wqe_v2 (* cur_qp , wr_cnt );
431+ data_len = le32toh (cqe -> byte_cnt );
438432
439- data_len = wc -> byte_len ;
433+ for (sge_cnt = 0 ; (sge_cnt < sge_num ) && (data_len ); sge_cnt ++ ) {
434+ size = min (sge_list [sge_cnt ].length , data_len );
440435
441- for ( sge_cnt = 0 ; ( sge_cnt < sge_num ) && ( data_len );
442- sge_cnt ++ ) {
443- size = sge_list [ sge_cnt ]. len < data_len ?
444- sge_list [ sge_cnt ]. len : data_len ;
436+ memcpy (( void * )( uintptr_t ) sge_list [ sge_cnt ]. addr , ( void * ) buf , size );
437+ data_len -= size ;
438+ buf += size ;
439+ }
445440
446- memcpy ((void * )sge_list [sge_cnt ].addr ,
447- (void * )wqe_buf , size );
448- data_len -= size ;
449- wqe_buf += size ;
450- }
441+ if (data_len )
442+ hr_reg_write (cqe , CQE_STATUS , HNS_ROCE_V2_CQE_LOCAL_LENGTH_ERR );
443+ }
451444
452- if ( data_len ) {
453- wc -> status = IBV_WC_LOC_LEN_ERR ;
454- return V2_CQ_POLL_ERR ;
455- }
456- }
445+ static void handle_recv_rq_inl ( struct hns_roce_v2_cqe * cqe ,
446+ struct hns_roce_qp * cur_qp )
447+ {
448+ uint8_t * wqe_buf ;
449+ uint32_t wr_num ;
457450
458- return V2_CQ_OK ;
451+ wr_num = hr_reg_read (cqe , CQE_WQE_IDX ) & (cur_qp -> rq .wqe_cnt - 1 );
452+
453+ wqe_buf = (uint8_t * )get_recv_wqe_v2 (cur_qp , wr_num );
454+ handle_recv_inl_data (cqe , & cur_qp -> rq_rinl_buf , wr_num , wqe_buf );
459455}
460456
461457static void parse_for_ud_qp (struct hns_roce_v2_cqe * cqe , struct ibv_wc * wc )
@@ -478,10 +474,9 @@ static void parse_cqe_for_srq(struct hns_roce_v2_cqe *cqe, struct ibv_wc *wc,
478474}
479475
480476static int parse_cqe_for_resp (struct hns_roce_v2_cqe * cqe , struct ibv_wc * wc ,
481- struct hns_roce_qp * hr_qp , uint8_t opcode )
477+ struct hns_roce_qp * hr_qp )
482478{
483479 struct hns_roce_wq * wq ;
484- int ret ;
485480
486481 wq = & hr_qp -> rq ;
487482 wc -> wr_id = wq -> wrid [wq -> tail & (wq -> wqe_cnt - 1 )];
@@ -490,12 +485,8 @@ static int parse_cqe_for_resp(struct hns_roce_v2_cqe *cqe, struct ibv_wc *wc,
490485 if (hr_qp -> verbs_qp .qp .qp_type == IBV_QPT_UD )
491486 parse_for_ud_qp (cqe , wc );
492487
493- ret = handle_recv_inl_wqe (cqe , wc , & hr_qp , opcode );
494- if (ret ) {
495- verbs_err (verbs_get_ctx (hr_qp -> verbs_qp .qp .context ),
496- PFX "failed to handle recv inline wqe!\n" );
497- return ret ;
498- }
488+ if (hr_reg_read (cqe , CQE_RQ_INLINE ))
489+ handle_recv_rq_inl (cqe , hr_qp );
499490
500491 return 0 ;
501492}
@@ -624,7 +615,7 @@ static int parse_cqe_for_cq(struct hns_roce_context *ctx, struct hns_roce_cq *cq
624615 if (srq )
625616 parse_cqe_for_srq (cqe , wc , srq );
626617 else
627- parse_cqe_for_resp (cqe , wc , cur_qp , opcode );
618+ parse_cqe_for_resp (cqe , wc , cur_qp );
628619 }
629620
630621 return 0 ;
@@ -1353,26 +1344,31 @@ static void fill_recv_sge_to_wqe(struct ibv_recv_wr *wr, void *wqe,
13531344 }
13541345}
13551346
1347+ static void fill_recv_inl_buf (struct hns_roce_rinl_buf * rinl_buf ,
1348+ unsigned int wqe_idx , struct ibv_recv_wr * wr )
1349+ {
1350+ struct ibv_sge * sge_list ;
1351+ unsigned int i ;
1352+
1353+ if (!rinl_buf -> wqe_cnt )
1354+ return ;
1355+
1356+ sge_list = rinl_buf -> wqe_list [wqe_idx ].sg_list ;
1357+ rinl_buf -> wqe_list [wqe_idx ].sge_cnt = (unsigned int )wr -> num_sge ;
1358+ for (i = 0 ; i < wr -> num_sge ; i ++ )
1359+ memcpy ((void * )& sge_list [i ], (void * )& wr -> sg_list [i ],
1360+ sizeof (struct ibv_sge ));
1361+ }
1362+
13561363static void fill_rq_wqe (struct hns_roce_qp * qp , struct ibv_recv_wr * wr ,
13571364 unsigned int wqe_idx , unsigned int max_sge )
13581365{
1359- struct hns_roce_rinl_sge * sge_list ;
1360- unsigned int i ;
13611366 void * wqe ;
13621367
13631368 wqe = get_recv_wqe_v2 (qp , wqe_idx );
13641369 fill_recv_sge_to_wqe (wr , wqe , max_sge , qp -> rq .rsv_sge );
13651370
1366- if (!qp -> rq_rinl_buf .wqe_cnt )
1367- return ;
1368-
1369- /* QP support receive inline wqe */
1370- sge_list = qp -> rq_rinl_buf .wqe_list [wqe_idx ].sg_list ;
1371- qp -> rq_rinl_buf .wqe_list [wqe_idx ].sge_cnt = (unsigned int )wr -> num_sge ;
1372- for (i = 0 ; i < wr -> num_sge ; i ++ ) {
1373- sge_list [i ].addr = (void * )(uintptr_t )wr -> sg_list [i ].addr ;
1374- sge_list [i ].len = wr -> sg_list [i ].length ;
1375- }
1371+ fill_recv_inl_buf (& qp -> rq_rinl_buf , wqe_idx , wr );
13761372}
13771373
13781374static int hns_roce_u_v2_post_recv (struct ibv_qp * ibvqp , struct ibv_recv_wr * wr ,
0 commit comments