]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
.32 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Mon, 29 Mar 2010 23:14:58 +0000 (16:14 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 29 Mar 2010 23:14:58 +0000 (16:14 -0700)
queue-2.6.32/ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch [new file with mode: 0644]
queue-2.6.32/leds-gpio-fix-default-state-handling-on-of-platforms.patch [new file with mode: 0644]
queue-2.6.32/mac80211-reset-dynamic-ps-timer-in-rx-path.patch [new file with mode: 0644]
queue-2.6.32/mac80211-retry-null-data-frame-for-power-save.patch [new file with mode: 0644]
queue-2.6.32/series

diff --git a/queue-2.6.32/ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch b/queue-2.6.32/ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch
new file mode 100644 (file)
index 0000000..2a83c9f
--- /dev/null
@@ -0,0 +1,26 @@
+From 8042534c7328e3bec7dd412d06b3f497b56c994e Mon Sep 17 00:00:00 2001
+From: Vivek Natarajan <vnatarajan@atheros.com>
+Date: Thu, 11 Mar 2010 13:03:01 -0800
+Subject: ath9k: Enable IEEE80211_HW_REPORTS_TX_ACK_STATUS flag for ath9k
+
+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>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/ath/ath9k/main.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -1544,6 +1544,7 @@ void ath_set_hw_capab(struct ath_softc *
+               IEEE80211_HW_AMPDU_AGGREGATION |
+               IEEE80211_HW_SUPPORTS_PS |
+               IEEE80211_HW_PS_NULLFUNC_STACK |
++              IEEE80211_HW_REPORTS_TX_ACK_STATUS |
+               IEEE80211_HW_SPECTRUM_MGMT;
+       if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || modparam_nohwcrypt)
diff --git a/queue-2.6.32/leds-gpio-fix-default-state-handling-on-of-platforms.patch b/queue-2.6.32/leds-gpio-fix-default-state-handling-on-of-platforms.patch
new file mode 100644 (file)
index 0000000..f8bacce
--- /dev/null
@@ -0,0 +1,56 @@
+From 0493a4ff10959ff4c8e0d65efee25b7ffd4fa5db Mon Sep 17 00:00:00 2001
+From: Anton Vorontsov <avorontsov@ru.mvista.com>
+Date: Thu, 11 Mar 2010 13:58:47 -0800
+Subject: leds-gpio: fix default state handling on OF platforms
+
+From: Anton Vorontsov <avorontsov@ru.mvista.com>
+
+commit 0493a4ff10959ff4c8e0d65efee25b7ffd4fa5db upstream.
+
+The driver wrongly sets default state for LEDs that don't specify
+default-state property.
+
+Currently the driver handles default state this way:
+
+memset(&led, 0, sizeof(led));
+for_each_child_of_node(np, child) {
+       state = of_get_property(child, "default-state", NULL);
+       if (state) {
+               if (!strcmp(state, "keep"))
+                       led.default_state = LEDS_GPIO_DEFSTATE_KEEP;
+               ...
+       }
+       ret = create_gpio_led(&led, ...);
+}
+
+Which means that all LEDs that do not specify default-state will inherit
+the last value of the default-state property, which is wrong.
+
+This patch fixes the issue by moving LED's template initialization into
+the loop body.
+
+Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+--- a/drivers/leds/leds-gpio.c
++++ b/drivers/leds/leds-gpio.c
+@@ -211,7 +211,6 @@ static int __devinit of_gpio_leds_probe(struct of_device *ofdev,
+                                       const struct of_device_id *match)
+ {
+       struct device_node *np = ofdev->node, *child;
+-      struct gpio_led led;
+       struct gpio_led_of_platform_data *pdata;
+       int count = 0, ret;
+@@ -226,8 +225,8 @@ static int __devinit of_gpio_leds_probe(struct of_device *ofdev,
+       if (!pdata)
+               return -ENOMEM;
+-      memset(&led, 0, sizeof(led));
+       for_each_child_of_node(np, child) {
++              struct gpio_led led = {};
+               enum of_gpio_flags flags;
+               const char *state;
diff --git a/queue-2.6.32/mac80211-reset-dynamic-ps-timer-in-rx-path.patch b/queue-2.6.32/mac80211-reset-dynamic-ps-timer-in-rx-path.patch
new file mode 100644 (file)
index 0000000..6bfd2e1
--- /dev/null
@@ -0,0 +1,50 @@
+From 9f8c23d92427424a0f4fc888bada60b9ac90c0d7 Mon Sep 17 00:00:00 2001
+From: Vivek Natarajan <vnatarajan@atheros.com>
+Date: Thu, 11 Mar 2010 14:54:34 -0800
+Subject: mac80211: Reset dynamic ps timer in Rx path.
+
+From: Vivek Natarajan <vnatarajan@atheros.com>
+
+commit e15276a4b220c54db665cf46a92bd9ceb9aeb052 upstream.
+
+The current mac80211 implementation enables power save if there
+is no Tx traffic for a specific timeout. Hence, PS is triggered
+even if there is a continuous Rx only traffic(like UDP) going on.
+This makes the drivers to wait on the tim bit in the next beacon
+to awake which leads to redundant sleep-wake cycles.
+Fix this by restarting the dynamic ps timer on receiving every
+data packet.
+
+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>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ net/mac80211/rx.c |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -1590,6 +1590,7 @@ static ieee80211_rx_result debug_noinlin
+ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
+ {
+       struct net_device *dev = rx->dev;
++      struct ieee80211_local *local = rx->local;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
+       __le16 fc = hdr->frame_control;
+       int err;
+@@ -1612,6 +1613,13 @@ ieee80211_rx_h_data(struct ieee80211_rx_
+       dev->stats.rx_packets++;
+       dev->stats.rx_bytes += rx->skb->len;
++      if (ieee80211_is_data(hdr->frame_control) &&
++          !is_multicast_ether_addr(hdr->addr1) &&
++          local->hw.conf.dynamic_ps_timeout > 0 && local->ps_sdata) {
++              mod_timer(&local->dynamic_ps_timer, jiffies +
++                        msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout));
++      }
++
+       ieee80211_deliver_skb(rx);
+       return RX_QUEUED;
diff --git a/queue-2.6.32/mac80211-retry-null-data-frame-for-power-save.patch b/queue-2.6.32/mac80211-retry-null-data-frame-for-power-save.patch
new file mode 100644 (file)
index 0000000..c0ba556
--- /dev/null
@@ -0,0 +1,141 @@
+From c0dbaef59605988b8832d066cb0eedfe30afa319 Mon Sep 17 00:00:00 2001
+From: Vivek Natarajan <vnatarajan@atheros.com>
+Date: Thu, 11 Mar 2010 13:10:03 -0800
+Subject: mac80211: Retry null data frame for power save
+
+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>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ include/net/mac80211.h     |    4 ++++
+ net/mac80211/ieee80211_i.h |    1 +
+ net/mac80211/main.c        |   15 +++++++++++++++
+ net/mac80211/mlme.c        |   20 +++++++++++++++-----
+ 4 files changed, 35 insertions(+), 5 deletions(-)
+
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -908,6 +908,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_RX_INCLUDES_FCS                    = 1<<1,
+@@ -924,6 +927,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,
+ };
+ /**
+--- 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 */
+--- a/net/mac80211/main.c
++++ b/net/mac80211/main.c
+@@ -441,6 +441,7 @@ void ieee80211_tx_status(struct ieee8021
+       rcu_read_lock();
+       sband = local->hw.wiphy->bands[info->band];
++      fc = hdr->frame_control;
+       sta = sta_info_get(local, hdr->addr1);
+@@ -522,6 +523,20 @@ void ieee80211_tx_status(struct ieee8021
+                       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);
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -650,8 +650,11 @@ static void ieee80211_enable_ps(struct i
+       } 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);
++              }
+       }
+ }
+@@ -742,6 +745,7 @@ void ieee80211_dynamic_ps_enable_work(st
+               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)
+@@ -750,11 +754,16 @@ void ieee80211_dynamic_ps_enable_work(st
+       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)
+@@ -2458,6 +2467,7 @@ int ieee80211_mgd_assoc(struct ieee80211
+       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 ||
index 1207f2789cc4f74cc8df387c4d4d8fc5164c7886..88bb6a49941bbdc87ed9b9326a0063fd87636ba6 100644 (file)
@@ -101,3 +101,7 @@ alsa-ac97-add-ibm-thinkpad-r40e-to-headphone-line-jack-sense-blacklist.patch
 alsa-hda-use-alc260_will-quirk-for-another-acer-model-0x1025007f.patch
 ath9k-enable-tim-timer-interrupt-only-when-needed.patch
 ath9k-configure-the-beacon-only-if-the-sta-is-associated.patch
+mac80211-retry-null-data-frame-for-power-save.patch
+ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch
+mac80211-reset-dynamic-ps-timer-in-rx-path.patch
+leds-gpio-fix-default-state-handling-on-of-platforms.patch