]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bnge/bng_re: fix ring ID widths
authorVikas Gupta <vikas.gupta@broadcom.com>
Tue, 21 Jul 2026 06:37:31 +0000 (12:07 +0530)
committerJakub Kicinski <kuba@kernel.org>
Thu, 23 Jul 2026 17:24:12 +0000 (10:24 -0700)
Firmware requires more than 16 bits to address TX ring IDs for its
internal QP management. Widen the associated HSI ring ID fields to
32 bits. The values firmware assigns remain within 24 bits, bounded
by the hardware doorbell XID field.

The fw_ring_id field belongs to bnge_ring_struct, a common struct
shared by all ring types, so widening it to u32 applies uniformly
across TX, RX, CP, and NQ rings but firmware assigns values within
16-bit range for all ring types except TX, which requires the wider
field.

Note that, Thor Ultra hardware has not yet been deployed and no
firmware has been released to field, so backward compatibility
is not a concern.

Fixes: 42d1c54d6248 ("bnge/bng_re: Add a new HSI")
Signed-off-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Siva Reddy Kallam <siva.kallam@broadcom.com>
Reviewed-by: Dharmender Garg <dharmender.garg@broadcom.com>
Reviewed-by: Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com>
Link: https://patch.msgid.link/20260721063731.2622500-1-vikas.gupta@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/infiniband/hw/bng_re/bng_dev.c
drivers/net/ethernet/broadcom/bnge/bnge.h
drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c
drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h
drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
drivers/net/ethernet/broadcom/bnge/bnge_netdev.h
drivers/net/ethernet/broadcom/bnge/bnge_rmem.h
include/linux/bnge/hsi.h

index 71a7ca2196ad883204a4304b37a34274727f20b7..311c8bc931603a8cb7f7d5b16fc92b051d6e4055 100644 (file)
@@ -113,7 +113,7 @@ static void bng_re_fill_fw_msg(struct bnge_fw_msg *fw_msg, void *msg,
 }
 
 static int bng_re_net_ring_free(struct bng_re_dev *rdev,
-                               u16 fw_ring_id, int type)
+                               u32 fw_ring_id, int type)
 {
        struct bnge_auxr_dev *aux_dev = rdev->aux_dev;
        struct hwrm_ring_free_input req = {};
@@ -123,7 +123,7 @@ static int bng_re_net_ring_free(struct bng_re_dev *rdev,
 
        bng_re_init_hwrm_hdr((void *)&req, HWRM_RING_FREE);
        req.ring_type = type;
-       req.ring_id = cpu_to_le16(fw_ring_id);
+       req.ring_id = cpu_to_le32(fw_ring_id);
        bng_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
                            sizeof(resp), BNGE_DFLT_HWRM_CMD_TIMEOUT);
        rc = bnge_send_msg(aux_dev, &fw_msg);
@@ -161,7 +161,7 @@ static int bng_re_net_ring_alloc(struct bng_re_dev *rdev,
                           sizeof(resp), BNGE_DFLT_HWRM_CMD_TIMEOUT);
        rc = bnge_send_msg(aux_dev, &fw_msg);
        if (!rc)
-               *fw_ring_id = le16_to_cpu(resp.ring_id);
+               *fw_ring_id = (u16)le32_to_cpu(resp.ring_id);
 
        return rc;
 }
index f21cff651fd44aa78b13a5738a0c4e1a397e7584..4479ccd071f5329abe0693e852eeef0f56f86887 100644 (file)
@@ -36,6 +36,7 @@ struct bnge_pf_info {
 };
 
 #define INVALID_HW_RING_ID      ((u16)-1)
+#define INVALID_HW_RING_ID_32BIT       (U32_MAX)
 
 enum {
        BNGE_FW_CAP_SHORT_CMD                           = BIT_ULL(0),
index 1c9cfec1b633fcc228aecaa8c145811e0ac8a7af..651c5e783516cc30b5b997664687863f621f24de 100644 (file)
@@ -1283,7 +1283,7 @@ int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn)
 
 int hwrm_ring_free_send_msg(struct bnge_net *bn,
                            struct bnge_ring_struct *ring,
-                           u32 ring_type, int cmpl_ring_id)
+                           u32 ring_type, u32 cmpl_ring_id)
 {
        struct hwrm_ring_free_input *req;
        struct bnge_dev *bd = bn->bd;
@@ -1295,7 +1295,7 @@ int hwrm_ring_free_send_msg(struct bnge_net *bn,
 
        req->cmpl_ring = cpu_to_le16(cmpl_ring_id);
        req->ring_type = ring_type;
-       req->ring_id = cpu_to_le16(ring->fw_ring_id);
+       req->ring_id = cpu_to_le32(ring->fw_ring_id);
 
        bnge_hwrm_req_hold(bd, req);
        rc = bnge_hwrm_req_send(bd, req);
@@ -1317,7 +1317,7 @@ int hwrm_ring_alloc_send_msg(struct bnge_net *bn,
        struct hwrm_ring_alloc_output *resp;
        struct hwrm_ring_alloc_input *req;
        struct bnge_dev *bd = bn->bd;
-       u16 ring_id, flags = 0;
+       u32 ring_id, flags = 0;
        int rc;
 
        rc = bnge_hwrm_req_init(bd, req, HWRM_RING_ALLOC);
@@ -1401,7 +1401,7 @@ int hwrm_ring_alloc_send_msg(struct bnge_net *bn,
 
        resp = bnge_hwrm_req_hold(bd, req);
        rc = bnge_hwrm_req_send(bd, req);
-       ring_id = le16_to_cpu(resp->ring_id);
+       ring_id = le32_to_cpu(resp->ring_id);
        bnge_hwrm_req_drop(bd, req);
 
 exit:
index 3501de7a89b9193aa2de2cb198580224f9bb87bb..bf452e390d5bd16b5368653efb5d280c4cb3f353 100644 (file)
@@ -50,7 +50,7 @@ int bnge_hwrm_cfa_l2_set_rx_mask(struct bnge_dev *bd,
 void bnge_hwrm_stat_ctx_free(struct bnge_net *bn);
 int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn);
 int hwrm_ring_free_send_msg(struct bnge_net *bn, struct bnge_ring_struct *ring,
-                           u32 ring_type, int cmpl_ring_id);
+                           u32 ring_type, u32 cmpl_ring_id);
 int hwrm_ring_alloc_send_msg(struct bnge_net *bn,
                             struct bnge_ring_struct *ring,
                             u32 ring_type, u32 map_index);
index 70768193004cb27989c8b91f7232c058cfa66d03..6f7ef506d4e18cf48135f9f90c0a342129585a16 100644 (file)
@@ -1327,12 +1327,12 @@ err_free_core:
        return rc;
 }
 
-u16 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr)
+u32 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr)
 {
        return rxr->rx_cpr->ring_struct.fw_ring_id;
 }
 
-u16 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr)
+u32 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr)
 {
        return txr->tx_cpr->ring_struct.fw_ring_id;
 }
@@ -1375,12 +1375,12 @@ static void bnge_init_nq_tree(struct bnge_net *bn)
                struct bnge_nq_ring_info *nqr = &bn->bnapi[i]->nq_ring;
                struct bnge_ring_struct *ring = &nqr->ring_struct;
 
-               ring->fw_ring_id = INVALID_HW_RING_ID;
+               ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
                for (j = 0; j < nqr->cp_ring_count; j++) {
                        struct bnge_cp_ring_info *cpr = &nqr->cp_ring_arr[j];
 
                        ring = &cpr->ring_struct;
-                       ring->fw_ring_id = INVALID_HW_RING_ID;
+                       ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
                }
        }
 }
