diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/ath9k/ath9k.h | 12 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/main.c | 27 |
2 files changed, 17 insertions, 22 deletions
diff --git a/drivers/net/wireless/ath9k/ath9k.h b/drivers/net/wireless/ath9k/ath9k.h index 0b0f82c83ffc..6481ea4bbc4e 100644 --- a/drivers/net/wireless/ath9k/ath9k.h +++ b/drivers/net/wireless/ath9k/ath9k.h | |||
@@ -464,13 +464,11 @@ void ath_beacon_sync(struct ath_softc *sc, int if_id); | |||
464 | /* ANI */ | 464 | /* ANI */ |
465 | /*******/ | 465 | /*******/ |
466 | 466 | ||
467 | /* ANI values for STA only. | 467 | #define ATH_STA_SHORT_CALINTERVAL 1000 /* 1 second */ |
468 | FIXME: Add appropriate values for AP later */ | 468 | #define ATH_AP_SHORT_CALINTERVAL 100 /* 100 ms */ |
469 | 469 | #define ATH_ANI_POLLINTERVAL 100 /* 100 ms */ | |
470 | #define ATH_ANI_POLLINTERVAL 100 /* 100 milliseconds between ANI poll */ | 470 | #define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */ |
471 | #define ATH_SHORT_CALINTERVAL 1000 /* 1 second between calibrations */ | 471 | #define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */ |
472 | #define ATH_LONG_CALINTERVAL 30000 /* 30 seconds between calibrations */ | ||
473 | #define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes between calibrations */ | ||
474 | 472 | ||
475 | struct ath_ani { | 473 | struct ath_ani { |
476 | bool caldone; | 474 | bool caldone; |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index 7264c4c36a5f..b47cbe9e7a5a 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
@@ -308,23 +308,23 @@ static int ath_set_channel(struct ath_softc *sc, struct ath9k_channel *hchan) | |||
308 | */ | 308 | */ |
309 | static void ath_ani_calibrate(unsigned long data) | 309 | static void ath_ani_calibrate(unsigned long data) |
310 | { | 310 | { |
311 | struct ath_softc *sc; | 311 | struct ath_softc *sc = (struct ath_softc *)data; |
312 | struct ath_hw *ah; | 312 | struct ath_hw *ah = sc->sc_ah; |
313 | bool longcal = false; | 313 | bool longcal = false; |
314 | bool shortcal = false; | 314 | bool shortcal = false; |
315 | bool aniflag = false; | 315 | bool aniflag = false; |
316 | unsigned int timestamp = jiffies_to_msecs(jiffies); | 316 | unsigned int timestamp = jiffies_to_msecs(jiffies); |
317 | u32 cal_interval; | 317 | u32 cal_interval, short_cal_interval; |
318 | 318 | ||
319 | sc = (struct ath_softc *)data; | 319 | short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ? |
320 | ah = sc->sc_ah; | 320 | ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL; |
321 | 321 | ||
322 | /* | 322 | /* |
323 | * don't calibrate when we're scanning. | 323 | * don't calibrate when we're scanning. |
324 | * we are most likely not on our home channel. | 324 | * we are most likely not on our home channel. |
325 | */ | 325 | */ |
326 | if (sc->rx.rxfilter & FIF_BCN_PRBRESP_PROMISC) | 326 | if (sc->rx.rxfilter & FIF_BCN_PRBRESP_PROMISC) |
327 | return; | 327 | goto set_timer; |
328 | 328 | ||
329 | /* Long calibration runs independently of short calibration. */ | 329 | /* Long calibration runs independently of short calibration. */ |
330 | if ((timestamp - sc->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) { | 330 | if ((timestamp - sc->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) { |
@@ -335,8 +335,7 @@ static void ath_ani_calibrate(unsigned long data) | |||
335 | 335 | ||
336 | /* Short calibration applies only while caldone is false */ | 336 | /* Short calibration applies only while caldone is false */ |
337 | if (!sc->ani.caldone) { | 337 | if (!sc->ani.caldone) { |
338 | if ((timestamp - sc->ani.shortcal_timer) >= | 338 | if ((timestamp - sc->ani.shortcal_timer) >= short_cal_interval) { |
339 | ATH_SHORT_CALINTERVAL) { | ||
340 | shortcal = true; | 339 | shortcal = true; |
341 | DPRINTF(sc, ATH_DBG_ANI, "shortcal @%lu\n", jiffies); | 340 | DPRINTF(sc, ATH_DBG_ANI, "shortcal @%lu\n", jiffies); |
342 | sc->ani.shortcal_timer = timestamp; | 341 | sc->ani.shortcal_timer = timestamp; |
@@ -352,8 +351,7 @@ static void ath_ani_calibrate(unsigned long data) | |||
352 | } | 351 | } |
353 | 352 | ||
354 | /* Verify whether we must check ANI */ | 353 | /* Verify whether we must check ANI */ |
355 | if ((timestamp - sc->ani.checkani_timer) >= | 354 | if ((timestamp - sc->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) { |
356 | ATH_ANI_POLLINTERVAL) { | ||
357 | aniflag = true; | 355 | aniflag = true; |
358 | sc->ani.checkani_timer = timestamp; | 356 | sc->ani.checkani_timer = timestamp; |
359 | } | 357 | } |
@@ -362,8 +360,7 @@ static void ath_ani_calibrate(unsigned long data) | |||
362 | if (longcal || shortcal || aniflag) { | 360 | if (longcal || shortcal || aniflag) { |
363 | /* Call ANI routine if necessary */ | 361 | /* Call ANI routine if necessary */ |
364 | if (aniflag) | 362 | if (aniflag) |
365 | ath9k_hw_ani_monitor(ah, &sc->nodestats, | 363 | ath9k_hw_ani_monitor(ah, &sc->nodestats, ah->curchan); |
366 | ah->curchan); | ||
367 | 364 | ||
368 | /* Perform calibration if necessary */ | 365 | /* Perform calibration if necessary */ |
369 | if (longcal || shortcal) { | 366 | if (longcal || shortcal) { |
@@ -392,6 +389,7 @@ static void ath_ani_calibrate(unsigned long data) | |||
392 | } | 389 | } |
393 | } | 390 | } |
394 | 391 | ||
392 | set_timer: | ||
395 | /* | 393 | /* |
396 | * Set timer interval based on previous results. | 394 | * Set timer interval based on previous results. |
397 | * The interval must be the shortest necessary to satisfy ANI, | 395 | * The interval must be the shortest necessary to satisfy ANI, |
@@ -401,7 +399,7 @@ static void ath_ani_calibrate(unsigned long data) | |||
401 | if (sc->sc_ah->config.enable_ani) | 399 | if (sc->sc_ah->config.enable_ani) |
402 | cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL); | 400 | cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL); |
403 | if (!sc->ani.caldone) | 401 | if (!sc->ani.caldone) |
404 | cal_interval = min(cal_interval, (u32)ATH_SHORT_CALINTERVAL); | 402 | cal_interval = min(cal_interval, (u32)short_cal_interval); |
405 | 403 | ||
406 | mod_timer(&sc->ani.timer, jiffies + msecs_to_jiffies(cal_interval)); | 404 | mod_timer(&sc->ani.timer, jiffies + msecs_to_jiffies(cal_interval)); |
407 | } | 405 | } |
@@ -924,8 +922,7 @@ static void ath9k_bss_assoc_info(struct ath_softc *sc, | |||
924 | 922 | ||
925 | /* Start ANI */ | 923 | /* Start ANI */ |
926 | mod_timer(&sc->ani.timer, | 924 | mod_timer(&sc->ani.timer, |
927 | jiffies + msecs_to_jiffies(ATH_ANI_POLLINTERVAL)); | 925 | jiffies + msecs_to_jiffies(ATH_ANI_POLLINTERVAL)); |
928 | |||
929 | } else { | 926 | } else { |
930 | DPRINTF(sc, ATH_DBG_CONFIG, "Bss Info DISSOC\n"); | 927 | DPRINTF(sc, ATH_DBG_CONFIG, "Bss Info DISSOC\n"); |
931 | sc->curaid = 0; | 928 | sc->curaid = 0; |