]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bng_en: Extend bnge_set_ring_params() for rx-copybreak
authorBhargava Marreddy <bhargava.marreddy@broadcom.com>
Wed, 28 Jan 2026 18:56:16 +0000 (00:26 +0530)
committerJakub Kicinski <kuba@kernel.org>
Fri, 30 Jan 2026 03:49:55 +0000 (19:49 -0800)
Add rx-copybreak support in bnge_set_ring_params()

Signed-off-by: Bhargava Marreddy <bhargava.marreddy@broadcom.com>
Reviewed-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Rajashekar Hudumula <rajashekar.hudumula@broadcom.com>
Link: https://patch.msgid.link/20260128185623.26559-2-bhargava.marreddy@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
drivers/net/ethernet/broadcom/bnge/bnge_netdev.h

index 832eeb960bd2dcc0be225394a933f04c513ccf40..8bd019ea55a25f56d1eec19522e3c89d26a1d44e 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/etherdevice.h>
 #include <linux/if.h>
 #include <net/ip.h>
+#include <net/netdev_queues.h>
 #include <linux/skbuff.h>
 #include <net/page_pool/helpers.h>
 
@@ -2295,7 +2296,6 @@ void bnge_set_ring_params(struct bnge_dev *bd)
        rx_space = rx_size + ALIGN(NET_SKB_PAD, 8) +
                SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
 
-       bn->rx_copy_thresh = BNGE_RX_COPY_THRESH;
        ring_size = bn->rx_ring_size;
        bn->rx_agg_ring_size = 0;
        bn->rx_agg_nr_pages = 0;
@@ -2334,7 +2334,10 @@ void bnge_set_ring_params(struct bnge_dev *bd)
                bn->rx_agg_ring_size = agg_ring_size;
                bn->rx_agg_ring_mask = (bn->rx_agg_nr_pages * RX_DESC_CNT) - 1;
 
-               rx_size = SKB_DATA_ALIGN(BNGE_RX_COPY_THRESH + NET_IP_ALIGN);
+               rx_size = max3(BNGE_DEFAULT_RX_COPYBREAK,
+                              bn->rx_copybreak,
+                              bn->netdev->cfg_pending->hds_thresh);
+               rx_size = SKB_DATA_ALIGN(rx_size + NET_IP_ALIGN);
                rx_space = rx_size + NET_SKB_PAD +
                        SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
        }
@@ -2367,6 +2370,17 @@ void bnge_set_ring_params(struct bnge_dev *bd)
        bn->cp_ring_mask = bn->cp_bit - 1;
 }
 
+static void bnge_init_ring_params(struct bnge_net *bn)
+{
+       u32 rx_size;
+
+       bn->rx_copybreak = BNGE_DEFAULT_RX_COPYBREAK;
+       /* Try to fit 4 chunks into a 4k page */
+       rx_size = SZ_1K -
+               NET_SKB_PAD - SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
+       bn->netdev->cfg->hds_thresh = max(BNGE_DEFAULT_RX_COPYBREAK, rx_size);
+}
+
 int bnge_netdev_alloc(struct bnge_dev *bd, int max_irqs)
 {
        struct net_device *netdev;
@@ -2456,6 +2470,7 @@ int bnge_netdev_alloc(struct bnge_dev *bd, int max_irqs)
        bn->rx_dir = DMA_FROM_DEVICE;
 
        bnge_set_tpa_flags(bd);
+       bnge_init_ring_params(bn);
        bnge_set_ring_params(bd);
 
        bnge_init_l2_fltr_tbl(bn);
index fb3b961536ba7b1922f1cac45b70b703609a2a6c..557cca472db6566cb3b6366f942989f21aaadaf2 100644 (file)
@@ -135,7 +135,8 @@ struct bnge_ring_grp_info {
        u16     nq_fw_ring_id;
 };
 
-#define BNGE_RX_COPY_THRESH     256
+#define BNGE_DEFAULT_RX_COPYBREAK      256
+#define BNGE_MAX_RX_COPYBREAK          1024
 
 #define BNGE_HW_FEATURE_VLAN_ALL_RX    \
                (NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_STAG_RX)
@@ -186,7 +187,7 @@ struct bnge_net {
        u32                     rx_buf_size;
        u32                     rx_buf_use_size; /* usable size */
        u32                     rx_agg_ring_size;
-       u32                     rx_copy_thresh;
+       u32                     rx_copybreak;
        u32                     rx_ring_mask;
        u32                     rx_agg_ring_mask;
        u16                     rx_nr_pages;