diff options
author | Rony Efraim <ronye@mellanox.com> | 2013-04-25 01:22:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-26 23:29:14 -0400 |
commit | e6b6a2316379feebebacec0979b3ebc5743e7502 (patch) | |
tree | 2b9c6722ba3191afad8e7d3eb9c937202ed53cee /drivers/net | |
parent | 3f7fb021d081c8aaac1d0cf69a288d21625e872e (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.c | 40 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/fw.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 8 |
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 | } |
2113 | EXPORT_SYMBOL_GPL(mlx4_set_vf_vlan); | 2132 | EXPORT_SYMBOL_GPL(mlx4_set_vf_vlan); |
2133 | |||
2134 | int 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 | } | ||
2153 | EXPORT_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 | ||
2047 | static 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 | ||
2048 | static const struct net_device_ops mlx4_netdev_ops = { | 2056 | static 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 | ||