diff options
author | Gal Pressman <galp@mellanox.com> | 2016-06-23 10:02:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-06-27 04:10:41 -0400 |
commit | 667daedaecd15b89d0ded7af49519f28d6ea2cf4 (patch) | |
tree | a3d9e5cecbd2145bb5be79bcca4cfb3189ce2abe | |
parent | cb3c7fd4f8393e0c42cbb13367b60454ae4e05f7 (diff) |
net/mlx5e: Toggle link only after modifying port parameters
Add a dedicated function to toggle port link. It should be called only
after setting a port register.
Toggle will set port link to down and bring it back up in case that it's
admin status was up.
Signed-off-by: Gal Pressman <galp@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/port.c | 12 | ||||
-rw-r--r-- | include/linux/mlx5/port.h | 1 |
4 files changed, 15 insertions, 14 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c index b2db180ae2a5..e6883132b555 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | |||
@@ -191,7 +191,6 @@ static int mlx5e_dcbnl_ieee_setpfc(struct net_device *dev, | |||
191 | { | 191 | { |
192 | struct mlx5e_priv *priv = netdev_priv(dev); | 192 | struct mlx5e_priv *priv = netdev_priv(dev); |
193 | struct mlx5_core_dev *mdev = priv->mdev; | 193 | struct mlx5_core_dev *mdev = priv->mdev; |
194 | enum mlx5_port_status ps; | ||
195 | u8 curr_pfc_en; | 194 | u8 curr_pfc_en; |
196 | int ret; | 195 | int ret; |
197 | 196 | ||
@@ -200,14 +199,8 @@ static int mlx5e_dcbnl_ieee_setpfc(struct net_device *dev, | |||
200 | if (pfc->pfc_en == curr_pfc_en) | 199 | if (pfc->pfc_en == curr_pfc_en) |
201 | return 0; | 200 | return 0; |
202 | 201 | ||
203 | mlx5_query_port_admin_status(mdev, &ps); | ||
204 | if (ps == MLX5_PORT_UP) | ||
205 | mlx5_set_port_admin_status(mdev, MLX5_PORT_DOWN); | ||
206 | |||
207 | ret = mlx5_set_port_pfc(mdev, pfc->pfc_en, pfc->pfc_en); | 202 | ret = mlx5_set_port_pfc(mdev, pfc->pfc_en, pfc->pfc_en); |
208 | 203 | mlx5_toggle_port_link(mdev); | |
209 | if (ps == MLX5_PORT_UP) | ||
210 | mlx5_set_port_admin_status(mdev, MLX5_PORT_UP); | ||
211 | 204 | ||
212 | return ret; | 205 | return ret; |
213 | } | 206 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c index c4be3941957e..d0d3dcfb4de9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | |||
@@ -795,7 +795,6 @@ static int mlx5e_set_settings(struct net_device *netdev, | |||
795 | u32 link_modes; | 795 | u32 link_modes; |
796 | u32 speed; | 796 | u32 speed; |
797 | u32 eth_proto_cap, eth_proto_admin; | 797 | u32 eth_proto_cap, eth_proto_admin; |
798 | enum mlx5_port_status ps; | ||
799 | int err; | 798 | int err; |
800 | 799 | ||
801 | speed = ethtool_cmd_speed(cmd); | 800 | speed = ethtool_cmd_speed(cmd); |
@@ -829,12 +828,8 @@ static int mlx5e_set_settings(struct net_device *netdev, | |||
829 | if (link_modes == eth_proto_admin) | 828 | if (link_modes == eth_proto_admin) |
830 | goto out; | 829 | goto out; |
831 | 830 | ||
832 | mlx5_query_port_admin_status(mdev, &ps); | ||
833 | if (ps == MLX5_PORT_UP) | ||
834 | mlx5_set_port_admin_status(mdev, MLX5_PORT_DOWN); | ||
835 | mlx5_set_port_proto(mdev, link_modes, MLX5_PTYS_EN); | 831 | mlx5_set_port_proto(mdev, link_modes, MLX5_PTYS_EN); |
836 | if (ps == MLX5_PORT_UP) | 832 | mlx5_toggle_port_link(mdev); |
837 | mlx5_set_port_admin_status(mdev, MLX5_PORT_UP); | ||
838 | 833 | ||
839 | out: | 834 | out: |
840 | return err; | 835 | return err; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/port.c b/drivers/net/ethernet/mellanox/mlx5/core/port.c index 3e35611b19c3..1562e7310f5b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/port.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/port.c | |||
@@ -222,6 +222,18 @@ int mlx5_set_port_proto(struct mlx5_core_dev *dev, u32 proto_admin, | |||
222 | } | 222 | } |
223 | EXPORT_SYMBOL_GPL(mlx5_set_port_proto); | 223 | EXPORT_SYMBOL_GPL(mlx5_set_port_proto); |
224 | 224 | ||
225 | /* This function should be used after setting a port register only */ | ||
226 | void mlx5_toggle_port_link(struct mlx5_core_dev *dev) | ||
227 | { | ||
228 | enum mlx5_port_status ps; | ||
229 | |||
230 | mlx5_query_port_admin_status(dev, &ps); | ||
231 | mlx5_set_port_admin_status(dev, MLX5_PORT_DOWN); | ||
232 | if (ps == MLX5_PORT_UP) | ||
233 | mlx5_set_port_admin_status(dev, MLX5_PORT_UP); | ||
234 | } | ||
235 | EXPORT_SYMBOL_GPL(mlx5_toggle_port_link); | ||
236 | |||
225 | int mlx5_set_port_admin_status(struct mlx5_core_dev *dev, | 237 | int mlx5_set_port_admin_status(struct mlx5_core_dev *dev, |
226 | enum mlx5_port_status status) | 238 | enum mlx5_port_status status) |
227 | { | 239 | { |
diff --git a/include/linux/mlx5/port.h b/include/linux/mlx5/port.h index 9851862c0ec5..4adfac15f0e9 100644 --- a/include/linux/mlx5/port.h +++ b/include/linux/mlx5/port.h | |||
@@ -67,6 +67,7 @@ int mlx5_query_port_proto_oper(struct mlx5_core_dev *dev, | |||
67 | u8 local_port); | 67 | u8 local_port); |
68 | int mlx5_set_port_proto(struct mlx5_core_dev *dev, u32 proto_admin, | 68 | int mlx5_set_port_proto(struct mlx5_core_dev *dev, u32 proto_admin, |
69 | int proto_mask); | 69 | int proto_mask); |
70 | void mlx5_toggle_port_link(struct mlx5_core_dev *dev); | ||
70 | int mlx5_set_port_admin_status(struct mlx5_core_dev *dev, | 71 | int mlx5_set_port_admin_status(struct mlx5_core_dev *dev, |
71 | enum mlx5_port_status status); | 72 | enum mlx5_port_status status); |
72 | int mlx5_query_port_admin_status(struct mlx5_core_dev *dev, | 73 | int mlx5_query_port_admin_status(struct mlx5_core_dev *dev, |