forked from Minki/linux
mlxsw: spectrum: Push code getting port speed into a helper
Currently PTP code queries directly PTYS register for port speed from work scheduled upon PUDE event. Since the speed needs to be used for SPAN buffer size computation as well, push the code into a separate helper. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
794eee259e
commit
ac9cc4e250
@ -3535,6 +3535,27 @@ mlxsw_sp_port_speed_by_width_set(struct mlxsw_sp_port *mlxsw_sp_port)
|
||||
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
|
||||
}
|
||||
|
||||
int mlxsw_sp_port_speed_get(struct mlxsw_sp_port *mlxsw_sp_port, u32 *speed)
|
||||
{
|
||||
const struct mlxsw_sp_port_type_speed_ops *port_type_speed_ops;
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
char ptys_pl[MLXSW_REG_PTYS_LEN];
|
||||
u32 eth_proto_oper;
|
||||
int err;
|
||||
|
||||
port_type_speed_ops = mlxsw_sp->port_type_speed_ops;
|
||||
port_type_speed_ops->reg_ptys_eth_pack(mlxsw_sp, ptys_pl,
|
||||
mlxsw_sp_port->local_port, 0,
|
||||
false);
|
||||
err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
|
||||
if (err)
|
||||
return err;
|
||||
port_type_speed_ops->reg_ptys_eth_unpack(mlxsw_sp, ptys_pl, NULL, NULL,
|
||||
ð_proto_oper);
|
||||
*speed = port_type_speed_ops->from_ptys_speed(mlxsw_sp, eth_proto_oper);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
|
||||
bool dwrr, u8 dwrr_weight)
|
||||
|
@ -471,6 +471,7 @@ extern struct notifier_block mlxsw_sp_switchdev_notifier;
|
||||
/* spectrum.c */
|
||||
void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb,
|
||||
u8 local_port, void *priv);
|
||||
int mlxsw_sp_port_speed_get(struct mlxsw_sp_port *mlxsw_sp_port, u32 *speed);
|
||||
int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
|
||||
bool dwrr, u8 dwrr_weight);
|
||||
|
@ -1016,27 +1016,17 @@ mlxsw_sp1_ptp_port_shaper_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable)
|
||||
|
||||
static int mlxsw_sp1_ptp_port_shaper_check(struct mlxsw_sp_port *mlxsw_sp_port)
|
||||
{
|
||||
const struct mlxsw_sp_port_type_speed_ops *port_type_speed_ops;
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
char ptys_pl[MLXSW_REG_PTYS_LEN];
|
||||
u32 eth_proto_oper, speed;
|
||||
bool ptps = false;
|
||||
int err, i;
|
||||
u32 speed;
|
||||
|
||||
if (!mlxsw_sp1_ptp_hwtstamp_enabled(mlxsw_sp_port))
|
||||
return mlxsw_sp1_ptp_port_shaper_set(mlxsw_sp_port, false);
|
||||
|
||||
port_type_speed_ops = mlxsw_sp->port_type_speed_ops;
|
||||
port_type_speed_ops->reg_ptys_eth_pack(mlxsw_sp, ptys_pl,
|
||||
mlxsw_sp_port->local_port, 0,
|
||||
false);
|
||||
err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
|
||||
err = mlxsw_sp_port_speed_get(mlxsw_sp_port, &speed);
|
||||
if (err)
|
||||
return err;
|
||||
port_type_speed_ops->reg_ptys_eth_unpack(mlxsw_sp, ptys_pl, NULL, NULL,
|
||||
ð_proto_oper);
|
||||
|
||||
speed = port_type_speed_ops->from_ptys_speed(mlxsw_sp, eth_proto_oper);
|
||||
for (i = 0; i < MLXSW_SP1_PTP_SHAPER_PARAMS_LEN; i++) {
|
||||
if (mlxsw_sp1_ptp_shaper_params[i].ethtool_speed == speed) {
|
||||
ptps = true;
|
||||
|
Loading…
Reference in New Issue
Block a user