From 39c9dce0fa798324d61781f3ec3963e37d0e85b2 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Thu, 5 Mar 2026 15:47:03 -0800 Subject: [PATCH] cndm: Check for queue allocation failures in the driver Signed-off-by: Alex Forencich --- src/cndm/modules/cndm/cndm.h | 3 +++ src/cndm/modules/cndm/cndm_cq.c | 15 +++++++++++++++ src/cndm/modules/cndm/cndm_rq.c | 12 +++++++++++- src/cndm/modules/cndm/cndm_sq.c | 12 +++++++++++- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/cndm/modules/cndm/cndm.h b/src/cndm/modules/cndm/cndm.h index d7aea9e..b05a65e 100644 --- a/src/cndm/modules/cndm/cndm.h +++ b/src/cndm/modules/cndm/cndm.h @@ -136,6 +136,9 @@ struct cndm_cq { struct cndm_ring *src_ring; void (*handler)(struct cndm_cq *cq); + + u32 db_offset; + u8 __iomem *db_addr; }; struct cndm_priv { diff --git a/src/cndm/modules/cndm/cndm_cq.c b/src/cndm/modules/cndm/cndm_cq.c index 54e08dc..344ea10 100644 --- a/src/cndm/modules/cndm/cndm_cq.c +++ b/src/cndm/modules/cndm/cndm_cq.c @@ -27,6 +27,9 @@ struct cndm_cq *cndm_create_cq(struct cndm_priv *priv) cq->cons_ptr = 0; + cq->db_offset = 0; + cq->db_addr = NULL; + return cq; } @@ -74,10 +77,20 @@ int cndm_open_cq(struct cndm_cq *cq, int irqn, int size) cndm_exec_cmd(cq->cdev, &cmd, &rsp); + if (rsp.dboffs == 0) { + netdev_err(cq->priv->ndev, "Failed to allocate CQ"); + ret = -1; + goto fail; + } + cq->cqn = rsp.qn; + cq->db_offset = rsp.dboffs; + cq->db_addr = cq->cdev->hw_addr + rsp.dboffs; cq->enabled = 1; + netdev_dbg(cq->priv->ndev, "Opened CQ %d", cq->cqn); + return 0; fail: @@ -102,6 +115,8 @@ void cndm_close_cq(struct cndm_cq *cq) cndm_exec_cmd(cdev, &cmd, &rsp); cq->cqn = -1; + cq->db_offset = 0; + cq->db_addr = NULL; } if (cq->buf) { diff --git a/src/cndm/modules/cndm/cndm_rq.c b/src/cndm/modules/cndm/cndm_rq.c index 12fa8f9..1dbfe2f 100644 --- a/src/cndm/modules/cndm/cndm_rq.c +++ b/src/cndm/modules/cndm/cndm_rq.c @@ -87,12 +87,20 @@ int cndm_open_rq(struct cndm_ring *rq, struct cndm_priv *priv, struct cndm_cq *c cndm_exec_cmd(rq->cdev, &cmd, &rsp); + if (rsp.dboffs == 0) { + netdev_err(rq->priv->ndev, "Failed to allocate RQ"); + ret = -1; + goto fail; + } + rq->index = rsp.qn; rq->db_offset = rsp.dboffs; - rq->db_addr = priv->cdev->hw_addr + rsp.dboffs; + rq->db_addr = rq->cdev->hw_addr + rsp.dboffs; rq->enabled = 1; + netdev_dbg(cq->priv->ndev, "Opened RQ %d (CQ %d)", rq->index, cq->cqn); + ret = cndm_refill_rx_buffers(rq); if (ret) { netdev_err(priv->ndev, "failed to allocate RX buffer for RX queue index %d (of %u total) entry index %u (of %u total)", @@ -135,6 +143,8 @@ void cndm_close_rq(struct cndm_ring *rq) cndm_exec_cmd(cdev, &cmd, &rsp); rq->index = -1; + rq->db_offset = 0; + rq->db_addr = NULL; } if (rq->buf) { diff --git a/src/cndm/modules/cndm/cndm_sq.c b/src/cndm/modules/cndm/cndm_sq.c index 3bc4d45..8f3f446 100644 --- a/src/cndm/modules/cndm/cndm_sq.c +++ b/src/cndm/modules/cndm/cndm_sq.c @@ -87,12 +87,20 @@ int cndm_open_sq(struct cndm_ring *sq, struct cndm_priv *priv, struct cndm_cq *c cndm_exec_cmd(sq->cdev, &cmd, &rsp); + if (rsp.dboffs == 0) { + netdev_err(sq->priv->ndev, "Failed to allocate SQ"); + ret = -1; + goto fail; + } + sq->index = rsp.qn; sq->db_offset = rsp.dboffs; - sq->db_addr = priv->cdev->hw_addr + rsp.dboffs; + sq->db_addr = sq->cdev->hw_addr + rsp.dboffs; sq->enabled = 1; + netdev_dbg(cq->priv->ndev, "Opened SQ %d (CQ %d)", sq->index, cq->cqn); + return 0; fail: @@ -124,6 +132,8 @@ void cndm_close_sq(struct cndm_ring *sq) cndm_exec_cmd(cdev, &cmd, &rsp); sq->index = -1; + sq->db_offset = 0; + sq->db_addr = NULL; } if (sq->buf) {