mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-29 18:11:20 +00:00
mlxsw: Move firmware flash implementation to devlink
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>
This commit is contained in:
parent
712246bc93
commit
a9d204a644
3 changed files with 41 additions and 26 deletions
|
@ -1003,6 +1003,20 @@ static int mlxsw_devlink_core_bus_device_reload(struct devlink *devlink,
|
||||||
return err;
|
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 = {
|
static const struct devlink_ops mlxsw_devlink_ops = {
|
||||||
.reload = mlxsw_devlink_core_bus_device_reload,
|
.reload = mlxsw_devlink_core_bus_device_reload,
|
||||||
.port_type_set = mlxsw_devlink_port_type_set,
|
.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_port_pool_get = mlxsw_devlink_sb_occ_port_pool_get,
|
||||||
.sb_occ_tc_port_bind_get = mlxsw_devlink_sb_occ_tc_port_bind_get,
|
.sb_occ_tc_port_bind_get = mlxsw_devlink_sb_occ_tc_port_bind_get,
|
||||||
.info_get = mlxsw_devlink_info_get,
|
.info_get = mlxsw_devlink_info_get,
|
||||||
|
.flash_update = mlxsw_devlink_flash_update,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -284,6 +284,9 @@ struct mlxsw_driver {
|
||||||
unsigned int sb_index, u16 tc_index,
|
unsigned int sb_index, u16 tc_index,
|
||||||
enum devlink_sb_pool_type pool_type,
|
enum devlink_sb_pool_type pool_type,
|
||||||
u32 *p_cur, u32 *p_max);
|
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,
|
void (*txhdr_construct)(struct sk_buff *skb,
|
||||||
const struct mlxsw_tx_info *tx_info);
|
const struct mlxsw_tx_info *tx_info);
|
||||||
int (*resources_register)(struct mlxsw_core *mlxsw_core);
|
int (*resources_register)(struct mlxsw_core *mlxsw_core);
|
||||||
|
|
|
@ -388,6 +388,27 @@ static int mlxsw_sp_fw_rev_validate(struct mlxsw_sp *mlxsw_sp)
|
||||||
return 0;
|
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,
|
int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp,
|
||||||
unsigned int counter_index, u64 *packets,
|
unsigned int counter_index, u64 *packets,
|
||||||
u64 *bytes)
|
u64 *bytes)
|
||||||
|
@ -3159,31 +3180,6 @@ mlxsw_sp_port_set_link_ksettings(struct net_device *dev,
|
||||||
return 0;
|
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,
|
static int mlxsw_sp_get_module_info(struct net_device *netdev,
|
||||||
struct ethtool_modinfo *modinfo)
|
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_sset_count = mlxsw_sp_port_get_sset_count,
|
||||||
.get_link_ksettings = mlxsw_sp_port_get_link_ksettings,
|
.get_link_ksettings = mlxsw_sp_port_get_link_ksettings,
|
||||||
.set_link_ksettings = mlxsw_sp_port_set_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_info = mlxsw_sp_get_module_info,
|
||||||
.get_module_eeprom = mlxsw_sp_get_module_eeprom,
|
.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_max_clear = mlxsw_sp_sb_occ_max_clear,
|
||||||
.sb_occ_port_pool_get = mlxsw_sp_sb_occ_port_pool_get,
|
.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,
|
.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,
|
.txhdr_construct = mlxsw_sp_txhdr_construct,
|
||||||
.resources_register = mlxsw_sp1_resources_register,
|
.resources_register = mlxsw_sp1_resources_register,
|
||||||
.kvd_sizes_get = mlxsw_sp_kvd_sizes_get,
|
.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_max_clear = mlxsw_sp_sb_occ_max_clear,
|
||||||
.sb_occ_port_pool_get = mlxsw_sp_sb_occ_port_pool_get,
|
.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,
|
.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,
|
.txhdr_construct = mlxsw_sp_txhdr_construct,
|
||||||
.resources_register = mlxsw_sp2_resources_register,
|
.resources_register = mlxsw_sp2_resources_register,
|
||||||
.params_register = mlxsw_sp2_params_register,
|
.params_register = mlxsw_sp2_params_register,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue