From: Greg Kroah-Hartman Date: Mon, 29 Mar 2010 23:14:19 +0000 (-0700) Subject: .33 patches X-Git-Tag: v2.6.27.46~15 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b86d107fca2e272775869edead0b1722b861ff25;p=thirdparty%2Fkernel%2Fstable-queue.git .33 patches --- 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 index 00000000000..3f4156cdac8 --- /dev/null +++ b/queue-2.6.33/ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch @@ -0,0 +1,28 @@ +From d7d538737dc4d7607bb49cc59d727b9dc8d1daad Mon Sep 17 00:00:00 2001 +From: Vivek Natarajan +Date: Thu, 11 Mar 2010 13:03:01 -0800 +Subject: ath9k: Enable IEEE80211_HW_REPORTS_TX_ACK_STATUS flag for ath9k + +From: Vivek Natarajan + +commit 05df49865be08b30e7ba91b9d3d94d7d52dd3033 upstream. + +Signed-off-by: Vivek Natarajan +Signed-off-by: John W. Linville +Signed-off-by: Luis R. Rodriguez +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..5c4a15308d6 --- /dev/null +++ b/queue-2.6.33/leds-gpio-fix-default-state-handling-on-of-platforms.patch @@ -0,0 +1,60 @@ +From 0493a4ff10959ff4c8e0d65efee25b7ffd4fa5db Mon Sep 17 00:00:00 2001 +From: Anton Vorontsov +Date: Thu, 11 Mar 2010 13:58:47 -0800 +Subject: leds-gpio: fix default state handling on OF platforms + +From: Anton Vorontsov + +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 +Signed-off-by: Andrew Morton +Signed-off-by: Richard Purdie +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..3833e3e665e --- /dev/null +++ b/queue-2.6.33/mac80211-retry-null-data-frame-for-power-save.patch @@ -0,0 +1,150 @@ +From 0b33099894fb007bf4ddf4cf845f9c1acabf4dae Mon Sep 17 00:00:00 2001 +From: Vivek Natarajan +Date: Thu, 11 Mar 2010 12:59:53 -0800 +Subject: mac80211: Retry null data frame for power save + +From: Vivek Natarajan + +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 +Signed-off-by: Vivek Natarajan +Signed-off-by: John W. Linville +Signed-off-by: Luis R. Rodriguez +Signed-off-by: Greg Kroah-Hartman + +--- + 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); + diff --git a/queue-2.6.33/series b/queue-2.6.33/series index c95d446ec80..8f5f93acfd5 100644 --- a/queue-2.6.33/series +++ b/queue-2.6.33/series @@ -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