Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f2feca2 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'vlan_offloads'



Vlad Yasevich says:

====================
Audit all drivers for correct vlan_features.

Some drivers set vlan acceleration features in vlan_features.  This causes
issues with Q-in-Q/802.1ad configurations.

Audit all the drivers for correct vlan_features.  Fix broken ones.
Add a warning to vlan code to help catch future offenders.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents fc92f745 2adb956b
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -4765,7 +4765,9 @@ static int qlge_probe(struct pci_dev *pdev,
	ndev->features = ndev->hw_features;
	ndev->features = ndev->hw_features;
	ndev->vlan_features = ndev->hw_features;
	ndev->vlan_features = ndev->hw_features;
	/* vlan gets same features (except vlan filter) */
	/* vlan gets same features (except vlan filter) */
	ndev->vlan_features &= ~NETIF_F_HW_VLAN_CTAG_FILTER;
	ndev->vlan_features &= ~(NETIF_F_HW_VLAN_CTAG_FILTER |
				 NETIF_F_HW_VLAN_CTAG_TX |
				 NETIF_F_HW_VLAN_CTAG_RX);


	if (test_bit(QL_DMA64, &qdev->flags))
	if (test_bit(QL_DMA64, &qdev->flags))
		ndev->features |= NETIF_F_HIGHDMA;
		ndev->features |= NETIF_F_HIGHDMA;
+2 −1
Original line number Original line Diff line number Diff line
@@ -180,7 +180,8 @@ static void ifb_setup(struct net_device *dev)
	dev->tx_queue_len = TX_Q_LIMIT;
	dev->tx_queue_len = TX_Q_LIMIT;


	dev->features |= IFB_FEATURES;
	dev->features |= IFB_FEATURES;
	dev->vlan_features |= IFB_FEATURES;
	dev->vlan_features |= IFB_FEATURES & ~(NETIF_F_HW_VLAN_CTAG_TX |
					       NETIF_F_HW_VLAN_STAG_TX);


	dev->flags |= IFF_NOARP;
	dev->flags |= IFF_NOARP;
	dev->flags &= ~IFF_MULTICAST;
	dev->flags &= ~IFF_MULTICAST;
+4 −1
Original line number Original line Diff line number Diff line
@@ -286,7 +286,10 @@ static void veth_setup(struct net_device *dev)
	dev->features |= NETIF_F_LLTX;
	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_STAG_TX);
			     ~(NETIF_F_HW_VLAN_CTAG_TX |
			       NETIF_F_HW_VLAN_STAG_TX |
			       NETIF_F_HW_VLAN_CTAG_RX |
			       NETIF_F_HW_VLAN_STAG_RX);
	dev->destructor = veth_dev_free;
	dev->destructor = veth_dev_free;


	dev->hw_features = VETH_FEATURES;
	dev->hw_features = VETH_FEATURES;
+7 −0
Original line number Original line Diff line number Diff line
@@ -163,4 +163,11 @@ enum {
/* changeable features with no special hardware requirements */
/* changeable features with no special hardware requirements */
#define NETIF_F_SOFT_FEATURES	(NETIF_F_GSO | NETIF_F_GRO)
#define NETIF_F_SOFT_FEATURES	(NETIF_F_GSO | NETIF_F_GRO)


#define NETIF_F_VLAN_FEATURES	(NETIF_F_HW_VLAN_CTAG_FILTER | \
				 NETIF_F_HW_VLAN_CTAG_RX | \
				 NETIF_F_HW_VLAN_CTAG_TX | \
				 NETIF_F_HW_VLAN_STAG_FILTER | \
				 NETIF_F_HW_VLAN_STAG_RX | \
				 NETIF_F_HW_VLAN_STAG_TX)

#endif	/* _LINUX_NETDEV_FEATURES_H */
#endif	/* _LINUX_NETDEV_FEATURES_H */
+3 −0
Original line number Original line Diff line number Diff line
@@ -578,6 +578,9 @@ static int vlan_dev_init(struct net_device *dev)


	dev->features |= real_dev->vlan_features | NETIF_F_LLTX;
	dev->features |= real_dev->vlan_features | NETIF_F_LLTX;
	dev->gso_max_size = real_dev->gso_max_size;
	dev->gso_max_size = real_dev->gso_max_size;
	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");



	/* ipv6 shared card related stuff */
	/* ipv6 shared card related stuff */
	dev->dev_id = real_dev->dev_id;
	dev->dev_id = real_dev->dev_id;