IB/core: Enhance ib_map_mr_sg()
[deliverable/linux.git] / drivers / infiniband / hw / i40iw / i40iw_verbs.c
index 2d832c758c66df7d6f69ec3fb990bd0bd31e4540..4a740f7a0519bcac97d35b86844ae844727daeb4 100644 (file)
@@ -74,7 +74,7 @@ static int i40iw_query_device(struct ib_device *ibdev,
        props->max_cqe = iwdev->max_cqe;
        props->max_mr = iwdev->max_mr;
        props->max_pd = iwdev->max_pd;
-       props->max_sge_rd = 1;
+       props->max_sge_rd = I40IW_MAX_SGE_RD;
        props->max_qp_rd_atom = I40IW_MAX_IRD_SIZE;
        props->max_qp_init_rd_atom = props->max_qp_rd_atom;
        props->atomic_cap = IB_ATOMIC_NONE;
@@ -1573,12 +1573,13 @@ static int i40iw_set_page(struct ib_mr *ibmr, u64 addr)
  * @sg: scatter gather list for fmr
  * @sg_nents: number of sg pages
  */
-static int i40iw_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents)
+static int i40iw_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
+                          int sg_nents, unsigned int *sg_offset)
 {
        struct i40iw_mr *iwmr = to_iwmr(ibmr);
 
        iwmr->npages = 0;
-       return ib_sg_to_pages(ibmr, sg, sg_nents, i40iw_set_page);
+       return ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, i40iw_set_page);
 }
 
 /**
@@ -2117,6 +2118,10 @@ static int i40iw_post_send(struct ib_qp *ibqp,
                        inv_stag = true;
                        /* fall-through*/
                case IB_WR_RDMA_READ:
+                       if (ib_wr->num_sge > I40IW_MAX_SGE_RD) {
+                               err = -EINVAL;
+                               break;
+                       }
                        info.op_type = I40IW_OP_TYPE_RDMA_READ;
                        info.op.rdma_read.rem_addr.tag_off = rdma_wr(ib_wr)->remote_addr;
                        info.op.rdma_read.rem_addr.stag = rdma_wr(ib_wr)->rkey;
@@ -2255,6 +2260,8 @@ static int i40iw_poll_cq(struct ib_cq *ibcq,
                ret = ukcq->ops.iw_cq_poll_completion(ukcq, &cq_poll_info, true);
                if (ret == I40IW_ERR_QUEUE_EMPTY) {
                        break;
+               } else if (ret == I40IW_ERR_QUEUE_DESTROYED) {
+                       continue;
                } else if (ret) {
                        if (!cqe_count)
                                cqe_count = -1;
This page took 0.025327 seconds and 5 git commands to generate.