mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 05:32:00 +00:00
Merge branch 'mlxsw-fixes'
Petr Machata says: ==================== mlxsw: Fixes This patchset fixes the following issues: - During driver de-initialization the driver unregisters the EMAD response trap by setting its action to DISCARD. However the manual only permits TRAP and FORWARD, and future firmware versions will enforce this. In patch #1, suppress the error message by aligning the driver to the manual and use a FORWARD (NOP) action when unregistering the trap. - The driver queries the Management Capabilities Mask (MCAM) register during initialization to understand if certain features are supported. However, not all firmware versions support this register, leading to the driver failing to load. Patches #2 and #3 fix this issue by treating an error in the register query as an indication that the feature is not supported. v2: - Patch #2: - Make mlxsw_env_max_module_eeprom_len_query() void ==================== Link: https://lore.kernel.org/r/cover.1713446092.git.petrm@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
a9176f7c66
@ -849,7 +849,7 @@ free_skb:
|
||||
|
||||
static const struct mlxsw_listener mlxsw_emad_rx_listener =
|
||||
MLXSW_RXL(mlxsw_emad_rx_listener_func, ETHEMAD, TRAP_TO_CPU, false,
|
||||
EMAD, DISCARD);
|
||||
EMAD, FORWARD);
|
||||
|
||||
static int mlxsw_emad_tlv_enable(struct mlxsw_core *mlxsw_core)
|
||||
{
|
||||
|
@ -1357,24 +1357,20 @@ static struct mlxsw_linecards_event_ops mlxsw_env_event_ops = {
|
||||
.got_inactive = mlxsw_env_got_inactive,
|
||||
};
|
||||
|
||||
static int mlxsw_env_max_module_eeprom_len_query(struct mlxsw_env *mlxsw_env)
|
||||
static void mlxsw_env_max_module_eeprom_len_query(struct mlxsw_env *mlxsw_env)
|
||||
{
|
||||
char mcam_pl[MLXSW_REG_MCAM_LEN];
|
||||
bool mcia_128b_supported;
|
||||
bool mcia_128b_supported = false;
|
||||
int err;
|
||||
|
||||
mlxsw_reg_mcam_pack(mcam_pl,
|
||||
MLXSW_REG_MCAM_FEATURE_GROUP_ENHANCED_FEATURES);
|
||||
err = mlxsw_reg_query(mlxsw_env->core, MLXSW_REG(mcam), mcam_pl);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mlxsw_reg_mcam_unpack(mcam_pl, MLXSW_REG_MCAM_MCIA_128B,
|
||||
&mcia_128b_supported);
|
||||
if (!err)
|
||||
mlxsw_reg_mcam_unpack(mcam_pl, MLXSW_REG_MCAM_MCIA_128B,
|
||||
&mcia_128b_supported);
|
||||
|
||||
mlxsw_env->max_eeprom_len = mcia_128b_supported ? 128 : 48;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlxsw_env_init(struct mlxsw_core *mlxsw_core,
|
||||
@ -1445,15 +1441,11 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core,
|
||||
if (err)
|
||||
goto err_type_set;
|
||||
|
||||
err = mlxsw_env_max_module_eeprom_len_query(env);
|
||||
if (err)
|
||||
goto err_eeprom_len_query;
|
||||
|
||||
mlxsw_env_max_module_eeprom_len_query(env);
|
||||
env->line_cards[0]->active = true;
|
||||
|
||||
return 0;
|
||||
|
||||
err_eeprom_len_query:
|
||||
err_type_set:
|
||||
mlxsw_env_module_event_disable(env, 0);
|
||||
err_mlxsw_env_module_event_enable:
|
||||
|
@ -1530,7 +1530,7 @@ mlxsw_pci_reset(struct mlxsw_pci *mlxsw_pci, const struct pci_device_id *id)
|
||||
{
|
||||
struct pci_dev *pdev = mlxsw_pci->pdev;
|
||||
char mcam_pl[MLXSW_REG_MCAM_LEN];
|
||||
bool pci_reset_supported;
|
||||
bool pci_reset_supported = false;
|
||||
u32 sys_status;
|
||||
int err;
|
||||
|
||||
@ -1548,11 +1548,9 @@ mlxsw_pci_reset(struct mlxsw_pci *mlxsw_pci, const struct pci_device_id *id)
|
||||
mlxsw_reg_mcam_pack(mcam_pl,
|
||||
MLXSW_REG_MCAM_FEATURE_GROUP_ENHANCED_FEATURES);
|
||||
err = mlxsw_reg_query(mlxsw_pci->core, MLXSW_REG(mcam), mcam_pl);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mlxsw_reg_mcam_unpack(mcam_pl, MLXSW_REG_MCAM_PCI_RESET,
|
||||
&pci_reset_supported);
|
||||
if (!err)
|
||||
mlxsw_reg_mcam_unpack(mcam_pl, MLXSW_REG_MCAM_PCI_RESET,
|
||||
&pci_reset_supported);
|
||||
|
||||
if (pci_reset_supported) {
|
||||
pci_dbg(pdev, "Starting PCI reset flow\n");
|
||||
|
Loading…
Reference in New Issue
Block a user