summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-02-10 15:26:57 +0200
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-03-02 08:20:31 +0200
commit5a756c20c44fe8b41d8adce090a2cdc95f10ab49 (patch)
tree1903a7a89975885ef6808f42f75b9e0d809c3d15 /drivers/net/wireless/iwlwifi/mvm
parent945d4202d95ed75c4af2968a02e58625d0558896 (diff)
downloadop-kernel-dev-5a756c20c44fe8b41d8adce090a2cdc95f10ab49.zip
op-kernel-dev-5a756c20c44fe8b41d8adce090a2cdc95f10ab49.tar.gz
iwlwifi: mvm: add trigger for firmware dump upon statistics
It can be very useful to monitor the statistics and trigger a firmware dump when a certain value hits a certain offset. Since the statistics are huge, add a generic trigger. When the DWORD at offset X reaches value Y. Since there is another trigger before this one I can't add right now because of a dependency on mac80211, add a reserved entry to keep the enum in place. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rx.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/rx.c b/drivers/net/wireless/iwlwifi/mvm/rx.c
index b86ff66..9b2c537 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rx.c
@@ -508,6 +508,34 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
}
}
+static inline void
+iwl_mvm_rx_stats_check_trigger(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt)
+{
+ struct iwl_fw_dbg_trigger_tlv *trig;
+ struct iwl_fw_dbg_trigger_stats *trig_stats;
+ u32 trig_offset, trig_thold;
+
+ if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_STATS))
+ return;
+
+ trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_STATS);
+ trig_stats = (void *)trig->data;
+
+ if (!iwl_fw_dbg_trigger_check_stop(mvm, NULL, trig))
+ return;
+
+ trig_offset = le32_to_cpu(trig_stats->stop_offset);
+ trig_thold = le32_to_cpu(trig_stats->stop_threshold);
+
+ if (WARN_ON_ONCE(trig_offset >= iwl_rx_packet_payload_len(pkt)))
+ return;
+
+ if (le32_to_cpup((__le32 *) (pkt->data + trig_offset)) < trig_thold)
+ return;
+
+ iwl_mvm_fw_dbg_collect_trig(mvm, trig, NULL, 0);
+}
+
void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
struct iwl_rx_packet *pkt)
{
@@ -553,6 +581,8 @@ void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
iwl_mvm_update_rx_statistics(mvm, &stats->rx);
}
+ iwl_mvm_rx_stats_check_trigger(mvm, pkt);
+
/* Only handle rx statistics temperature changes if async temp
* notifications are not supported
*/
OpenPOWER on IntegriCloud