diff mbox series

[RFC,net-next,6/7] netdev_features: convert NETIF_F_VLAN_CHALLENGED to IFF_VLAN_CHALLENGED

Message ID 20240405133731.1010128-7-aleksander.lobakin@intel.com (mailing list archive)
State RFC
Delegated to: Netdev Maintainers
Headers show
Series netdev_features: start cleaning netdev_features_t up | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next, async
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 5766 this patch: 5766
netdev/build_tools success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers warning 47 maintainers not CCed: wintera@linux.ibm.com agordeev@linux.ibm.com ryazanov.s.a@gmail.com linux-arm-kernel@lists.infradead.org j.vosburgh@gmail.com linuxppc-dev@lists.ozlabs.org anthony.l.nguyen@intel.com michal.simek@amd.com vladbu@nvidia.com hca@linux.ibm.com christophe.jaillet@wanadoo.fr ahmed.zaki@intel.com geoff@infradead.org twinkler@linux.ibm.com ansuelsmth@gmail.com christophe.leroy@csgroup.eu idosch@nvidia.com m.chetan.kumar@linux.intel.com u.kleine-koenig@pengutronix.de ricardo.martinez@linux.intel.com jgg@ziepe.ca linux-doc@vger.kernel.org sridhar.samudrala@intel.com chandrashekar.devegowda@intel.com jesse.brandeburg@intel.com johannes@sipsolutions.net jinpu.wang@ionos.com dan.carpenter@linaro.org ludvig.parsson@axis.com leon@kernel.org chiranjeevi.rapolu@linux.intel.com mpe@ellerman.id.au svens@linux.ibm.com linux-rdma@vger.kernel.org linux-s390@vger.kernel.org aneesh.kumar@kernel.org intel-wired-lan@lists.osuosl.org jiri@resnulli.us haijun.liu@mediatek.com m-karicheri2@ti.com gor@linux.ibm.com andy@greyhouse.net borntraeger@linux.ibm.com npiggin@gmail.com loic.poulain@linaro.org corbet@lwn.net naveen.n.rao@linux.ibm.com
netdev/build_clang success Errors and warnings before: 1075 this patch: 1075
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 6048 this patch: 6048
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 345 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 147 this patch: 147
netdev/source_inline success Was 0 now: 0

Commit Message

Alexander Lobakin April 5, 2024, 1:37 p.m. UTC
Inability to handle VLAN-tagged packets is more of an attribute, not
a feature.
Convert it to a private flag and add it to IFF_ONE_FOR_ALL with special
handling in netdev_increment_priv_flags() as it previously was in
netdev_increment_features().
Note that starting from this change, ETHTOOL_A_FEATURES_NOCHANGE
will always return 0 to userspace as there's no more
NETIF_F_NEVER_CHANGE.

Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
---
 Documentation/networking/ethtool-netlink.rst |  2 +-
 Documentation/networking/netdev-features.rst | 11 +----------
 include/linux/netdev_features.h              | 12 +++---------
 include/linux/netdevice.h                    |  4 +++-
 drivers/infiniband/ulp/ipoib/ipoib_main.c    |  3 +--
 drivers/net/bonding/bond_main.c              | 12 ++++++------
 drivers/net/ethernet/intel/e100.c            |  2 +-
 drivers/net/ethernet/toshiba/ps3_gelic_net.c |  3 +--
 drivers/net/ethernet/wiznet/w5100.c          |  2 +-
 drivers/net/ethernet/wiznet/w5300.c          |  2 +-
 drivers/net/ethernet/xilinx/ll_temac_main.c  |  1 -
 drivers/net/ipvlan/ipvlan_main.c             | 10 ++++------
 drivers/net/loopback.c                       |  2 +-
 drivers/net/net_failover.c                   |  2 +-
 drivers/net/team/team_core.c                 |  2 +-
 drivers/net/vrf.c                            |  5 ++---
 drivers/net/wwan/t7xx/t7xx_netdev.c          |  3 +--
 drivers/s390/net/qeth_l2_main.c              |  2 +-
 net/8021q/vlan.c                             |  2 +-
 net/core/dev.c                               |  3 ++-
 net/ethtool/common.c                         |  1 -
 net/ethtool/features.c                       |  2 +-
 net/ethtool/ioctl.c                          |  3 +--
 net/hsr/hsr_device.c                         | 10 ++++------
 24 files changed, 39 insertions(+), 62 deletions(-)
