mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
netdev_features: convert NETIF_F_LLTX to dev->lltx
NETIF_F_LLTX can't be changed via Ethtool and is not a feature, rather an attribute, very similar to IFF_NO_QUEUE (and hot). Free one netdev_features_t bit and make it a "hot" private flag. Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
beb5a9bea8
commit
00d066a4d4
@ -8,6 +8,7 @@ net_device struct fast path usage breakdown
|
|||||||
Type Name fastpath_tx_access fastpath_rx_access Comments
|
Type Name fastpath_tx_access fastpath_rx_access Comments
|
||||||
..struct ..net_device
|
..struct ..net_device
|
||||||
unsigned_long:32 priv_flags read_mostly - __dev_queue_xmit(tx)
|
unsigned_long:32 priv_flags read_mostly - __dev_queue_xmit(tx)
|
||||||
|
unsigned_long:1 lltx read_mostly - HARD_TX_LOCK,HARD_TX_TRYLOCK,HARD_TX_UNLOCK(tx)
|
||||||
char name[16] - -
|
char name[16] - -
|
||||||
struct_netdev_name_node* name_node
|
struct_netdev_name_node* name_node
|
||||||
struct_dev_ifalias* ifalias
|
struct_dev_ifalias* ifalias
|
||||||
|
@ -139,14 +139,6 @@ chained skbs (skb->next/prev list).
|
|||||||
Features contained in NETIF_F_SOFT_FEATURES are features of networking
|
Features contained in NETIF_F_SOFT_FEATURES are features of networking
|
||||||
stack. Driver should not change behaviour based on them.
|
stack. Driver should not change behaviour based on them.
|
||||||
|
|
||||||
* LLTX driver (deprecated for hardware drivers)
|
|
||||||
|
|
||||||
NETIF_F_LLTX is meant to be used by drivers that don't need locking at all,
|
|
||||||
e.g. software tunnels.
|
|
||||||
|
|
||||||
This is also used in a few legacy drivers that implement their
|
|
||||||
own locking, don't use it for new (hardware) drivers.
|
|
||||||
|
|
||||||
* netns-local device
|
* netns-local device
|
||||||
|
|
||||||
NETIF_F_NETNS_LOCAL is set for devices that are not allowed to move between
|
NETIF_F_NETNS_LOCAL is set for devices that are not allowed to move between
|
||||||
|
@ -258,11 +258,11 @@ ndo_get_stats:
|
|||||||
ndo_start_xmit:
|
ndo_start_xmit:
|
||||||
Synchronization: __netif_tx_lock spinlock.
|
Synchronization: __netif_tx_lock spinlock.
|
||||||
|
|
||||||
When the driver sets NETIF_F_LLTX in dev->features this will be
|
When the driver sets dev->lltx this will be
|
||||||
called without holding netif_tx_lock. In this case the driver
|
called without holding netif_tx_lock. In this case the driver
|
||||||
has to lock by itself when needed.
|
has to lock by itself when needed.
|
||||||
The locking there should also properly protect against
|
The locking there should also properly protect against
|
||||||
set_rx_mode. WARNING: use of NETIF_F_LLTX is deprecated.
|
set_rx_mode. WARNING: use of dev->lltx is deprecated.
|
||||||
Don't use it for new drivers.
|
Don't use it for new drivers.
|
||||||
|
|
||||||
Context: Process with BHs disabled or BH (timer),
|
Context: Process with BHs disabled or BH (timer),
|
||||||
|
@ -3098,7 +3098,7 @@ static void amt_link_setup(struct net_device *dev)
|
|||||||
dev->hard_header_len = 0;
|
dev->hard_header_len = 0;
|
||||||
dev->addr_len = 0;
|
dev->addr_len = 0;
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->features |= NETIF_F_NETNS_LOCAL;
|
||||||
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM;
|
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM;
|
||||||
|
@ -553,7 +553,6 @@ static void bareudp_setup(struct net_device *dev)
|
|||||||
SET_NETDEV_DEVTYPE(dev, &bareudp_type);
|
SET_NETDEV_DEVTYPE(dev, &bareudp_type);
|
||||||
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
|
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
|
||||||
dev->features |= NETIF_F_RXCSUM;
|
dev->features |= NETIF_F_RXCSUM;
|
||||||
dev->features |= NETIF_F_LLTX;
|
|
||||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
|
dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
|
||||||
dev->hw_features |= NETIF_F_RXCSUM;
|
dev->hw_features |= NETIF_F_RXCSUM;
|
||||||
@ -566,6 +565,7 @@ static void bareudp_setup(struct net_device *dev)
|
|||||||
dev->type = ARPHRD_NONE;
|
dev->type = ARPHRD_NONE;
|
||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
|
dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
|
||||||
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
||||||
}
|
}
|
||||||
|
@ -5928,7 +5928,7 @@ void bond_setup(struct net_device *bond_dev)
|
|||||||
#endif /* CONFIG_XFRM_OFFLOAD */
|
#endif /* CONFIG_XFRM_OFFLOAD */
|
||||||
|
|
||||||
/* don't acquire bond device's netif_tx_lock when transmitting */
|
/* don't acquire bond device's netif_tx_lock when transmitting */
|
||||||
bond_dev->features |= NETIF_F_LLTX;
|
bond_dev->lltx = true;
|
||||||
|
|
||||||
/* By default, we declare the bond to be fully
|
/* By default, we declare the bond to be fully
|
||||||
* VLAN hardware accelerated capable. Special
|
* VLAN hardware accelerated capable. Special
|
||||||
|
@ -109,9 +109,10 @@ static void dummy_setup(struct net_device *dev)
|
|||||||
dev->flags |= IFF_NOARP;
|
dev->flags |= IFF_NOARP;
|
||||||
dev->flags &= ~IFF_MULTICAST;
|
dev->flags &= ~IFF_MULTICAST;
|
||||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
dev->features |= NETIF_F_SG | NETIF_F_FRAGLIST;
|
dev->features |= NETIF_F_SG | NETIF_F_FRAGLIST;
|
||||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
dev->features |= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX;
|
dev->features |= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA;
|
||||||
dev->features |= NETIF_F_GSO_ENCAP_ALL;
|
dev->features |= NETIF_F_GSO_ENCAP_ALL;
|
||||||
dev->hw_features |= dev->features;
|
dev->hw_features |= dev->features;
|
||||||
dev->hw_enc_features |= dev->features;
|
dev->hw_enc_features |= dev->features;
|
||||||
|
@ -1034,7 +1034,8 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
netdev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM |
|
netdev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM |
|
||||||
NETIF_F_RXCSUM;
|
NETIF_F_RXCSUM;
|
||||||
netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM |
|
netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM |
|
||||||
NETIF_F_RXCSUM | NETIF_F_LLTX | NETIF_F_HIGHDMA;
|
NETIF_F_RXCSUM | NETIF_F_HIGHDMA;
|
||||||
|
netdev->lltx = true;
|
||||||
|
|
||||||
if (vlan_tso_capable(adapter)) {
|
if (vlan_tso_capable(adapter)) {
|
||||||
netdev->features |=
|
netdev->features |=
|
||||||
|
@ -229,7 +229,7 @@ static int dpaa_netdev_init(struct net_device *net_dev,
|
|||||||
net_dev->max_mtu = dpaa_get_max_mtu();
|
net_dev->max_mtu = dpaa_get_max_mtu();
|
||||||
|
|
||||||
net_dev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
net_dev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||||
NETIF_F_LLTX | NETIF_F_RXHASH);
|
NETIF_F_RXHASH);
|
||||||
|
|
||||||
net_dev->hw_features |= NETIF_F_SG | NETIF_F_HIGHDMA;
|
net_dev->hw_features |= NETIF_F_SG | NETIF_F_HIGHDMA;
|
||||||
/* The kernels enables GSO automatically, if we declare NETIF_F_SG.
|
/* The kernels enables GSO automatically, if we declare NETIF_F_SG.
|
||||||
@ -239,6 +239,7 @@ static int dpaa_netdev_init(struct net_device *net_dev,
|
|||||||
net_dev->features |= NETIF_F_RXCSUM;
|
net_dev->features |= NETIF_F_RXCSUM;
|
||||||
|
|
||||||
net_dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
net_dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
||||||
|
net_dev->lltx = true;
|
||||||
/* we do not want shared skbs on TX */
|
/* we do not want shared skbs on TX */
|
||||||
net_dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
net_dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||||
|
|
||||||
|
@ -4594,12 +4594,13 @@ static int dpaa2_eth_netdev_init(struct net_device *net_dev)
|
|||||||
|
|
||||||
net_dev->priv_flags |= supported;
|
net_dev->priv_flags |= supported;
|
||||||
net_dev->priv_flags &= ~not_supported;
|
net_dev->priv_flags &= ~not_supported;
|
||||||
|
net_dev->lltx = true;
|
||||||
|
|
||||||
/* Features */
|
/* Features */
|
||||||
net_dev->features = NETIF_F_RXCSUM |
|
net_dev->features = NETIF_F_RXCSUM |
|
||||||
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||||
NETIF_F_SG | NETIF_F_HIGHDMA |
|
NETIF_F_SG | NETIF_F_HIGHDMA |
|
||||||
NETIF_F_LLTX | NETIF_F_HW_TC | NETIF_F_TSO;
|
NETIF_F_HW_TC | NETIF_F_TSO;
|
||||||
net_dev->gso_max_segs = DPAA2_ETH_ENQUEUE_MAX_FDS;
|
net_dev->gso_max_segs = DPAA2_ETH_ENQUEUE_MAX_FDS;
|
||||||
net_dev->hw_features = net_dev->features;
|
net_dev->hw_features = net_dev->features;
|
||||||
net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |
|
||||||
|
@ -1676,9 +1676,10 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u16 local_port,
|
|||||||
|
|
||||||
netif_carrier_off(dev);
|
netif_carrier_off(dev);
|
||||||
|
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_LLTX | NETIF_F_SG |
|
dev->features |= NETIF_F_NETNS_LOCAL | NETIF_F_SG |
|
||||||
NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC;
|
NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC;
|
||||||
dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK;
|
dev->hw_features |= NETIF_F_HW_TC | NETIF_F_LOOPBACK;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->min_mtu = ETH_MIN_MTU;
|
dev->min_mtu = ETH_MIN_MTU;
|
||||||
dev->max_mtu = MLXSW_PORT_MAX_MTU - MLXSW_PORT_ETH_FRAME_HDR;
|
dev->max_mtu = MLXSW_PORT_MAX_MTU - MLXSW_PORT_ETH_FRAME_HDR;
|
||||||
|
@ -248,7 +248,6 @@ nfp_repr_fix_features(struct net_device *netdev, netdev_features_t features)
|
|||||||
|
|
||||||
features = netdev_intersect_features(features, lower_features);
|
features = netdev_intersect_features(features, lower_features);
|
||||||
features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_HW_TC);
|
features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_HW_TC);
|
||||||
features |= NETIF_F_LLTX;
|
|
||||||
|
|
||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
@ -386,7 +385,7 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
|
|||||||
netif_set_tso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS);
|
netif_set_tso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS);
|
||||||
|
|
||||||
netdev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
|
netdev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
|
||||||
netdev->features |= NETIF_F_LLTX;
|
netdev->lltx = true;
|
||||||
|
|
||||||
if (nfp_app_has_tc(app)) {
|
if (nfp_app_has_tc(app)) {
|
||||||
netdev->features |= NETIF_F_HW_TC;
|
netdev->features |= NETIF_F_HW_TC;
|
||||||
|
@ -1699,8 +1699,9 @@ pasemi_mac_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
|
|
||||||
netif_napi_add(dev, &mac->napi, pasemi_mac_poll);
|
netif_napi_add(dev, &mac->napi, pasemi_mac_poll);
|
||||||
|
|
||||||
dev->features = NETIF_F_IP_CSUM | NETIF_F_LLTX | NETIF_F_SG |
|
dev->features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_HIGHDMA |
|
||||||
NETIF_F_HIGHDMA | NETIF_F_GSO;
|
NETIF_F_GSO;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
mac->dma_pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa007, NULL);
|
mac->dma_pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa007, NULL);
|
||||||
if (!mac->dma_pdev) {
|
if (!mac->dma_pdev) {
|
||||||
|
@ -286,7 +286,7 @@ void rmnet_vnd_setup(struct net_device *rmnet_dev)
|
|||||||
rmnet_dev->needs_free_netdev = true;
|
rmnet_dev->needs_free_netdev = true;
|
||||||
rmnet_dev->ethtool_ops = &rmnet_ethtool_ops;
|
rmnet_dev->ethtool_ops = &rmnet_ethtool_ops;
|
||||||
|
|
||||||
rmnet_dev->features |= NETIF_F_LLTX;
|
rmnet_dev->lltx = true;
|
||||||
|
|
||||||
/* This perm addr will be used as interface identifier by IPv6 */
|
/* This perm addr will be used as interface identifier by IPv6 */
|
||||||
rmnet_dev->addr_assign_type = NET_ADDR_RANDOM;
|
rmnet_dev->addr_assign_type = NET_ADDR_RANDOM;
|
||||||
|
@ -233,8 +233,8 @@ static struct efx_rep *efx_ef100_rep_create_netdev(struct efx_nic *efx,
|
|||||||
net_dev->ethtool_ops = &efx_ef100_rep_ethtool_ops;
|
net_dev->ethtool_ops = &efx_ef100_rep_ethtool_ops;
|
||||||
net_dev->min_mtu = EFX_MIN_MTU;
|
net_dev->min_mtu = EFX_MIN_MTU;
|
||||||
net_dev->max_mtu = EFX_MAX_MTU;
|
net_dev->max_mtu = EFX_MAX_MTU;
|
||||||
net_dev->features |= NETIF_F_LLTX;
|
net_dev->lltx = true;
|
||||||
net_dev->hw_features |= NETIF_F_LLTX;
|
|
||||||
return efv;
|
return efv;
|
||||||
fail1:
|
fail1:
|
||||||
free_netdev(net_dev);
|
free_netdev(net_dev);
|
||||||
|
@ -1671,7 +1671,7 @@ static netdev_tx_t bdx_tx_transmit(struct sk_buff *skb,
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef BDX_LLTX
|
#ifdef BDX_LLTX
|
||||||
netif_trans_update(ndev); /* NETIF_F_LLTX driver :( */
|
netif_trans_update(ndev); /* dev->lltx driver :( */
|
||||||
#endif
|
#endif
|
||||||
ndev->stats.tx_packets++;
|
ndev->stats.tx_packets++;
|
||||||
ndev->stats.tx_bytes += skb->len;
|
ndev->stats.tx_bytes += skb->len;
|
||||||
@ -2019,7 +2019,7 @@ bdx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
* set multicast list callback has to use priv->tx_lock.
|
* set multicast list callback has to use priv->tx_lock.
|
||||||
*/
|
*/
|
||||||
#ifdef BDX_LLTX
|
#ifdef BDX_LLTX
|
||||||
ndev->features |= NETIF_F_LLTX;
|
ndev->lltx = true;
|
||||||
#endif
|
#endif
|
||||||
/* MTU range: 60 - 16384 */
|
/* MTU range: 60 - 16384 */
|
||||||
ndev->min_mtu = ETH_ZLEN;
|
ndev->min_mtu = ETH_ZLEN;
|
||||||
|
@ -260,7 +260,7 @@ struct bdx_priv {
|
|||||||
int tx_update_mark;
|
int tx_update_mark;
|
||||||
int tx_noupd;
|
int tx_noupd;
|
||||||
#endif
|
#endif
|
||||||
spinlock_t tx_lock; /* NETIF_F_LLTX mode */
|
spinlock_t tx_lock; /* dev->lltx mode */
|
||||||
|
|
||||||
/* rarely used */
|
/* rarely used */
|
||||||
u8 port;
|
u8 port;
|
||||||
|
@ -2277,10 +2277,11 @@ spider_net_setup_netdev(struct spider_net_card *card)
|
|||||||
netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_IP_CSUM;
|
netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_IP_CSUM;
|
||||||
if (SPIDER_NET_RX_CSUM_DEFAULT)
|
if (SPIDER_NET_RX_CSUM_DEFAULT)
|
||||||
netdev->features |= NETIF_F_RXCSUM;
|
netdev->features |= NETIF_F_RXCSUM;
|
||||||
netdev->features |= NETIF_F_IP_CSUM | NETIF_F_LLTX;
|
netdev->features |= NETIF_F_IP_CSUM;
|
||||||
/* some time: NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
|
/* some time: NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
|
||||||
* NETIF_F_HW_VLAN_CTAG_FILTER
|
* NETIF_F_HW_VLAN_CTAG_FILTER
|
||||||
*/
|
*/
|
||||||
|
netdev->lltx = true;
|
||||||
|
|
||||||
/* MTU range: 64 - 2294 */
|
/* MTU range: 64 - 2294 */
|
||||||
netdev->min_mtu = SPIDER_NET_MIN_MTU;
|
netdev->min_mtu = SPIDER_NET_MIN_MTU;
|
||||||
|
@ -1194,7 +1194,6 @@ static void geneve_setup(struct net_device *dev)
|
|||||||
|
|
||||||
SET_NETDEV_DEVTYPE(dev, &geneve_type);
|
SET_NETDEV_DEVTYPE(dev, &geneve_type);
|
||||||
|
|
||||||
dev->features |= NETIF_F_LLTX;
|
|
||||||
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
|
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
|
||||||
dev->features |= NETIF_F_RXCSUM;
|
dev->features |= NETIF_F_RXCSUM;
|
||||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
@ -1215,6 +1214,7 @@ static void geneve_setup(struct net_device *dev)
|
|||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
eth_hw_addr_random(dev);
|
eth_hw_addr_random(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1356,7 +1356,7 @@ static void gtp_link_setup(struct net_device *dev)
|
|||||||
|
|
||||||
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
|
|
||||||
dev->needed_headroom = LL_MAX_HEADER + GTP_IPV4_MAXLEN;
|
dev->needed_headroom = LL_MAX_HEADER + GTP_IPV4_MAXLEN;
|
||||||
|
@ -458,7 +458,7 @@ static void bpq_setup(struct net_device *dev)
|
|||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
|
|
||||||
dev->flags = 0;
|
dev->flags = 0;
|
||||||
dev->features = NETIF_F_LLTX; /* Allow recursion */
|
dev->lltx = true; /* Allow recursion */
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_AX25)
|
#if IS_ENABLED(CONFIG_AX25)
|
||||||
dev->header_ops = &ax25_header_ops;
|
dev->header_ops = &ax25_header_ops;
|
||||||
|
@ -114,7 +114,7 @@ static void ipvlan_port_destroy(struct net_device *dev)
|
|||||||
NETIF_F_GSO_ROBUST | NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL)
|
NETIF_F_GSO_ROBUST | NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL)
|
||||||
|
|
||||||
#define IPVLAN_ALWAYS_ON \
|
#define IPVLAN_ALWAYS_ON \
|
||||||
(IPVLAN_ALWAYS_ON_OFLOADS | NETIF_F_LLTX | NETIF_F_VLAN_CHALLENGED)
|
(IPVLAN_ALWAYS_ON_OFLOADS | NETIF_F_VLAN_CHALLENGED)
|
||||||
|
|
||||||
#define IPVLAN_FEATURES \
|
#define IPVLAN_FEATURES \
|
||||||
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
|
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
|
||||||
@ -141,6 +141,7 @@ static int ipvlan_init(struct net_device *dev)
|
|||||||
dev->vlan_features = phy_dev->vlan_features & IPVLAN_FEATURES;
|
dev->vlan_features = phy_dev->vlan_features & IPVLAN_FEATURES;
|
||||||
dev->vlan_features |= IPVLAN_ALWAYS_ON_OFLOADS;
|
dev->vlan_features |= IPVLAN_ALWAYS_ON_OFLOADS;
|
||||||
dev->hw_enc_features |= dev->features;
|
dev->hw_enc_features |= dev->features;
|
||||||
|
dev->lltx = true;
|
||||||
netif_inherit_tso_max(dev, phy_dev);
|
netif_inherit_tso_max(dev, phy_dev);
|
||||||
dev->hard_header_len = phy_dev->hard_header_len;
|
dev->hard_header_len = phy_dev->hard_header_len;
|
||||||
|
|
||||||
|
@ -171,6 +171,7 @@ static void gen_lo_setup(struct net_device *dev,
|
|||||||
dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
|
dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
|
||||||
dev->flags = IFF_LOOPBACK;
|
dev->flags = IFF_LOOPBACK;
|
||||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
dev->hw_features = NETIF_F_GSO_SOFTWARE;
|
dev->hw_features = NETIF_F_GSO_SOFTWARE;
|
||||||
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
|
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST
|
||||||
@ -179,7 +180,6 @@ static void gen_lo_setup(struct net_device *dev,
|
|||||||
| NETIF_F_RXCSUM
|
| NETIF_F_RXCSUM
|
||||||
| NETIF_F_SCTP_CRC
|
| NETIF_F_SCTP_CRC
|
||||||
| NETIF_F_HIGHDMA
|
| NETIF_F_HIGHDMA
|
||||||
| NETIF_F_LLTX
|
|
||||||
| NETIF_F_NETNS_LOCAL
|
| NETIF_F_NETNS_LOCAL
|
||||||
| NETIF_F_VLAN_CHALLENGED
|
| NETIF_F_VLAN_CHALLENGED
|
||||||
| NETIF_F_LOOPBACK;
|
| NETIF_F_LOOPBACK;
|
||||||
|
@ -3550,7 +3550,8 @@ static int macsec_dev_init(struct net_device *dev)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
dev->features = real_dev->features & MACSEC_FEATURES;
|
dev->features = real_dev->features & MACSEC_FEATURES;
|
||||||
dev->features |= NETIF_F_LLTX | NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
|
dev->lltx = true;
|
||||||
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
||||||
|
|
||||||
macsec_set_head_tail_room(dev);
|
macsec_set_head_tail_room(dev);
|
||||||
@ -3581,7 +3582,6 @@ static netdev_features_t macsec_fix_features(struct net_device *dev,
|
|||||||
|
|
||||||
features &= (real_dev->features & MACSEC_FEATURES) |
|
features &= (real_dev->features & MACSEC_FEATURES) |
|
||||||
NETIF_F_GSO_SOFTWARE | NETIF_F_SOFT_FEATURES;
|
NETIF_F_GSO_SOFTWARE | NETIF_F_SOFT_FEATURES;
|
||||||
features |= NETIF_F_LLTX;
|
|
||||||
|
|
||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
|
@ -900,7 +900,7 @@ static struct lock_class_key macvlan_netdev_addr_lock_key;
|
|||||||
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE | \
|
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE | \
|
||||||
NETIF_F_GSO_ROBUST | NETIF_F_GSO_ENCAP_ALL)
|
NETIF_F_GSO_ROBUST | NETIF_F_GSO_ENCAP_ALL)
|
||||||
|
|
||||||
#define ALWAYS_ON_FEATURES (ALWAYS_ON_OFFLOADS | NETIF_F_LLTX)
|
#define ALWAYS_ON_FEATURES ALWAYS_ON_OFFLOADS
|
||||||
|
|
||||||
#define MACVLAN_FEATURES \
|
#define MACVLAN_FEATURES \
|
||||||
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
|
(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
|
||||||
@ -932,6 +932,7 @@ static int macvlan_init(struct net_device *dev)
|
|||||||
dev->vlan_features = lowerdev->vlan_features & MACVLAN_FEATURES;
|
dev->vlan_features = lowerdev->vlan_features & MACVLAN_FEATURES;
|
||||||
dev->vlan_features |= ALWAYS_ON_OFFLOADS;
|
dev->vlan_features |= ALWAYS_ON_OFFLOADS;
|
||||||
dev->hw_enc_features |= dev->features;
|
dev->hw_enc_features |= dev->features;
|
||||||
|
dev->lltx = true;
|
||||||
netif_inherit_tso_max(dev, lowerdev);
|
netif_inherit_tso_max(dev, lowerdev);
|
||||||
dev->hard_header_len = lowerdev->hard_header_len;
|
dev->hard_header_len = lowerdev->hard_header_len;
|
||||||
macvlan_set_lockdep_class(dev);
|
macvlan_set_lockdep_class(dev);
|
||||||
|
@ -731,7 +731,7 @@ struct failover *net_failover_create(struct net_device *standby_dev)
|
|||||||
IFF_TX_SKB_SHARING);
|
IFF_TX_SKB_SHARING);
|
||||||
|
|
||||||
/* don't acquire failover netdev's netif_tx_lock when transmitting */
|
/* don't acquire failover netdev's netif_tx_lock when transmitting */
|
||||||
failover_dev->features |= NETIF_F_LLTX;
|
failover_dev->lltx = true;
|
||||||
|
|
||||||
/* Don't allow failover devices to change network namespaces. */
|
/* Don't allow failover devices to change network namespaces. */
|
||||||
failover_dev->features |= NETIF_F_NETNS_LOCAL;
|
failover_dev->features |= NETIF_F_NETNS_LOCAL;
|
||||||
|
@ -255,11 +255,12 @@ static void netkit_setup(struct net_device *dev)
|
|||||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
||||||
dev->priv_flags |= IFF_PHONY_HEADROOM;
|
dev->priv_flags |= IFF_PHONY_HEADROOM;
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->ethtool_ops = &netkit_ethtool_ops;
|
dev->ethtool_ops = &netkit_ethtool_ops;
|
||||||
dev->netdev_ops = &netkit_netdev_ops;
|
dev->netdev_ops = &netkit_netdev_ops;
|
||||||
|
|
||||||
dev->features |= netkit_features | NETIF_F_LLTX;
|
dev->features |= netkit_features;
|
||||||
dev->hw_features = netkit_features;
|
dev->hw_features = netkit_features;
|
||||||
dev->hw_enc_features = netkit_features;
|
dev->hw_enc_features = netkit_features;
|
||||||
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
|
dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
|
||||||
|
@ -63,13 +63,13 @@ static void nlmon_setup(struct net_device *dev)
|
|||||||
{
|
{
|
||||||
dev->type = ARPHRD_NETLINK;
|
dev->type = ARPHRD_NETLINK;
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->netdev_ops = &nlmon_ops;
|
dev->netdev_ops = &nlmon_ops;
|
||||||
dev->ethtool_ops = &nlmon_ethtool_ops;
|
dev->ethtool_ops = &nlmon_ethtool_ops;
|
||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
|
|
||||||
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST |
|
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA;
|
||||||
NETIF_F_HIGHDMA | NETIF_F_LLTX;
|
|
||||||
dev->flags = IFF_NOARP;
|
dev->flags = IFF_NOARP;
|
||||||
dev->pcpu_stat_type = NETDEV_PCPU_STAT_LSTATS;
|
dev->pcpu_stat_type = NETDEV_PCPU_STAT_LSTATS;
|
||||||
|
|
||||||
|
@ -1631,7 +1631,7 @@ static void ppp_setup(struct net_device *dev)
|
|||||||
dev->netdev_ops = &ppp_netdev_ops;
|
dev->netdev_ops = &ppp_netdev_ops;
|
||||||
SET_NETDEV_DEVTYPE(dev, &ppp_type);
|
SET_NETDEV_DEVTYPE(dev, &ppp_type);
|
||||||
|
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->hard_header_len = PPP_HDRLEN;
|
dev->hard_header_len = PPP_HDRLEN;
|
||||||
dev->mtu = PPP_MRU;
|
dev->mtu = PPP_MRU;
|
||||||
|
@ -515,7 +515,7 @@ static int rionet_setup_netdev(struct rio_mport *mport, struct net_device *ndev)
|
|||||||
/* MTU range: 68 - 4082 */
|
/* MTU range: 68 - 4082 */
|
||||||
ndev->min_mtu = ETH_MIN_MTU;
|
ndev->min_mtu = ETH_MIN_MTU;
|
||||||
ndev->max_mtu = RIONET_MAX_MTU;
|
ndev->max_mtu = RIONET_MAX_MTU;
|
||||||
ndev->features = NETIF_F_LLTX;
|
ndev->lltx = true;
|
||||||
SET_NETDEV_DEV(ndev, &mport->dev);
|
SET_NETDEV_DEV(ndev, &mport->dev);
|
||||||
ndev->ethtool_ops = &rionet_ethtool_ops;
|
ndev->ethtool_ops = &rionet_ethtool_ops;
|
||||||
|
|
||||||
|
@ -2189,8 +2189,8 @@ static void team_setup(struct net_device *dev)
|
|||||||
* Let this up to underlay drivers.
|
* Let this up to underlay drivers.
|
||||||
*/
|
*/
|
||||||
dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE;
|
dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->features |= NETIF_F_LLTX;
|
|
||||||
dev->features |= NETIF_F_GRO;
|
dev->features |= NETIF_F_GRO;
|
||||||
|
|
||||||
/* Don't allow team devices to change network namespaces. */
|
/* Don't allow team devices to change network namespaces. */
|
||||||
|
@ -990,10 +990,11 @@ static int tun_net_init(struct net_device *dev)
|
|||||||
dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST |
|
dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST |
|
||||||
TUN_USER_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
|
TUN_USER_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
|
||||||
NETIF_F_HW_VLAN_STAG_TX;
|
NETIF_F_HW_VLAN_STAG_TX;
|
||||||
dev->features = dev->hw_features | NETIF_F_LLTX;
|
dev->features = dev->hw_features;
|
||||||
dev->vlan_features = dev->features &
|
dev->vlan_features = dev->features &
|
||||||
~(NETIF_F_HW_VLAN_CTAG_TX |
|
~(NETIF_F_HW_VLAN_CTAG_TX |
|
||||||
NETIF_F_HW_VLAN_STAG_TX);
|
NETIF_F_HW_VLAN_STAG_TX);
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
tun->flags = (tun->flags & ~TUN_FEATURES) |
|
tun->flags = (tun->flags & ~TUN_FEATURES) |
|
||||||
(ifr->ifr_flags & TUN_FEATURES);
|
(ifr->ifr_flags & TUN_FEATURES);
|
||||||
@ -1129,7 +1130,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||||||
goto drop;
|
goto drop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NETIF_F_LLTX requires to do our own update of trans_start */
|
/* dev->lltx requires to do our own update of trans_start */
|
||||||
queue = netdev_get_tx_queue(dev, txq);
|
queue = netdev_get_tx_queue(dev, txq);
|
||||||
txq_trans_cond_update(queue);
|
txq_trans_cond_update(queue);
|
||||||
|
|
||||||
|
@ -1697,11 +1697,11 @@ static void veth_setup(struct net_device *dev)
|
|||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
dev->priv_flags |= IFF_PHONY_HEADROOM;
|
dev->priv_flags |= IFF_PHONY_HEADROOM;
|
||||||
dev->priv_flags |= IFF_DISABLE_NETPOLL;
|
dev->priv_flags |= IFF_DISABLE_NETPOLL;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->netdev_ops = &veth_netdev_ops;
|
dev->netdev_ops = &veth_netdev_ops;
|
||||||
dev->xdp_metadata_ops = &veth_xdp_metadata_ops;
|
dev->xdp_metadata_ops = &veth_xdp_metadata_ops;
|
||||||
dev->ethtool_ops = &veth_ethtool_ops;
|
dev->ethtool_ops = &veth_ethtool_ops;
|
||||||
dev->features |= NETIF_F_LLTX;
|
|
||||||
dev->features |= VETH_FEATURES;
|
dev->features |= VETH_FEATURES;
|
||||||
dev->vlan_features = dev->features &
|
dev->vlan_features = dev->features &
|
||||||
~(NETIF_F_HW_VLAN_CTAG_TX |
|
~(NETIF_F_HW_VLAN_CTAG_TX |
|
||||||
|
@ -1635,7 +1635,7 @@ static void vrf_setup(struct net_device *dev)
|
|||||||
eth_hw_addr_random(dev);
|
eth_hw_addr_random(dev);
|
||||||
|
|
||||||
/* don't acquire vrf device's netif_tx_lock when transmitting */
|
/* don't acquire vrf device's netif_tx_lock when transmitting */
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
|
|
||||||
/* don't allow vrf devices to change network namespaces. */
|
/* don't allow vrf devices to change network namespaces. */
|
||||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
dev->features |= NETIF_F_NETNS_LOCAL;
|
||||||
|
@ -83,13 +83,13 @@ static void vsockmon_setup(struct net_device *dev)
|
|||||||
{
|
{
|
||||||
dev->type = ARPHRD_VSOCKMON;
|
dev->type = ARPHRD_VSOCKMON;
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->netdev_ops = &vsockmon_ops;
|
dev->netdev_ops = &vsockmon_ops;
|
||||||
dev->ethtool_ops = &vsockmon_ethtool_ops;
|
dev->ethtool_ops = &vsockmon_ethtool_ops;
|
||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
|
|
||||||
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST |
|
dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA;
|
||||||
NETIF_F_HIGHDMA | NETIF_F_LLTX;
|
|
||||||
|
|
||||||
dev->flags = IFF_NOARP;
|
dev->flags = IFF_NOARP;
|
||||||
|
|
||||||
|
@ -3321,7 +3321,6 @@ static void vxlan_setup(struct net_device *dev)
|
|||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
SET_NETDEV_DEVTYPE(dev, &vxlan_type);
|
SET_NETDEV_DEVTYPE(dev, &vxlan_type);
|
||||||
|
|
||||||
dev->features |= NETIF_F_LLTX;
|
|
||||||
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
|
dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
|
||||||
dev->features |= NETIF_F_RXCSUM;
|
dev->features |= NETIF_F_RXCSUM;
|
||||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
@ -3333,6 +3332,7 @@ static void vxlan_setup(struct net_device *dev)
|
|||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
dev->change_proto_down = true;
|
dev->change_proto_down = true;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
/* MTU range: 68 - 65535 */
|
/* MTU range: 68 - 65535 */
|
||||||
dev->min_mtu = ETH_MIN_MTU;
|
dev->min_mtu = ETH_MIN_MTU;
|
||||||
|
@ -289,7 +289,7 @@ static void wg_setup(struct net_device *dev)
|
|||||||
dev->type = ARPHRD_NONE;
|
dev->type = ARPHRD_NONE;
|
||||||
dev->flags = IFF_POINTOPOINT | IFF_NOARP;
|
dev->flags = IFF_POINTOPOINT | IFF_NOARP;
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
dev->features |= WG_NETDEV_FEATURES;
|
dev->features |= WG_NETDEV_FEATURES;
|
||||||
dev->hw_features |= WG_NETDEV_FEATURES;
|
dev->hw_features |= WG_NETDEV_FEATURES;
|
||||||
dev->hw_enc_features |= WG_NETDEV_FEATURES;
|
dev->hw_enc_features |= WG_NETDEV_FEATURES;
|
||||||
|
@ -425,7 +425,7 @@ int cvm_oct_common_init(struct net_device *dev)
|
|||||||
dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
|
dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
|
||||||
|
|
||||||
/* We do our own locking, Linux doesn't need to */
|
/* We do our own locking, Linux doesn't need to */
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
dev->ethtool_ops = &cvm_oct_ethtool_ops;
|
dev->ethtool_ops = &cvm_oct_ethtool_ops;
|
||||||
|
|
||||||
cvm_oct_set_mac_filter(dev);
|
cvm_oct_set_mac_filter(dev);
|
||||||
|
@ -24,8 +24,7 @@ enum {
|
|||||||
NETIF_F_HW_VLAN_CTAG_FILTER_BIT,/* Receive filtering on VLAN CTAGs */
|
NETIF_F_HW_VLAN_CTAG_FILTER_BIT,/* Receive filtering on VLAN CTAGs */
|
||||||
NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */
|
NETIF_F_VLAN_CHALLENGED_BIT, /* Device cannot handle VLAN packets */
|
||||||
NETIF_F_GSO_BIT, /* Enable software GSO. */
|
NETIF_F_GSO_BIT, /* Enable software GSO. */
|
||||||
NETIF_F_LLTX_BIT, /* LockLess TX - deprecated. Please */
|
__UNUSED_NETIF_F_12,
|
||||||
/* do not use LLTX in new drivers */
|
|
||||||
NETIF_F_NETNS_LOCAL_BIT, /* Does not change network namespaces */
|
NETIF_F_NETNS_LOCAL_BIT, /* Does not change network namespaces */
|
||||||
NETIF_F_GRO_BIT, /* Generic receive offload */
|
NETIF_F_GRO_BIT, /* Generic receive offload */
|
||||||
NETIF_F_LRO_BIT, /* large receive offload */
|
NETIF_F_LRO_BIT, /* large receive offload */
|
||||||
@ -120,7 +119,6 @@ enum {
|
|||||||
#define NETIF_F_HW_VLAN_CTAG_TX __NETIF_F(HW_VLAN_CTAG_TX)
|
#define NETIF_F_HW_VLAN_CTAG_TX __NETIF_F(HW_VLAN_CTAG_TX)
|
||||||
#define NETIF_F_IP_CSUM __NETIF_F(IP_CSUM)
|
#define NETIF_F_IP_CSUM __NETIF_F(IP_CSUM)
|
||||||
#define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM)
|
#define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM)
|
||||||
#define NETIF_F_LLTX __NETIF_F(LLTX)
|
|
||||||
#define NETIF_F_LOOPBACK __NETIF_F(LOOPBACK)
|
#define NETIF_F_LOOPBACK __NETIF_F(LOOPBACK)
|
||||||
#define NETIF_F_LRO __NETIF_F(LRO)
|
#define NETIF_F_LRO __NETIF_F(LRO)
|
||||||
#define NETIF_F_NETNS_LOCAL __NETIF_F(NETNS_LOCAL)
|
#define NETIF_F_NETNS_LOCAL __NETIF_F(NETNS_LOCAL)
|
||||||
@ -193,7 +191,7 @@ static inline int find_next_netdev_feature(u64 feature, unsigned long start)
|
|||||||
/* Features valid for ethtool to change */
|
/* Features valid for ethtool to change */
|
||||||
/* = all defined minus driver/device-class-related */
|
/* = all defined minus driver/device-class-related */
|
||||||
#define NETIF_F_NEVER_CHANGE (NETIF_F_VLAN_CHALLENGED | \
|
#define NETIF_F_NEVER_CHANGE (NETIF_F_VLAN_CHALLENGED | \
|
||||||
NETIF_F_LLTX | NETIF_F_NETNS_LOCAL)
|
NETIF_F_NETNS_LOCAL)
|
||||||
|
|
||||||
/* remember that ((t)1 << t_BITS) is undefined in C99 */
|
/* remember that ((t)1 << t_BITS) is undefined in C99 */
|
||||||
#define NETIF_F_ETHTOOL_BITS ((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \
|
#define NETIF_F_ETHTOOL_BITS ((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \
|
||||||
|
@ -1720,6 +1720,9 @@ enum netdev_reg_state {
|
|||||||
*
|
*
|
||||||
* @priv_flags: flags invisible to userspace defined as bits, see
|
* @priv_flags: flags invisible to userspace defined as bits, see
|
||||||
* enum netdev_priv_flags for the definitions
|
* enum netdev_priv_flags for the definitions
|
||||||
|
* @lltx: device supports lockless Tx. Deprecated for real HW
|
||||||
|
* drivers. Mainly used by logical interfaces, such as
|
||||||
|
* bonding and tunnels
|
||||||
*
|
*
|
||||||
* @name: This is the first field of the "visible" part of this structure
|
* @name: This is the first field of the "visible" part of this structure
|
||||||
* (i.e. as seen by users in the "Space.c" file). It is the name
|
* (i.e. as seen by users in the "Space.c" file). It is the name
|
||||||
@ -2018,6 +2021,7 @@ struct net_device {
|
|||||||
__cacheline_group_begin(net_device_read_tx);
|
__cacheline_group_begin(net_device_read_tx);
|
||||||
struct_group(priv_flags_fast,
|
struct_group(priv_flags_fast,
|
||||||
unsigned long priv_flags:32;
|
unsigned long priv_flags:32;
|
||||||
|
unsigned long lltx:1;
|
||||||
);
|
);
|
||||||
const struct net_device_ops *netdev_ops;
|
const struct net_device_ops *netdev_ops;
|
||||||
const struct header_ops *header_ops;
|
const struct header_ops *header_ops;
|
||||||
@ -4433,7 +4437,7 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HARD_TX_LOCK(dev, txq, cpu) { \
|
#define HARD_TX_LOCK(dev, txq, cpu) { \
|
||||||
if ((dev->features & NETIF_F_LLTX) == 0) { \
|
if (!(dev)->lltx) { \
|
||||||
__netif_tx_lock(txq, cpu); \
|
__netif_tx_lock(txq, cpu); \
|
||||||
} else { \
|
} else { \
|
||||||
__netif_tx_acquire(txq); \
|
__netif_tx_acquire(txq); \
|
||||||
@ -4441,12 +4445,12 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define HARD_TX_TRYLOCK(dev, txq) \
|
#define HARD_TX_TRYLOCK(dev, txq) \
|
||||||
(((dev->features & NETIF_F_LLTX) == 0) ? \
|
(!(dev)->lltx ? \
|
||||||
__netif_tx_trylock(txq) : \
|
__netif_tx_trylock(txq) : \
|
||||||
__netif_tx_acquire(txq))
|
__netif_tx_acquire(txq))
|
||||||
|
|
||||||
#define HARD_TX_UNLOCK(dev, txq) { \
|
#define HARD_TX_UNLOCK(dev, txq) { \
|
||||||
if ((dev->features & NETIF_F_LLTX) == 0) { \
|
if (!(dev)->lltx) { \
|
||||||
__netif_tx_unlock(txq); \
|
__netif_tx_unlock(txq); \
|
||||||
} else { \
|
} else { \
|
||||||
__netif_tx_release(txq); \
|
__netif_tx_release(txq); \
|
||||||
|
@ -15077,8 +15077,7 @@ static struct skb_segment_test skb_segment_tests[] __initconst = {
|
|||||||
.build_skb = build_test_skb_linear_no_head_frag,
|
.build_skb = build_test_skb_linear_no_head_frag,
|
||||||
.features = NETIF_F_SG | NETIF_F_FRAGLIST |
|
.features = NETIF_F_SG | NETIF_F_FRAGLIST |
|
||||||
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
|
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
|
||||||
NETIF_F_LLTX | NETIF_F_GRO |
|
NETIF_F_GRO | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
|
||||||
NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
|
|
||||||
NETIF_F_HW_VLAN_STAG_TX
|
NETIF_F_HW_VLAN_STAG_TX
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -569,7 +569,8 @@ static int vlan_dev_init(struct net_device *dev)
|
|||||||
if (real_dev->vlan_features & NETIF_F_HW_MACSEC)
|
if (real_dev->vlan_features & NETIF_F_HW_MACSEC)
|
||||||
dev->hw_features |= NETIF_F_HW_MACSEC;
|
dev->hw_features |= NETIF_F_HW_MACSEC;
|
||||||
|
|
||||||
dev->features |= dev->hw_features | NETIF_F_LLTX;
|
dev->features |= dev->hw_features;
|
||||||
|
dev->lltx = true;
|
||||||
netif_inherit_tso_max(dev, real_dev);
|
netif_inherit_tso_max(dev, real_dev);
|
||||||
if (dev->features & NETIF_F_VLAN_FEATURES)
|
if (dev->features & NETIF_F_VLAN_FEATURES)
|
||||||
netdev_warn(real_dev, "VLAN features are set incorrectly. Q-in-Q configurations may not work correctly.\n");
|
netdev_warn(real_dev, "VLAN features are set incorrectly. Q-in-Q configurations may not work correctly.\n");
|
||||||
@ -655,7 +656,6 @@ static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
|
|||||||
lower_features |= NETIF_F_HW_CSUM;
|
lower_features |= NETIF_F_HW_CSUM;
|
||||||
features = netdev_intersect_features(features, lower_features);
|
features = netdev_intersect_features(features, lower_features);
|
||||||
features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_GSO_SOFTWARE);
|
features |= old_features & (NETIF_F_SOFT_FEATURES | NETIF_F_GSO_SOFTWARE);
|
||||||
features |= NETIF_F_LLTX;
|
|
||||||
|
|
||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
|
@ -1021,8 +1021,8 @@ static void batadv_softif_init_early(struct net_device *dev)
|
|||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
dev->priv_destructor = batadv_softif_free;
|
dev->priv_destructor = batadv_softif_free;
|
||||||
dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL;
|
dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL;
|
||||||
dev->features |= NETIF_F_LLTX;
|
|
||||||
dev->priv_flags |= IFF_NO_QUEUE;
|
dev->priv_flags |= IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
/* can't call min_mtu, because the needed variables
|
/* can't call min_mtu, because the needed variables
|
||||||
* have not been initialized yet
|
* have not been initialized yet
|
||||||
|
@ -487,8 +487,9 @@ void br_dev_setup(struct net_device *dev)
|
|||||||
dev->ethtool_ops = &br_ethtool_ops;
|
dev->ethtool_ops = &br_ethtool_ops;
|
||||||
SET_NETDEV_DEVTYPE(dev, &br_type);
|
SET_NETDEV_DEVTYPE(dev, &br_type);
|
||||||
dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE;
|
dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE;
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->features = COMMON_FEATURES | NETIF_F_LLTX | NETIF_F_NETNS_LOCAL |
|
dev->features = COMMON_FEATURES | NETIF_F_NETNS_LOCAL |
|
||||||
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
|
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
|
||||||
dev->hw_features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
|
dev->hw_features = COMMON_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
|
||||||
NETIF_F_HW_VLAN_STAG_TX;
|
NETIF_F_HW_VLAN_STAG_TX;
|
||||||
|
@ -1764,8 +1764,7 @@ static const struct kobj_type netdev_queue_ktype = {
|
|||||||
|
|
||||||
static bool netdev_uses_bql(const struct net_device *dev)
|
static bool netdev_uses_bql(const struct net_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->features & NETIF_F_LLTX ||
|
if (dev->lltx || (dev->priv_flags & IFF_NO_QUEUE))
|
||||||
dev->priv_flags & IFF_NO_QUEUE)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return IS_ENABLED(CONFIG_BQL);
|
return IS_ENABLED(CONFIG_BQL);
|
||||||
|
@ -2642,11 +2642,12 @@ void dsa_user_setup_tagger(struct net_device *user)
|
|||||||
|
|
||||||
user->features = conduit->vlan_features | NETIF_F_HW_TC;
|
user->features = conduit->vlan_features | NETIF_F_HW_TC;
|
||||||
user->hw_features |= NETIF_F_HW_TC;
|
user->hw_features |= NETIF_F_HW_TC;
|
||||||
user->features |= NETIF_F_LLTX;
|
|
||||||
if (user->needed_tailroom)
|
if (user->needed_tailroom)
|
||||||
user->features &= ~(NETIF_F_SG | NETIF_F_FRAGLIST);
|
user->features &= ~(NETIF_F_SG | NETIF_F_FRAGLIST);
|
||||||
if (ds->needs_standalone_vlan_filtering)
|
if (ds->needs_standalone_vlan_filtering)
|
||||||
user->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
user->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
|
|
||||||
|
user->lltx = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dsa_user_suspend(struct net_device *user_dev)
|
int dsa_user_suspend(struct net_device *user_dev)
|
||||||
|
@ -25,7 +25,6 @@ const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
|
|||||||
[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
|
[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
|
||||||
[NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
|
[NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
|
||||||
[NETIF_F_GSO_BIT] = "tx-generic-segmentation",
|
[NETIF_F_GSO_BIT] = "tx-generic-segmentation",
|
||||||
[NETIF_F_LLTX_BIT] = "tx-lockless",
|
|
||||||
[NETIF_F_NETNS_LOCAL_BIT] = "netns-local",
|
[NETIF_F_NETNS_LOCAL_BIT] = "netns-local",
|
||||||
[NETIF_F_GRO_BIT] = "rx-gro",
|
[NETIF_F_GRO_BIT] = "rx-gro",
|
||||||
[NETIF_F_GRO_HW_BIT] = "rx-gro-hw",
|
[NETIF_F_GRO_HW_BIT] = "rx-gro-hw",
|
||||||
|
@ -554,6 +554,8 @@ void hsr_dev_setup(struct net_device *dev)
|
|||||||
dev->netdev_ops = &hsr_device_ops;
|
dev->netdev_ops = &hsr_device_ops;
|
||||||
SET_NETDEV_DEVTYPE(dev, &hsr_type);
|
SET_NETDEV_DEVTYPE(dev, &hsr_type);
|
||||||
dev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
|
dev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
|
||||||
|
/* Prevent recursive tx locking */
|
||||||
|
dev->lltx = true;
|
||||||
|
|
||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
|
|
||||||
@ -563,8 +565,6 @@ void hsr_dev_setup(struct net_device *dev)
|
|||||||
|
|
||||||
dev->features = dev->hw_features;
|
dev->features = dev->hw_features;
|
||||||
|
|
||||||
/* Prevent recursive tx locking */
|
|
||||||
dev->features |= NETIF_F_LLTX;
|
|
||||||
/* VLAN on top of HSR needs testing and probably some work on
|
/* VLAN on top of HSR needs testing and probably some work on
|
||||||
* hsr_header_create() etc.
|
* hsr_header_create() etc.
|
||||||
*/
|
*/
|
||||||
|
@ -996,7 +996,7 @@ static void __gre_tunnel_init(struct net_device *dev)
|
|||||||
tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
|
tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
|
||||||
dev->needed_headroom = tunnel->hlen + sizeof(tunnel->parms.iph);
|
dev->needed_headroom = tunnel->hlen + sizeof(tunnel->parms.iph);
|
||||||
|
|
||||||
dev->features |= GRE_FEATURES | NETIF_F_LLTX;
|
dev->features |= GRE_FEATURES;
|
||||||
dev->hw_features |= GRE_FEATURES;
|
dev->hw_features |= GRE_FEATURES;
|
||||||
|
|
||||||
/* TCP offload with GRE SEQ is not supported, nor can we support 2
|
/* TCP offload with GRE SEQ is not supported, nor can we support 2
|
||||||
@ -1010,6 +1010,8 @@ static void __gre_tunnel_init(struct net_device *dev)
|
|||||||
|
|
||||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
dev->hw_features |= NETIF_F_GSO_SOFTWARE;
|
dev->hw_features |= NETIF_F_GSO_SOFTWARE;
|
||||||
|
|
||||||
|
dev->lltx = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipgre_tunnel_init(struct net_device *dev)
|
static int ipgre_tunnel_init(struct net_device *dev)
|
||||||
|
@ -443,7 +443,7 @@ static int vti_tunnel_init(struct net_device *dev)
|
|||||||
|
|
||||||
dev->flags = IFF_NOARP;
|
dev->flags = IFF_NOARP;
|
||||||
dev->addr_len = 4;
|
dev->addr_len = 4;
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
|
|
||||||
return ip_tunnel_init(dev);
|
return ip_tunnel_init(dev);
|
||||||
|
@ -378,7 +378,7 @@ static void ipip_tunnel_setup(struct net_device *dev)
|
|||||||
dev->type = ARPHRD_TUNNEL;
|
dev->type = ARPHRD_TUNNEL;
|
||||||
dev->flags = IFF_NOARP;
|
dev->flags = IFF_NOARP;
|
||||||
dev->addr_len = 4;
|
dev->addr_len = 4;
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
|
|
||||||
dev->features |= IPIP_FEATURES;
|
dev->features |= IPIP_FEATURES;
|
||||||
|
@ -1471,7 +1471,7 @@ static void ip6gre_tnl_init_features(struct net_device *dev)
|
|||||||
{
|
{
|
||||||
struct ip6_tnl *nt = netdev_priv(dev);
|
struct ip6_tnl *nt = netdev_priv(dev);
|
||||||
|
|
||||||
dev->features |= GRE6_FEATURES | NETIF_F_LLTX;
|
dev->features |= GRE6_FEATURES;
|
||||||
dev->hw_features |= GRE6_FEATURES;
|
dev->hw_features |= GRE6_FEATURES;
|
||||||
|
|
||||||
/* TCP offload with GRE SEQ is not supported, nor can we support 2
|
/* TCP offload with GRE SEQ is not supported, nor can we support 2
|
||||||
@ -1485,6 +1485,8 @@ static void ip6gre_tnl_init_features(struct net_device *dev)
|
|||||||
|
|
||||||
dev->features |= NETIF_F_GSO_SOFTWARE;
|
dev->features |= NETIF_F_GSO_SOFTWARE;
|
||||||
dev->hw_features |= NETIF_F_GSO_SOFTWARE;
|
dev->hw_features |= NETIF_F_GSO_SOFTWARE;
|
||||||
|
|
||||||
|
dev->lltx = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ip6gre_tunnel_init_common(struct net_device *dev)
|
static int ip6gre_tunnel_init_common(struct net_device *dev)
|
||||||
|
@ -1849,7 +1849,7 @@ static void ip6_tnl_dev_setup(struct net_device *dev)
|
|||||||
dev->type = ARPHRD_TUNNEL6;
|
dev->type = ARPHRD_TUNNEL6;
|
||||||
dev->flags |= IFF_NOARP;
|
dev->flags |= IFF_NOARP;
|
||||||
dev->addr_len = sizeof(struct in6_addr);
|
dev->addr_len = sizeof(struct in6_addr);
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
|
|
||||||
|
@ -1436,7 +1436,7 @@ static void ipip6_tunnel_setup(struct net_device *dev)
|
|||||||
dev->flags = IFF_NOARP;
|
dev->flags = IFF_NOARP;
|
||||||
netif_keep_dst(dev);
|
netif_keep_dst(dev);
|
||||||
dev->addr_len = 4;
|
dev->addr_len = 4;
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
dev->features |= SIT_FEATURES;
|
dev->features |= SIT_FEATURES;
|
||||||
dev->hw_features |= SIT_FEATURES;
|
dev->hw_features |= SIT_FEATURES;
|
||||||
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
||||||
|
@ -97,7 +97,7 @@ static void l2tp_eth_dev_setup(struct net_device *dev)
|
|||||||
SET_NETDEV_DEVTYPE(dev, &l2tpeth_type);
|
SET_NETDEV_DEVTYPE(dev, &l2tpeth_type);
|
||||||
ether_setup(dev);
|
ether_setup(dev);
|
||||||
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
dev->netdev_ops = &l2tp_eth_netdev_ops;
|
dev->netdev_ops = &l2tp_eth_netdev_ops;
|
||||||
dev->needs_free_netdev = true;
|
dev->needs_free_netdev = true;
|
||||||
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
||||||
|
@ -102,19 +102,20 @@ static void do_setup(struct net_device *netdev)
|
|||||||
netdev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
netdev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||||
netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH |
|
netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH |
|
||||||
IFF_NO_QUEUE;
|
IFF_NO_QUEUE;
|
||||||
|
netdev->lltx = true;
|
||||||
netdev->needs_free_netdev = true;
|
netdev->needs_free_netdev = true;
|
||||||
netdev->priv_destructor = NULL;
|
netdev->priv_destructor = NULL;
|
||||||
netdev->ethtool_ops = &internal_dev_ethtool_ops;
|
netdev->ethtool_ops = &internal_dev_ethtool_ops;
|
||||||
netdev->rtnl_link_ops = &internal_dev_link_ops;
|
netdev->rtnl_link_ops = &internal_dev_link_ops;
|
||||||
|
|
||||||
netdev->features = NETIF_F_LLTX | NETIF_F_SG | NETIF_F_FRAGLIST |
|
netdev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
|
||||||
NETIF_F_HIGHDMA | NETIF_F_HW_CSUM |
|
NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE |
|
||||||
NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL;
|
NETIF_F_GSO_ENCAP_ALL;
|
||||||
|
|
||||||
netdev->vlan_features = netdev->features;
|
netdev->vlan_features = netdev->features;
|
||||||
netdev->hw_enc_features = netdev->features;
|
netdev->hw_enc_features = netdev->features;
|
||||||
netdev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
|
netdev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
|
||||||
netdev->hw_features = netdev->features & ~NETIF_F_LLTX;
|
netdev->hw_features = netdev->features;
|
||||||
|
|
||||||
eth_hw_addr_random(netdev);
|
eth_hw_addr_random(netdev);
|
||||||
}
|
}
|
||||||
|
@ -769,7 +769,7 @@ static int xfrmi_dev_init(struct net_device *dev)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->lltx = true;
|
||||||
dev->features |= XFRMI_FEATURES;
|
dev->features |= XFRMI_FEATURES;
|
||||||
dev->hw_features |= XFRMI_FEATURES;
|
dev->hw_features |= XFRMI_FEATURES;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user