summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/523-ath5k_use_common_counters.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/523-ath5k_use_common_counters.patch')
-rw-r--r--package/mac80211/patches/523-ath5k_use_common_counters.patch104
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);