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);
        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;
 }
 
 }
 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)];
 
        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)
 
 };
 
 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 {
                               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);