Commit f1b553fb authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

mlx4: do vlan cleanup

- unify vlan and nonvlan path
- kill priv->vlgrp and mlx4_en_vlan_rx_register
Signed-off-by: default avatarJiri Pirko <jpirko@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5043f505
...@@ -45,25 +45,6 @@ ...@@ -45,25 +45,6 @@
#include "mlx4_en.h" #include "mlx4_en.h"
#include "en_port.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) static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct mlx4_en_priv *priv = netdev_priv(dev); 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,16 +52,14 @@ static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
int err; int err;
int idx; int idx;
if (!priv->vlgrp) en_dbg(HW, priv, "adding VLAN:%d\n", vid);
return;
en_dbg(HW, priv, "adding VLAN:%d (vlgrp entry:%p)\n", set_bit(vid, priv->active_vlans);
vid, vlan_group_get_device(priv->vlgrp, vid));
/* Add VID to port VLAN filter */ /* Add VID to port VLAN filter */
mutex_lock(&mdev->state_lock); mutex_lock(&mdev->state_lock);
if (mdev->device_up && priv->port_up) { 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) if (err)
en_err(priv, "Failed configuring VLAN filter\n"); 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) ...@@ -97,12 +76,9 @@ static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
int err; int err;
int idx; int idx;
if (!priv->vlgrp) en_dbg(HW, priv, "Killing VID:%d\n", vid);
return;
en_dbg(HW, priv, "Killing VID:%d (vlgrp:%p vlgrp entry:%p)\n", clear_bit(vid, priv->active_vlans);
vid, priv->vlgrp, vlan_group_get_device(priv->vlgrp, vid));
vlan_group_set_device(priv->vlgrp, vid, NULL);
/* Remove VID from port VLAN filter */ /* Remove VID from port VLAN filter */
mutex_lock(&mdev->state_lock); 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,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); en_err(priv, "could not find vid %d in cache\n", vid);
if (mdev->device_up && priv->port_up) { 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) if (err)
en_err(priv, "Failed configuring VLAN filter\n"); en_err(priv, "Failed configuring VLAN filter\n");
} }
...@@ -265,13 +241,11 @@ static void mlx4_en_do_set_multicast(struct work_struct *work) ...@@ -265,13 +241,11 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
priv->flags |= MLX4_EN_FLAG_MC_PROMISC; priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
} }
if (priv->vlgrp) {
/* Disable port VLAN filter */ /* Disable port VLAN filter */
err = mlx4_SET_VLAN_FLTR(mdev->dev, priv->port, NULL); err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
if (err) if (err)
en_err(priv, "Failed disabling VLAN filter\n"); en_err(priv, "Failed disabling VLAN filter\n");
} }
}
goto out; goto out;
} }
...@@ -304,7 +278,7 @@ static void mlx4_en_do_set_multicast(struct work_struct *work) ...@@ -304,7 +278,7 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
} }
/* Enable port VLAN filter */ /* 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) if (err)
en_err(priv, "Failed enabling VLAN filter\n"); en_err(priv, "Failed enabling VLAN filter\n");
} }
...@@ -1046,7 +1020,6 @@ static const struct net_device_ops mlx4_netdev_ops = { ...@@ -1046,7 +1020,6 @@ static const struct net_device_ops mlx4_netdev_ops = {
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_change_mtu = mlx4_en_change_mtu, .ndo_change_mtu = mlx4_en_change_mtu,
.ndo_tx_timeout = mlx4_en_tx_timeout, .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_add_vid = mlx4_en_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid, .ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid,
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
......
...@@ -48,7 +48,7 @@ int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, ...@@ -48,7 +48,7 @@ int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port,
MLX4_CMD_SET_MCAST_FLTR, MLX4_CMD_TIME_CLASS_B); MLX4_CMD_SET_MCAST_FLTR, MLX4_CMD_TIME_CLASS_B);
} }
int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, u8 port, struct vlan_group *grp) int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv)
{ {
struct mlx4_cmd_mailbox *mailbox; struct mlx4_cmd_mailbox *mailbox;
struct mlx4_set_vlan_fltr_mbox *filter; 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,20 +63,15 @@ int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, u8 port, struct vlan_group *grp)
return PTR_ERR(mailbox); return PTR_ERR(mailbox);
filter = mailbox->buf; filter = mailbox->buf;
if (grp) { memset(filter, 0, sizeof(*filter));
memset(filter, 0, sizeof *filter);
for (i = VLAN_FLTR_SIZE - 1; i >= 0; i--) { for (i = VLAN_FLTR_SIZE - 1; i >= 0; i--) {
entry = 0; entry = 0;
for (j = 0; j < 32; j++) for (j = 0; j < 32; j++)
if (vlan_group_get_device(grp, index++)) if (test_bit(index++, priv->active_vlans))
entry |= 1 << j; entry |= 1 << j;
filter->entry[i] = cpu_to_be32(entry); filter->entry[i] = cpu_to_be32(entry);
} }
} else { err = mlx4_cmd(dev, mailbox->dma, priv->port, 0, MLX4_CMD_SET_VLAN_FLTR,
/* When no vlans are configured we block all vlans */
memset(filter, 0, sizeof(*filter));
}
err = mlx4_cmd(dev, mailbox->dma, port, 0, MLX4_CMD_SET_VLAN_FLTR,
MLX4_CMD_TIME_CLASS_B); MLX4_CMD_TIME_CLASS_B);
mlx4_free_cmd_mailbox(dev, mailbox); mlx4_free_cmd_mailbox(dev, mailbox);
return err; return err;
......
...@@ -611,10 +611,13 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud ...@@ -611,10 +611,13 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
gro_skb->truesize += length; gro_skb->truesize += length;
gro_skb->ip_summed = CHECKSUM_UNNECESSARY; gro_skb->ip_summed = CHECKSUM_UNNECESSARY;
if (priv->vlgrp && (cqe->vlan_my_qpn & if (cqe->vlan_my_qpn &
cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK))) cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK)) {
vlan_gro_frags(&cq->napi, priv->vlgrp, be16_to_cpu(cqe->sl_vid)); u16 vid = be16_to_cpu(cqe->sl_vid);
else
__vlan_hwaccel_put_tag(gro_skb, vid);
}
napi_gro_frags(&cq->napi); napi_gro_frags(&cq->napi);
goto next; goto next;
...@@ -647,12 +650,11 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud ...@@ -647,12 +650,11 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
skb_record_rx_queue(skb, cq->ring); skb_record_rx_queue(skb, cq->ring);
if (be32_to_cpu(cqe->vlan_my_qpn) &
MLX4_CQE_VLAN_PRESENT_MASK)
__vlan_hwaccel_put_tag(skb, be16_to_cpu(cqe->sl_vid));
/* Push it up the stack */ /* Push it up the stack */
if (priv->vlgrp && (be32_to_cpu(cqe->vlan_my_qpn) &
MLX4_CQE_VLAN_PRESENT_MASK)) {
vlan_hwaccel_receive_skb(skb, priv->vlgrp,
be16_to_cpu(cqe->sl_vid));
} else
netif_receive_skb(skb); netif_receive_skb(skb);
next: next:
......
...@@ -34,10 +34,12 @@ ...@@ -34,10 +34,12 @@
#ifndef _MLX4_EN_H_ #ifndef _MLX4_EN_H_
#define _MLX4_EN_H_ #define _MLX4_EN_H_
#include <linux/bitops.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/if_vlan.h>
#include <linux/mlx4/device.h> #include <linux/mlx4/device.h>
#include <linux/mlx4/qp.h> #include <linux/mlx4/qp.h>
...@@ -418,7 +420,7 @@ struct mlx4_en_priv { ...@@ -418,7 +420,7 @@ struct mlx4_en_priv {
struct mlx4_en_dev *mdev; struct mlx4_en_dev *mdev;
struct mlx4_en_port_profile *prof; struct mlx4_en_port_profile *prof;
struct net_device *dev; struct net_device *dev;
struct vlan_group *vlgrp; unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
struct net_device_stats stats; struct net_device_stats stats;
struct net_device_stats ret_stats; struct net_device_stats ret_stats;
struct mlx4_en_port_state port_state; 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); ...@@ -553,7 +555,7 @@ int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring);
void mlx4_en_rx_irq(struct mlx4_cq *mcq); void mlx4_en_rx_irq(struct mlx4_cq *mcq);
int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mode); int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mode);
int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, u8 port, struct vlan_group *grp); int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv);
int mlx4_SET_PORT_general(struct mlx4_dev *dev, u8 port, int mtu, int mlx4_SET_PORT_general(struct mlx4_dev *dev, u8 port, int mtu,
u8 pptx, u8 pfctx, u8 pprx, u8 pfcrx); u8 pptx, u8 pfctx, u8 pprx, u8 pfcrx);
int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn, int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn,
......
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