@@ -1637,7 +1637,7 @@ static void bnge_init_one_rx_ring_rxbd(struct bnge_net *bn,
 
        ring = &rxr->rx_ring_struct;
        bnge_init_rxbd_pages(ring, type);
-       ring->fw_ring_id = INVALID_HW_RING_ID;
+       ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
 }
 
 static void bnge_init_one_agg_ring_rxbd(struct bnge_net *bn,
@@ -1647,7 +1647,7 @@ static void bnge_init_one_agg_ring_rxbd(struct bnge_net *bn,
        u32 type;
 
        ring = &rxr->rx_agg_ring_struct;
-       ring->fw_ring_id = INVALID_HW_RING_ID;
+       ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
        if (bnge_is_agg_reqd(bn->bd)) {
                type = ((u32)BNGE_RX_PAGE_SIZE << RX_BD_LEN_SHIFT) |
                        RX_BD_TYPE_RX_AGG_BD | RX_BD_FLAGS_SOP;
@@ -1708,7 +1708,7 @@ static void bnge_init_tx_rings(struct bnge_net *bn)
                struct bnge_tx_ring_info *txr = &bn->tx_ring[i];
                struct bnge_ring_struct *ring = &txr->tx_ring_struct;
 
-               ring->fw_ring_id = INVALID_HW_RING_ID;
+               ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
 
                netif_queue_set_napi(bn->netdev, i, NETDEV_QUEUE_TYPE_TX,
                                     &txr->bnapi->napi);
@@ -1867,7 +1867,7 @@ static int bnge_hwrm_rx_agg_ring_alloc(struct bnge_net *bn,
                    ring->fw_ring_id);
        bnge_db_write(bn->bd, &rxr->rx_agg_db, rxr->rx_agg_prod);
        bnge_db_write(bn->bd, &rxr->rx_db, rxr->rx_prod);
-       bn->grp_info[grp_idx].agg_fw_ring_id = ring->fw_ring_id;
+       bn->grp_info[grp_idx].agg_fw_ring_id = (u16)ring->fw_ring_id;
 
        return 0;
 }
@@ -1886,7 +1886,7 @@ static int bnge_hwrm_rx_ring_alloc(struct bnge_net *bn,
                return rc;
 
        bnge_set_db(bn, &rxr->rx_db, type, map_idx, ring->fw_ring_id);
-       bn->grp_info[map_idx].rx_fw_ring_id = ring->fw_ring_id;
+       bn->grp_info[map_idx].rx_fw_ring_id = (u16)ring->fw_ring_id;
 
        return 0;
 }
@@ -1916,7 +1916,7 @@ static int bnge_hwrm_ring_alloc(struct bnge_net *bn)
                bnge_set_db(bn, &nqr->nq_db, type, map_idx, ring->fw_ring_id);
                bnge_db_nq(bn, &nqr->nq_db, nqr->nq_raw_cons);
                enable_irq(vector);
-               bn->grp_info[i].nq_fw_ring_id = ring->fw_ring_id;
+               bn->grp_info[i].nq_fw_ring_id = (u16)ring->fw_ring_id;
 
                if (!i) {
                        rc = bnge_hwrm_set_async_event_cr(bd, ring->fw_ring_id);
@@ -1986,15 +1986,13 @@ void bnge_fill_hw_rss_tbl(struct bnge_net *bn, struct bnge_vnic_info *vnic)
        tbl_size = bnge_get_rxfh_indir_size(bd);
 
        for (i = 0; i < tbl_size; i++) {
-               u16 ring_id, j;
+               u32 j;
 
                j = bd->rss_indir_tbl[i];
                rxr = &bn->rx_ring[j];
 
-               ring_id = rxr->rx_ring_struct.fw_ring_id;
-               *ring_tbl++ = cpu_to_le16(ring_id);
-               ring_id = bnge_cp_ring_for_rx(rxr);
-               *ring_tbl++ = cpu_to_le16(ring_id);
+               *ring_tbl++ = cpu_to_le16(rxr->rx_ring_struct.fw_ring_id);
+               *ring_tbl++ = cpu_to_le16(bnge_cp_ring_for_rx(rxr));
        }
 }
 
@@ -2285,7 +2283,7 @@ static void bnge_disable_int(struct bnge_net *bn)
                nqr = &bnapi->nq_ring;
                ring = &nqr->ring_struct;
 
-               if (ring->fw_ring_id != INVALID_HW_RING_ID)
+               if (ring->fw_ring_id != INVALID_HW_RING_ID_32BIT)
                        bnge_db_nq(bn, &nqr->nq_db, nqr->nq_raw_cons);
        }
 }
@@ -2401,7 +2399,7 @@ static void bnge_hwrm_rx_ring_free(struct bnge_net *bn,
        u32 grp_idx = rxr->bnapi->index;
        u32 cmpl_ring_id;
 
-       if (ring->fw_ring_id == INVALID_HW_RING_ID)
+       if (ring->fw_ring_id == INVALID_HW_RING_ID_32BIT)
                return;
 
        cmpl_ring_id = bnge_cp_ring_for_rx(rxr);
@@ -2409,7 +2407,7 @@ static void bnge_hwrm_rx_ring_free(struct bnge_net *bn,
                                RING_FREE_REQ_RING_TYPE_RX,
                                close_path ? cmpl_ring_id :
                                INVALID_HW_RING_ID);
-       ring->fw_ring_id = INVALID_HW_RING_ID;
+       ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
        bn->grp_info[grp_idx].rx_fw_ring_id = INVALID_HW_RING_ID;
 }
 
@@ -2421,14 +2419,14 @@ static void bnge_hwrm_rx_agg_ring_free(struct bnge_net *bn,
        u32 grp_idx = rxr->bnapi->index;
        u32 cmpl_ring_id;
 
-       if (ring->fw_ring_id == INVALID_HW_RING_ID)
+       if (ring->fw_ring_id == INVALID_HW_RING_ID_32BIT)
                return;
 
        cmpl_ring_id = bnge_cp_ring_for_rx(rxr);
        hwrm_ring_free_send_msg(bn, ring, RING_FREE_REQ_RING_TYPE_RX_AGG,
                                close_path ? cmpl_ring_id :
                                INVALID_HW_RING_ID);
-       ring->fw_ring_id = INVALID_HW_RING_ID;
+       ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
        bn->grp_info[grp_idx].agg_fw_ring_id = INVALID_HW_RING_ID;
 }
 
