diff mbox

ath10k: wake up queue upon vif creation

Message ID 1438931301-27081-1-git-send-email-michal.kazior@tieto.com (mailing list archive)
State Accepted
Headers show

Commit Message

Michal Kazior Aug. 7, 2015, 7:08 a.m. UTC
Vif's vdev_id is used as queue number. However due
to the tx pausing design in ath10k it was possible
for a new interface to be created with its tx
queue stopped (via ieee80211_stop_queues). This
could in turn leave the interface inoperable until
ath10k_mac_tx_unlock() was called.

This problem only affected multi-vif scenarios when
new interfaces were created some time later after
other interfaces have been running for some time
and had Tx queue full at some point prior.

Possible manifestation of the bug was
authentication timeout for a client vif.

Fixes: 96d828d45e16 ("ath10k: rework tx queue locking")
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
 drivers/net/wireless/ath/ath10k/mac.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Kalle Valo Aug. 17, 2015, 1:45 p.m. UTC | #1
Michal Kazior <michal.kazior@tieto.com> writes:

> Vif's vdev_id is used as queue number. However due
> to the tx pausing design in ath10k it was possible
> for a new interface to be created with its tx
> queue stopped (via ieee80211_stop_queues). This
> could in turn leave the interface inoperable until
> ath10k_mac_tx_unlock() was called.
>
> This problem only affected multi-vif scenarios when
> new interfaces were created some time later after
> other interfaces have been running for some time
> and had Tx queue full at some point prior.
>
> Possible manifestation of the bug was
> authentication timeout for a client vif.
>
> Fixes: 96d828d45e16 ("ath10k: rework tx queue locking")
> Signed-off-by: Michal Kazior <michal.kazior@tieto.com>

Thanks, applied.
diff mbox

Patch

diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index acd222f3b899..03e498cb64b4 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -4299,6 +4299,11 @@  static int ath10k_add_interface(struct ieee80211_hw *hw,
 		}
 	}
 
+	spin_lock_bh(&ar->htt.tx_lock);
+	if (!ar->tx_paused)
+		ieee80211_wake_queue(ar->hw, arvif->vdev_id);
+	spin_unlock_bh(&ar->htt.tx_lock);
+
 	mutex_unlock(&ar->conf_mutex);
 	return 0;