---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -324,7 +324,6 @@ static void ath_paprd_activate(struct at
- if (!caldata || !caldata->paprd_done)
- return;
-
-- ath9k_ps_wakeup(sc);
- ar9003_paprd_enable(ah, false);
- for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
- if (!(common->tx_chainmask & BIT(chain)))
-@@ -334,7 +333,6 @@ static void ath_paprd_activate(struct at
- }
-
- ar9003_paprd_enable(ah, true);
-- ath9k_ps_restore(sc);
- }
-
- static bool ath_paprd_send_frame(struct ath_softc *sc, struct sk_buff *skb, int chain)
-@@ -554,8 +552,11 @@ set_timer:
- if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) {
- if (!ah->caldata->paprd_done)
- ieee80211_queue_work(sc->hw, &sc->paprd_work);
-- else if (!ah->paprd_table_write_done)
-+ else if (!ah->paprd_table_write_done) {
-+ ath9k_ps_wakeup(sc);
- ath_paprd_activate(sc);
-+ ath9k_ps_restore(sc);
-+ }
- }
- }
-
-@@ -1376,7 +1377,6 @@ static void ath9k_calculate_summary_stat
-
- ath9k_calculate_iter_data(hw, vif, &iter_data);
-
-- ath9k_ps_wakeup(sc);
- /* Set BSSID mask. */
- memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
- ath_hw_setbssidmask(common);
-@@ -1411,7 +1411,6 @@ static void ath9k_calculate_summary_stat
- }
-
- ath9k_hw_set_interrupts(ah, ah->imask);
-- ath9k_ps_restore(sc);
-
- /* Set up ANI */
- if ((iter_data.naps + iter_data.nadhocs) > 0) {
-@@ -1457,6 +1456,7 @@ static int ath9k_add_interface(struct ie
- struct ath_vif *avp = (void *)vif->drv_priv;
- int ret = 0;
-
-+ ath9k_ps_wakeup(sc);
- mutex_lock(&sc->mutex);
-
- switch (vif->type) {
-@@ -1503,6 +1503,7 @@ static int ath9k_add_interface(struct ie
- ath9k_do_vif_add_setup(hw, vif);
- out:
- mutex_unlock(&sc->mutex);
-+ ath9k_ps_restore(sc);
- return ret;
- }
-
-@@ -1517,6 +1518,7 @@ static int ath9k_change_interface(struct
-
- ath_dbg(common, ATH_DBG_CONFIG, "Change Interface\n");
- mutex_lock(&sc->mutex);
-+ ath9k_ps_wakeup(sc);
-
- /* See if new interface type is valid. */
- if ((new_type == NL80211_IFTYPE_ADHOC) &&
-@@ -1546,6 +1548,7 @@ static int ath9k_change_interface(struct
-
- ath9k_do_vif_add_setup(hw, vif);
- out:
-+ ath9k_ps_restore(sc);
- mutex_unlock(&sc->mutex);
- return ret;
- }
-@@ -1558,6 +1561,7 @@ static void ath9k_remove_interface(struc
-
- ath_dbg(common, ATH_DBG_CONFIG, "Detach Interface\n");
-
-+ ath9k_ps_wakeup(sc);
- mutex_lock(&sc->mutex);
-
- sc->nvifs--;
-@@ -1569,6 +1573,7 @@ static void ath9k_remove_interface(struc
- ath9k_calculate_summary_state(hw, NULL);
-
- mutex_unlock(&sc->mutex);
-+ ath9k_ps_restore(sc);
- }
-
- static void ath9k_enable_ps(struct ath_softc *sc)
-@@ -1809,6 +1814,7 @@ static int ath9k_conf_tx(struct ieee8021
-
- txq = sc->tx.txq_map[queue];
-
-+ ath9k_ps_wakeup(sc);
- mutex_lock(&sc->mutex);
-
- memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));
-@@ -1832,6 +1838,7 @@ static int ath9k_conf_tx(struct ieee8021
- ath_beaconq_config(sc);
-
- mutex_unlock(&sc->mutex);
-+ ath9k_ps_restore(sc);
-
- return ret;
- }
-@@ -1908,6 +1915,7 @@ static void ath9k_bss_info_changed(struc
- int slottime;
- int error;
-
-+ ath9k_ps_wakeup(sc);
- mutex_lock(&sc->mutex);
-
- if (changed & BSS_CHANGED_BSSID) {
-@@ -2008,6 +2016,7 @@ static void ath9k_bss_info_changed(struc
- }
-
- mutex_unlock(&sc->mutex);
-+ ath9k_ps_restore(sc);
- }
-
- static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
---- a/drivers/net/wireless/ath/ath9k/beacon.c
-+++ b/drivers/net/wireless/ath/ath9k/beacon.c
-@@ -392,14 +392,6 @@ void ath_beacon_tasklet(unsigned long da
- tsf += TU_TO_USEC(ah->config.sw_beacon_response_time);
- tsftu = TSF_TO_TU((tsf * ATH_BCBUF) >>32, tsf * ATH_BCBUF);
- slot = (tsftu % (intval * ATH_BCBUF)) / intval;
-- /*
-- * Reverse the slot order to get slot 0 on the TBTT offset that does
-- * not require TSF adjustment and other slots adding
-- * slot/ATH_BCBUF * beacon_int to timestamp. For example, with
-- * ATH_BCBUF = 4, we process beacon slots as follows: 3 2 1 0 3 2 1 ..
-- * and slot 0 is at correct offset to TBTT.
-- */
-- slot = ATH_BCBUF - slot - 1;
- vif = sc->beacon.bslot[slot];
-
- ath_dbg(common, ATH_DBG_BEACON,
-@@ -708,7 +700,7 @@ void ath_beacon_config(struct ath_softc
- if (cur_conf->dtim_period == 0)
- cur_conf->dtim_period = 1;
-
-- switch (iftype) {
-+ switch (sc->sc_ah->opmode) {
- case NL80211_IFTYPE_AP:
- ath_beacon_config_ap(sc, cur_conf);
- break;
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -1585,7 +1585,7 @@ ieee80211_drop_unencrypted_mgmt(struct i