@@ -99,16 +99,16 @@ static void set_frmr_seg(struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
99
99
u64 pbl_ba ;
100
100
101
101
/* use ib_access_flags */
102
- roce_set_bit (rc_sq_wqe -> byte_4 , V2_RC_FRMR_WQE_BYTE_4_BIND_EN_S ,
103
- wr -> access & IB_ACCESS_MW_BIND ? 1 : 0 );
104
- roce_set_bit (rc_sq_wqe -> byte_4 , V2_RC_FRMR_WQE_BYTE_4_ATOMIC_S ,
105
- wr -> access & IB_ACCESS_REMOTE_ATOMIC ? 1 : 0 );
106
- roce_set_bit (rc_sq_wqe -> byte_4 , V2_RC_FRMR_WQE_BYTE_4_RR_S ,
107
- wr -> access & IB_ACCESS_REMOTE_READ ? 1 : 0 );
108
- roce_set_bit (rc_sq_wqe -> byte_4 , V2_RC_FRMR_WQE_BYTE_4_RW_S ,
109
- wr -> access & IB_ACCESS_REMOTE_WRITE ? 1 : 0 );
110
- roce_set_bit (rc_sq_wqe -> byte_4 , V2_RC_FRMR_WQE_BYTE_4_LW_S ,
111
- wr -> access & IB_ACCESS_LOCAL_WRITE ? 1 : 0 );
102
+ roce_set_bit (fseg -> byte_40 , V2_RC_FRMR_WQE_BYTE_40_BIND_EN_S ,
103
+ !!( wr -> access & IB_ACCESS_MW_BIND ) );
104
+ roce_set_bit (fseg -> byte_40 , V2_RC_FRMR_WQE_BYTE_40_ATOMIC_S ,
105
+ !!( wr -> access & IB_ACCESS_REMOTE_ATOMIC ) );
106
+ roce_set_bit (fseg -> byte_40 , V2_RC_FRMR_WQE_BYTE_40_RR_S ,
107
+ !!( wr -> access & IB_ACCESS_REMOTE_READ ) );
108
+ roce_set_bit (fseg -> byte_40 , V2_RC_FRMR_WQE_BYTE_40_RW_S ,
109
+ !!( wr -> access & IB_ACCESS_REMOTE_WRITE ) );
110
+ roce_set_bit (fseg -> byte_40 , V2_RC_FRMR_WQE_BYTE_40_LW_S ,
111
+ !!( wr -> access & IB_ACCESS_LOCAL_WRITE ) );
112
112
113
113
/* Data structure reuse may lead to confusion */
114
114
pbl_ba = mr -> pbl_mtr .hem_cfg .root_ba ;
@@ -121,12 +121,10 @@ static void set_frmr_seg(struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
121
121
rc_sq_wqe -> va = cpu_to_le64 (wr -> mr -> iova );
122
122
123
123
fseg -> pbl_size = cpu_to_le32 (mr -> npages );
124
- roce_set_field (fseg -> mode_buf_pg_sz ,
125
- V2_RC_FRMR_WQE_BYTE_40_PBL_BUF_PG_SZ_M ,
124
+ roce_set_field (fseg -> byte_40 , V2_RC_FRMR_WQE_BYTE_40_PBL_BUF_PG_SZ_M ,
126
125
V2_RC_FRMR_WQE_BYTE_40_PBL_BUF_PG_SZ_S ,
127
126
to_hr_hw_page_shift (mr -> pbl_mtr .hem_cfg .buf_pg_shift ));
128
- roce_set_bit (fseg -> mode_buf_pg_sz ,
129
- V2_RC_FRMR_WQE_BYTE_40_BLK_MODE_S , 0 );
127
+ roce_set_bit (fseg -> byte_40 , V2_RC_FRMR_WQE_BYTE_40_BLK_MODE_S , 0 );
130
128
}
131
129
132
130
static void set_atomic_seg (const struct ib_send_wr * wr ,
@@ -522,10 +520,12 @@ static inline int set_ud_wqe(struct hns_roce_qp *qp,
522
520
return 0 ;
523
521
}
524
522
525
- static int set_rc_opcode (struct hns_roce_v2_rc_send_wqe * rc_sq_wqe ,
523
+ static int set_rc_opcode (struct hns_roce_dev * hr_dev ,
524
+ struct hns_roce_v2_rc_send_wqe * rc_sq_wqe ,
526
525
const struct ib_send_wr * wr )
527
526
{
528
527
u32 ib_op = wr -> opcode ;
528
+ int ret = 0 ;
529
529
530
530
rc_sq_wqe -> immtdata = get_immtdata (wr );
531
531
@@ -545,7 +545,10 @@ static int set_rc_opcode(struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
545
545
rc_sq_wqe -> va = cpu_to_le64 (atomic_wr (wr )-> remote_addr );
546
546
break ;
547
547
case IB_WR_REG_MR :
548
- set_frmr_seg (rc_sq_wqe , reg_wr (wr ));
548
+ if (hr_dev -> pci_dev -> revision >= PCI_REVISION_ID_HIP09 )
549
+ set_frmr_seg (rc_sq_wqe , reg_wr (wr ));
550
+ else
551
+ ret = - EOPNOTSUPP ;
549
552
break ;
550
553
case IB_WR_LOCAL_INV :
551
554
roce_set_bit (rc_sq_wqe -> byte_4 , V2_RC_SEND_WQE_BYTE_4_SO_S , 1 );
@@ -554,19 +557,23 @@ static int set_rc_opcode(struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
554
557
rc_sq_wqe -> inv_key = cpu_to_le32 (wr -> ex .invalidate_rkey );
555
558
break ;
556
559
default :
557
- return - EINVAL ;
560
+ ret = - EINVAL ;
558
561
}
559
562
563
+ if (unlikely (ret ))
564
+ return ret ;
565
+
560
566
roce_set_field (rc_sq_wqe -> byte_4 , V2_RC_SEND_WQE_BYTE_4_OPCODE_M ,
561
567
V2_RC_SEND_WQE_BYTE_4_OPCODE_S , to_hr_opcode (ib_op ));
562
568
563
- return 0 ;
569
+ return ret ;
564
570
}
565
571
static inline int set_rc_wqe (struct hns_roce_qp * qp ,
566
572
const struct ib_send_wr * wr ,
567
573
void * wqe , unsigned int * sge_idx ,
568
574
unsigned int owner_bit )
569
575
{
576
+ struct hns_roce_dev * hr_dev = to_hr_dev (qp -> ibqp .device );
570
577
struct hns_roce_v2_rc_send_wqe * rc_sq_wqe = wqe ;
571
578
unsigned int curr_idx = * sge_idx ;
572
579
unsigned int valid_num_sge ;
@@ -577,7 +584,7 @@ static inline int set_rc_wqe(struct hns_roce_qp *qp,
577
584
578
585
rc_sq_wqe -> msg_len = cpu_to_le32 (msg_len );
579
586
580
- ret = set_rc_opcode (rc_sq_wqe , wr );
587
+ ret = set_rc_opcode (hr_dev , rc_sq_wqe , wr );
581
588
if (WARN_ON (ret ))
582
589
return ret ;
583
590
0 commit comments