mlxsw: Move firmware flash implementation to devlink
authorJiri Pirko <jiri@mellanox.com>
Tue, 4 Jun 2019 13:40:37 +0000 (15:40 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 4 Jun 2019 21:21:40 +0000 (14:21 -0700)
Benefit from the devlink flash update implementation and ethtool
fallback to it and move firmware flash implementation there.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-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
drivers/net/ethernet/mellanox/mlxsw/spectrum.c

index 182762898361fbc9354cc9a38b5889c57c302825..1c4ef8ed17068c473e78b2c30dd354894048d03c 100644 (file)
@@ -1003,6 +1003,20 @@ static int mlxsw_devlink_core_bus_device_reload(struct devlink *devlink,
        return err;
 }
 
+static int mlxsw_devlink_flash_update(struct devlink *devlink,
+                                     const char *file_name,
+                                     const char *component,
+                                     struct netlink_ext_ack *extack)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+
+       if (!mlxsw_driver->flash_update)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->flash_update(mlxsw_core, file_name,
+                                         component, extack);
+}
+
 static const struct devlink_ops mlxsw_devlink_ops = {
        .reload                         = mlxsw_devlink_core_bus_device_reload,
        .port_type_set                  = mlxsw_devlink_port_type_set,
@@ -1019,6 +1033,7 @@ static const struct devlink_ops mlxsw_devlink_ops = {
        .sb_occ_port_pool_get           = mlxsw_devlink_sb_occ_port_pool_get,
        .sb_occ_tc_port_bind_get        = mlxsw_devlink_sb_occ_tc_port_bind_get,
        .info_get                       = mlxsw_devlink_info_get,
+       .flash_update                   = mlxsw_devlink_flash_update,
 };
 
 static int
index e3832cb5bdda72d1168307acfa6463dc2f5b5d6c..a44ad0fb9477c88ec15fc74f7e3c54d704ccdec4 100644 (file)
@@ -284,6 +284,9 @@ struct mlxsw_driver {
                                       unsigned int sb_index, u16 tc_index,
                                       enum devlink_sb_pool_type pool_type,
                                       u32 *p_cur, u32 *p_max);
+       int (*flash_update)(struct mlxsw_core *mlxsw_core,
+                           const char *file_name, const char *component,
+                           struct netlink_ext_ack *extack);
        void (*txhdr_construct)(struct sk_buff *skb,
                                const struct mlxsw_tx_info *tx_info);
        int (*resources_register)(struct mlxsw_core *mlxsw_core);
index dfe6b44baf635701e155809b5b9304e55c63faae..6f9ca943f50d520a09e24e860a94dec443e23555 100644 (file)
@@ -388,6 +388,27 @@ static int mlxsw_sp_fw_rev_validate(struct mlxsw_sp *mlxsw_sp)
                return 0;
 }
 
+static int mlxsw_sp_flash_update(struct mlxsw_core *mlxsw_core,
+                                const char *file_name, const char *component,
+                                struct netlink_ext_ack *extack)
+{
+       struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
+       const struct firmware *firmware;
+       int err;
+
+       if (component)
+               return -EOPNOTSUPP;
+
+       err = request_firmware_direct(&firmware, file_name,
+                                     mlxsw_sp->bus_info->dev);
+       if (err)
+               return err;
+       err = mlxsw_sp_firmware_flash(mlxsw_sp, firmware);
+       release_firmware(firmware);
+
+       return err;
+}
+
 int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp,
                              unsigned int counter_index, u64 *packets,
                              u64 *bytes)
@@ -3159,31 +3180,6 @@ mlxsw_sp_port_set_link_ksettings(struct net_device *dev,
        return 0;
 }
 
-static int mlxsw_sp_flash_device(struct net_device *dev,
-                                struct ethtool_flash *flash)
-{
-       struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
-       struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
-       const struct firmware *firmware;
-       int err;
-
-       if (flash->region != ETHTOOL_FLASH_ALL_REGIONS)
-               return -EOPNOTSUPP;
-
-       dev_hold(dev);
-       rtnl_unlock();
-
-       err = request_firmware_direct(&firmware, flash->data, &dev->dev);
-       if (err)
-               goto out;
-       err = mlxsw_sp_firmware_flash(mlxsw_sp, firmware);
-       release_firmware(firmware);
-out:
-       rtnl_lock();
-       dev_put(dev);
-       return err;
-}
-
 static int mlxsw_sp_get_module_info(struct net_device *netdev,
                                    struct ethtool_modinfo *modinfo)
 {
@@ -3224,7 +3220,6 @@ static const struct ethtool_ops mlxsw_sp_port_ethtool_ops = {
        .get_sset_count         = mlxsw_sp_port_get_sset_count,
        .get_link_ksettings     = mlxsw_sp_port_get_link_ksettings,
        .set_link_ksettings     = mlxsw_sp_port_set_link_ksettings,
-       .flash_device           = mlxsw_sp_flash_device,
        .get_module_info        = mlxsw_sp_get_module_info,
        .get_module_eeprom      = mlxsw_sp_get_module_eeprom,
 };
@@ -4889,6 +4884,7 @@ static struct mlxsw_driver mlxsw_sp1_driver = {
        .sb_occ_max_clear               = mlxsw_sp_sb_occ_max_clear,
        .sb_occ_port_pool_get           = mlxsw_sp_sb_occ_port_pool_get,
        .sb_occ_tc_port_bind_get        = mlxsw_sp_sb_occ_tc_port_bind_get,
+       .flash_update                   = mlxsw_sp_flash_update,
        .txhdr_construct                = mlxsw_sp_txhdr_construct,
        .resources_register             = mlxsw_sp1_resources_register,
        .kvd_sizes_get                  = mlxsw_sp_kvd_sizes_get,
@@ -4917,6 +4913,7 @@ static struct mlxsw_driver mlxsw_sp2_driver = {
        .sb_occ_max_clear               = mlxsw_sp_sb_occ_max_clear,
        .sb_occ_port_pool_get           = mlxsw_sp_sb_occ_port_pool_get,
        .sb_occ_tc_port_bind_get        = mlxsw_sp_sb_occ_tc_port_bind_get,
+       .flash_update                   = mlxsw_sp_flash_update,
        .txhdr_construct                = mlxsw_sp_txhdr_construct,
        .resources_register             = mlxsw_sp2_resources_register,
        .params_register                = mlxsw_sp2_params_register,