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);
|
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 */
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user