]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bng_en: Add ndo_features_check support
authorBhargava Marreddy <bhargava.marreddy@broadcom.com>
Wed, 28 Jan 2026 18:56:20 +0000 (00:26 +0530)
committerJakub Kicinski <kuba@kernel.org>
Fri, 30 Jan 2026 03:49:56 +0000 (19:49 -0800)
Implement ndo_features_check to validate hardware constraints per-packet:
- Disable SG if nr_frags exceeds hardware limit.
- Disable GSO if packet/fragment length exceeds supported maximum.

Signed-off-by: Bhargava Marreddy <bhargava.marreddy@broadcom.com>
Reviewed-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Ajit Kumar Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Rahul Gupta <rahul-rg.gupta@broadcom.com>
Link: https://patch.msgid.link/20260128185623.26559-6-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_txrx.c
drivers/net/ethernet/broadcom/bnge/bnge_txrx.h

index 78f04db3c5972e0d6e2fc43c00282dc39e1f3bd3..fba7f6a73b85d898769d10c73f940f922ea2d2ce 100644 (file)
@@ -2421,6 +2421,7 @@ static const struct net_device_ops bnge_netdev_ops = {
        .ndo_open               = bnge_open,
        .ndo_stop               = bnge_close,
        .ndo_start_xmit         = bnge_start_xmit,
+       .ndo_features_check     = bnge_features_check,
 };
 
 static void bnge_init_mac_addr(struct bnge_dev *bd)
index 261b071a8bd6a497e11a9502c2b4aff27754bd48..312b5cbea2a533c1d77e4d14abffd1ecde92cd93 100644 (file)
@@ -966,3 +966,27 @@ tx_kick_pending:
        dev_core_stats_tx_dropped_inc(dev);
        return NETDEV_TX_OK;
 }
+
+netdev_features_t bnge_features_check(struct sk_buff *skb,
+                                     struct net_device *dev,
+                                     netdev_features_t features)
+{
+       u32 len;
+
+       features = vlan_features_check(skb, features);
+#if (MAX_SKB_FRAGS > TX_MAX_FRAGS)
+       if (skb_shinfo(skb)->nr_frags > TX_MAX_FRAGS)
+               features &= ~NETIF_F_SG;
+#endif
+
+       if (skb_is_gso(skb))
+               len = bnge_get_gso_hdr_len(skb) + skb_shinfo(skb)->gso_size;
+       else
+               len = skb->len;
+
+       len >>= 9;
+       if (unlikely(len >= ARRAY_SIZE(bnge_lhint_arr)))
+               features &= ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
+
+       return features;
+}
index 81a24d8f9689e226bb8c1a2d85413ea02f29acaf..32be5eb46870923bc200b59ee530b5404639d682 100644 (file)
@@ -119,4 +119,7 @@ irqreturn_t bnge_msix(int irq, void *dev_instance);
 netdev_tx_t bnge_start_xmit(struct sk_buff *skb, struct net_device *dev);
 void bnge_reuse_rx_data(struct bnge_rx_ring_info *rxr, u16 cons, void *data);
 int bnge_napi_poll(struct napi_struct *napi, int budget);
+netdev_features_t bnge_features_check(struct sk_buff *skb,
+                                     struct net_device *dev,
+                                     netdev_features_t features);
 #endif /* _BNGE_TXRX_H_ */