|
@@ -225,13 +225,20 @@ int c4iw_ev_handler(struct c4iw_dev *dev, u32 qid)
|
|
|
struct c4iw_cq *chp;
|
|
|
unsigned long flag;
|
|
|
|
|
|
+ spin_lock_irqsave(&dev->lock, flag);
|
|
|
chp = get_chp(dev, qid);
|
|
|
if (chp) {
|
|
|
+ atomic_inc(&chp->refcnt);
|
|
|
+ spin_unlock_irqrestore(&dev->lock, flag);
|
|
|
t4_clear_cq_armed(&chp->cq);
|
|
|
spin_lock_irqsave(&chp->comp_handler_lock, flag);
|
|
|
(*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context);
|
|
|
spin_unlock_irqrestore(&chp->comp_handler_lock, flag);
|
|
|
- } else
|
|
|
+ if (atomic_dec_and_test(&chp->refcnt))
|
|
|
+ wake_up(&chp->wait);
|
|
|
+ } else {
|
|
|
PDBG("%s unknown cqid 0x%x\n", __func__, qid);
|
|
|
+ spin_unlock_irqrestore(&dev->lock, flag);
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|