static int wl1251_ps_set_elp(struct wl1251 *wl, bool enable) { int ret; if (enable) { wl1251_debug(DEBUG_PSM, "sleep auth psm/elp"); ret = wl1251_acx_sleep_auth(wl, WL1251_PSM_ELP); if (ret < 0) return ret; wl1251_ps_elp_sleep(wl); } else { wl1251_debug(DEBUG_PSM, "sleep auth cam"); /* * When the target is in ELP, we can only * access the ELP control register. Thus, * we have to wake the target up before * changing the power authorization. */ wl1251_ps_elp_wakeup(wl); ret = wl1251_acx_sleep_auth(wl, WL1251_PSM_CAM); if (ret < 0) return ret; } return 0; }
static int wl1251_ps_set_elp(struct wl1251 *wl, bool enable) { int ret; if (enable) { wl1251_debug(DEBUG_PSM, "sleep auth psm/elp"); ret = wl1251_acx_sleep_auth(wl, WL1251_PSM_ELP); if (ret < 0) return ret; wl1251_ps_elp_sleep(wl); } else { wl1251_debug(DEBUG_PSM, "sleep auth cam"); wl1251_ps_elp_wakeup(wl); ret = wl1251_acx_sleep_auth(wl, WL1251_PSM_CAM); if (ret < 0) return ret; } return 0; }
int wl1251_hw_init_power_auth(struct wl1251 *wl) { return wl1251_acx_sleep_auth(wl, WL1251_PSM_CAM); }
int wl1251_ps_set_mode(struct wl1251 *wl, enum wl1251_station_mode mode) { int ret; switch (mode) { case STATION_POWER_SAVE_MODE: wl1251_debug(DEBUG_PSM, "entering psm"); if (wl->long_doze_mode != wl->long_doze_mode_set) { wl1251_acx_wake_up_conditions(wl, wl->long_doze_mode ? WAKE_UP_EVENT_DTIM_BITMAP : WAKE_UP_EVENT_BEACON_BITMAP, wl->listen_int); wl->long_doze_mode_set = wl->long_doze_mode; } #if 0 /* problems seen on one router */ ret = wl1251_acx_bet_enable(wl, WL1251_ACX_BET_ENABLE, WL1251_DEFAULT_BET_CONSECUTIVE); if (ret < 0) return ret; #endif ret = wl1251_cmd_ps_mode(wl, CHIP_POWER_SAVE_MODE); if (ret < 0) return ret; ret = wl1251_acx_sleep_auth(wl, WL1251_PSM_ELP); if (ret < 0) return ret; break; case STATION_IDLE: wl1251_debug(DEBUG_PSM, "entering idle"); ret = wl1251_acx_sleep_auth(wl, WL1251_PSM_ELP); if (ret < 0) return ret; ret = wl1251_cmd_disconnect(wl); if (ret < 0) return ret; break; case STATION_ACTIVE_MODE: default: wl1251_debug(DEBUG_PSM, "leaving psm"); ret = wl1251_acx_sleep_auth(wl, WL1251_PSM_CAM); if (ret < 0) return ret; #if 0 /* disable BET */ ret = wl1251_acx_bet_enable(wl, WL1251_ACX_BET_DISABLE, WL1251_DEFAULT_BET_CONSECUTIVE); if (ret < 0) return ret; #endif /* disable beacon filtering */ ret = wl1251_acx_beacon_filter_opt(wl, false); if (ret < 0) return ret; ret = wl1251_cmd_ps_mode(wl, CHIP_ACTIVE_MODE); if (ret < 0) return ret; break; } if (mode != wl->station_mode) wl->ps_transitioning = true; wl->station_mode = mode; wl->ps_change_jiffies = jiffies; return ret; }