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

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
...@@ -4765,7 +4765,9 @@ static int qlge_probe(struct pci_dev *pdev, ...@@ -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;
......
...@@ -180,7 +180,8 @@ static void ifb_setup(struct net_device *dev) ...@@ -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;
......
...@@ -286,7 +286,10 @@ static void veth_setup(struct net_device *dev) ...@@ -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;
......
...@@ -163,4 +163,11 @@ enum { ...@@ -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 */
...@@ -578,6 +578,9 @@ static int vlan_dev_init(struct net_device *dev) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment