linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/1] mac80211: tell driver when dtim change detected
@ 2010-01-21 20:31 wey-yi.w.guy
  2010-01-21 20:44 ` Johannes Berg
  0 siblings, 1 reply; 3+ messages in thread
From: wey-yi.w.guy @ 2010-01-21 20:31 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Wey-Yi Guy

From: Wey-Yi Guy <wey-yi.w.guy@intel.com>

In current implementation, mac80211 send dtim_period update to driver
during association, but if no NetworkManager or similar application perform
scan operation, plus tim_ie is not part of probe response; mac80211 will not
get beacon with dtim information later, then  mac80211 will not pass the
information to driver for update.

Call ieee80211_hw_config() with IEEE80211_CONF_CHANGE_PS flag set to
allow driver make correct dtim adjustment if dtim_period change
detected. Also perform recalc_ps operation if needed.

Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
v2: move the function to ieee80211_rx_bss_info() to make sure only call
    when needed
---
 net/mac80211/mlme.c |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 1e1d16c..1cc1b5b 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1157,6 +1157,23 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
 }
 
 
+static void ieee80211_update_dtim(struct ieee80211_sub_if_data *sdata,
+				  struct ieee80211_local *local,
+				  struct ieee80211_bss *bss)
+{
+	if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
+		return;
+
+	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
+	    sdata->vif.bss_conf.dtim_period != bss->dtim_period) {
+		sdata->vif.bss_conf.dtim_period = bss->dtim_period;
+		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
+		mutex_lock(&local->iflist_mtx);
+		ieee80211_recalc_ps(local, -1);
+		mutex_unlock(&local->iflist_mtx);
+	}
+}
+
 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
 				  struct ieee80211_mgmt *mgmt,
 				  size_t len,
@@ -1181,8 +1198,10 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
 
 	bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems,
 					channel, beacon);
-	if (bss)
+	if (bss) {
 		ieee80211_rx_bss_put(local, bss);
+		ieee80211_update_dtim(sdata, local, bss);
+	}
 
 	if (!sdata->u.mgd.associated)
 		return;
-- 
1.5.6.3


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2 1/1] mac80211: tell driver when dtim change detected
  2010-01-21 20:31 [PATCH v2 1/1] mac80211: tell driver when dtim change detected wey-yi.w.guy
@ 2010-01-21 20:44 ` Johannes Berg
  2010-01-21 21:31   ` Guy, Wey-Yi
  0 siblings, 1 reply; 3+ messages in thread
From: Johannes Berg @ 2010-01-21 20:44 UTC (permalink / raw)
  To: wey-yi.w.guy; +Cc: linux-wireless

[-- Attachment #1: Type: text/plain, Size: 863 bytes --]

On Thu, 2010-01-21 at 12:31 -0800, wey-yi.w.guy@intel.com wrote:

> --- a/net/mac80211/mlme.c
> +++ b/net/mac80211/mlme.c

This is all in mlme.c, so ...

> +static void ieee80211_update_dtim(struct ieee80211_sub_if_data *sdata,
> +				  struct ieee80211_local *local,
> +				  struct ieee80211_bss *bss)
> +{
> +	if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
> +		return;
> +
> +	if (sdata->vif.type == NL80211_IFTYPE_STATION &&

I don't think you need this check?

> +	    sdata->vif.bss_conf.dtim_period != bss->dtim_period) {
> +		sdata->vif.bss_conf.dtim_period = bss->dtim_period;
> +		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
> +		mutex_lock(&local->iflist_mtx);
> +		ieee80211_recalc_ps(local, -1);
> +		mutex_unlock(&local->iflist_mtx);

And afaict recalc_ps() will call hw_config() if appropriate.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2 1/1] mac80211: tell driver when dtim change detected
  2010-01-21 20:44 ` Johannes Berg
@ 2010-01-21 21:31   ` Guy, Wey-Yi
  0 siblings, 0 replies; 3+ messages in thread
From: Guy, Wey-Yi @ 2010-01-21 21:31 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org

On Thu, 2010-01-21 at 12:44 -0800, Johannes Berg wrote:
> On Thu, 2010-01-21 at 12:31 -0800, wey-yi.w.guy@intel.com wrote:
> 
> > --- a/net/mac80211/mlme.c
> > +++ b/net/mac80211/mlme.c
> 
> This is all in mlme.c, so ...
> 
> > +static void ieee80211_update_dtim(struct ieee80211_sub_if_data *sdata,
> > +				  struct ieee80211_local *local,
> > +				  struct ieee80211_bss *bss)
> > +{
> > +	if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
> > +		return;
> > +
> > +	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
> 
> I don't think you need this check?

yes, that make sense.

> 
> > +	    sdata->vif.bss_conf.dtim_period != bss->dtim_period) {
> > +		sdata->vif.bss_conf.dtim_period = bss->dtim_period;
> > +		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
> > +		mutex_lock(&local->iflist_mtx);
> > +		ieee80211_recalc_ps(local, -1);
> > +		mutex_unlock(&local->iflist_mtx);
> 
> And afaict recalc_ps() will call hw_config() if appropriate.
> 
That is the part I am not sure, so I call the hw_config manually, since
you confirm hw_config will happen, then there is no point to call first

I will make those changes and submit again

Wey



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-01-21 21:35 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-21 20:31 [PATCH v2 1/1] mac80211: tell driver when dtim change detected wey-yi.w.guy
2010-01-21 20:44 ` Johannes Berg
2010-01-21 21:31   ` Guy, Wey-Yi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).