Ejemplo n.º 1
0
int wl1251_ps_set_mode(struct wl1251 *wl, enum wl1251_cmd_ps_mode mode)
{
    int ret;

    switch (mode) {
    case STATION_POWER_SAVE_MODE:
        wl1251_debug(DEBUG_PSM, "entering psm");

        /* enable beacon filtering */
        ret = wl1251_acx_beacon_filter_opt(wl, true);
        if (ret < 0)
            return ret;

        ret = wl1251_acx_wake_up_conditions(wl,
                                            WAKE_UP_EVENT_DTIM_BITMAP,
                                            wl->listen_int);
        if (ret < 0)
            return ret;

        ret = wl1251_cmd_ps_mode(wl, STATION_POWER_SAVE_MODE);
        if (ret < 0)
            return ret;

        ret = wl1251_ps_set_elp(wl, true);
        if (ret < 0)
            return ret;

        wl->psm = 1;
        break;
    case STATION_ACTIVE_MODE:
    default:
        wl1251_debug(DEBUG_PSM, "leaving psm");
        ret = wl1251_ps_set_elp(wl, false);
        if (ret < 0)
            return ret;

        /* disable beacon filtering */
        ret = wl1251_acx_beacon_filter_opt(wl, false);
        if (ret < 0)
            return ret;

        ret = wl1251_acx_wake_up_conditions(wl,
                                            WAKE_UP_EVENT_DTIM_BITMAP,
                                            wl->listen_int);
        if (ret < 0)
            return ret;

        ret = wl1251_cmd_ps_mode(wl, STATION_ACTIVE_MODE);
        if (ret < 0)
            return ret;

        wl->psm = 0;
        break;
    }

    return ret;
}
Ejemplo n.º 2
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;
}