ath5k: use the common cycle counter / listen time implementation
Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: Bruno Randolf <br1@einfach.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
b5bfc5683d
commit
7109ca5c80
3 changed files with 24 additions and 39 deletions
|
@ -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 */
|
|
||||||
as->pfc_cycles = ath5k_hw_reg_read(ah, AR5K_PROFCNT_CYCLE);
|
|
||||||
as->pfc_busy = ath5k_hw_reg_read(ah, AR5K_PROFCNT_RXCLR);
|
|
||||||
as->pfc_tx = ath5k_hw_reg_read(ah, AR5K_PROFCNT_TX);
|
|
||||||
as->pfc_rx = ath5k_hw_reg_read(ah, AR5K_PROFCNT_RX);
|
|
||||||
/* clear */
|
|
||||||
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_TX);
|
|
||||||
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?) */
|
ath_hw_cycle_counters_update(common);
|
||||||
listen = (as->pfc_cycles - as->pfc_rx - as->pfc_tx) / 44000;
|
memcpy(&as->last_cc, &common->cc_ani, sizeof(as->last_cc));
|
||||||
|
|
||||||
|
/* clears common->cc_ani */
|
||||||
|
listen = ath_hw_get_listen_time(common);
|
||||||
|
|
||||||
|
spin_unlock_bh(&common->cc_lock);
|
||||||
|
|
||||||
if (as->pfc_cycles == 0 || listen < 0)
|
|
||||||
return 0;
|
|
||||||
return listen;
|
return listen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue