forked from mirrors/linux
		
	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
					
				
					 57 changed files with 93 additions and 84 deletions
				
			
		|  | @ -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 a new issue
	
	 Alexander Lobakin
						Alexander Lobakin