diff mbox series

Patch

diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst
index d583d9abf2f8..eff6a6a09ce2 100644
--- a/Documentation/networking/ethtool-netlink.rst
+++ b/Documentation/networking/ethtool-netlink.rst
@@ -756,7 +756,7 @@  Kernel response contents:
   ``ETHTOOL_A_FEATURES_HW``             bitset  dev->hw_features
   ``ETHTOOL_A_FEATURES_WANTED``         bitset  dev->wanted_features
   ``ETHTOOL_A_FEATURES_ACTIVE``         bitset  dev->features
-  ``ETHTOOL_A_FEATURES_NOCHANGE``       bitset  NETIF_F_NEVER_CHANGE
+  ``ETHTOOL_A_FEATURES_NOCHANGE``       bitset  0
   ====================================  ======  ==========================
 
 Bitmaps in kernel response have the same meaning as bitmaps used in ioctl
diff --git a/Documentation/networking/netdev-features.rst b/Documentation/networking/netdev-features.rst
index b95c9203b1aa..25150c955c50 100644
--- a/Documentation/networking/netdev-features.rst
+++ b/Documentation/networking/netdev-features.rst
@@ -82,9 +82,7 @@  This callback should not modify hardware nor driver state (should be
 stateless).  It can be called multiple times between successive
 ndo_set_features calls.
 
-Callback must not alter features contained in NETIF_F_SOFT_FEATURES or
-NETIF_F_NEVER_CHANGE sets. The exception is NETIF_F_VLAN_CHALLENGED but
-care must be taken as the change won't affect already configured VLANs.
+Callback must not alter features contained in NETIF_F_SOFT_FEATURES.
 
  * ndo_set_features:
 
@@ -134,13 +132,6 @@  chained skbs (skb->next/prev list).
 Features contained in NETIF_F_SOFT_FEATURES are features of networking
 stack. Driver should not change behaviour based on them.
 
- * VLAN challenged
-
-NETIF_F_VLAN_CHALLENGED should be set for devices which can't cope with VLAN
-headers. Some drivers set this because the cards can't handle the bigger MTU.
-[FIXME: Those cases could be fixed in VLAN code by allowing only reduced-MTU
-VLANs. This may be not useful, though.]
-
 *  rx-fcs
 
 This requests that the NIC append the Ethernet Frame Checksum (FCS)
diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
index b8e4c7f79e88..318c35c94305 100644
--- a/include/linux/netdev_features.h
+++ b/include/linux/netdev_features.h
@@ -20,7 +20,6 @@  enum {
 	NETIF_F_HW_VLAN_CTAG_TX_BIT,	/* Transmit VLAN CTAG HW acceleration */
 	NETIF_F_HW_VLAN_CTAG_RX_BIT,	/* Receive VLAN CTAG HW acceleration */
 	NETIF_F_HW_VLAN_CTAG_FILTER_BIT,/* Receive filtering on VLAN CTAGs */
-	NETIF_F_VLAN_CHALLENGED_BIT,	/* Device cannot handle VLAN packets */
 	NETIF_F_GSO_BIT,		/* Enable software GSO. */
 	NETIF_F_GRO_BIT,		/* Generic receive offload */
 	NETIF_F_LRO_BIT,		/* large receive offload */
@@ -125,7 +124,6 @@  enum {
 #define NETIF_F_TSO6		__NETIF_F(TSO6)
 #define NETIF_F_TSO_ECN		__NETIF_F(TSO_ECN)
 #define NETIF_F_TSO		__NETIF_F(TSO)
-#define NETIF_F_VLAN_CHALLENGED	__NETIF_F(VLAN_CHALLENGED)
 #define NETIF_F_RXFCS		__NETIF_F(RXFCS)
 #define NETIF_F_RXALL		__NETIF_F(RXALL)
 #define NETIF_F_GSO_GRE		__NETIF_F(GSO_GRE)
@@ -184,12 +182,9 @@  static inline int find_next_netdev_feature(u64 feature, unsigned long start)
 
 /* Features valid for ethtool to change */
 /* = all defined minus driver/device-class-related */
-#define NETIF_F_NEVER_CHANGE	NETIF_F_VLAN_CHALLENGED
-
 /* remember that ((t)1 << t_BITS) is undefined in C99 */
-#define NETIF_F_ETHTOOL_BITS	((__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \
-		(__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) - 1)) & \
-		~NETIF_F_NEVER_CHANGE)
+#define NETIF_F_ETHTOOL_BITS	(__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) | \
+		(__NETIF_F_BIT(NETDEV_FEATURE_COUNT - 1) - 1))
 
 /* Segmentation offload feature mask */
 #define NETIF_F_GSO_MASK	(__NETIF_F_BIT(NETIF_F_GSO_LAST + 1) - \
@@ -217,8 +212,7 @@  static inline int find_next_netdev_feature(u64 feature, unsigned long start)
  * for all in netdev_increment_features.
  */
 #define NETIF_F_ONE_FOR_ALL	(NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \
-				 NETIF_F_SG | NETIF_F_FRAGLIST | \
-				 NETIF_F_VLAN_CHALLENGED)
+				 NETIF_F_SG | NETIF_F_FRAGLIST)
 
 /*
  * If one device doesn't support one of these features, then disable it
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 622d135957ad..57b8d3783b3f 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1653,6 +1653,7 @@  struct net_device_ops {
  *	such as tunnels.
  * @IFF_NETNS_LOCAL: interface can't change network namespaces
  * @IFF_HIGHDMA: device can transmit buffers from high memory
+ * @IFF_VLAN_CHALLENGED: device can't handle VLAN packets
  * @IFF_LOGICAL: combines @IFF_NO_QUEUE and @IFF_LLTX, used by logical
  *	interfaces to avoid overhead from locking and Qdisc.
  * @IFF_ONE_FOR_ALL: if one interface supports them, enable them for all in
@@ -1698,8 +1699,9 @@  enum netdev_priv_flags {
 	IFF_LLTX			= BIT_ULL(34),
 	IFF_NETNS_LOCAL			= BIT_ULL(35),
 	IFF_HIGHDMA			= BIT_ULL(36),
+	IFF_VLAN_CHALLENGED		= BIT_ULL(37),
 	IFF_LOGICAL			= IFF_NO_QUEUE | IFF_LLTX,
-	IFF_ONE_FOR_ALL			= IFF_HIGHDMA,
+	IFF_ONE_FOR_ALL			= IFF_HIGHDMA | IFF_VLAN_CHALLENGED,
 	IFF_ALL_FOR_ALL			= IFF_XMIT_DST_RELEASE |
 					  IFF_XMIT_DST_RELEASE_PERM,
 };
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 888fb9c62f91..3c9db03c56a3 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -2142,13 +2142,12 @@  void ipoib_setup_common(struct net_device *dev)
 	dev->watchdog_timeo	 = 10 * HZ;
 
 	dev->flags		|= IFF_BROADCAST | IFF_MULTICAST;
-	dev->priv_flags		|= IFF_HIGHDMA;
+	dev->priv_flags		|= IFF_HIGHDMA | IFF_VLAN_CHALLENGED;
 
 	dev->hard_header_len	 = IPOIB_HARD_LEN;
 	dev->addr_len		 = INFINIBAND_ALEN;
 	dev->type		 = ARPHRD_INFINIBAND;
 	dev->tx_queue_len	 = ipoib_sendq_size * 2;
-	dev->features		 = NETIF_F_VLAN_CHALLENGED;
 	netif_keep_dst(dev);
 
 	memcpy(dev->broadcast, ipv4_bcast_addr, INFINIBAND_ALEN);
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index cebf1189241c..1de5efbde227 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1864,8 +1864,8 @@  int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
 
 	/* vlan challenged mutual exclusion */
 	/* no need to lock since we're protected by rtnl_lock */
