Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 284ef803 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

mlxsw: core: Add devlink port splitter callbacks



Add middle layer in mlxsw core code to forward port split/unsplit calls
into specific ASIC drivers.

Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c4745500
Loading
Loading
Loading
Loading
+33 −1
Original line number Original line Diff line number Diff line
@@ -785,6 +785,38 @@ static void mlxsw_core_debugfs_fini(struct mlxsw_core *mlxsw_core)
	debugfs_remove_recursive(mlxsw_core->dbg_dir);
	debugfs_remove_recursive(mlxsw_core->dbg_dir);
}
}


static int mlxsw_devlink_port_split(struct devlink *devlink,
				    unsigned int port_index,
				    unsigned int count)
{
	struct mlxsw_core *mlxsw_core = devlink_priv(devlink);

	if (port_index >= MLXSW_PORT_MAX_PORTS)
		return -EINVAL;
	if (!mlxsw_core->driver->port_split)
		return -EOPNOTSUPP;
	return mlxsw_core->driver->port_split(mlxsw_core->driver_priv,
					      port_index, count);
}

static int mlxsw_devlink_port_unsplit(struct devlink *devlink,
				      unsigned int port_index)
{
	struct mlxsw_core *mlxsw_core = devlink_priv(devlink);

	if (port_index >= MLXSW_PORT_MAX_PORTS)
		return -EINVAL;
	if (!mlxsw_core->driver->port_unsplit)
		return -EOPNOTSUPP;
	return mlxsw_core->driver->port_unsplit(mlxsw_core->driver_priv,
						port_index);
}

static const struct devlink_ops mlxsw_devlink_ops = {
	.port_split	= mlxsw_devlink_port_split,
	.port_unsplit	= mlxsw_devlink_port_unsplit,
};

int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
				   const struct mlxsw_bus *mlxsw_bus,
				   const struct mlxsw_bus *mlxsw_bus,
				   void *bus_priv)
				   void *bus_priv)
@@ -800,7 +832,7 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
	if (!mlxsw_driver)
	if (!mlxsw_driver)
		return -EINVAL;
		return -EINVAL;
	alloc_size = sizeof(*mlxsw_core) + mlxsw_driver->priv_size;
	alloc_size = sizeof(*mlxsw_core) + mlxsw_driver->priv_size;
	devlink = devlink_alloc(NULL, alloc_size);
	devlink = devlink_alloc(&mlxsw_devlink_ops, alloc_size);
	if (!devlink) {
	if (!devlink) {
		err = -ENOMEM;
		err = -ENOMEM;
		goto err_devlink_alloc;
		goto err_devlink_alloc;
+2 −0
Original line number Original line Diff line number Diff line
@@ -186,6 +186,8 @@ struct mlxsw_driver {
	int (*init)(void *driver_priv, struct mlxsw_core *mlxsw_core,
	int (*init)(void *driver_priv, struct mlxsw_core *mlxsw_core,
		    const struct mlxsw_bus_info *mlxsw_bus_info);
		    const struct mlxsw_bus_info *mlxsw_bus_info);
	void (*fini)(void *driver_priv);
	void (*fini)(void *driver_priv);
	int (*port_split)(void *driver_priv, u8 local_port, unsigned int count);
	int (*port_unsplit)(void *driver_priv, u8 local_port);
	void (*txhdr_construct)(struct sk_buff *skb,
	void (*txhdr_construct)(struct sk_buff *skb,
				const struct mlxsw_tx_info *tx_info);
				const struct mlxsw_tx_info *tx_info);
	u8 txhdr_len;
	u8 txhdr_len;