From 91db5b68ffaf15791a204a2f39f5558311539c01 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 29 Sep 2025 12:37:25 +0100 Subject: [PATCH] [gve] Set descriptor and completion ring sizes when creating queues The "create TX queue" and "create RX queue" commands have fields for the descriptor and completion ring sizes, which are currently left unpopulated since they are not required for the original GQI-QPL operating mode. Populate these fields, and allow for the possibility that a transmit completion ring exists (which will be the case when using the DQO operating mode). Signed-off-by: Michael Brown --- src/drivers/net/gve.c | 14 +++++++++++--- src/drivers/net/gve.h | 16 ++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/drivers/net/gve.c b/src/drivers/net/gve.c index 4ac8d2a8a..62e02f050 100644 --- a/src/drivers/net/gve.c +++ b/src/drivers/net/gve.c @@ -639,9 +639,15 @@ static void gve_create_tx_param ( struct gve_queue *queue, /* Construct request parameters */ create->res = cpu_to_be64 ( dma ( &queue->res_map, queue->res ) ); create->desc = - cpu_to_be64 ( dma ( &queue->desc_map, queue->desc.tx ) ); + cpu_to_be64 ( dma ( &queue->desc_map, queue->desc.raw ) ); create->qpl_id = cpu_to_be32 ( type->qpl ); create->notify_id = cpu_to_be32 ( type->irq ); + create->desc_count = cpu_to_be16 ( queue->count ); + if ( queue->cmplt.raw ) { + create->cmplt = cpu_to_be64 ( dma ( &queue->cmplt_map, + queue->cmplt.raw ) ); + create->cmplt_count = cpu_to_be16 ( queue->count ); + } } /** @@ -659,11 +665,13 @@ static void gve_create_rx_param ( struct gve_queue *queue, create->notify_id = cpu_to_be32 ( type->irq ); create->res = cpu_to_be64 ( dma ( &queue->res_map, queue->res ) ); create->desc = - cpu_to_be64 ( dma ( &queue->desc_map, queue->desc.rx ) ); + cpu_to_be64 ( dma ( &queue->desc_map, queue->desc.raw ) ); create->cmplt = - cpu_to_be64 ( dma ( &queue->cmplt_map, queue->cmplt.rx ) ); + cpu_to_be64 ( dma ( &queue->cmplt_map, queue->cmplt.raw ) ); create->qpl_id = cpu_to_be32 ( type->qpl ); + create->desc_count = cpu_to_be16 ( queue->count ); create->bufsz = cpu_to_be16 ( GVE_BUF_SIZE ); + create->cmplt_count = cpu_to_be16 ( queue->count ); } /** diff --git a/src/drivers/net/gve.h b/src/drivers/net/gve.h index 78f085671..333839be6 100644 --- a/src/drivers/net/gve.h +++ b/src/drivers/net/gve.h @@ -278,6 +278,14 @@ struct gve_admin_create_tx { uint32_t qpl_id; /** Notification channel ID */ uint32_t notify_id; + /** Completion ring address */ + uint64_t cmplt; + /** Number of descriptor ring entries */ + uint16_t desc_count; + /** Number of completion ring entries */ + uint16_t cmplt_count; + /** Reserved */ + uint8_t reserved_b[4]; } __attribute__ (( packed )); /** Create receive queue command */ @@ -303,10 +311,14 @@ struct gve_admin_create_rx { uint64_t desc; /** Queue page list ID */ uint32_t qpl_id; - /** Reserved */ - uint8_t reserved_b[2]; + /** Number of descriptor ring entries */ + uint16_t desc_count; /** Packet buffer size */ uint16_t bufsz; + /** Number of completion ring entries */ + uint16_t cmplt_count; + /** Reserved */ + uint8_t reserved[6]; } __attribute__ (( packed )); /** Destroy transmit queue command */