From 10f6269592186c73d9007f5fdb05c97572c3f521 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 29 Mar 2010 16:14:58 -0700 Subject: [PATCH] .32 patches --- ...reports_tx_ack_status-flag-for-ath9k.patch | 26 ++++ ...fault-state-handling-on-of-platforms.patch | 56 +++++++ ...11-reset-dynamic-ps-timer-in-rx-path.patch | 50 +++++++ ...retry-null-data-frame-for-power-save.patch | 141 ++++++++++++++++++ queue-2.6.32/series | 4 + 5 files changed, 277 insertions(+) create mode 100644 queue-2.6.32/ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch create mode 100644 queue-2.6.32/leds-gpio-fix-default-state-handling-on-of-platforms.patch create mode 100644 queue-2.6.32/mac80211-reset-dynamic-ps-timer-in-rx-path.patch create mode 100644 queue-2.6.32/mac80211-retry-null-data-frame-for-power-save.patch 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 index 00000000000..2a83c9fb819 --- /dev/null +++ b/queue-2.6.32/ath9k-enable-ieee80211_hw_reports_tx_ack_status-flag-for-ath9k.patch @@ -0,0 +1,26 @@ +From 8042534c7328e3bec7dd412d06b3f497b56c994e 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 + +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 +@@ -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 index 00000000000..f8baccea29e --- /dev/null +++ b/queue-2.6.32/leds-gpio-fix-default-state-handling-on-of-platforms.patch @@ -0,0 +1,56 @@ +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 + +--- 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 index 00000000000..6bfd2e1abbb --- /dev/null +++ b/queue-2.6.32/mac80211-reset-dynamic-ps-timer-in-rx-path.patch @@ -0,0 +1,50 @@ +From 9f8c23d92427424a0f4fc888bada60b9ac90c0d7 Mon Sep 17 00:00:00 2001 +From: Vivek Natarajan +Date: Thu, 11 Mar 2010 14:54:34 -0800 +Subject: mac80211: Reset dynamic ps timer in Rx path. + +From: Vivek Natarajan + +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 +Signed-off-by: John W. Linville +Signed-off-by: Luis R. Rodriguez +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..c0ba5562757 --- /dev/null +++ b/queue-2.6.32/mac80211-retry-null-data-frame-for-power-save.patch @@ -0,0 +1,141 @@ +From c0dbaef59605988b8832d066cb0eedfe30afa319 Mon Sep 17 00:00:00 2001 +From: Vivek Natarajan +Date: Thu, 11 Mar 2010 13:10:03 -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/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 || diff --git a/queue-2.6.32/series b/queue-2.6.32/series index 1207f2789cc..88bb6a49941 100644 --- a/queue-2.6.32/series +++ b/queue-2.6.32/series @@ -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 -- 2.47.3