diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath5k')
-rw-r--r-- | drivers/net/wireless/ath/ath5k/ani.c | 41 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath5k/ani.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath5k/debug.c | 21 |
3 files changed, 26 insertions, 41 deletions
diff --git a/drivers/net/wireless/ath/ath5k/ani.c b/drivers/net/wireless/ath/ath5k/ani.c index e4a5f046bba..f1419198a47 100644 --- a/drivers/net/wireless/ath/ath5k/ani.c +++ b/drivers/net/wireless/ath/ath5k/ani.c | |||
@@ -355,41 +355,28 @@ ath5k_ani_lower_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as) | |||
355 | 355 | ||
356 | 356 | ||
357 | /** | 357 | /** |
358 | * ath5k_hw_ani_get_listen_time() - Calculate time spent listening | 358 | * ath5k_hw_ani_get_listen_time() - Update counters and return listening time |
359 | * | 359 | * |
360 | * Return an approximation of the time spent "listening" in milliseconds (ms) | 360 | * Return an approximation of the time spent "listening" in milliseconds (ms) |
361 | * since the last call of this function by deducting the cycles spent | 361 | * since the last call of this function. |
362 | * transmitting and receiving from the total cycle count. | 362 | * Save a snapshot of the counter values for debugging/statistics. |
363 | * Save profile count values for debugging/statistics and because we might want | ||
364 | * to use them later. | ||
365 | * | ||
366 | * We assume no one else clears these registers! | ||
367 | */ | 363 | */ |
368 | static int | 364 | static int |
369 | ath5k_hw_ani_get_listen_time(struct ath5k_hw *ah, struct ath5k_ani_state *as) | 365 | ath5k_hw_ani_get_listen_time(struct ath5k_hw *ah, struct ath5k_ani_state *as) |
370 | { | 366 | { |
367 | struct ath_common *common = ath5k_hw_common(ah); | ||
371 | int listen; | 368 | int listen; |
372 | 369 | ||
373 | /* freeze */ | 370 | spin_lock_bh(&common->cc_lock); |
374 | ath5k_hw_reg_write(ah, AR5K_MIBC_FMC, AR5K_MIBC); | 371 | |
375 | /* read */ | 372 | ath_hw_cycle_counters_update(common); |
376 | as->pfc_cycles = ath5k_hw_reg_read(ah, AR5K_PROFCNT_CYCLE); | 373 | memcpy(&as->last_cc, &common->cc_ani, sizeof(as->last_cc)); |
377 | as->pfc_busy = ath5k_hw_reg_read(ah, AR5K_PROFCNT_RXCLR); | 374 | |
378 | as->pfc_tx = ath5k_hw_reg_read(ah, AR5K_PROFCNT_TX); | 375 | /* clears common->cc_ani */ |
379 | as->pfc_rx = ath5k_hw_reg_read(ah, AR5K_PROFCNT_RX); | 376 | listen = ath_hw_get_listen_time(common); |
380 | /* clear */ | 377 | |
381 | ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_TX); | 378 | spin_unlock_bh(&common->cc_lock); |
382 | ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_RX); | 379 | |
383 | ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_RXCLR); | ||
384 | ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_CYCLE); | ||
385 | /* un-freeze */ | ||
386 | ath5k_hw_reg_write(ah, 0, AR5K_MIBC); | ||
387 | |||
388 | /* TODO: where does 44000 come from? (11g clock rate?) */ | ||
389 | listen = (as->pfc_cycles - as->pfc_rx - as->pfc_tx) / 44000; | ||
390 | |||
391 | if (as->pfc_cycles == 0 || listen < 0) | ||
392 | return 0; | ||
393 | return listen; | 380 | return listen; |
394 | } | 381 | } |
395 | 382 | ||
diff --git a/drivers/net/wireless/ath/ath5k/ani.h b/drivers/net/wireless/ath/ath5k/ani.h index 55cf26d8522..d0a664039c8 100644 --- a/drivers/net/wireless/ath/ath5k/ani.h +++ b/drivers/net/wireless/ath/ath5k/ani.h | |||
@@ -75,10 +75,7 @@ struct ath5k_ani_state { | |||
75 | unsigned int cck_errors; | 75 | unsigned int cck_errors; |
76 | 76 | ||
77 | /* debug/statistics only: numbers from last ANI calibration */ | 77 | /* debug/statistics only: numbers from last ANI calibration */ |
78 | unsigned int pfc_tx; | 78 | struct ath_cycle_counters last_cc; |
79 | unsigned int pfc_rx; | ||
80 | unsigned int pfc_busy; | ||
81 | unsigned int pfc_cycles; | ||
82 | unsigned int last_listen; | 79 | unsigned int last_listen; |
83 | unsigned int last_ofdm_errors; | 80 | unsigned int last_ofdm_errors; |
84 | unsigned int last_cck_errors; | 81 | unsigned int last_cck_errors; |
diff --git a/drivers/net/wireless/ath/ath5k/debug.c b/drivers/net/wireless/ath/ath5k/debug.c index a342a9da1b3..a3b21712533 100644 --- a/drivers/net/wireless/ath/ath5k/debug.c +++ b/drivers/net/wireless/ath/ath5k/debug.c | |||
@@ -725,20 +725,21 @@ static ssize_t read_file_ani(struct file *file, char __user *user_buf, | |||
725 | len += snprintf(buf+len, sizeof(buf)-len, | 725 | len += snprintf(buf+len, sizeof(buf)-len, |
726 | "beacon RSSI average:\t%d\n", | 726 | "beacon RSSI average:\t%d\n", |
727 | sc->ah->ah_beacon_rssi_avg.avg); | 727 | sc->ah->ah_beacon_rssi_avg.avg); |
728 | |||
729 | #define CC_PRINT(_struct, _field) \ | ||
730 | _struct._field, \ | ||
731 | _struct.cycles > 0 ? \ | ||
732 | _struct._field*100/_struct.cycles : 0 | ||
733 | |||
728 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt tx\t\t%u\t(%d%%)\n", | 734 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt tx\t\t%u\t(%d%%)\n", |
729 | as->pfc_tx, | 735 | CC_PRINT(as->last_cc, tx_frame)); |
730 | as->pfc_cycles > 0 ? | ||
731 | as->pfc_tx*100/as->pfc_cycles : 0); | ||
732 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt rx\t\t%u\t(%d%%)\n", | 736 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt rx\t\t%u\t(%d%%)\n", |
733 | as->pfc_rx, | 737 | CC_PRINT(as->last_cc, rx_frame)); |
734 | as->pfc_cycles > 0 ? | ||
735 | as->pfc_rx*100/as->pfc_cycles : 0); | ||
736 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt busy\t\t%u\t(%d%%)\n", | 738 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt busy\t\t%u\t(%d%%)\n", |
737 | as->pfc_busy, | 739 | CC_PRINT(as->last_cc, rx_busy)); |
738 | as->pfc_cycles > 0 ? | 740 | #undef CC_PRINT |
739 | as->pfc_busy*100/as->pfc_cycles : 0); | ||
740 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt cycles\t\t%u\n", | 741 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt cycles\t\t%u\n", |
741 | as->pfc_cycles); | 742 | as->last_cc.cycles); |
742 | len += snprintf(buf+len, sizeof(buf)-len, | 743 | len += snprintf(buf+len, sizeof(buf)-len, |
743 | "listen time\t\t%d\tlast: %d\n", | 744 | "listen time\t\t%d\tlast: %d\n", |
744 | as->listen_time, as->last_listen); | 745 | as->listen_time, as->last_listen); |