Commit d344e553 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'mlxsw-various-updates'

Ido Schimmel says:

====================
mlxsw: Various updates

This patchset contains miscellaneous updates for mlxsw. No user visible
changes that I am aware of.

Patches #1-#5 rework registration of internal traps in preparation of
line cards support.

Patch #6 improves driver resilience against a misbehaving device.

Patch #7 prevents the driver from overwriting device internal actions.
See the commit message for more details.
====================

Link: https://lore.kernel.org/r/20220127090226.283442-1-idosch@nvidia.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 3268ee8f ef14c298
...@@ -212,6 +212,29 @@ struct mlxsw_event_listener_item { ...@@ -212,6 +212,29 @@ struct mlxsw_event_listener_item {
void *priv; void *priv;
}; };
static const u8 mlxsw_core_trap_groups[] = {
MLXSW_REG_HTGT_TRAP_GROUP_EMAD,
MLXSW_REG_HTGT_TRAP_GROUP_CORE_EVENT,
};
static int mlxsw_core_trap_groups_set(struct mlxsw_core *mlxsw_core)
{
char htgt_pl[MLXSW_REG_HTGT_LEN];
int err;
int i;
for (i = 0; i < ARRAY_SIZE(mlxsw_core_trap_groups); i++) {
mlxsw_reg_htgt_pack(htgt_pl, mlxsw_core_trap_groups[i],
MLXSW_REG_HTGT_INVALID_POLICER,
MLXSW_REG_HTGT_DEFAULT_PRIORITY,
MLXSW_REG_HTGT_DEFAULT_TC);
err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
if (err)
return err;
}
return 0;
}
/****************** /******************
* EMAD processing * EMAD processing
******************/ ******************/
...@@ -777,16 +800,10 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core) ...@@ -777,16 +800,10 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
if (err) if (err)
goto err_trap_register; goto err_trap_register;
err = mlxsw_core->driver->basic_trap_groups_set(mlxsw_core);
if (err)
goto err_emad_trap_set;
mlxsw_core->emad.use_emad = true; mlxsw_core->emad.use_emad = true;
return 0; return 0;
err_emad_trap_set:
mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,
mlxsw_core);
err_trap_register: err_trap_register:
destroy_workqueue(mlxsw_core->emad_wq); destroy_workqueue(mlxsw_core->emad_wq);
return err; return err;
...@@ -1706,7 +1723,7 @@ static void mlxsw_core_health_listener_func(const struct mlxsw_reg_info *reg, ...@@ -1706,7 +1723,7 @@ static void mlxsw_core_health_listener_func(const struct mlxsw_reg_info *reg,
} }
static const struct mlxsw_listener mlxsw_core_health_listener = static const struct mlxsw_listener mlxsw_core_health_listener =
MLXSW_EVENTL(mlxsw_core_health_listener_func, MFDE, MFDE); MLXSW_CORE_EVENTL(mlxsw_core_health_listener_func, MFDE);
static int static int
mlxsw_core_health_fw_fatal_dump_fatal_cause(const char *mfde_pl, mlxsw_core_health_fw_fatal_dump_fatal_cause(const char *mfde_pl,
...@@ -2122,6 +2139,10 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info, ...@@ -2122,6 +2139,10 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
} }
} }
err = mlxsw_core_trap_groups_set(mlxsw_core);
if (err)
goto err_trap_groups_set;
err = mlxsw_emad_init(mlxsw_core); err = mlxsw_emad_init(mlxsw_core);
if (err) if (err)
goto err_emad_init; goto err_emad_init;
...@@ -2181,6 +2202,7 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info, ...@@ -2181,6 +2202,7 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
err_register_params: err_register_params:
mlxsw_emad_fini(mlxsw_core); mlxsw_emad_fini(mlxsw_core);
err_emad_init: err_emad_init:
err_trap_groups_set:
kfree(mlxsw_core->lag.mapping); kfree(mlxsw_core->lag.mapping);
err_alloc_lag_mapping: err_alloc_lag_mapping:
mlxsw_ports_fini(mlxsw_core, reload); mlxsw_ports_fini(mlxsw_core, reload);
...@@ -2540,6 +2562,45 @@ void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core, ...@@ -2540,6 +2562,45 @@ void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,
} }
EXPORT_SYMBOL(mlxsw_core_trap_unregister); EXPORT_SYMBOL(mlxsw_core_trap_unregister);
int mlxsw_core_traps_register(struct mlxsw_core *mlxsw_core,
const struct mlxsw_listener *listeners,
size_t listeners_count, void *priv)
{
int i, err;
for (i = 0; i < listeners_count; i++) {
err = mlxsw_core_trap_register(mlxsw_core,
&listeners[i],
priv);
if (err)
goto err_listener_register;
}
return 0;
err_listener_register:
for (i--; i >= 0; i--) {
mlxsw_core_trap_unregister(mlxsw_core,
&listeners[i],
priv);
}
return err;
}
EXPORT_SYMBOL(mlxsw_core_traps_register);
void mlxsw_core_traps_unregister(struct mlxsw_core *mlxsw_core,
const struct mlxsw_listener *listeners,
size_t listeners_count, void *priv)
{
int i;
for (i = 0; i < listeners_count; i++) {
mlxsw_core_trap_unregister(mlxsw_core,
&listeners[i],
priv);
}
}
EXPORT_SYMBOL(mlxsw_core_traps_unregister);
int mlxsw_core_trap_state_set(struct mlxsw_core *mlxsw_core, int mlxsw_core_trap_state_set(struct mlxsw_core *mlxsw_core,
const struct mlxsw_listener *listener, const struct mlxsw_listener *listener,
bool enabled) bool enabled)
......
...@@ -163,6 +163,9 @@ struct mlxsw_listener { ...@@ -163,6 +163,9 @@ struct mlxsw_listener {
.enabled_on_register = true, \ .enabled_on_register = true, \
} }
#define MLXSW_CORE_EVENTL(_func, _trap_id) \
MLXSW_EVENTL(_func, _trap_id, CORE_EVENT)
int mlxsw_core_rx_listener_register(struct mlxsw_core *mlxsw_core, int mlxsw_core_rx_listener_register(struct mlxsw_core *mlxsw_core,
const struct mlxsw_rx_listener *rxl, const struct mlxsw_rx_listener *rxl,
void *priv, bool enabled); void *priv, bool enabled);
...@@ -181,6 +184,12 @@ int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core, ...@@ -181,6 +184,12 @@ int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,
void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core, void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,
const struct mlxsw_listener *listener, const struct mlxsw_listener *listener,
void *priv); void *priv);
int mlxsw_core_traps_register(struct mlxsw_core *mlxsw_core,
const struct mlxsw_listener *listeners,
size_t listeners_count, void *priv);
void mlxsw_core_traps_unregister(struct mlxsw_core *mlxsw_core,
const struct mlxsw_listener *listeners,
size_t listeners_count, void *priv);
int mlxsw_core_trap_state_set(struct mlxsw_core *mlxsw_core, int mlxsw_core_trap_state_set(struct mlxsw_core *mlxsw_core,
const struct mlxsw_listener *listener, const struct mlxsw_listener *listener,
bool enabled); bool enabled);
...@@ -315,7 +324,6 @@ struct mlxsw_driver { ...@@ -315,7 +324,6 @@ struct mlxsw_driver {
const struct mlxsw_bus_info *mlxsw_bus_info, const struct mlxsw_bus_info *mlxsw_bus_info,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
void (*fini)(struct mlxsw_core *mlxsw_core); void (*fini)(struct mlxsw_core *mlxsw_core);
int (*basic_trap_groups_set)(struct mlxsw_core *mlxsw_core);
int (*port_type_set)(struct mlxsw_core *mlxsw_core, u16 local_port, int (*port_type_set)(struct mlxsw_core *mlxsw_core, u16 local_port,
enum devlink_port_type new_type); enum devlink_port_type new_type);
int (*port_split)(struct mlxsw_core *mlxsw_core, u16 local_port, int (*port_split)(struct mlxsw_core *mlxsw_core, u16 local_port,
......
...@@ -825,7 +825,7 @@ mlxsw_env_mtwe_listener_func(const struct mlxsw_reg_info *reg, char *mtwe_pl, ...@@ -825,7 +825,7 @@ mlxsw_env_mtwe_listener_func(const struct mlxsw_reg_info *reg, char *mtwe_pl,
} }
static const struct mlxsw_listener mlxsw_env_temp_warn_listener = static const struct mlxsw_listener mlxsw_env_temp_warn_listener =
MLXSW_EVENTL(mlxsw_env_mtwe_listener_func, MTWE, MTWE); MLXSW_CORE_EVENTL(mlxsw_env_mtwe_listener_func, MTWE);
static int mlxsw_env_temp_warn_event_register(struct mlxsw_core *mlxsw_core) static int mlxsw_env_temp_warn_event_register(struct mlxsw_core *mlxsw_core)
{ {
...@@ -915,7 +915,7 @@ mlxsw_env_pmpe_listener_func(const struct mlxsw_reg_info *reg, char *pmpe_pl, ...@@ -915,7 +915,7 @@ mlxsw_env_pmpe_listener_func(const struct mlxsw_reg_info *reg, char *pmpe_pl,
} }
static const struct mlxsw_listener mlxsw_env_module_plug_listener = static const struct mlxsw_listener mlxsw_env_module_plug_listener =
MLXSW_EVENTL(mlxsw_env_pmpe_listener_func, PMPE, PMPE); MLXSW_CORE_EVENTL(mlxsw_env_pmpe_listener_func, PMPE);
static int static int
mlxsw_env_module_plug_event_register(struct mlxsw_core *mlxsw_core) mlxsw_env_module_plug_event_register(struct mlxsw_core *mlxsw_core)
......
...@@ -6141,9 +6141,7 @@ MLXSW_ITEM32(reg, htgt, type, 0x00, 8, 4); ...@@ -6141,9 +6141,7 @@ MLXSW_ITEM32(reg, htgt, type, 0x00, 8, 4);
enum mlxsw_reg_htgt_trap_group { enum mlxsw_reg_htgt_trap_group {
MLXSW_REG_HTGT_TRAP_GROUP_EMAD, MLXSW_REG_HTGT_TRAP_GROUP_EMAD,
MLXSW_REG_HTGT_TRAP_GROUP_MFDE, MLXSW_REG_HTGT_TRAP_GROUP_CORE_EVENT,
MLXSW_REG_HTGT_TRAP_GROUP_MTWE,
MLXSW_REG_HTGT_TRAP_GROUP_PMPE,
MLXSW_REG_HTGT_TRAP_GROUP_SP_STP, MLXSW_REG_HTGT_TRAP_GROUP_SP_STP,
MLXSW_REG_HTGT_TRAP_GROUP_SP_LACP, MLXSW_REG_HTGT_TRAP_GROUP_SP_LACP,
MLXSW_REG_HTGT_TRAP_GROUP_SP_LLDP, MLXSW_REG_HTGT_TRAP_GROUP_SP_LLDP,
......
...@@ -33,6 +33,7 @@ enum mlxsw_res_id { ...@@ -33,6 +33,7 @@ enum mlxsw_res_id {
MLXSW_RES_ID_ACL_MAX_REGIONS, MLXSW_RES_ID_ACL_MAX_REGIONS,
MLXSW_RES_ID_ACL_MAX_GROUPS, MLXSW_RES_ID_ACL_MAX_GROUPS,
MLXSW_RES_ID_ACL_MAX_GROUP_SIZE, MLXSW_RES_ID_ACL_MAX_GROUP_SIZE,
MLXSW_RES_ID_ACL_MAX_DEFAULT_ACTIONS,
MLXSW_RES_ID_ACL_FLEX_KEYS, MLXSW_RES_ID_ACL_FLEX_KEYS,
MLXSW_RES_ID_ACL_MAX_ACTION_PER_RULE, MLXSW_RES_ID_ACL_MAX_ACTION_PER_RULE,
MLXSW_RES_ID_ACL_ACTIONS_PER_SET, MLXSW_RES_ID_ACL_ACTIONS_PER_SET,
...@@ -90,6 +91,7 @@ static u16 mlxsw_res_ids[] = { ...@@ -90,6 +91,7 @@ static u16 mlxsw_res_ids[] = {
[MLXSW_RES_ID_ACL_MAX_REGIONS] = 0x2903, [MLXSW_RES_ID_ACL_MAX_REGIONS] = 0x2903,
[MLXSW_RES_ID_ACL_MAX_GROUPS] = 0x2904, [MLXSW_RES_ID_ACL_MAX_GROUPS] = 0x2904,
[MLXSW_RES_ID_ACL_MAX_GROUP_SIZE] = 0x2905, [MLXSW_RES_ID_ACL_MAX_GROUP_SIZE] = 0x2905,
[MLXSW_RES_ID_ACL_MAX_DEFAULT_ACTIONS] = 0x2908,
[MLXSW_RES_ID_ACL_FLEX_KEYS] = 0x2910, [MLXSW_RES_ID_ACL_FLEX_KEYS] = 0x2910,
[MLXSW_RES_ID_ACL_MAX_ACTION_PER_RULE] = 0x2911, [MLXSW_RES_ID_ACL_MAX_ACTION_PER_RULE] = 0x2911,
[MLXSW_RES_ID_ACL_ACTIONS_PER_SET] = 0x2912, [MLXSW_RES_ID_ACL_ACTIONS_PER_SET] = 0x2912,
......
...@@ -2148,13 +2148,11 @@ static void mlxsw_sp_pude_event_func(const struct mlxsw_reg_info *reg, ...@@ -2148,13 +2148,11 @@ static void mlxsw_sp_pude_event_func(const struct mlxsw_reg_info *reg,
struct mlxsw_sp *mlxsw_sp = priv; struct mlxsw_sp *mlxsw_sp = priv;
struct mlxsw_sp_port *mlxsw_sp_port; struct mlxsw_sp_port *mlxsw_sp_port;
enum mlxsw_reg_pude_oper_status status; enum mlxsw_reg_pude_oper_status status;
unsigned int max_ports;
u16 local_port; u16 local_port;
max_ports = mlxsw_core_max_ports(mlxsw_sp->core);
local_port = mlxsw_reg_pude_local_port_get(pude_pl); local_port = mlxsw_reg_pude_local_port_get(pude_pl);
if (WARN_ON_ONCE(!local_port || local_port >= max_ports)) if (WARN_ON_ONCE(!mlxsw_sp_local_port_is_valid(mlxsw_sp, local_port)))
return; return;
mlxsw_sp_port = mlxsw_sp->ports[local_port]; mlxsw_sp_port = mlxsw_sp->ports[local_port];
if (!mlxsw_sp_port) if (!mlxsw_sp_port)
...@@ -2393,45 +2391,6 @@ static int mlxsw_sp_trap_groups_set(struct mlxsw_core *mlxsw_core) ...@@ -2393,45 +2391,6 @@ static int mlxsw_sp_trap_groups_set(struct mlxsw_core *mlxsw_core)
return 0; return 0;
} }
static int mlxsw_sp_traps_register(struct mlxsw_sp *mlxsw_sp,
const struct mlxsw_listener listeners[],
size_t listeners_count)
{
int i;
int err;
for (i = 0; i < listeners_count; i++) {
err = mlxsw_core_trap_register(mlxsw_sp->core,
&listeners[i],
mlxsw_sp);
if (err)
goto err_listener_register;
}
return 0;
err_listener_register:
for (i--; i >= 0; i--) {
mlxsw_core_trap_unregister(mlxsw_sp->core,
&listeners[i],
mlxsw_sp);
}
return err;
}
static void mlxsw_sp_traps_unregister(struct mlxsw_sp *mlxsw_sp,
const struct mlxsw_listener listeners[],
size_t listeners_count)
{
int i;
for (i = 0; i < listeners_count; i++) {
mlxsw_core_trap_unregister(mlxsw_sp->core,
&listeners[i],
mlxsw_sp);
}
}
static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp) static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
{ {
struct mlxsw_sp_trap *trap; struct mlxsw_sp_trap *trap;
...@@ -2456,21 +2415,23 @@ static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp) ...@@ -2456,21 +2415,23 @@ static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
if (err) if (err)
goto err_trap_groups_set; goto err_trap_groups_set;
err = mlxsw_sp_traps_register(mlxsw_sp, mlxsw_sp_listener, err = mlxsw_core_traps_register(mlxsw_sp->core, mlxsw_sp_listener,
ARRAY_SIZE(mlxsw_sp_listener)); ARRAY_SIZE(mlxsw_sp_listener),
mlxsw_sp);
if (err) if (err)
goto err_traps_register; goto err_traps_register;
err = mlxsw_sp_traps_register(mlxsw_sp, mlxsw_sp->listeners, err = mlxsw_core_traps_register(mlxsw_sp->core, mlxsw_sp->listeners,
mlxsw_sp->listeners_count); mlxsw_sp->listeners_count, mlxsw_sp);
if (err) if (err)
goto err_extra_traps_init; goto err_extra_traps_init;
return 0; return 0;
err_extra_traps_init: err_extra_traps_init:
mlxsw_sp_traps_unregister(mlxsw_sp, mlxsw_sp_listener, mlxsw_core_traps_unregister(mlxsw_sp->core, mlxsw_sp_listener,
ARRAY_SIZE(mlxsw_sp_listener)); ARRAY_SIZE(mlxsw_sp_listener),
mlxsw_sp);
err_traps_register: err_traps_register:
err_trap_groups_set: err_trap_groups_set:
err_cpu_policers_set: err_cpu_policers_set:
...@@ -2480,10 +2441,11 @@ static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp) ...@@ -2480,10 +2441,11 @@ static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
static void mlxsw_sp_traps_fini(struct mlxsw_sp *mlxsw_sp) static void mlxsw_sp_traps_fini(struct mlxsw_sp *mlxsw_sp)
{ {
mlxsw_sp_traps_unregister(mlxsw_sp, mlxsw_sp->listeners, mlxsw_core_traps_unregister(mlxsw_sp->core, mlxsw_sp->listeners,
mlxsw_sp->listeners_count); mlxsw_sp->listeners_count,
mlxsw_sp_traps_unregister(mlxsw_sp, mlxsw_sp_listener, mlxsw_sp);
ARRAY_SIZE(mlxsw_sp_listener)); mlxsw_core_traps_unregister(mlxsw_sp->core, mlxsw_sp_listener,
ARRAY_SIZE(mlxsw_sp_listener), mlxsw_sp);
kfree(mlxsw_sp->trap); kfree(mlxsw_sp->trap);
} }
...@@ -2528,42 +2490,6 @@ static void mlxsw_sp_lag_fini(struct mlxsw_sp *mlxsw_sp) ...@@ -2528,42 +2490,6 @@ static void mlxsw_sp_lag_fini(struct mlxsw_sp *mlxsw_sp)
kfree(mlxsw_sp->lags); kfree(mlxsw_sp->lags);
} }
static int mlxsw_sp_basic_trap_groups_set(struct mlxsw_core *mlxsw_core)
{
char htgt_pl[MLXSW_REG_HTGT_LEN];
int err;
mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_EMAD,
MLXSW_REG_HTGT_INVALID_POLICER,
MLXSW_REG_HTGT_DEFAULT_PRIORITY,
MLXSW_REG_HTGT_DEFAULT_TC);
err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
if (err)
return err;
mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_MFDE,
MLXSW_REG_HTGT_INVALID_POLICER,
MLXSW_REG_HTGT_DEFAULT_PRIORITY,
MLXSW_REG_HTGT_DEFAULT_TC);
err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
if (err)
return err;
mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_MTWE,
MLXSW_REG_HTGT_INVALID_POLICER,
MLXSW_REG_HTGT_DEFAULT_PRIORITY,
MLXSW_REG_HTGT_DEFAULT_TC);
err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
if (err)
return err;
mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_PMPE,
MLXSW_REG_HTGT_INVALID_POLICER,
MLXSW_REG_HTGT_DEFAULT_PRIORITY,
MLXSW_REG_HTGT_DEFAULT_TC);
return mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
}
static const struct mlxsw_sp_ptp_ops mlxsw_sp1_ptp_ops = { static const struct mlxsw_sp_ptp_ops mlxsw_sp1_ptp_ops = {
.clock_init = mlxsw_sp1_ptp_clock_init, .clock_init = mlxsw_sp1_ptp_clock_init,
.clock_fini = mlxsw_sp1_ptp_clock_fini, .clock_fini = mlxsw_sp1_ptp_clock_fini,
...@@ -3677,7 +3603,6 @@ static struct mlxsw_driver mlxsw_sp1_driver = { ...@@ -3677,7 +3603,6 @@ static struct mlxsw_driver mlxsw_sp1_driver = {
.fw_filename = MLXSW_SP1_FW_FILENAME, .fw_filename = MLXSW_SP1_FW_FILENAME,
.init = mlxsw_sp1_init, .init = mlxsw_sp1_init,
.fini = mlxsw_sp_fini, .fini = mlxsw_sp_fini,
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
.port_split = mlxsw_sp_port_split, .port_split = mlxsw_sp_port_split,
.port_unsplit = mlxsw_sp_port_unsplit, .port_unsplit = mlxsw_sp_port_unsplit,
.sb_pool_get = mlxsw_sp_sb_pool_get, .sb_pool_get = mlxsw_sp_sb_pool_get,
...@@ -3717,7 +3642,6 @@ static struct mlxsw_driver mlxsw_sp2_driver = { ...@@ -3717,7 +3642,6 @@ static struct mlxsw_driver mlxsw_sp2_driver = {
.fw_filename = MLXSW_SP2_FW_FILENAME, .fw_filename = MLXSW_SP2_FW_FILENAME,
.init = mlxsw_sp2_init, .init = mlxsw_sp2_init,
.fini = mlxsw_sp_fini, .fini = mlxsw_sp_fini,
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
.port_split = mlxsw_sp_port_split, .port_split = mlxsw_sp_port_split,
.port_unsplit = mlxsw_sp_port_unsplit, .port_unsplit = mlxsw_sp_port_unsplit,
.sb_pool_get = mlxsw_sp_sb_pool_get, .sb_pool_get = mlxsw_sp_sb_pool_get,
...@@ -3758,7 +3682,6 @@ static struct mlxsw_driver mlxsw_sp3_driver = { ...@@ -3758,7 +3682,6 @@ static struct mlxsw_driver mlxsw_sp3_driver = {
.fw_filename = MLXSW_SP3_FW_FILENAME, .fw_filename = MLXSW_SP3_FW_FILENAME,
.init = mlxsw_sp3_init, .init = mlxsw_sp3_init,
.fini = mlxsw_sp_fini, .fini = mlxsw_sp_fini,
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
.port_split = mlxsw_sp_port_split, .port_split = mlxsw_sp_port_split,
.port_unsplit = mlxsw_sp_port_unsplit, .port_unsplit = mlxsw_sp_port_unsplit,
.sb_pool_get = mlxsw_sp_sb_pool_get, .sb_pool_get = mlxsw_sp_sb_pool_get,
...@@ -3797,7 +3720,6 @@ static struct mlxsw_driver mlxsw_sp4_driver = { ...@@ -3797,7 +3720,6 @@ static struct mlxsw_driver mlxsw_sp4_driver = {
.priv_size = sizeof(struct mlxsw_sp), .priv_size = sizeof(struct mlxsw_sp),
.init = mlxsw_sp4_init, .init = mlxsw_sp4_init,
.fini = mlxsw_sp_fini, .fini = mlxsw_sp_fini,
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
.port_split = mlxsw_sp_port_split, .port_split = mlxsw_sp_port_split,
.port_unsplit = mlxsw_sp_port_unsplit, .port_unsplit = mlxsw_sp_port_unsplit,
.sb_pool_get = mlxsw_sp_sb_pool_get, .sb_pool_get = mlxsw_sp_sb_pool_get,
......
...@@ -481,6 +481,13 @@ int ...@@ -481,6 +481,13 @@ int
mlxsw_sp_port_vlan_classification_set(struct mlxsw_sp_port *mlxsw_sp_port, mlxsw_sp_port_vlan_classification_set(struct mlxsw_sp_port *mlxsw_sp_port,
bool is_8021ad_tagged, bool is_8021ad_tagged,
bool is_8021q_tagged); bool is_8021q_tagged);
static inline bool
mlxsw_sp_local_port_is_valid(struct mlxsw_sp *mlxsw_sp, u16 local_port)
{
unsigned int max_ports = mlxsw_core_max_ports(mlxsw_sp->core);
return local_port < max_ports && local_port;
}
/* spectrum_buffers.c */ /* spectrum_buffers.c */
struct mlxsw_sp_hdroom_prio { struct mlxsw_sp_hdroom_prio {
......
...@@ -77,7 +77,14 @@ static int mlxsw_sp2_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, void *priv, ...@@ -77,7 +77,14 @@ static int mlxsw_sp2_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, void *priv,
int i; int i;
int err; int err;
/* Some TCAM regions are not exposed to the host and used internally
* by the device. Allocate KVDL entries for the default actions of
* these regions to avoid the host from overwriting them.
*/
tcam->kvdl_count = _tcam->max_regions; tcam->kvdl_count = _tcam->max_regions;
if (MLXSW_CORE_RES_VALID(mlxsw_sp->core, ACL_MAX_DEFAULT_ACTIONS))
tcam->kvdl_count = MLXSW_CORE_RES_GET(mlxsw_sp->core,
ACL_MAX_DEFAULT_ACTIONS);
err = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET, err = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET,
tcam->kvdl_count, &tcam->kvdl_index); tcam->kvdl_count, &tcam->kvdl_index);
if (err) if (err)
...@@ -97,7 +104,10 @@ static int mlxsw_sp2_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, void *priv, ...@@ -97,7 +104,10 @@ static int mlxsw_sp2_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, void *priv,
goto err_afa_block_continue; goto err_afa_block_continue;
enc_actions = mlxsw_afa_block_cur_set(afa_block); enc_actions = mlxsw_afa_block_cur_set(afa_block);
for (i = 0; i < tcam->kvdl_count; i++) { /* Only write to KVDL entries used by TCAM regions exposed to the
* host.
*/
for (i = 0; i < _tcam->max_regions; i++) {
mlxsw_reg_pefa_pack(pefa_pl, tcam->kvdl_index + i, mlxsw_reg_pefa_pack(pefa_pl, tcam->kvdl_index + i,
true, enc_actions); true, enc_actions);
err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(pefa), pefa_pl); err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(pefa), pefa_pl);
......
...@@ -568,12 +568,11 @@ void mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress, ...@@ -568,12 +568,11 @@ void mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress,
u8 domain_number, u16 sequence_id, u8 domain_number, u16 sequence_id,
u64 timestamp) u64 timestamp)
{ {
unsigned int max_ports = mlxsw_core_max_ports(mlxsw_sp->core);
struct mlxsw_sp_port *mlxsw_sp_port; struct mlxsw_sp_port *mlxsw_sp_port;
struct mlxsw_sp1_ptp_key key; struct mlxsw_sp1_ptp_key key;
u8 types; u8 types;
if (WARN_ON_ONCE(local_port >= max_ports)) if (WARN_ON_ONCE(!mlxsw_sp_local_port_is_valid(mlxsw_sp, local_port)))
return; return;
mlxsw_sp_port = mlxsw_sp->ports[local_port]; mlxsw_sp_port = mlxsw_sp->ports[local_port];
if (!mlxsw_sp_port) if (!mlxsw_sp_port)
......
...@@ -2616,7 +2616,6 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp, ...@@ -2616,7 +2616,6 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
char *sfn_pl, int rec_index, char *sfn_pl, int rec_index,
bool adding) bool adding)
{ {
unsigned int max_ports = mlxsw_core_max_ports(mlxsw_sp->core);
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan; struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
struct mlxsw_sp_bridge_device *bridge_device; struct mlxsw_sp_bridge_device *bridge_device;
struct mlxsw_sp_bridge_port *bridge_port; struct mlxsw_sp_bridge_port *bridge_port;
...@@ -2630,7 +2629,7 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp, ...@@ -2630,7 +2629,7 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
mlxsw_reg_sfn_mac_unpack(sfn_pl, rec_index, mac, &fid, &local_port); mlxsw_reg_sfn_mac_unpack(sfn_pl, rec_index, mac, &fid, &local_port);
if (WARN_ON_ONCE(local_port >= max_ports)) if (WARN_ON_ONCE(!mlxsw_sp_local_port_is_valid(mlxsw_sp, local_port)))
return; return;
mlxsw_sp_port = mlxsw_sp->ports[local_port]; mlxsw_sp_port = mlxsw_sp->ports[local_port];
if (!mlxsw_sp_port) { if (!mlxsw_sp_port) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment