linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save
@ 2010-03-11 21:57 Luis R. Rodriguez
  2010-03-11 21:57 ` [PATCH 1/2] mac80211: Retry null data frame for " Luis R. Rodriguez
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Luis R. Rodriguez @ 2010-03-11 21:57 UTC (permalink / raw)
  To: stable; +Cc: linville, johannes, linux-wireless, Luis R. Rodriguez

Here's a few stable fixes for mac80211/ath9k which have already
been merged upstream. We forgot to add the stable tag on them
so sending these out manually. The patches address an issue of packet
loss when going into power save mode.

The patches in this series apply to the latest 2.6.33.y but for
your convenience I have also backported the patches to the latest
2.6.32.y kernel.

The 2.6.33.y patches can be found here:

http://kernel.org/pub/linux/kernel/people/mcgrof/patches/ath9k/2010-03/33-fixes/02-mac80211-udp-ps-issue/

The 2.6.32.y patches can be found here:

http://kernel.org/pub/linux/kernel/people/mcgrof/patches/ath9k/2010-03/32-fixes/02-mac80211-udp-ps-issue/

Vivek Natarajan (2):
  mac80211: Retry null data frame for power save
  ath9k: Enable IEEE80211_HW_REPORTS_TX_ACK_STATUS flag for ath9k

 drivers/net/wireless/ath/ath9k/main.c |    1 +
 include/net/mac80211.h                |    4 ++++
 net/mac80211/ieee80211_i.h            |    1 +
 net/mac80211/mlme.c                   |   20 +++++++++++++++-----
 net/mac80211/status.c                 |   17 +++++++++++++++--
 5 files changed, 36 insertions(+), 7 deletions(-)


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] mac80211: Retry null data frame for power save
  2010-03-11 21:57 [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save Luis R. Rodriguez
@ 2010-03-11 21:57 ` Luis R. Rodriguez
  2010-03-11 21:57 ` [PATCH 2/2] ath9k: Enable IEEE80211_HW_REPORTS_TX_ACK_STATUS flag for ath9k Luis R. Rodriguez
  2010-03-29 23:09 ` [stable] [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save Greg KH
  2 siblings, 0 replies; 4+ messages in thread
From: Luis R. Rodriguez @ 2010-03-11 21:57 UTC (permalink / raw)
  To: stable
  Cc: linville, johannes, linux-wireless, Vivek Natarajan, Luis R. Rodriguez

From: Vivek Natarajan <vnatarajan@atheros.com>

commit 375177bf35efc08e1bd37bbda4cc0c8cc4db8500 upstream.

Even if the null data frame is not acked by the AP, mac80211
goes into power save. This might lead to loss of frames
from the AP.
Prevent this by restarting dynamic_ps_timer when ack is not
received for null data frames.

Cc: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Vivek Natarajan <vnatarajan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
 include/net/mac80211.h     |    4 ++++
 net/mac80211/ieee80211_i.h |    1 +
 net/mac80211/mlme.c        |   20 +++++++++++++++-----
 net/mac80211/status.c      |   17 +++++++++++++++--
 4 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 0bf3697..8f42fcf 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -926,6 +926,9 @@ enum ieee80211_tkip_key_type {
  * @IEEE80211_HW_BEACON_FILTER:
  *	Hardware supports dropping of irrelevant beacon frames to
  *	avoid waking up cpu.
+ * @IEEE80211_HW_REPORTS_TX_ACK_STATUS:
+ *	Hardware can provide ack status reports of Tx frames to
+ *	the stack.
  */
 enum ieee80211_hw_flags {
 	IEEE80211_HW_HAS_RATE_CONTROL			= 1<<0,
@@ -943,6 +946,7 @@ enum ieee80211_hw_flags {
 	IEEE80211_HW_SUPPORTS_DYNAMIC_PS		= 1<<12,
 	IEEE80211_HW_MFP_CAPABLE			= 1<<13,
 	IEEE80211_HW_BEACON_FILTER			= 1<<14,
+	IEEE80211_HW_REPORTS_TX_ACK_STATUS		= 1<<15,
 };
 
 /**
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 91dc863..3521c17 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -264,6 +264,7 @@ enum ieee80211_sta_flags {
 	IEEE80211_STA_DISABLE_11N	= BIT(4),
 	IEEE80211_STA_CSA_RECEIVED	= BIT(5),
 	IEEE80211_STA_MFP_ENABLED	= BIT(6),
+	IEEE80211_STA_NULLFUNC_ACKED	= BIT(7),
 };
 
 /* flags for MLME request */
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 05a18f4..add45ae 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -661,8 +661,11 @@ static void ieee80211_enable_ps(struct ieee80211_local *local,
 	} else {
 		if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
 			ieee80211_send_nullfunc(local, sdata, 1);
-		conf->flags |= IEEE80211_CONF_PS;
-		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
+
+		if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) {
+			conf->flags |= IEEE80211_CONF_PS;
+			ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
+		}
 	}
 }
 
@@ -753,6 +756,7 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
 		container_of(work, struct ieee80211_local,
 			     dynamic_ps_enable_work);
 	struct ieee80211_sub_if_data *sdata = local->ps_sdata;
+	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 
 	/* can only happen when PS was just disabled anyway */
 	if (!sdata)
@@ -761,11 +765,16 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
 	if (local->hw.conf.flags & IEEE80211_CONF_PS)
 		return;
 
-	if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
+	if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
+	    (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)))
 		ieee80211_send_nullfunc(local, sdata, 1);
 
-	local->hw.conf.flags |= IEEE80211_CONF_PS;
-	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
+	if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) ||
+	    (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) {
+		ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED;
+		local->hw.conf.flags |= IEEE80211_CONF_PS;
+		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
+	}
 }
 
 void ieee80211_dynamic_ps_timer(unsigned long data)
@@ -2467,6 +2476,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
 	list_add(&wk->list, &ifmgd->work_list);
 
 	ifmgd->flags &= ~IEEE80211_STA_DISABLE_11N;
+	ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED;
 
 	for (i = 0; i < req->crypto.n_ciphers_pairwise; i++)
 		if (req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP40 ||
diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index d78f36c..f5abeec 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -165,6 +165,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
 	rcu_read_lock();
 
 	sband = local->hw.wiphy->bands[info->band];
+	fc = hdr->frame_control;
 
 	sta = sta_info_get(local, hdr->addr1);
 
@@ -180,8 +181,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
 			return;
 		}
 
-		fc = hdr->frame_control;
-
 		if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) &&
 		    (ieee80211_is_data_qos(fc))) {
 			u16 tid, ssn;
@@ -246,6 +245,20 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
 			local->dot11FailedCount++;
 	}
 
+	if (ieee80211_is_nullfunc(fc) && ieee80211_has_pm(fc) &&
+	    (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) &&
+	    !(info->flags & IEEE80211_TX_CTL_INJECTED) &&
+	    local->ps_sdata && !(local->scanning)) {
+		if (info->flags & IEEE80211_TX_STAT_ACK) {
+			local->ps_sdata->u.mgd.flags |=
+					IEEE80211_STA_NULLFUNC_ACKED;
+			ieee80211_queue_work(&local->hw,
+					&local->dynamic_ps_enable_work);
+		} else
+			mod_timer(&local->dynamic_ps_timer, jiffies +
+					msecs_to_jiffies(10));
+	}
+
 	/* this was a transmitted frame, but now we want to reuse it */
 	skb_orphan(skb);
 
-- 
1.6.3.3


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] ath9k: Enable IEEE80211_HW_REPORTS_TX_ACK_STATUS flag for ath9k
  2010-03-11 21:57 [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save Luis R. Rodriguez
  2010-03-11 21:57 ` [PATCH 1/2] mac80211: Retry null data frame for " Luis R. Rodriguez
@ 2010-03-11 21:57 ` Luis R. Rodriguez
  2010-03-29 23:09 ` [stable] [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save Greg KH
  2 siblings, 0 replies; 4+ messages in thread
From: Luis R. Rodriguez @ 2010-03-11 21:57 UTC (permalink / raw)
  To: stable
  Cc: linville, johannes, linux-wireless, Vivek Natarajan, Luis R. Rodriguez

From: Vivek Natarajan <vnatarajan@atheros.com>

commit 05df49865be08b30e7ba91b9d3d94d7d52dd3033 upstream.

Signed-off-by: Vivek Natarajan <vnatarajan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
 drivers/net/wireless/ath/ath9k/main.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 806c9ce..5b6d451 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1853,6 +1853,7 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
 		IEEE80211_HW_SIGNAL_DBM |
 		IEEE80211_HW_SUPPORTS_PS |
 		IEEE80211_HW_PS_NULLFUNC_STACK |
+		IEEE80211_HW_REPORTS_TX_ACK_STATUS |
 		IEEE80211_HW_SPECTRUM_MGMT;
 
 	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)
-- 
1.6.3.3


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [stable] [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save
  2010-03-11 21:57 [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save Luis R. Rodriguez
  2010-03-11 21:57 ` [PATCH 1/2] mac80211: Retry null data frame for " Luis R. Rodriguez
  2010-03-11 21:57 ` [PATCH 2/2] ath9k: Enable IEEE80211_HW_REPORTS_TX_ACK_STATUS flag for ath9k Luis R. Rodriguez
@ 2010-03-29 23:09 ` Greg KH
  2 siblings, 0 replies; 4+ messages in thread
From: Greg KH @ 2010-03-29 23:09 UTC (permalink / raw)
  To: Luis R. Rodriguez; +Cc: stable, johannes, linux-wireless, linville

On Thu, Mar 11, 2010 at 04:57:01PM -0500, Luis R. Rodriguez wrote:
> Here's a few stable fixes for mac80211/ath9k which have already
> been merged upstream. We forgot to add the stable tag on them
> so sending these out manually. The patches address an issue of packet
> loss when going into power save mode.
> 
> The patches in this series apply to the latest 2.6.33.y but for
> your convenience I have also backported the patches to the latest
> 2.6.32.y kernel.
> 
> The 2.6.33.y patches can be found here:
> 
> http://kernel.org/pub/linux/kernel/people/mcgrof/patches/ath9k/2010-03/33-fixes/02-mac80211-udp-ps-issue/
> 
> The 2.6.32.y patches can be found here:
> 
> http://kernel.org/pub/linux/kernel/people/mcgrof/patches/ath9k/2010-03/32-fixes/02-mac80211-udp-ps-issue/

Now queued up.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-03-29 23:14 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-11 21:57 [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save Luis R. Rodriguez
2010-03-11 21:57 ` [PATCH 1/2] mac80211: Retry null data frame for " Luis R. Rodriguez
2010-03-11 21:57 ` [PATCH 2/2] ath9k: Enable IEEE80211_HW_REPORTS_TX_ACK_STATUS flag for ath9k Luis R. Rodriguez
2010-03-29 23:09 ` [stable] [PATCH 0/2] mac80211: stable fixes for UDP packet loss when enabling power save Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).