diff options
| author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-10-09 00:36:54 +0000 | 
|---|---|---|
| committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-10-09 00:36:54 +0000 | 
| commit | 51b8905a6966c96e1178b6ff0fde7b46f842eb31 (patch) | |
| tree | 45ac651452b19d2a2c71210fe9c0c254f9db28e5 /package/mac80211/patches/523-ath5k_use_common_counters.patch | |
| parent | 80a1b7ac3cda1da34a8934946b1cdf09169b730d (diff) | |
ath9k: implement extended channel utilization statistics via survey
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@23350 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211/patches/523-ath5k_use_common_counters.patch')
| -rw-r--r-- | package/mac80211/patches/523-ath5k_use_common_counters.patch | 104 | 
1 files changed, 104 insertions, 0 deletions
diff --git a/package/mac80211/patches/523-ath5k_use_common_counters.patch b/package/mac80211/patches/523-ath5k_use_common_counters.patch new file mode 100644 index 000000000..1899f8d46 --- /dev/null +++ b/package/mac80211/patches/523-ath5k_use_common_counters.patch @@ -0,0 +1,104 @@ +--- 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 +  +  + /** +- * 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) +- * since the last call of this function by deducting the cycles spent +- * transmitting and receiving from the total cycle count. +- * Save profile count values for debugging/statistics and because we might want +- * to use them later. +- * +- * We assume no one else clears these registers! ++ * since the last call of this function. ++ * Save a snapshot of the counter values for debugging/statistics. +  */ + static int + 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; +  +-	/* freeze */ +-	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); ++	spin_lock_bh(&common->cc_lock); +  +-	/* TODO: where does 44000 come from? (11g clock rate?) */ +-	listen = (as->pfc_cycles - as->pfc_rx - as->pfc_tx) / 44000; ++	ath_hw_cycle_counters_update(common); ++	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; + } +  +--- a/drivers/net/wireless/ath/ath5k/ani.h ++++ b/drivers/net/wireless/ath/ath5k/ani.h +@@ -75,10 +75,7 @@ struct ath5k_ani_state { + 	unsigned int		cck_errors; +  + 	/* debug/statistics only: numbers from last ANI calibration */ +-	unsigned int		pfc_tx; +-	unsigned int		pfc_rx; +-	unsigned int		pfc_busy; +-	unsigned int		pfc_cycles; ++	struct ath_cycle_counters last_cc; + 	unsigned int		last_listen; + 	unsigned int		last_ofdm_errors; + 	unsigned int		last_cck_errors; +--- a/drivers/net/wireless/ath/ath5k/debug.c ++++ b/drivers/net/wireless/ath/ath5k/debug.c +@@ -715,20 +715,21 @@ static ssize_t read_file_ani(struct file + 	len += snprintf(buf+len, sizeof(buf)-len, + 			"beacon RSSI average:\t%d\n", + 			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", +-			as->pfc_tx, +-			as->pfc_cycles > 0 ? +-			as->pfc_tx*100/as->pfc_cycles : 0); ++			CC_PRINT(as->last_cc, tx_frame)); + 	len += snprintf(buf+len, sizeof(buf)-len, "profcnt rx\t\t%u\t(%d%%)\n", +-			as->pfc_rx, +-			as->pfc_cycles > 0 ? +-			as->pfc_rx*100/as->pfc_cycles : 0); ++			CC_PRINT(as->last_cc, rx_frame)); + 	len += snprintf(buf+len, sizeof(buf)-len, "profcnt busy\t\t%u\t(%d%%)\n", +-			as->pfc_busy, +-			as->pfc_cycles > 0 ? +-			as->pfc_busy*100/as->pfc_cycles : 0); ++			CC_PRINT(as->last_cc, rx_busy)); ++#undef CC_PRINT + 	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, + 			"listen time\t\t%d\tlast: %d\n", + 			as->listen_time, as->last_listen);  | 
