[Acked] [PATCH Wily SRU] net/mlx5e: Ethtool link speed setting fixes
Andy Whitcroft
apw at canonical.com
Fri Nov 20 15:37:28 UTC 2015
On Thu, Nov 19, 2015 at 02:09:42PM -0700, tim.gardner at canonical.com wrote:
> From: Achiad Shochat <achiad at mellanox.com>
>
> BugLink: http://bugs.launchpad.net/bugs/1517919
>
> - Port speed settings are applied by the device only upon
> port admin status transition from DOWN to UP.
> So we enforce this transition regardless of the port's
> current operation state (which may be occasionally DOWN if
> for example the network cable is disconnected).
> - Fix the PORT_UP/DOWN device interface enum
> - Set the local_port bit in the device PAOS register
> - EXPORT the PAOS (Port Administrative and Operational Status)
> register set/query access functions.
>
> Signed-off-by: Achiad Shochat <achiad at mellanox.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit 6fa1bcab6be6e9bd93f80e345c7e9a4ec7861df9)
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
> .../net/ethernet/mellanox/mlx5/core/en_ethtool.c | 25 ++++++----------------
> drivers/net/ethernet/mellanox/mlx5/core/port.c | 14 ++++++++----
> include/linux/mlx5/driver.h | 11 +++++-----
> 3 files changed, 23 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
> index 14fd82c..2dcacfd 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
> @@ -606,7 +606,7 @@ static int mlx5e_set_settings(struct net_device *netdev,
> u32 link_modes;
> u32 speed;
> u32 eth_proto_cap, eth_proto_admin;
> - u8 port_status;
> + enum mlx5_port_status ps;
> int err;
>
> speed = ethtool_cmd_speed(cmd);
> @@ -640,24 +640,13 @@ static int mlx5e_set_settings(struct net_device *netdev,
> if (link_modes == eth_proto_admin)
> goto out;
>
> - err = mlx5_set_port_proto(mdev, link_modes, MLX5_PTYS_EN);
> - if (err) {
> - netdev_err(netdev, "%s: set port eth proto admin failed: %d\n",
> - __func__, err);
> - goto out;
> - }
> + mlx5_query_port_admin_status(mdev, &ps);
> + if (ps == MLX5_PORT_UP)
> + mlx5_set_port_admin_status(mdev, MLX5_PORT_DOWN);
> + mlx5_set_port_proto(mdev, link_modes, MLX5_PTYS_EN);
> + if (ps == MLX5_PORT_UP)
> + mlx5_set_port_admin_status(mdev, MLX5_PORT_UP);
>
> - err = mlx5_query_port_status(mdev, &port_status);
> - if (err)
> - goto out;
> -
> - if (port_status == MLX5_PORT_DOWN)
> - return 0;
> -
> - err = mlx5_set_port_status(mdev, MLX5_PORT_DOWN);
> - if (err)
> - goto out;
> - err = mlx5_set_port_status(mdev, MLX5_PORT_UP);
> out:
> return err;
> }
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/port.c b/drivers/net/ethernet/mellanox/mlx5/core/port.c
> index 7014799..f8db52b 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/port.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/port.c
> @@ -216,22 +216,25 @@ int mlx5_set_port_proto(struct mlx5_core_dev *dev, u32 proto_admin,
> }
> EXPORT_SYMBOL_GPL(mlx5_set_port_proto);
>
> -int mlx5_set_port_status(struct mlx5_core_dev *dev,
> - enum mlx5_port_status status)
> +int mlx5_set_port_admin_status(struct mlx5_core_dev *dev,
> + enum mlx5_port_status status)
> {
> u32 in[MLX5_ST_SZ_DW(paos_reg)];
> u32 out[MLX5_ST_SZ_DW(paos_reg)];
>
> memset(in, 0, sizeof(in));
>
> + MLX5_SET(paos_reg, in, local_port, 1);
> MLX5_SET(paos_reg, in, admin_status, status);
> MLX5_SET(paos_reg, in, ase, 1);
>
> return mlx5_core_access_reg(dev, in, sizeof(in), out,
> sizeof(out), MLX5_REG_PAOS, 0, 1);
> }
> +EXPORT_SYMBOL_GPL(mlx5_set_port_admin_status);
>
> -int mlx5_query_port_status(struct mlx5_core_dev *dev, u8 *status)
> +int mlx5_query_port_admin_status(struct mlx5_core_dev *dev,
> + enum mlx5_port_status *status)
> {
> u32 in[MLX5_ST_SZ_DW(paos_reg)];
> u32 out[MLX5_ST_SZ_DW(paos_reg)];
> @@ -239,14 +242,17 @@ int mlx5_query_port_status(struct mlx5_core_dev *dev, u8 *status)
>
> memset(in, 0, sizeof(in));
>
> + MLX5_SET(paos_reg, in, local_port, 1);
> +
> err = mlx5_core_access_reg(dev, in, sizeof(in), out,
> sizeof(out), MLX5_REG_PAOS, 0, 0);
> if (err)
> return err;
>
> - *status = MLX5_GET(paos_reg, out, oper_status);
> + *status = MLX5_GET(paos_reg, out, admin_status);
> return err;
> }
> +EXPORT_SYMBOL_GPL(mlx5_query_port_admin_status);
>
> static void mlx5_query_port_mtu(struct mlx5_core_dev *dev, int *admin_mtu,
> int *max_mtu, int *oper_mtu, u8 port)
> diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
> index 5fe0cae..da2e71c 100644
> --- a/include/linux/mlx5/driver.h
> +++ b/include/linux/mlx5/driver.h
> @@ -151,8 +151,8 @@ enum mlx5_dev_event {
> };
>
> enum mlx5_port_status {
> - MLX5_PORT_UP = 1 << 1,
> - MLX5_PORT_DOWN = 1 << 2,
> + MLX5_PORT_UP = 1,
> + MLX5_PORT_DOWN = 2,
> };
>
> struct mlx5_uuar_info {
> @@ -760,9 +760,10 @@ int mlx5_query_port_proto_oper(struct mlx5_core_dev *dev,
> u8 local_port);
> int mlx5_set_port_proto(struct mlx5_core_dev *dev, u32 proto_admin,
> int proto_mask);
> -int mlx5_set_port_status(struct mlx5_core_dev *dev,
> - enum mlx5_port_status status);
> -int mlx5_query_port_status(struct mlx5_core_dev *dev, u8 *status);
> +int mlx5_set_port_admin_status(struct mlx5_core_dev *dev,
> + enum mlx5_port_status status);
> +int mlx5_query_port_admin_status(struct mlx5_core_dev *dev,
> + enum mlx5_port_status *status);
>
> int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port);
> void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu, u8 port);
Looks to do what is claimed. Clean cherry-pick.
Acked-by: Andy Whitcroft <apw at canonical.com>
-apw
More information about the kernel-team
mailing list