aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRony Efraim <ronye@mellanox.com>2013-04-25 01:22:27 -0400
committerDavid S. Miller <davem@davemloft.net>2013-04-26 23:29:13 -0400
commit8f7ba3ca12f6f16526fa4a8aaf2cae91563eee69 (patch)
tree4bf50f09e298b484003cd545b9ffa5d656915a98
parent0eb62b93cbe0e8dea4cfe5ee761755e982663727 (diff)
net/mlx4: Add set VF mac address support
Add ndo_set_vf_mac support which allows to set the MAC address for mlx4 VF Ethernet NICs from the host. 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>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c31
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c42
-rw-r--r--include/linux/mlx4/cmd.h1
3 files changed, 73 insertions, 1 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index 0a301e1a0635..a029124fe2f8 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -2016,3 +2016,34 @@ u32 mlx4_comm_get_version(void)
2016{ 2016{
2017 return ((u32) CMD_CHAN_IF_REV << 8) | (u32) CMD_CHAN_VER; 2017 return ((u32) CMD_CHAN_IF_REV << 8) | (u32) CMD_CHAN_VER;
2018} 2018}
2019
2020static int mlx4_get_slave_indx(struct mlx4_dev *dev, int vf)
2021{
2022 if ((vf < 0) || (vf >= dev->num_vfs)) {
2023 mlx4_err(dev, "Bad vf number:%d (number of activated vf: %d)\n", vf, dev->num_vfs);
2024 return -EINVAL;
2025 }
2026
2027 return vf+1;
2028}
2029
2030int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac)
2031{
2032 struct mlx4_priv *priv = mlx4_priv(dev);
2033 struct mlx4_vport_state *s_info;
2034 int slave;
2035
2036 if (!mlx4_is_master(dev))
2037 return -EPROTONOSUPPORT;
2038
2039 slave = mlx4_get_slave_indx(dev, vf);
2040 if (slave < 0)
2041 return -EINVAL;
2042
2043 s_info = &priv->mfunc.master.vf_admin[slave].vport[port];
2044 s_info->mac = mac;
2045 mlx4_info(dev, "default mac on vf %d port %d to %llX will take afect only after vf restart\n",
2046 vf, port, s_info->mac);
2047 return 0;
2048}
2049EXPORT_SYMBOL_GPL(mlx4_set_vf_mac);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 05c7c13bdbde..8293a92bf151 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -2024,6 +2024,19 @@ static int mlx4_en_set_features(struct net_device *netdev,
2024 2024
2025} 2025}
2026 2026
2027static int mlx4_en_set_vf_mac(struct net_device *dev, int queue, u8 *mac)
2028{
2029 struct mlx4_en_priv *en_priv = netdev_priv(dev);
2030 struct mlx4_en_dev *mdev = en_priv->mdev;
2031 u64 mac_u64 = mlx4_en_mac_to_u64(mac);
2032
2033 if (!is_valid_ether_addr(mac))
2034 return -EINVAL;
2035
2036 return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac_u64);
2037}
2038
2039
2027static const struct net_device_ops mlx4_netdev_ops = { 2040static const struct net_device_ops mlx4_netdev_ops = {
2028 .ndo_open = mlx4_en_open, 2041 .ndo_open = mlx4_en_open,
2029 .ndo_stop = mlx4_en_close, 2042 .ndo_stop = mlx4_en_close,
@@ -2048,6 +2061,30 @@ static const struct net_device_ops mlx4_netdev_ops = {
2048#endif 2061#endif
2049}; 2062};
2050 2063
2064static const struct net_device_ops mlx4_netdev_ops_master = {
2065 .ndo_open = mlx4_en_open,
2066 .ndo_stop = mlx4_en_close,
2067 .ndo_start_xmit = mlx4_en_xmit,
2068 .ndo_select_queue = mlx4_en_select_queue,
2069 .ndo_get_stats = mlx4_en_get_stats,
2070 .ndo_set_rx_mode = mlx4_en_set_rx_mode,
2071 .ndo_set_mac_address = mlx4_en_set_mac,
2072 .ndo_validate_addr = eth_validate_addr,
2073 .ndo_change_mtu = mlx4_en_change_mtu,
2074 .ndo_tx_timeout = mlx4_en_tx_timeout,
2075 .ndo_vlan_rx_add_vid = mlx4_en_vlan_rx_add_vid,
2076 .ndo_vlan_rx_kill_vid = mlx4_en_vlan_rx_kill_vid,
2077 .ndo_set_vf_mac = mlx4_en_set_vf_mac,
2078#ifdef CONFIG_NET_POLL_CONTROLLER
2079 .ndo_poll_controller = mlx4_en_netpoll,
2080#endif
2081 .ndo_set_features = mlx4_en_set_features,
2082 .ndo_setup_tc = mlx4_en_setup_tc,
2083#ifdef CONFIG_RFS_ACCEL
2084 .ndo_rx_flow_steer = mlx4_en_filter_rfs,
2085#endif
2086};
2087
2051int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, 2088int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
2052 struct mlx4_en_port_profile *prof) 2089 struct mlx4_en_port_profile *prof)
2053{ 2090{
@@ -2164,7 +2201,10 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
2164 /* 2201 /*
2165 * Initialize netdev entry points 2202 * Initialize netdev entry points
2166 */ 2203 */
2167 dev->netdev_ops = &mlx4_netdev_ops; 2204 if (mlx4_is_master(priv->mdev->dev))
2205 dev->netdev_ops = &mlx4_netdev_ops_master;
2206 else
2207 dev->netdev_ops = &mlx4_netdev_ops;
2168 dev->watchdog_timeo = MLX4_EN_WATCHDOG_TIMEOUT; 2208 dev->watchdog_timeo = MLX4_EN_WATCHDOG_TIMEOUT;
2169 netif_set_real_num_tx_queues(dev, priv->tx_ring_num); 2209 netif_set_real_num_tx_queues(dev, priv->tx_ring_num);
2170 netif_set_real_num_rx_queues(dev, priv->rx_ring_num); 2210 netif_set_real_num_rx_queues(dev, priv->rx_ring_num);
diff --git a/include/linux/mlx4/cmd.h b/include/linux/mlx4/cmd.h
index 260695186256..f21ddc6203bd 100644
--- a/include/linux/mlx4/cmd.h
+++ b/include/linux/mlx4/cmd.h
@@ -232,6 +232,7 @@ struct mlx4_cmd_mailbox *mlx4_alloc_cmd_mailbox(struct mlx4_dev *dev);
232void mlx4_free_cmd_mailbox(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox); 232void mlx4_free_cmd_mailbox(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox);
233 233
234u32 mlx4_comm_get_version(void); 234u32 mlx4_comm_get_version(void);
235int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac);
235 236
236#define MLX4_COMM_GET_IF_REV(cmd_chan_ver) (u8)((cmd_chan_ver) >> 8) 237#define MLX4_COMM_GET_IF_REV(cmd_chan_ver) (u8)((cmd_chan_ver) >> 8)
237 238