Commit ac71ab78 authored by Jiawen Wu's avatar Jiawen Wu Committed by David S. Miller

net: wangxun: match VLAN CTAG and STAG features

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: 6670f1ec ("net: txgbe: Add netdev features support")
Signed-off-by: default avatarJiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: default avatarSai Krishna <saikrishnag@marvell.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 68067f06
...@@ -2701,6 +2701,52 @@ int wx_set_features(struct net_device *netdev, netdev_features_t features) ...@@ -2701,6 +2701,52 @@ int wx_set_features(struct net_device *netdev, netdev_features_t features)
} }
EXPORT_SYMBOL(wx_set_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, void wx_set_ring(struct wx *wx, u32 new_tx_count,
u32 new_rx_count, struct wx_ring *temp_ring) u32 new_rx_count, struct wx_ring *temp_ring)
{ {
......
...@@ -30,6 +30,8 @@ int wx_setup_resources(struct wx *wx); ...@@ -30,6 +30,8 @@ int wx_setup_resources(struct wx *wx);
void wx_get_stats64(struct net_device *netdev, void wx_get_stats64(struct net_device *netdev,
struct rtnl_link_stats64 *stats); struct rtnl_link_stats64 *stats);
int wx_set_features(struct net_device *netdev, netdev_features_t features); 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, void wx_set_ring(struct wx *wx, u32 new_tx_count,
u32 new_rx_count, struct wx_ring *temp_ring); u32 new_rx_count, struct wx_ring *temp_ring);
......
...@@ -499,6 +499,7 @@ static const struct net_device_ops ngbe_netdev_ops = { ...@@ -499,6 +499,7 @@ static const struct net_device_ops ngbe_netdev_ops = {
.ndo_start_xmit = wx_xmit_frame, .ndo_start_xmit = wx_xmit_frame,
.ndo_set_rx_mode = wx_set_rx_mode, .ndo_set_rx_mode = wx_set_rx_mode,
.ndo_set_features = wx_set_features, .ndo_set_features = wx_set_features,
.ndo_fix_features = wx_fix_features,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = wx_set_mac, .ndo_set_mac_address = wx_set_mac,
.ndo_get_stats64 = wx_get_stats64, .ndo_get_stats64 = wx_get_stats64,
......
...@@ -428,6 +428,7 @@ static const struct net_device_ops txgbe_netdev_ops = { ...@@ -428,6 +428,7 @@ static const struct net_device_ops txgbe_netdev_ops = {
.ndo_start_xmit = wx_xmit_frame, .ndo_start_xmit = wx_xmit_frame,
.ndo_set_rx_mode = wx_set_rx_mode, .ndo_set_rx_mode = wx_set_rx_mode,
.ndo_set_features = wx_set_features, .ndo_set_features = wx_set_features,
.ndo_fix_features = wx_fix_features,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = wx_set_mac, .ndo_set_mac_address = wx_set_mac,
.ndo_get_stats64 = wx_get_stats64, .ndo_get_stats64 = wx_get_stats64,
......
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