Lines Matching +full:scaled +full:- +full:sync

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
7 #include "iwl-debug.h"
12 /* The scaled_ppm parameter is ppm (parts per million) with a 16-bit fractional
14 * 2^-16 ppm, and 2^16=65536 is 1 ppm.
24 *gp2 = iwl_read_prph(mld->trans, mld->trans->mac_cfg->base->gp2_reg_addr); in iwl_mld_get_systime()
27 return -EINVAL; in iwl_mld_get_systime()
35 mld->ptp_data.last_gp2, gp2); in iwl_mld_ptp_update_new_read()
40 if (gp2 < mld->ptp_data.last_gp2) { in iwl_mld_ptp_update_new_read()
41 if (mld->ptp_data.last_gp2 - gp2 < in iwl_mld_ptp_update_new_read()
45 gp2, mld->ptp_data.last_gp2); in iwl_mld_ptp_update_new_read()
49 mld->ptp_data.wrap_counter++; in iwl_mld_ptp_update_new_read()
52 mld->ptp_data.wrap_counter); in iwl_mld_ptp_update_new_read()
55 mld->ptp_data.last_gp2 = gp2; in iwl_mld_ptp_update_new_read()
56 schedule_delayed_work(&mld->ptp_data.dwork, IWL_PTP_WRAP_TIME); in iwl_mld_ptp_update_new_read()
61 struct ptp_data *data = &mld->ptp_data; in iwl_mld_ptp_get_adj_time()
62 u64 scale_time_gp2_ns = mld->ptp_data.scale_update_gp2 * NSEC_PER_USEC; in iwl_mld_ptp_get_adj_time()
67 lockdep_assert_held(&data->lock); in iwl_mld_ptp_get_adj_time()
73 (data->wrap_counter * IWL_PTP_GP2_WRAP * NSEC_PER_USEC); in iwl_mld_ptp_get_adj_time()
79 diff = scale_time_gp2_ns - base_time_ns; in iwl_mld_ptp_get_adj_time()
80 scaled_diff = -mul_u64_u64_div_u64(diff, in iwl_mld_ptp_get_adj_time()
81 data->scaled_freq, in iwl_mld_ptp_get_adj_time()
84 diff = base_time_ns - scale_time_gp2_ns; in iwl_mld_ptp_get_adj_time()
86 data->scaled_freq, in iwl_mld_ptp_get_adj_time()
94 res = data->scale_update_adj_time_ns + data->delta + scaled_diff; in iwl_mld_ptp_get_adj_time()
97 (unsigned long long)data->scale_update_adj_time_ns, in iwl_mld_ptp_get_adj_time()
98 (long long)data->delta, (unsigned long long)res); in iwl_mld_ptp_get_adj_time()
107 struct ptp_data *data = &mld->ptp_data; in iwl_mld_ptp_gettime()
113 return -EIO; in iwl_mld_ptp_gettime()
116 spin_lock_bh(&data->lock); in iwl_mld_ptp_gettime()
118 spin_unlock_bh(&data->lock); in iwl_mld_ptp_gettime()
128 struct ptp_data *data = &mld->ptp_data; in iwl_mld_ptp_adjtime()
130 spin_lock_bh(&data->lock); in iwl_mld_ptp_adjtime()
131 data->delta += delta; in iwl_mld_ptp_adjtime()
133 (long long)data->delta); in iwl_mld_ptp_adjtime()
134 spin_unlock_bh(&data->lock); in iwl_mld_ptp_adjtime()
142 struct ptp_data *data = &mld->ptp_data; in iwl_mld_ptp_adjfine()
146 * data->scale_update_gp2 or data->scaled_freq since in iwl_mld_ptp_adjfine()
151 return -EBUSY; in iwl_mld_ptp_adjfine()
154 spin_lock_bh(&data->lock); in iwl_mld_ptp_adjfine()
155 data->scale_update_adj_time_ns = in iwl_mld_ptp_adjfine()
157 data->scale_update_gp2 = gp2; in iwl_mld_ptp_adjfine()
160 * wrap_counter and the previous scaled frequency. Thus delta and in iwl_mld_ptp_adjfine()
164 data->delta = 0; in iwl_mld_ptp_adjfine()
165 data->wrap_counter = 0; in iwl_mld_ptp_adjfine()
166 data->scaled_freq = PTP_SCALE_FACTOR + scaled_ppm; in iwl_mld_ptp_adjfine()
168 scaled_ppm, (unsigned long long)data->scaled_freq); in iwl_mld_ptp_adjfine()
169 spin_unlock_bh(&data->lock); in iwl_mld_ptp_adjfine()
177 struct ptp_data *data = &mld->ptp_data; in iwl_mld_ptp_work()
180 spin_lock_bh(&data->lock); in iwl_mld_ptp_work()
185 spin_unlock_bh(&data->lock); in iwl_mld_ptp_work()
205 wiphy_lock(mld->wiphy); in iwl_mld_get_crosstimestamp_fw()
207 wiphy_unlock(mld->wiphy); in iwl_mld_get_crosstimestamp_fw()
216 return -EIO; in iwl_mld_get_crosstimestamp_fw()
219 resp = (void *)pkt->data; in iwl_mld_get_crosstimestamp_fw()
221 gp2_10ns = (u64)le32_to_cpu(resp->gp2_timestamp_hi) << 32 | in iwl_mld_get_crosstimestamp_fw()
222 le32_to_cpu(resp->gp2_timestamp_lo); in iwl_mld_get_crosstimestamp_fw()
225 *sys_time = (u64)le32_to_cpu(resp->platform_timestamp_hi) << 32 | in iwl_mld_get_crosstimestamp_fw()
226 le32_to_cpu(resp->platform_timestamp_lo); in iwl_mld_get_crosstimestamp_fw()
238 struct ptp_data *data = &mld->ptp_data; in iwl_mld_phc_get_crosstimestamp()
257 spin_lock_bh(&data->lock); in iwl_mld_phc_get_crosstimestamp()
259 spin_unlock_bh(&data->lock); in iwl_mld_phc_get_crosstimestamp()
262 "Got Sync Time: GP2:%u, last_GP2: %u, GP2_ns: %lld, sys_time: %lld\n", in iwl_mld_phc_get_crosstimestamp()
263 gp2, mld->ptp_data.last_gp2, gp2_ns, (s64)sys_time); in iwl_mld_phc_get_crosstimestamp()
266 xtstamp->device = ns_to_ktime(gp2_ns); in iwl_mld_phc_get_crosstimestamp()
267 xtstamp->sys_realtime = sys_time; in iwl_mld_phc_get_crosstimestamp()
274 if (WARN_ON(mld->ptp_data.ptp_clock)) in iwl_mld_ptp_init()
277 spin_lock_init(&mld->ptp_data.lock); in iwl_mld_ptp_init()
278 INIT_DELAYED_WORK(&mld->ptp_data.dwork, iwl_mld_ptp_work); in iwl_mld_ptp_init()
280 mld->ptp_data.ptp_clock_info.owner = THIS_MODULE; in iwl_mld_ptp_init()
281 mld->ptp_data.ptp_clock_info.gettime64 = iwl_mld_ptp_gettime; in iwl_mld_ptp_init()
282 mld->ptp_data.ptp_clock_info.max_adj = 0x7fffffff; in iwl_mld_ptp_init()
283 mld->ptp_data.ptp_clock_info.adjtime = iwl_mld_ptp_adjtime; in iwl_mld_ptp_init()
284 mld->ptp_data.ptp_clock_info.adjfine = iwl_mld_ptp_adjfine; in iwl_mld_ptp_init()
285 mld->ptp_data.scaled_freq = PTP_SCALE_FACTOR; in iwl_mld_ptp_init()
286 mld->ptp_data.ptp_clock_info.getcrosststamp = in iwl_mld_ptp_init()
290 snprintf(mld->ptp_data.ptp_clock_info.name, in iwl_mld_ptp_init()
291 sizeof(mld->ptp_data.ptp_clock_info.name), in iwl_mld_ptp_init()
292 "%s", "iwlwifi-PTP"); in iwl_mld_ptp_init()
294 mld->ptp_data.ptp_clock = in iwl_mld_ptp_init()
295 ptp_clock_register(&mld->ptp_data.ptp_clock_info, mld->dev); in iwl_mld_ptp_init()
297 if (IS_ERR_OR_NULL(mld->ptp_data.ptp_clock)) { in iwl_mld_ptp_init()
299 PTR_ERR(mld->ptp_data.ptp_clock)); in iwl_mld_ptp_init()
300 mld->ptp_data.ptp_clock = NULL; in iwl_mld_ptp_init()
303 mld->ptp_data.ptp_clock_info.name, in iwl_mld_ptp_init()
304 ptp_clock_index(mld->ptp_data.ptp_clock)); in iwl_mld_ptp_init()
310 if (mld->ptp_data.ptp_clock) { in iwl_mld_ptp_remove()
312 mld->ptp_data.ptp_clock_info.name, in iwl_mld_ptp_remove()
313 ptp_clock_index(mld->ptp_data.ptp_clock)); in iwl_mld_ptp_remove()
315 ptp_clock_unregister(mld->ptp_data.ptp_clock); in iwl_mld_ptp_remove()
316 mld->ptp_data.ptp_clock = NULL; in iwl_mld_ptp_remove()
317 mld->ptp_data.last_gp2 = 0; in iwl_mld_ptp_remove()
318 mld->ptp_data.wrap_counter = 0; in iwl_mld_ptp_remove()
319 cancel_delayed_work_sync(&mld->ptp_data.dwork); in iwl_mld_ptp_remove()