-	if (slave_dev->features & NETIF_F_VLAN_CHALLENGED) {
-		slave_dbg(bond_dev, slave_dev, "is NETIF_F_VLAN_CHALLENGED\n");
+	if (slave_dev->priv_flags & IFF_VLAN_CHALLENGED) {
+		slave_dbg(bond_dev, slave_dev, "is IFF_VLAN_CHALLENGED\n");
 		if (vlan_uses_dev(bond_dev)) {
 			SLAVE_NL_ERR(bond_dev, slave_dev, extack,
 				     "Can not enslave VLAN challenged device to VLAN enabled bond");
@@ -1874,7 +1874,7 @@  int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
 			slave_warn(bond_dev, slave_dev, "enslaved VLAN challenged slave. Adding VLANs will be blocked as long as it is part of bond.\n");
 		}
 	} else {
-		slave_dbg(bond_dev, slave_dev, "is !NETIF_F_VLAN_CHALLENGED\n");
+		slave_dbg(bond_dev, slave_dev, "is !IFF_VLAN_CHALLENGED\n");
 	}
 
 	if (slave_dev->features & NETIF_F_HW_ESP)
@@ -2363,10 +2363,10 @@  static int __bond_release_one(struct net_device *bond_dev,
 			      bool all, bool unregister)
 {
 	struct bonding *bond = netdev_priv(bond_dev);
+	u64 old_priv_flags = bond_dev->priv_flags;
 	struct slave *slave, *oldcurrent;
 	struct sockaddr_storage ss;
 	int old_flags = bond_dev->flags;
-	netdev_features_t old_features = bond_dev->features;
 
 	/* slave is not a slave or master is not master of this slave */
 	if (!(slave_dev->flags & IFF_SLAVE) ||
@@ -2470,8 +2470,8 @@  static int __bond_release_one(struct net_device *bond_dev,
 	}
 
 	bond_compute_features(bond);
-	if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) &&
-	    (old_features & NETIF_F_VLAN_CHALLENGED))
+	if (!(bond_dev->priv_flags & IFF_VLAN_CHALLENGED) &&
+	    (old_priv_flags & IFF_VLAN_CHALLENGED))
 		slave_info(bond_dev, slave_dev, "last VLAN challenged slave left bond - VLAN blocking is removed\n");
 
 	vlan_vids_del_by_dev(slave_dev, bond_dev);
diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
index 9b068d40778d..6a57c0d5072d 100644
--- a/drivers/net/ethernet/intel/e100.c
+++ b/drivers/net/ethernet/intel/e100.c
@@ -2893,7 +2893,7 @@  static int e100_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	/* D100 MAC doesn't allow rx of vlan packets with normal MTU */
 	if (nic->mac < mac_82558_D101_A4)
-		netdev->features |= NETIF_F_VLAN_CHALLENGED;
+		netdev->priv_flags |= IFF_VLAN_CHALLENGED;
 
 	/* locks must be initialized before calling hw_reset */
 	spin_lock_init(&nic->cb_lock);
diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_net.c b/drivers/net/ethernet/toshiba/ps3_gelic_net.c
index 5ee8e8980393..3aa351b8f877 100644
--- a/drivers/net/ethernet/toshiba/ps3_gelic_net.c
+++ b/drivers/net/ethernet/toshiba/ps3_gelic_net.c
@@ -1499,7 +1499,7 @@  int gelic_net_setup_netdev(struct net_device *netdev, struct gelic_card *card)
 		 * As vlan is internally used,
 		 * we can not receive vlan packets
 		 */
-		netdev->features |= NETIF_F_VLAN_CHALLENGED;
+		netdev->priv_flags |= IFF_VLAN_CHALLENGED;
 	}
 
 	/* MTU range: 64 - 1518 */
