Example #1
0
int wl1271_ps_set_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                       enum wl1271_cmd_ps_mode mode)
{
    int ret;
    u16 timeout = wl->conf.conn.dynamic_ps_timeout;

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

        ret = wl1271_acx_wake_up_conditions(wl, wlvif,
                                            wl->conf.conn.wake_up_event,
                                            wl->conf.conn.listen_interval);
        if (ret < 0) {
            wl1271_error("couldn't set wake up conditions");
            return ret;
        }

        ret = wl1271_cmd_ps_mode(wl, wlvif, mode, timeout);
        if (ret < 0)
            return ret;

        set_bit(WLVIF_FLAG_IN_PS, &wlvif->flags);


        if (wlvif->band == IEEE80211_BAND_2GHZ) {
            ret = wl1271_acx_bet_enable(wl, wlvif, true);
            if (ret < 0)
                return ret;
        }
        break;
    case STATION_ACTIVE_MODE:
        wl1271_debug(DEBUG_PSM, "leaving psm");


        if (wlvif->band == IEEE80211_BAND_2GHZ) {
            ret = wl1271_acx_bet_enable(wl, wlvif, false);
            if (ret < 0)
                return ret;
        }

        ret = wl1271_cmd_ps_mode(wl, wlvif, mode, 0);
        if (ret < 0)
            return ret;

        clear_bit(WLVIF_FLAG_IN_PS, &wlvif->flags);
        break;
    default:
        wl1271_warning("trying to set ps to unsupported mode %d", mode);
        ret = -EINVAL;
    }

    return ret;
}
Example #2
0
int wl1271_ps_set_mode(struct wl1271 *wl, enum wl1271_cmd_ps_mode mode,
		       u32 rates, bool send)
{
	int ret;

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

		ret = wl1271_acx_wake_up_conditions(wl,
				    wl->conf.conn.wake_up_event,
				    wl->conf.conn.listen_interval);

		if (ret < 0) {
			wl1271_error("couldn't set wake up conditions");
			return ret;
		}

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

		set_bit(WL1271_FLAG_PSM, &wl->flags);
		break;
	case STATION_ACTIVE_MODE:
	default:
		wl1271_debug(DEBUG_PSM, "leaving psm");

		wl->psm_entry_retry = 0;
		cancel_delayed_work(&wl->ps_retry_work);

		/* disable beacon early termination */
		if (wl->band == IEEE80211_BAND_2GHZ) {
			ret = wl1271_acx_bet_enable(wl, false);
			if (ret < 0)
				return ret;
		}

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

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

		clear_bit(WL1271_FLAG_PSM, &wl->flags);
		break;
	}

	return ret;
}
Example #3
0
int wl1271_ps_set_mode(struct wl1271 *wl, enum wl1271_cmd_ps_mode mode,
		       u32 rates, bool send)
{
	int ret;

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

		ret = wl1271_acx_wake_up_conditions(wl);
		if (ret < 0) {
			wl1271_error("couldn't set wake up conditions");
			return ret;
		}

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

		set_bit(WL1271_FLAG_PSM, &wl->flags);
		break;
	case STATION_ACTIVE_MODE:
	default:
		wl1271_debug(DEBUG_PSM, "leaving psm");
		ret = wl1271_ps_elp_wakeup(wl, false);
		if (ret < 0)
			return ret;

		/* disable beacon early termination */
		ret = wl1271_acx_bet_enable(wl, false);
		if (ret < 0)
			return ret;

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

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

		clear_bit(WL1271_FLAG_PSM, &wl->flags);
		break;
	}

	return ret;
}