void do_srq_table_rpl(struct adapter *adap, const struct cpl_srq_table_rpl *rpl) { unsigned int idx = TID_TID_G(GET_TID(rpl)); struct srq_data *s = adap->srq; struct srq_entry *e; if (unlikely(rpl->status != CPL_CONTAINS_READ_RPL)) { dev_err(adap->pdev_dev, "Unexpected SRQ_TABLE_RPL status %u for entry %u\n", rpl->status, idx); goto out; } /* Store the read entry */ e = s->entryp; e->valid = 1; e->idx = idx; e->pdid = SRQT_PDID_G(be64_to_cpu(rpl->rsvd_pdid)); e->qlen = SRQT_QLEN_G(be32_to_cpu(rpl->qlen_qbase)); e->qbase = SRQT_QBASE_G(be32_to_cpu(rpl->qlen_qbase)); e->cur_msn = be16_to_cpu(rpl->cur_msn); e->max_msn = be16_to_cpu(rpl->max_msn); out: complete(&s->comp); }
void hash_filter_rpl(struct adapter *adap, const struct cpl_act_open_rpl *rpl) { unsigned int ftid = TID_TID_G(AOPEN_ATID_G(ntohl(rpl->atid_status))); unsigned int status = AOPEN_STATUS_G(ntohl(rpl->atid_status)); struct tid_info *t = &adap->tids; unsigned int tid = GET_TID(rpl); struct filter_ctx *ctx = NULL; struct filter_entry *f; dev_dbg(adap->pdev_dev, "%s: tid = %u; atid = %u; status = %u\n", __func__, tid, ftid, status); f = lookup_atid(t, ftid); if (!f) { dev_err(adap->pdev_dev, "%s:could not find filter entry", __func__); return; } ctx = f->ctx; f->ctx = NULL; switch (status) { case CPL_ERR_NONE: f->tid = tid; f->pending = 0; f->valid = 1; cxgb4_insert_tid(t, f, f->tid, 0); cxgb4_free_atid(t, ftid); if (ctx) { ctx->tid = f->tid; ctx->result = 0; } if (configure_filter_tcb(adap, tid, f)) { clear_filter(adap, f); cxgb4_remove_tid(t, 0, tid, 0); kfree(f); if (ctx) { ctx->result = -EINVAL; complete(&ctx->completion); } return; } break; default: dev_err(adap->pdev_dev, "%s: filter creation PROBLEM; status = %u\n", __func__, status); if (ctx) { if (status == CPL_ERR_TCAM_FULL) ctx->result = -EAGAIN; else ctx->result = -EINVAL; } clear_filter(adap, f); cxgb4_free_atid(t, ftid); kfree(f); } if (ctx) complete(&ctx->completion); }