]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/infiniband/hw/bnxt_re/ib_verbs.c
RDMA/bnxt_re: Enable atomics only if host bios supports
[karo-tx-linux.git] / drivers / infiniband / hw / bnxt_re / ib_verbs.c
index 0cd8372989ce4d4f194bf137d65500ca432e431a..7b17030d2696c83fca42ffa11a456e37fdf5e567 100644 (file)
@@ -145,10 +145,8 @@ int bnxt_re_query_device(struct ib_device *ibdev,
        ib_attr->fw_ver = (u64)(unsigned long)(dev_attr->fw_ver);
        bnxt_qplib_get_guid(rdev->netdev->dev_addr,
                            (u8 *)&ib_attr->sys_image_guid);
-       ib_attr->max_mr_size = ~0ull;
-       ib_attr->page_size_cap = BNXT_RE_PAGE_SIZE_4K | BNXT_RE_PAGE_SIZE_8K |
-                                BNXT_RE_PAGE_SIZE_64K | BNXT_RE_PAGE_SIZE_2M |
-                                BNXT_RE_PAGE_SIZE_8M | BNXT_RE_PAGE_SIZE_1G;
+       ib_attr->max_mr_size = BNXT_RE_MAX_MR_SIZE;
+       ib_attr->page_size_cap = BNXT_RE_PAGE_SIZE_4K;
 
        ib_attr->vendor_id = rdev->en_dev->pdev->vendor;
        ib_attr->vendor_part_id = rdev->en_dev->pdev->device;
@@ -174,9 +172,11 @@ int bnxt_re_query_device(struct ib_device *ibdev,
        ib_attr->max_mr = dev_attr->max_mr;
        ib_attr->max_pd = dev_attr->max_pd;
        ib_attr->max_qp_rd_atom = dev_attr->max_qp_rd_atom;
-       ib_attr->max_qp_init_rd_atom = dev_attr->max_qp_rd_atom;
-       ib_attr->atomic_cap = IB_ATOMIC_HCA;
-       ib_attr->masked_atomic_cap = IB_ATOMIC_HCA;
+       ib_attr->max_qp_init_rd_atom = dev_attr->max_qp_init_rd_atom;
+       if (dev_attr->is_atomic) {
+               ib_attr->atomic_cap = IB_ATOMIC_HCA;
+               ib_attr->masked_atomic_cap = IB_ATOMIC_HCA;
+       }
 
        ib_attr->max_ee_rd_atom = 0;
        ib_attr->max_res_rd_atom = 0;
@@ -1514,13 +1514,24 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
        if (qp_attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
                qp->qplib_qp.modify_flags |=
                                CMDQ_MODIFY_QP_MODIFY_MASK_MAX_RD_ATOMIC;
-               qp->qplib_qp.max_rd_atomic = qp_attr->max_rd_atomic;
+               /* Cap the max_rd_atomic to device max */
+               qp->qplib_qp.max_rd_atomic = min_t(u32, qp_attr->max_rd_atomic,
+                                                  dev_attr->max_qp_rd_atom);
        }
        if (qp_attr_mask & IB_QP_SQ_PSN) {
                qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_SQ_PSN;
                qp->qplib_qp.sq.psn = qp_attr->sq_psn;
        }
        if (qp_attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
+               if (qp_attr->max_dest_rd_atomic >
+                   dev_attr->max_qp_init_rd_atom) {
+                       dev_err(rdev_to_dev(rdev),
+                               "max_dest_rd_atomic requested%d is > dev_max%d",
+                               qp_attr->max_dest_rd_atomic,
+                               dev_attr->max_qp_init_rd_atom);
+                       return -EINVAL;
+               }
+
                qp->qplib_qp.modify_flags |=
                                CMDQ_MODIFY_QP_MODIFY_MASK_MAX_DEST_RD_ATOMIC;
                qp->qplib_qp.max_dest_rd_atomic = qp_attr->max_dest_rd_atomic;
@@ -3229,6 +3240,12 @@ struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,
        struct scatterlist *sg;
        int entry;
 
+       if (length > BNXT_RE_MAX_MR_SIZE) {
+               dev_err(rdev_to_dev(rdev), "MR Size: %lld > Max supported:%ld\n",
+                       length, BNXT_RE_MAX_MR_SIZE);
+               return ERR_PTR(-ENOMEM);
+       }
+
        mr = kzalloc(sizeof(*mr), GFP_KERNEL);
        if (!mr)
                return ERR_PTR(-ENOMEM);