aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-03-30 03:55:57 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-04-02 02:29:13 -0400
commit31755207afc5d5a30e3eea9e4f2a518fc5b680c1 (patch)
tree9b3388a7026669772115471a2a466c62f748da6f /drivers/net/wireless
parent874c174eb9950a62032a7c90c4a23947a2bb863d (diff)
iwlwifi: mvm: capture connection loss as part of MLME trigger
The only other way to catch these would have been to monitor the Tx deauth event, but we can send a deauth when we roam. So it would have been tricky to make sure we capture the connection losses only. Define a separate trigger for the connection losses to make it easier to catch them. Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw-file.h8
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/time-event.c6
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/utils.c24
5 files changed, 37 insertions, 5 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw-file.h b/drivers/net/wireless/iwlwifi/iwl-fw-file.h
index ee149482061f..bfdf3faa6c47 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw-file.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw-file.h
@@ -586,12 +586,14 @@ struct iwl_fw_dbg_trigger_low_rssi {
586 * @stop_tx_deauth: number of Tx deauth before to collect 586 * @stop_tx_deauth: number of Tx deauth before to collect
587 * @stop_assoc_denied: number of denied association to collect 587 * @stop_assoc_denied: number of denied association to collect
588 * @stop_assoc_timeout: number of association timeout to collect 588 * @stop_assoc_timeout: number of association timeout to collect
589 * @stop_connection_loss: number of connection loss to collect
589 * @start_auth_denied: number of denied authentication to start recording 590 * @start_auth_denied: number of denied authentication to start recording
590 * @start_auth_timeout: number of authentication timeout to start recording 591 * @start_auth_timeout: number of authentication timeout to start recording
591 * @start_rx_deauth: number of Rx deauth to start recording 592 * @start_rx_deauth: number of Rx deauth to start recording
592 * @start_tx_deauth: number of Tx deauth to start recording 593 * @start_tx_deauth: number of Tx deauth to start recording
593 * @start_assoc_denied: number of denied association to start recording 594 * @start_assoc_denied: number of denied association to start recording
594 * @start_assoc_timeout: number of association timeout to start recording 595 * @start_assoc_timeout: number of association timeout to start recording
596 * @start_connection_loss: number of connection loss to start recording
595 */ 597 */
596struct iwl_fw_dbg_trigger_mlme { 598struct iwl_fw_dbg_trigger_mlme {
597 u8 stop_auth_denied; 599 u8 stop_auth_denied;
@@ -601,7 +603,8 @@ struct iwl_fw_dbg_trigger_mlme {
601 603
602 u8 stop_assoc_denied; 604 u8 stop_assoc_denied;
603 u8 stop_assoc_timeout; 605 u8 stop_assoc_timeout;
604 __le16 reserved2; 606 u8 stop_connection_loss;
607 u8 reserved;
605 608
606 u8 start_auth_denied; 609 u8 start_auth_denied;
607 u8 start_auth_timeout; 610 u8 start_auth_timeout;
@@ -610,7 +613,8 @@ struct iwl_fw_dbg_trigger_mlme {
610 613
611 u8 start_assoc_denied; 614 u8 start_assoc_denied;
612 u8 start_assoc_timeout; 615 u8 start_assoc_timeout;
613 __le16 reserved4; 616 u8 start_connection_loss;
617 u8 reserved2;
614} __packed; 618} __packed;
615 619
616/** 620/**
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index ef78ebc23a0f..d5522a161242 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -1484,6 +1484,8 @@ int iwl_mvm_fw_dbg_collect_trig(struct iwl_mvm *mvm,
1484unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm, 1484unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
1485 struct ieee80211_vif *vif, 1485 struct ieee80211_vif *vif,
1486 bool tdls, bool cmd_q); 1486 bool tdls, bool cmd_q);
1487void iwl_mvm_connection_loss(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1488 const char *errmsg);
1487static inline bool 1489static inline bool
1488iwl_fw_dbg_trigger_vif_match(struct iwl_fw_dbg_trigger_tlv *trig, 1490iwl_fw_dbg_trigger_vif_match(struct iwl_fw_dbg_trigger_tlv *trig,
1489 struct ieee80211_vif *vif) 1491 struct ieee80211_vif *vif)
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index e656511bdbec..a08b03d58d4b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -1161,7 +1161,7 @@ static void iwl_mvm_d0i3_disconnect_iter(void *data, u8 *mac,
1161 1161
1162 if (vif->type == NL80211_IFTYPE_STATION && vif->bss_conf.assoc && 1162 if (vif->type == NL80211_IFTYPE_STATION && vif->bss_conf.assoc &&
1163 mvm->d0i3_ap_sta_id == mvmvif->ap_sta_id) 1163 mvm->d0i3_ap_sta_id == mvmvif->ap_sta_id)
1164 ieee80211_connection_loss(vif); 1164 iwl_mvm_connection_loss(mvm, vif, "D0i3");
1165} 1165}
1166 1166
1167void iwl_mvm_d0i3_enable_tx(struct iwl_mvm *mvm, __le16 *qos_seq) 1167void iwl_mvm_d0i3_enable_tx(struct iwl_mvm *mvm, __le16 *qos_seq)
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c
index 647822366fe5..fd7b0d36f9a6 100644
--- a/drivers/net/wireless/iwlwifi/mvm/time-event.c
+++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c
@@ -187,7 +187,8 @@ static bool iwl_mvm_te_check_disconnect(struct iwl_mvm *mvm,
187 return false; 187 return false;
188 if (errmsg) 188 if (errmsg)
189 IWL_ERR(mvm, "%s\n", errmsg); 189 IWL_ERR(mvm, "%s\n", errmsg);
190 ieee80211_connection_loss(vif); 190
191 iwl_mvm_connection_loss(mvm, vif, errmsg);
191 return true; 192 return true;
192} 193}
193 194
@@ -210,7 +211,8 @@ iwl_mvm_te_handle_notify_csa(struct iwl_mvm *mvm,
210 break; 211 break;
211 case NL80211_IFTYPE_STATION: 212 case NL80211_IFTYPE_STATION:
212 if (!notif->status) { 213 if (!notif->status) {
213 ieee80211_connection_loss(te_data->vif); 214 iwl_mvm_connection_loss(mvm, vif,
215 "CSA TE failed to start");
214 break; 216 break;
215 } 217 }
216 iwl_mvm_csa_client_absent(mvm, te_data->vif); 218 iwl_mvm_csa_client_absent(mvm, te_data->vif);
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
index 54e3556842c4..bc55a8b82db6 100644
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
@@ -965,3 +965,27 @@ unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
965 return mvm->cfg->base_params->wd_timeout; 965 return mvm->cfg->base_params->wd_timeout;
966 } 966 }
967} 967}
968
969void iwl_mvm_connection_loss(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
970 const char *errmsg)
971{
972 struct iwl_fw_dbg_trigger_tlv *trig;
973 struct iwl_fw_dbg_trigger_mlme *trig_mlme;
974
975 if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME))
976 goto out;
977
978 trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME);
979 trig_mlme = (void *)trig->data;
980 if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
981 goto out;
982
983 if (trig_mlme->stop_connection_loss &&
984 --trig_mlme->stop_connection_loss)
985 goto out;
986
987 iwl_mvm_fw_dbg_collect_trig(mvm, trig, "%s", errmsg);
988
989out:
990 ieee80211_connection_loss(vif);
991}