aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/mlx4
diff options
context:
space:
mode:
authorJiri Pirko <jpirko@redhat.com>2011-07-20 00:54:22 -0400
committerDavid S. Miller <davem@davemloft.net>2011-07-21 16:47:55 -0400
commitf1b553fbe73bfad38f41269d1c7a7ce3176d9539 (patch)
tree827da7588b9a8e9780f24787c2861f0e332319d3 /drivers/net/mlx4
parent5043f5057773ba8b539eb51b9a4007e99599824f (diff)
mlx4: do vlan cleanup
- unify vlan and nonvlan path - kill priv->vlgrp and mlx4_en_vlan_rx_register Signed-off-by: Jiri Pirko <jpirko@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/mlx4')
-rw-r--r--drivers/net/mlx4/en_netdev.c49
-rw-r--r--drivers/net/mlx4/en_port.c23
-rw-r--r--drivers/net/mlx4/en_rx.c24
-rw-r--r--drivers/net/mlx4/mlx4_en.h6
4 files changed, 37 insertions, 65 deletions
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c
index 61850adae6f7..9d3f57e76f2f 100644
--- a/drivers/net/mlx4/en_netdev.c
+++ b/drivers/net/mlx4/en_netdev.c
@@ -45,25 +45,6 @@
45#include "mlx4_en.h" 45#include "mlx4_en.h"
46#include "en_port.h" 46#include "en_port.h"
47 47
48
49static void mlx4_en_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
50{
51 struct mlx4_en_priv *priv = netdev_priv(dev);
52 struct mlx4_en_dev *mdev = priv->mdev;
53 int err;
54
55 en_dbg(HW, priv, "Registering VLAN group:%p\n", grp);
56 priv->vlgrp = grp;
57
58 mutex_lock(&mdev->state_lock);
59 if (mdev->device_up && priv->port_up) {
60 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, grp);
61 if (err)
62 en_err(priv, "Failed configuring VLAN filter\n");
63 }
64 mutex_unlock(&mdev->state_lock);
65}
66
67static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) 48static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
68{ 49{
69 struct mlx4_en_priv *priv = netdev_priv(dev); 50 struct mlx4_en_priv *priv = netdev_priv(dev);
@@ -71,16 +52,14 @@ static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
71 int err; 52 int err;
72 int idx; 53 int idx;
73 54
74 if (!priv->vlgrp) 55 en_dbg(HW, priv, "adding VLAN:%d\n", vid);
75 return;
76 56
77 en_dbg(HW, priv, "adding VLAN:%d (vlgrp entry:%p)\n", 57 set_bit(vid, priv->active_vlans);
78 vid, vlan_group_get_device(priv->vlgrp, vid));
79 58
80 /* Add VID to port VLAN filter */ 59 /* Add VID to port VLAN filter */
81 mutex_lock(&mdev->state_lock); 60 mutex_lock(&mdev->state_lock);
82 if (mdev->device_up && priv->port_up) { 61 if (mdev->device_up && priv->port_up) {
83 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp); 62 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
84 if (err) 63 if (err)
85 en_err(priv, "Failed configuring VLAN filter\n"); 64 en_err(priv, "Failed configuring VLAN filter\n");
86 } 65 }
@@ -97,12 +76,9 @@ static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
97 int err; 76 int err;
98 int idx; 77 int idx;
99 78
100 if (!priv->vlgrp) 79 en_dbg(HW, priv, "Killing VID:%d\n", vid);
101 return;
102 80
103 en_dbg(HW, priv, "Killing VID:%d (vlgrp:%p vlgrp entry:%p)\n", 81 clear_bit(vid, priv->active_vlans);
104 vid, priv->vlgrp, vlan_group_get_device(priv->vlgrp, vid));
105 vlan_group_set_device(priv->vlgrp, vid, NULL);
106 82
107 /* Remove VID from port VLAN filter */ 83 /* Remove VID from port VLAN filter */
108 mutex_lock(&mdev->state_lock); 84 mutex_lock(&mdev->state_lock);
@@ -112,7 +88,7 @@ static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
112 en_err(priv, "could not find vid %d in cache\n", vid); 88 en_err(priv, "could not find vid %d in cache\n", vid);
113 89
114 if (mdev->device_up && priv->port_up) { 90 if (mdev->device_up && priv->port_up) {
115 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp); 91 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
116 if (err) 92 if (err)
117 en_err(priv, "Failed configuring VLAN filter\n"); 93 en_err(priv, "Failed configuring VLAN filter\n");
118 } 94 }
@@ -265,12 +241,10 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
265 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; 241 priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
266 } 242 }
267 243
268 if (priv->vlgrp) { 244 /* Disable port VLAN filter */
269 /* Disable port VLAN filter */ 245 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
270 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, NULL); 246 if (err)
271 if (err) 247 en_err(priv, "Failed disabling VLAN filter\n");
272 en_err(priv, "Failed disabling VLAN filter\n");
273 }
274 } 248 }
275 goto out; 249 goto out;
276 } 250 }
@@ -304,7 +278,7 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
304 } 278 }
305 279
306 /* Enable port VLAN filter */ 280 /* Enable port VLAN filter */
307 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp); 281 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
308 if (err) 282 if (err)
309 en_err(priv, "Failed enabling VLAN filter\n"); 283 en_err(priv, "Failed enabling VLAN filter\n");
310 } 284 }
@@ -1046,7 +1020,6 @@ static const struct net_device_ops mlx4_netdev_ops = {
1046 .ndo_validate_addr = eth_validate_addr, 1020 .ndo_validate_addr = eth_validate_addr,
1047 .ndo_change_mtu = mlx4_en_change_mtu, 1021 .ndo_change_mtu = mlx4_en_change_mtu,
1048 .ndo_tx_timeout = mlx4_en_tx_timeout, 1022 .ndo_tx_timeout = mlx4_en_tx_timeout,
1049 .ndo_vlan_rx_register = mlx4_en_vlan_rx_register,
1050 .ndo_vlan_rx_add_vid = mlx4_en_vlan_rx_add_vid, 1023 .ndo_vlan_rx_add_vid = mlx4_en_vlan_rx_add_vid,
1051 .ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid, 1024 .ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid,
1052#ifdef CONFIG_NET_POLL_CONTROLLER 1025#ifdef CONFIG_NET_POLL_CONTROLLER
diff --git a/drivers/net/mlx4/en_port.c b/drivers/net/mlx4/en_port.c
index f2a4f5dd313d..2a74bc81b9f7 100644
--- a/drivers/net/mlx4/en_port.c
+++ b/drivers/net/mlx4/en_port.c
@@ -48,7 +48,7 @@ int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port,
48 MLX4_CMD_SET_MCAST_FLTR, MLX4_CMD_TIME_CLASS_B); 48 MLX4_CMD_SET_MCAST_FLTR, MLX4_CMD_TIME_CLASS_B);
49} 49}
50 50
51int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, u8 port, struct vlan_group *grp) 51int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv)
52{ 52{
53 struct mlx4_cmd_mailbox *mailbox; 53 struct mlx4_cmd_mailbox *mailbox;
54 struct mlx4_set_vlan_fltr_mbox *filter; 54 struct mlx4_set_vlan_fltr_mbox *filter;
@@ -63,20 +63,15 @@ int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, u8 port, struct vlan_group *grp)
63 return PTR_ERR(mailbox); 63 return PTR_ERR(mailbox);
64 64
65 filter = mailbox->buf; 65 filter = mailbox->buf;
66 if (grp) { 66 memset(filter, 0, sizeof(*filter));
67 memset(filter, 0, sizeof *filter); 67 for (i = VLAN_FLTR_SIZE - 1; i >= 0; i--) {
68 for (i = VLAN_FLTR_SIZE - 1; i >= 0; i--) { 68 entry = 0;
69 entry = 0; 69 for (j = 0; j < 32; j++)
70 for (j = 0; j < 32; j++) 70 if (test_bit(index++, priv->active_vlans))
71 if (vlan_group_get_device(grp, index++)) 71 entry |= 1 << j;
72 entry |= 1 << j; 72 filter->entry[i] = cpu_to_be32(entry);
73 filter->entry[i] = cpu_to_be32(entry);
74 }
75 } else {
76 /* When no vlans are configured we block all vlans */
77 memset(filter, 0, sizeof(*filter));
78 } 73 }
79 err = mlx4_cmd(dev, mailbox->dma, port, 0, MLX4_CMD_SET_VLAN_FLTR, 74 err = mlx4_cmd(dev, mailbox->dma, priv->port, 0, MLX4_CMD_SET_VLAN_FLTR,
80 MLX4_CMD_TIME_CLASS_B); 75 MLX4_CMD_TIME_CLASS_B);
81 mlx4_free_cmd_mailbox(dev, mailbox); 76 mlx4_free_cmd_mailbox(dev, mailbox);
82 return err; 77 return err;
diff --git a/drivers/net/mlx4/en_rx.c b/drivers/net/mlx4/en_rx.c
index 5197b50b2d81..37cc9e5c56be 100644
--- a/drivers/net/mlx4/en_rx.c
+++ b/drivers/net/mlx4/en_rx.c
@@ -611,11 +611,14 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
611 gro_skb->truesize += length; 611 gro_skb->truesize += length;
612 gro_skb->ip_summed = CHECKSUM_UNNECESSARY; 612 gro_skb->ip_summed = CHECKSUM_UNNECESSARY;
613 613
614 if (priv->vlgrp && (cqe->vlan_my_qpn & 614 if (cqe->vlan_my_qpn &
615 cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK))) 615 cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK)) {
616 vlan_gro_frags(&cq->napi, priv->vlgrp, be16_to_cpu(cqe->sl_vid)); 616 u16 vid = be16_to_cpu(cqe->sl_vid);
617 else 617
618 napi_gro_frags(&cq->napi); 618 __vlan_hwaccel_put_tag(gro_skb, vid);
619 }
620
621 napi_gro_frags(&cq->napi);
619 622
620 goto next; 623 goto next;
621 } 624 }
@@ -647,13 +650,12 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
647 skb->protocol = eth_type_trans(skb, dev); 650 skb->protocol = eth_type_trans(skb, dev);
648 skb_record_rx_queue(skb, cq->ring); 651 skb_record_rx_queue(skb, cq->ring);
649 652
653 if (be32_to_cpu(cqe->vlan_my_qpn) &
654 MLX4_CQE_VLAN_PRESENT_MASK)
655 __vlan_hwaccel_put_tag(skb, be16_to_cpu(cqe->sl_vid));
656
650 /* Push it up the stack */ 657 /* Push it up the stack */
651 if (priv->vlgrp && (be32_to_cpu(cqe->vlan_my_qpn) & 658 netif_receive_skb(skb);
652 MLX4_CQE_VLAN_PRESENT_MASK)) {
653 vlan_hwaccel_receive_skb(skb, priv->vlgrp,
654 be16_to_cpu(cqe->sl_vid));
655 } else
656 netif_receive_skb(skb);
657 659
658next: 660next:
659 ++cq->mcq.cons_index; 661 ++cq->mcq.cons_index;
diff --git a/drivers/net/mlx4/mlx4_en.h b/drivers/net/mlx4/mlx4_en.h
index 0b5150df0585..ed84811766e6 100644
--- a/drivers/net/mlx4/mlx4_en.h
+++ b/drivers/net/mlx4/mlx4_en.h
@@ -34,10 +34,12 @@
34#ifndef _MLX4_EN_H_ 34#ifndef _MLX4_EN_H_
35#define _MLX4_EN_H_ 35#define _MLX4_EN_H_
36 36
37#include <linux/bitops.h>
37#include <linux/compiler.h> 38#include <linux/compiler.h>
38#include <linux/list.h> 39#include <linux/list.h>
39#include <linux/mutex.h> 40#include <linux/mutex.h>
40#include <linux/netdevice.h> 41#include <linux/netdevice.h>
42#include <linux/if_vlan.h>
41 43
42#include <linux/mlx4/device.h> 44#include <linux/mlx4/device.h>
43#include <linux/mlx4/qp.h> 45#include <linux/mlx4/qp.h>
@@ -418,7 +420,7 @@ struct mlx4_en_priv {
418 struct mlx4_en_dev *mdev; 420 struct mlx4_en_dev *mdev;
419 struct mlx4_en_port_profile *prof; 421 struct mlx4_en_port_profile *prof;
420 struct net_device *dev; 422 struct net_device *dev;
421 struct vlan_group *vlgrp; 423 unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
422 struct net_device_stats stats; 424 struct net_device_stats stats;
423 struct net_device_stats ret_stats; 425 struct net_device_stats ret_stats;
424 struct mlx4_en_port_state port_state; 426 struct mlx4_en_port_state port_state;
@@ -553,7 +555,7 @@ int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring);
553void mlx4_en_rx_irq(struct mlx4_cq *mcq); 555void mlx4_en_rx_irq(struct mlx4_cq *mcq);
554 556
555int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mode); 557int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mode);
556int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, u8 port, struct vlan_group *grp); 558int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv);
557int mlx4_SET_PORT_general(struct mlx4_dev *dev, u8 port, int mtu, 559int mlx4_SET_PORT_general(struct mlx4_dev *dev, u8 port, int mtu,
558 u8 pptx, u8 pfctx, u8 pprx, u8 pfcrx); 560 u8 pptx, u8 pfctx, u8 pprx, u8 pfcrx);
559int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn, 561int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn,