示例#1
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");

        /*
         * 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;
}
示例#2
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;
}
示例#3
0
int wl1251_hw_init_power_auth(struct wl1251 *wl)
{
	return wl1251_acx_sleep_auth(wl, WL1251_PSM_CAM);
}
示例#4
0
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;
}