diff options
Diffstat (limited to 'drivers/infiniband/hw/mthca')
| -rw-r--r-- | drivers/infiniband/hw/mthca/mthca_eq.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mthca/mthca_main.c | 8 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mthca/mthca_provider.c | 43 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mthca/mthca_qp.c | 3 | 
4 files changed, 25 insertions, 31 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_eq.c b/drivers/infiniband/hw/mthca/mthca_eq.c index 7c9d35f39d7..69020173899 100644 --- a/drivers/infiniband/hw/mthca/mthca_eq.c +++ b/drivers/infiniband/hw/mthca/mthca_eq.c @@ -357,7 +357,7 @@ static int mthca_eq_int(struct mthca_dev *dev, struct mthca_eq *eq)  			mthca_warn(dev, "Unhandled event %02x(%02x) on EQ %d\n",  				   eqe->type, eqe->subtype, eq->eqn);  			break; -		}; +		}  		set_eqe_hw(eqe);  		++eq->cons_index; diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 87897b95666..ded76c101dd 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c @@ -858,13 +858,9 @@ static int mthca_enable_msi_x(struct mthca_dev *mdev)  	entries[1].entry = 1;  	entries[2].entry = 2; -	err = pci_enable_msix(mdev->pdev, entries, ARRAY_SIZE(entries)); -	if (err) { -		if (err > 0) -			mthca_info(mdev, "Only %d MSI-X vectors available, " -				   "not using MSI-X\n", err); +	err = pci_enable_msix_exact(mdev->pdev, entries, ARRAY_SIZE(entries)); +	if (err)  		return err; -	}  	mdev->eq_table.eq[MTHCA_EQ_COMP ].msi_x_vector = entries[0].vector;  	mdev->eq_table.eq[MTHCA_EQ_ASYNC].msi_x_vector = entries[1].vector; diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index 5b71d43bd89..415f8e1a54d 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -695,6 +695,7 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev, int entries,  	if (context && ib_copy_to_udata(udata, &cq->cqn, sizeof (__u32))) {  		mthca_free_cq(to_mdev(ibdev), cq); +		err = -EFAULT;  		goto err_free;  	} @@ -976,12 +977,12 @@ static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,  				       u64 virt, int acc, struct ib_udata *udata)  {  	struct mthca_dev *dev = to_mdev(pd->device); -	struct ib_umem_chunk *chunk; +	struct scatterlist *sg;  	struct mthca_mr *mr;  	struct mthca_reg_mr ucmd;  	u64 *pages;  	int shift, n, len; -	int i, j, k; +	int i, k, entry;  	int err = 0;  	int write_mtt_size; @@ -1009,10 +1010,7 @@ static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,  	}  	shift = ffs(mr->umem->page_size) - 1; - -	n = 0; -	list_for_each_entry(chunk, &mr->umem->chunk_list, list) -		n += chunk->nents; +	n = mr->umem->nmap;  	mr->mtt = mthca_alloc_mtt(dev, n);  	if (IS_ERR(mr->mtt)) { @@ -1030,25 +1028,24 @@ static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,  	write_mtt_size = min(mthca_write_mtt_size(dev), (int) (PAGE_SIZE / sizeof *pages)); -	list_for_each_entry(chunk, &mr->umem->chunk_list, list) -		for (j = 0; j < chunk->nmap; ++j) { -			len = sg_dma_len(&chunk->page_list[j]) >> shift; -			for (k = 0; k < len; ++k) { -				pages[i++] = sg_dma_address(&chunk->page_list[j]) + -					mr->umem->page_size * k; -				/* -				 * Be friendly to write_mtt and pass it chunks -				 * of appropriate size. -				 */ -				if (i == write_mtt_size) { -					err = mthca_write_mtt(dev, mr->mtt, n, pages, i); -					if (err) -						goto mtt_done; -					n += i; -					i = 0; -				} +	for_each_sg(mr->umem->sg_head.sgl, sg, mr->umem->nmap, entry) { +		len = sg_dma_len(sg) >> shift; +		for (k = 0; k < len; ++k) { +			pages[i++] = sg_dma_address(sg) + +				mr->umem->page_size * k; +			/* +			 * Be friendly to write_mtt and pass it chunks +			 * of appropriate size. +			 */ +			if (i == write_mtt_size) { +				err = mthca_write_mtt(dev, mr->mtt, n, pages, i); +				if (err) +					goto mtt_done; +				n += i; +				i = 0;  			}  		} +	}  	if (i)  		err = mthca_write_mtt(dev, mr->mtt, n, pages, i); diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index 26a68453610..e354b2f04ad 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c @@ -860,7 +860,8 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask,  	new_state = attr_mask & IB_QP_STATE ? attr->qp_state : cur_state; -	if (!ib_modify_qp_is_ok(cur_state, new_state, ibqp->qp_type, attr_mask)) { +	if (!ib_modify_qp_is_ok(cur_state, new_state, ibqp->qp_type, attr_mask, +				IB_LINK_LAYER_UNSPECIFIED)) {  		mthca_dbg(dev, "Bad QP transition (transport %d) "  			  "%d->%d with attr 0x%08x\n",  			  qp->transport, cur_state, new_state,  | 
