]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/mellanox/mlxsw/core.c
mlxsw: core: Add devlink shared buffer callbacks
[karo-tx-linux.git] / drivers / net / ethernet / mellanox / mlxsw / core.c
index f69f6280519f4854addfb8768497a269066d36c5..1278260118a41072ca1a464129ca8c86c1bf5351 100644 (file)
@@ -114,6 +114,12 @@ struct mlxsw_core {
        /* driver_priv has to be always the last item */
 };
 
+void *mlxsw_core_driver_priv(struct mlxsw_core *mlxsw_core)
+{
+       return mlxsw_core->driver_priv;
+}
+EXPORT_SYMBOL(mlxsw_core_driver_priv);
+
 struct mlxsw_rx_listener_item {
        struct list_head list;
        struct mlxsw_rx_listener rxl;
@@ -381,7 +387,7 @@ static int __mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core,
 
        mlxsw_core->emad.trans_active = true;
 
-       err = mlxsw_core_skb_transmit(mlxsw_core->driver_priv, skb, tx_info);
+       err = mlxsw_core_skb_transmit(mlxsw_core, skb, tx_info);
        if (err) {
                dev_err(mlxsw_core->bus_info->dev, "Failed to transmit EMAD (tid=%llx)\n",
                        mlxsw_core->emad.tid);
@@ -795,8 +801,7 @@ static int mlxsw_devlink_port_split(struct devlink *devlink,
                return -EINVAL;
        if (!mlxsw_core->driver->port_split)
                return -EOPNOTSUPP;
-       return mlxsw_core->driver->port_split(mlxsw_core->driver_priv,
-                                             port_index, count);
+       return mlxsw_core->driver->port_split(mlxsw_core, port_index, count);
 }
 
 static int mlxsw_devlink_port_unsplit(struct devlink *devlink,
@@ -808,13 +813,113 @@ static int mlxsw_devlink_port_unsplit(struct devlink *devlink,
                return -EINVAL;
        if (!mlxsw_core->driver->port_unsplit)
                return -EOPNOTSUPP;
-       return mlxsw_core->driver->port_unsplit(mlxsw_core->driver_priv,
-                                               port_index);
+       return mlxsw_core->driver->port_unsplit(mlxsw_core, port_index);
+}
+
+static int
+mlxsw_devlink_sb_pool_get(struct devlink *devlink,
+                         unsigned int sb_index, u16 pool_index,
+                         struct devlink_sb_pool_info *pool_info)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+
+       if (!mlxsw_driver->sb_pool_get)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_pool_get(mlxsw_core, sb_index,
+                                        pool_index, pool_info);
+}
+
+static int
+mlxsw_devlink_sb_pool_set(struct devlink *devlink,
+                         unsigned int sb_index, u16 pool_index, u32 size,
+                         enum devlink_sb_threshold_type threshold_type)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+
+       if (!mlxsw_driver->sb_pool_set)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_pool_set(mlxsw_core, sb_index,
+                                        pool_index, size, threshold_type);
+}
+
+static void *__dl_port(struct devlink_port *devlink_port)
+{
+       return container_of(devlink_port, struct mlxsw_core_port, devlink_port);
+}
+
+static int mlxsw_devlink_sb_port_pool_get(struct devlink_port *devlink_port,
+                                         unsigned int sb_index, u16 pool_index,
+                                         u32 *p_threshold)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink_port->devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+       struct mlxsw_core_port *mlxsw_core_port = __dl_port(devlink_port);
+
+       if (!mlxsw_driver->sb_port_pool_get)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_port_pool_get(mlxsw_core_port, sb_index,
+                                             pool_index, p_threshold);
+}
+
+static int mlxsw_devlink_sb_port_pool_set(struct devlink_port *devlink_port,
+                                         unsigned int sb_index, u16 pool_index,
+                                         u32 threshold)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink_port->devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+       struct mlxsw_core_port *mlxsw_core_port = __dl_port(devlink_port);
+
+       if (!mlxsw_driver->sb_port_pool_set)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_port_pool_set(mlxsw_core_port, sb_index,
+                                             pool_index, threshold);
+}
+
+static int
+mlxsw_devlink_sb_tc_pool_bind_get(struct devlink_port *devlink_port,
+                                 unsigned int sb_index, u16 tc_index,
+                                 enum devlink_sb_pool_type pool_type,
+                                 u16 *p_pool_index, u32 *p_threshold)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink_port->devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+       struct mlxsw_core_port *mlxsw_core_port = __dl_port(devlink_port);
+
+       if (!mlxsw_driver->sb_tc_pool_bind_get)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_tc_pool_bind_get(mlxsw_core_port, sb_index,
+                                                tc_index, pool_type,
+                                                p_pool_index, p_threshold);
+}
+
+static int
+mlxsw_devlink_sb_tc_pool_bind_set(struct devlink_port *devlink_port,
+                                 unsigned int sb_index, u16 tc_index,
+                                 enum devlink_sb_pool_type pool_type,
+                                 u16 pool_index, u32 threshold)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink_port->devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+       struct mlxsw_core_port *mlxsw_core_port = __dl_port(devlink_port);
+
+       if (!mlxsw_driver->sb_tc_pool_bind_set)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_tc_pool_bind_set(mlxsw_core_port, sb_index,
+                                                tc_index, pool_type,
+                                                pool_index, threshold);
 }
 
 static const struct devlink_ops mlxsw_devlink_ops = {
-       .port_split     = mlxsw_devlink_port_split,
-       .port_unsplit   = mlxsw_devlink_port_unsplit,
+       .port_split             = mlxsw_devlink_port_split,
+       .port_unsplit           = mlxsw_devlink_port_unsplit,
+       .sb_pool_get            = mlxsw_devlink_sb_pool_get,
+       .sb_pool_set            = mlxsw_devlink_sb_pool_set,
+       .sb_port_pool_get       = mlxsw_devlink_sb_port_pool_get,
+       .sb_port_pool_set       = mlxsw_devlink_sb_port_pool_set,
+       .sb_tc_pool_bind_get    = mlxsw_devlink_sb_tc_pool_bind_get,
+       .sb_tc_pool_bind_set    = mlxsw_devlink_sb_tc_pool_bind_set,
 };
 
 int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
@@ -880,8 +985,7 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
        if (err)
                goto err_devlink_register;
 
-       err = mlxsw_driver->init(mlxsw_core->driver_priv, mlxsw_core,
-                                mlxsw_bus_info);
+       err = mlxsw_driver->init(mlxsw_core, mlxsw_bus_info);
        if (err)
                goto err_driver_init;
 
@@ -892,7 +996,7 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
        return 0;
 
 err_debugfs_init:
-       mlxsw_core->driver->fini(mlxsw_core->driver_priv);
+       mlxsw_core->driver->fini(mlxsw_core);
 err_driver_init:
        devlink_unregister(devlink);
 err_devlink_register:
@@ -918,7 +1022,7 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core)
        struct devlink *devlink = priv_to_devlink(mlxsw_core);
 
        mlxsw_core_debugfs_fini(mlxsw_core);
-       mlxsw_core->driver->fini(mlxsw_core->driver_priv);
+       mlxsw_core->driver->fini(mlxsw_core);
        devlink_unregister(devlink);
        mlxsw_emad_fini(mlxsw_core);
        mlxsw_core->bus->fini(mlxsw_core->bus_priv);
@@ -929,26 +1033,17 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core)
 }
 EXPORT_SYMBOL(mlxsw_core_bus_device_unregister);
 
-static struct mlxsw_core *__mlxsw_core_get(void *driver_priv)
-{
-       return container_of(driver_priv, struct mlxsw_core, driver_priv);
-}
-
-bool mlxsw_core_skb_transmit_busy(void *driver_priv,
+bool mlxsw_core_skb_transmit_busy(struct mlxsw_core *mlxsw_core,
                                  const struct mlxsw_tx_info *tx_info)
 {
-       struct mlxsw_core *mlxsw_core = __mlxsw_core_get(driver_priv);
-
        return mlxsw_core->bus->skb_transmit_busy(mlxsw_core->bus_priv,
                                                  tx_info);
 }
 EXPORT_SYMBOL(mlxsw_core_skb_transmit_busy);
 
-int mlxsw_core_skb_transmit(void *driver_priv, struct sk_buff *skb,
+int mlxsw_core_skb_transmit(struct mlxsw_core *mlxsw_core, struct sk_buff *skb,
                            const struct mlxsw_tx_info *tx_info)
 {
-       struct mlxsw_core *mlxsw_core = __mlxsw_core_get(driver_priv);
-
        return mlxsw_core->bus->skb_transmit(mlxsw_core->bus_priv, skb,
                                             tx_info);
 }
@@ -1358,6 +1453,28 @@ void mlxsw_core_lag_mapping_clear(struct mlxsw_core *mlxsw_core,
 }
 EXPORT_SYMBOL(mlxsw_core_lag_mapping_clear);
 
+int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core,
+                        struct mlxsw_core_port *mlxsw_core_port, u8 local_port,
+                        struct net_device *dev, bool split, u32 split_group)
+{
+       struct devlink *devlink = priv_to_devlink(mlxsw_core);
+       struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
+
+       if (split)
+               devlink_port_split_set(devlink_port, split_group);
+       devlink_port_type_eth_set(devlink_port, dev);
+       return devlink_port_register(devlink, devlink_port, local_port);
+}
+EXPORT_SYMBOL(mlxsw_core_port_init);
+
+void mlxsw_core_port_fini(struct mlxsw_core_port *mlxsw_core_port)
+{
+       struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
+
+       devlink_port_unregister(devlink_port);
+}
+EXPORT_SYMBOL(mlxsw_core_port_fini);
+
 int mlxsw_cmd_exec(struct mlxsw_core *mlxsw_core, u16 opcode, u8 opcode_mod,
                   u32 in_mod, bool out_mbox_direct,
                   char *in_mbox, size_t in_mbox_size,