mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 12:57:06 +09:00
ath9k: Enable TIM timer interrupt only when needed.
commit 3f7c5c10e9 upstream.
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: Senthil Balasubramanian <senthilkumar@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d6c28b2d48
commit
525ad99558
@@ -368,6 +368,7 @@ void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||
u16 tid, u16 *ssn);
|
||||
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 ath9k_enable_ps(struct ath_softc *sc);
|
||||
|
||||
/********/
|
||||
/* VIFs */
|
||||
|
||||
@@ -2305,6 +2305,19 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
|
||||
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)
|
||||
{
|
||||
struct ath_wiphy *aphy = hw->priv;
|
||||
@@ -2336,19 +2349,9 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
|
||||
if (changed & IEEE80211_CONF_CHANGE_PS) {
|
||||
if (conf->flags & IEEE80211_CONF_PS) {
|
||||
sc->sc_flags |= SC_OP_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);
|
||||
}
|
||||
}
|
||||
sc->ps_enabled = true;
|
||||
if ((sc->sc_flags & SC_OP_NULLFUNC_COMPLETED)) {
|
||||
sc->sc_flags &= ~SC_OP_NULLFUNC_COMPLETED;
|
||||
sc->ps_enabled = true;
|
||||
ath9k_hw_setrxabort(sc->sc_ah, 1);
|
||||
ath9k_enable_ps(sc);
|
||||
}
|
||||
} else {
|
||||
sc->ps_enabled = false;
|
||||
|
||||
@@ -1979,10 +1979,9 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
|
||||
|
||||
if (bf->bf_isnullfunc &&
|
||||
(ds->ds_txstat.ts_status & ATH9K_TX_ACKED)) {
|
||||
if ((sc->sc_flags & SC_OP_PS_ENABLED)) {
|
||||
sc->ps_enabled = true;
|
||||
ath9k_hw_setrxabort(sc->sc_ah, 1);
|
||||
} else
|
||||
if ((sc->sc_flags & SC_OP_PS_ENABLED))
|
||||
ath9k_enable_ps(sc);
|
||||
else
|
||||
sc->sc_flags |= SC_OP_NULLFUNC_COMPLETED;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user