All of lore.kernel.org
 help / color / mirror / Atom feed
* [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc
@ 2014-04-25  8:12 Ashish Patro
  2014-04-25  8:12 ` [ath9k-devel] [PATCH 1/3] Moving the ath9k specific spectral functions to ath9k.h from spectral.h. Renamed spectral.h to common-spectral.h Ashish Patro
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Ashish Patro @ 2014-04-25  8:12 UTC (permalink / raw)
  To: ath9k-devel


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. Renamed spectral.h to common-spectral.h
  Refactoring the ath9k driver to move common spectral functions to
    common-spectral.c
  Update spectral scan calls to support both ath9k and ath9k_htc.
    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       |   11 +-
 drivers/net/wireless/ath/ath9k/ath9k.h            |    9 +-
 drivers/net/wireless/ath/ath9k/common-spectral.c  |  213 +++++++++++++
 drivers/net/wireless/ath/ath9k/common-spectral.h  |  199 ++++++++++++
 drivers/net/wireless/ath/ath9k/htc.h              |   13 +
 drivers/net/wireless/ath/ath9k/htc_drv_debug.c    |    3 +
 drivers/net/wireless/ath/ath9k/htc_drv_init.c     |    8 +
 drivers/net/wireless/ath/ath9k/htc_drv_main.c     |   75 +++++
 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c |  353 +++++++++++++++++++++
 drivers/net/wireless/ath/ath9k/htc_drv_txrx.c     |   17 +
 drivers/net/wireless/ath/ath9k/recv.c             |    7 +-
 drivers/net/wireless/ath/ath9k/spectral.c         |  187 -----------
 drivers/net/wireless/ath/ath9k/spectral.h         |  212 ------------
 14 files changed, 905 insertions(+), 405 deletions(-)
 create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c
 create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.h
 create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
 delete mode 100644 drivers/net/wireless/ath/ath9k/spectral.h

-- 
1.7.5.4

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 1/3] Moving the ath9k specific spectral functions to ath9k.h from spectral.h. Renamed spectral.h to common-spectral.h
  2014-04-25  8:12 [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Ashish Patro
@ 2014-04-25  8:12 ` Ashish Patro
  2014-04-25  8:12 ` [ath9k-devel] [PATCH 2/3] Refactoring the ath9k driver to move common spectral functions to common-spectral.c Ashish Patro
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: Ashish Patro @ 2014-04-25  8:12 UTC (permalink / raw)
  To: ath9k-devel

Signed-off-by: Ashish Patro <patro@cs.wisc.edu>
---
 drivers/net/wireless/ath/ath9k/ath9k.h           |    9 +-
 drivers/net/wireless/ath/ath9k/common-spectral.h |  205 +++++++++++++++++++++
 drivers/net/wireless/ath/ath9k/spectral.h        |  212 ----------------------
 3 files changed, 213 insertions(+), 213 deletions(-)
 create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.h
 delete mode 100644 drivers/net/wireless/ath/ath9k/spectral.h

diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 44d7449..b174974 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -27,7 +27,7 @@
 #include "common.h"
 #include "mci.h"
 #include "dfs.h"
-#include "spectral.h"
+#include "common-spectral.h"
 
 struct ath_node;
 
@@ -834,4 +834,11 @@ 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);
+
 #endif /* ATH9K_H */
diff --git a/drivers/net/wireless/ath/ath9k/common-spectral.h b/drivers/net/wireless/ath/ath9k/common-spectral.h
new file mode 100644
index 0000000..61faea4
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/common-spectral.h
@@ -0,0 +1,205 @@
+/*
+ * 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.
+ */
+
+#ifndef SPECTRAL_H
+#define SPECTRAL_H
+
+/* enum spectral_mode:
+ *
+ * @SPECTRAL_DISABLED: spectral mode is disabled
+ * @SPECTRAL_BACKGROUND: hardware sends samples when it is not busy with
+ *	something else.
+ * @SPECTRAL_MANUAL: spectral scan is enabled, triggering for samples
+ *	is performed manually.
+ * @SPECTRAL_CHANSCAN: Like manual, but also triggered when changing channels
+ *	during a channel scan.
+ */
+enum spectral_mode {
+	SPECTRAL_DISABLED = 0,
+	SPECTRAL_BACKGROUND,
+	SPECTRAL_MANUAL,
+	SPECTRAL_CHANSCAN,
+};
+
+#define SPECTRAL_SCAN_BITMASK		0x10
+/* Radar info packet format, used for DFS and spectral formats. */
+struct ath_radar_info {
+	u8 pulse_length_pri;
+	u8 pulse_length_ext;
+	u8 pulse_bw_info;
+} __packed;
+
+/* The HT20 spectral data has 4 bytes of additional information at it's end.
+ *
+ * [7:0]: all bins {max_magnitude[1:0], bitmap_weight[5:0]}
+ * [7:0]: all bins  max_magnitude[9:2]
+ * [7:0]: all bins {max_index[5:0], max_magnitude[11:10]}
+ * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
+ */
+struct ath_ht20_mag_info {
+	u8 all_bins[3];
+	u8 max_exp;
+} __packed;
+
+#define SPECTRAL_HT20_NUM_BINS		56
+
+/* WARNING: don't actually use this struct! MAC may vary the amount of
+ * data by -1/+2. This struct is for reference only.
+ */
+struct ath_ht20_fft_packet {
+	u8 data[SPECTRAL_HT20_NUM_BINS];
+	struct ath_ht20_mag_info mag_info;
+	struct ath_radar_info radar_info;
+} __packed;
+
+#define SPECTRAL_HT20_TOTAL_DATA_LEN	(sizeof(struct ath_ht20_fft_packet))
+
+/* Dynamic 20/40 mode:
+ *
+ * [7:0]: lower bins {max_magnitude[1:0], bitmap_weight[5:0]}
+ * [7:0]: lower bins  max_magnitude[9:2]
+ * [7:0]: lower bins {max_index[5:0], max_magnitude[11:10]}
+ * [7:0]: upper bins {max_magnitude[1:0], bitmap_weight[5:0]}
+ * [7:0]: upper bins  max_magnitude[9:2]
+ * [7:0]: upper bins {max_index[5:0], max_magnitude[11:10]}
+ * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
+ */
+struct ath_ht20_40_mag_info {
+	u8 lower_bins[3];
+	u8 upper_bins[3];
+	u8 max_exp;
+} __packed;
+
+#define SPECTRAL_HT20_40_NUM_BINS		128
+
+/* WARNING: don't actually use this struct! MAC may vary the amount of
+ * data. This struct is for reference only.
+ */
+struct ath_ht20_40_fft_packet {
+	u8 data[SPECTRAL_HT20_40_NUM_BINS];
+	struct ath_ht20_40_mag_info mag_info;
+	struct ath_radar_info radar_info;
+} __packed;
+
+
+#define SPECTRAL_HT20_40_TOTAL_DATA_LEN	(sizeof(struct ath_ht20_40_fft_packet))
+
+/* grabs the max magnitude from the all/upper/lower bins */
+static inline u16 spectral_max_magnitude(u8 *bins)
+{
+	return (bins[0] & 0xc0) >> 6 |
+	       (bins[1] & 0xff) << 2 |
+	       (bins[2] & 0x03) << 10;
+}
+
+/* return the max magnitude from the all/upper/lower bins */
+static inline u8 spectral_max_index(u8 *bins)
+{
+	s8 m = (bins[2] & 0xfc) >> 2;
+
+	/* TODO: this still doesn't always report the right values ... */
+	if (m > 32)
+		m |= 0xe0;
+	else
+		m &= ~0xe0;
+
+	return m + 29;
+}
+
+/* return the bitmap weight from the all/upper/lower bins */
+static inline u8 spectral_bitmap_weight(u8 *bins)
+{
+	return bins[0] & 0x3f;
+}
+
+/* FFT sample format given to userspace via debugfs.
+ *
+ * Please keep the type/length at the front position and change
+ * other fields after adding another sample type
+ *
+ * TODO: this might need rework when switching to nl80211-based
+ * interface.
+ */
+enum ath_fft_sample_type {
+	ATH_FFT_SAMPLE_HT20 = 1,
+	ATH_FFT_SAMPLE_HT20_40,
+};
+
+struct fft_sample_tlv {
+	u8 type;	/* see ath_fft_sample */
+	__be16 length;
+	/* type dependent data follows */
+} __packed;
+
+struct fft_sample_ht20 {
+	struct fft_sample_tlv tlv;
+
+	u8 max_exp;
+
+	__be16 freq;
+	s8 rssi;
+	s8 noise;
+
+	__be16 max_magnitude;
+	u8 max_index;
+	u8 bitmap_weight;
+
+	__be64 tsf;
+
+	u8 data[SPECTRAL_HT20_NUM_BINS];
+} __packed;
+
+struct fft_sample_ht20_40 {
+	struct fft_sample_tlv tlv;
+
+	u8 channel_type;
+	__be16 freq;
+
+	s8 lower_rssi;
+	s8 upper_rssi;
+
+	__be64 tsf;
+
+	s8 lower_noise;
+	s8 upper_noise;
+
+	__be16 lower_max_magnitude;
+	__be16 upper_max_magnitude;
+
+	u8 lower_max_index;
+	u8 upper_max_index;
+
+	u8 lower_bitmap_weight;
+	u8 upper_bitmap_weight;
+
+	u8 max_exp;
+
+	u8 data[SPECTRAL_HT20_40_NUM_BINS];
+} __packed;
+
+#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 */
diff --git a/drivers/net/wireless/ath/ath9k/spectral.h b/drivers/net/wireless/ath/ath9k/spectral.h
deleted file mode 100644
index ead6341..0000000
--- a/drivers/net/wireless/ath/ath9k/spectral.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef SPECTRAL_H
-#define SPECTRAL_H
-
-/* enum spectral_mode:
- *
- * @SPECTRAL_DISABLED: spectral mode is disabled
- * @SPECTRAL_BACKGROUND: hardware sends samples when it is not busy with
- *	something else.
- * @SPECTRAL_MANUAL: spectral scan is enabled, triggering for samples
- *	is performed manually.
- * @SPECTRAL_CHANSCAN: Like manual, but also triggered when changing channels
- *	during a channel scan.
- */
-enum spectral_mode {
-	SPECTRAL_DISABLED = 0,
-	SPECTRAL_BACKGROUND,
-	SPECTRAL_MANUAL,
-	SPECTRAL_CHANSCAN,
-};
-
-#define SPECTRAL_SCAN_BITMASK		0x10
-/* Radar info packet format, used for DFS and spectral formats. */
-struct ath_radar_info {
-	u8 pulse_length_pri;
-	u8 pulse_length_ext;
-	u8 pulse_bw_info;
-} __packed;
-
-/* The HT20 spectral data has 4 bytes of additional information at it's end.
- *
- * [7:0]: all bins {max_magnitude[1:0], bitmap_weight[5:0]}
- * [7:0]: all bins  max_magnitude[9:2]
- * [7:0]: all bins {max_index[5:0], max_magnitude[11:10]}
- * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
- */
-struct ath_ht20_mag_info {
-	u8 all_bins[3];
-	u8 max_exp;
-} __packed;
-
-#define SPECTRAL_HT20_NUM_BINS		56
-
-/* WARNING: don't actually use this struct! MAC may vary the amount of
- * data by -1/+2. This struct is for reference only.
- */
-struct ath_ht20_fft_packet {
-	u8 data[SPECTRAL_HT20_NUM_BINS];
-	struct ath_ht20_mag_info mag_info;
-	struct ath_radar_info radar_info;
-} __packed;
-
-#define SPECTRAL_HT20_TOTAL_DATA_LEN	(sizeof(struct ath_ht20_fft_packet))
-
-/* Dynamic 20/40 mode:
- *
- * [7:0]: lower bins {max_magnitude[1:0], bitmap_weight[5:0]}
- * [7:0]: lower bins  max_magnitude[9:2]
- * [7:0]: lower bins {max_index[5:0], max_magnitude[11:10]}
- * [7:0]: upper bins {max_magnitude[1:0], bitmap_weight[5:0]}
- * [7:0]: upper bins  max_magnitude[9:2]
- * [7:0]: upper bins {max_index[5:0], max_magnitude[11:10]}
- * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
- */
-struct ath_ht20_40_mag_info {
-	u8 lower_bins[3];
-	u8 upper_bins[3];
-	u8 max_exp;
-} __packed;
-
-#define SPECTRAL_HT20_40_NUM_BINS		128
-
-/* WARNING: don't actually use this struct! MAC may vary the amount of
- * data. This struct is for reference only.
- */
-struct ath_ht20_40_fft_packet {
-	u8 data[SPECTRAL_HT20_40_NUM_BINS];
-	struct ath_ht20_40_mag_info mag_info;
-	struct ath_radar_info radar_info;
-} __packed;
-
-
-#define SPECTRAL_HT20_40_TOTAL_DATA_LEN	(sizeof(struct ath_ht20_40_fft_packet))
-
-/* grabs the max magnitude from the all/upper/lower bins */
-static inline u16 spectral_max_magnitude(u8 *bins)
-{
-	return (bins[0] & 0xc0) >> 6 |
-	       (bins[1] & 0xff) << 2 |
-	       (bins[2] & 0x03) << 10;
-}
-
-/* return the max magnitude from the all/upper/lower bins */
-static inline u8 spectral_max_index(u8 *bins)
-{
-	s8 m = (bins[2] & 0xfc) >> 2;
-
-	/* TODO: this still doesn't always report the right values ... */
-	if (m > 32)
-		m |= 0xe0;
-	else
-		m &= ~0xe0;
-
-	return m + 29;
-}
-
-/* return the bitmap weight from the all/upper/lower bins */
-static inline u8 spectral_bitmap_weight(u8 *bins)
-{
-	return bins[0] & 0x3f;
-}
-
-/* FFT sample format given to userspace via debugfs.
- *
- * Please keep the type/length at the front position and change
- * other fields after adding another sample type
- *
- * TODO: this might need rework when switching to nl80211-based
- * interface.
- */
-enum ath_fft_sample_type {
-	ATH_FFT_SAMPLE_HT20 = 1,
-	ATH_FFT_SAMPLE_HT20_40,
-};
-
-struct fft_sample_tlv {
-	u8 type;	/* see ath_fft_sample */
-	__be16 length;
-	/* type dependent data follows */
-} __packed;
-
-struct fft_sample_ht20 {
-	struct fft_sample_tlv tlv;
-
-	u8 max_exp;
-
-	__be16 freq;
-	s8 rssi;
-	s8 noise;
-
-	__be16 max_magnitude;
-	u8 max_index;
-	u8 bitmap_weight;
-
-	__be64 tsf;
-
-	u8 data[SPECTRAL_HT20_NUM_BINS];
-} __packed;
-
-struct fft_sample_ht20_40 {
-	struct fft_sample_tlv tlv;
-
-	u8 channel_type;
-	__be16 freq;
-
-	s8 lower_rssi;
-	s8 upper_rssi;
-
-	__be64 tsf;
-
-	s8 lower_noise;
-	s8 upper_noise;
-
-	__be16 lower_max_magnitude;
-	__be16 upper_max_magnitude;
-
-	u8 lower_max_index;
-	u8 upper_max_index;
-
-	u8 lower_bitmap_weight;
-	u8 upper_bitmap_weight;
-
-	u8 max_exp;
-
-	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 */
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 2/3] Refactoring the ath9k driver to move common spectral functions to common-spectral.c
  2014-04-25  8:12 [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Ashish Patro
  2014-04-25  8:12 ` [ath9k-devel] [PATCH 1/3] Moving the ath9k specific spectral functions to ath9k.h from spectral.h. Renamed spectral.h to common-spectral.h Ashish Patro
@ 2014-04-25  8:12 ` Ashish Patro
  2014-04-25  8:12 ` [ath9k-devel] [PATCH 3/3] Update spectral scan calls to support both ath9k and ath9k_htc. Adding spectral scan functionality to ath9k_htc driver. Tested using a AR9271 WiFi card Ashish Patro
  2014-04-29  6:52 ` [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Oleksij Rempel
  3 siblings, 0 replies; 10+ messages in thread
From: Ashish Patro @ 2014-04-25  8:12 UTC (permalink / raw)
  To: ath9k-devel

Signed-off-by: Ashish Patro <patro@cs.wisc.edu>
---
 drivers/net/wireless/ath/ath9k/Makefile          |    1 +
 drivers/net/wireless/ath/ath9k/common-spectral.c |  206 ++++++++++++++++++++++
 drivers/net/wireless/ath/ath9k/spectral.c        |  187 --------------------
 3 files changed, 207 insertions(+), 187 deletions(-)
 create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c

diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile
index 8e1c7b0..613bf30 100644
--- a/drivers/net/wireless/ath/ath9k/Makefile
+++ b/drivers/net/wireless/ath/ath9k/Makefile
@@ -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 \
diff --git a/drivers/net/wireless/ath/ath9k/common-spectral.c b/drivers/net/wireless/ath/ath9k/common-spectral.c
new file mode 100644
index 0000000..8b14af8
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/common-spectral.c
@@ -0,0 +1,206 @@
+/*
+ * 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 "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@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;
+}
+EXPORT_SYMBOL(ath_process_fft);
diff --git a/drivers/net/wireless/ath/ath9k/spectral.c b/drivers/net/wireless/ath/ath9k/spectral.c
index 99f4de9..5e1d472 100644
--- a/drivers/net/wireless/ath/ath9k/spectral.c
+++ b/drivers/net/wireless/ath/ath9k/spectral.c
@@ -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@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 */
 /*********************/
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 3/3] Update spectral scan calls to support both ath9k and ath9k_htc. Adding spectral scan functionality to ath9k_htc driver. Tested using a AR9271 WiFi card.
  2014-04-25  8:12 [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Ashish Patro
  2014-04-25  8:12 ` [ath9k-devel] [PATCH 1/3] Moving the ath9k specific spectral functions to ath9k.h from spectral.h. Renamed spectral.h to common-spectral.h Ashish Patro
  2014-04-25  8:12 ` [ath9k-devel] [PATCH 2/3] Refactoring the ath9k driver to move common spectral functions to common-spectral.c Ashish Patro
@ 2014-04-25  8:12 ` Ashish Patro
  2014-04-29  6:52 ` [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Oleksij Rempel
  3 siblings, 0 replies; 10+ messages in thread
From: Ashish Patro @ 2014-04-25  8:12 UTC (permalink / raw)
  To: ath9k-devel

Signed-off-by: Ashish Patro <patro@cs.wisc.edu>
---
 drivers/net/wireless/ath/ath9k/Makefile           |    2 +-
 drivers/net/wireless/ath/ath9k/ar9002_phy.c       |   11 +-
 drivers/net/wireless/ath/ath9k/common-spectral.c  |   29 +-
 drivers/net/wireless/ath/ath9k/common-spectral.h  |   16 +-
 drivers/net/wireless/ath/ath9k/htc.h              |   13 +
 drivers/net/wireless/ath/ath9k/htc_drv_debug.c    |    3 +
 drivers/net/wireless/ath/ath9k/htc_drv_init.c     |    8 +
 drivers/net/wireless/ath/ath9k/htc_drv_main.c     |   75 +++++
 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c |  353 +++++++++++++++++++++
 drivers/net/wireless/ath/ath9k/htc_drv_txrx.c     |   17 +
 drivers/net/wireless/ath/ath9k/recv.c             |    7 +-
 11 files changed, 507 insertions(+), 27 deletions(-)
 create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c

diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile
index 613bf30..aaa5a34 100644
--- a/drivers/net/wireless/ath/ath9k/Makefile
+++ b/drivers/net/wireless/ath/ath9k/Makefile
@@ -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
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_phy.c b/drivers/net/wireless/ath/ath9k/ar9002_phy.c
index 9a2afa2..7a41759 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c
@@ -641,11 +641,16 @@ 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 for endless samples.
 	 */
 	count = param->count;
-	if (param->endless)
-		count = 0x80;
-	else if (count & 0x80)
+	if (param->endless) {
+		if (AR_SREV_9271(ah))
+			count = 0;
+		else
+			count = 0x80;
+	} else if (count & 0x80)
 		count = 0x7f;
 
 	REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN,
diff --git a/drivers/net/wireless/ath/ath9k/common-spectral.c b/drivers/net/wireless/ath/ath9k/common-spectral.c
index 8b14af8..3157cb3 100644
--- a/drivers/net/wireless/ath/ath9k/common-spectral.c
+++ b/drivers/net/wireless/ath/ath9k/common-spectral.c
@@ -14,8 +14,8 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <linux/relay.h>
-#include "ath9k.h"
+#include "common.h"
+#include "common-spectral.h"
 
 static s8 fix_rssi_inv_only(u8 rssi_val)
 {
@@ -24,32 +24,39 @@ static s8 fix_rssi_inv_only(u8 rssi_val)
 	return (s8) rssi_val;
 }
 
-static void ath_debug_send_fft_sample(struct ath_softc *sc,
+static void ath_debug_send_fft_sample(struct rchan *rfs_chan_spec_scan,
 				      struct fft_sample_tlv *fft_sample_tlv)
 {
 	int length;
-	if (!sc->rfs_chan_spec_scan)
+	if (!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);
+	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_softc *sc, struct ieee80211_hdr *hdr,
-		    struct ath_rx_status *rs, u64 tsf)
+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)
 {
-	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;
+	int len = 0;
+
+	/* Getting the length from AR9271 chipsets.
+	 */
+	if (is_htc)
+		len = be16_to_cpu(rs->rs_datalen);
+	else
+		len = rs->rs_datalen;
 
 	/* AR9280 and before report via ATH9K_PHYERR_RADAR, AR93xx and newer
 	 * via ATH9K_PHYERR_SPECTRAL. Haven't seen ATH9K_PHYERR_FALSE_RADAR_EXT
@@ -67,7 +74,7 @@ int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr,
 	if (!(radar_info->pulse_bw_info & SPECTRAL_SCAN_BITMASK))
 		return 0;
 
-	chan_type = cfg80211_get_chandef_type(&sc->hw->conf.chandef);
+	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;
@@ -199,7 +206,7 @@ int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr,
 		tlv = (struct fft_sample_tlv *)&fft_sample_20;
 	}
 
-	ath_debug_send_fft_sample(sc, tlv);
+	ath_debug_send_fft_sample(rfs_chan_spec_scan, tlv);
 
 	return 1;
 }
diff --git a/drivers/net/wireless/ath/ath9k/common-spectral.h b/drivers/net/wireless/ath/ath9k/common-spectral.h
index 61faea4..be84a15 100644
--- a/drivers/net/wireless/ath/ath9k/common-spectral.h
+++ b/drivers/net/wireless/ath/ath9k/common-spectral.h
@@ -17,6 +17,8 @@
 #ifndef SPECTRAL_H
 #define SPECTRAL_H
 
+#include <linux/relay.h>
+
 /* enum spectral_mode:
  *
  * @SPECTRAL_DISABLED: spectral mode is disabled
@@ -190,16 +192,8 @@ struct fft_sample_ht20_40 {
 	u8 data[SPECTRAL_HT20_40_NUM_BINS];
 } __packed;
 
-#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 */
+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 */
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h
index dab1f0c..ac88fc8 100644
--- a/drivers/net/wireless/ath/ath9k/htc.h
+++ b/drivers/net/wireless/ath/ath9k/htc.h
@@ -31,6 +31,7 @@
 #include "htc_hst.h"
 #include "hif_usb.h"
 #include "wmi.h"
+#include "common-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 */
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c
index fb071ee..8dc83e8 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c
@@ -993,6 +993,9 @@ int ath9k_htc_init_debug(struct ath_hw *ah)
 	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,
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
index 8a3bd5f..0ccabb7 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
@@ -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,
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index f46cd02..3d88a8e 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -311,6 +311,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);
 	return ret;
@@ -1158,6 +1163,76 @@ 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)
+{
+	struct ath9k_htc_priv *priv = hw->priv;
+	struct ath_hw *ah = priv->ah;
+	struct ath_common *common = ath9k_hw_common(ah);
+	u32 rxfilter;
+
+	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;
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_spectral.c b/drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
new file mode 100644
index 0000000..2de7181
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
@@ -0,0 +1,353 @@
+/*
+ * 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)
+{
+	struct ath9k_htc_priv *priv = file->private_data;
+	struct ath_common *common = ath9k_hw_common(priv->ah);
+	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 (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,
+			    &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);
+}
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
index e8149e3..d3a6c09 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
@@ -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: Code to collect spectral scan statistics */
+		}
+
+		goto rx_next;
+	}
+	#endif
+
 	if (!ath9k_cmn_rx_accept(common, hdr, rx_status, &rx_stats,
 			&decrypt_error, priv->rxfilter))
 		goto rx_next;
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 6c9accd..bf30a52 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -847,8 +847,13 @@ 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;
 	}
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc
  2014-04-25  8:12 [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Ashish Patro
                   ` (2 preceding siblings ...)
  2014-04-25  8:12 ` [ath9k-devel] [PATCH 3/3] Update spectral scan calls to support both ath9k and ath9k_htc. Adding spectral scan functionality to ath9k_htc driver. Tested using a AR9271 WiFi card Ashish Patro
@ 2014-04-29  6:52 ` Oleksij Rempel
  2014-04-29 13:16   ` Ashish Patro
  3 siblings, 1 reply; 10+ messages in thread
From: Oleksij Rempel @ 2014-04-29  6:52 UTC (permalink / raw)
  To: ath9k-devel

Hm... it compiles but i didn't go any results with my script:

sudo bash -c "echo chanscan >
/sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan_ctl"
sudo bash -c "echo 8 >
/sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_count"

for i in $(seq 1 44); do
  sudo iw dev wlan-test scan
  sleep 1
done

sudo bash -c "cat
/sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan0 >
/tmp/fft_results"
sudo bash -c "echo 8 >
/sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_count"

sudo bash -c "echo disable >
/sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan_ctl"

./fft_eval /tmp/fft_results

Am 25.04.2014 10:12, schrieb Ashish Patro:
> 
> 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. Renamed spectral.h to common-spectral.h
>   Refactoring the ath9k driver to move common spectral functions to
>     common-spectral.c
>   Update spectral scan calls to support both ath9k and ath9k_htc.
>     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       |   11 +-
>  drivers/net/wireless/ath/ath9k/ath9k.h            |    9 +-
>  drivers/net/wireless/ath/ath9k/common-spectral.c  |  213 +++++++++++++
>  drivers/net/wireless/ath/ath9k/common-spectral.h  |  199 ++++++++++++
>  drivers/net/wireless/ath/ath9k/htc.h              |   13 +
>  drivers/net/wireless/ath/ath9k/htc_drv_debug.c    |    3 +
>  drivers/net/wireless/ath/ath9k/htc_drv_init.c     |    8 +
>  drivers/net/wireless/ath/ath9k/htc_drv_main.c     |   75 +++++
>  drivers/net/wireless/ath/ath9k/htc_drv_spectral.c |  353 +++++++++++++++++++++
>  drivers/net/wireless/ath/ath9k/htc_drv_txrx.c     |   17 +
>  drivers/net/wireless/ath/ath9k/recv.c             |    7 +-
>  drivers/net/wireless/ath/ath9k/spectral.c         |  187 -----------
>  drivers/net/wireless/ath/ath9k/spectral.h         |  212 ------------
>  14 files changed, 905 insertions(+), 405 deletions(-)
>  create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c
>  create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.h
>  create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
>  delete mode 100644 drivers/net/wireless/ath/ath9k/spectral.h
> 


-- 
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/20140429/580f4fd3/attachment.pgp 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc
  2014-04-29  6:52 ` [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Oleksij Rempel
@ 2014-04-29 13:16   ` Ashish Patro
  2014-04-30 11:15     ` Oleksij Rempel
  0 siblings, 1 reply; 10+ messages in thread
From: Ashish Patro @ 2014-04-29 13:16 UTC (permalink / raw)
  To: ath9k-devel

Hi Oleksij,

For the AR9721 chipset, the spectral count should be set to 0. Also, for
the AR 9271 chipset, I get more stable results in monitor mode.

I've tested it in the following mode:-

1. Create the monitor interface.

WLAN_INTF=wlan3 # Change accordingly to client interface.
PHY_INTF=phy0 # For the ath9k_htc phy interface.
MON_INTF=moni0

iw dev $WLAN_INTF del
iw phy $PHY_INTF interface add $MON_INTF type monitor
ifconfig moni0 up
iwconfig

2. Initiate the spectral scan.

echo background >
/sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan_ctl;
echo trigger > /sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan_ctl;

3. Write output to file (Get endless samples).

while [ 1 ];
do
 echo "Writing";
 sudo cat /sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan0 >>
/tmp/tmp_fft;
 wc -l /tmp/tmp_fft;
 sleep 1;
done

4. Check the FFT output
./fft_eval /tmp/fft_results

Thanks
Ashish

On Tue, Apr 29, 2014 at 1:52 AM, Oleksij Rempel <linux@rempel-privat.de>wrote:

> Hm... it compiles but i didn't go any results with my script:
>
> sudo bash -c "echo chanscan >
> /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan_ctl"
> sudo bash -c "echo 8 >
> /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_count"
>
> for i in $(seq 1 44); do
>   sudo iw dev wlan-test scan
>   sleep 1
> done
>
> sudo bash -c "cat
> /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan0 >
> /tmp/fft_results"
> sudo bash -c "echo 8 >
> /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_count"
>
> sudo bash -c "echo disable >
> /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan_ctl"
>
> ./fft_eval /tmp/fft_results
>
> Am 25.04.2014 10:12, schrieb Ashish Patro:
> >
> > 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. Renamed spectral.h to common-spectral.h
> >   Refactoring the ath9k driver to move common spectral functions to
> >     common-spectral.c
> >   Update spectral scan calls to support both ath9k and ath9k_htc.
> >     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       |   11 +-
> >  drivers/net/wireless/ath/ath9k/ath9k.h            |    9 +-
> >  drivers/net/wireless/ath/ath9k/common-spectral.c  |  213 +++++++++++++
> >  drivers/net/wireless/ath/ath9k/common-spectral.h  |  199 ++++++++++++
> >  drivers/net/wireless/ath/ath9k/htc.h              |   13 +
> >  drivers/net/wireless/ath/ath9k/htc_drv_debug.c    |    3 +
> >  drivers/net/wireless/ath/ath9k/htc_drv_init.c     |    8 +
> >  drivers/net/wireless/ath/ath9k/htc_drv_main.c     |   75 +++++
> >  drivers/net/wireless/ath/ath9k/htc_drv_spectral.c |  353
> +++++++++++++++++++++
> >  drivers/net/wireless/ath/ath9k/htc_drv_txrx.c     |   17 +
> >  drivers/net/wireless/ath/ath9k/recv.c             |    7 +-
> >  drivers/net/wireless/ath/ath9k/spectral.c         |  187 -----------
> >  drivers/net/wireless/ath/ath9k/spectral.h         |  212 ------------
> >  14 files changed, 905 insertions(+), 405 deletions(-)
> >  create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c
> >  create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.h
> >  create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
> >  delete mode 100644 drivers/net/wireless/ath/ath9k/spectral.h
> >
>
>
> --
> Regards,
> Oleksij
>
>
> _______________________________________________
> ath9k-devel mailing list
> ath9k-devel at lists.ath9k.org
> https://lists.ath9k.org/mailman/listinfo/ath9k-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ath9k.org/pipermail/ath9k-devel/attachments/20140429/f5530e91/attachment.htm 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc
  2014-04-29 13:16   ` Ashish Patro
@ 2014-04-30 11:15     ` Oleksij Rempel
  2014-04-30 15:04       ` Ashish Patro
  0 siblings, 1 reply; 10+ messages in thread
From: Oleksij Rempel @ 2014-04-30 11:15 UTC (permalink / raw)
  To: ath9k-devel

Am 29.04.2014 15:16, schrieb Ashish Patro:
> Hi Oleksij,
> 
> For the AR9721 chipset, the spectral count should be set to 0. Also, for
> the AR 9271 chipset, I get more stable results in monitor mode.
> 
> I've tested it in the following mode:-
> 
> 1. Create the monitor interface.
> 
> WLAN_INTF=wlan3 # Change accordingly to client interface.
> PHY_INTF=phy0 # For the ath9k_htc phy interface.
> MON_INTF=moni0
> 
> iw dev $WLAN_INTF del
> iw phy $PHY_INTF interface add $MON_INTF type monitor
> ifconfig moni0 up
> iwconfig
> 
> 2. Initiate the spectral scan.
> 
> echo background >
> /sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan_ctl;
> echo trigger > /sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan_ctl;
> 
> 3. Write output to file (Get endless samples).
> 
> while [ 1 ]; 
> do
>  echo "Writing"; 
>  sudo cat /sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan0 >>
> /tmp/tmp_fft; 
>  wc -l /tmp/tmp_fft;  
>  sleep 1; 
> done
> 
> 4. Check the FFT output
> ./fft_eval /tmp/fft_results

Thank you, it works. Now you can send your patches to
linux-wireless at vger.kernel.org
and
linville at tuxdriver.com

if you have some time and can separate spectral scan to different
debugfs directory to make it universal for both drivers, you'll be my
hero :)
instead of phy0/ath9k/spectral... and phy0/ath9k_htc/spectral...  make
phy0/spectral_scan/scan_*

it will make live for user space programs easier and will make possible
to move debufs part of spectral code to common-sepctral.c

> Thanks
> Ashish
> 
> On Tue, Apr 29, 2014 at 1:52 AM, Oleksij Rempel <linux@rempel-privat.de
> <mailto:linux@rempel-privat.de>> wrote:
> 
>     Hm... it compiles but i didn't go any results with my script:
> 
>     sudo bash -c "echo chanscan >
>     /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan_ctl"
>     sudo bash -c "echo 8 >
>     /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_count"
> 
>     for i in $(seq 1 44); do
>       sudo iw dev wlan-test scan
>       sleep 1
>     done
> 
>     sudo bash -c "cat
>     /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan0 >
>     /tmp/fft_results"
>     sudo bash -c "echo 8 >
>     /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_count"
> 
>     sudo bash -c "echo disable >
>     /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan_ctl"
> 
>     ./fft_eval /tmp/fft_results
> 
>     Am 25.04.2014 10:12, schrieb Ashish Patro:
>     >
>     > 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. Renamed spectral.h to common-spectral.h
>     >   Refactoring the ath9k driver to move common spectral functions to
>     >     common-spectral.c
>     >   Update spectral scan calls to support both ath9k and ath9k_htc.
>     >     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       |   11 +-
>     >  drivers/net/wireless/ath/ath9k/ath9k.h            |    9 +-
>     >  drivers/net/wireless/ath/ath9k/common-spectral.c  |  213
>     +++++++++++++
>     >  drivers/net/wireless/ath/ath9k/common-spectral.h  |  199 ++++++++++++
>     >  drivers/net/wireless/ath/ath9k/htc.h              |   13 +
>     >  drivers/net/wireless/ath/ath9k/htc_drv_debug.c    |    3 +
>     >  drivers/net/wireless/ath/ath9k/htc_drv_init.c     |    8 +
>     >  drivers/net/wireless/ath/ath9k/htc_drv_main.c     |   75 +++++
>     >  drivers/net/wireless/ath/ath9k/htc_drv_spectral.c |  353
>     +++++++++++++++++++++
>     >  drivers/net/wireless/ath/ath9k/htc_drv_txrx.c     |   17 +
>     >  drivers/net/wireless/ath/ath9k/recv.c             |    7 +-
>     >  drivers/net/wireless/ath/ath9k/spectral.c         |  187 -----------
>     >  drivers/net/wireless/ath/ath9k/spectral.h         |  212 ------------
>     >  14 files changed, 905 insertions(+), 405 deletions(-)
>     >  create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c
>     >  create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.h
>     >  create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
>     >  delete mode 100644 drivers/net/wireless/ath/ath9k/spectral.h
>     >
> 
> 
>     --
>     Regards,
>     Oleksij
> 
> 
>     _______________________________________________
>     ath9k-devel mailing list
>     ath9k-devel at lists.ath9k.org <mailto:ath9k-devel@lists.ath9k.org>
>     https://lists.ath9k.org/mailman/listinfo/ath9k-devel
> 
> 


-- 
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/20140430/aab25551/attachment.pgp 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc
  2014-04-30 11:15     ` Oleksij Rempel
@ 2014-04-30 15:04       ` Ashish Patro
  0 siblings, 0 replies; 10+ messages in thread
From: Ashish Patro @ 2014-04-30 15:04 UTC (permalink / raw)
  To: ath9k-devel

Hi Oleksij,

Thanks for the feedback and help with the patches. I?ll try looking into the common directory part soon. The next month may be hard since I?ll be traveling during most of May.

Thanks
Ashish

On Apr 30, 2014, at 6:15 AM, Oleksij Rempel <linux@rempel-privat.de> wrote:

> Am 29.04.2014 15:16, schrieb Ashish Patro:
>> Hi Oleksij,
>> 
>> For the AR9721 chipset, the spectral count should be set to 0. Also, for
>> the AR 9271 chipset, I get more stable results in monitor mode.
>> 
>> I've tested it in the following mode:-
>> 
>> 1. Create the monitor interface.
>> 
>> WLAN_INTF=wlan3 # Change accordingly to client interface.
>> PHY_INTF=phy0 # For the ath9k_htc phy interface.
>> MON_INTF=moni0
>> 
>> iw dev $WLAN_INTF del
>> iw phy $PHY_INTF interface add $MON_INTF type monitor
>> ifconfig moni0 up
>> iwconfig
>> 
>> 2. Initiate the spectral scan.
>> 
>> echo background >
>> /sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan_ctl;
>> echo trigger > /sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan_ctl;
>> 
>> 3. Write output to file (Get endless samples).
>> 
>> while [ 1 ]; 
>> do
>> echo "Writing"; 
>> sudo cat /sys/kernel/debug/ieee80211/phy0/ath9k_htc/spectral_scan0 >>
>> /tmp/tmp_fft; 
>> wc -l /tmp/tmp_fft;  
>> sleep 1; 
>> done
>> 
>> 4. Check the FFT output
>> ./fft_eval /tmp/fft_results
> 
> Thank you, it works. Now you can send your patches to
> linux-wireless at vger.kernel.org
> and
> linville at tuxdriver.com
> 
> if you have some time and can separate spectral scan to different
> debugfs directory to make it universal for both drivers, you'll be my
> hero :)
> instead of phy0/ath9k/spectral... and phy0/ath9k_htc/spectral...  make
> phy0/spectral_scan/scan_*
> 
> it will make live for user space programs easier and will make possible
> to move debufs part of spectral code to common-sepctral.c
> 
>> Thanks
>> Ashish
>> 
>> On Tue, Apr 29, 2014 at 1:52 AM, Oleksij Rempel <linux@rempel-privat.de
>> <mailto:linux@rempel-privat.de>> wrote:
>> 
>>    Hm... it compiles but i didn't go any results with my script:
>> 
>>    sudo bash -c "echo chanscan >
>>    /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan_ctl"
>>    sudo bash -c "echo 8 >
>>    /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_count"
>> 
>>    for i in $(seq 1 44); do
>>      sudo iw dev wlan-test scan
>>      sleep 1
>>    done
>> 
>>    sudo bash -c "cat
>>    /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan0 >
>>    /tmp/fft_results"
>>    sudo bash -c "echo 8 >
>>    /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_count"
>> 
>>    sudo bash -c "echo disable >
>>    /sys/kernel/debug/ieee80211/phy1/ath9k_htc/spectral_scan_ctl"
>> 
>>    ./fft_eval /tmp/fft_results
>> 
>>    Am 25.04.2014 10:12, schrieb Ashish Patro:
>>> 
>>> 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. Renamed spectral.h to common-spectral.h
>>>  Refactoring the ath9k driver to move common spectral functions to
>>>    common-spectral.c
>>>  Update spectral scan calls to support both ath9k and ath9k_htc.
>>>    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       |   11 +-
>>> drivers/net/wireless/ath/ath9k/ath9k.h            |    9 +-
>>> drivers/net/wireless/ath/ath9k/common-spectral.c  |  213
>>    +++++++++++++
>>> drivers/net/wireless/ath/ath9k/common-spectral.h  |  199 ++++++++++++
>>> drivers/net/wireless/ath/ath9k/htc.h              |   13 +
>>> drivers/net/wireless/ath/ath9k/htc_drv_debug.c    |    3 +
>>> drivers/net/wireless/ath/ath9k/htc_drv_init.c     |    8 +
>>> drivers/net/wireless/ath/ath9k/htc_drv_main.c     |   75 +++++
>>> drivers/net/wireless/ath/ath9k/htc_drv_spectral.c |  353
>>    +++++++++++++++++++++
>>> drivers/net/wireless/ath/ath9k/htc_drv_txrx.c     |   17 +
>>> drivers/net/wireless/ath/ath9k/recv.c             |    7 +-
>>> drivers/net/wireless/ath/ath9k/spectral.c         |  187 -----------
>>> drivers/net/wireless/ath/ath9k/spectral.h         |  212 ------------
>>> 14 files changed, 905 insertions(+), 405 deletions(-)
>>> create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c
>>> create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.h
>>> create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
>>> delete mode 100644 drivers/net/wireless/ath/ath9k/spectral.h
>>> 
>> 
>> 
>>    --
>>    Regards,
>>    Oleksij
>> 
>> 
>>    _______________________________________________
>>    ath9k-devel mailing list
>>    ath9k-devel at lists.ath9k.org <mailto:ath9k-devel@lists.ath9k.org>
>>    https://lists.ath9k.org/mailman/listinfo/ath9k-devel
>> 
>> 
> 
> 
> -- 
> Regards,
> Oleksij

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ath9k.org/pipermail/ath9k-devel/attachments/20140430/342146a2/attachment.htm 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc
  2014-04-21  1:08 Ashish Patro
@ 2014-04-21  6:57 ` Oleksij Rempel
  0 siblings, 0 replies; 10+ messages in thread
From: Oleksij Rempel @ 2014-04-21  6:57 UTC (permalink / raw)
  To: ath9k-devel

This looks better, but it should be compilable and working after each
patch. The test should be done by you.. ;)

Am 21.04.2014 03:08, schrieb Ashish Patro:
> 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. Renamed spectral.h to common-spectral.h
>   Refactoring the ath9k driver to move common spectral functions to
>     common-spectral.c
>   Update spectral scan calls to support both ath9k and ath9k_htc.
>     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       |   11 +-
>  drivers/net/wireless/ath/ath9k/ath9k.h            |    9 +-
>  drivers/net/wireless/ath/ath9k/common-spectral.c  |  213 +++++++++++++
>  drivers/net/wireless/ath/ath9k/common-spectral.h  |  199 ++++++++++++
>  drivers/net/wireless/ath/ath9k/htc.h              |   13 +
>  drivers/net/wireless/ath/ath9k/htc_drv_debug.c    |    3 +
>  drivers/net/wireless/ath/ath9k/htc_drv_init.c     |    8 +
>  drivers/net/wireless/ath/ath9k/htc_drv_main.c     |   75 +++++
>  drivers/net/wireless/ath/ath9k/htc_drv_spectral.c |  353 +++++++++++++++++++++
>  drivers/net/wireless/ath/ath9k/htc_drv_txrx.c     |   17 +
>  drivers/net/wireless/ath/ath9k/recv.c             |    7 +-
>  drivers/net/wireless/ath/ath9k/spectral.c         |  187 -----------
>  drivers/net/wireless/ath/ath9k/spectral.h         |  212 ------------
>  14 files changed, 905 insertions(+), 405 deletions(-)
>  create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c
>  create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.h
>  create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
>  delete mode 100644 drivers/net/wireless/ath/ath9k/spectral.h
> 


-- 
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/20140421/a32789ac/attachment.pgp 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc
@ 2014-04-21  1:08 Ashish Patro
  2014-04-21  6:57 ` Oleksij Rempel
  0 siblings, 1 reply; 10+ messages in thread
From: Ashish Patro @ 2014-04-21  1:08 UTC (permalink / raw)
  To: ath9k-devel

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. Renamed spectral.h to common-spectral.h
  Refactoring the ath9k driver to move common spectral functions to
    common-spectral.c
  Update spectral scan calls to support both ath9k and ath9k_htc.
    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       |   11 +-
 drivers/net/wireless/ath/ath9k/ath9k.h            |    9 +-
 drivers/net/wireless/ath/ath9k/common-spectral.c  |  213 +++++++++++++
 drivers/net/wireless/ath/ath9k/common-spectral.h  |  199 ++++++++++++
 drivers/net/wireless/ath/ath9k/htc.h              |   13 +
 drivers/net/wireless/ath/ath9k/htc_drv_debug.c    |    3 +
 drivers/net/wireless/ath/ath9k/htc_drv_init.c     |    8 +
 drivers/net/wireless/ath/ath9k/htc_drv_main.c     |   75 +++++
 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c |  353 +++++++++++++++++++++
 drivers/net/wireless/ath/ath9k/htc_drv_txrx.c     |   17 +
 drivers/net/wireless/ath/ath9k/recv.c             |    7 +-
 drivers/net/wireless/ath/ath9k/spectral.c         |  187 -----------
 drivers/net/wireless/ath/ath9k/spectral.h         |  212 ------------
 14 files changed, 905 insertions(+), 405 deletions(-)
 create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.c
 create mode 100644 drivers/net/wireless/ath/ath9k/common-spectral.h
 create mode 100644 drivers/net/wireless/ath/ath9k/htc_drv_spectral.c
 delete mode 100644 drivers/net/wireless/ath/ath9k/spectral.h

-- 
1.7.5.4

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-04-30 15:04 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-25  8:12 [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Ashish Patro
2014-04-25  8:12 ` [ath9k-devel] [PATCH 1/3] Moving the ath9k specific spectral functions to ath9k.h from spectral.h. Renamed spectral.h to common-spectral.h Ashish Patro
2014-04-25  8:12 ` [ath9k-devel] [PATCH 2/3] Refactoring the ath9k driver to move common spectral functions to common-spectral.c Ashish Patro
2014-04-25  8:12 ` [ath9k-devel] [PATCH 3/3] Update spectral scan calls to support both ath9k and ath9k_htc. Adding spectral scan functionality to ath9k_htc driver. Tested using a AR9271 WiFi card Ashish Patro
2014-04-29  6:52 ` [ath9k-devel] [PATCH 0/3] Refactoring spectral scan code and adding spectral scan support for ath9k_htc Oleksij Rempel
2014-04-29 13:16   ` Ashish Patro
2014-04-30 11:15     ` Oleksij Rempel
2014-04-30 15:04       ` Ashish Patro
  -- strict thread matches above, loose matches on Subject: below --
2014-04-21  1:08 Ashish Patro
2014-04-21  6:57 ` Oleksij Rempel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.