aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw.h2
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_cm.c20
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_hw.c4
3 files changed, 20 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/i40iw/i40iw.h b/drivers/infiniband/hw/i40iw/i40iw.h
index ef188e6b1f89..51b828026b53 100644
--- a/drivers/infiniband/hw/i40iw/i40iw.h
+++ b/drivers/infiniband/hw/i40iw/i40iw.h
@@ -512,7 +512,7 @@ u32 i40iw_initialize_hw_resources(struct i40iw_device *iwdev);
512 512
513int i40iw_register_rdma_device(struct i40iw_device *iwdev); 513int i40iw_register_rdma_device(struct i40iw_device *iwdev);
514void i40iw_port_ibevent(struct i40iw_device *iwdev); 514void i40iw_port_ibevent(struct i40iw_device *iwdev);
515int i40iw_cm_disconn(struct i40iw_qp *); 515void i40iw_cm_disconn(struct i40iw_qp *iwqp);
516void i40iw_cm_disconn_worker(void *); 516void i40iw_cm_disconn_worker(void *);
517int mini_cm_recv_pkt(struct i40iw_cm_core *, struct i40iw_device *, 517int mini_cm_recv_pkt(struct i40iw_cm_core *, struct i40iw_device *,
518 struct sk_buff *); 518 struct sk_buff *);
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c
index 25af89a3cdce..ff95feaee105 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_cm.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c
@@ -3359,21 +3359,33 @@ static void i40iw_cm_init_tsa_conn(struct i40iw_qp *iwqp,
3359 * i40iw_cm_disconn - when a connection is being closed 3359 * i40iw_cm_disconn - when a connection is being closed
3360 * @iwqp: associate qp for the connection 3360 * @iwqp: associate qp for the connection
3361 */ 3361 */
3362int i40iw_cm_disconn(struct i40iw_qp *iwqp) 3362void i40iw_cm_disconn(struct i40iw_qp *iwqp)
3363{ 3363{
3364 struct disconn_work *work; 3364 struct disconn_work *work;
3365 struct i40iw_device *iwdev = iwqp->iwdev; 3365 struct i40iw_device *iwdev = iwqp->iwdev;
3366 struct i40iw_cm_core *cm_core = &iwdev->cm_core; 3366 struct i40iw_cm_core *cm_core = &iwdev->cm_core;
3367 unsigned long flags;
3367 3368
3368 work = kzalloc(sizeof(*work), GFP_ATOMIC); 3369 work = kzalloc(sizeof(*work), GFP_ATOMIC);
3369 if (!work) 3370 if (!work)
3370 return -ENOMEM; /* Timer will clean up */ 3371 return; /* Timer will clean up */
3371 3372
3373 spin_lock_irqsave(&iwdev->qptable_lock, flags);
3374 if (!iwdev->qp_table[iwqp->ibqp.qp_num]) {
3375 spin_unlock_irqrestore(&iwdev->qptable_lock, flags);
3376 i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_CM,
3377 "%s qp_id %d is already freed\n",
3378 __func__, iwqp->ibqp.qp_num);
3379 kfree(work);
3380 return;
3381 }
3372 i40iw_add_ref(&iwqp->ibqp); 3382 i40iw_add_ref(&iwqp->ibqp);
3383 spin_unlock_irqrestore(&iwdev->qptable_lock, flags);
3384
3373 work->iwqp = iwqp; 3385 work->iwqp = iwqp;
3374 INIT_WORK(&work->work, i40iw_disconnect_worker); 3386 INIT_WORK(&work->work, i40iw_disconnect_worker);
3375 queue_work(cm_core->disconn_wq, &work->work); 3387 queue_work(cm_core->disconn_wq, &work->work);
3376 return 0; 3388 return;
3377} 3389}
3378 3390
3379/** 3391/**
diff --git a/drivers/infiniband/hw/i40iw/i40iw_hw.c b/drivers/infiniband/hw/i40iw/i40iw_hw.c
index 5e2c16c725e3..b2854b11a240 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_hw.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_hw.c
@@ -308,7 +308,9 @@ void i40iw_process_aeq(struct i40iw_device *iwdev)
308 iwqp = iwdev->qp_table[info->qp_cq_id]; 308 iwqp = iwdev->qp_table[info->qp_cq_id];
309 if (!iwqp) { 309 if (!iwqp) {
310 spin_unlock_irqrestore(&iwdev->qptable_lock, flags); 310 spin_unlock_irqrestore(&iwdev->qptable_lock, flags);
311 i40iw_pr_err("qp_id %d is already freed\n", info->qp_cq_id); 311 i40iw_debug(dev, I40IW_DEBUG_AEQ,
312 "%s qp_id %d is already freed\n",
313 __func__, info->qp_cq_id);
312 continue; 314 continue;
313 } 315 }
314 i40iw_add_ref(&iwqp->ibqp); 316 i40iw_add_ref(&iwqp->ibqp);