Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[pandora-kernel.git] / drivers / net / mlx4 / en_netdev.c
index 61850ad..4b0f32e 100644 (file)
 #include "mlx4_en.h"
 #include "en_port.h"
 
-
-static void mlx4_en_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
-{
-       struct mlx4_en_priv *priv = netdev_priv(dev);
-       struct mlx4_en_dev *mdev = priv->mdev;
-       int err;
-
-       en_dbg(HW, priv, "Registering VLAN group:%p\n", grp);
-       priv->vlgrp = grp;
-
-       mutex_lock(&mdev->state_lock);
-       if (mdev->device_up && priv->port_up) {
-               err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, grp);
-               if (err)
-                       en_err(priv, "Failed configuring VLAN filter\n");
-       }
-       mutex_unlock(&mdev->state_lock);
-}
-
 static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
 {
        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)
        int err;
        int idx;
 
-       if (!priv->vlgrp)
-               return;
+       en_dbg(HW, priv, "adding VLAN:%d\n", vid);
 
-       en_dbg(HW, priv, "adding VLAN:%d (vlgrp entry:%p)\n",
-              vid, vlan_group_get_device(priv->vlgrp, vid));
+       set_bit(vid, priv->active_vlans);
 
        /* Add VID to port VLAN filter */
        mutex_lock(&mdev->state_lock);
        if (mdev->device_up && priv->port_up) {
-               err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
+               err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
                if (err)
                        en_err(priv, "Failed configuring VLAN filter\n");
        }
@@ -97,12 +76,9 @@ static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
        int err;
        int idx;
 
-       if (!priv->vlgrp)
-               return;
+       en_dbg(HW, priv, "Killing VID:%d\n", vid);
 
-       en_dbg(HW, priv, "Killing VID:%d (vlgrp:%p vlgrp entry:%p)\n",
-              vid, priv->vlgrp, vlan_group_get_device(priv->vlgrp, vid));
-       vlan_group_set_device(priv->vlgrp, vid, NULL);
+       clear_bit(vid, priv->active_vlans);
 
        /* Remove VID from port VLAN filter */
        mutex_lock(&mdev->state_lock);
@@ -112,7 +88,7 @@ static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
                en_err(priv, "could not find vid %d in cache\n", vid);
 
        if (mdev->device_up && priv->port_up) {
-               err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
+               err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
                if (err)
                        en_err(priv, "Failed configuring VLAN filter\n");
        }
@@ -239,7 +215,8 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
                        priv->flags |= MLX4_EN_FLAG_PROMISC;
 
                        /* Enable promiscouos mode */
-                       if (!mdev->dev->caps.vep_uc_steering)
+                       if (!(mdev->dev->caps.flags &
+                                               MLX4_DEV_CAP_FLAG_VEP_UC_STEER))
                                err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port,
                                                             priv->base_qpn, 1);
                        else
@@ -265,12 +242,10 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
                                priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
                        }
 
-                       if (priv->vlgrp) {
-                               /* Disable port VLAN filter */
-                               err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, NULL);
-                               if (err)
-                                       en_err(priv, "Failed disabling VLAN filter\n");
-                       }
+                       /* Disable port VLAN filter */
+                       err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
+                       if (err)
+                               en_err(priv, "Failed disabling VLAN filter\n");
                }
                goto out;
        }
@@ -285,7 +260,7 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
                priv->flags &= ~MLX4_EN_FLAG_PROMISC;
 
                /* Disable promiscouos mode */
-               if (!mdev->dev->caps.vep_uc_steering)
+               if (!(mdev->dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_UC_STEER))
                        err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port,
                                                     priv->base_qpn, 0);
                else
@@ -304,7 +279,7 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
                }
 
                /* Enable port VLAN filter */
-               err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, priv->vlgrp);
+               err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
                if (err)
                        en_err(priv, "Failed enabling VLAN filter\n");
        }
@@ -1046,7 +1021,6 @@ static const struct net_device_ops mlx4_netdev_ops = {
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_change_mtu         = mlx4_en_change_mtu,
        .ndo_tx_timeout         = mlx4_en_tx_timeout,
-       .ndo_vlan_rx_register   = mlx4_en_vlan_rx_register,
        .ndo_vlan_rx_add_vid    = mlx4_en_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = mlx4_en_vlan_rx_kill_vid,
 #ifdef CONFIG_NET_POLL_CONTROLLER