diff options
Diffstat (limited to 'drivers/net/wireless/wl1251')
-rw-r--r-- | drivers/net/wireless/wl1251/main.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/wl1251/ps.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/wl1251/wl1251.h | 1 |
3 files changed, 28 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl1251/main.c b/drivers/net/wireless/wl1251/main.c index 04a054915dbe..a14a48c99cdc 100644 --- a/drivers/net/wireless/wl1251/main.c +++ b/drivers/net/wireless/wl1251/main.c | |||
@@ -639,6 +639,22 @@ static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed) | |||
639 | } | 639 | } |
640 | } | 640 | } |
641 | 641 | ||
642 | if (changed & IEEE80211_CONF_CHANGE_IDLE) { | ||
643 | if (conf->flags & IEEE80211_CONF_IDLE) { | ||
644 | ret = wl1251_ps_set_mode(wl, STATION_IDLE); | ||
645 | if (ret < 0) | ||
646 | goto out_sleep; | ||
647 | } else { | ||
648 | ret = wl1251_ps_set_mode(wl, STATION_ACTIVE_MODE); | ||
649 | if (ret < 0) | ||
650 | goto out_sleep; | ||
651 | ret = wl1251_join(wl, wl->bss_type, wl->channel, | ||
652 | wl->beacon_int, wl->dtim_period); | ||
653 | if (ret < 0) | ||
654 | goto out_sleep; | ||
655 | } | ||
656 | } | ||
657 | |||
642 | if (conf->power_level != wl->power_level) { | 658 | if (conf->power_level != wl->power_level) { |
643 | ret = wl1251_acx_tx_power(wl, conf->power_level); | 659 | ret = wl1251_acx_tx_power(wl, conf->power_level); |
644 | if (ret < 0) | 660 | if (ret < 0) |
diff --git a/drivers/net/wireless/wl1251/ps.c b/drivers/net/wireless/wl1251/ps.c index 97a5b8c82f01..db719f7d2692 100644 --- a/drivers/net/wireless/wl1251/ps.c +++ b/drivers/net/wireless/wl1251/ps.c | |||
@@ -136,6 +136,17 @@ int wl1251_ps_set_mode(struct wl1251 *wl, enum wl1251_station_mode mode) | |||
136 | if (ret < 0) | 136 | if (ret < 0) |
137 | return ret; | 137 | return ret; |
138 | break; | 138 | break; |
139 | case STATION_IDLE: | ||
140 | wl1251_debug(DEBUG_PSM, "entering idle"); | ||
141 | |||
142 | ret = wl1251_acx_sleep_auth(wl, WL1251_PSM_ELP); | ||
143 | if (ret < 0) | ||
144 | return ret; | ||
145 | |||
146 | ret = wl1251_cmd_template_set(wl, CMD_DISCONNECT, NULL, 0); | ||
147 | if (ret < 0) | ||
148 | return ret; | ||
149 | break; | ||
139 | case STATION_ACTIVE_MODE: | 150 | case STATION_ACTIVE_MODE: |
140 | default: | 151 | default: |
141 | wl1251_debug(DEBUG_PSM, "leaving psm"); | 152 | wl1251_debug(DEBUG_PSM, "leaving psm"); |
diff --git a/drivers/net/wireless/wl1251/wl1251.h b/drivers/net/wireless/wl1251/wl1251.h index bf245a87e80e..a77f1bbbed0a 100644 --- a/drivers/net/wireless/wl1251/wl1251.h +++ b/drivers/net/wireless/wl1251/wl1251.h | |||
@@ -132,6 +132,7 @@ enum wl1251_partition_type { | |||
132 | enum wl1251_station_mode { | 132 | enum wl1251_station_mode { |
133 | STATION_ACTIVE_MODE, | 133 | STATION_ACTIVE_MODE, |
134 | STATION_POWER_SAVE_MODE, | 134 | STATION_POWER_SAVE_MODE, |
135 | STATION_IDLE, | ||
135 | }; | 136 | }; |
136 | 137 | ||
137 | struct wl1251_partition { | 138 | struct wl1251_partition { |