net: wangxun: match VLAN CTAG and STAG features
BugLink: https://bugs.launchpad.net/bugs/2071621
[ Upstream commit ac71ab7816b675f1c9614015bd87bfccb456c394 ]
Hardware requires VLAN CTAG and STAG configuration always matches. And
whether VLAN CTAG or STAG changes, the configuration needs to be changed
as well.
Fixes: 6670f1ece2 ("net: txgbe: Add netdev features support")
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Sai Krishna <saikrishnag@marvell.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Manuel Diewald <manuel.diewald@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
@@ -2705,6 +2705,52 @@ int wx_set_features(struct net_device *netdev, netdev_features_t features)
|
||||
}
|
||||
EXPORT_SYMBOL(wx_set_features);
|
||||
|
||||
#define NETIF_VLAN_STRIPPING_FEATURES (NETIF_F_HW_VLAN_CTAG_RX | \
|
||||
NETIF_F_HW_VLAN_STAG_RX)
|
||||
|
||||
#define NETIF_VLAN_INSERTION_FEATURES (NETIF_F_HW_VLAN_CTAG_TX | \
|
||||
NETIF_F_HW_VLAN_STAG_TX)
|
||||
|
||||
#define NETIF_VLAN_FILTERING_FEATURES (NETIF_F_HW_VLAN_CTAG_FILTER | \
|
||||
NETIF_F_HW_VLAN_STAG_FILTER)
|
||||
|
||||
netdev_features_t wx_fix_features(struct net_device *netdev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
netdev_features_t changed = netdev->features ^ features;
|
||||
struct wx *wx = netdev_priv(netdev);
|
||||
|
||||
if (changed & NETIF_VLAN_STRIPPING_FEATURES) {
|
||||
if ((features & NETIF_VLAN_STRIPPING_FEATURES) != NETIF_VLAN_STRIPPING_FEATURES &&
|
||||
(features & NETIF_VLAN_STRIPPING_FEATURES) != 0) {
|
||||
features &= ~NETIF_VLAN_STRIPPING_FEATURES;
|
||||
features |= netdev->features & NETIF_VLAN_STRIPPING_FEATURES;
|
||||
wx_err(wx, "802.1Q and 802.1ad VLAN stripping must be either both on or both off.");
|
||||
}
|
||||
}
|
||||
|
||||
if (changed & NETIF_VLAN_INSERTION_FEATURES) {
|
||||
if ((features & NETIF_VLAN_INSERTION_FEATURES) != NETIF_VLAN_INSERTION_FEATURES &&
|
||||
(features & NETIF_VLAN_INSERTION_FEATURES) != 0) {
|
||||
features &= ~NETIF_VLAN_INSERTION_FEATURES;
|
||||
features |= netdev->features & NETIF_VLAN_INSERTION_FEATURES;
|
||||
wx_err(wx, "802.1Q and 802.1ad VLAN insertion must be either both on or both off.");
|
||||
}
|
||||
}
|
||||
|
||||
if (changed & NETIF_VLAN_FILTERING_FEATURES) {
|
||||
if ((features & NETIF_VLAN_FILTERING_FEATURES) != NETIF_VLAN_FILTERING_FEATURES &&
|
||||
(features & NETIF_VLAN_FILTERING_FEATURES) != 0) {
|
||||
features &= ~NETIF_VLAN_FILTERING_FEATURES;
|
||||
features |= netdev->features & NETIF_VLAN_FILTERING_FEATURES;
|
||||
wx_err(wx, "802.1Q and 802.1ad VLAN filtering must be either both on or both off.");
|
||||
}
|
||||
}
|
||||
|
||||
return features;
|
||||
}
|
||||
EXPORT_SYMBOL(wx_fix_features);
|
||||
|
||||
void wx_set_ring(struct wx *wx, u32 new_tx_count,
|
||||
u32 new_rx_count, struct wx_ring *temp_ring)
|
||||
{
|
||||
|
||||
@@ -30,6 +30,8 @@ int wx_setup_resources(struct wx *wx);
|
||||
void wx_get_stats64(struct net_device *netdev,
|
||||
struct rtnl_link_stats64 *stats);
|
||||
int wx_set_features(struct net_device *netdev, netdev_features_t features);
|
||||
netdev_features_t wx_fix_features(struct net_device *netdev,
|
||||
netdev_features_t features);
|
||||
void wx_set_ring(struct wx *wx, u32 new_tx_count,
|
||||
u32 new_rx_count, struct wx_ring *temp_ring);
|
||||
|
||||
|
||||
@@ -499,6 +499,7 @@ static const struct net_device_ops ngbe_netdev_ops = {
|
||||
.ndo_start_xmit = wx_xmit_frame,
|
||||
.ndo_set_rx_mode = wx_set_rx_mode,
|
||||
.ndo_set_features = wx_set_features,
|
||||
.ndo_fix_features = wx_fix_features,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = wx_set_mac,
|
||||
.ndo_get_stats64 = wx_get_stats64,
|
||||
|
||||
@@ -550,6 +550,7 @@ static const struct net_device_ops txgbe_netdev_ops = {
|
||||
.ndo_start_xmit = wx_xmit_frame,
|
||||
.ndo_set_rx_mode = wx_set_rx_mode,
|
||||
.ndo_set_features = wx_set_features,
|
||||
.ndo_fix_features = wx_fix_features,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = wx_set_mac,
|
||||
.ndo_get_stats64 = wx_get_stats64,
|
||||
|
||||
Reference in New Issue
Block a user