diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-07-20 00:54:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-21 16:47:56 -0400 |
commit | 924917098e4bc3561a372a6eb36993e7c3bb02f2 (patch) | |
tree | b44872f6dfaa9c7a588dbc657b025351b868e674 | |
parent | a4f676b80f9ca2a76cb27b8378343a5f4f972d3f (diff) |
atl1: do vlan cleanup
- unify vlan and nonvlan rx path
- kill adapter->vlgrp and atlx_vlan_rx_register
- allow to turn on/off rx/tx vlan accel via ethtool (set_features)
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/atlx/atl1.c | 21 | ||||
-rw-r--r-- | drivers/net/atlx/atl1.h | 1 | ||||
-rw-r--r-- | drivers/net/atlx/atlx.c | 57 |
3 files changed, 51 insertions, 28 deletions
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index cd5789ff3726..6f0e9403004b 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
@@ -1285,8 +1285,7 @@ static void atl1_setup_mac_ctrl(struct atl1_adapter *adapter) | |||
1285 | value |= (((u32) adapter->hw.preamble_len | 1285 | value |= (((u32) adapter->hw.preamble_len |
1286 | & MAC_CTRL_PRMLEN_MASK) << MAC_CTRL_PRMLEN_SHIFT); | 1286 | & MAC_CTRL_PRMLEN_MASK) << MAC_CTRL_PRMLEN_SHIFT); |
1287 | /* vlan */ | 1287 | /* vlan */ |
1288 | if (adapter->vlgrp) | 1288 | __atlx_vlan_mode(netdev->features, &value); |
1289 | value |= MAC_CTRL_RMV_VLAN; | ||
1290 | /* rx checksum | 1289 | /* rx checksum |
1291 | if (adapter->rx_csum) | 1290 | if (adapter->rx_csum) |
1292 | value |= MAC_CTRL_RX_CHKSUM_EN; | 1291 | value |= MAC_CTRL_RX_CHKSUM_EN; |
@@ -2023,13 +2022,14 @@ rrd_ok: | |||
2023 | atl1_rx_checksum(adapter, rrd, skb); | 2022 | atl1_rx_checksum(adapter, rrd, skb); |
2024 | skb->protocol = eth_type_trans(skb, adapter->netdev); | 2023 | skb->protocol = eth_type_trans(skb, adapter->netdev); |
2025 | 2024 | ||
2026 | if (adapter->vlgrp && (rrd->pkt_flg & PACKET_FLAG_VLAN_INS)) { | 2025 | if (rrd->pkt_flg & PACKET_FLAG_VLAN_INS) { |
2027 | u16 vlan_tag = (rrd->vlan_tag >> 4) | | 2026 | u16 vlan_tag = (rrd->vlan_tag >> 4) | |
2028 | ((rrd->vlan_tag & 7) << 13) | | 2027 | ((rrd->vlan_tag & 7) << 13) | |
2029 | ((rrd->vlan_tag & 8) << 9); | 2028 | ((rrd->vlan_tag & 8) << 9); |
2030 | vlan_hwaccel_rx(skb, adapter->vlgrp, vlan_tag); | 2029 | |
2031 | } else | 2030 | __vlan_hwaccel_put_tag(skb, vlan_tag); |
2032 | netif_rx(skb); | 2031 | } |
2032 | netif_rx(skb); | ||
2033 | 2033 | ||
2034 | /* let protocol layer free skb */ | 2034 | /* let protocol layer free skb */ |
2035 | buffer_info->skb = NULL; | 2035 | buffer_info->skb = NULL; |
@@ -2783,8 +2783,7 @@ static int atl1_suspend(struct device *dev) | |||
2783 | ctrl |= MAC_CTRL_DUPLX; | 2783 | ctrl |= MAC_CTRL_DUPLX; |
2784 | ctrl |= (((u32)adapter->hw.preamble_len & | 2784 | ctrl |= (((u32)adapter->hw.preamble_len & |
2785 | MAC_CTRL_PRMLEN_MASK) << MAC_CTRL_PRMLEN_SHIFT); | 2785 | MAC_CTRL_PRMLEN_MASK) << MAC_CTRL_PRMLEN_SHIFT); |
2786 | if (adapter->vlgrp) | 2786 | __atlx_vlan_mode(netdev->features, &ctrl); |
2787 | ctrl |= MAC_CTRL_RMV_VLAN; | ||
2788 | if (wufc & ATLX_WUFC_MAG) | 2787 | if (wufc & ATLX_WUFC_MAG) |
2789 | ctrl |= MAC_CTRL_BC_EN; | 2788 | ctrl |= MAC_CTRL_BC_EN; |
2790 | iowrite32(ctrl, hw->hw_addr + REG_MAC_CTRL); | 2789 | iowrite32(ctrl, hw->hw_addr + REG_MAC_CTRL); |
@@ -2874,9 +2873,10 @@ static const struct net_device_ops atl1_netdev_ops = { | |||
2874 | .ndo_validate_addr = eth_validate_addr, | 2873 | .ndo_validate_addr = eth_validate_addr, |
2875 | .ndo_set_mac_address = atl1_set_mac, | 2874 | .ndo_set_mac_address = atl1_set_mac, |
2876 | .ndo_change_mtu = atl1_change_mtu, | 2875 | .ndo_change_mtu = atl1_change_mtu, |
2876 | .ndo_fix_features = atlx_fix_features, | ||
2877 | .ndo_set_features = atlx_set_features, | ||
2877 | .ndo_do_ioctl = atlx_ioctl, | 2878 | .ndo_do_ioctl = atlx_ioctl, |
2878 | .ndo_tx_timeout = atlx_tx_timeout, | 2879 | .ndo_tx_timeout = atlx_tx_timeout, |
2879 | .ndo_vlan_rx_register = atlx_vlan_rx_register, | ||
2880 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2880 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2881 | .ndo_poll_controller = atl1_poll_controller, | 2881 | .ndo_poll_controller = atl1_poll_controller, |
2882 | #endif | 2882 | #endif |
@@ -2984,7 +2984,8 @@ static int __devinit atl1_probe(struct pci_dev *pdev, | |||
2984 | netdev->features |= NETIF_F_SG; | 2984 | netdev->features |= NETIF_F_SG; |
2985 | netdev->features |= (NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX); | 2985 | netdev->features |= (NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX); |
2986 | 2986 | ||
2987 | netdev->hw_features = NETIF_F_HW_CSUM | NETIF_F_SG | NETIF_F_TSO; | 2987 | netdev->hw_features = NETIF_F_HW_CSUM | NETIF_F_SG | NETIF_F_TSO | |
2988 | NETIF_F_HW_VLAN_RX; | ||
2988 | 2989 | ||
2989 | /* is this valid? see atl1_setup_mac_ctrl() */ | 2990 | /* is this valid? see atl1_setup_mac_ctrl() */ |
2990 | netdev->features |= NETIF_F_RXCSUM; | 2991 | netdev->features |= NETIF_F_RXCSUM; |
diff --git a/drivers/net/atlx/atl1.h b/drivers/net/atlx/atl1.h index 68de8cbfb3ec..109d6da8be97 100644 --- a/drivers/net/atlx/atl1.h +++ b/drivers/net/atlx/atl1.h | |||
@@ -753,7 +753,6 @@ struct atl1_adapter { | |||
753 | struct pci_dev *pdev; | 753 | struct pci_dev *pdev; |
754 | 754 | ||
755 | struct atl1_sft_stats soft_stats; | 755 | struct atl1_sft_stats soft_stats; |
756 | struct vlan_group *vlgrp; | ||
757 | u32 rx_buffer_len; | 756 | u32 rx_buffer_len; |
758 | u32 wol; | 757 | u32 wol; |
759 | u16 link_speed; | 758 | u16 link_speed; |
diff --git a/drivers/net/atlx/atlx.c b/drivers/net/atlx/atlx.c index afb7f7dd1bb1..aabcf4b5745a 100644 --- a/drivers/net/atlx/atlx.c +++ b/drivers/net/atlx/atlx.c | |||
@@ -211,8 +211,18 @@ static void atlx_link_chg_task(struct work_struct *work) | |||
211 | spin_unlock_irqrestore(&adapter->lock, flags); | 211 | spin_unlock_irqrestore(&adapter->lock, flags); |
212 | } | 212 | } |
213 | 213 | ||
214 | static void atlx_vlan_rx_register(struct net_device *netdev, | 214 | static void __atlx_vlan_mode(u32 features, u32 *ctrl) |
215 | struct vlan_group *grp) | 215 | { |
216 | if (features & NETIF_F_HW_VLAN_RX) { | ||
217 | /* enable VLAN tag insert/strip */ | ||
218 | *ctrl |= MAC_CTRL_RMV_VLAN; | ||
219 | } else { | ||
220 | /* disable VLAN tag insert/strip */ | ||
221 | *ctrl &= ~MAC_CTRL_RMV_VLAN; | ||
222 | } | ||
223 | } | ||
224 | |||
225 | static void atlx_vlan_mode(struct net_device *netdev, u32 features) | ||
216 | { | 226 | { |
217 | struct atlx_adapter *adapter = netdev_priv(netdev); | 227 | struct atlx_adapter *adapter = netdev_priv(netdev); |
218 | unsigned long flags; | 228 | unsigned long flags; |
@@ -220,27 +230,40 @@ static void atlx_vlan_rx_register(struct net_device *netdev, | |||
220 | 230 | ||
221 | spin_lock_irqsave(&adapter->lock, flags); | 231 | spin_lock_irqsave(&adapter->lock, flags); |
222 | /* atlx_irq_disable(adapter); FIXME: confirm/remove */ | 232 | /* atlx_irq_disable(adapter); FIXME: confirm/remove */ |
223 | adapter->vlgrp = grp; | 233 | ctrl = ioread32(adapter->hw.hw_addr + REG_MAC_CTRL); |
224 | 234 | __atlx_vlan_mode(features, &ctrl); | |
225 | if (grp) { | 235 | iowrite32(ctrl, adapter->hw.hw_addr + REG_MAC_CTRL); |
226 | /* enable VLAN tag insert/strip */ | ||
227 | ctrl = ioread32(adapter->hw.hw_addr + REG_MAC_CTRL); | ||
228 | ctrl |= MAC_CTRL_RMV_VLAN; | ||
229 | iowrite32(ctrl, adapter->hw.hw_addr + REG_MAC_CTRL); | ||
230 | } else { | ||
231 | /* disable VLAN tag insert/strip */ | ||
232 | ctrl = ioread32(adapter->hw.hw_addr + REG_MAC_CTRL); | ||
233 | ctrl &= ~MAC_CTRL_RMV_VLAN; | ||
234 | iowrite32(ctrl, adapter->hw.hw_addr + REG_MAC_CTRL); | ||
235 | } | ||
236 | |||
237 | /* atlx_irq_enable(adapter); FIXME */ | 236 | /* atlx_irq_enable(adapter); FIXME */ |
238 | spin_unlock_irqrestore(&adapter->lock, flags); | 237 | spin_unlock_irqrestore(&adapter->lock, flags); |
239 | } | 238 | } |
240 | 239 | ||
241 | static void atlx_restore_vlan(struct atlx_adapter *adapter) | 240 | static void atlx_restore_vlan(struct atlx_adapter *adapter) |
242 | { | 241 | { |
243 | atlx_vlan_rx_register(adapter->netdev, adapter->vlgrp); | 242 | atlx_vlan_mode(adapter->netdev, adapter->netdev->features); |
243 | } | ||
244 | |||
245 | static u32 atlx_fix_features(struct net_device *netdev, u32 features) | ||
246 | { | ||
247 | /* | ||
248 | * Since there is no support for separate rx/tx vlan accel | ||
249 | * enable/disable make sure tx flag is always in same state as rx. | ||
250 | */ | ||
251 | if (features & NETIF_F_HW_VLAN_RX) | ||
252 | features |= NETIF_F_HW_VLAN_TX; | ||
253 | else | ||
254 | features &= ~NETIF_F_HW_VLAN_TX; | ||
255 | |||
256 | return features; | ||
257 | } | ||
258 | |||
259 | static int atlx_set_features(struct net_device *netdev, u32 features) | ||
260 | { | ||
261 | u32 changed = netdev->features ^ features; | ||
262 | |||
263 | if (changed & NETIF_F_HW_VLAN_RX) | ||
264 | atlx_vlan_mode(netdev, features); | ||
265 | |||
266 | return 0; | ||
244 | } | 267 | } |
245 | 268 | ||
246 | #endif /* ATLX_C */ | 269 | #endif /* ATLX_C */ |