[PATCH 1/4] libertas: remove auto_deep_sleep functionality

Dan Williams dcbw at redhat.com
Wed Jul 20 12:03:49 EDT 2011


On Tue, 2011-07-19 at 19:33 -0700, Bing Zhao wrote:
> Hi Daniel,
> 
> > > To enable deep sleep mode:
> > > iwconfig wlan0 power period 0
> > >
> > > To enable auto deep sleep mode with idle time period set to 5 seconds:
> > > iwconfig wlan0 power period 5
> > >
> > > To disable deep sleep/auto deep sleep mode:
> > > iwconfig wlan0 power period -1
> > 
> > Paul pointed out that indeed, in old kernels, this functionality was
> > hooked up to the power wireless extension.
> > 
> > In recent kernels, this is not the case - its not hooked up to
> > anything. The commands you write above will fail.
> 
> Yeah. I didn't know that the entire wext has been removed from libertas.
> 
> Anyway, for users who need this feature we can add a module parameter to enable it with the patch below. Please let me know what you think.

I'd rather we figure out some nl80211/cfg80211 knob for this rather than
a module parameter; we can certainly add calls and attributes to nl80211
if we need to.

Dan

> Thanks,
> Bing
> 
> ---
> drivers/net/wireless/libertas/dev.h  |    2 +-
>  drivers/net/wireless/libertas/main.c |   50 +++++++++++++++-------------------
>  2 files changed, 23 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
> index 76d018b..472a5e3 100644
> --- a/drivers/net/wireless/libertas/dev.h
> +++ b/drivers/net/wireless/libertas/dev.h
> @@ -77,7 +77,7 @@ struct lbs_private {
>  	int is_auto_deep_sleep_enabled;
>  	int wakeup_dev_required;
>  	int is_activity_detected;
> -	int auto_deep_sleep_timeout; /* in ms */
> +	int auto_deep_sleep_timeout; /* in seconds */
>  	wait_queue_head_t ds_awake_q;
>  	struct timer_list auto_deepsleep_timer;
>  
> diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
> index a839de0..cc8c1b5 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -40,6 +40,11 @@ unsigned int lbs_disablemesh;
>  EXPORT_SYMBOL_GPL(lbs_disablemesh);
>  module_param_named(libertas_disablemesh, lbs_disablemesh, int, 0644);
>  
> +static unsigned int lbs_auto_deep_sleep;	/* in seconds */
> +module_param_named(libertas_auto_deep_sleep, lbs_auto_deep_sleep, int, 0644);
> +MODULE_PARM_DESC(libertas_auto_deep_sleep,
> +		"timeout value for auto deep sleep timer (default 0: disabled");
> +
>  
>  /*
>   * This global structure is used to send the confirm_sleep command as
> @@ -680,36 +685,10 @@ static void auto_deepsleep_timer_fn(unsigned long data)
>  		}
>  	}
>  	mod_timer(&priv->auto_deepsleep_timer , jiffies +
> -				(priv->auto_deep_sleep_timeout * HZ)/1000);
> +					priv->auto_deep_sleep_timeout * HZ);
>  	lbs_deb_leave(LBS_DEB_CMD);
>  }
>  
> -int lbs_enter_auto_deep_sleep(struct lbs_private *priv)
> -{
> -	lbs_deb_enter(LBS_DEB_SDIO);
> -
> -	priv->is_auto_deep_sleep_enabled = 1;
> -	if (priv->is_deep_sleep)
> -		priv->wakeup_dev_required = 1;
> -	mod_timer(&priv->auto_deepsleep_timer ,
> -			jiffies + (priv->auto_deep_sleep_timeout * HZ)/1000);
> -
> -	lbs_deb_leave(LBS_DEB_SDIO);
> -	return 0;
> -}
> -
> -int lbs_exit_auto_deep_sleep(struct lbs_private *priv)
> -{
> -	lbs_deb_enter(LBS_DEB_SDIO);
> -
> -	priv->is_auto_deep_sleep_enabled = 0;
> -	priv->auto_deep_sleep_timeout = 0;
> -	del_timer(&priv->auto_deepsleep_timer);
> -
> -	lbs_deb_leave(LBS_DEB_SDIO);
> -	return 0;
> -}
> -
>  static int lbs_init_adapter(struct lbs_private *priv)
>  {
>  	int ret;
> @@ -725,7 +704,15 @@ static int lbs_init_adapter(struct lbs_private *priv)
>  	priv->psmode = LBS802_11POWERMODECAM;
>  	priv->psstate = PS_STATE_FULL_POWER;
>  	priv->is_deep_sleep = 0;
> -	priv->is_auto_deep_sleep_enabled = 0;
> +
> +	if (lbs_auto_deep_sleep > 0) {
> +		priv->is_auto_deep_sleep_enabled = 1;
> +		priv->auto_deep_sleep_timeout = lbs_auto_deep_sleep;
> +	} else {
> +		priv->is_auto_deep_sleep_enabled = 0;
> +		priv->auto_deep_sleep_timeout = 0;
> +	}
> +
>  	priv->deep_sleep_required = 0;
>  	priv->wakeup_dev_required = 0;
>  	init_waitqueue_head(&priv->ds_awake_q);
> @@ -963,6 +950,13 @@ int lbs_start_card(struct lbs_private *priv)
>  
>  	lbs_debugfs_init_one(priv, dev);
>  
> +	/* Start the timer if auto deep sleep is enabled */
> +	if (priv->is_auto_deep_sleep_enabled && priv->auto_deep_sleep_timeout) {
> +		priv->is_activity_detected = 0;
> +		mod_timer(&priv->auto_deepsleep_timer,
> +			jiffies + priv->auto_deep_sleep_timeout * HZ);
> +	}
> +
>  	netdev_info(dev, "Marvell WLAN 802.11 adapter\n");
>  
>  	ret = 0;
> ---
> 





More information about the libertas-dev mailing list