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 8639f32ec4d59cec57dbf900c0eef35f9687a556..1bedf9bc0a57b1b3e73927ea4912368cecd7e3a6 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 948ef4720d402d0655ab407a157268c20ee2d676..6477b473cad7c4ce602e7b79b6e17612d7306067 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 4aaaa4937b1a72fde8057fbc1dc7baacca5dc3a5..34f7c3501b0893cb5f4055774f62456a2dbdad45 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;