aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>2012-10-10 13:33:02 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-10-19 16:16:14 -0400
commit424749c75daf3611a68a49eca5940ac2b74e4406 (patch)
tree10b86b2f70aac788ead6c49381ebe324be0dd982
parentb4764c809a306ea37b6409494896e919bbb5ec5f (diff)
ath9k: perform ANI cycle in idle state
As of now the ANI cycle is executed only when the chip is awake. On idle state case, the station wakes up from network sleep for beacon reception. Since most of the time, ANI cycle is not syncing with beacon wakeup, ANI cycle is ignored. Approx 5 mins once, the calibration is performed. This could affect the connection stability when the station is idle for long. Even though the OFDM and CCK phy error rates are too high, ANI is unable to tune its immunity level as quick enough due to rare execution. Here the experiment shows that OFDM and CCK levels are at default even on higher phy error rate. listenTime=44 OFDM:3 errs=121977/s CCK:2 errs=440818/s ofdm_turn=1 This change ensures that ANI calibration will be exectued atleast once for every 10 seconds. The below result shows improvements and immunity levels are adopted quick enough. listenTime=557 OFDM:4 errs=752/s CCK:4 errs=125/s ofdm_turn=0 Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/ath9k/ath9k.h2
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/link.c12
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c3
4 files changed, 16 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index dfe6a4707fd2..77c2c16b6961 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -437,6 +437,7 @@ void ath9k_set_beacon(struct ath_softc *sc);
437#define ATH_LONG_CALINTERVAL_INT 1000 /* 1000 ms */ 437#define ATH_LONG_CALINTERVAL_INT 1000 /* 1000 ms */
438#define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */ 438#define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */
439#define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */ 439#define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */
440#define ATH_ANI_MAX_SKIP_COUNT 10
440 441
441#define ATH_PAPRD_TIMEOUT 100 /* msecs */ 442#define ATH_PAPRD_TIMEOUT 100 /* msecs */
442#define ATH_PLL_WORK_INTERVAL 100 443#define ATH_PLL_WORK_INTERVAL 100
@@ -642,6 +643,7 @@ enum sc_op_flags {
642#define PS_WAIT_FOR_PSPOLL_DATA BIT(2) 643#define PS_WAIT_FOR_PSPOLL_DATA BIT(2)
643#define PS_WAIT_FOR_TX_ACK BIT(3) 644#define PS_WAIT_FOR_TX_ACK BIT(3)
644#define PS_BEACON_SYNC BIT(4) 645#define PS_BEACON_SYNC BIT(4)
646#define PS_WAIT_FOR_ANI BIT(5)
645 647
646struct ath_rate_table; 648struct ath_rate_table;
647 649
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index dbc1b7a4cbfd..1d4f5f1fdd8d 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -834,6 +834,7 @@ struct ath_hw {
834 int coarse_low[5]; 834 int coarse_low[5];
835 int firpwr[5]; 835 int firpwr[5];
836 enum ath9k_ani_cmd ani_function; 836 enum ath9k_ani_cmd ani_function;
837 u32 ani_skip_count;
837 838
838#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT 839#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
839 struct ath_btcoex_hw btcoex_hw; 840 struct ath_btcoex_hw btcoex_hw;
diff --git a/drivers/net/wireless/ath/ath9k/link.c b/drivers/net/wireless/ath/ath9k/link.c
index 7b88b9c39ccd..223b9693527e 100644
--- a/drivers/net/wireless/ath/ath9k/link.c
+++ b/drivers/net/wireless/ath/ath9k/link.c
@@ -350,8 +350,18 @@ void ath_ani_calibrate(unsigned long data)
350 ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL; 350 ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
351 351
352 /* Only calibrate if awake */ 352 /* Only calibrate if awake */
353 if (sc->sc_ah->power_mode != ATH9K_PM_AWAKE) 353 if (sc->sc_ah->power_mode != ATH9K_PM_AWAKE) {
354 if (++ah->ani_skip_count >= ATH_ANI_MAX_SKIP_COUNT) {
355 spin_lock_irqsave(&sc->sc_pm_lock, flags);
356 sc->ps_flags |= PS_WAIT_FOR_ANI;
357 spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
358 }
354 goto set_timer; 359 goto set_timer;
360 }
361 ah->ani_skip_count = 0;
362 spin_lock_irqsave(&sc->sc_pm_lock, flags);
363 sc->ps_flags &= ~PS_WAIT_FOR_ANI;
364 spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
355 365
356 ath9k_ps_wakeup(sc); 366 ath9k_ps_wakeup(sc);
357 367
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index dd45edfa6bae..2da62be081f7 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -131,7 +131,8 @@ void ath9k_ps_restore(struct ath_softc *sc)
131 !(sc->ps_flags & (PS_WAIT_FOR_BEACON | 131 !(sc->ps_flags & (PS_WAIT_FOR_BEACON |
132 PS_WAIT_FOR_CAB | 132 PS_WAIT_FOR_CAB |
133 PS_WAIT_FOR_PSPOLL_DATA | 133 PS_WAIT_FOR_PSPOLL_DATA |
134 PS_WAIT_FOR_TX_ACK))) { 134 PS_WAIT_FOR_TX_ACK |
135 PS_WAIT_FOR_ANI))) {
135 mode = ATH9K_PM_NETWORK_SLEEP; 136 mode = ATH9K_PM_NETWORK_SLEEP;
136 if (ath9k_hw_btcoex_is_enabled(sc->sc_ah)) 137 if (ath9k_hw_btcoex_is_enabled(sc->sc_ah))
137 ath9k_btcoex_stop_gen_timer(sc); 138 ath9k_btcoex_stop_gen_timer(sc);