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: Senthil Balasubramanian <senthilkumar@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
1a20034a73
commit
3f7c5c10e9
|
@ -267,6 +267,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 */
|
||||
|
|
|
@ -1492,6 +1492,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;
|
||||
|
@ -1546,22 +1559,13 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
|
|||
if (changed & IEEE80211_CONF_CHANGE_PS) {
|
||||
if (conf->flags & IEEE80211_CONF_PS) {
|
||||
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
|
||||
* of a previously sent null data frame.
|
||||
*/
|
||||
if ((sc->ps_flags & PS_NULLFUNC_COMPLETED)) {
|
||||
sc->ps_flags &= ~PS_NULLFUNC_COMPLETED;
|
||||
sc->ps_enabled = true;
|
||||
ath9k_hw_setrxabort(sc->sc_ah, 1);
|
||||
ath9k_enable_ps(sc);
|
||||
}
|
||||
} else {
|
||||
sc->ps_enabled = false;
|
||||
|
|
|
@ -2048,10 +2048,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->ps_flags & PS_ENABLED)) {
|
||||
sc->ps_enabled = true;
|
||||
ath9k_hw_setrxabort(sc->sc_ah, 1);
|
||||
} else
|
||||
if ((sc->ps_flags & PS_ENABLED))
|
||||
ath9k_enable_ps(sc);
|
||||
else
|
||||
sc->ps_flags |= PS_NULLFUNC_COMPLETED;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue