|
@@ -31,6 +31,7 @@
|
|
|
* SOFTWARE.
|
|
|
*/
|
|
|
|
|
|
+#include <linux/pci.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
#include <rdma/ib_addr.h>
|
|
|
#include <rdma/ib_umem.h>
|
|
@@ -372,6 +373,16 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev,
|
|
|
if (hr_qp->sq.max_gs > 2)
|
|
|
hr_qp->sge.sge_cnt = roundup_pow_of_two(hr_qp->sq.wqe_cnt *
|
|
|
(hr_qp->sq.max_gs - 2));
|
|
|
+
|
|
|
+ if ((hr_qp->sq.max_gs > 2) && (hr_dev->pci_dev->revision == 0x20)) {
|
|
|
+ if (hr_qp->sge.sge_cnt > hr_dev->caps.max_extend_sg) {
|
|
|
+ dev_err(hr_dev->dev,
|
|
|
+ "The extended sge cnt error! sge_cnt=%d\n",
|
|
|
+ hr_qp->sge.sge_cnt);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
hr_qp->sge.sge_shift = 4;
|
|
|
|
|
|
/* Get buf size, SQ and RQ are aligned to page_szie */
|
|
@@ -465,6 +476,14 @@ static int hns_roce_set_kernel_sq_size(struct hns_roce_dev *hr_dev,
|
|
|
hr_qp->sge.sge_shift = 4;
|
|
|
}
|
|
|
|
|
|
+ if ((hr_qp->sq.max_gs > 2) && hr_dev->pci_dev->revision == 0x20) {
|
|
|
+ if (hr_qp->sge.sge_cnt > hr_dev->caps.max_extend_sg) {
|
|
|
+ dev_err(dev, "The extended sge cnt error! sge_cnt=%d\n",
|
|
|
+ hr_qp->sge.sge_cnt);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/* Get buf size, SQ and RQ are aligned to PAGE_SIZE */
|
|
|
page_size = 1 << (hr_dev->caps.mtt_buf_pg_sz + PAGE_SHIFT);
|
|
|
hr_qp->sq.offset = 0;
|