aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorMichal Kazior <michal.kazior@tieto.com>2015-02-15 09:50:40 -0500
committerKalle Valo <kvalo@qca.qualcomm.com>2015-02-15 09:50:40 -0500
commit2c512059bb64296aca4ce99fec93c6561c52e26c (patch)
tree36214886828c41b542b0e882a2e8c4a2be65d7bf /drivers/net/wireless
parent99fc6f3adcbf8db11a233658a2beb8eedf3e2a37 (diff)
ath10k: defer AP self-peer removal wait
Some firmware revisions don't notify host about self-bss-peer removal until after associated vdev is deleted. This has been observed with qca6174 WLAN.RM.2.0-00073 firmware. This patch fixes AP teardown slowdowns and prevents delays and warnings: ath10k_pci 0000:00:05.0: failed to remove peer for AP vdev 0: -110 ath10k_pci 0000:00:05.0: removing stale peer xx:xx:xx:xx:xx:xx from vdev_id 0 ath10k_pci 0000:00:05.0: peer-unmap-event: unknown peer id 24 ath10k_pci 0000:00:05.0: peer-unmap-event: unknown peer id 8 Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 68659380705c..a367450ec611 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -3332,9 +3332,10 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
3332 list_del(&arvif->list); 3332 list_del(&arvif->list);
3333 3333
3334 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { 3334 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3335 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr); 3335 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
3336 vif->addr);
3336 if (ret) 3337 if (ret)
3337 ath10k_warn(ar, "failed to remove peer for AP vdev %i: %d\n", 3338 ath10k_warn(ar, "failed to submit AP self-peer removal on vdev %i: %d\n",
3338 arvif->vdev_id, ret); 3339 arvif->vdev_id, ret);
3339 3340
3340 kfree(arvif->u.ap.noa_data); 3341 kfree(arvif->u.ap.noa_data);
@@ -3348,6 +3349,21 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
3348 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n", 3349 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
3349 arvif->vdev_id, ret); 3350 arvif->vdev_id, ret);
3350 3351
3352 /* Some firmware revisions don't notify host about self-peer removal
3353 * until after associated vdev is deleted.
3354 */
3355 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3356 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
3357 vif->addr);
3358 if (ret)
3359 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
3360 arvif->vdev_id, ret);
3361
3362 spin_lock_bh(&ar->data_lock);
3363 ar->num_peers--;
3364 spin_unlock_bh(&ar->data_lock);
3365 }
3366
3351 ath10k_peer_cleanup(ar, arvif->vdev_id); 3367 ath10k_peer_cleanup(ar, arvif->vdev_id);
3352 3368
3353 mutex_unlock(&ar->conf_mutex); 3369 mutex_unlock(&ar->conf_mutex);