diff options
author | Michal Kazior <michal.kazior@tieto.com> | 2015-02-15 09:50:40 -0500 |
---|---|---|
committer | Kalle Valo <kvalo@qca.qualcomm.com> | 2015-02-15 09:50:40 -0500 |
commit | 2c512059bb64296aca4ce99fec93c6561c52e26c (patch) | |
tree | 36214886828c41b542b0e882a2e8c4a2be65d7bf /drivers/net | |
parent | 99fc6f3adcbf8db11a233658a2beb8eedf3e2a37 (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')
-rw-r--r-- | drivers/net/wireless/ath/ath10k/mac.c | 20 |
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); |