| From e94a861bb5989b8aeb54d6dd875a5b91be02ebcd Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 23 Sep 2021 15:30:01 +0300 |
| Subject: net/mlx5: Avoid generating event after PPS out in Real time mode |
| |
| From: Aya Levin <ayal@nvidia.com> |
| |
| [ Upstream commit 99b9a678b2e474756770900595cb09c94498bfca ] |
| |
| When in Real-time mode, HW clock is synced with the PTP daemon. Hence |
| driver should not re-calibrate the next pulse (via MTPPSE repetitive |
| events mechanism). |
| |
| This patch arms repetitive events only in free-running mode. |
| |
| Fixes: 432119de33d9 ("net/mlx5: Add cyc2time HW translation mode support") |
| Signed-off-by: Aya Levin <ayal@nvidia.com> |
| Reviewed-by: Eran Ben Elisha <eranbe@nvidia.com> |
| Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../net/ethernet/mellanox/mlx5/core/lib/clock.c | 14 ++++++-------- |
| 1 file changed, 6 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c |
| index a8c6450637da..c009ccc88df4 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c |
| @@ -472,6 +472,7 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp, |
| container_of(ptp, struct mlx5_clock, ptp_info); |
| struct mlx5_core_dev *mdev = |
| container_of(clock, struct mlx5_core_dev, clock); |
| + bool rt_mode = mlx5_real_time_mode(mdev); |
| u32 in[MLX5_ST_SZ_DW(mtpps_reg)] = {0}; |
| struct timespec64 ts; |
| u32 field_select = 0; |
| @@ -535,6 +536,9 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp, |
| if (err) |
| return err; |
| |
| + if (rt_mode) |
| + return 0; |
| + |
| return mlx5_set_mtppse(mdev, pin, 0, |
| MLX5_EVENT_MODE_REPETETIVE & on); |
| } |
| @@ -702,20 +706,14 @@ static void ts_next_sec(struct timespec64 *ts) |
| static u64 perout_conf_next_event_timer(struct mlx5_core_dev *mdev, |
| struct mlx5_clock *clock) |
| { |
| - bool rt_mode = mlx5_real_time_mode(mdev); |
| struct timespec64 ts; |
| s64 target_ns; |
| |
| - if (rt_mode) |
| - ts = mlx5_ptp_gettimex_real_time(mdev, NULL); |
| - else |
| - mlx5_ptp_gettimex(&clock->ptp_info, &ts, NULL); |
| - |
| + mlx5_ptp_gettimex(&clock->ptp_info, &ts, NULL); |
| ts_next_sec(&ts); |
| target_ns = timespec64_to_ns(&ts); |
| |
| - return rt_mode ? perout_conf_real_time(ts.tv_sec) : |
| - find_target_cycles(mdev, target_ns); |
| + return find_target_cycles(mdev, target_ns); |
| } |
| |
| static int mlx5_pps_event(struct notifier_block *nb, |
| -- |
| 2.33.0 |
| |