Example #1
0
void
bfa_msix_rspq(struct bfa_s *bfa, int qid)
{
    struct bfi_msg_s *m;
    u32 pi, ci;
    struct list_head *waitq;

    bfa_trc_fp(bfa, qid);

    qid &= (BFI_IOC_MAX_CQS - 1);

    bfa->iocfc.hwif.hw_rspq_ack(bfa, qid);

    ci = bfa_rspq_ci(bfa, qid);
    pi = bfa_rspq_pi(bfa, qid);

    bfa_trc_fp(bfa, ci);
    bfa_trc_fp(bfa, pi);

    if (bfa->rme_process) {
        while (ci != pi) {
            m = bfa_rspq_elem(bfa, qid, ci);
            bfa_assert_fp(m->mhdr.msg_class < BFI_MC_MAX);

            bfa_isrs[m->mhdr.msg_class] (bfa, m);

            CQ_INCR(ci, bfa->iocfc.cfg.drvcfg.num_rspq_elems);
        }
    }

    /**
     * update CI
     */
    bfa_rspq_ci(bfa, qid) = pi;
    bfa_reg_write(bfa->iocfc.bfa_regs.rme_q_ci[qid], pi);
    bfa_os_mmiowb();

    /**
     * Resume any pending requests in the corresponding reqq.
     */
    waitq = bfa_reqq(bfa, qid);
    if (!list_empty(waitq))
        bfa_reqq_resume(bfa, qid);
}
Example #2
0
void
bfa_msix_rspq(struct bfa_s *bfa, int rsp_qid)
{
	struct bfi_msg_s      *m;
	u32        pi, ci;

	bfa_trc_fp(bfa, rsp_qid);

	rsp_qid &= (BFI_IOC_MAX_CQS - 1);

	bfa->iocfc.hwif.hw_rspq_ack(bfa, rsp_qid);

	ci = bfa_rspq_ci(bfa, rsp_qid);
	pi = bfa_rspq_pi(bfa, rsp_qid);

	bfa_trc_fp(bfa, ci);
	bfa_trc_fp(bfa, pi);

	if (bfa->rme_process) {
		while (ci != pi) {
			m = bfa_rspq_elem(bfa, rsp_qid, ci);
			bfa_assert_fp(m->mhdr.msg_class < BFI_MC_MAX);

			bfa_isrs[m->mhdr.msg_class] (bfa, m);

			CQ_INCR(ci, bfa->iocfc.cfg.drvcfg.num_rspq_elems);
		}
	}

	/**
	 * update CI
	 */
	bfa_rspq_ci(bfa, rsp_qid) = pi;
	bfa_reg_write(bfa->iocfc.bfa_regs.rme_q_ci[rsp_qid], pi);
	bfa_os_mmiowb();
}