Skip to contentSkip to conversation

carl9170: fix frame delivery if sta is in powersave mode

PATCH New Christian Lamparter 1 participant 1 message Feb 27, 2012 CARL9170 Linux community wireless driver

lore
Share & tools
lore

Christian Lamparter

author maintainer
#0 lore raw

PATCH 1/1 carl9170: fix frame delivery if sta is in powersave mode

Nicolas Cavallari discovered that carl9170 has some serious problems delivering data to sleeping stations.

It turns out that the driver was not honoring two important flags (IEEE80211_TX_CTL_NO_PS_BUFFER and IEEE80211_TX_CTL_CLEAR_PS_FILT) which are set on frames that should be sent although the receiving station is still in powersave mode.

---
John, to make your life a little bit easier, I rebased my patch on top of Johannes'
[PATCH] mac80211: handle non-bufferable MMPDUs correctly.

changes:

	IEEE80211_TX_CTL_POLL_RESPONSE was renamed to
	IEEE80211_TX_CTL_NO_PS_BUFFER (johannes patch)
---
 drivers/net/wireless/ath/carl9170/tx.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/carl9170/tx.c +5 -3
index 8d52ddd..aed3051 100644
@@ -1236,6 +1236,7 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb)
 {
 	struct ieee80211_sta *sta;
 	struct carl9170_sta_info *sta_info;
+	struct ieee80211_tx_info *tx_info;
 
 	rcu_read_lock();
 	sta = __carl9170_get_tx_sta(ar, skb);
@@ -1243,12 +1244,13 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb)
 		goto out_rcu;
 
 	sta_info = (void *) sta->drv_priv;
-	if (unlikely(sta_info->sleeping)) {
-		struct ieee80211_tx_info *tx_info;
+	tx_info = IEEE80211_SKB_CB(skb);
 
+	if (unlikely(sta_info->sleeping) &&
+	    !(tx_info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER |
+				IEEE80211_TX_CTL_CLEAR_PS_FILT))) {
 		rcu_read_unlock();
 
-		tx_info = IEEE80211_SKB_CB(skb);
 		if (tx_info->flags & IEEE80211_TX_CTL_AMPDU)
 			atomic_dec(&ar->tx_ampdu_upload);
 
Signature · 1 line
1.7.9.1