summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGolan Ben-Ami <golan.ben.ami@intel.com>2015-11-25 11:44:57 +0200
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2016-01-07 19:01:28 +0200
commita977a1507ce133201ac2f11b3fbf102a73a77244 (patch)
tree65c9c6ad1272b0df9acbd01918958dcca6ae8676
parent976f15a8ef53144731f7e431c9498aff9392c9cb (diff)
downloadlinux-stable-a977a1507ce133201ac2f11b3fbf102a73a77244.tar.gz
linux-stable-a977a1507ce133201ac2f11b3fbf102a73a77244.tar.bz2
linux-stable-a977a1507ce133201ac2f11b3fbf102a73a77244.zip
iwlwifi: mvm: add a non-trigger window to fw dbg triggers
Allow the user to configure a non-trigger session - a window between triggers in which the driver won't collect fw debug data. This can be useful when the frequent collection of fw data has an impact on the performance, such as debugging tx flows. Signed-off-by: Golan Ben-Ami <golan.ben.ami@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
-rw-r--r--drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h5
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.h24
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mvm.h3
3 files changed, 31 insertions, 1 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h b/drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h
index 8d37e330f153..84f8aeb926c8 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h
@@ -557,6 +557,8 @@ enum iwl_fw_dbg_trigger_vif_type {
* @start_conf_id: if mode is %IWL_FW_DBG_TRIGGER_START, this defines what
* configuration should be applied when the triggers kicks in.
* @occurrences: number of occurrences. 0 means the trigger will never fire.
+ * @trig_dis_ms: the time, in milliseconds, after an occurrence of this
+ * trigger in which another occurrence should be ignored.
*/
struct iwl_fw_dbg_trigger_tlv {
__le32 id;
@@ -566,7 +568,8 @@ struct iwl_fw_dbg_trigger_tlv {
u8 mode;
u8 start_conf_id;
__le16 occurrences;
- __le32 reserved[2];
+ __le16 trig_dis_ms;
+ __le16 reserved[3];
u8 data[0];
} __packed;
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.h
index 461acdf497dc..08148b258bc5 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.h
@@ -118,6 +118,24 @@ iwl_fw_dbg_trigger_stop_conf_match(struct iwl_mvm *mvm,
}
static inline bool
+iwl_fw_dbg_no_trig_window(struct iwl_mvm *mvm,
+ struct iwl_fw_dbg_trigger_tlv *trig)
+{
+ unsigned long wind_jiff =
+ msecs_to_jiffies(le16_to_cpu(trig->trig_dis_ms));
+ u32 id = le32_to_cpu(trig->id);
+
+ /* If this is the first event checked, jump to update start ts */
+ if (mvm->fw_dbg_non_collect_ts_start[id] &&
+ (time_after(mvm->fw_dbg_non_collect_ts_start[id] + wind_jiff,
+ jiffies)))
+ return true;
+
+ mvm->fw_dbg_non_collect_ts_start[id] = jiffies;
+ return false;
+}
+
+static inline bool
iwl_fw_dbg_trigger_check_stop(struct iwl_mvm *mvm,
struct ieee80211_vif *vif,
struct iwl_fw_dbg_trigger_tlv *trig)
@@ -125,6 +143,12 @@ iwl_fw_dbg_trigger_check_stop(struct iwl_mvm *mvm,
if (vif && !iwl_fw_dbg_trigger_vif_match(trig, vif))
return false;
+ if (iwl_fw_dbg_no_trig_window(mvm, trig)) {
+ IWL_WARN(mvm, "Trigger %d occurred while no-collect window.\n",
+ trig->id);
+ return false;
+ }
+
return iwl_fw_dbg_trigger_stop_conf_match(mvm, trig);
}
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index 287c16250570..7517dc13eb86 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -658,6 +658,9 @@ struct iwl_mvm {
/* max number of simultaneous scans the FW supports */
unsigned int max_scans;
+ /* ts of the beginning of a non-collect fw dbg data period */
+ unsigned long fw_dbg_non_collect_ts_start[FW_DBG_TRIGGER_MAX - 1];
+
/* UMAC scan tracking */
u32 scan_uid_status[IWL_MVM_MAX_UMAC_SCANS];