summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/carl9170/cmd.c
diff options
context:
space:
mode:
authorChristian Lamparter2011-08-15 19:50:48 +0200
committerJohn W. Linville2011-08-24 20:41:42 +0200
commitacf1771221f2877ab5d36487930cd6a2ecaa73e6 (patch)
treecbe4f29eb2b7c5a78a63f99bdffdbaaac141ef33 /drivers/net/wireless/ath/carl9170/cmd.c
parentcarl9170: import updated firmware headers (diff)
downloadkernel-qcow2-linux-acf1771221f2877ab5d36487930cd6a2ecaa73e6.tar.gz
kernel-qcow2-linux-acf1771221f2877ab5d36487930cd6a2ecaa73e6.tar.xz
kernel-qcow2-linux-acf1771221f2877ab5d36487930cd6a2ecaa73e6.zip
carl9170: improve site survey
The firmware keeps track of channel usage. This data can be used by the automatic channel selection to find the *best* channel. Survey data from wlan22 frequency: 2412 MHz [in use] noise: -86 dBm channel active time: 3339608 ms channel busy time: 270982 ms channel transmit time: 121515 ms Survey data from wlan22 frequency: 2417 MHz noise: -86 dBm channel active time: 70 ms channel busy time: 2 ms channel transmit time: 1 ms Signed-off-by: Christian Lamparter <chunkeey@googlemail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/carl9170/cmd.c')
-rw-r--r--drivers/net/wireless/ath/carl9170/cmd.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/carl9170/cmd.c b/drivers/net/wireless/ath/carl9170/cmd.c
index cdfc94c371b4..9970bf8edc40 100644
--- a/drivers/net/wireless/ath/carl9170/cmd.c
+++ b/drivers/net/wireless/ath/carl9170/cmd.c
@@ -165,6 +165,37 @@ int carl9170_bcn_ctrl(struct ar9170 *ar, const unsigned int vif_id,
return __carl9170_exec_cmd(ar, cmd, true);
}
+int carl9170_collect_tally(struct ar9170 *ar)
+{
+ struct carl9170_tally_rsp tally;
+ struct survey_info *info;
+ unsigned int tick;
+ int err;
+
+ err = carl9170_exec_cmd(ar, CARL9170_CMD_TALLY, 0, NULL,
+ sizeof(tally), (u8 *)&tally);
+ if (err)
+ return err;
+
+ tick = le32_to_cpu(tally.tick);
+ if (tick) {
+ ar->tally.active += le32_to_cpu(tally.active) / tick;
+ ar->tally.cca += le32_to_cpu(tally.cca) / tick;
+ ar->tally.tx_time += le32_to_cpu(tally.tx_time) / tick;
+ ar->tally.rx_total += le32_to_cpu(tally.rx_total);
+ ar->tally.rx_overrun += le32_to_cpu(tally.rx_overrun);
+
+ if (ar->channel) {
+ info = &ar->survey[ar->channel->hw_value];
+
+ info->channel_time = ar->tally.active / 1000;
+ info->channel_time_busy = ar->tally.cca / 1000;
+ info->channel_time_tx = ar->tally.tx_time / 1000;
+ }
+ }
+ return 0;
+}
+
int carl9170_powersave(struct ar9170 *ar, const bool ps)
{
struct carl9170_cmd *cmd;