diff options
Diffstat (limited to 'package')
| -rw-r--r-- | package/mac80211/patches/580-ath9k_fix_ps_wakeup.patch | 127 | 
1 files changed, 127 insertions, 0 deletions
| diff --git a/package/mac80211/patches/580-ath9k_fix_ps_wakeup.patch b/package/mac80211/patches/580-ath9k_fix_ps_wakeup.patch new file mode 100644 index 000000000..fc0d1c84f --- /dev/null +++ b/package/mac80211/patches/580-ath9k_fix_ps_wakeup.patch @@ -0,0 +1,127 @@ +--- 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) +@@ -1830,6 +1835,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)); +@@ -1853,6 +1859,7 @@ static int ath9k_conf_tx(struct ieee8021 + 			ath_beaconq_config(sc); +  + 	mutex_unlock(&sc->mutex); ++	ath9k_ps_restore(sc); +  + 	return ret; + } +@@ -1929,6 +1936,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) { +@@ -2029,6 +2037,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) | 
