|
@@ -1333,14 +1333,6 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
|
|
|
wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
|
|
|
wl->chip.id);
|
|
|
|
|
|
- /*
|
|
|
- * 'end-of-transaction flag' and 'LPD mode flag'
|
|
|
- * should be set in wl127x AP mode only
|
|
|
- */
|
|
|
- if (wl->bss_type == BSS_TYPE_AP_BSS)
|
|
|
- wl->quirks |= (WL12XX_QUIRK_END_OF_TRANSACTION |
|
|
|
- WL12XX_QUIRK_LPD_MODE);
|
|
|
-
|
|
|
ret = wl1271_setup(wl);
|
|
|
if (ret < 0)
|
|
|
goto out;
|
|
@@ -2222,6 +2214,11 @@ static int wl1271_unjoin(struct wl1271 *wl)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
+ if (test_and_clear_bit(WL1271_FLAG_CS_PROGRESS, &wl->flags)) {
|
|
|
+ wl12xx_cmd_stop_channel_switch(wl);
|
|
|
+ ieee80211_chswitch_done(wl->vif, false);
|
|
|
+ }
|
|
|
+
|
|
|
/* to stop listening to a channel, we disconnect */
|
|
|
ret = wl12xx_cmd_role_stop_sta(wl);
|
|
|
if (ret < 0)
|
|
@@ -4130,6 +4127,37 @@ static int wl12xx_set_bitrate_mask(struct ieee80211_hw *hw,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_channel_switch *ch_switch)
|
|
|
+{
|
|
|
+ struct wl1271 *wl = hw->priv;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch");
|
|
|
+
|
|
|
+ mutex_lock(&wl->mutex);
|
|
|
+
|
|
|
+ if (unlikely(wl->state == WL1271_STATE_OFF)) {
|
|
|
+ mutex_unlock(&wl->mutex);
|
|
|
+ ieee80211_chswitch_done(wl->vif, false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = wl1271_ps_elp_wakeup(wl);
|
|
|
+ if (ret < 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ ret = wl12xx_cmd_channel_switch(wl, ch_switch);
|
|
|
+
|
|
|
+ if (!ret)
|
|
|
+ set_bit(WL1271_FLAG_CS_PROGRESS, &wl->flags);
|
|
|
+
|
|
|
+ wl1271_ps_elp_sleep(wl);
|
|
|
+
|
|
|
+out:
|
|
|
+ mutex_unlock(&wl->mutex);
|
|
|
+}
|
|
|
+
|
|
|
static bool wl1271_tx_frames_pending(struct ieee80211_hw *hw)
|
|
|
{
|
|
|
struct wl1271 *wl = hw->priv;
|
|
@@ -4406,6 +4434,7 @@ static const struct ieee80211_ops wl1271_ops = {
|
|
|
.ampdu_action = wl1271_op_ampdu_action,
|
|
|
.tx_frames_pending = wl1271_tx_frames_pending,
|
|
|
.set_bitrate_mask = wl12xx_set_bitrate_mask,
|
|
|
+ .channel_switch = wl12xx_op_channel_switch,
|
|
|
CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
|
|
|
};
|
|
|
|
|
@@ -4679,6 +4708,9 @@ int wl1271_init_ieee80211(struct wl1271 *wl)
|
|
|
wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_DFLT_SIZE -
|
|
|
sizeof(struct ieee80211_header);
|
|
|
|
|
|
+ wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_DFLT_SIZE -
|
|
|
+ sizeof(struct ieee80211_header);
|
|
|
+
|
|
|
wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
|
|
|
|
|
|
/* make sure all our channels fit in the scanned_ch bitmask */
|