Commit b2facd95 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

mlx4: Implement port type setting via devlink interface

So far, there has been an mlx4-specific sysfs file allowing user to
change port type to either Ethernet of InfiniBand. This is very
inconvenient.

Allow to expose the same ability to set port type in a generic way
using devlink interface.
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 09d4d087
...@@ -1082,36 +1082,20 @@ static ssize_t show_port_type(struct device *dev, ...@@ -1082,36 +1082,20 @@ static ssize_t show_port_type(struct device *dev,
return strlen(buf); return strlen(buf);
} }
static ssize_t set_port_type(struct device *dev, static int __set_port_type(struct mlx4_port_info *info,
struct device_attribute *attr, enum mlx4_port_type port_type)
const char *buf, size_t count)
{ {
struct mlx4_port_info *info = container_of(attr, struct mlx4_port_info,
port_attr);
struct mlx4_dev *mdev = info->dev; struct mlx4_dev *mdev = info->dev;
struct mlx4_priv *priv = mlx4_priv(mdev); struct mlx4_priv *priv = mlx4_priv(mdev);
enum mlx4_port_type types[MLX4_MAX_PORTS]; enum mlx4_port_type types[MLX4_MAX_PORTS];
enum mlx4_port_type new_types[MLX4_MAX_PORTS]; enum mlx4_port_type new_types[MLX4_MAX_PORTS];
static DEFINE_MUTEX(set_port_type_mutex);
int i; int i;
int err = 0; int err = 0;
mutex_lock(&set_port_type_mutex);
if (!strcmp(buf, "ib\n"))
info->tmp_type = MLX4_PORT_TYPE_IB;
else if (!strcmp(buf, "eth\n"))
info->tmp_type = MLX4_PORT_TYPE_ETH;
else if (!strcmp(buf, "auto\n"))
info->tmp_type = MLX4_PORT_TYPE_AUTO;
else {
mlx4_err(mdev, "%s is not supported port type\n", buf);
err = -EINVAL;
goto err_out;
}
mlx4_stop_sense(mdev); mlx4_stop_sense(mdev);
mutex_lock(&priv->port_mutex); mutex_lock(&priv->port_mutex);
info->tmp_type = port_type;
/* Possible type is always the one that was delivered */ /* Possible type is always the one that was delivered */
mdev->caps.possible_type[info->port] = info->tmp_type; mdev->caps.possible_type[info->port] = info->tmp_type;
...@@ -1153,6 +1137,37 @@ static ssize_t set_port_type(struct device *dev, ...@@ -1153,6 +1137,37 @@ static ssize_t set_port_type(struct device *dev,
out: out:
mlx4_start_sense(mdev); mlx4_start_sense(mdev);
mutex_unlock(&priv->port_mutex); mutex_unlock(&priv->port_mutex);
return err;
}
static ssize_t set_port_type(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct mlx4_port_info *info = container_of(attr, struct mlx4_port_info,
port_attr);
struct mlx4_dev *mdev = info->dev;
enum mlx4_port_type port_type;
static DEFINE_MUTEX(set_port_type_mutex);
int err;
mutex_lock(&set_port_type_mutex);
if (!strcmp(buf, "ib\n")) {
port_type = MLX4_PORT_TYPE_IB;
} else if (!strcmp(buf, "eth\n")) {
port_type = MLX4_PORT_TYPE_ETH;
} else if (!strcmp(buf, "auto\n")) {
port_type = MLX4_PORT_TYPE_AUTO;
} else {
mlx4_err(mdev, "%s is not supported port type\n", buf);
err = -EINVAL;
goto err_out;
}
err = __set_port_type(info, port_type);
err_out: err_out:
mutex_unlock(&set_port_type_mutex); mutex_unlock(&set_port_type_mutex);
...@@ -3685,6 +3700,35 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data, ...@@ -3685,6 +3700,35 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
return err; return err;
} }
static int mlx4_devlink_port_type_set(struct devlink_port *devlink_port,
enum devlink_port_type port_type)
{
struct mlx4_port_info *info = container_of(devlink_port,
struct mlx4_port_info,
devlink_port);
enum mlx4_port_type mlx4_port_type;
switch (port_type) {
case DEVLINK_PORT_TYPE_AUTO:
mlx4_port_type = MLX4_PORT_TYPE_AUTO;
break;
case DEVLINK_PORT_TYPE_ETH:
mlx4_port_type = MLX4_PORT_TYPE_ETH;
break;
case DEVLINK_PORT_TYPE_IB:
mlx4_port_type = MLX4_PORT_TYPE_IB;
break;
default:
return -EOPNOTSUPP;
}
return __set_port_type(info, mlx4_port_type);
}
static const struct devlink_ops mlx4_devlink_ops = {
.port_type_set = mlx4_devlink_port_type_set,
};
static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
{ {
struct devlink *devlink; struct devlink *devlink;
...@@ -3694,7 +3738,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -3694,7 +3738,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
printk_once(KERN_INFO "%s", mlx4_version); printk_once(KERN_INFO "%s", mlx4_version);
devlink = devlink_alloc(NULL, sizeof(*priv)); devlink = devlink_alloc(&mlx4_devlink_ops, sizeof(*priv));
if (!devlink) if (!devlink)
return -ENOMEM; return -ENOMEM;
priv = devlink_priv(devlink); priv = devlink_priv(devlink);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment