// SPDX-License-Identifier: GPL-2.0-only /* * This file is part of wl1271 * * Copyright (C) 2008-2009 Nokia Corporation * * Contact: Luciano Coelho <luciano.coelho@nokia.com>
*/
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);
/* * enable beacon early termination. * Not relevant for 5GHz and for high rates.
*/ if ((wlvif->band == NL80211_BAND_2GHZ) &&
(wlvif->basic_rate < CONF_HW_BIT_RATE_9MBPS)) {
ret = wl1271_acx_bet_enable(wl, wlvif, true); if (ret < 0) return ret;
} break; case STATION_ACTIVE_MODE:
wl1271_debug(DEBUG_PSM, "leaving psm");
/* disable beacon early termination */ if ((wlvif->band == NL80211_BAND_2GHZ) &&
(wlvif->basic_rate < CONF_HW_BIT_RATE_9MBPS)) {
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;
}
/* filter all frames currently in the low level queues for this hlid */ for (i = 0; i < NUM_TX_QUEUES; i++) {
filtered[i] = 0; while ((skb = skb_dequeue(&lnk->tx_queue[i]))) {
filtered[i]++;
if (WARN_ON(wl12xx_is_dummy_packet(wl, skb))) continue;
rcu_read_lock();
sta = ieee80211_find_sta(vif, wl->links[hlid].addr); if (!sta) {
wl1271_error("could not find sta %pM for starting ps",
wl->links[hlid].addr);
rcu_read_unlock(); return;
}
wl1271_debug(DEBUG_PSM, "end mac80211 PSM on hlid %d", hlid);
__clear_bit(hlid, &wl->ap_ps_map);
rcu_read_lock();
sta = ieee80211_find_sta(vif, wl->links[hlid].addr); if (!sta) {
wl1271_error("could not find sta %pM for ending ps",
wl->links[hlid].addr); goto end;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.