Commit 7109ca5c authored by Felix Fietkau's avatar Felix Fietkau Committed by John W. Linville

ath5k: use the common cycle counter / listen time implementation

Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarBruno Randolf <br1@einfach.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent b5bfc568
...@@ -355,41 +355,28 @@ ath5k_ani_lower_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as) ...@@ -355,41 +355,28 @@ ath5k_ani_lower_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as)
/** /**
* ath5k_hw_ani_get_listen_time() - Calculate time spent listening * ath5k_hw_ani_get_listen_time() - Update counters and return listening time
* *
* Return an approximation of the time spent "listening" in milliseconds (ms) * Return an approximation of the time spent "listening" in milliseconds (ms)
* since the last call of this function by deducting the cycles spent * since the last call of this function.
* transmitting and receiving from the total cycle count. * Save a snapshot of the counter values for debugging/statistics.
* Save profile count values for debugging/statistics and because we might want
* to use them later.
*
* We assume no one else clears these registers!
*/ */
static int static int
ath5k_hw_ani_get_listen_time(struct ath5k_hw *ah, struct ath5k_ani_state *as) ath5k_hw_ani_get_listen_time(struct ath5k_hw *ah, struct ath5k_ani_state *as)
{ {
struct ath_common *common = ath5k_hw_common(ah);
int listen; int listen;
/* freeze */ spin_lock_bh(&common->cc_lock);
ath5k_hw_reg_write(ah, AR5K_MIBC_FMC, AR5K_MIBC);
/* read */ ath_hw_cycle_counters_update(common);
as->pfc_cycles = ath5k_hw_reg_read(ah, AR5K_PROFCNT_CYCLE); memcpy(&as->last_cc, &common->cc_ani, sizeof(as->last_cc));
as->pfc_busy = ath5k_hw_reg_read(ah, AR5K_PROFCNT_RXCLR);
as->pfc_tx = ath5k_hw_reg_read(ah, AR5K_PROFCNT_TX); /* clears common->cc_ani */
as->pfc_rx = ath5k_hw_reg_read(ah, AR5K_PROFCNT_RX); listen = ath_hw_get_listen_time(common);
/* clear */
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_TX); spin_unlock_bh(&common->cc_lock);
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_RX);
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_RXCLR);
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_CYCLE);
/* un-freeze */
ath5k_hw_reg_write(ah, 0, AR5K_MIBC);
/* TODO: where does 44000 come from? (11g clock rate?) */
listen = (as->pfc_cycles - as->pfc_rx - as->pfc_tx) / 44000;
if (as->pfc_cycles == 0 || listen < 0)
return 0;
return listen; return listen;
} }
......
...@@ -75,10 +75,7 @@ struct ath5k_ani_state { ...@@ -75,10 +75,7 @@ struct ath5k_ani_state {
unsigned int cck_errors; unsigned int cck_errors;
/* debug/statistics only: numbers from last ANI calibration */ /* debug/statistics only: numbers from last ANI calibration */
unsigned int pfc_tx; struct ath_cycle_counters last_cc;
unsigned int pfc_rx;
unsigned int pfc_busy;
unsigned int pfc_cycles;
unsigned int last_listen; unsigned int last_listen;
unsigned int last_ofdm_errors; unsigned int last_ofdm_errors;
unsigned int last_cck_errors; unsigned int last_cck_errors;
......
...@@ -725,20 +725,21 @@ static ssize_t read_file_ani(struct file *file, char __user *user_buf, ...@@ -725,20 +725,21 @@ static ssize_t read_file_ani(struct file *file, char __user *user_buf,
len += snprintf(buf+len, sizeof(buf)-len, len += snprintf(buf+len, sizeof(buf)-len,
"beacon RSSI average:\t%d\n", "beacon RSSI average:\t%d\n",
sc->ah->ah_beacon_rssi_avg.avg); sc->ah->ah_beacon_rssi_avg.avg);
#define CC_PRINT(_struct, _field) \
_struct._field, \
_struct.cycles > 0 ? \
_struct._field*100/_struct.cycles : 0
len += snprintf(buf+len, sizeof(buf)-len, "profcnt tx\t\t%u\t(%d%%)\n", len += snprintf(buf+len, sizeof(buf)-len, "profcnt tx\t\t%u\t(%d%%)\n",
as->pfc_tx, CC_PRINT(as->last_cc, tx_frame));
as->pfc_cycles > 0 ?
as->pfc_tx*100/as->pfc_cycles : 0);
len += snprintf(buf+len, sizeof(buf)-len, "profcnt rx\t\t%u\t(%d%%)\n", len += snprintf(buf+len, sizeof(buf)-len, "profcnt rx\t\t%u\t(%d%%)\n",
as->pfc_rx, CC_PRINT(as->last_cc, rx_frame));
as->pfc_cycles > 0 ?
as->pfc_rx*100/as->pfc_cycles : 0);
len += snprintf(buf+len, sizeof(buf)-len, "profcnt busy\t\t%u\t(%d%%)\n", len += snprintf(buf+len, sizeof(buf)-len, "profcnt busy\t\t%u\t(%d%%)\n",
as->pfc_busy, CC_PRINT(as->last_cc, rx_busy));
as->pfc_cycles > 0 ? #undef CC_PRINT
as->pfc_busy*100/as->pfc_cycles : 0);
len += snprintf(buf+len, sizeof(buf)-len, "profcnt cycles\t\t%u\n", len += snprintf(buf+len, sizeof(buf)-len, "profcnt cycles\t\t%u\n",
as->pfc_cycles); as->last_cc.cycles);
len += snprintf(buf+len, sizeof(buf)-len, len += snprintf(buf+len, sizeof(buf)-len,
"listen time\t\t%d\tlast: %d\n", "listen time\t\t%d\tlast: %d\n",
as->listen_time, as->last_listen); as->listen_time, as->last_listen);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment