mlxsw: core: Add devlink port splitter callbacks
authorJiri Pirko <jiri@mellanox.com>
Fri, 26 Feb 2016 16:32:27 +0000 (17:32 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 1 Mar 2016 21:07:30 +0000 (16:07 -0500)
Add middle layer in mlxsw core code to forward port split/unsplit calls
into specific ASIC drivers.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/ethernet/mellanox/mlxsw/core.h

index a4026a4..f69f628 100644 (file)
@@ -785,6 +785,38 @@ static void mlxsw_core_debugfs_fini(struct mlxsw_core *mlxsw_core)
        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,
                                   const struct mlxsw_bus *mlxsw_bus,
                                   void *bus_priv)
@@ -800,7 +832,7 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
        if (!mlxsw_driver)
                return -EINVAL;
        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) {
                err = -ENOMEM;
                goto err_devlink_alloc;
index a017236..c73d1c0 100644 (file)
@@ -186,6 +186,8 @@ struct mlxsw_driver {
        int (*init)(void *driver_priv, struct mlxsw_core *mlxsw_core,
                    const struct mlxsw_bus_info *mlxsw_bus_info);
        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,
                                const struct mlxsw_tx_info *tx_info);
        u8 txhdr_len;