Skip to content

Commit

Permalink
wl12xx: add forced_ps mode
Browse files Browse the repository at this point in the history
For certain WiFi certification tests forcing PS
is necessary. Since DPS is now enabled in the FW
and this can't be achieved by using netlatency
this required a new config option.

Signed-off-by: Eyal Shapira <eyal@wizery.com>
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
  • Loading branch information
Eyal Shapira authored and Luciano Coelho committed Feb 15, 2012
1 parent 59a10c6 commit 5c0dc2f
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 13 deletions.
6 changes: 6 additions & 0 deletions drivers/net/wireless/wl12xx/conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -942,6 +942,12 @@ struct conf_conn_settings {
*/
u16 dynamic_ps_timeout;

/*
* Specifies whether dynamic PS should be disabled and PSM forced.
* This is required for certain WiFi certification tests.
*/
u8 forced_ps;

/*
*
* Specifies the interval of the connection keep-alive null-func
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/wl12xx/debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ static ssize_t dynamic_ps_timeout_write(struct file *file,
*/

wl12xx_for_each_wlvif_sta(wl, wlvif) {
if (test_bit(WLVIF_FLAG_IN_AUTO_PS, &wlvif->flags))
if (test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags))
wl1271_ps_set_mode(wl, wlvif, STATION_AUTO_PS_MODE);
}

Expand Down
25 changes: 19 additions & 6 deletions drivers/net/wireless/wl12xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ static struct conf_drv_settings default_conf = {
.psm_exit_retries = 16,
.psm_entry_nullfunc_retries = 3,
.dynamic_ps_timeout = 100,
.forced_ps = false,
.keep_alive_interval = 55000,
.max_listen_interval = 20,
},
Expand Down Expand Up @@ -2510,17 +2511,29 @@ static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,

if ((conf->flags & IEEE80211_CONF_PS) &&
test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
!test_bit(WLVIF_FLAG_IN_AUTO_PS, &wlvif->flags)) {
!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {

wl1271_debug(DEBUG_PSM, "auto ps enabled");
int ps_mode;
char *ps_mode_str;

if (wl->conf.conn.forced_ps) {
ps_mode = STATION_POWER_SAVE_MODE;
ps_mode_str = "forced";
} else {
ps_mode = STATION_AUTO_PS_MODE;
ps_mode_str = "auto";
}

wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str);

ret = wl1271_ps_set_mode(wl, wlvif, ps_mode);

ret = wl1271_ps_set_mode(wl, wlvif,
STATION_AUTO_PS_MODE);
if (ret < 0)
wl1271_warning("enter auto ps failed %d", ret);
wl1271_warning("enter %s ps failed %d",
ps_mode_str, ret);

} else if (!(conf->flags & IEEE80211_CONF_PS) &&
test_bit(WLVIF_FLAG_IN_AUTO_PS, &wlvif->flags)) {
test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {

wl1271_debug(DEBUG_PSM, "auto ps disabled");

Expand Down
10 changes: 5 additions & 5 deletions drivers/net/wireless/wl12xx/ps.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void wl1271_elp_work(struct work_struct *work)
if (wlvif->bss_type == BSS_TYPE_AP_BSS)
goto out;

if (!test_bit(WLVIF_FLAG_IN_AUTO_PS, &wlvif->flags) &&
if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) &&
test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags))
goto out;
}
Expand Down Expand Up @@ -84,7 +84,7 @@ void wl1271_ps_elp_sleep(struct wl1271 *wl)
if (wlvif->bss_type == BSS_TYPE_AP_BSS)
return;

if (!test_bit(WLVIF_FLAG_IN_AUTO_PS, &wlvif->flags) &&
if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) &&
test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags))
return;
}
Expand Down Expand Up @@ -167,6 +167,7 @@ int wl1271_ps_set_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,

switch (mode) {
case STATION_AUTO_PS_MODE:
case STATION_POWER_SAVE_MODE:
wl1271_debug(DEBUG_PSM, "entering psm (mode=%d,timeout=%u)",
mode, timeout);

Expand All @@ -182,7 +183,7 @@ int wl1271_ps_set_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
if (ret < 0)
return ret;

set_bit(WLVIF_FLAG_IN_AUTO_PS, &wlvif->flags);
set_bit(WLVIF_FLAG_IN_PS, &wlvif->flags);

/* enable beacon early termination. Not relevant for 5GHz */
if (wlvif->band == IEEE80211_BAND_2GHZ) {
Expand All @@ -205,9 +206,8 @@ int wl1271_ps_set_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
if (ret < 0)
return ret;

clear_bit(WLVIF_FLAG_IN_AUTO_PS, &wlvif->flags);
clear_bit(WLVIF_FLAG_IN_PS, &wlvif->flags);
break;
case STATION_POWER_SAVE_MODE:
default:
wl1271_warning("trying to set ps to unsupported mode %d", mode);
ret = -EINVAL;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/wl12xx/wl12xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ enum wl12xx_vif_flags {
WLVIF_FLAG_STA_ASSOCIATED,
WLVIF_FLAG_IBSS_JOINED,
WLVIF_FLAG_AP_STARTED,
WLVIF_FLAG_IN_AUTO_PS,
WLVIF_FLAG_IN_PS,
WLVIF_FLAG_STA_STATE_SENT,
WLVIF_FLAG_RX_STREAMING_STARTED,
WLVIF_FLAG_PSPOLL_FAILURE,
Expand Down

0 comments on commit 5c0dc2f

Please sign in to comment.