From: Eran Ben Elisha <era...@mellanox.com>

[ Upstream commit 88c8cf92db48b2e359fe3051ad8e09829c1bee5d ]

On PTP mlx5_ptp_enable(on=0) flow, driver mistakenly used channel index
as pin index.

After ptp patch marked in fixes tag was introduced, driver can freely
call ptp_find_pin() as part of the .enable() callback.

Fix driver mlx5_ptp_enable(on=0) flow to always use ptp_find_pin(). With
that, Driver will use the correct pin index in mlx5_ptp_enable(on=0) flow.

In addition, when initializing the pins, always set channel to zero. As
all pins can be attached to all channels, let ptp_set_pinfunc() to move
them between the channels.

For stable branches, this fix to be applied only on kernels that includes
both patches in fixes tag. Otherwise, mlx5_ptp_enable(on=0) will be stuck
on pincfg_mux.

Fixes: 62582a7ee783 ("ptp: Avoid deadlocks in the programmable pin code.")
Fixes: ee7f12205abc ("net/mlx5e: Implement 1PPS support")
Signed-off-by: Eran Ben Elisha <era...@mellanox.com>
Reviewed-by: Ariel Levkovich <lar...@mellanox.com>
Signed-off-by: Saeed Mahameed <sae...@mellanox.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 .../ethernet/mellanox/mlx5/core/lib/clock.c   | 21 +++++++++----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c 
b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c
index 43f97601b5000..b88c6456d2154 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c
@@ -252,17 +252,17 @@ static int mlx5_extts_configure(struct ptp_clock_info 
*ptp,
        if (rq->extts.index >= clock->ptp_info.n_pins)
                return -EINVAL;
 
+       pin = ptp_find_pin(clock->ptp, PTP_PF_EXTTS, rq->extts.index);
+       if (pin < 0)
+               return -EBUSY;
+
        if (on) {
-               pin = ptp_find_pin(clock->ptp, PTP_PF_EXTTS, rq->extts.index);
-               if (pin < 0)
-                       return -EBUSY;
                pin_mode = MLX5_PIN_MODE_IN;
                pattern = !!(rq->extts.flags & PTP_FALLING_EDGE);
                field_select = MLX5_MTPPS_FS_PIN_MODE |
                               MLX5_MTPPS_FS_PATTERN |
                               MLX5_MTPPS_FS_ENABLE;
        } else {
-               pin = rq->extts.index;
                field_select = MLX5_MTPPS_FS_ENABLE;
        }
 
@@ -310,12 +310,12 @@ static int mlx5_perout_configure(struct ptp_clock_info 
*ptp,
        if (rq->perout.index >= clock->ptp_info.n_pins)
                return -EINVAL;
 
-       if (on) {
-               pin = ptp_find_pin(clock->ptp, PTP_PF_PEROUT,
-                                  rq->perout.index);
-               if (pin < 0)
-                       return -EBUSY;
+       pin = ptp_find_pin(clock->ptp, PTP_PF_PEROUT,
+                          rq->perout.index);
+       if (pin < 0)
+               return -EBUSY;
 
+       if (on) {
                pin_mode = MLX5_PIN_MODE_OUT;
                pattern = MLX5_OUT_PATTERN_PERIODIC;
                ts.tv_sec = rq->perout.period.sec;
@@ -341,7 +341,6 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp,
                               MLX5_MTPPS_FS_ENABLE |
                               MLX5_MTPPS_FS_TIME_STAMP;
        } else {
-               pin = rq->perout.index;
                field_select = MLX5_MTPPS_FS_ENABLE;
        }
 
@@ -431,7 +430,7 @@ static int mlx5_init_pin_config(struct mlx5_clock *clock)
                         "mlx5_pps%d", i);
                clock->ptp_info.pin_config[i].index = i;
                clock->ptp_info.pin_config[i].func = PTP_PF_NONE;
-               clock->ptp_info.pin_config[i].chan = i;
+               clock->ptp_info.pin_config[i].chan = 0;
        }
 
        return 0;
-- 
2.25.1



Reply via email to