From patchwork Thu Feb 4 06:54:01 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivek Natarajan X-Patchwork-Id: 76906 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o146sGu2007427 for ; Thu, 4 Feb 2010 06:54:16 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753559Ab0BDGyM (ORCPT ); Thu, 4 Feb 2010 01:54:12 -0500 Received: from mail.atheros.com ([12.36.123.2]:58241 "EHLO mail.atheros.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753516Ab0BDGyL (ORCPT ); Thu, 4 Feb 2010 01:54:11 -0500 Received: from mail.atheros.com ([10.10.20.105]) by sidewinder.atheros.com for ; Wed, 03 Feb 2010 22:54:11 -0800 Received: from smtp.atheros.com (10.12.4.60) by SC1EXHC-01.global.atheros.com (10.10.20.111) with Microsoft SMTP Server (TLS) id 8.0.751.0; Wed, 3 Feb 2010 22:54:09 -0800 Received: by smtp.atheros.com (sSMTP sendmail emulation); Thu, 04 Feb 2010 12:24:06 +0530 From: Vivek Natarajan To: CC: Vivek Natarajan Subject: [RFC PATCH 1/2] mac80211: Retry null data frame for power save. Date: Thu, 4 Feb 2010 12:24:01 +0530 Message-ID: <1265266442-6273-1-git-send-email-vnatarajan@atheros.com> X-Mailer: git-send-email 1.6.3.3 MIME-Version: 1.0 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Thu, 04 Feb 2010 06:54:16 +0000 (UTC) diff --git a/net/mac80211/status.c b/net/mac80211/status.c index e57ad6b..a0e18b4 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c @@ -188,6 +188,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; for_each_sta_info(local, hdr->addr1, sta, tmp) { /* skip wrong virtual interface */ @@ -205,8 +206,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; @@ -275,6 +274,18 @@ 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.conf.flags & IEEE80211_CONF_PS)) { + if (!(info->flags & IEEE80211_TX_STAT_ACK)) { + ieee80211_stop_queues_by_reason(&local->hw, + IEEE80211_QUEUE_STOP_REASON_PS); + ieee80211_queue_work(&local->hw, + &local->dynamic_ps_disable_work); + 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);