|
@@ -62,10 +62,11 @@ static void mlx5e_timestamp_overflow(struct work_struct *work)
|
|
|
struct delayed_work *dwork = to_delayed_work(work);
|
|
|
struct mlx5e_tstamp *tstamp = container_of(dwork, struct mlx5e_tstamp,
|
|
|
overflow_work);
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
- write_lock(&tstamp->lock);
|
|
|
+ write_lock_irqsave(&tstamp->lock, flags);
|
|
|
timecounter_read(&tstamp->clock);
|
|
|
- write_unlock(&tstamp->lock);
|
|
|
+ write_unlock_irqrestore(&tstamp->lock, flags);
|
|
|
schedule_delayed_work(&tstamp->overflow_work, tstamp->overflow_period);
|
|
|
}
|
|
|
|
|
@@ -136,10 +137,11 @@ static int mlx5e_ptp_settime(struct ptp_clock_info *ptp,
|
|
|
struct mlx5e_tstamp *tstamp = container_of(ptp, struct mlx5e_tstamp,
|
|
|
ptp_info);
|
|
|
u64 ns = timespec64_to_ns(ts);
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
- write_lock(&tstamp->lock);
|
|
|
+ write_lock_irqsave(&tstamp->lock, flags);
|
|
|
timecounter_init(&tstamp->clock, &tstamp->cycles, ns);
|
|
|
- write_unlock(&tstamp->lock);
|
|
|
+ write_unlock_irqrestore(&tstamp->lock, flags);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -150,10 +152,11 @@ static int mlx5e_ptp_gettime(struct ptp_clock_info *ptp,
|
|
|
struct mlx5e_tstamp *tstamp = container_of(ptp, struct mlx5e_tstamp,
|
|
|
ptp_info);
|
|
|
u64 ns;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
- write_lock(&tstamp->lock);
|
|
|
+ write_lock_irqsave(&tstamp->lock, flags);
|
|
|
ns = timecounter_read(&tstamp->clock);
|
|
|
- write_unlock(&tstamp->lock);
|
|
|
+ write_unlock_irqrestore(&tstamp->lock, flags);
|
|
|
|
|
|
*ts = ns_to_timespec64(ns);
|
|
|
|
|
@@ -164,10 +167,11 @@ static int mlx5e_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
|
|
|
{
|
|
|
struct mlx5e_tstamp *tstamp = container_of(ptp, struct mlx5e_tstamp,
|
|
|
ptp_info);
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
- write_lock(&tstamp->lock);
|
|
|
+ write_lock_irqsave(&tstamp->lock, flags);
|
|
|
timecounter_adjtime(&tstamp->clock, delta);
|
|
|
- write_unlock(&tstamp->lock);
|
|
|
+ write_unlock_irqrestore(&tstamp->lock, flags);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -176,6 +180,7 @@ static int mlx5e_ptp_adjfreq(struct ptp_clock_info *ptp, s32 delta)
|
|
|
{
|
|
|
u64 adj;
|
|
|
u32 diff;
|
|
|
+ unsigned long flags;
|
|
|
int neg_adj = 0;
|
|
|
struct mlx5e_tstamp *tstamp = container_of(ptp, struct mlx5e_tstamp,
|
|
|
ptp_info);
|
|
@@ -189,11 +194,11 @@ static int mlx5e_ptp_adjfreq(struct ptp_clock_info *ptp, s32 delta)
|
|
|
adj *= delta;
|
|
|
diff = div_u64(adj, 1000000000ULL);
|
|
|
|
|
|
- write_lock(&tstamp->lock);
|
|
|
+ write_lock_irqsave(&tstamp->lock, flags);
|
|
|
timecounter_read(&tstamp->clock);
|
|
|
tstamp->cycles.mult = neg_adj ? tstamp->nominal_c_mult - diff :
|
|
|
tstamp->nominal_c_mult + diff;
|
|
|
- write_unlock(&tstamp->lock);
|
|
|
+ write_unlock_irqrestore(&tstamp->lock, flags);
|
|
|
|
|
|
return 0;
|
|
|
}
|