.. | .. |
---|
154 | 154 | V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S, valid_num_sge); |
---|
155 | 155 | } |
---|
156 | 156 | |
---|
| 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 | + |
---|
157 | 165 | static int fill_ext_sge_inl_data(struct hns_roce_qp *qp, |
---|
158 | 166 | const struct ib_send_wr *wr, |
---|
159 | 167 | unsigned int *sge_idx, u32 msg_len) |
---|
160 | 168 | { |
---|
161 | 169 | 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; |
---|
164 | 170 | unsigned int left_len_in_pg; |
---|
165 | 171 | unsigned int idx = *sge_idx; |
---|
| 172 | + unsigned int std_sge_num; |
---|
166 | 173 | unsigned int i = 0; |
---|
167 | 174 | unsigned int len; |
---|
168 | 175 | void *addr; |
---|
169 | 176 | void *dseg; |
---|
170 | 177 | |
---|
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) { |
---|
172 | 180 | ibdev_err(ibdev, |
---|
173 | 181 | "no enough extended sge space for inline data.\n"); |
---|
174 | 182 | return -EINVAL; |
---|
.. | .. |
---|
188 | 196 | if (len <= left_len_in_pg) { |
---|
189 | 197 | memcpy(dseg, addr, len); |
---|
190 | 198 | |
---|
191 | | - idx += len / dseg_len; |
---|
| 199 | + idx += len / HNS_ROCE_SGE_SIZE; |
---|
192 | 200 | |
---|
193 | 201 | i++; |
---|
194 | 202 | if (i >= wr->num_sge) |
---|
.. | .. |
---|
203 | 211 | |
---|
204 | 212 | len -= left_len_in_pg; |
---|
205 | 213 | addr += left_len_in_pg; |
---|
206 | | - idx += left_len_in_pg / dseg_len; |
---|
| 214 | + idx += left_len_in_pg / HNS_ROCE_SGE_SIZE; |
---|
207 | 215 | dseg = hns_roce_get_extend_sge(qp, |
---|
208 | 216 | idx & (qp->sge.sge_cnt - 1)); |
---|
209 | 217 | left_len_in_pg = 1 << HNS_HW_PAGE_SHIFT; |
---|
.. | .. |
---|
1020 | 1028 | struct hns_roce_v2_priv *priv = hr_dev->priv; |
---|
1021 | 1029 | struct hnae3_handle *handle = priv->handle; |
---|
1022 | 1030 | 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 */ |
---|
1025 | 1033 | unsigned long reset_cnt; |
---|
1026 | 1034 | bool sw_resetting; |
---|
1027 | 1035 | bool hw_resetting; |
---|
.. | .. |
---|
2158 | 2166 | calc_pg_sz(caps->num_idx_segs, caps->idx_entry_sz, caps->idx_hop_num, |
---|
2159 | 2167 | 1, &caps->idx_buf_pg_sz, &caps->idx_ba_pg_sz, HEM_TYPE_IDX); |
---|
2160 | 2168 | |
---|
| 2169 | + if (!(caps->page_size_cap & PAGE_SIZE)) |
---|
| 2170 | + caps->page_size_cap = HNS_ROCE_V2_PAGE_SIZE_SUPPORTED; |
---|
| 2171 | + |
---|
2161 | 2172 | return 0; |
---|
2162 | 2173 | } |
---|
2163 | 2174 | |
---|
.. | .. |
---|
2423 | 2434 | if (i < (pg_num - 1)) |
---|
2424 | 2435 | entry[i].blk_ba1_nxt_ptr |= |
---|
2425 | 2436 | (i + 1) << HNS_ROCE_LINK_TABLE_NXT_PTR_S; |
---|
2426 | | - |
---|
2427 | 2437 | } |
---|
2428 | 2438 | link_tbl->npages = pg_num; |
---|
2429 | 2439 | link_tbl->pg_sz = buf_chk_sz; |
---|
.. | .. |
---|
2730 | 2740 | int i, count; |
---|
2731 | 2741 | |
---|
2732 | 2742 | 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); |
---|
2734 | 2745 | if (count < 1) { |
---|
2735 | 2746 | ibdev_err(ibdev, "failed to find PBL mtr, count = %d.\n", |
---|
2736 | 2747 | count); |
---|
.. | .. |
---|
5528 | 5539 | case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW: |
---|
5529 | 5540 | hns_roce_cq_event(hr_dev, cqn, event_type); |
---|
5530 | 5541 | break; |
---|
5531 | | - case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW: |
---|
5532 | | - break; |
---|
5533 | 5542 | case HNS_ROCE_EVENT_TYPE_MB: |
---|
5534 | 5543 | hns_roce_cmd_event(hr_dev, |
---|
5535 | 5544 | le16_to_cpu(aeqe->event.cmd.token), |
---|
5536 | 5545 | aeqe->event.cmd.status, |
---|
5537 | 5546 | le64_to_cpu(aeqe->event.cmd.out_param)); |
---|
5538 | 5547 | break; |
---|
| 5548 | + case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW: |
---|
5539 | 5549 | case HNS_ROCE_EVENT_TYPE_CEQ_OVERFLOW: |
---|
5540 | | - break; |
---|
5541 | 5550 | case HNS_ROCE_EVENT_TYPE_FLR: |
---|
5542 | 5551 | break; |
---|
5543 | 5552 | default: |
---|