summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAshutosh Kumar <askuma@codeaurora.org>2017-06-12 17:33:11 +0530
committerAshutosh Kumar <askuma@codeaurora.org>2017-06-15 14:01:56 +0530
commit5753a503cbdbfdfd2606dc725b50e893d80927c4 (patch)
tree4eb094f3dfc7d6c11886e39957cbf87fb79d9060
parentf19eadaabed4e671d0843ddd1bb72fbd530cd9db (diff)
ath10k: Send vdev down if association to bss fails
If host driver fails to send WMI_VDEV_DOWN_CMDID, firmware will drop further packets as vdev TX PAUSE reset is done as part of VDEV_DOWN. Send vdev down to firmware if STA fails to associate. CRs-Fixed: 2061161 Change-Id: Ie26645389dcb839758ff6aa55812172beeccc171 Signed-off-by: Ashutosh Kumar <askuma@codeaurora.org>
-rw-r--r--drivers/net/wireless/ath/ath10k/core.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c9
2 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index 01d5ecc4f6b8..244f8d8bfbc2 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -958,6 +958,7 @@ struct ath10k {
struct fw_flag *fw_flags;
/* set for bmi chip sets */
bool is_bmi;
+ enum ieee80211_sta_state sta_state;
/* must be last */
u8 drv_priv[0] __aligned(sizeof(void *));
};
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index b9d08b4b4cc5..03c7ae8a3924 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -5924,6 +5924,9 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
new_state == IEEE80211_STA_NOTEXIST))
cancel_work_sync(&arsta->update_wk);
+ if (vif->type == NL80211_IFTYPE_STATION && new_state > ar->sta_state)
+ ar->sta_state = new_state;
+
mutex_lock(&ar->conf_mutex);
if (old_state == IEEE80211_STA_NOTEXIST &&
@@ -7392,8 +7395,9 @@ ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
ctx, arvif->vdev_id);
WARN_ON(!arvif->is_started);
-
- if (vif->type == NL80211_IFTYPE_MONITOR) {
+ if (vif->type == NL80211_IFTYPE_MONITOR ||
+ (vif->type == NL80211_IFTYPE_STATION &&
+ ar->sta_state < IEEE80211_STA_ASSOC)) {
WARN_ON(!arvif->is_up);
ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
@@ -7409,6 +7413,7 @@ ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
ath10k_warn(ar, "failed to stop vdev %i: %d\n",
arvif->vdev_id, ret);
+ ar->sta_state = IEEE80211_STA_NOTEXIST;
arvif->is_started = false;
mutex_unlock(&ar->conf_mutex);