Refactoring spectral scan code and add support for ath9k_htc
cover Refactoring spectral scan code and add support for ath9k_htc
The patches move the common components of spectral scan funcationality to common-spectral.c
Also added spectral scan support to ath9k_htc using the same mechanism to collect spectral scan data as used by ath9k driver
This work was done at the Wisconsin Wireless and NetworkinG Systems (WiNGS) Lab at the University of Wisconsin Madison.
Ashish Patro (3):
Moving the ath9k specific spectral functions to ath9k.h from
spectral.h
Refactoring the ath9k driver to move common spectral functions to
common-spectral.c
Adding spectral scan functionality to ath9k_htc driver. Tested using
a AR9271 WiFi card.
drivers/net/wireless/ath/ath9k/Makefile | 3 +- drivers/net/wireless/ath/ath9k/ar9002_phy.c | 10 +- drivers/net/wireless/ath/ath9k/ath9k.h | 7 + drivers/net/wireless/ath/ath9k/common-spectral.c | 216 +++++++++++++ drivers/net/wireless/ath/ath9k/htc.h | 13 + drivers/net/wireless/ath/ath9k/htc_drv_debug.c | 5 +- drivers/net/wireless/ath/ath9k/htc_drv_init.c | 8 + drivers/net/wireless/ath/ath9k/htc_drv_main.c | 81 +++++ drivers/net/wireless/ath/ath9k/htc_drv_spectral.c | 358 +++++++++++++++++++++ drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 17 + drivers/net/wireless/ath/ath9k/recv.c | 5 +- drivers/net/wireless/ath/ath9k/spectral.c | 187 ----------- drivers/net/wireless/ath/ath9k/spectral.h | 23 +- 13 files changed, 723 insertions(+), 210 deletions(-) create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
Signature · 1 line
1.7.5.4
PATCH 1/3 Moving the ath9k specific spectral functions to ath9k.h from spectral.h
--- drivers/net/wireless/ath/ath9k/ath9k.h | 19 +++++++++++++++++++ drivers/net/wireless/ath/ath9k/spectral.h | 19 ------------------- 2 files changed, 19 insertions(+), 19 deletions(-)
drivers/net/wireless/ath/ath9k/ath9k.h +19 -0
@@ -834,4 +834,23 @@ static inline int ath_ahb_init(void) { return 0; };static inline void ath_ahb_exit (void ) {};#endif +void ath9k_spectral_init_debug (struct ath_softc *sc); +void ath9k_spectral_deinit_debug (struct ath_softc *sc); + +void ath9k_spectral_scan_trigger (struct ieee80211_hw *hw); +int ath9k_spectral_scan_config (struct ieee80211_hw *hw, +enum spectral_mode spectral_mode); + +#ifdef CONFIG_ATH9K_DEBUGFS +int ath_process_fft (struct ath_softc *sc,struct ieee80211_hdr *hdr, +struct ath_rx_status *rs,u64 tsf); +#else +static inline int ath_process_fft (struct ath_softc *sc, +struct ieee80211_hdr *hdr, +struct ath_rx_status *rs,u64 tsf) +{ +return 0 ; +} +#endif /* CONFIG_ATH9K_DEBUGFS */ +#endif /* ATH9K_H */
drivers/net/wireless/ath/ath9k/spectral.h +0 -19
@@ -190,23 +190,4 @@ struct fft_sample_ht20_40 { u8 data[SPECTRAL_HT20_40_NUM_BINS]; } __packed; -void ath9k_spectral_init_debug (struct ath_softc *sc); -void ath9k_spectral_deinit_debug (struct ath_softc *sc); - -void ath9k_spectral_scan_trigger (struct ieee80211_hw *hw); -int ath9k_spectral_scan_config (struct ieee80211_hw *hw, -enum spectral_mode spectral_mode); - -#ifdef CONFIG_ATH9K_DEBUGFS -int ath_process_fft (struct ath_softc *sc,struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf); -#else -static inline int ath_process_fft (struct ath_softc *sc, -struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf) -{ -return 0 ; -} -#endif /* CONFIG_ATH9K_DEBUGFS */ -#endif /* SPECTRAL_H */
Signature · 1 line
1.7.5.4
PATCH 1/3 Moving the ath9k specific spectral functions to ath9k.h from spectral.h
Am 14.04.2014 20:29, schrieb Ashish Patro:
Quoted 21 lines
--- drivers/net/wireless/ath/ath9k/ath9k.h | 19 +++++++++++++++++++ drivers/net/wireless/ath/ath9k/spectral.h | 19 ------------------- 2 files changed, 19 insertions(+), 19 deletions(-)drivers/net/wireless/ath/ath9k/ath9k.h +8
-0@@ -834,4 +834,23 @@ static inline int ath_ahb_init(void) { return 0; };static inline void ath_ahb_exit (void ) {};#endif +void ath9k_spectral_init_debug (struct ath_softc *sc); +void ath9k_spectral_deinit_debug (struct ath_softc *sc); + +void ath9k_spectral_scan_trigger (struct ieee80211_hw *hw); +int ath9k_spectral_scan_config (struct ieee80211_hw *hw, +enum spectral_mode spectral_mode); + +#ifdef CONFIG_ATH9K_DEBUGFS
drivers/net/wireless/ath/ath9k/ath9k.h static inline int ath_ahb_init(void) { return 0; }; · line 854
Quoted 10 lines
drivers/net/wireless/ath/ath9k/ath9k.h +10
-0+int ath_process_fft (struct ath_softc *sc,struct ieee80211_hdr *hdr, +struct ath_rx_status *rs,u64 tsf); +#else +static inline int ath_process_fft (struct ath_softc *sc, +struct ieee80211_hdr *hdr, +struct ath_rx_status *rs,u64 tsf) +{ +return 0 ; +} +#endif /* CONFIG_ATH9K_DEBUGFS */
It is ok to place them here, but i would prefer to have them in common-spectral.h
Quoted 30 lines
drivers/net/wireless/ath/ath9k/ath9k.h +0
-0#endif /* ATH9K_H */ drivers/net/wireless/ath/ath9k/spectral.h +0
-19@@ -190,23 +190,4 @@ struct fft_sample_ht20_40 { u8 data[SPECTRAL_HT20_40_NUM_BINS]; } __packed; -void ath9k_spectral_init_debug (struct ath_softc *sc); -void ath9k_spectral_deinit_debug (struct ath_softc *sc); - -void ath9k_spectral_scan_trigger (struct ieee80211_hw *hw); -int ath9k_spectral_scan_config (struct ieee80211_hw *hw, -enum spectral_mode spectral_mode); - -#ifdef CONFIG_ATH9K_DEBUGFS -int ath_process_fft (struct ath_softc *sc,struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf); -#else -static inline int ath_process_fft (struct ath_softc *sc, -struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf) -{ -return 0 ; -} -#endif /* CONFIG_ATH9K_DEBUGFS */ -#endif /* SPECTRAL_H */
Signature · 10 lines
Regards, Oleksij -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 278 bytes Desc: OpenPGP digital signature Url : http://lists.ath9k.org/pipermail/ath9k-devel/attachments/20140414/df1f1527/attachment.pgp
PATCH 2/3 Refactoring the ath9k driver to move common spectral functions to common-spectral.c
In reply to Ashish Patro--- drivers/net/wireless/ath/ath9k/Makefile | 1 + drivers/net/wireless/ath/ath9k/ath9k.h | 12 -- drivers/net/wireless/ath/ath9k/common-spectral.c | 216 ++++++++++++++++++++++ drivers/net/wireless/ath/ath9k/recv.c | 5 +- drivers/net/wireless/ath/ath9k/spectral.c | 187 ------------------- drivers/net/wireless/ath/ath9k/spectral.h | 6 + 6 files changed, 227 insertions(+), 200 deletions(-) create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c
drivers/net/wireless/ath/ath9k/Makefile +1 -0
@@ -53,6 +53,7 @@ obj-$(CONFIG_ATH9K_HW) += ath9k_hw.o obj-$(CONFIG_ATH9K_COMMON) += ath9k_common.o ath9k_common-y:= common.o \ common-init.o \ + common-spectral.o \ common-beacon.o ath9k_htc-y += htc_hst.o \
drivers/net/wireless/ath/ath9k/ath9k.h +0 -12
@@ -841,16 +841,4 @@ void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw);int ath9k_spectral_scan_config (struct ieee80211_hw *hw,enum spectral_mode spectral_mode); -#ifdef CONFIG_ATH9K_DEBUGFS -int ath_process_fft (struct ath_softc *sc,struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf); -#else -static inline int ath_process_fft (struct ath_softc *sc, -struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf) -{ -return 0 ; -} -#endif /* CONFIG_ATH9K_DEBUGFS */ -#endif /* ATH9K_H */
drivers/net/wireless/ath/ath9k/common-spectral.c new file +216 -0
216 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/recv.c +4 -1
@@ -847,8 +847,11 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc,*/ if (rx_stats->rs_status &ATH9K_RXERR_PHY ) {ath9k_dfs_process_phyerr (sc, hdr, rx_stats, rx_status->mactime); -if (ath_process_fft (sc, hdr, rx_stats, rx_status->mactime)) + +#ifdef CONFIG_ATH9K_DEBUGFS +if (ath_process_fft (sc->sc_ah, hdr, sc->hw, sc->rfs_chan_spec_scan, rx_stats, rx_status->mactime, false))RX_STAT_INC (rx_spectral); +#endif return -EINVAL ; }
drivers/net/wireless/ath/ath9k/spectral.c +0 -187
193 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/spectral.h +6 -0
@@ -17,6 +17,8 @@#ifndef SPECTRAL_H #define SPECTRAL_H +#include <linux/relay.h> +/* enum spectral_mode: * * @SPECTRAL_DISABLED: spectral mode is disabled
@@ -190,4 +192,8 @@ struct fft_sample_ht20_40 { u8 data[SPECTRAL_HT20_40_NUM_BINS]; } __packed; +int ath_process_fft (struct ath_hw *ah,struct ieee80211_hdr *hdr, +struct ieee80211_hw *hw,struct rchan *rfs_chan_spec_scan, +struct ath_rx_status *rs,u64 tsf,bool is_htc); +#endif /* SPECTRAL_H */
Signature · 1 line
1.7.5.4
PATCH 2/3 Refactoring the ath9k driver to move common spectral functions to common-spectral.c
Am 14.04.2014 20:29, schrieb Ashish Patro:
Quoted 31 lines
--- drivers/net/wireless/ath/ath9k/Makefile | 1 + drivers/net/wireless/ath/ath9k/ath9k.h | 12 -- drivers/net/wireless/ath/ath9k/common-spectral.c | 216 ++++++++++++++++++++++ drivers/net/wireless/ath/ath9k/recv.c | 5 +- drivers/net/wireless/ath/ath9k/spectral.c | 187 ------------------- drivers/net/wireless/ath/ath9k/spectral.h | 6 + 6 files changed, 227 insertions(+), 200 deletions(-) create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.cdrivers/net/wireless/ath/ath9k/Makefile +1
-0@@ -53,6 +53,7 @@ obj-$(CONFIG_ATH9K_HW) += ath9k_hw.o obj-$(CONFIG_ATH9K_COMMON) += ath9k_common.o ath9k_common-y:= common.o \ common-init.o \ + common-spectral.o \ common-beacon.o ath9k_htc-y += htc_hst.o \drivers/net/wireless/ath/ath9k/ath9k.h +0
-1@@ -841,16 +841,4 @@ void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw);int ath9k_spectral_scan_config (struct ieee80211_hw *hw,enum spectral_mode spectral_mode); -#ifdef CONFIG_ATH9K_DEBUGFS
drivers/net/wireless/ath/ath9k/ath9k.h void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw); · line 854
Quoted 10 lines
drivers/net/wireless/ath/ath9k/ath9k.h +0
-10-int ath_process_fft (struct ath_softc *sc,struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf); -#else -static inline int ath_process_fft (struct ath_softc *sc, -struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf) -{ -return 0 ; -} -#endif /* CONFIG_ATH9K_DEBUGFS */
you moved this part in laste patch from spectralscan.h to ath9k.h. If you wont to move it other place you should do it in previous patch.
Quoted 57 lines
drivers/net/wireless/ath/ath9k/ath9k.h +0
-0#endif /* ATH9K_H */ drivers/net/wireless/ath/ath9k/common-spectral.c new file +50
-0@@ -0,0 +1,216 @@ +/* +* Copyright (c) 2013 Qualcomm Atheros, Inc. +* +* Permission to use, copy, modify, and/or distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "common.h" +#include "spectral.h" + +static s8 fix_rssi_inv_only (u8 rssi_val) +{ +if (rssi_val ==128 ) + rssi_val =0 ; +return (s8 ) rssi_val; +} + +static void ath_debug_send_fft_sample (struct rchan *rfs_chan_spec_scan, +struct fft_sample_tlv *fft_sample_tlv) +{ +int length; +if (!rfs_chan_spec_scan) +return ; + + length =__be16_to_cpu (fft_sample_tlv->length) + +sizeof (*fft_sample_tlv); +relay_write (rfs_chan_spec_scan, fft_sample_tlv, length); +} + +/* returns 1 if this was a spectral frame, even if not handled. */ +int ath_process_fft (struct ath_hw *ah,struct ieee80211_hdr *hdr, +struct ieee80211_hw *hw,struct rchan *rfs_chan_spec_scan, +struct ath_rx_status *rs,u64 tsf,bool is_htc) +{ +u8 num_bins, *bins, *vdata = (u8 *)hdr; +struct fft_sample_ht20 fft_sample_20; +struct fft_sample_ht20_40 fft_sample_40; +struct fft_sample_tlv *tlv; +struct ath_radar_info *radar_info; +int dc_pos; +u16 fft_len, length, freq = ah->curchan->chan->center_freq;
drivers/net/wireless/ath/ath9k/common-spectral.c line 60
Quoted 10 lines
drivers/net/wireless/ath/ath9k/common-spectral.c new file +10
-0+enum nl80211_channel_type chan_type; +int len =0 ; + +/* Getting the length from AR9271 chipsets. +*/ +if (is_htc) { + len =be16_to_cpu (rs->rs_datalen); + }else { + len = rs->rs_datalen; + }
1. This patch should not include HTC related changes. You should just move code without changing it. Think about people who need to fix it if some thing went wrong with this patch set.
2. Use linux/scripts/checkpatch.pl before sending patch for review. It will save time you and me ;)
Quoted 385 lines
drivers/net/wireless/ath/ath9k/common-spectral.c new file +155
-0+/* AR9280 and before report via ATH9K_PHYERR_RADAR, AR93xx and newer +* via ATH9K_PHYERR_SPECTRAL. Haven't seen ATH9K_PHYERR_FALSE_RADAR_EXT +* yet, but this is supposed to be possible as well. +*/ +if (rs->rs_phyerr !=ATH9K_PHYERR_RADAR && + rs->rs_phyerr !=ATH9K_PHYERR_FALSE_RADAR_EXT && + rs->rs_phyerr !=ATH9K_PHYERR_SPECTRAL ) +return 0 ; + +/* check if spectral scan bit is set. This does not have to be checked +* if received through a SPECTRAL phy error, but shouldn't hurt. +*/ + radar_info = ((struct ath_radar_info *)&vdata[len]) -1 ; +if (!(radar_info->pulse_bw_info &SPECTRAL_SCAN_BITMASK )) +return 0 ; + + chan_type =cfg80211_get_chandef_type (&hw->conf.chandef); + +if ((chan_type ==NL80211_CHAN_HT40MINUS ) || + (chan_type ==NL80211_CHAN_HT40PLUS )) { + fft_len =SPECTRAL_HT20_40_TOTAL_DATA_LEN ; + num_bins =SPECTRAL_HT20_40_NUM_BINS ; + bins = (u8 *)fft_sample_40.data; + }else { + fft_len =SPECTRAL_HT20_TOTAL_DATA_LEN ; + num_bins =SPECTRAL_HT20_NUM_BINS ; + bins = (u8 *)fft_sample_20.data; + } + +/* Variation in the data length is possible and will be fixed later */ +if ((len > fft_len +2 ) || (len < fft_len -1 )) +return 1 ; + +switch (len - fft_len) { +case 0 : +/* length correct, nothing to do. */ +memcpy (bins, vdata, num_bins); +break ; +case -1 : +/* first byte missing, duplicate it. */ +memcpy (&bins[1 ], vdata, num_bins -1 ); + bins[0 ] = vdata[0 ]; +break ; +case 2 : +/* MAC added 2 extra bytes at bin 30 and 32, remove them. */ +memcpy (bins, vdata,30 ); + bins[30 ] = vdata[31 ]; +memcpy (&bins[31 ], &vdata[33 ], num_bins -31 ); +break ; +case 1 : +/* MAC added 2 extra bytes AND first byte is missing. */ + bins[0 ] = vdata[0 ]; +memcpy (&bins[1 ], vdata,30 ); + bins[31 ] = vdata[31 ]; +memcpy (&bins[32 ], &vdata[33 ], num_bins -32 ); +break ; +default : +return 1 ; + } + +/* DC value (value in the middle) is the blind spot of the spectral +* sample and invalid, interpolate it. +*/ + dc_pos = num_bins /2 ; + bins[dc_pos] = (bins[dc_pos +1 ] + bins[dc_pos -1 ]) /2 ; + +if ((chan_type ==NL80211_CHAN_HT40MINUS ) || + (chan_type ==NL80211_CHAN_HT40PLUS )) { +s8 lower_rssi, upper_rssi; +s16 ext_nf; +u8 lower_max_index, upper_max_index; +u8 lower_bitmap_w, upper_bitmap_w; +u16 lower_mag, upper_mag; +struct ath9k_hw_cal_data *caldata = ah->caldata; +struct ath_ht20_40_mag_info *mag_info; + +if (caldata) + ext_nf =ath9k_hw_getchan_noise (ah, ah->curchan, + caldata->nfCalHist[3 ].privNF); +else + ext_nf =ATH_DEFAULT_NOISE_FLOOR ; + + length =sizeof (fft_sample_40) -sizeof (struct fft_sample_tlv ); + fft_sample_40.tlv.type =ATH_FFT_SAMPLE_HT20_40 ; + fft_sample_40.tlv.length =__cpu_to_be16 (length); + fft_sample_40.freq =__cpu_to_be16 (freq); + fft_sample_40.channel_type = chan_type; + +if (chan_type ==NL80211_CHAN_HT40PLUS ) { + lower_rssi =fix_rssi_inv_only (rs->rs_rssi_ctl[0 ]); + upper_rssi =fix_rssi_inv_only (rs->rs_rssi_ext[0 ]); + + fft_sample_40.lower_noise = ah->noise; + fft_sample_40.upper_noise = ext_nf; + }else { + lower_rssi =fix_rssi_inv_only (rs->rs_rssi_ext[0 ]); + upper_rssi =fix_rssi_inv_only (rs->rs_rssi_ctl[0 ]); + + fft_sample_40.lower_noise = ext_nf; + fft_sample_40.upper_noise = ah->noise; + } + fft_sample_40.lower_rssi = lower_rssi; + fft_sample_40.upper_rssi = upper_rssi; + + mag_info = ((struct ath_ht20_40_mag_info *)radar_info) -1 ; + lower_mag =spectral_max_magnitude (mag_info->lower_bins); + upper_mag =spectral_max_magnitude (mag_info->upper_bins); + fft_sample_40.lower_max_magnitude =__cpu_to_be16 (lower_mag); + fft_sample_40.upper_max_magnitude =__cpu_to_be16 (upper_mag); + lower_max_index =spectral_max_index (mag_info->lower_bins); + upper_max_index =spectral_max_index (mag_info->upper_bins); + fft_sample_40.lower_max_index = lower_max_index; + fft_sample_40.upper_max_index = upper_max_index; + lower_bitmap_w =spectral_bitmap_weight (mag_info->lower_bins); + upper_bitmap_w =spectral_bitmap_weight (mag_info->upper_bins); + fft_sample_40.lower_bitmap_weight = lower_bitmap_w; + fft_sample_40.upper_bitmap_weight = upper_bitmap_w; + fft_sample_40.max_exp = mag_info->max_exp &0xf ; + + fft_sample_40.tsf =__cpu_to_be64 (tsf); + + tlv = (struct fft_sample_tlv *)&fft_sample_40; + }else { +u8 max_index, bitmap_w; +u16 magnitude; +struct ath_ht20_mag_info *mag_info; + + length =sizeof (fft_sample_20) -sizeof (struct fft_sample_tlv ); + fft_sample_20.tlv.type =ATH_FFT_SAMPLE_HT20 ; + fft_sample_20.tlv.length =__cpu_to_be16 (length); + fft_sample_20.freq =__cpu_to_be16 (freq); + + fft_sample_20.rssi =fix_rssi_inv_only (rs->rs_rssi_ctl[0 ]); + fft_sample_20.noise = ah->noise; + + mag_info = ((struct ath_ht20_mag_info *)radar_info) -1 ; + magnitude =spectral_max_magnitude (mag_info->all_bins); + fft_sample_20.max_magnitude =__cpu_to_be16 (magnitude); + max_index =spectral_max_index (mag_info->all_bins); + fft_sample_20.max_index = max_index; + bitmap_w =spectral_bitmap_weight (mag_info->all_bins); + fft_sample_20.bitmap_weight = bitmap_w; + fft_sample_20.max_exp = mag_info->max_exp &0xf ; + + fft_sample_20.tsf =__cpu_to_be64 (tsf); + + tlv = (struct fft_sample_tlv *)&fft_sample_20; + } + +ath_debug_send_fft_sample (rfs_chan_spec_scan, tlv); + +return 1 ; +} +EXPORT_SYMBOL (ath_process_fft); +drivers/net/wireless/ath/ath9k/recv.c +4
-1@@ -847,8 +847,11 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc,*/ if (rx_stats->rs_status &ATH9K_RXERR_PHY ) {ath9k_dfs_process_phyerr (sc, hdr, rx_stats, rx_status->mactime); -if (ath_process_fft (sc, hdr, rx_stats, rx_status->mactime)) + +#ifdef CONFIG_ATH9K_DEBUGFS +if (ath_process_fft (sc->sc_ah, hdr, sc->hw, sc->rfs_chan_spec_scan, rx_stats, rx_status->mactime, false))RX_STAT_INC (rx_spectral); +#endif return -EINVAL ; }drivers/net/wireless/ath/ath9k/spectral.c +0
-187@@ -17,193 +17,6 @@#include <linux/relay.h> #include "ath9k.h" -static s8 fix_rssi_inv_only (u8 rssi_val) -{ -if (rssi_val ==128 ) - rssi_val =0 ; -return (s8 ) rssi_val; -} - -static void ath_debug_send_fft_sample (struct ath_softc *sc, -struct fft_sample_tlv *fft_sample_tlv) -{ -int length; -if (!sc->rfs_chan_spec_scan) -return ; - - length =__be16_to_cpu (fft_sample_tlv->length) + -sizeof (*fft_sample_tlv); -relay_write (sc->rfs_chan_spec_scan, fft_sample_tlv, length); -} - -/* returns 1 if this was a spectral frame, even if not handled. */ -int ath_process_fft (struct ath_softc *sc,struct ieee80211_hdr *hdr, -struct ath_rx_status *rs,u64 tsf) -{ -struct ath_hw *ah = sc->sc_ah; -u8 num_bins, *bins, *vdata = (u8 *)hdr; -struct fft_sample_ht20 fft_sample_20; -struct fft_sample_ht20_40 fft_sample_40; -struct fft_sample_tlv *tlv; -struct ath_radar_info *radar_info; -int len = rs->rs_datalen; -int dc_pos; -u16 fft_len, length, freq = ah->curchan->chan->center_freq; -enum nl80211_channel_type chan_type; - -/* AR9280 and before report via ATH9K_PHYERR_RADAR, AR93xx and newer -* via ATH9K_PHYERR_SPECTRAL. Haven't seen ATH9K_PHYERR_FALSE_RADAR_EXT -* yet, but this is supposed to be possible as well. -*/ -if (rs->rs_phyerr !=ATH9K_PHYERR_RADAR && - rs->rs_phyerr !=ATH9K_PHYERR_FALSE_RADAR_EXT && - rs->rs_phyerr !=ATH9K_PHYERR_SPECTRAL ) -return 0 ; - -/* check if spectral scan bit is set. This does not have to be checked -* if received through a SPECTRAL phy error, but shouldn't hurt. -*/ - radar_info = ((struct ath_radar_info *)&vdata[len]) -1 ; -if (!(radar_info->pulse_bw_info &SPECTRAL_SCAN_BITMASK )) -return 0 ; - - chan_type =cfg80211_get_chandef_type (&sc->hw->conf.chandef); -if ((chan_type ==NL80211_CHAN_HT40MINUS ) || - (chan_type ==NL80211_CHAN_HT40PLUS )) { - fft_len =SPECTRAL_HT20_40_TOTAL_DATA_LEN ; - num_bins =SPECTRAL_HT20_40_NUM_BINS ; - bins = (u8 *)fft_sample_40.data; - }else { - fft_len =SPECTRAL_HT20_TOTAL_DATA_LEN ; - num_bins =SPECTRAL_HT20_NUM_BINS ; - bins = (u8 *)fft_sample_20.data; - } - -/* Variation in the data length is possible and will be fixed later */ -if ((len > fft_len +2 ) || (len < fft_len -1 )) -return 1 ; - -switch (len - fft_len) { -case 0 : -/* length correct, nothing to do. */ -memcpy (bins, vdata, num_bins); -break ; -case -1 : -/* first byte missing, duplicate it. */ -memcpy (&bins[1 ], vdata, num_bins -1 ); - bins[0 ] = vdata[0 ]; -break ; -case 2 : -/* MAC added 2 extra bytes at bin 30 and 32, remove them. */ -memcpy (bins, vdata,30 ); - bins[30 ] = vdata[31 ]; -memcpy (&bins[31 ], &vdata[33 ], num_bins -31 ); -break ; -case 1 : -/* MAC added 2 extra bytes AND first byte is missing. */ - bins[0 ] = vdata[0 ]; -memcpy (&bins[1 ], vdata,30 ); - bins[31 ] = vdata[31 ]; -memcpy (&bins[32 ], &vdata[33 ], num_bins -32 ); -break ; -default : -return 1 ; - } - -/* DC value (value in the middle) is the blind spot of the spectral -* sample and invalid, interpolate it. -*/ - dc_pos = num_bins /2 ; - bins[dc_pos] = (bins[dc_pos +1 ] + bins[dc_pos -1 ]) /2 ; - -if ((chan_type ==NL80211_CHAN_HT40MINUS ) || - (chan_type ==NL80211_CHAN_HT40PLUS )) { -s8 lower_rssi, upper_rssi; -s16 ext_nf; -u8 lower_max_index, upper_max_index; -u8 lower_bitmap_w, upper_bitmap_w; -u16 lower_mag, upper_mag; -struct ath9k_hw_cal_data *caldata = ah->caldata; -struct ath_ht20_40_mag_info *mag_info; - -if (caldata) - ext_nf =ath9k_hw_getchan_noise (ah, ah->curchan, - caldata->nfCalHist[3 ].privNF); -else - ext_nf =ATH_DEFAULT_NOISE_FLOOR ; - - length =sizeof (fft_sample_40) -sizeof (struct fft_sample_tlv ); - fft_sample_40.tlv.type =ATH_FFT_SAMPLE_HT20_40 ; - fft_sample_40.tlv.length =__cpu_to_be16 (length); - fft_sample_40.freq =__cpu_to_be16 (freq); - fft_sample_40.channel_type = chan_type; - -if (chan_type ==NL80211_CHAN_HT40PLUS ) { - lower_rssi =fix_rssi_inv_only (rs->rs_rssi_ctl[0 ]); - upper_rssi =fix_rssi_inv_only (rs->rs_rssi_ext[0 ]); - - fft_sample_40.lower_noise = ah->noise; - fft_sample_40.upper_noise = ext_nf; - }else { - lower_rssi =fix_rssi_inv_only (rs->rs_rssi_ext[0 ]); - upper_rssi =fix_rssi_inv_only (rs->rs_rssi_ctl[0 ]); - - fft_sample_40.lower_noise = ext_nf; - fft_sample_40.upper_noise = ah->noise; - } - fft_sample_40.lower_rssi = lower_rssi; - fft_sample_40.upper_rssi = upper_rssi; - - mag_info = ((struct ath_ht20_40_mag_info *)radar_info) -1 ; - lower_mag =spectral_max_magnitude (mag_info->lower_bins); - upper_mag =spectral_max_magnitude (mag_info->upper_bins); - fft_sample_40.lower_max_magnitude =__cpu_to_be16 (lower_mag); - fft_sample_40.upper_max_magnitude =__cpu_to_be16 (upper_mag); - lower_max_index =spectral_max_index (mag_info->lower_bins); - upper_max_index =spectral_max_index (mag_info->upper_bins); - fft_sample_40.lower_max_index = lower_max_index; - fft_sample_40.upper_max_index = upper_max_index; - lower_bitmap_w =spectral_bitmap_weight (mag_info->lower_bins); - upper_bitmap_w =spectral_bitmap_weight (mag_info->upper_bins); - fft_sample_40.lower_bitmap_weight = lower_bitmap_w; - fft_sample_40.upper_bitmap_weight = upper_bitmap_w; - fft_sample_40.max_exp = mag_info->max_exp &0xf ; - - fft_sample_40.tsf =__cpu_to_be64 (tsf); - - tlv = (struct fft_sample_tlv *)&fft_sample_40; - }else { -u8 max_index, bitmap_w; -u16 magnitude; -struct ath_ht20_mag_info *mag_info; - - length =sizeof (fft_sample_20) -sizeof (struct fft_sample_tlv ); - fft_sample_20.tlv.type =ATH_FFT_SAMPLE_HT20 ; - fft_sample_20.tlv.length =__cpu_to_be16 (length); - fft_sample_20.freq =__cpu_to_be16 (freq); - - fft_sample_20.rssi =fix_rssi_inv_only (rs->rs_rssi_ctl[0 ]); - fft_sample_20.noise = ah->noise; - - mag_info = ((struct ath_ht20_mag_info *)radar_info) -1 ; - magnitude =spectral_max_magnitude (mag_info->all_bins); - fft_sample_20.max_magnitude =__cpu_to_be16 (magnitude); - max_index =spectral_max_index (mag_info->all_bins); - fft_sample_20.max_index = max_index; - bitmap_w =spectral_bitmap_weight (mag_info->all_bins); - fft_sample_20.bitmap_weight = bitmap_w; - fft_sample_20.max_exp = mag_info->max_exp &0xf ; - - fft_sample_20.tsf =__cpu_to_be64 (tsf); - - tlv = (struct fft_sample_tlv *)&fft_sample_20; - } - -ath_debug_send_fft_sample (sc, tlv); - -return 1 ; -} -/*********************/ /* spectral_scan_ctl */ /*********************/ drivers/net/wireless/ath/ath9k/spectral.h +2
-0@@ -17,6 +17,8 @@#ifndef SPECTRAL_H #define SPECTRAL_H +#include <linux/relay.h> +/* enum spectral_mode: * * @SPECTRAL_DISABLED: spectral mode is disabled
drivers/net/wireless/ath/ath9k/spectral.h struct fft_sample_ht20_40 { · line 199
Quoted 8 lines
drivers/net/wireless/ath/ath9k/spectral.h +4
-0@@ -190,4 +192,8 @@ struct fft_sample_ht20_40 { u8 data[SPECTRAL_HT20_40_NUM_BINS]; } __packed; +int ath_process_fft (struct ath_hw *ah,struct ieee80211_hdr *hdr, +struct ieee80211_hw *hw,struct rchan *rfs_chan_spec_scan, +struct ath_rx_status *rs,u64 tsf,bool is_htc); +#endif /* SPECTRAL_H */
It should not be here. Move it to common-spectral.h
Signature · 10 lines
Regards, Oleksij -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 278 bytes Desc: OpenPGP digital signature Url : http://lists.ath9k.org/pipermail/ath9k-devel/attachments/20140414/410f46c4/attachment-0001.pgp
PATCH 3/3 Adding spectral scan functionality to ath9k_htc driver. Tested using a AR9271 WiFi card.
In reply to Ashish Patro--- drivers/net/wireless/ath/ath9k/Makefile | 2 +- drivers/net/wireless/ath/ath9k/ar9002_phy.c | 10 +- drivers/net/wireless/ath/ath9k/htc.h | 13 + drivers/net/wireless/ath/ath9k/htc_drv_debug.c | 5 +- drivers/net/wireless/ath/ath9k/htc_drv_init.c | 8 + drivers/net/wireless/ath/ath9k/htc_drv_main.c | 81 +++++ drivers/net/wireless/ath/ath9k/htc_drv_spectral.c | 358 +++++++++++++++++++++ drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 17 + 8 files changed, 490 insertions(+), 4 deletions(-) create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
drivers/net/wireless/ath/ath9k/Makefile +1 -1
@@ -65,6 +65,6 @@ ath9k_htc-y += htc_hst.o \ htc_drv_init.o \ htc_drv_gpio.o -ath9k_htc-$(CONFIG_ATH9K_HTC_DEBUGFS) += htc_drv_debug.o +ath9k_htc-$(CONFIG_ATH9K_HTC_DEBUGFS) += htc_drv_debug.o htc_drv_spectral.o obj-$(CONFIG_ATH9K_HTC) += ath9k_htc.o
drivers/net/wireless/ath/ath9k/ar9002_phy.c +8 -2
@@ -641,11 +641,17 @@ static void ar9002_hw_spectral_scan_config(struct ath_hw *ah,/* on AR92xx, the highest bit of count will make the the chip send * spectral samples endlessly. Check if this really was intended, * and fix otherwise. +* +* For AR9271 chipsets, set count = 0 using the debugfs mechanism. */ count = param->count; -if (param->endless) +if (param->endless) { count =0x80 ; -else if (count &0x80 ) + +if (AR_SREV_9271 (ah)) { + count =0 ; + } + }else if (count &0x80 ) count =0x7f ; REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN,
drivers/net/wireless/ath/ath9k/htc.h +13 -0
@@ -31,6 +31,7 @@#include "htc_hst.h" #include "hif_usb.h" #include "wmi.h" +#include "spectral.h" #define ATH_STA_SHORT_CALINTERVAL 1000/* 1 second */ #define ATH_AP_SHORT_CALINTERVAL 100/* 100 ms */
@@ -529,6 +530,11 @@ struct ath9k_htc_priv {struct ath9k_debug debug;#endif struct mutex mutex; + +/* relay(fs) channel for spectral scan */ +struct rchan *rfs_chan_spec_scan; +enum spectral_mode spectral_mode; +struct ath_spec_scan spec_config; };static inline void ath_read_cachesize (struct ath_common *common,int *csz)
@@ -636,4 +642,11 @@ int ath9k_htc_init_debug(struct ath_hw *ah);static inline int ath9k_htc_init_debug (struct ath_hw *ah) {return 0 ; };#endif /* CONFIG_ATH9K_HTC_DEBUGFS */ +void ath9k_htc_spectral_init_debug (struct ath9k_htc_priv *priv); +void ath9k_htc_spectral_deinit_debug (struct ath9k_htc_priv *priv); + +void ath9k_htc_spectral_scan_trigger (struct ieee80211_hw *hw); +int ath9k_htc_spectral_scan_config (struct ieee80211_hw *hw, +enum spectral_mode spectral_mode); +#endif /* HTC_H */
drivers/net/wireless/ath/ath9k/htc_drv_debug.c +4 -1
@@ -992,7 +992,10 @@ int ath9k_htc_init_debug(struct ath_hw *ah) priv->hw->wiphy->debugfsdir);if (!priv->debug.debugfs_phy)return -ENOMEM ; - + +/* Initialize the debugFS files for the spectral scans */ +ath9k_htc_spectral_init_debug (priv); +debugfs_create_file ("tgt_int_stats" ,S_IRUSR , priv->debug.debugfs_phy, priv, &fops_tgt_int_stats); debugfs_create_file("tgt_tx_stats", S_IRUSR, priv->debug.debugfs_phy,
drivers/net/wireless/ath/ath9k/htc_drv_init.c +8 -0
@@ -449,6 +449,14 @@ static void ath9k_init_misc(struct ath9k_htc_priv *priv) common->last_rssi =ATH_RSSI_DUMMY_MARKER ; priv->ah->opmode =NL80211_IFTYPE_STATION ; + + priv->spec_config.enabled =0 ; +/* Set false for AR9271. */ + priv->spec_config.short_repeat = false; + priv->spec_config.count =8 ; + priv->spec_config.endless = false; + priv->spec_config.period =18 ; + priv->spec_config.fft_period =0x02 ; } static int ath9k_init_priv(struct ath9k_htc_priv *priv,
drivers/net/wireless/ath/ath9k/htc_drv_main.c +81 -0
93 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/htc_drv_spectral.c new file +358 -0
358 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +17 -0
@@ -1010,6 +1010,23 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,* separately to avoid doing two lookups for a rate for each frame. */ hdr = (struct ieee80211_hdr *)skb->data; + +/* +* Process PHY errors and return so that the packet +* can be dropped. +*/ +#ifdef CONFIG_ATH9K_HTC_DEBUGFS +if (rx_stats.rs_status &ATH9K_RXERR_PHY ) { +/* TODO: Not using DFS processing now. */ +if (ath_process_fft (priv->ah, hdr, priv->hw, priv->rfs_chan_spec_scan, + &rx_stats, rx_status->mactime, true)) { +/* TODO: Add code for collecting statistics about spectral scan */ + } + + goto rx_next; + } +#endif +if (!ath9k_cmn_rx_accept (common, hdr, rx_status, &rx_stats, &decrypt_error, priv->rxfilter)) goto rx_next;
Signature · 1 line
1.7.5.4
PATCH 3/3 Adding spectral scan functionality to ath9k_htc driver. Tested using a AR9271 WiFi card.
Am 14.04.2014 20:29, schrieb Ashish Patro:
Quoted 34 lines
--- drivers/net/wireless/ath/ath9k/Makefile | 2 +- drivers/net/wireless/ath/ath9k/ar9002_phy.c | 10 +- drivers/net/wireless/ath/ath9k/htc.h | 13 + drivers/net/wireless/ath/ath9k/htc_drv_debug.c | 5 +- drivers/net/wireless/ath/ath9k/htc_drv_init.c | 8 + drivers/net/wireless/ath/ath9k/htc_drv_main.c | 81 +++++ drivers/net/wireless/ath/ath9k/htc_drv_spectral.c | 358 +++++++++++++++++++++ drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 17 + 8 files changed, 490 insertions(+), 4 deletions(-) create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.cdrivers/net/wireless/ath/ath9k/Makefile +1
-1@@ -65,6 +65,6 @@ ath9k_htc-y += htc_hst.o \ htc_drv_init.o \ htc_drv_gpio.o -ath9k_htc-$(CONFIG_ATH9K_HTC_DEBUGFS) += htc_drv_debug.o +ath9k_htc-$(CONFIG_ATH9K_HTC_DEBUGFS) += htc_drv_debug.o htc_drv_spectral.o obj-$(CONFIG_ATH9K_HTC) += ath9k_htc.odrivers/net/wireless/ath/ath9k/ar9002_phy.c +2
-0@@ -641,11 +641,17 @@ static void ar9002_hw_spectral_scan_config(struct ath_hw *ah,/* on AR92xx, the highest bit of count will make the the chip send * spectral samples endlessly. Check if this really was intended, * and fix otherwise. +* +* For AR9271 chipsets, set count = 0 using the debugfs mechanism.
drivers/net/wireless/ath/ath9k/ar9002_phy.c static void ar9002_hw_spectral_scan_config(struct ath_hw *ah, · line 653
Quoted 10 lines
drivers/net/wireless/ath/ath9k/ar9002_phy.c +5
-2*/ count = param->count; -if (param->endless) +if (param->endless) { count =0x80 ; -else if (count &0x80 ) + +if (AR_SREV_9271 (ah)) { + count =0 ; + }
Please fix coding style.
drivers/net/wireless/ath/ath9k/htc.h line 34
Quoted 13 lines
drivers/net/wireless/ath/ath9k/ar9002_phy.c +1
-0+ }else if (count &0x80 ) count =0x7f ; REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN,drivers/net/wireless/ath/ath9k/htc.h +1
-0@@ -31,6 +31,7 @@#include "htc_hst.h" #include "hif_usb.h" #include "wmi.h" +#include "spectral.h"
Should be common-sprectral.h
Quoted 84 lines
drivers/net/wireless/ath/ath9k/htc.h +12
-0#define ATH_STA_SHORT_CALINTERVAL 1000/* 1 second */ #define ATH_AP_SHORT_CALINTERVAL 100/* 100 ms */ @@ -529,6 +530,11 @@ struct ath9k_htc_priv {struct ath9k_debug debug;#endif struct mutex mutex; + +/* relay(fs) channel for spectral scan */ +struct rchan *rfs_chan_spec_scan; +enum spectral_mode spectral_mode; +struct ath_spec_scan spec_config; };static inline void ath_read_cachesize (struct ath_common *common,int *csz)@@ -636,4 +642,11 @@ int ath9k_htc_init_debug(struct ath_hw *ah);static inline int ath9k_htc_init_debug (struct ath_hw *ah) {return 0 ; };#endif /* CONFIG_ATH9K_HTC_DEBUGFS */ +void ath9k_htc_spectral_init_debug (struct ath9k_htc_priv *priv); +void ath9k_htc_spectral_deinit_debug (struct ath9k_htc_priv *priv); + +void ath9k_htc_spectral_scan_trigger (struct ieee80211_hw *hw); +int ath9k_htc_spectral_scan_config (struct ieee80211_hw *hw, +enum spectral_mode spectral_mode); +#endif /* HTC_H */ drivers/net/wireless/ath/ath9k/htc_drv_debug.c +4
-1@@ -992,7 +992,10 @@ int ath9k_htc_init_debug(struct ath_hw *ah) priv->hw->wiphy->debugfsdir);if (!priv->debug.debugfs_phy)return -ENOMEM ; - + +/* Initialize the debugFS files for the spectral scans */ +ath9k_htc_spectral_init_debug (priv); +debugfs_create_file ("tgt_int_stats" ,S_IRUSR , priv->debug.debugfs_phy, priv, &fops_tgt_int_stats); debugfs_create_file("tgt_tx_stats", S_IRUSR, priv->debug.debugfs_phy,drivers/net/wireless/ath/ath9k/htc_drv_init.c +8
-0@@ -449,6 +449,14 @@ static void ath9k_init_misc(struct ath9k_htc_priv *priv) common->last_rssi =ATH_RSSI_DUMMY_MARKER ; priv->ah->opmode =NL80211_IFTYPE_STATION ; + + priv->spec_config.enabled =0 ; +/* Set false for AR9271. */ + priv->spec_config.short_repeat = false; + priv->spec_config.count =8 ; + priv->spec_config.endless = false; + priv->spec_config.period =18 ; + priv->spec_config.fft_period =0x02 ; } static int ath9k_init_priv(struct ath9k_htc_priv *priv,drivers/net/wireless/ath/ath9k/htc_drv_main.c +7
-0@@ -310,6 +310,11 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,mod_timer (&priv->tx.cleanup_timer, jiffies +msecs_to_jiffies (ATH9K_HTC_TX_CLEANUP_INTERVAL )); + +/* perform spectral scan if requested. */ +if (test_bit (ATH_OP_SCANNING , &priv->op_flags) && + priv->spectral_mode ==SPECTRAL_CHANSCAN ) +ath9k_htc_spectral_scan_trigger (hw); err:ath9k_htc_ps_restore (priv);@@ -1158,6 +1163,82 @@ static void ath9k_htc_remove_interface(struct ieee80211_hw *hw,mutex_unlock (&priv->mutex); } +/* Start generating the spectral scans. */ +void ath9k_htc_spectral_scan_trigger (struct ieee80211_hw *hw)
drivers/net/wireless/ath/ath9k/htc_drv_main.c static void ath9k_htc_remove_interface(struct ieee80211_hw *hw, · line 1177
Quoted 10 lines
drivers/net/wireless/ath/ath9k/htc_drv_main.c +10
-0+{ +struct ath9k_htc_priv *priv = hw->priv; +struct ath_hw *ah = priv->ah; +struct ath_common *common =ath9k_hw_common (ah); +u32 rxfilter; + +/* TODO: Is this condition required? +if (config_enabled(CONFIG_ATH9K_TX99)) +return; +*/
you can remove it. ath9k_htc do not have dependencies on TX99.
Quoted 123 lines
drivers/net/wireless/ath/ath9k/htc_drv_main.c +63
-0+if (!ath9k_hw_ops (ah)->spectral_scan_trigger) { +ath_err (common,"spectrum analyzer not implemented on this hardware\n" ); +return ; + } + +ath9k_htc_ps_wakeup (priv); + rxfilter =ath9k_hw_getrxfilter (ah); +ath9k_hw_setrxfilter (ah, rxfilter | +ATH9K_RX_FILTER_PHYRADAR | +ATH9K_RX_FILTER_PHYERR ); + +/* TODO: usually this should not be neccesary, but for some reason +* (or in some mode?) the trigger must be called after the +* configuration, otherwise the register will have its values reset +* (on my ar9220 to value 0x01002310) +*/ +ath9k_htc_spectral_scan_config (hw, priv->spectral_mode); +ath9k_hw_ops (ah)->spectral_scan_trigger (ah); +ath9k_htc_ps_restore (priv); +} + +/* Configure the status of the spectral scan feature. */ +int ath9k_htc_spectral_scan_config (struct ieee80211_hw *hw, +enum spectral_mode spectral_mode) +{ +struct ath9k_htc_priv *priv = hw->priv; +struct ath_hw *ah = priv->ah; +struct ath_common *common =ath9k_hw_common (ah); + +if (!ath9k_hw_ops (ah)->spectral_scan_trigger) { +ath_err (common,"spectrum analyzer not implemented on this hardware\n" ); +return -1 ; + } + +switch (spectral_mode) { +case SPECTRAL_DISABLED : + priv->spec_config.enabled =0 ; +break ; +case SPECTRAL_BACKGROUND : +/* send endless samples. +*/ + priv->spec_config.endless =1 ; + priv->spec_config.enabled =1 ; +break ; +case SPECTRAL_CHANSCAN : +case SPECTRAL_MANUAL : + priv->spec_config.endless =0 ; + priv->spec_config.enabled =1 ; +break ; +default : +return -1 ; + } + +ath9k_htc_ps_wakeup (priv); +ath9k_hw_ops (ah)->spectral_scan_config (ah, &priv->spec_config); +ath9k_htc_ps_restore (priv); + + priv->spectral_mode = spectral_mode; + +return 0 ; +} + +static int ath9k_htc_config (struct ieee80211_hw *hw,u32 changed) {struct ath9k_htc_priv *priv = hw->priv;drivers/net/wireless/ath/ath9k/htc_drv_spectral.c new file +51
-0@@ -0,0 +1,358 @@ +/* +* Copyright (c) 2013 Qualcomm Atheros, Inc. +* +* Permission to use, copy, modify, and/or distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include <linux/relay.h> +#include "htc.h" + +/*********************/ +/* spectral_scan_ctl */ +/*********************/ + +static ssize_t read_file_spec_scan_ctl (struct file *file,char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +char *mode ="" ; +unsigned int len; + +switch (priv->spectral_mode) { +case SPECTRAL_DISABLED : + mode ="disable" ; +break ; +case SPECTRAL_BACKGROUND : + mode ="background" ; +break ; +case SPECTRAL_CHANSCAN : + mode ="chanscan" ; +break ; +case SPECTRAL_MANUAL : + mode ="manual" ; +break ; + } + len =strlen (mode); +return simple_read_from_buffer (user_buf, count, ppos, mode, len); +} + +static ssize_t write_file_spec_scan_ctl (struct file *file, +const char __user *user_buf, +size_t count,loff_t *ppos)
drivers/net/wireless/ath/ath9k/htc_drv_spectral.c line 61
Quoted 10 lines
drivers/net/wireless/ath/ath9k/htc_drv_spectral.c new file +10
-0+{ +struct ath9k_htc_priv *priv = file->private_data; +struct ath_common *common =ath9k_hw_common (priv->ah); +char buf[32 ]; +ssize_t len; + +/* TODO: Is it required for ath9k_htc?? +if (config_enabled(CONFIG_ATH9K_TX99)) +return -EOPNOTSUPP; +*/
Can be removed.
Quoted 286 lines
drivers/net/wireless/ath/ath9k/htc_drv_spectral.c new file +286
-0+ len =min (count,sizeof (buf) -1 ); +if (copy_from_user (buf, user_buf, len)) +return -EFAULT ; + + buf[len] ='\0' ; + +if (strncmp ("trigger" , buf,7 ) ==0 ) { +ath9k_htc_spectral_scan_trigger (priv->hw); + }else if (strncmp ("background" , buf,9 ) ==0 ) { +ath9k_htc_spectral_scan_config (priv->hw,SPECTRAL_BACKGROUND ); +ath_dbg (common,CONFIG ,"spectral scan: background mode enabled\n" ); + }else if (strncmp ("chanscan" , buf,8 ) ==0 ) { +ath9k_htc_spectral_scan_config (priv->hw,SPECTRAL_CHANSCAN ); +ath_dbg (common,CONFIG ,"spectral scan: channel scan mode enabled\n" ); + }else if (strncmp ("manual" , buf,6 ) ==0 ) { +ath9k_htc_spectral_scan_config (priv->hw,SPECTRAL_MANUAL ); +ath_dbg (common,CONFIG ,"spectral scan: manual mode enabled\n" ); + }else if (strncmp ("disable" , buf,7 ) ==0 ) { +ath9k_htc_spectral_scan_config (priv->hw,SPECTRAL_DISABLED ); +ath_dbg (common,CONFIG ,"spectral scan: disabled\n" ); + }else { +return -EINVAL ; + } + +return count; +} + +static const struct file_operations fops_spec_scan_ctl = { + .read = read_file_spec_scan_ctl, + .write = write_file_spec_scan_ctl, + .open = simple_open, + .owner =THIS_MODULE , + .llseek = default_llseek, +}; + +/*************************/ +/* spectral_short_repeat */ +/*************************/ + +static ssize_t read_file_spectral_short_repeat (struct file *file, +char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +char buf[32 ]; +unsigned int len; + + len =sprintf (buf,"%d\n" , priv->spec_config.short_repeat); +return simple_read_from_buffer (user_buf, count, ppos, buf, len); +} + +static ssize_t write_file_spectral_short_repeat (struct file *file, +const char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +unsigned long val; +char buf[32 ]; +ssize_t len; + + len =min (count,sizeof (buf) -1 ); +if (copy_from_user (buf, user_buf, len)) +return -EFAULT ; + + buf[len] ='\0' ; +if (kstrtoul (buf,0 , &val)) +return -EINVAL ; + +if (val <0 || val >1 ) +return -EINVAL ; + + priv->spec_config.short_repeat = val; +return count; +} + +static const struct file_operations fops_spectral_short_repeat = { + .read = read_file_spectral_short_repeat, + .write = write_file_spectral_short_repeat, + .open = simple_open, + .owner =THIS_MODULE , + .llseek = default_llseek, +}; + +/******************/ +/* spectral_count */ +/******************/ + +static ssize_t read_file_spectral_count (struct file *file, +char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +char buf[32 ]; +unsigned int len; + + len =sprintf (buf,"%d\n" , priv->spec_config.count); +return simple_read_from_buffer (user_buf, count, ppos, buf, len); +} + +static ssize_t write_file_spectral_count (struct file *file, +const char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +unsigned long val; +char buf[32 ]; +ssize_t len; + + len =min (count,sizeof (buf) -1 ); +if (copy_from_user (buf, user_buf, len)) +return -EFAULT ; + + buf[len] ='\0' ; +if (kstrtoul (buf,0 , &val)) +return -EINVAL ; + +if (val <0 || val >255 ) +return -EINVAL ; + + priv->spec_config.count = val; +return count; +} + +static const struct file_operations fops_spectral_count = { + .read = read_file_spectral_count, + .write = write_file_spectral_count, + .open = simple_open, + .owner =THIS_MODULE , + .llseek = default_llseek, +}; + +/*******************/ +/* spectral_period */ +/*******************/ + +static ssize_t read_file_spectral_period (struct file *file, +char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +char buf[32 ]; +unsigned int len; + + len =sprintf (buf,"%d\n" , priv->spec_config.period); +return simple_read_from_buffer (user_buf, count, ppos, buf, len); +} + +static ssize_t write_file_spectral_period (struct file *file, +const char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +unsigned long val; +char buf[32 ]; +ssize_t len; + + len =min (count,sizeof (buf) -1 ); +if (copy_from_user (buf, user_buf, len)) +return -EFAULT ; + + buf[len] ='\0' ; +if (kstrtoul (buf,0 , &val)) +return -EINVAL ; + +if (val <0 || val >255 ) +return -EINVAL ; + + priv->spec_config.period = val; +return count; +} + +static const struct file_operations fops_spectral_period = { + .read = read_file_spectral_period, + .write = write_file_spectral_period, + .open = simple_open, + .owner =THIS_MODULE , + .llseek = default_llseek, +}; + +/***********************/ +/* spectral_fft_period */ +/***********************/ + +static ssize_t read_file_spectral_fft_period (struct file *file, +char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +char buf[32 ]; +unsigned int len; + + len =sprintf (buf,"%d\n" , priv->spec_config.fft_period); +return simple_read_from_buffer (user_buf, count, ppos, buf, len); +} + +static ssize_t write_file_spectral_fft_period (struct file *file, +const char __user *user_buf, +size_t count,loff_t *ppos) +{ +struct ath9k_htc_priv *priv = file->private_data; +unsigned long val; +char buf[32 ]; +ssize_t len; + + len =min (count,sizeof (buf) -1 ); +if (copy_from_user (buf, user_buf, len)) +return -EFAULT ; + + buf[len] ='\0' ; +if (kstrtoul (buf,0 , &val)) +return -EINVAL ; + +if (val <0 || val >15 ) +return -EINVAL ; + + priv->spec_config.fft_period = val; +return count; +} + +static const struct file_operations fops_spectral_fft_period = { + .read = read_file_spectral_fft_period, + .write = write_file_spectral_fft_period, + .open = simple_open, + .owner =THIS_MODULE , + .llseek = default_llseek, +}; + +/*******************/ +/* Relay interface */ +/*******************/ + +static struct dentry *create_buf_file_handler (const char *filename, +struct dentry *parent, +umode_t mode, +struct rchan_buf *buf, +int *is_global) +{ +struct dentry *buf_file; + + buf_file =debugfs_create_file (filename, mode, parent, buf, + &relay_file_operations); + *is_global =1 ; +return buf_file; +} + +static int remove_buf_file_handler (struct dentry *dentry) +{ +debugfs_remove (dentry); + +return 0 ; +} + +static struct rchan_callbacks rfs_spec_scan_cb = { + .create_buf_file = create_buf_file_handler, + .remove_buf_file = remove_buf_file_handler, +}; + +/*********************/ +/* Debug Init/Deinit */ +/*********************/ + +void ath9k_htc_spectral_deinit_debug (struct ath9k_htc_priv *priv) +{ +if (config_enabled (CONFIG_ATH9K_DEBUGFS ) && priv->rfs_chan_spec_scan) { +relay_close (priv->rfs_chan_spec_scan); + priv->rfs_chan_spec_scan =NULL ; + } +} + +void ath9k_htc_spectral_init_debug (struct ath9k_htc_priv *priv) +{ + priv->rfs_chan_spec_scan =relay_open ("spectral_scan" , + priv->debug.debugfs_phy, +1024 ,256 , &rfs_spec_scan_cb, +NULL ); +debugfs_create_file ("spectral_scan_ctl" , +S_IRUSR |S_IWUSR , + priv->debug.debugfs_phy, priv, + &fops_spec_scan_ctl); +debugfs_create_file ("spectral_short_repeat" , +S_IRUSR |S_IWUSR , + priv->debug.debugfs_phy, priv, + &fops_spectral_short_repeat); + debugfs_create_file("spectral_count", + S_IRUSR | S_IWUSR, + priv->debug.debugfs_phy, priv,
drivers/net/wireless/ath/ath9k/htc_drv_spectral.c line 358
Quoted 10 lines
drivers/net/wireless/ath/ath9k/htc_drv_spectral.c new file +10
-0+ &fops_spectral_count); +debugfs_create_file ("spectral_period" , +S_IRUSR |S_IWUSR , + priv->debug.debugfs_phy, priv, + &fops_spectral_period); +debugfs_create_file ("spectral_fft_period" , +S_IRUSR |S_IWUSR , + priv->debug.debugfs_phy, priv, + &fops_spectral_fft_period); +}
Note for me: It is big junk of duplicats. But we need to rework complete debugfs part for both ath9k and ath9k-htc to solve this problem.
Quoted 14 lines
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +6
-0@@ -1010,6 +1010,23 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,* separately to avoid doing two lookups for a rate for each frame. */ hdr = (struct ieee80211_hdr *)skb->data; + +/* +* Process PHY errors and return so that the packet +* can be dropped. +*/ +#ifdef CONFIG_ATH9K_HTC_DEBUGFS
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv, · line 1028
Quoted 10 lines
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +10
-0+if (rx_stats.rs_status &ATH9K_RXERR_PHY ) { +/* TODO: Not using DFS processing now. */ +if (ath_process_fft (priv->ah, hdr, priv->hw, priv->rfs_chan_spec_scan, + &rx_stats, rx_status->mactime, true)) { +/* TODO: Add code for collecting statistics about spectral scan */ + } + + goto rx_next; + } +#endif
Add code for collecting statistics about spectral scan :)
Quoted 4 lines
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +0
-0if (!ath9k_cmn_rx_accept (common, hdr, rx_status, &rx_stats, &decrypt_error, priv->rxfilter)) goto rx_next;
Signature · 10 lines
Regards, Oleksij -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 278 bytes Desc: OpenPGP digital signature Url : http://lists.ath9k.org/pipermail/ath9k-devel/attachments/20140414/533edb70/attachment.pgp