]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
enic: add type-aware alloc for WQ, RQ, CQ and INTR resources
authorSatish Kharat <satishkh@cisco.com>
Wed, 1 Apr 2026 15:31:15 +0000 (08:31 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 3 Apr 2026 01:05:06 +0000 (18:05 -0700)
The existing vnic_wq_alloc(), vnic_rq_alloc(), vnic_cq_alloc() and
vnic_intr_alloc() hardcode data-path resource types (RES_TYPE_WQ,
RES_TYPE_RQ, RES_TYPE_CQ, RES_TYPE_INTR_CTRL). The upcoming admin
channel uses different BAR resource types (RES_TYPE_ADMIN_WQ/RQ/CQ,
RES_TYPE_SRIOV_INTR) for its queues.

Add _with_type() variants that accept an explicit resource type
parameter. Refactor the original functions as thin wrappers that
pass the default data-path type. No functional change.

Signed-off-by: Satish Kharat <satishkh@cisco.com>
Link: https://patch.msgid.link/20260401-enic-sriov-v2-prep-v4-5-d5834b2ef1b9@cisco.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/cisco/enic/vnic_cq.c
drivers/net/ethernet/cisco/enic/vnic_cq.h
drivers/net/ethernet/cisco/enic/vnic_intr.c
drivers/net/ethernet/cisco/enic/vnic_intr.h
drivers/net/ethernet/cisco/enic/vnic_rq.c
drivers/net/ethernet/cisco/enic/vnic_rq.h
drivers/net/ethernet/cisco/enic/vnic_wq.c
drivers/net/ethernet/cisco/enic/vnic_wq.h

index 27c885e915523fded95259953f7c3cad01047f7d..5a0dbb81622381136e4defb16cbda7a7626aebaf 100644 (file)
@@ -20,13 +20,14 @@ void vnic_cq_free(struct vnic_cq *cq)
        cq->ctrl = NULL;
 }
 
-int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index,
-       unsigned int desc_count, unsigned int desc_size)
+int vnic_cq_alloc_with_type(struct vnic_dev *vdev, struct vnic_cq *cq,
+                           unsigned int index, unsigned int desc_count,
+                           unsigned int desc_size, unsigned int res_type)
 {
        cq->index = index;
        cq->vdev = vdev;
 
-       cq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_CQ, index);
+       cq->ctrl = vnic_dev_get_res(vdev, res_type, index);
        if (!cq->ctrl) {
                vdev_err(vdev, "Failed to hook CQ[%d] resource\n", index);
                return -EINVAL;
@@ -35,6 +36,13 @@ int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index,
        return vnic_dev_alloc_desc_ring(vdev, &cq->ring, desc_count, desc_size);
 }
 
+int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index,
+                 unsigned int desc_count, unsigned int desc_size)
+{
+       return vnic_cq_alloc_with_type(vdev, cq, index, desc_count, desc_size,
+                                      RES_TYPE_CQ);
+}
+
 void vnic_cq_init(struct vnic_cq *cq, unsigned int flow_control_enable,
        unsigned int color_enable, unsigned int cq_head, unsigned int cq_tail,
        unsigned int cq_tail_color, unsigned int interrupt_enable,
index 0e37f5d5e5272ed82773b9c16008087ef2dc6dd7..d46d4d2ef6bbac7fa1aa7e586eec88c4fa722eee 100644 (file)
@@ -73,6 +73,9 @@ static inline void vnic_cq_inc_to_clean(struct vnic_cq *cq)
 void vnic_cq_free(struct vnic_cq *cq);
 int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index,
        unsigned int desc_count, unsigned int desc_size);
+int vnic_cq_alloc_with_type(struct vnic_dev *vdev, struct vnic_cq *cq,
+                           unsigned int index, unsigned int desc_count,
+                           unsigned int desc_size, unsigned int res_type);
 void vnic_cq_init(struct vnic_cq *cq, unsigned int flow_control_enable,
        unsigned int color_enable, unsigned int cq_head, unsigned int cq_tail,
        unsigned int cq_tail_color, unsigned int interrupt_enable,
index 25319f072a04afa3d1c75df189a06dbf76b754d9..010ad8c2108de237213ec6e7553538aa3aef14cc 100644 (file)
@@ -19,13 +19,13 @@ void vnic_intr_free(struct vnic_intr *intr)
        intr->ctrl = NULL;
 }
 
-int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
-       unsigned int index)
+int vnic_intr_alloc_with_type(struct vnic_dev *vdev, struct vnic_intr *intr,
+                             unsigned int index, unsigned int res_type)
 {
        intr->index = index;
        intr->vdev = vdev;
 
-       intr->ctrl = vnic_dev_get_res(vdev, RES_TYPE_INTR_CTRL, index);
+       intr->ctrl = vnic_dev_get_res(vdev, res_type, index);
        if (!intr->ctrl) {
                vdev_err(vdev, "Failed to hook INTR[%d].ctrl resource\n",
                         index);
@@ -35,6 +35,12 @@ int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
        return 0;
 }
 
+int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
+                   unsigned int index)
+{
+       return vnic_intr_alloc_with_type(vdev, intr, index, RES_TYPE_INTR_CTRL);
+}
+
 void vnic_intr_init(struct vnic_intr *intr, u32 coalescing_timer,
        unsigned int coalescing_type, unsigned int mask_on_assertion)
 {
index 33a72aa10b26c7adce1b0b56a081fcc6933260c5..2bc2dbffdb80d3a6da631ec94453976cf7e25cca 100644 (file)
@@ -89,6 +89,8 @@ static inline u32 vnic_intr_legacy_pba(u32 __iomem *legacy_pba)
 void vnic_intr_free(struct vnic_intr *intr);
 int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
        unsigned int index);
