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

diff --git a/queue-2.6.33/ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch b/queue-2.6.33/ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch
new file mode 100644 (file)
index 0000000..3f4156c
--- /dev/null
@@ -0,0 +1,28 @@
+From d7d538737dc4d7607bb49cc59d727b9dc8d1daad 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
+
+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>
+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
+@@ -1856,6 +1856,7 @@ void ath_set_hw_capab(struct ath_softc *
+               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)
diff --git a/queue-2.6.33/leds-gpio-fix-default-state-handling-on-of-platforms.patch b/queue-2.6.33/leds-gpio-fix-default-state-handling-on-of-platforms.patch
new file mode 100644 (file)
index 0000000..5c4a153
--- /dev/null
@@ -0,0 +1,60 @@
+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>
+
+---
+ drivers/leds/leds-gpio.c |    3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/drivers/leds/leds-gpio.c
++++ b/drivers/leds/leds-gpio.c
+@@ -211,7 +211,6 @@ static int __devinit of_gpio_leds_probe(
+                                       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(
+       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.33/mac80211-retry-null-data-frame-for-power-save.patch b/queue-2.6.33/mac80211-retry-null-data-frame-for-power-save.patch
new file mode 100644 (file)
index 0000000..3833e3e
--- /dev/null
@@ -0,0 +1,150 @@
+From 0b33099894fb007bf4ddf4cf845f9c1acabf4dae Mon Sep 17 00:00:00 2001
+From: Vivek Natarajan <vnatarajan@atheros.com>
+Date: Thu, 11 Mar 2010 12:59:53 -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/mlme.c        |   20 +++++++++++++++-----
+ net/mac80211/status.c      |   17 +++++++++++++++--
+ 4 files changed, 35 insertions(+), 7 deletions(-)
+
+--- 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,
+ };
+ /**
+--- 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/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -662,8 +662,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);
++              }
+       }
+ }
+@@ -754,6 +757,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)
+@@ -762,11 +766,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)
+@@ -2468,6 +2477,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 ||
+--- a/net/mac80211/status.c
++++ b/net/mac80211/status.c
+@@ -165,6 +165,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);
+@@ -180,8 +181,6 @@ void ieee80211_tx_status(struct ieee8021
+                       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 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);
index c95d446ec80ef5d25faf74ec467b1718d48f2a21..8f5f93acfd5a7822c352feaf7837b72865805c85 100644 (file)
@@ -107,3 +107,6 @@ alsa-ac97-add-toshiba-p500-to-ac97-jack-sense-blacklist.patch
 alsa-ac97-add-ibm-thinkpad-r40e-to-headphone-line-jack-sense-blacklist.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
+leds-gpio-fix-default-state-handling-on-of-platforms.patch