@@ -2439,14 +2437,14 @@ static void bnge_hwrm_tx_ring_free(struct bnge_net *bn,
        struct bnge_ring_struct *ring = &txr->tx_ring_struct;
        u32 cmpl_ring_id;
 
-       if (ring->fw_ring_id == INVALID_HW_RING_ID)
+       if (ring->fw_ring_id == INVALID_HW_RING_ID_32BIT)
                return;
 
        cmpl_ring_id = close_path ? bnge_cp_ring_for_tx(txr) :
                       INVALID_HW_RING_ID;
        hwrm_ring_free_send_msg(bn, ring, RING_FREE_REQ_RING_TYPE_TX,
                                cmpl_ring_id);
-       ring->fw_ring_id = INVALID_HW_RING_ID;
+       ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
 }
 
 static void bnge_hwrm_cp_ring_free(struct bnge_net *bn,
@@ -2455,12 +2453,12 @@ static void bnge_hwrm_cp_ring_free(struct bnge_net *bn,
        struct bnge_ring_struct *ring;
 
        ring = &cpr->ring_struct;
-       if (ring->fw_ring_id == INVALID_HW_RING_ID)
+       if (ring->fw_ring_id == INVALID_HW_RING_ID_32BIT)
                return;
 
        hwrm_ring_free_send_msg(bn, ring, RING_FREE_REQ_RING_TYPE_L2_CMPL,
                                INVALID_HW_RING_ID);
-       ring->fw_ring_id = INVALID_HW_RING_ID;
+       ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
 }
 
 static void bnge_hwrm_ring_free(struct bnge_net *bn, bool close_path)
@@ -2496,11 +2494,11 @@ static void bnge_hwrm_ring_free(struct bnge_net *bn, bool close_path)
                        bnge_hwrm_cp_ring_free(bn, &nqr->cp_ring_arr[j]);
 
                ring = &nqr->ring_struct;
-               if (ring->fw_ring_id != INVALID_HW_RING_ID) {
+               if (ring->fw_ring_id != INVALID_HW_RING_ID_32BIT) {
                        hwrm_ring_free_send_msg(bn, ring,
                                                RING_FREE_REQ_RING_TYPE_NQ,
                                                INVALID_HW_RING_ID);
-                       ring->fw_ring_id = INVALID_HW_RING_ID;
+                       ring->fw_ring_id = INVALID_HW_RING_ID_32BIT;
                        bn->grp_info[i].nq_fw_ring_id = INVALID_HW_RING_ID;
                }
        }
index f4636b5b0cf3f09d61946a60d9215fbfd112e8ea..d177919c2e11704084cc8824d8731431647d9698 100644 (file)
@@ -630,8 +630,8 @@ struct bnge_l2_filter {
        refcount_t              refcnt;
 };
 
-u16 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr);
-u16 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr);
+u32 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr);
+u32 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr);
 void bnge_fill_hw_rss_tbl(struct bnge_net *bn, struct bnge_vnic_info *vnic);
 int bnge_alloc_rx_data(struct bnge_net *bn, struct bnge_rx_ring_info *rxr,
                       u16 prod, gfp_t gfp);
index 341c7f81ed092b261754b287013796f91a100661..bb0c79a1ee60f7c7bea68d5e6db2808a6ac05f45 100644 (file)
@@ -184,7 +184,7 @@ struct bnge_ctx_mem_info {
 struct bnge_ring_struct {
        struct bnge_ring_mem_info       ring_mem;
 
-       u16                     fw_ring_id;
+       u32                     fw_ring_id;
        union {
                u16             grp_idx;
                u16             map_idx; /* Used by NQs */
index 8ea13d5407eecd54e9c36e81b3097a51418d3740..1f7bd96415a5279ba160008f22dd9b17a3c655f0 100644 (file)
@@ -8317,8 +8317,7 @@ struct hwrm_ring_alloc_output {
        __le16  req_type;
        __le16  seq_id;
        __le16  resp_len;
-       __le16  ring_id;
-       __le16  logical_ring_id;
+       __le32  ring_id;
        u8      push_buffer_index;
        #define RING_ALLOC_RESP_PUSH_BUFFER_INDEX_PING_BUFFER 0x0UL
        #define RING_ALLOC_RESP_PUSH_BUFFER_INDEX_PONG_BUFFER 0x1UL
@@ -8345,10 +8344,10 @@ struct hwrm_ring_free_input {
        u8      flags;
        #define RING_FREE_REQ_FLAGS_VIRTIO_RING_VALID 0x1UL
        #define RING_FREE_REQ_FLAGS_LAST             RING_FREE_REQ_FLAGS_VIRTIO_RING_VALID
-       __le16  ring_id;
+       __le16  unused_1;
        __le32  prod_idx;
        __le32  opaque;
-       __le32  unused_1;
+       __le32  ring_id;
 };
 
 /* hwrm_ring_free_output (size:128b/16B) */