/* The only part of the 'fd' we can't memcmp() is the ppid */ static bool fd_neq(const struct qm_fd *a, const struct qm_fd *b) { bool neq = qm_fd_addr_get64(a) != qm_fd_addr_get64(b); neq |= qm_fd_get_format(a) != qm_fd_get_format(b); neq |= a->cfg != b->cfg; neq |= a->cmd != b->cmd; return neq; }
static void caam_fq_ern_cb(struct qman_portal *qm, struct qman_fq *fq, const union qm_mr_entry *msg) { const struct qm_fd *fd; struct caam_drv_req *drv_req; struct device *qidev = &(raw_cpu_ptr(&pcpu_qipriv)->net_dev.dev); fd = &msg->ern.fd; if (qm_fd_get_format(fd) != qm_fd_compound) { dev_err(qidev, "Non-compound FD from CAAM\n"); return; } drv_req = (struct caam_drv_req *)phys_to_virt(qm_fd_addr_get64(fd)); if (!drv_req) { dev_err(qidev, "Can't find original request for CAAM response\n"); return; } dma_unmap_single(drv_req->drv_ctx->qidev, qm_fd_addr(fd), sizeof(drv_req->fd_sgt), DMA_BIDIRECTIONAL); drv_req->cbk(drv_req, -EIO); }
/* The only part of the 'fd' we can't memcmp() is the ppid */ static int fd_cmp(const struct qm_fd *a, const struct qm_fd *b) { int r = (qm_fd_addr_get64(a) == qm_fd_addr_get64(b)) ? 0 : -1; if (!r) { enum qm_fd_format fmt_a, fmt_b; fmt_a = qm_fd_get_format(a); fmt_b = qm_fd_get_format(b); r = fmt_a - fmt_b; } if (!r) r = a->cfg - b->cfg; if (!r) r = a->cmd - b->cmd; return r; }
static enum qman_cb_dqrr_result caam_rsp_fq_dqrr_cb(struct qman_portal *p, struct qman_fq *rsp_fq, const struct qm_dqrr_entry *dqrr) { struct caam_napi *caam_napi = raw_cpu_ptr(&pcpu_qipriv.caam_napi); struct caam_drv_req *drv_req; const struct qm_fd *fd; struct device *qidev = &(raw_cpu_ptr(&pcpu_qipriv)->net_dev.dev); u32 status; if (caam_qi_napi_schedule(p, caam_napi)) return qman_cb_dqrr_stop; fd = &dqrr->fd; status = be32_to_cpu(fd->status); if (unlikely(status)) { u32 ssrc = status & JRSTA_SSRC_MASK; u8 err_id = status & JRSTA_CCBERR_ERRID_MASK; if (ssrc != JRSTA_SSRC_CCB_ERROR || err_id != JRSTA_CCBERR_ERRID_ICVCHK) dev_err(qidev, "Error: %#x in CAAM response FD\n", status); } if (unlikely(qm_fd_get_format(fd) != qm_fd_compound)) { dev_err(qidev, "Non-compound FD from CAAM\n"); return qman_cb_dqrr_consume; } drv_req = (struct caam_drv_req *)phys_to_virt(qm_fd_addr_get64(fd)); if (unlikely(!drv_req)) { dev_err(qidev, "Can't find original request for caam response\n"); return qman_cb_dqrr_consume; } dma_unmap_single(drv_req->drv_ctx->qidev, qm_fd_addr(fd), sizeof(drv_req->fd_sgt), DMA_BIDIRECTIONAL); drv_req->cbk(drv_req, status); return qman_cb_dqrr_consume; }
static void fd_inc(struct qm_fd *fd) { u64 t = qm_fd_addr_get64(fd); int z = t >> 40; unsigned int len, off; enum qm_fd_format fmt; t <<= 1; if (z) t |= 1; qm_fd_addr_set64(fd, t); fmt = qm_fd_get_format(fd); off = qm_fd_get_offset(fd); len = qm_fd_get_length(fd); len--; qm_fd_set_param(fd, fmt, off, len); fd->cmd = cpu_to_be32(be32_to_cpu(fd->cmd) + 1); }