Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f7c5c10 authored by Senthil Balasubramanian's avatar Senthil Balasubramanian Committed by John W. Linville
Browse files

ath9k: Enable TIM timer interrupt only when needed.



The TIM timer interrupt is enabled even before the ACK of nullqos
is received which is unnecessary.

Also clean up the CONF_PS part of config callback properly for
better readability.

Signed-off-by: default avatarSenthil Balasubramanian <senthilkumar@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 1a20034a
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -267,6 +267,7 @@ void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
		       u16 tid, u16 *ssn);
		       u16 tid, u16 *ssn);
void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
void ath9k_enable_ps(struct ath_softc *sc);


/********/
/********/
/* VIFs */
/* VIFs */
+14 −10
Original line number Original line Diff line number Diff line
@@ -1492,6 +1492,19 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
	mutex_unlock(&sc->mutex);
	mutex_unlock(&sc->mutex);
}
}


void ath9k_enable_ps(struct ath_softc *sc)
{
	sc->ps_enabled = true;
	if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
		if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) {
			sc->imask |= ATH9K_INT_TIM_TIMER;
			ath9k_hw_set_interrupts(sc->sc_ah,
					sc->imask);
		}
	}
	ath9k_hw_setrxabort(sc->sc_ah, 1);
}

static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
{
{
	struct ath_wiphy *aphy = hw->priv;
	struct ath_wiphy *aphy = hw->priv;
@@ -1546,22 +1559,13 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
	if (changed & IEEE80211_CONF_CHANGE_PS) {
	if (changed & IEEE80211_CONF_CHANGE_PS) {
		if (conf->flags & IEEE80211_CONF_PS) {
		if (conf->flags & IEEE80211_CONF_PS) {
			sc->ps_flags |= PS_ENABLED;
			sc->ps_flags |= PS_ENABLED;
			if (!(ah->caps.hw_caps &
			      ATH9K_HW_CAP_AUTOSLEEP)) {
				if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) {
					sc->imask |= ATH9K_INT_TIM_TIMER;
					ath9k_hw_set_interrupts(sc->sc_ah,
							sc->imask);
				}
			}
			/*
			/*
			 * At this point we know hardware has received an ACK
			 * At this point we know hardware has received an ACK
			 * of a previously sent null data frame.
			 * of a previously sent null data frame.
			 */
			 */
			if ((sc->ps_flags & PS_NULLFUNC_COMPLETED)) {
			if ((sc->ps_flags & PS_NULLFUNC_COMPLETED)) {
				sc->ps_flags &= ~PS_NULLFUNC_COMPLETED;
				sc->ps_flags &= ~PS_NULLFUNC_COMPLETED;
				sc->ps_enabled = true;
				ath9k_enable_ps(sc);
				ath9k_hw_setrxabort(sc->sc_ah, 1);
                        }
                        }
		} else {
		} else {
			sc->ps_enabled = false;
			sc->ps_enabled = false;
+3 −4
Original line number Original line Diff line number Diff line
@@ -2048,10 +2048,9 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
		 */
		 */
		if (bf->bf_isnullfunc &&
		if (bf->bf_isnullfunc &&
		    (ds->ds_txstat.ts_status & ATH9K_TX_ACKED)) {
		    (ds->ds_txstat.ts_status & ATH9K_TX_ACKED)) {
			if ((sc->ps_flags & PS_ENABLED)) {
			if ((sc->ps_flags & PS_ENABLED))
				sc->ps_enabled = true;
				ath9k_enable_ps(sc);
				ath9k_hw_setrxabort(sc->sc_ah, 1);
			else
			} else
				sc->ps_flags |= PS_NULLFUNC_COMPLETED;
				sc->ps_flags |= PS_NULLFUNC_COMPLETED;
		}
		}