|
@@ -55,7 +55,6 @@ static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev);
|
|
* nes_alloc_mw
|
|
* nes_alloc_mw
|
|
*/
|
|
*/
|
|
static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
|
|
static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
|
|
- unsigned long flags;
|
|
|
|
struct nes_pd *nespd = to_nespd(ibpd);
|
|
struct nes_pd *nespd = to_nespd(ibpd);
|
|
struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
|
|
struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
|
|
struct nes_device *nesdev = nesvnic->nesdev;
|
|
struct nes_device *nesdev = nesvnic->nesdev;
|
|
@@ -119,7 +118,7 @@ static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
|
|
set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, stag);
|
|
set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, stag);
|
|
|
|
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
|
|
ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
|
|
@@ -128,15 +127,7 @@ static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
|
|
" CQP Major:Minor codes = 0x%04X:0x%04X.\n",
|
|
" CQP Major:Minor codes = 0x%04X:0x%04X.\n",
|
|
stag, ret, cqp_request->major_code, cqp_request->minor_code);
|
|
stag, ret, cqp_request->major_code, cqp_request->minor_code);
|
|
if ((!ret) || (cqp_request->major_code)) {
|
|
if ((!ret) || (cqp_request->major_code)) {
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
kfree(nesmr);
|
|
kfree(nesmr);
|
|
nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
|
|
nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
|
|
if (!ret) {
|
|
if (!ret) {
|
|
@@ -144,17 +135,8 @@ static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
|
|
} else {
|
|
} else {
|
|
return ERR_PTR(-ENOMEM);
|
|
return ERR_PTR(-ENOMEM);
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
nesmr->ibmw.rkey = stag;
|
|
nesmr->ibmw.rkey = stag;
|
|
nesmr->mode = IWNES_MEMREG_TYPE_MW;
|
|
nesmr->mode = IWNES_MEMREG_TYPE_MW;
|
|
@@ -178,7 +160,6 @@ static int nes_dealloc_mw(struct ib_mw *ibmw)
|
|
struct nes_hw_cqp_wqe *cqp_wqe;
|
|
struct nes_hw_cqp_wqe *cqp_wqe;
|
|
struct nes_cqp_request *cqp_request;
|
|
struct nes_cqp_request *cqp_request;
|
|
int err = 0;
|
|
int err = 0;
|
|
- unsigned long flags;
|
|
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
/* Deallocate the window with the adapter */
|
|
/* Deallocate the window with the adapter */
|
|
@@ -194,7 +175,7 @@ static int nes_dealloc_mw(struct ib_mw *ibmw)
|
|
set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, ibmw->rkey);
|
|
set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, ibmw->rkey);
|
|
|
|
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
nes_debug(NES_DBG_MR, "Waiting for deallocate STag 0x%08X to complete.\n",
|
|
nes_debug(NES_DBG_MR, "Waiting for deallocate STag 0x%08X to complete.\n",
|
|
@@ -204,32 +185,12 @@ static int nes_dealloc_mw(struct ib_mw *ibmw)
|
|
nes_debug(NES_DBG_MR, "Deallocate STag completed, wait_event_timeout ret = %u,"
|
|
nes_debug(NES_DBG_MR, "Deallocate STag completed, wait_event_timeout ret = %u,"
|
|
" CQP Major:Minor codes = 0x%04X:0x%04X.\n",
|
|
" CQP Major:Minor codes = 0x%04X:0x%04X.\n",
|
|
ret, cqp_request->major_code, cqp_request->minor_code);
|
|
ret, cqp_request->major_code, cqp_request->minor_code);
|
|
- if ((!ret) || (cqp_request->major_code)) {
|
|
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (!ret) {
|
|
|
|
- err = -ETIME;
|
|
|
|
- } else {
|
|
|
|
- err = -EIO;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ if (!ret)
|
|
|
|
+ err = -ETIME;
|
|
|
|
+ else if (cqp_request->major_code)
|
|
|
|
+ err = -EIO;
|
|
|
|
+
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
nes_free_resource(nesadapter, nesadapter->allocated_mrs,
|
|
nes_free_resource(nesadapter, nesadapter->allocated_mrs,
|
|
(ibmw->rkey & 0x0fffff00) >> 8);
|
|
(ibmw->rkey & 0x0fffff00) >> 8);
|
|
@@ -516,7 +477,7 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
|
|
(nesfmr->nesmr.pbls_used-1) : nesfmr->nesmr.pbls_used);
|
|
(nesfmr->nesmr.pbls_used-1) : nesfmr->nesmr.pbls_used);
|
|
|
|
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
|
|
ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
|
|
@@ -526,29 +487,11 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
|
|
stag, ret, cqp_request->major_code, cqp_request->minor_code);
|
|
stag, ret, cqp_request->major_code, cqp_request->minor_code);
|
|
|
|
|
|
if ((!ret) || (cqp_request->major_code)) {
|
|
if ((!ret) || (cqp_request->major_code)) {
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
ret = (!ret) ? -ETIME : -EIO;
|
|
ret = (!ret) ? -ETIME : -EIO;
|
|
goto failed_leaf_vpbl_pages_alloc;
|
|
goto failed_leaf_vpbl_pages_alloc;
|
|
- } else {
|
|
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
nesfmr->nesmr.ibfmr.lkey = stag;
|
|
nesfmr->nesmr.ibfmr.lkey = stag;
|
|
nesfmr->nesmr.ibfmr.rkey = stag;
|
|
nesfmr->nesmr.ibfmr.rkey = stag;
|
|
nesfmr->attr = *ibfmr_attr;
|
|
nesfmr->attr = *ibfmr_attr;
|
|
@@ -1474,7 +1417,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
|
|
set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, u64temp);
|
|
set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, u64temp);
|
|
|
|
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
nes_debug(NES_DBG_QP, "Waiting for create iWARP QP%u to complete.\n",
|
|
nes_debug(NES_DBG_QP, "Waiting for create iWARP QP%u to complete.\n",
|
|
@@ -1487,15 +1430,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
|
|
nesqp->hwqp.qp_id, ret, nesdev->cqp.sq_head, nesdev->cqp.sq_tail,
|
|
nesqp->hwqp.qp_id, ret, nesdev->cqp.sq_head, nesdev->cqp.sq_tail,
|
|
cqp_request->major_code, cqp_request->minor_code);
|
|
cqp_request->major_code, cqp_request->minor_code);
|
|
if ((!ret) || (cqp_request->major_code)) {
|
|
if ((!ret) || (cqp_request->major_code)) {
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
|
|
nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
|
|
nes_free_qp_mem(nesdev, nesqp,virt_wqs);
|
|
nes_free_qp_mem(nesdev, nesqp,virt_wqs);
|
|
kfree(nesqp->allocated_buffer);
|
|
kfree(nesqp->allocated_buffer);
|
|
@@ -1504,18 +1439,10 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
|
|
} else {
|
|
} else {
|
|
return ERR_PTR(-EIO);
|
|
return ERR_PTR(-EIO);
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
|
|
+
|
|
if (ibpd->uobject) {
|
|
if (ibpd->uobject) {
|
|
uresp.mmap_sq_db_index = nesqp->mmap_sq_db_index;
|
|
uresp.mmap_sq_db_index = nesqp->mmap_sq_db_index;
|
|
uresp.actual_sq_size = sq_size;
|
|
uresp.actual_sq_size = sq_size;
|
|
@@ -1817,7 +1744,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries,
|
|
cpu_to_le32(((u32)((u64temp) >> 33)) & 0x7FFFFFFF);
|
|
cpu_to_le32(((u32)((u64temp) >> 33)) & 0x7FFFFFFF);
|
|
|
|
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
nes_debug(NES_DBG_CQ, "Waiting for create iWARP CQ%u to complete.\n",
|
|
nes_debug(NES_DBG_CQ, "Waiting for create iWARP CQ%u to complete.\n",
|
|
@@ -1827,32 +1754,15 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries,
|
|
nes_debug(NES_DBG_CQ, "Create iWARP CQ%u completed, wait_event_timeout ret = %d.\n",
|
|
nes_debug(NES_DBG_CQ, "Create iWARP CQ%u completed, wait_event_timeout ret = %d.\n",
|
|
nescq->hw_cq.cq_number, ret);
|
|
nescq->hw_cq.cq_number, ret);
|
|
if ((!ret) || (cqp_request->major_code)) {
|
|
if ((!ret) || (cqp_request->major_code)) {
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
if (!context)
|
|
if (!context)
|
|
pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
|
|
pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
|
|
nescq->hw_cq.cq_pbase);
|
|
nescq->hw_cq.cq_pbase);
|
|
nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
|
|
nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
|
|
kfree(nescq);
|
|
kfree(nescq);
|
|
return ERR_PTR(-EIO);
|
|
return ERR_PTR(-EIO);
|
|
- } else {
|
|
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
if (context) {
|
|
if (context) {
|
|
/* free the nespbl */
|
|
/* free the nespbl */
|
|
@@ -1931,7 +1841,7 @@ static int nes_destroy_cq(struct ib_cq *ib_cq)
|
|
(nescq->hw_cq.cq_number | ((u32)PCI_FUNC(nesdev->pcidev->devfn) << 16)));
|
|
(nescq->hw_cq.cq_number | ((u32)PCI_FUNC(nesdev->pcidev->devfn) << 16)));
|
|
nes_free_resource(nesadapter, nesadapter->allocated_cqs, nescq->hw_cq.cq_number);
|
|
nes_free_resource(nesadapter, nesadapter->allocated_cqs, nescq->hw_cq.cq_number);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
nes_debug(NES_DBG_CQ, "Waiting for destroy iWARP CQ%u to complete.\n",
|
|
nes_debug(NES_DBG_CQ, "Waiting for destroy iWARP CQ%u to complete.\n",
|
|
@@ -1942,37 +1852,18 @@ static int nes_destroy_cq(struct ib_cq *ib_cq)
|
|
" CQP Major:Minor codes = 0x%04X:0x%04X.\n",
|
|
" CQP Major:Minor codes = 0x%04X:0x%04X.\n",
|
|
nescq->hw_cq.cq_number, ret, cqp_request->major_code,
|
|
nescq->hw_cq.cq_number, ret, cqp_request->major_code,
|
|
cqp_request->minor_code);
|
|
cqp_request->minor_code);
|
|
- if ((!ret) || (cqp_request->major_code)) {
|
|
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (!ret) {
|
|
|
|
- nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy timeout expired\n",
|
|
|
|
|
|
+ if (!ret) {
|
|
|
|
+ nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy timeout expired\n",
|
|
nescq->hw_cq.cq_number);
|
|
nescq->hw_cq.cq_number);
|
|
- ret = -ETIME;
|
|
|
|
- } else {
|
|
|
|
- nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy failed\n",
|
|
|
|
|
|
+ ret = -ETIME;
|
|
|
|
+ } else if (cqp_request->major_code) {
|
|
|
|
+ nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy failed\n",
|
|
nescq->hw_cq.cq_number);
|
|
nescq->hw_cq.cq_number);
|
|
- ret = -EIO;
|
|
|
|
- }
|
|
|
|
|
|
+ ret = -EIO;
|
|
} else {
|
|
} else {
|
|
ret = 0;
|
|
ret = 0;
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
if (nescq->cq_mem_size)
|
|
if (nescq->cq_mem_size)
|
|
pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size,
|
|
pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size,
|
|
@@ -2096,7 +1987,7 @@ static int nes_reg_mr(struct nes_device *nesdev, struct nes_pd *nespd,
|
|
barrier();
|
|
barrier();
|
|
|
|
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
|
|
ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
|
|
@@ -2105,15 +1996,8 @@ static int nes_reg_mr(struct nes_device *nesdev, struct nes_pd *nespd,
|
|
" CQP Major:Minor codes = 0x%04X:0x%04X.\n",
|
|
" CQP Major:Minor codes = 0x%04X:0x%04X.\n",
|
|
stag, ret, cqp_request->major_code, cqp_request->minor_code);
|
|
stag, ret, cqp_request->major_code, cqp_request->minor_code);
|
|
major_code = cqp_request->major_code;
|
|
major_code = cqp_request->major_code;
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
|
|
+
|
|
if (!ret)
|
|
if (!ret)
|
|
return -ETIME;
|
|
return -ETIME;
|
|
else if (major_code)
|
|
else if (major_code)
|
|
@@ -2754,7 +2638,7 @@ static int nes_dereg_mr(struct ib_mr *ib_mr)
|
|
set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, ib_mr->rkey);
|
|
set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, ib_mr->rkey);
|
|
|
|
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
nes_debug(NES_DBG_MR, "Waiting for deallocate STag 0x%08X completed\n", ib_mr->rkey);
|
|
nes_debug(NES_DBG_MR, "Waiting for deallocate STag 0x%08X completed\n", ib_mr->rkey);
|
|
@@ -2771,15 +2655,9 @@ static int nes_dereg_mr(struct ib_mr *ib_mr)
|
|
|
|
|
|
major_code = cqp_request->major_code;
|
|
major_code = cqp_request->major_code;
|
|
minor_code = cqp_request->minor_code;
|
|
minor_code = cqp_request->minor_code;
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
|
|
+
|
|
if (!ret) {
|
|
if (!ret) {
|
|
nes_debug(NES_DBG_MR, "Timeout waiting to destroy STag,"
|
|
nes_debug(NES_DBG_MR, "Timeout waiting to destroy STag,"
|
|
" ib_mr=%p, rkey = 0x%08X\n",
|
|
" ib_mr=%p, rkey = 0x%08X\n",
|
|
@@ -2904,7 +2782,6 @@ int nes_hw_modify_qp(struct nes_device *nesdev, struct nes_qp *nesqp,
|
|
/* struct iw_cm_id *cm_id = nesqp->cm_id; */
|
|
/* struct iw_cm_id *cm_id = nesqp->cm_id; */
|
|
/* struct iw_cm_event cm_event; */
|
|
/* struct iw_cm_event cm_event; */
|
|
struct nes_cqp_request *cqp_request;
|
|
struct nes_cqp_request *cqp_request;
|
|
- unsigned long flags;
|
|
|
|
int ret;
|
|
int ret;
|
|
u16 major_code;
|
|
u16 major_code;
|
|
|
|
|
|
@@ -2932,7 +2809,7 @@ int nes_hw_modify_qp(struct nes_device *nesdev, struct nes_qp *nesqp,
|
|
set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, (u64)nesqp->nesqp_context_pbase);
|
|
set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, (u64)nesqp->nesqp_context_pbase);
|
|
|
|
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
atomic_set(&cqp_request->refcount, 2);
|
|
- nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
|
|
|
|
|
|
+ nes_post_cqp_request(nesdev, cqp_request);
|
|
|
|
|
|
/* Wait for CQP */
|
|
/* Wait for CQP */
|
|
if (wait_completion) {
|
|
if (wait_completion) {
|
|
@@ -2950,15 +2827,9 @@ int nes_hw_modify_qp(struct nes_device *nesdev, struct nes_qp *nesqp,
|
|
nesqp->hwqp.qp_id, cqp_request->major_code,
|
|
nesqp->hwqp.qp_id, cqp_request->major_code,
|
|
cqp_request->minor_code, next_iwarp_state);
|
|
cqp_request->minor_code, next_iwarp_state);
|
|
}
|
|
}
|
|
- if (atomic_dec_and_test(&cqp_request->refcount)) {
|
|
|
|
- if (cqp_request->dynamic) {
|
|
|
|
- kfree(cqp_request);
|
|
|
|
- } else {
|
|
|
|
- spin_lock_irqsave(&nesdev->cqp.lock, flags);
|
|
|
|
- list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
|
|
|
|
- spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ nes_put_cqp_request(nesdev, cqp_request);
|
|
|
|
+
|
|
if (!ret)
|
|
if (!ret)
|
|
return -ETIME;
|
|
return -ETIME;
|
|
else if (major_code)
|
|
else if (major_code)
|