mlxsw: spectrum: Push code getting port speed into a helper
authorJiri Pirko <jiri@mellanox.com>
Mon, 20 Jan 2020 07:52:50 +0000 (09:52 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Jan 2020 12:25:45 +0000 (13:25 +0100)
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>
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c

index 8639f32..1bedf9b 100644 (file)
@@ -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,
+                                                &eth_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)
index 948ef47..6477b47 100644 (file)
@@ -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);
index 4aaaa49..34f7c35 100644 (file)
@@ -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,
-                                                &eth_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;