mlxsw: Enable string TLV usage according to MGIR output
String TLV is not supported by old firmware versions, therefore 'struct mlxsw_core' stores the field 'emad.enable_string_tlv', which is set to true only after firmware version check. Instead of assuming that firmware version check is enough to enable string TLV, a better solution is to query if this TLV is supported from MGIR register. Add such query and initialize 'emad.enable_string_tlv' accordingly. Signed-off-by: Amit Cohen <amcohen@nvidia.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: Petr Machata <petrm@nvidia.com> Reviewed-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
42b4f757ba
commit
d84e2359e6
|
@ -794,6 +794,28 @@ static const struct mlxsw_listener mlxsw_emad_rx_listener =
|
|||
MLXSW_RXL(mlxsw_emad_rx_listener_func, ETHEMAD, TRAP_TO_CPU, false,
|
||||
EMAD, DISCARD);
|
||||
|
||||
static int mlxsw_emad_tlv_enable(struct mlxsw_core *mlxsw_core)
|
||||
{
|
||||
char mgir_pl[MLXSW_REG_MGIR_LEN];
|
||||
bool string_tlv;
|
||||
int err;
|
||||
|
||||
mlxsw_reg_mgir_pack(mgir_pl);
|
||||
err = mlxsw_reg_query(mlxsw_core, MLXSW_REG(mgir), mgir_pl);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
string_tlv = mlxsw_reg_mgir_fw_info_string_tlv_get(mgir_pl);
|
||||
mlxsw_core->emad.enable_string_tlv = string_tlv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlxsw_emad_tlv_disable(struct mlxsw_core *mlxsw_core)
|
||||
{
|
||||
mlxsw_core->emad.enable_string_tlv = false;
|
||||
}
|
||||
|
||||
static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
|
||||
{
|
||||
struct workqueue_struct *emad_wq;
|
||||
|
@ -824,10 +846,17 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
|
|||
if (err)
|
||||
goto err_trap_register;
|
||||
|
||||
err = mlxsw_emad_tlv_enable(mlxsw_core);
|
||||
if (err)
|
||||
goto err_emad_tlv_enable;
|
||||
|
||||
mlxsw_core->emad.use_emad = true;
|
||||
|
||||
return 0;
|
||||
|
||||
err_emad_tlv_enable:
|
||||
mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,
|
||||
mlxsw_core);
|
||||
err_trap_register:
|
||||
destroy_workqueue(mlxsw_core->emad_wq);
|
||||
return err;
|
||||
|
@ -840,6 +869,7 @@ static void mlxsw_emad_fini(struct mlxsw_core *mlxsw_core)
|
|||
return;
|
||||
|
||||
mlxsw_core->emad.use_emad = false;
|
||||
mlxsw_emad_tlv_disable(mlxsw_core);
|
||||
mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,
|
||||
mlxsw_core);
|
||||
destroy_workqueue(mlxsw_core->emad_wq);
|
||||
|
@ -3377,12 +3407,6 @@ bool mlxsw_core_sdq_supports_cqe_v2(struct mlxsw_core *mlxsw_core)
|
|||
}
|
||||
EXPORT_SYMBOL(mlxsw_core_sdq_supports_cqe_v2);
|
||||
|
||||
void mlxsw_core_emad_string_tlv_enable(struct mlxsw_core *mlxsw_core)
|
||||
{
|
||||
mlxsw_core->emad.enable_string_tlv = true;
|
||||
}
|
||||
EXPORT_SYMBOL(mlxsw_core_emad_string_tlv_enable);
|
||||
|
||||
static int __init mlxsw_core_module_init(void)
|
||||
{
|
||||
int err;
|
||||
|
|
|
@ -448,8 +448,6 @@ u32 mlxsw_core_read_utc_nsec(struct mlxsw_core *mlxsw_core);
|
|||
|
||||
bool mlxsw_core_sdq_supports_cqe_v2(struct mlxsw_core *mlxsw_core);
|
||||
|
||||
void mlxsw_core_emad_string_tlv_enable(struct mlxsw_core *mlxsw_core);
|
||||
|
||||
bool mlxsw_core_res_valid(struct mlxsw_core *mlxsw_core,
|
||||
enum mlxsw_res_id res_id);
|
||||
|
||||
|
|
|
@ -3092,7 +3092,6 @@ static int mlxsw_sp_init(struct mlxsw_core *mlxsw_core,
|
|||
mlxsw_sp->bus_info = mlxsw_bus_info;
|
||||
|
||||
mlxsw_sp_parsing_init(mlxsw_sp);
|
||||
mlxsw_core_emad_string_tlv_enable(mlxsw_core);
|
||||
|
||||
err = mlxsw_sp_base_mac_get(mlxsw_sp);
|
||||
if (err) {
|
||||
|
|
Loading…
Reference in New Issue