// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2018-2025, Advanced Micro Devices, Inc. */
#include <linux/module.h>
#include <linux/printk.h>
#include <rdma/ib_addr.h>
#include <rdma/ib_user_verbs.h>
#include "ionic_fw.h"
#include "ionic_ibdev.h"
#define IONIC_OP(version, opname) \
((version) < 2 ? IONIC_V1_OP_##opname : IONIC_V2_OP_##opname)
static bool ionic_next_cqe(struct ionic_ibdev *dev, struct ionic_cq *cq,
struct ionic_v1_cqe **cqe)
{
struct ionic_v1_cqe *qcqe = ionic_queue_at_prod(&cq->q);
if (unlikely(cq->color != ionic_v1_cqe_color(qcqe)))
return false;
/* Prevent out-of-order reads of the CQE */
dma_rmb();
*cqe = qcqe;
return true;
}
static int ionic_flush_recv(struct ionic_qp *qp, struct ib_wc *wc)
{
struct ionic_rq_meta *meta;
struct ionic_v1_wqe *wqe;
if (!qp->rq_flush)
return 0;
if (ionic_queue_empty(&qp->rq))
return 0;
wqe = ionic_queue_at_cons(&qp->rq);
/* wqe_id must be a valid queue index */
if (unlikely(wqe->base.wqe_id >> qp->rq.depth_log2)) {
ibdev_warn(qp->ibqp.device,
"flush qp %u recv index %llu invalid\n",
qp->qpid, (unsigned long long)wqe->base.wqe_id);
return -EIO;
}
/* wqe_id must indicate a request that is outstanding */
meta = &qp->