mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 12:31:52 -04:00
bng_en: Add ndo_features_check support
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>
This commit is contained in:
committed by
Jakub Kicinski
parent
bd5ad9c052
commit
5deaeae186
@@ -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)
|
||||
|
||||
@@ -966,3 +966,27 @@ netdev_tx_t bnge_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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_ */
|
||||
|
||||
Reference in New Issue
Block a user