mirror of https://gitee.com/openkylin/linux.git
mlxsw: spectrum_switchdev: Do not set field when it is reserved
When configuring an FDB entry pointing to a LAG netdev (or its upper), the driver should only set the 'lag_vid' field when the FID (filtering identifier) is of 802.1D type. Extend the 802.1D FID family with an attribute indicating whether this field should be set and based on its value set the field or leave it blank. Signed-off-by: Ido Schimmel <idosch@mellanox.com> Reviewed-by: Petr Machata <petrm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4e3c7c00bb
commit
6502be9f04
|
@ -721,6 +721,7 @@ int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
struct tc_prio_qopt_offload *p);
|
struct tc_prio_qopt_offload *p);
|
||||||
|
|
||||||
/* spectrum_fid.c */
|
/* spectrum_fid.c */
|
||||||
|
bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid);
|
||||||
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
|
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
|
||||||
u16 fid_index);
|
u16 fid_index);
|
||||||
int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex);
|
int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex);
|
||||||
|
|
|
@ -98,6 +98,7 @@ struct mlxsw_sp_fid_family {
|
||||||
enum mlxsw_sp_rif_type rif_type;
|
enum mlxsw_sp_rif_type rif_type;
|
||||||
const struct mlxsw_sp_fid_ops *ops;
|
const struct mlxsw_sp_fid_ops *ops;
|
||||||
struct mlxsw_sp *mlxsw_sp;
|
struct mlxsw_sp *mlxsw_sp;
|
||||||
|
u8 lag_vid_valid:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int mlxsw_sp_sfgc_uc_packet_types[MLXSW_REG_SFGC_TYPE_MAX] = {
|
static const int mlxsw_sp_sfgc_uc_packet_types[MLXSW_REG_SFGC_TYPE_MAX] = {
|
||||||
|
@ -122,6 +123,11 @@ static const int *mlxsw_sp_packet_type_sfgc_types[] = {
|
||||||
[MLXSW_SP_FLOOD_TYPE_MC] = mlxsw_sp_sfgc_mc_packet_types,
|
[MLXSW_SP_FLOOD_TYPE_MC] = mlxsw_sp_sfgc_mc_packet_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid)
|
||||||
|
{
|
||||||
|
return fid->fid_family->lag_vid_valid;
|
||||||
|
}
|
||||||
|
|
||||||
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
|
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
|
||||||
u16 fid_index)
|
u16 fid_index)
|
||||||
{
|
{
|
||||||
|
@ -792,6 +798,7 @@ static const struct mlxsw_sp_fid_family mlxsw_sp_fid_8021d_family = {
|
||||||
.nr_flood_tables = ARRAY_SIZE(mlxsw_sp_fid_8021d_flood_tables),
|
.nr_flood_tables = ARRAY_SIZE(mlxsw_sp_fid_8021d_flood_tables),
|
||||||
.rif_type = MLXSW_SP_RIF_TYPE_FID,
|
.rif_type = MLXSW_SP_RIF_TYPE_FID,
|
||||||
.ops = &mlxsw_sp_fid_8021d_ops,
|
.ops = &mlxsw_sp_fid_8021d_ops,
|
||||||
|
.lag_vid_valid = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mlxsw_sp_fid_rfid_configure(struct mlxsw_sp_fid *fid)
|
static int mlxsw_sp_fid_rfid_configure(struct mlxsw_sp_fid *fid)
|
||||||
|
|
|
@ -2482,7 +2482,8 @@ static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp,
|
||||||
|
|
||||||
bridge_device = bridge_port->bridge_device;
|
bridge_device = bridge_port->bridge_device;
|
||||||
vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
|
vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
|
||||||
lag_vid = mlxsw_sp_port_vlan->vid;
|
lag_vid = mlxsw_sp_fid_lag_vid_valid(mlxsw_sp_port_vlan->fid) ?
|
||||||
|
mlxsw_sp_port_vlan->vid : 0;
|
||||||
|
|
||||||
do_fdb_op:
|
do_fdb_op:
|
||||||
err = mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp, lag_id, mac, fid, lag_vid,
|
err = mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp, lag_id, mac, fid, lag_vid,
|
||||||
|
|
Loading…
Reference in New Issue