+int vnic_intr_alloc_with_type(struct vnic_dev *vdev, struct vnic_intr *intr,
+                             unsigned int index, unsigned int res_type);
 void vnic_intr_init(struct vnic_intr *intr, u32 coalescing_timer,
        unsigned int coalescing_type, unsigned int mask_on_assertion);
 void vnic_intr_coalescing_timer_set(struct vnic_intr *intr,
index 5ae80551f17c66daa61f24ae030c3232fb99b62a..a662d9fd119945a8d7f4524de4595329c2e23200 100644 (file)
@@ -69,15 +69,16 @@ void vnic_rq_free(struct vnic_rq *rq)
        rq->ctrl = NULL;
 }
 
-int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
-       unsigned int desc_count, unsigned int desc_size)
+int vnic_rq_alloc_with_type(struct vnic_dev *vdev, struct vnic_rq *rq,
+                           unsigned int index, unsigned int desc_count,
+                           unsigned int desc_size, unsigned int res_type)
 {
        int err;
 
        rq->index = index;
        rq->vdev = vdev;
 
-       rq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_RQ, index);
+       rq->ctrl = vnic_dev_get_res(vdev, res_type, index);
        if (!rq->ctrl) {
                vdev_err(vdev, "Failed to hook RQ[%d] resource\n", index);
                return -EINVAL;
@@ -98,6 +99,13 @@ int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
        return 0;
 }
 
+int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
+                 unsigned int desc_count, unsigned int desc_size)
+{
+       return vnic_rq_alloc_with_type(vdev, rq, index, desc_count, desc_size,
+                                      RES_TYPE_RQ);
+}
+
 static void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
        unsigned int fetch_index, unsigned int posted_index,
        unsigned int error_interrupt_enable,
index a1cdd729caece5c3378c3a8025cedf9b2bf758ab..9fc2090eac447e88148b145329aa6f57a7f82523 100644 (file)
@@ -196,6 +196,9 @@ static inline int vnic_rq_fill(struct vnic_rq *rq,
 void vnic_rq_free(struct vnic_rq *rq);
 int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
        unsigned int desc_count, unsigned int desc_size);
+int vnic_rq_alloc_with_type(struct vnic_dev *vdev, struct vnic_rq *rq,
+                           unsigned int index, unsigned int desc_count,
+                           unsigned int desc_size, unsigned int res_type);
 void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
        unsigned int error_interrupt_enable,
        unsigned int error_interrupt_offset);
index 29c7900349b2dc2ee31c173aba545cf69219d221..5a20bdc621415ae8a537684db874d28b7da3ee65 100644 (file)
@@ -72,15 +72,16 @@ void vnic_wq_free(struct vnic_wq *wq)
        wq->ctrl = NULL;
 }
 
-int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index,
-       unsigned int desc_count, unsigned int desc_size)
+int vnic_wq_alloc_with_type(struct vnic_dev *vdev, struct vnic_wq *wq,
+                           unsigned int index, unsigned int desc_count,
+                           unsigned int desc_size, unsigned int res_type)
 {
        int err;
 
        wq->index = index;
        wq->vdev = vdev;
 
-       wq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_WQ, index);
+       wq->ctrl = vnic_dev_get_res(vdev, res_type, index);
        if (!wq->ctrl) {
                vdev_err(vdev, "Failed to hook WQ[%d] resource\n", index);
                return -EINVAL;
@@ -101,6 +102,13 @@ int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index,
        return 0;
 }
 
+int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index,
+                 unsigned int desc_count, unsigned int desc_size)
+{
+       return vnic_wq_alloc_with_type(vdev, wq, index, desc_count, desc_size,
+                                      RES_TYPE_WQ);
+}
+
 int enic_wq_devcmd2_alloc(struct vnic_dev *vdev, struct vnic_wq *wq,
                          unsigned int desc_count, unsigned int desc_size)
 {
index 3bb4758100ba481c3bd7a873203e8b033d6b99a6..1d448b7a9ba25c9ef3fce87725ad50ef0fc5fcd2 100644 (file)
@@ -165,6 +165,9 @@ static inline void vnic_wq_service(struct vnic_wq *wq,
 void vnic_wq_free(struct vnic_wq *wq);
 int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index,
        unsigned int desc_count, unsigned int desc_size);
+int vnic_wq_alloc_with_type(struct vnic_dev *vdev, struct vnic_wq *wq,
+                           unsigned int index, unsigned int desc_count,
+                           unsigned int desc_size, unsigned int res_type);
 void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index,
        unsigned int error_interrupt_enable,
        unsigned int error_interrupt_offset);