wifi: iwlwifi: mvm: add an option to use ptp clock for rx timestamp
authorAvraham Stern <avraham.stern@intel.com>
Mon, 27 May 2024 16:05:56 +0000 (19:05 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 29 May 2024 08:33:11 +0000 (10:33 +0200)
Add a debugfs option to use the ptp clock time for rx device
timestamps. This can be useful to e.g. synchronize multiple NICs or
reporting the timestamp in the system clock instead of gp2.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Reviewed-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240527190228.b197b4f3f9ed.I578ee916d5f517a2e3a89e890a8ea24065946427@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c

index 96c9382..879640a 100644 (file)
@@ -2441,6 +2441,9 @@ void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
        debugfs_create_file("mem", 0600, mvm->debugfs_dir, mvm,
                            &iwl_dbgfs_mem_ops);
 
+       debugfs_create_bool("rx_ts_ptp", 0600, mvm->debugfs_dir,
+                           &mvm->rx_ts_ptp);
+
        /*
         * Create a symlink with mac80211. It will be removed when mac80211
         * exists (before the opmode exists which removes the target.)
index 770a709..879fa10 100644 (file)
@@ -1309,6 +1309,9 @@ struct iwl_mvm {
        struct iwl_phy_specific_cfg phy_filters;
 #endif
 
+       /* report rx timestamp in ptp clock time */
+       bool rx_ts_ptp;
+
        unsigned long last_6ghz_passive_scan_jiffies;
        unsigned long last_reset_or_resume_time_jiffies;
 
index 2f9e225..5af169f 100644 (file)
@@ -1954,6 +1954,14 @@ static void iwl_mvm_rx_fill_status(struct iwl_mvm *mvm,
        iwl_mvm_decode_lsig(skb, phy_data);
 
        rx_status->device_timestamp = phy_data->gp2_on_air_rise;
+
+       if (mvm->rx_ts_ptp && mvm->monitor_on) {
+               u64 adj_time =
+                       iwl_mvm_ptp_get_adj_time(mvm, phy_data->gp2_on_air_rise * NSEC_PER_USEC);
+
+               rx_status->device_timestamp = div64_u64(adj_time, NSEC_PER_USEC);
+       }
+
        rx_status->freq = ieee80211_channel_to_frequency(phy_data->channel,
                                                         rx_status->band);
        iwl_mvm_get_signal_strength(mvm, rx_status, rate_n_flags,