hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
....@@ -154,21 +154,29 @@
154154 V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S, valid_num_sge);
155155 }
156156
157
+static unsigned int get_std_sge_num(struct hns_roce_qp *qp)
158
+{
159
+ if (qp->ibqp.qp_type == IB_QPT_GSI || qp->ibqp.qp_type == IB_QPT_UD)
160
+ return 0;
161
+
162
+ return HNS_ROCE_SGE_IN_WQE;
163
+}
164
+
157165 static int fill_ext_sge_inl_data(struct hns_roce_qp *qp,
158166 const struct ib_send_wr *wr,
159167 unsigned int *sge_idx, u32 msg_len)
160168 {
161169 struct ib_device *ibdev = &(to_hr_dev(qp->ibqp.device))->ib_dev;
162
- unsigned int dseg_len = sizeof(struct hns_roce_v2_wqe_data_seg);
163
- unsigned int ext_sge_sz = qp->sq.max_gs * dseg_len;
164170 unsigned int left_len_in_pg;
165171 unsigned int idx = *sge_idx;
172
+ unsigned int std_sge_num;
166173 unsigned int i = 0;
167174 unsigned int len;
168175 void *addr;
169176 void *dseg;
170177
171
- if (msg_len > ext_sge_sz) {
178
+ std_sge_num = get_std_sge_num(qp);
179
+ if (msg_len > (qp->sq.max_gs - std_sge_num) * HNS_ROCE_SGE_SIZE) {
172180 ibdev_err(ibdev,
173181 "no enough extended sge space for inline data.\n");
174182 return -EINVAL;
....@@ -188,7 +196,7 @@
188196 if (len <= left_len_in_pg) {
189197 memcpy(dseg, addr, len);
190198
191
- idx += len / dseg_len;
199
+ idx += len / HNS_ROCE_SGE_SIZE;
192200
193201 i++;
194202 if (i >= wr->num_sge)
....@@ -203,7 +211,7 @@
203211
204212 len -= left_len_in_pg;
205213 addr += left_len_in_pg;
206
- idx += left_len_in_pg / dseg_len;
214
+ idx += left_len_in_pg / HNS_ROCE_SGE_SIZE;
207215 dseg = hns_roce_get_extend_sge(qp,
208216 idx & (qp->sge.sge_cnt - 1));
209217 left_len_in_pg = 1 << HNS_HW_PAGE_SHIFT;
....@@ -1020,8 +1028,8 @@
10201028 struct hns_roce_v2_priv *priv = hr_dev->priv;
10211029 struct hnae3_handle *handle = priv->handle;
10221030 const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
1023
- unsigned long instance_stage; /* the current instance stage */
1024
- unsigned long reset_stage; /* the current reset stage */
1031
+ unsigned long instance_stage; /* the current instance stage */
1032
+ unsigned long reset_stage; /* the current reset stage */
10251033 unsigned long reset_cnt;
10261034 bool sw_resetting;
10271035 bool hw_resetting;
....@@ -2158,6 +2166,9 @@
21582166 calc_pg_sz(caps->num_idx_segs, caps->idx_entry_sz, caps->idx_hop_num,
21592167 1, &caps->idx_buf_pg_sz, &caps->idx_ba_pg_sz, HEM_TYPE_IDX);
21602168
2169
+ if (!(caps->page_size_cap & PAGE_SIZE))
2170
+ caps->page_size_cap = HNS_ROCE_V2_PAGE_SIZE_SUPPORTED;
2171
+
21612172 return 0;
21622173 }
21632174
....@@ -2423,7 +2434,6 @@
24232434 if (i < (pg_num - 1))
24242435 entry[i].blk_ba1_nxt_ptr |=
24252436 (i + 1) << HNS_ROCE_LINK_TABLE_NXT_PTR_S;
2426
-
24272437 }
24282438 link_tbl->npages = pg_num;
24292439 link_tbl->pg_sz = buf_chk_sz;
....@@ -2730,7 +2740,8 @@
27302740 int i, count;
27312741
27322742 count = hns_roce_mtr_find(hr_dev, &mr->pbl_mtr, 0, pages,
2733
- ARRAY_SIZE(pages), &pbl_ba);
2743
+ min_t(int, ARRAY_SIZE(pages), mr->npages),
2744
+ &pbl_ba);
27342745 if (count < 1) {
27352746 ibdev_err(ibdev, "failed to find PBL mtr, count = %d.\n",
27362747 count);
....@@ -5528,16 +5539,14 @@
55285539 case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW:
55295540 hns_roce_cq_event(hr_dev, cqn, event_type);
55305541 break;
5531
- case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW:
5532
- break;
55335542 case HNS_ROCE_EVENT_TYPE_MB:
55345543 hns_roce_cmd_event(hr_dev,
55355544 le16_to_cpu(aeqe->event.cmd.token),
55365545 aeqe->event.cmd.status,
55375546 le64_to_cpu(aeqe->event.cmd.out_param));
55385547 break;
5548
+ case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW:
55395549 case HNS_ROCE_EVENT_TYPE_CEQ_OVERFLOW:
5540
- break;
55415550 case HNS_ROCE_EVENT_TYPE_FLR:
55425551 break;
55435552 default: