aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorRony Efraim <ronye@mellanox.com>2013-04-25 01:22:29 -0400
committerDavid S. Miller <davem@davemloft.net>2013-04-26 23:29:14 -0400
commite6b6a2316379feebebacec0979b3ebc5743e7502 (patch)
tree2b9c6722ba3191afad8e7d3eb9c937202ed53cee /drivers/net
parent3f7fb021d081c8aaac1d0cf69a288d21625e872e (diff)
net/mlx4: Add VF MAC spoof checking support
Add ndo_set_vf_spoofchk support Signed-off-by: Rony Efraim <ronye@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c40
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c9
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/resource_tracker.c8
4 files changed, 59 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index aad6f8dbfb4c..eda347eeb5dc 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -1514,6 +1514,21 @@ static int mlx4_master_activate_admin_state(struct mlx4_priv *priv, int slave)
1514 (int)(vp_oper->state.default_vlan), 1514 (int)(vp_oper->state.default_vlan),
1515 vp_oper->vlan_idx, slave, port); 1515 vp_oper->vlan_idx, slave, port);
1516 } 1516 }
1517 if (vp_admin->spoofchk) {
1518 vp_oper->mac_idx = __mlx4_register_mac(&priv->dev,
1519 port,
1520 vp_admin->mac);
1521 if (0 > vp_oper->mac_idx) {
1522 err = vp_oper->mac_idx;
1523 vp_oper->mac_idx = NO_INDX;
1524 mlx4_warn((&priv->dev),
1525 "No mac resorces slave %d, port %d\n",
1526 slave, port);
1527 return err;
1528 }
1529 mlx4_dbg((&(priv->dev)), "alloc mac %llx idx %d slave %d port %d\n",
1530 vp_oper->state.mac, vp_oper->mac_idx, slave, port);
1531 }
1517 } 1532 }
1518 return 0; 1533 return 0;
1519} 1534}
@@ -1530,6 +1545,10 @@ static void mlx4_master_deactivate_admin_state(struct mlx4_priv *priv, int slave
1530 port, vp_oper->vlan_idx); 1545 port, vp_oper->vlan_idx);
1531 vp_oper->vlan_idx = NO_INDX; 1546 vp_oper->vlan_idx = NO_INDX;
1532 } 1547 }
1548 if (NO_INDX != vp_oper->mac_idx) {
1549 __mlx4_unregister_mac(&priv->dev, port, vp_oper->mac_idx);
1550 vp_oper->mac_idx = NO_INDX;
1551 }
1533 } 1552 }
1534 return; 1553 return;
1535} 1554}
@@ -2111,3 +2130,24 @@ int mlx4_set_vf_vlan(struct mlx4_dev *dev, int port, int vf, u16 vlan, u8 qos)
2111 return 0; 2130 return 0;
2112} 2131}
2113EXPORT_SYMBOL_GPL(mlx4_set_vf_vlan); 2132EXPORT_SYMBOL_GPL(mlx4_set_vf_vlan);
2133
2134int mlx4_set_vf_spoofchk(struct mlx4_dev *dev, int port, int vf, bool setting)
2135{
2136 struct mlx4_priv *priv = mlx4_priv(dev);
2137 struct mlx4_vport_state *s_info;
2138 int slave;
2139
2140 if ((!mlx4_is_master(dev)) ||
2141 !(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_FSM))
2142 return -EPROTONOSUPPORT;
2143
2144 slave = mlx4_get_slave_indx(dev, vf);
2145 if (slave < 0)
2146 return -EINVAL;
2147
2148 s_info = &priv->mfunc.master.vf_admin[slave].vport[port];
2149 s_info->spoofchk = setting;
2150
2151 return 0;
2152}
2153EXPORT_SYMBOL_GPL(mlx4_set_vf_spoofchk);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index c1f2c5b34d95..8d197b41242e 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -2044,6 +2044,14 @@ static int mlx4_en_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos)
2044 return mlx4_set_vf_vlan(mdev->dev, en_priv->port, vf, vlan, qos); 2044 return mlx4_set_vf_vlan(mdev->dev, en_priv->port, vf, vlan, qos);
2045} 2045}
2046 2046
2047static int mlx4_en_set_vf_spoofchk(struct net_device *dev, int vf, bool setting)
2048{
2049 struct mlx4_en_priv *en_priv = netdev_priv(dev);
2050 struct mlx4_en_dev *mdev = en_priv->mdev;
2051
2052 return mlx4_set_vf_spoofchk(mdev->dev, en_priv->port, vf, setting);
2053}
2054
2047 2055
2048static const struct net_device_ops mlx4_netdev_ops = { 2056static const struct net_device_ops mlx4_netdev_ops = {
2049 .ndo_open = mlx4_en_open, 2057 .ndo_open = mlx4_en_open,
@@ -2084,6 +2092,7 @@ static const struct net_device_ops mlx4_netdev_ops_master = {
2084 .ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid, 2092 .ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid,
2085 .ndo_set_vf_mac = mlx4_en_set_vf_mac, 2093 .ndo_set_vf_mac = mlx4_en_set_vf_mac,
2086 .ndo_set_vf_vlan = mlx4_en_set_vf_vlan, 2094 .ndo_set_vf_vlan = mlx4_en_set_vf_vlan,
2095 .ndo_set_vf_spoofchk = mlx4_en_set_vf_spoofchk,
2087#ifdef CONFIG_NET_POLL_CONTROLLER 2096#ifdef CONFIG_NET_POLL_CONTROLLER
2088 .ndo_poll_controller = mlx4_en_netpoll, 2097 .ndo_poll_controller = mlx4_en_netpoll,
2089#endif 2098#endif
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index d2d30c940790..b147bdd40768 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -659,6 +659,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
659 MLX4_GET(field32, outbox, QUERY_DEV_CAP_EXT_2_FLAGS_OFFSET); 659 MLX4_GET(field32, outbox, QUERY_DEV_CAP_EXT_2_FLAGS_OFFSET);
660 if (field32 & (1 << 26)) 660 if (field32 & (1 << 26))
661 dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_VLAN_CONTROL; 661 dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_VLAN_CONTROL;
662 if (field32 & (1 << 20))
663 dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_FSM;
662 664
663 if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) { 665 if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
664 for (i = 1; i <= dev_cap->num_ports; ++i) { 666 for (i = 1; i <= dev_cap->num_ports; ++i) {
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
index 5083d4babfe3..e12e0d2e0ee0 100644
--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
@@ -383,6 +383,14 @@ static int update_vport_qp_param(struct mlx4_dev *dev,
383 vp_oper->vlan_idx, (int)(qpc->pri_path.feup), 383 vp_oper->vlan_idx, (int)(qpc->pri_path.feup),
384 (int)(qpc->pri_path.fl)); 384 (int)(qpc->pri_path.fl));
385 } 385 }
386 if (vp_oper->state.spoofchk) {
387 qpc->pri_path.feup |= 1 << 5; /* set fsm bit */;
388 qpc->pri_path.grh_mylmc = (0x80 & qpc->pri_path.grh_mylmc) + vp_oper->mac_idx;
389 mlx4_dbg(dev, "spoof qp %d port %d feup 0x%x, myLmc 0x%x mindx %d\n",
390 be32_to_cpu(qpc->local_qpn) & 0xffffff, port,
391 (int)qpc->pri_path.feup, (int)qpc->pri_path.grh_mylmc,
392 vp_oper->mac_idx);
393 }
386 return 0; 394 return 0;
387} 395}
388 396