int siw_destroy_cq(struct ib_cq *ofa_cq) { struct siw_cq *cq = siw_cq_ofa2siw(ofa_cq); struct ib_device *ofa_dev = ofa_cq->device; struct siw_dev *sdev = siw_dev_ofa2siw(ofa_dev); siw_remove_obj(&sdev->idr_lock, &sdev->cq_idr, &cq->hdr); siw_cq_put(cq); return 0; }
/* * siw_poll_cq() * * Reap CQ entries if available and copy work completion status into * array of WC's provided by caller. Returns number of reaped CQE's. * * @ofa_cq: OFA CQ contained in siw CQ. * @num_cqe: Maximum number of CQE's to reap. * @wc: Array of work completions to be filled by siw. */ int siw_poll_cq(struct ib_cq *ofa_cq, int num_cqe, struct ib_wc *wc) { struct siw_cq *cq = siw_cq_ofa2siw(ofa_cq); int i; for (i = 0; i < num_cqe; i++) { if (!(siw_reap_cqe(cq, wc))) break; wc++; } dprint(DBG_CQ, " CQ%d: reap %d completions (%d left)\n", OBJ_ID(cq), i, atomic_read(&cq->qlen)); return i; }
/* * siw_req_notify_cq() * * Request notification for new CQE's added to that CQ. * Defined flags: * o SIW_CQ_NOTIFY_SOLICITED lets siw trigger a notification * event if a WQE with notification flag set enters the CQ * o SIW_CQ_NOTIFY_NEXT_COMP lets siw trigger a notification * event if a WQE enters the CQ. * o IB_CQ_REPORT_MISSED_EVENTS: return value will provide the * number of not reaped CQE's regardless of its notification * type and current or new CQ notification settings. * * @ofa_cq: OFA CQ contained in siw CQ. * @flags: Requested notification flags. */ int siw_req_notify_cq(struct ib_cq *ofa_cq, enum ib_cq_notify_flags flags) { struct siw_cq *cq = siw_cq_ofa2siw(ofa_cq); dprint(DBG_EH, "(CQ%d:) flags: 0x%8x\n", OBJ_ID(cq), flags); if ((flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED) cq->notify = SIW_CQ_NOTIFY_SOLICITED; else cq->notify = SIW_CQ_NOTIFY_ALL; if (flags & IB_CQ_REPORT_MISSED_EVENTS) return atomic_read(&cq->qlen); return 0; }