Esempio n. 1
0
/* 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);
}
Esempio n. 3
0
/* 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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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);
}