@@ -1885,4 +1885,3 @@  module_init(ps3_gelic_driver_init);
 module_exit(ps3_gelic_driver_exit);
 
 MODULE_ALIAS(PS3_MODULE_ALIAS_GELIC);
-
diff --git a/drivers/net/ethernet/wiznet/w5100.c b/drivers/net/ethernet/wiznet/w5100.c
index b26fd15c25ae..a1c4f312387d 100644
--- a/drivers/net/ethernet/wiznet/w5100.c
+++ b/drivers/net/ethernet/wiznet/w5100.c
@@ -1136,7 +1136,7 @@  int w5100_probe(struct device *dev, const struct w5100_ops *ops,
 	/* This chip doesn't support VLAN packets with normal MTU,
 	 * so disable VLAN for this device.
 	 */
-	ndev->features |= NETIF_F_VLAN_CHALLENGED;
+	ndev->priv_flags |= IFF_VLAN_CHALLENGED;
 
 	err = register_netdev(ndev);
 	if (err < 0)
diff --git a/drivers/net/ethernet/wiznet/w5300.c b/drivers/net/ethernet/wiznet/w5300.c
index f165616f36fe..2a741d604eb1 100644
--- a/drivers/net/ethernet/wiznet/w5300.c
+++ b/drivers/net/ethernet/wiznet/w5300.c
@@ -607,7 +607,7 @@  static int w5300_probe(struct platform_device *pdev)
 	/* This chip doesn't support VLAN packets with normal MTU,
 	 * so disable VLAN for this device.
 	 */
-	ndev->features |= NETIF_F_VLAN_CHALLENGED;
+	ndev->priv_flags |= IFF_VLAN_CHALLENGED;
 
 	err = register_netdev(ndev);
 	if (err < 0)
diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c
index 09aa5c87e9c3..d6cec0a216ad 100644
--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
@@ -1408,7 +1408,6 @@  static int temac_probe(struct platform_device *pdev)
 	ndev->features |= NETIF_F_HW_VLAN_CTAG_TX; /* Transmit VLAN hw accel */
 	ndev->features |= NETIF_F_HW_VLAN_CTAG_RX; /* Receive VLAN hw acceleration */
 	ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; /* Receive VLAN filtering */
-	ndev->features |= NETIF_F_VLAN_CHALLENGED; /* cannot handle VLAN pkts */
 	ndev->features |= NETIF_F_GSO; /* Enable software GSO. */
 	ndev->features |= NETIF_F_MULTI_QUEUE; /* Has multiple TX/RX queues */
 	ndev->features |= NETIF_F_LRO; /* large receive offload */
diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c
index 62b4372dc205..98537ec29885 100644
--- a/drivers/net/ipvlan/ipvlan_main.c
+++ b/drivers/net/ipvlan/ipvlan_main.c
@@ -113,9 +113,6 @@  static void ipvlan_port_destroy(struct net_device *dev)
 	(NETIF_F_SG | NETIF_F_HW_CSUM | \
 	 NETIF_F_GSO_ROBUST | NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL)
 
-#define IPVLAN_ALWAYS_ON \
-	(IPVLAN_ALWAYS_ON_OFLOADS | NETIF_F_VLAN_CHALLENGED)
-
 #define IPVLAN_FEATURES \
 	(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST | \
 	 NETIF_F_GSO | NETIF_F_ALL_TSO | NETIF_F_GSO_ROBUST | \
@@ -137,11 +134,12 @@  static int ipvlan_init(struct net_device *dev)
 	dev->state = (dev->state & ~IPVLAN_STATE_MASK) |
 		     (phy_dev->state & IPVLAN_STATE_MASK);
 	dev->features = phy_dev->features & IPVLAN_FEATURES;
-	dev->features |= IPVLAN_ALWAYS_ON;
+	dev->features |= IPVLAN_ALWAYS_ON_OFLOADS;
 	dev->vlan_features = phy_dev->vlan_features & IPVLAN_FEATURES;
 	dev->vlan_features |= IPVLAN_ALWAYS_ON_OFLOADS;
 	dev->hw_enc_features |= dev->features;
 	dev->priv_flags |= IFF_LLTX | (phy_dev->priv_flags & IFF_HIGHDMA);
+	dev->priv_flags |= IFF_VLAN_CHALLENGED;
 	netif_inherit_tso_max(dev, phy_dev);
 	dev->hard_header_len = phy_dev->hard_header_len;
 
@@ -245,8 +243,8 @@  static netdev_features_t ipvlan_fix_features(struct net_device *dev,
 	features &= (ipvlan->sfeatures | ~IPVLAN_FEATURES);
 	features = netdev_increment_features(ipvlan->phy_dev->features,
 					     features, features);
-	features |= IPVLAN_ALWAYS_ON;
-	features &= (IPVLAN_FEATURES | IPVLAN_ALWAYS_ON);
+	features |= IPVLAN_ALWAYS_ON_OFLOADS;
+	features &= (IPVLAN_FEATURES | IPVLAN_ALWAYS_ON_OFLOADS);
 
 	return features;
 }
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
index a9ca447774ec..0a60bd1cc42a 100644
--- a/drivers/net/loopback.c
+++ b/drivers/net/loopback.c
@@ -176,6 +176,7 @@  static void gen_lo_setup(struct net_device *dev,
 	dev->flags		= IFF_LOOPBACK;
 	dev->priv_flags		|= IFF_LIVE_ADDR_CHANGE | IFF_LOGICAL;
 	dev->priv_flags		|= IFF_NETNS_LOCAL | IFF_HIGHDMA;
+	dev->priv_flags		|= IFF_VLAN_CHALLENGED;
 	netif_keep_dst(dev);
 	dev->hw_features	= NETIF_F_GSO_SOFTWARE;
 	dev->features		= NETIF_F_SG | NETIF_F_FRAGLIST
@@ -183,7 +184,6 @@  static void gen_lo_setup(struct net_device *dev,
 		| NETIF_F_HW_CSUM
 		| NETIF_F_RXCSUM
 		| NETIF_F_SCTP_CRC
-		| NETIF_F_VLAN_CHALLENGED
 		| NETIF_F_LOOPBACK;
 	dev->ethtool_ops	= eth_ops;
 	dev->header_ops		= hdr_ops;
diff --git a/drivers/net/net_failover.c b/drivers/net/net_failover.c
index 53e6e05939fa..0862f24651f6 100644
--- a/drivers/net/net_failover.c
+++ b/drivers/net/net_failover.c
@@ -487,7 +487,7 @@  static int net_failover_slave_pre_register(struct net_device *slave_dev,
 				  !dev_is_pci(slave_dev->dev.parent)))
 		return -EINVAL;
 
-	if (failover_dev->features & NETIF_F_VLAN_CHALLENGED &&
+	if (failover_dev->priv_flags & IFF_VLAN_CHALLENGED &&
 	    vlan_uses_dev(failover_dev)) {
 		netdev_err(failover_dev, "Device %s is VLAN challenged and failover device has VLAN set up\n",
 			   failover_dev->name);
diff --git a/drivers/net/team/team_core.c b/drivers/net/team/team_core.c
index 4393f94838c7..af39e8a9c91f 100644
--- a/drivers/net/team/team_core.c
+++ b/drivers/net/team/team_core.c
@@ -1172,7 +1172,7 @@  static int team_port_add(struct team *team, struct net_device *port_dev,
 		return -EBUSY;
 	}
 
-	if (port_dev->features & NETIF_F_VLAN_CHALLENGED &&
+	if (port_dev->priv_flags & IFF_VLAN_CHALLENGED &&
 	    vlan_uses_dev(dev)) {
 		NL_SET_ERR_MSG(extack, "Device is VLAN challenged and team device has VLAN set up");
 		netdev_err(dev, "Device %s is VLAN challenged and team device has VLAN set up\n",
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index 9f83061e3f86..0600600a8aa1 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -1655,9 +1655,6 @@  static void vrf_setup(struct net_device *dev)
 	/* Fill in device structure with ethernet-generic values. */
 	eth_hw_addr_random(dev);
 
-	/* does not make sense for a VLAN to be added to a vrf device */
-	dev->features   |= NETIF_F_VLAN_CHALLENGED;
-
 	/* enable offload features */
 	dev->features   |= NETIF_F_GSO_SOFTWARE;
 	dev->features   |= NETIF_F_RXCSUM | NETIF_F_HW_CSUM | NETIF_F_SCTP_CRC;
@@ -1670,6 +1667,8 @@  static void vrf_setup(struct net_device *dev)
 	dev->priv_flags |= IFF_NO_RX_HANDLER;
 	dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
 	dev->priv_flags |= IFF_HIGHDMA;
+	/* does not make sense for a VLAN to be added to a vrf device */
+	dev->priv_flags |= IFF_VLAN_CHALLENGED;
 
 	/* VRF devices do not care about MTU, but if the MTU is set
 	 * too low then the ipv4 and ipv6 protocols are disabled
diff --git a/drivers/net/wwan/t7xx/t7xx_netdev.c b/drivers/net/wwan/t7xx/t7xx_netdev.c
index 3ef4a8a4f8fd..4fec45a5ac47 100644
--- a/drivers/net/wwan/t7xx/t7xx_netdev.c
+++ b/drivers/net/wwan/t7xx/t7xx_netdev.c
@@ -231,8 +231,7 @@  static void t7xx_ccmni_wwan_setup(struct net_device *dev)
 	dev->watchdog_timeo = CCMNI_NETDEV_WDT_TO;
 
 	dev->flags = IFF_POINTOPOINT | IFF_NOARP;
-
-	dev->features = NETIF_F_VLAN_CHALLENGED;
+	dev->priv_flags |= IFF_VLAN_CHALLENGED;
 
 	dev->features |= NETIF_F_SG;
 	dev->hw_features |= NETIF_F_SG;
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 75910c0bcc2b..89c6e063fd6a 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -1093,7 +1093,7 @@  static int qeth_l2_setup_netdev(struct qeth_card *card)
 	card->dev->priv_flags |= IFF_UNICAST_FLT;
 
 	if (IS_OSM(card)) {
-		card->dev->features |= NETIF_F_VLAN_CHALLENGED;
+		card->dev->priv_flags |= IFF_VLAN_CHALLENGED;
 	} else {
 		if (!IS_VM_NIC(card))
 			card->dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index e45187b88220..a414b1b82673 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -131,7 +131,7 @@  int vlan_check_real_dev(struct net_device *real_dev,
 {
 	const char *name = real_dev->name;
 
-	if (real_dev->features & NETIF_F_VLAN_CHALLENGED) {
+	if (real_dev->priv_flags & IFF_VLAN_CHALLENGED) {
 		pr_info("VLANs not supported on %s\n", name);
 		NL_SET_ERR_MSG_MOD(extack, "VLANs not supported on device");
 		return -EOPNOTSUPP;
diff --git a/net/core/dev.c b/net/core/dev.c
index 2e20db77d5d6..df56e9f25018 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -11484,7 +11484,6 @@  netdev_features_t netdev_increment_features(netdev_features_t all,
 {
 	if (mask & NETIF_F_HW_CSUM)
 		mask |= NETIF_F_CSUM_MASK;
-	mask |= NETIF_F_VLAN_CHALLENGED;
 
 	all |= one & (NETIF_F_ONE_FOR_ALL | NETIF_F_CSUM_MASK) & mask;
 	all &= one | ~NETIF_F_ALL_FOR_ALL;
@@ -11499,6 +11498,8 @@  EXPORT_SYMBOL(netdev_increment_features);
 
 u64 netdev_increment_priv_flags(u64 all, u64 one, u64 mask)
 {
+	mask |= IFF_VLAN_CHALLENGED;
+
 	all |= one & IFF_ONE_FOR_ALL & mask;
 	all &= one | ~IFF_ALL_FOR_ALL;
 
diff --git a/net/ethtool/common.c b/net/ethtool/common.c
index 64c736e897e9..2de4dd5a30de 100644
--- a/net/ethtool/common.c
+++ b/net/ethtool/common.c
@@ -21,7 +21,6 @@  const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
 	[NETIF_F_HW_VLAN_STAG_TX_BIT] =  "tx-vlan-stag-hw-insert",
 	[NETIF_F_HW_VLAN_STAG_RX_BIT] =  "rx-vlan-stag-hw-parse",
 	[NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
-	[NETIF_F_VLAN_CHALLENGED_BIT] =  "vlan-challenged",
 	[NETIF_F_GSO_BIT] =              "tx-generic-segmentation",
 	[NETIF_F_GRO_BIT] =              "rx-gro",
 	[NETIF_F_GRO_HW_BIT] =           "rx-gro-hw",
diff --git a/net/ethtool/features.c b/net/ethtool/features.c
index b6cb101d7f19..652759407f00 100644
--- a/net/ethtool/features.c
+++ b/net/ethtool/features.c
@@ -44,7 +44,7 @@  static int features_prepare_data(const struct ethnl_req_info *req_base,
 	ethnl_features_to_bitmap32(data->hw, dev->hw_features);
 	ethnl_features_to_bitmap32(data->wanted, dev->wanted_features);
 	ethnl_features_to_bitmap32(data->active, dev->features);
-	ethnl_features_to_bitmap32(data->nochange, NETIF_F_NEVER_CHANGE);
+	ethnl_features_to_bitmap32(data->nochange, 0);
 	all_features = GENMASK_ULL(NETDEV_FEATURE_COUNT - 1, 0);
 	ethnl_features_to_bitmap32(data->all, all_features);
 
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 5a55270aa86e..2a20d7f70ffd 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -96,8 +96,7 @@  static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
 		features[i].available = (u32)(dev->hw_features >> (32 * i));
 		features[i].requested = (u32)(dev->wanted_features >> (32 * i));
 		features[i].active = (u32)(dev->features >> (32 * i));
-		features[i].never_changed =
-			(u32)(NETIF_F_NEVER_CHANGE >> (32 * i));
+		features[i].never_changed = 0;
 	}
 
 	sizeaddr = useraddr + offsetof(struct ethtool_gfeatures, size);
diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c
index be1df345b841..4561a087e75d 100644
--- a/net/hsr/hsr_device.c
+++ b/net/hsr/hsr_device.c
@@ -499,7 +499,10 @@  void hsr_dev_setup(struct net_device *dev)
 	dev->netdev_ops = &hsr_device_ops;
 	SET_NETDEV_DEVTYPE(dev, &hsr_type);
 	dev->priv_flags |= IFF_LOGICAL | IFF_DISABLE_NETPOLL | IFF_NETNS_LOCAL;
-	dev->priv_flags |= IFF_HIGHDMA;
+	/* VLAN on top of HSR needs testing and probably some work on
+	 * hsr_header_create() etc.
+	 */
+	dev->priv_flags |= IFF_HIGHDMA | IFF_VLAN_CHALLENGED;
 
 	dev->needs_free_netdev = true;
 
@@ -508,11 +511,6 @@  void hsr_dev_setup(struct net_device *dev)
 			   NETIF_F_HW_VLAN_CTAG_TX;
 
 	dev->features = dev->hw_features;
-
-	/* VLAN on top of HSR needs testing and probably some work on
-	 * hsr_header_create() etc.
-	 */
-	dev->features |= NETIF_F_VLAN_CHALLENGED;
 }
 
 /* Return true if dev is a HSR master; return false otherwise.