ath9k: fix tx queueing issues after background scans
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 38304
This commit is contained in:
parent
9051e79bc2
commit
048fc8f0c1
5 changed files with 60 additions and 19 deletions
|
@ -1519,17 +1519,58 @@
|
||||||
ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
|
ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
|
||||||
msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
|
msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
|
||||||
|
|
||||||
@@ -238,9 +237,6 @@ static bool ath_complete_reset(struct at
|
@@ -209,6 +208,7 @@ static bool ath_complete_reset(struct at
|
||||||
|
struct ath_hw *ah = sc->sc_ah;
|
||||||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
unsigned long flags;
|
||||||
|
+ int i;
|
||||||
|
|
||||||
|
if (ath_startrecv(sc) != 0) {
|
||||||
|
ath_err(common, "Unable to restart recv logic\n");
|
||||||
|
@@ -236,10 +236,16 @@ static bool ath_complete_reset(struct at
|
||||||
|
}
|
||||||
|
work:
|
||||||
ath_restart_work(sc);
|
ath_restart_work(sc);
|
||||||
}
|
- }
|
||||||
|
|
||||||
- if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3)
|
- if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3)
|
||||||
- ath_ant_comb_update(sc);
|
- ath_ant_comb_update(sc);
|
||||||
-
|
+ for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
|
||||||
|
+ if (!ATH_TXQ_SETUP(sc, i))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ spin_lock_bh(&sc->tx.txq[i].axq_lock);
|
||||||
|
+ ath_txq_schedule(sc, &sc->tx.txq[i]);
|
||||||
|
+ spin_unlock_bh(&sc->tx.txq[i].axq_lock);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
ieee80211_wake_queues(sc->hw);
|
ieee80211_wake_queues(sc->hw);
|
||||||
|
|
||||||
return true;
|
@@ -543,21 +549,10 @@ chip_reset:
|
||||||
@@ -966,6 +962,8 @@ static int ath9k_add_interface(struct ie
|
|
||||||
|
static int ath_reset(struct ath_softc *sc)
|
||||||
|
{
|
||||||
|
- int i, r;
|
||||||
|
+ int r;
|
||||||
|
|
||||||
|
ath9k_ps_wakeup(sc);
|
||||||
|
-
|
||||||
|
r = ath_reset_internal(sc, NULL);
|
||||||
|
-
|
||||||
|
- for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
|
||||||
|
- if (!ATH_TXQ_SETUP(sc, i))
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- spin_lock_bh(&sc->tx.txq[i].axq_lock);
|
||||||
|
- ath_txq_schedule(sc, &sc->tx.txq[i]);
|
||||||
|
- spin_unlock_bh(&sc->tx.txq[i].axq_lock);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
ath9k_ps_restore(sc);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
@@ -966,6 +961,8 @@ static int ath9k_add_interface(struct ie
|
||||||
struct ath_softc *sc = hw->priv;
|
struct ath_softc *sc = hw->priv;
|
||||||
struct ath_hw *ah = sc->sc_ah;
|
struct ath_hw *ah = sc->sc_ah;
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
@ -1538,7 +1579,7 @@
|
||||||
|
|
||||||
mutex_lock(&sc->mutex);
|
mutex_lock(&sc->mutex);
|
||||||
|
|
||||||
@@ -979,6 +977,12 @@ static int ath9k_add_interface(struct ie
|
@@ -979,6 +976,12 @@ static int ath9k_add_interface(struct ie
|
||||||
if (ath9k_uses_beacons(vif->type))
|
if (ath9k_uses_beacons(vif->type))
|
||||||
ath9k_beacon_assign_slot(sc, vif);
|
ath9k_beacon_assign_slot(sc, vif);
|
||||||
|
|
||||||
|
@ -1551,7 +1592,7 @@
|
||||||
mutex_unlock(&sc->mutex);
|
mutex_unlock(&sc->mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1016,6 +1020,7 @@ static void ath9k_remove_interface(struc
|
@@ -1016,6 +1019,7 @@ static void ath9k_remove_interface(struc
|
||||||
{
|
{
|
||||||
struct ath_softc *sc = hw->priv;
|
struct ath_softc *sc = hw->priv;
|
||||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||||
|
@ -1559,7 +1600,7 @@
|
||||||
|
|
||||||
ath_dbg(common, CONFIG, "Detach Interface\n");
|
ath_dbg(common, CONFIG, "Detach Interface\n");
|
||||||
|
|
||||||
@@ -1030,6 +1035,8 @@ static void ath9k_remove_interface(struc
|
@@ -1030,6 +1034,8 @@ static void ath9k_remove_interface(struc
|
||||||
ath9k_calculate_summary_state(hw, NULL);
|
ath9k_calculate_summary_state(hw, NULL);
|
||||||
ath9k_ps_restore(sc);
|
ath9k_ps_restore(sc);
|
||||||
|
|
||||||
|
@ -1568,7 +1609,7 @@
|
||||||
mutex_unlock(&sc->mutex);
|
mutex_unlock(&sc->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1193,8 +1200,6 @@ static int ath9k_config(struct ieee80211
|
@@ -1193,8 +1199,6 @@ static int ath9k_config(struct ieee80211
|
||||||
|
|
||||||
if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
|
if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
|
||||||
struct ieee80211_channel *curchan = hw->conf.chandef.chan;
|
struct ieee80211_channel *curchan = hw->conf.chandef.chan;
|
||||||
|
@ -1577,7 +1618,7 @@
|
||||||
int pos = curchan->hw_value;
|
int pos = curchan->hw_value;
|
||||||
int old_pos = -1;
|
int old_pos = -1;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@@ -1202,8 +1207,8 @@ static int ath9k_config(struct ieee80211
|
@@ -1202,8 +1206,8 @@ static int ath9k_config(struct ieee80211
|
||||||
if (ah->curchan)
|
if (ah->curchan)
|
||||||
old_pos = ah->curchan - &ah->channels[0];
|
old_pos = ah->curchan - &ah->channels[0];
|
||||||
|
|
||||||
|
@ -1588,7 +1629,7 @@
|
||||||
|
|
||||||
/* update survey stats for the old channel before switching */
|
/* update survey stats for the old channel before switching */
|
||||||
spin_lock_irqsave(&common->cc_lock, flags);
|
spin_lock_irqsave(&common->cc_lock, flags);
|
||||||
@@ -1211,7 +1216,7 @@ static int ath9k_config(struct ieee80211
|
@@ -1211,7 +1215,7 @@ static int ath9k_config(struct ieee80211
|
||||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
spin_unlock_irqrestore(&common->cc_lock, flags);
|
||||||
|
|
||||||
ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos],
|
ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos],
|
||||||
|
@ -1597,7 +1638,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the operating channel changes, change the survey in-use flags
|
* If the operating channel changes, change the survey in-use flags
|
||||||
@@ -1374,9 +1379,6 @@ static void ath9k_sta_notify(struct ieee
|
@@ -1374,9 +1378,6 @@ static void ath9k_sta_notify(struct ieee
|
||||||
struct ath_softc *sc = hw->priv;
|
struct ath_softc *sc = hw->priv;
|
||||||
struct ath_node *an = (struct ath_node *) sta->drv_priv;
|
struct ath_node *an = (struct ath_node *) sta->drv_priv;
|
||||||
|
|
||||||
|
@ -1607,7 +1648,7 @@
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case STA_NOTIFY_SLEEP:
|
case STA_NOTIFY_SLEEP:
|
||||||
an->sleeping = true;
|
an->sleeping = true;
|
||||||
@@ -2094,7 +2096,7 @@ static void ath9k_wow_add_pattern(struct
|
@@ -2094,7 +2095,7 @@ static void ath9k_wow_add_pattern(struct
|
||||||
{
|
{
|
||||||
struct ath_hw *ah = sc->sc_ah;
|
struct ath_hw *ah = sc->sc_ah;
|
||||||
struct ath9k_wow_pattern *wow_pattern = NULL;
|
struct ath9k_wow_pattern *wow_pattern = NULL;
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
@@ -1200,8 +1200,10 @@ static int ath9k_config(struct ieee80211
|
@@ -1199,8 +1199,10 @@ static int ath9k_config(struct ieee80211
|
||||||
|
|
||||||
if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
|
if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
|
||||||
struct ieee80211_channel *curchan = hw->conf.chandef.chan;
|
struct ieee80211_channel *curchan = hw->conf.chandef.chan;
|
||||||
|
@ -83,7 +83,7 @@
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (ah->curchan)
|
if (ah->curchan)
|
||||||
@@ -1238,7 +1240,23 @@ static int ath9k_config(struct ieee80211
|
@@ -1237,7 +1239,23 @@ static int ath9k_config(struct ieee80211
|
||||||
memset(&sc->survey[pos], 0, sizeof(struct survey_info));
|
memset(&sc->survey[pos], 0, sizeof(struct survey_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
@@ -286,8 +286,12 @@ static int ath_reset_internal(struct ath
|
@@ -296,8 +296,12 @@ static int ath_reset_internal(struct ath
|
||||||
(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
|
(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
|
||||||
ath9k_mci_set_txpower(sc, true, false);
|
ath9k_mci_set_txpower(sc, true, false);
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||||
@@ -1299,6 +1303,7 @@ static int ath9k_config(struct ieee80211
|
@@ -1298,6 +1302,7 @@ static int ath9k_config(struct ieee80211
|
||||||
sc->config.txpowlimit = 2 * conf->power_level;
|
sc->config.txpowlimit = 2 * conf->power_level;
|
||||||
ath9k_cmn_update_txpow(ah, sc->curtxpow,
|
ath9k_cmn_update_txpow(ah, sc->curtxpow,
|
||||||
sc->config.txpowlimit, &sc->curtxpow);
|
sc->config.txpowlimit, &sc->curtxpow);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
if (ant_gain > max_gain)
|
if (ant_gain > max_gain)
|
||||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
@@ -1299,7 +1299,10 @@ static int ath9k_config(struct ieee80211
|
@@ -1298,7 +1298,10 @@ static int ath9k_config(struct ieee80211
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
||||||
|
|
|
@ -125,7 +125,7 @@
|
||||||
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
||||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||||
@@ -462,6 +462,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
@@ -472,6 +472,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||||
ath9k_hw_getisr(ah, &status); /* NB: clears ISR too */
|
ath9k_hw_getisr(ah, &status); /* NB: clears ISR too */
|
||||||
status &= ah->imask; /* discard unasked-for bits */
|
status &= ah->imask; /* discard unasked-for bits */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue