[PATCH] libertas: Fix re-enabling IEEE PS with WPA/WPA2

Dan Williams dcbw at redhat.com
Tue Jun 16 15:53:24 EDT 2009


On Mon, 2009-06-15 at 13:01 -0700, Andrey Yurovsky wrote:
> With IEEE PS enabled, the driver will temporarily take the device out of
> PS mode to issue commands and then re-enable PS once the commands have
> completed.  With WPA or WPA2 security, the driver fails to re-enable PS
> mode because of a check for key lengths that are always zero.
> 
> This patch removes the key lengths check (the local copy of the keys is
> not maintained) and fixes IEEE PS mode with WPA or WPA2 security.
> Tested on GSPI and SDIO interfaces with V9 firmware.

I have no idea what this code was trying to do originally (I'm pretty
sure it's a left-over from the vendor driver), but it seems like maybe
it was ensuring that the adapter did *not* return to power-save mode
until the supplicant had set the GTK?  There's a window where the GTK
won't be set, and we probably shouldn't be entering PS mode until that
window is closed.  Old sd8385 code from a Motorola phone has:

	if ((Adapter->PSMode != Wlan802_11PowerModeCAM) &&
			(Adapter->PSState == PS_STATE_FULL_POWER) &&
			(Adapter->MediaConnectStatus == 
			 WlanMediaStateConnected)) {
		if(Adapter->SecInfo.WPAEnabled
			|| Adapter->SecInfo.WPA2Enabled
		) {
			if(Adapter->IsGTK_SET == TRUE) {
				PRINTM(INFO, "EXEC_NEXT_CMD: WPA enabled and GTK_SET"
					" go back to PS_SLEEP");
				PSSleep(priv, 0);
			}
		} else
		{
			PRINTM(INFO, "EXEC_NEXT_CMD: Command PendQ is empty," 
				" go back to PS_SLEEP");
			PSSleep(priv, 0);
		}
	}

Says to me, "if WPA is enabled but the GTK hasn't been set yet, don't go
to sleep".

Does that sound like a plausible explanation of what the original bits
intended to do?  Like I said, it was inherited, but there might have
been a good reason for it.

Dan

> Signed-off-by: Andrey Yurovsky <andrey at cozybit.com>
> ---
>  drivers/net/wireless/libertas/cmd.c |   29 +++++++----------------------
>  1 files changed, 7 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
> index 01db705..5825396 100644
> --- a/drivers/net/wireless/libertas/cmd.c
> +++ b/drivers/net/wireless/libertas/cmd.c
> @@ -1782,32 +1782,17 @@ int lbs_execute_next_command(struct lbs_private *priv)
>  		lbs_deb_host("EXEC_NEXT_CMD: sending command 0x%04x\n",
>  			    le16_to_cpu(cmd->command));
>  		lbs_submit_command(priv, cmdnode);
> -	} else {
> +	} else if ((priv->psmode != LBS802_11POWERMODECAM) &&
> +		   (priv->psstate == PS_STATE_FULL_POWER) &&
> +		   ((priv->connect_status == LBS_CONNECTED) ||
> +		   (priv->mesh_connect_status == LBS_CONNECTED))) {
>  		/*
>  		 * check if in power save mode, if yes, put the device back
>  		 * to PS mode
>  		 */
> -		if ((priv->psmode != LBS802_11POWERMODECAM) &&
> -		    (priv->psstate == PS_STATE_FULL_POWER) &&
> -		    ((priv->connect_status == LBS_CONNECTED) ||
> -		    (priv->mesh_connect_status == LBS_CONNECTED))) {
> -			if (priv->secinfo.WPAenabled ||
> -			    priv->secinfo.WPA2enabled) {
> -				/* check for valid WPA group keys */
> -				if (priv->wpa_mcast_key.len ||
> -				    priv->wpa_unicast_key.len) {
> -					lbs_deb_host(
> -					       "EXEC_NEXT_CMD: WPA enabled and GTK_SET"
> -					       " go back to PS_SLEEP");
> -					lbs_ps_sleep(priv, 0);
> -				}
> -			} else {
> -				lbs_deb_host(
> -				       "EXEC_NEXT_CMD: cmdpendingq empty, "
> -				       "go back to PS_SLEEP");
> -				lbs_ps_sleep(priv, 0);
> -			}
> -		}
> +		lbs_deb_host("EXEC_NEXT_CMD: cmdpendingq empty, "
> +				"go back to PS_SLEEP");
> +		lbs_ps_sleep(priv, 0);
>  	}
>  
>  	ret = 0;




More information about the libertas-dev mailing list