Changeset 39138


Ignore:
Timestamp:
2013-12-19T18:18:07+01:00 (4 years ago)
Author:
nbd
Message:

ath9k: merge another round of upstream (or -pending) fixes and cleanups

Signed-off-by: Felix Fietkau <nbd@…>

Location:
trunk/package/kernel/mac80211/patches
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/kernel/mac80211/patches/300-pending_work.patch

    r39098 r39138  
    4444--- a/drivers/net/wireless/ath/ath9k/Makefile 
    4545+++ b/drivers/net/wireless/ath/ath9k/Makefile 
    46 @@ -13,9 +13,9 @@ ath9k-$(CPTCFG_ATH9K_PCI) += pci.o 
     46@@ -11,11 +11,13 @@ ath9k-$(CPTCFG_ATH9K_BTCOEX_SUPPORT) +=  
     47 ath9k-$(CPTCFG_ATH9K_LEGACY_RATE_CONTROL) += rc.o 
     48 ath9k-$(CPTCFG_ATH9K_PCI) += pci.o 
    4749 ath9k-$(CPTCFG_ATH9K_AHB) += ahb.o 
    48  ath9k-$(CPTCFG_ATH9K_DEBUGFS) += debug.o 
     50-ath9k-$(CPTCFG_ATH9K_DEBUGFS) += debug.o 
    4951 ath9k-$(CPTCFG_ATH9K_DFS_DEBUGFS) += dfs_debug.o 
    5052-ath9k-$(CPTCFG_ATH9K_DFS_CERTIFIED) += \ 
     
    5456+ath9k-$(CPTCFG_ATH9K_TX99) += tx99.o 
    5557+ath9k-$(CPTCFG_ATH9K_WOW) += wow.o 
     58+ 
     59+ath9k-$(CPTCFG_ATH9K_DEBUGFS) += debug.o \ 
     60+                                spectral.o 
    5661  
    5762 obj-$(CPTCFG_ATH9K) += ath9k.o 
    5863  
    59 @@ -41,6 +41,8 @@ ath9k_hw-y:=  \ 
     64@@ -41,6 +43,8 @@ ath9k_hw-y:=  \ 
    6065                ar9003_eeprom.o \ 
    6166                ar9003_paprd.o 
     
    849854--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    850855+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    851 @@ -459,6 +459,7 @@ void ath_check_ani(struct ath_softc *sc) 
     856@@ -27,40 +27,15 @@ 
     857 #include "common.h" 
     858 #include "mci.h" 
     859 #include "dfs.h" 
     860- 
     861-/* 
     862- * Header for the ath9k.ko driver core *only* -- hw code nor any other driver 
     863- * should rely on this file or its contents. 
     864- */ 
     865+#include "spectral.h" 
     866  
     867 struct ath_node; 
     868+struct ath_rate_table; 
     869  
     870-/* Macro to expand scalars to 64-bit objects */ 
     871- 
     872-#define        ito64(x) (sizeof(x) == 1) ?                     \ 
     873-       (((unsigned long long int)(x)) & (0xff)) :      \ 
     874-       (sizeof(x) == 2) ?                              \ 
     875-       (((unsigned long long int)(x)) & 0xffff) :      \ 
     876-       ((sizeof(x) == 4) ?                             \ 
     877-        (((unsigned long long int)(x)) & 0xffffffff) : \ 
     878-        (unsigned long long int)(x)) 
     879- 
     880-/* increment with wrap-around */ 
     881-#define INCR(_l, _sz)   do {                   \ 
     882-               (_l)++;                         \ 
     883-               (_l) &= ((_sz) - 1);            \ 
     884-       } while (0) 
     885- 
     886-/* decrement with wrap-around */ 
     887-#define DECR(_l,  _sz)  do {                   \ 
     888-               (_l)--;                         \ 
     889-               (_l) &= ((_sz) - 1);            \ 
     890-       } while (0) 
     891- 
     892-#define TSF_TO_TU(_h,_l) \ 
     893-       ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) 
     894- 
     895-#define        ATH_TXQ_SETUP(sc, i)        ((sc)->tx.txqsetup & (1<<i)) 
     896+extern struct ieee80211_ops ath9k_ops; 
     897+extern int ath9k_modparam_nohwcrypt; 
     898+extern int led_blink; 
     899+extern bool is_ath9k_unloaded; 
     900  
     901 struct ath_config { 
     902        u16 txpowlimit; 
     903@@ -70,6 +45,17 @@ struct ath_config { 
     904 /* Descriptor Management */ 
     905 /*************************/ 
     906  
     907+#define ATH_TXSTATUS_RING_SIZE 512 
     908+ 
     909+/* Macro to expand scalars to 64-bit objects */ 
     910+#define        ito64(x) (sizeof(x) == 1) ?                     \ 
     911+       (((unsigned long long int)(x)) & (0xff)) :      \ 
     912+       (sizeof(x) == 2) ?                              \ 
     913+       (((unsigned long long int)(x)) & 0xffff) :      \ 
     914+       ((sizeof(x) == 4) ?                             \ 
     915+        (((unsigned long long int)(x)) & 0xffffffff) : \ 
     916+        (unsigned long long int)(x)) 
     917+ 
     918 #define ATH_TXBUF_RESET(_bf) do {                              \ 
     919                (_bf)->bf_lastbf = NULL;                        \ 
     920                (_bf)->bf_next = NULL;                          \ 
     921@@ -77,23 +63,6 @@ struct ath_config { 
     922                       sizeof(struct ath_buf_state));           \ 
     923        } while (0) 
     924  
     925-/** 
     926- * enum buffer_type - Buffer type flags 
     927- * 
     928- * @BUF_AMPDU: This buffer is an ampdu, as part of an aggregate (during TX) 
     929- * @BUF_AGGR: Indicates whether the buffer can be aggregated 
     930- *     (used in aggregation scheduling) 
     931- */ 
     932-enum buffer_type { 
     933-       BUF_AMPDU               = BIT(0), 
     934-       BUF_AGGR                = BIT(1), 
     935-}; 
     936- 
     937-#define bf_isampdu(bf)         (bf->bf_state.bf_type & BUF_AMPDU) 
     938-#define bf_isaggr(bf)          (bf->bf_state.bf_type & BUF_AGGR) 
     939- 
     940-#define ATH_TXSTATUS_RING_SIZE 512 
     941- 
     942 #define        DS2PHYS(_dd, _ds)                                               \ 
     943        ((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc)) 
     944 #define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0) 
     945@@ -113,11 +82,20 @@ int ath_descdma_setup(struct ath_softc * 
     946 /* RX / TX */ 
     947 /***********/ 
     948  
     949+#define        ATH_TXQ_SETUP(sc, i) ((sc)->tx.txqsetup & (1<<i)) 
     950+ 
     951+/* increment with wrap-around */ 
     952+#define INCR(_l, _sz)   do {                   \ 
     953+               (_l)++;                         \ 
     954+               (_l) &= ((_sz) - 1);            \ 
     955+       } while (0) 
     956+ 
     957 #define ATH_RXBUF               512 
     958 #define ATH_TXBUF               512 
     959 #define ATH_TXBUF_RESERVE       5 
     960 #define ATH_MAX_QDEPTH          (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE) 
     961 #define ATH_TXMAXTRY            13 
     962+#define ATH_MAX_SW_RETRIES      30 
     963  
     964 #define TID_TO_WME_AC(_tid)                            \ 
     965        ((((_tid) == 0) || ((_tid) == 3)) ? IEEE80211_AC_BE :   \ 
     966@@ -133,6 +111,9 @@ int ath_descdma_setup(struct ath_softc * 
     967 #define ATH_AGGR_MIN_QDEPTH        2 
     968 /* minimum h/w qdepth for non-aggregated traffic */ 
     969 #define ATH_NON_AGGR_MIN_QDEPTH    8 
     970+#define ATH_TX_COMPLETE_POLL_INT   1000 
     971+#define ATH_TXFIFO_DEPTH           8 
     972+#define ATH_TX_ERROR               0x01 
     973  
     974 #define IEEE80211_SEQ_SEQ_SHIFT    4 
     975 #define IEEE80211_SEQ_MAX          4096 
     976@@ -167,9 +148,6 @@ int ath_descdma_setup(struct ath_softc * 
     977  
     978 #define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e)) 
     979  
     980-#define ATH_TX_COMPLETE_POLL_INT       1000 
     981- 
     982-#define ATH_TXFIFO_DEPTH 8 
     983 struct ath_txq { 
     984        int mac80211_qnum; /* mac80211 queue number, -1 means not mac80211 Q */ 
     985        u32 axq_qnum; /* ath9k hardware queue number */ 
     986@@ -214,6 +192,21 @@ struct ath_rxbuf { 
     987        dma_addr_t bf_buf_addr; 
     988 }; 
     989  
     990+/** 
     991+ * enum buffer_type - Buffer type flags 
     992+ * 
     993+ * @BUF_AMPDU: This buffer is an ampdu, as part of an aggregate (during TX) 
     994+ * @BUF_AGGR: Indicates whether the buffer can be aggregated 
     995+ *     (used in aggregation scheduling) 
     996+ */ 
     997+enum buffer_type { 
     998+       BUF_AMPDU               = BIT(0), 
     999+       BUF_AGGR                = BIT(1), 
     1000+}; 
     1001+ 
     1002+#define bf_isampdu(bf)         (bf->bf_state.bf_type & BUF_AMPDU) 
     1003+#define bf_isaggr(bf)          (bf->bf_state.bf_type & BUF_AGGR) 
     1004+ 
     1005 struct ath_buf_state { 
     1006        u8 bf_type; 
     1007        u8 bfs_paprd; 
     1008@@ -278,7 +271,6 @@ struct ath_tx_control { 
     1009        struct ieee80211_sta *sta; 
     1010 }; 
     1011  
     1012-#define ATH_TX_ERROR        0x01 
     1013  
     1014 /** 
     1015  * @txq_map:  Index is mac80211 queue number.  This is 
     1016@@ -372,6 +364,22 @@ struct ath_vif { 
     1017        struct ath_buf *av_bcbuf; 
     1018 }; 
     1019  
     1020+struct ath9k_vif_iter_data { 
     1021+       u8 hw_macaddr[ETH_ALEN]; /* address of the first vif */ 
     1022+       u8 mask[ETH_ALEN]; /* bssid mask */ 
     1023+       bool has_hw_macaddr; 
     1024+ 
     1025+       int naps;      /* number of AP vifs */ 
     1026+       int nmeshes;   /* number of mesh vifs */ 
     1027+       int nstations; /* number of station vifs */ 
     1028+       int nwds;      /* number of WDS vifs */ 
     1029+       int nadhocs;   /* number of adhoc vifs */ 
     1030+}; 
     1031+ 
     1032+void ath9k_calculate_iter_data(struct ieee80211_hw *hw, 
     1033+                              struct ieee80211_vif *vif, 
     1034+                              struct ath9k_vif_iter_data *iter_data); 
     1035+ 
     1036 /*******************/ 
     1037 /* Beacon Handling */ 
     1038 /*******************/ 
     1039@@ -387,6 +395,9 @@ struct ath_vif { 
     1040 #define ATH_DEFAULT_BMISS_LIMIT        10 
     1041 #define IEEE80211_MS_TO_TU(x)           (((x) * 1000) / 1024) 
     1042  
     1043+#define TSF_TO_TU(_h,_l) \ 
     1044+       ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) 
     1045+ 
     1046 struct ath_beacon_config { 
     1047        int beacon_interval; 
     1048        u16 listen_interval; 
     1049@@ -420,12 +431,10 @@ struct ath_beacon { 
     1050 }; 
     1051  
     1052 void ath9k_beacon_tasklet(unsigned long data); 
     1053-bool ath9k_allow_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif); 
     1054 void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif, 
     1055                         u32 changed); 
     1056 void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif); 
     1057 void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif); 
     1058-void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif); 
     1059 void ath9k_set_beacon(struct ath_softc *sc); 
     1060 bool ath9k_csa_is_finished(struct ath_softc *sc); 
     1061  
     1062@@ -440,10 +449,9 @@ bool ath9k_csa_is_finished(struct ath_so 
     1063 #define ATH_LONG_CALINTERVAL_INT  1000    /* 1000 ms */ 
     1064 #define ATH_LONG_CALINTERVAL      30000   /* 30 seconds */ 
     1065 #define ATH_RESTART_CALINTERVAL   1200000 /* 20 minutes */ 
     1066-#define ATH_ANI_MAX_SKIP_COUNT  10 
     1067- 
     1068-#define ATH_PAPRD_TIMEOUT      100 /* msecs */ 
     1069-#define ATH_PLL_WORK_INTERVAL   100 
     1070+#define ATH_ANI_MAX_SKIP_COUNT    10 
     1071+#define ATH_PAPRD_TIMEOUT         100 /* msecs */ 
     1072+#define ATH_PLL_WORK_INTERVAL     100 
     1073  
     1074 void ath_tx_complete_poll_work(struct work_struct *work); 
     1075 void ath_reset_work(struct work_struct *work); 
     1076@@ -459,6 +467,7 @@ void ath_check_ani(struct ath_softc *sc) 
    8521077 int ath_update_survey_stats(struct ath_softc *sc); 
    8531078 void ath_update_survey_nf(struct ath_softc *sc, int channel); 
     
    8571082 /**********/ 
    8581083 /* BTCOEX */ 
    859 @@ -476,20 +477,19 @@ enum bt_op_flags { 
     1084@@ -476,20 +485,19 @@ enum bt_op_flags { 
    8601085 }; 
    8611086  
     
    8811106        u8 stomp_audio; 
    8821107 }; 
    883 @@ -570,6 +570,34 @@ static inline void ath_fill_led_pin(stru 
     1108@@ -537,12 +545,6 @@ static inline int ath9k_dump_btcoex(stru 
     1109 } 
     1110 #endif /* CPTCFG_ATH9K_BTCOEX_SUPPORT */ 
     1111  
     1112-struct ath9k_wow_pattern { 
     1113-       u8 pattern_bytes[MAX_PATTERN_SIZE]; 
     1114-       u8 mask_bytes[MAX_PATTERN_SIZE]; 
     1115-       u32 pattern_len; 
     1116-}; 
     1117- 
     1118 /********************/ 
     1119 /*   LED Control    */ 
     1120 /********************/ 
     1121@@ -570,6 +572,40 @@ static inline void ath_fill_led_pin(stru 
    8841122 } 
    8851123 #endif 
     
    8891127+/************************/ 
    8901128+ 
    891 +#ifdef CONFIG_ATH9K_WOW 
     1129+struct ath9k_wow_pattern { 
     1130+       u8 pattern_bytes[MAX_PATTERN_SIZE]; 
     1131+       u8 mask_bytes[MAX_PATTERN_SIZE]; 
     1132+       u32 pattern_len; 
     1133+}; 
     1134+ 
     1135+#ifdef CPTCFG_ATH9K_WOW 
    8921136+void ath9k_init_wow(struct ieee80211_hw *hw); 
    8931137+int ath9k_suspend(struct ieee80211_hw *hw, 
     
    9161160 /* Antenna diversity/combining */ 
    9171161 /*******************************/ 
    918 @@ -632,15 +660,16 @@ void ath_ant_comb_scan(struct ath_softc  
     1162@@ -632,28 +668,24 @@ void ath_ant_comb_scan(struct ath_softc  
    9191163 /* Main driver core */ 
    9201164 /********************/ 
     
    9421186 /* 
    9431187  * Default cache line size, in bytes. 
    944 @@ -723,6 +752,7 @@ struct ath_softc { 
     1188  * Used when PCI device not fully initialized by bootrom/BIOS 
     1189 */ 
     1190 #define DEFAULT_CACHELINE       32 
     1191-#define ATH_REGCLASSIDS_MAX     10 
     1192 #define ATH_CABQ_READY_TIME     80      /* % of beacon interval */ 
     1193-#define ATH_MAX_SW_RETRIES      30 
     1194-#define ATH_CHAN_MAX            255 
     1195- 
     1196 #define ATH_TXPOWER_MAX         100     /* .5 dBm units */ 
     1197-#define ATH_RATE_DUMMY_MARKER   0 
     1198  
     1199 enum sc_op_flags { 
     1200        SC_OP_INVALID, 
     1201@@ -672,37 +704,6 @@ enum sc_op_flags { 
     1202 #define PS_BEACON_SYNC            BIT(4) 
     1203 #define PS_WAIT_FOR_ANI           BIT(5) 
     1204  
     1205-struct ath_rate_table; 
     1206- 
     1207-struct ath9k_vif_iter_data { 
     1208-       u8 hw_macaddr[ETH_ALEN]; /* address of the first vif */ 
     1209-       u8 mask[ETH_ALEN]; /* bssid mask */ 
     1210-       bool has_hw_macaddr; 
     1211- 
     1212-       int naps;      /* number of AP vifs */ 
     1213-       int nmeshes;   /* number of mesh vifs */ 
     1214-       int nstations; /* number of station vifs */ 
     1215-       int nwds;      /* number of WDS vifs */ 
     1216-       int nadhocs;   /* number of adhoc vifs */ 
     1217-}; 
     1218- 
     1219-/* enum spectral_mode: 
     1220- * 
     1221- * @SPECTRAL_DISABLED: spectral mode is disabled 
     1222- * @SPECTRAL_BACKGROUND: hardware sends samples when it is not busy with 
     1223- *     something else. 
     1224- * @SPECTRAL_MANUAL: spectral scan is enabled, triggering for samples 
     1225- *     is performed manually. 
     1226- * @SPECTRAL_CHANSCAN: Like manual, but also triggered when changing channels 
     1227- *     during a channel scan. 
     1228- */ 
     1229-enum spectral_mode { 
     1230-       SPECTRAL_DISABLED = 0, 
     1231-       SPECTRAL_BACKGROUND, 
     1232-       SPECTRAL_MANUAL, 
     1233-       SPECTRAL_CHANSCAN, 
     1234-}; 
     1235- 
     1236 struct ath_softc { 
     1237        struct ieee80211_hw *hw; 
     1238        struct device *dev; 
     1239@@ -723,6 +724,7 @@ struct ath_softc { 
    9451240        struct work_struct hw_check_work; 
    9461241        struct work_struct hw_reset_work; 
     
    9501245        unsigned int hw_busy_count; 
    9511246        unsigned long sc_flags; 
    952 @@ -759,6 +789,7 @@ struct ath_softc { 
     1247@@ -759,6 +761,7 @@ struct ath_softc { 
    9531248        struct delayed_work tx_complete_work; 
    9541249        struct delayed_work hw_pll_work; 
     
    9581253 #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT 
    9591254        struct ath_btcoex btcoex; 
    960 @@ -783,7 +814,7 @@ struct ath_softc { 
     1255@@ -783,199 +786,54 @@ struct ath_softc { 
    9611256        bool tx99_state; 
    9621257        s16 tx99_power; 
     
    9671262        atomic_t wow_sleep_proc_intr; /* in the middle of WoW sleep ? */ 
    9681263        u32 wow_intr_before_sleep; 
    969 @@ -946,10 +977,25 @@ struct fft_sample_ht20_40 { 
    970         u8 data[SPECTRAL_HT20_40_NUM_BINS]; 
    971  } __packed; 
    972   
    973 -int ath9k_tx99_init(struct ath_softc *sc); 
    974 -void ath9k_tx99_deinit(struct ath_softc *sc); 
     1264 #endif 
     1265 }; 
     1266  
     1267-#define SPECTRAL_SCAN_BITMASK          0x10 
     1268-/* Radar info packet format, used for DFS and spectral formats. */ 
     1269-struct ath_radar_info { 
     1270-       u8 pulse_length_pri; 
     1271-       u8 pulse_length_ext; 
     1272-       u8 pulse_bw_info; 
     1273-} __packed; 
     1274- 
     1275-/* The HT20 spectral data has 4 bytes of additional information at it's end. 
     1276- * 
     1277- * [7:0]: all bins {max_magnitude[1:0], bitmap_weight[5:0]} 
     1278- * [7:0]: all bins  max_magnitude[9:2] 
     1279- * [7:0]: all bins {max_index[5:0], max_magnitude[11:10]} 
     1280- * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned) 
     1281- */ 
     1282-struct ath_ht20_mag_info { 
     1283-       u8 all_bins[3]; 
     1284-       u8 max_exp; 
     1285-} __packed; 
     1286- 
     1287-#define SPECTRAL_HT20_NUM_BINS         56 
     1288- 
     1289-/* WARNING: don't actually use this struct! MAC may vary the amount of 
     1290- * data by -1/+2. This struct is for reference only. 
     1291- */ 
     1292-struct ath_ht20_fft_packet { 
     1293-       u8 data[SPECTRAL_HT20_NUM_BINS]; 
     1294-       struct ath_ht20_mag_info mag_info; 
     1295-       struct ath_radar_info radar_info; 
     1296-} __packed; 
     1297- 
     1298-#define SPECTRAL_HT20_TOTAL_DATA_LEN   (sizeof(struct ath_ht20_fft_packet)) 
     1299- 
     1300-/* Dynamic 20/40 mode: 
     1301- * 
     1302- * [7:0]: lower bins {max_magnitude[1:0], bitmap_weight[5:0]} 
     1303- * [7:0]: lower bins  max_magnitude[9:2] 
     1304- * [7:0]: lower bins {max_index[5:0], max_magnitude[11:10]} 
     1305- * [7:0]: upper bins {max_magnitude[1:0], bitmap_weight[5:0]} 
     1306- * [7:0]: upper bins  max_magnitude[9:2] 
     1307- * [7:0]: upper bins {max_index[5:0], max_magnitude[11:10]} 
     1308- * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned) 
     1309- */ 
     1310-struct ath_ht20_40_mag_info { 
     1311-       u8 lower_bins[3]; 
     1312-       u8 upper_bins[3]; 
     1313-       u8 max_exp; 
     1314-} __packed; 
     1315- 
     1316-#define SPECTRAL_HT20_40_NUM_BINS              128 
     1317- 
     1318-/* WARNING: don't actually use this struct! MAC may vary the amount of 
     1319- * data. This struct is for reference only. 
     1320- */ 
     1321-struct ath_ht20_40_fft_packet { 
     1322-       u8 data[SPECTRAL_HT20_40_NUM_BINS]; 
     1323-       struct ath_ht20_40_mag_info mag_info; 
     1324-       struct ath_radar_info radar_info; 
     1325-} __packed; 
     1326- 
     1327- 
     1328-#define SPECTRAL_HT20_40_TOTAL_DATA_LEN        (sizeof(struct ath_ht20_40_fft_packet)) 
     1329- 
     1330-/* grabs the max magnitude from the all/upper/lower bins */ 
     1331-static inline u16 spectral_max_magnitude(u8 *bins) 
     1332-{ 
     1333-       return (bins[0] & 0xc0) >> 6 | 
     1334-              (bins[1] & 0xff) << 2 | 
     1335-              (bins[2] & 0x03) << 10; 
     1336-} 
    9751337+/********/ 
    9761338+/* TX99 */ 
    9771339+/********/ 
    978 + 
     1340  
     1341-/* return the max magnitude from the all/upper/lower bins */ 
     1342-static inline u8 spectral_max_index(u8 *bins) 
    9791343+#ifdef CONFIG_ATH9K_TX99 
    9801344+void ath9k_tx99_init_debug(struct ath_softc *sc); 
    981  int ath9k_tx99_send(struct ath_softc *sc, struct sk_buff *skb, 
    982                     struct ath_tx_control *txctl); 
     1345+int ath9k_tx99_send(struct ath_softc *sc, struct sk_buff *skb, 
     1346+                   struct ath_tx_control *txctl); 
    9831347+#else 
    9841348+static inline void ath9k_tx99_init_debug(struct ath_softc *sc) 
    985 +{ 
    986 +} 
     1349 { 
     1350-       s8 m = (bins[2] & 0xfc) >> 2; 
     1351- 
     1352-       /* TODO: this still doesn't always report the right values ... */ 
     1353-       if (m > 32) 
     1354-               m |= 0xe0; 
     1355-       else 
     1356-               m &= ~0xe0; 
     1357- 
     1358-       return m + 29; 
     1359 } 
     1360- 
     1361-/* return the bitmap weight from the all/upper/lower bins */ 
     1362-static inline u8 spectral_bitmap_weight(u8 *bins) 
    9871363+static inline int ath9k_tx99_send(struct ath_softc *sc, 
    9881364+                                 struct sk_buff *skb, 
    9891365+                                 struct ath_tx_control *txctl) 
    990 +{ 
     1366 { 
     1367-       return bins[0] & 0x3f; 
    9911368+       return 0; 
    992 +} 
     1369 } 
     1370- 
     1371-/* FFT sample format given to userspace via debugfs. 
     1372- * 
     1373- * Please keep the type/length at the front position and change 
     1374- * other fields after adding another sample type 
     1375- * 
     1376- * TODO: this might need rework when switching to nl80211-based 
     1377- * interface. 
     1378- */ 
     1379-enum ath_fft_sample_type { 
     1380-       ATH_FFT_SAMPLE_HT20 = 1, 
     1381-       ATH_FFT_SAMPLE_HT20_40, 
     1382-}; 
     1383- 
     1384-struct fft_sample_tlv { 
     1385-       u8 type;        /* see ath_fft_sample */ 
     1386-       __be16 length; 
     1387-       /* type dependent data follows */ 
     1388-} __packed; 
     1389- 
     1390-struct fft_sample_ht20 { 
     1391-       struct fft_sample_tlv tlv; 
     1392- 
     1393-       u8 max_exp; 
     1394- 
     1395-       __be16 freq; 
     1396-       s8 rssi; 
     1397-       s8 noise; 
     1398- 
     1399-       __be16 max_magnitude; 
     1400-       u8 max_index; 
     1401-       u8 bitmap_weight; 
     1402- 
     1403-       __be64 tsf; 
     1404- 
     1405-       u8 data[SPECTRAL_HT20_NUM_BINS]; 
     1406-} __packed; 
     1407- 
     1408-struct fft_sample_ht20_40 { 
     1409-       struct fft_sample_tlv tlv; 
     1410- 
     1411-       u8 channel_type; 
     1412-       __be16 freq; 
     1413- 
     1414-       s8 lower_rssi; 
     1415-       s8 upper_rssi; 
     1416- 
     1417-       __be64 tsf; 
     1418- 
     1419-       s8 lower_noise; 
     1420-       s8 upper_noise; 
     1421- 
     1422-       __be16 lower_max_magnitude; 
     1423-       __be16 upper_max_magnitude; 
     1424- 
     1425-       u8 lower_max_index; 
     1426-       u8 upper_max_index; 
     1427- 
     1428-       u8 lower_bitmap_weight; 
     1429-       u8 upper_bitmap_weight; 
     1430- 
     1431-       u8 max_exp; 
     1432- 
     1433-       u8 data[SPECTRAL_HT20_40_NUM_BINS]; 
     1434-} __packed; 
     1435- 
     1436-int ath9k_tx99_init(struct ath_softc *sc); 
     1437-void ath9k_tx99_deinit(struct ath_softc *sc); 
     1438-int ath9k_tx99_send(struct ath_softc *sc, struct sk_buff *skb, 
     1439-                   struct ath_tx_control *txctl); 
     1440- 
     1441-void ath9k_tasklet(unsigned long data); 
     1442-int ath_cabq_update(struct ath_softc *); 
    9931443+#endif /* CONFIG_ATH9K_TX99 */ 
    9941444  
    995  void ath9k_tasklet(unsigned long data); 
    996  int ath_cabq_update(struct ath_softc *); 
    997 @@ -966,6 +1012,9 @@ extern bool is_ath9k_unloaded; 
    998   
     1445 static inline void ath_read_cachesize(struct ath_common *common, int *csz) 
     1446 { 
     1447        common->bus_ops->read_cachesize(common, csz); 
     1448 } 
     1449  
     1450-extern struct ieee80211_ops ath9k_ops; 
     1451-extern int ath9k_modparam_nohwcrypt; 
     1452-extern int led_blink; 
     1453-extern bool is_ath9k_unloaded; 
     1454- 
     1455+void ath9k_tasklet(unsigned long data); 
     1456+int ath_cabq_update(struct ath_softc *); 
    9991457 u8 ath9k_parse_mpdudensity(u8 mpdudensity); 
    10001458 irqreturn_t ath_isr(int irq, void *dev); 
     
    10051463                    const struct ath_bus_ops *bus_ops); 
    10061464 void ath9k_deinit_device(struct ath_softc *sc); 
     1465-void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw); 
     1466 void ath9k_reload_chainmask_settings(struct ath_softc *sc); 
     1467- 
     1468-void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw); 
     1469-int ath9k_spectral_scan_config(struct ieee80211_hw *hw, 
     1470-                              enum spectral_mode spectral_mode); 
     1471- 
     1472+u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate); 
     1473+void ath_start_rfkill_poll(struct ath_softc *sc); 
     1474+void ath9k_rfkill_poll_state(struct ieee80211_hw *hw); 
     1475+void ath9k_ps_wakeup(struct ath_softc *sc); 
     1476+void ath9k_ps_restore(struct ath_softc *sc); 
     1477  
     1478 #ifdef CPTCFG_ATH9K_PCI 
     1479 int ath_pci_init(void); 
     1480@@ -993,15 +851,4 @@ static inline int ath_ahb_init(void) { r 
     1481 static inline void ath_ahb_exit(void) {}; 
     1482 #endif 
     1483  
     1484-void ath9k_ps_wakeup(struct ath_softc *sc); 
     1485-void ath9k_ps_restore(struct ath_softc *sc); 
     1486- 
     1487-u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate); 
     1488- 
     1489-void ath_start_rfkill_poll(struct ath_softc *sc); 
     1490-extern void ath9k_rfkill_poll_state(struct ieee80211_hw *hw); 
     1491-void ath9k_calculate_iter_data(struct ieee80211_hw *hw, 
     1492-                              struct ieee80211_vif *vif, 
     1493-                              struct ath9k_vif_iter_data *iter_data); 
     1494- 
     1495 #endif /* ATH9K_H */ 
    10071496--- a/drivers/net/wireless/ath/ath9k/debug.c 
    10081497+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    1009 @@ -1782,111 +1782,6 @@ void ath9k_deinit_debug(struct ath_softc 
    1010         } 
     1498@@ -17,7 +17,6 @@ 
     1499 #include <linux/slab.h> 
     1500 #include <linux/vmalloc.h> 
     1501 #include <linux/export.h> 
     1502-#include <linux/relay.h> 
     1503 #include <asm/unaligned.h> 
     1504  
     1505 #include "ath9k.h" 
     1506@@ -27,6 +26,47 @@ 
     1507 #define REG_READ_D(_ah, _reg) \ 
     1508        ath9k_hw_common(_ah)->ops->read((_ah), (_reg)) 
     1509  
     1510+void ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause) 
     1511+{ 
     1512+       if (sync_cause) 
     1513+               sc->debug.stats.istats.sync_cause_all++; 
     1514+       if (sync_cause & AR_INTR_SYNC_RTC_IRQ) 
     1515+               sc->debug.stats.istats.sync_rtc_irq++; 
     1516+       if (sync_cause & AR_INTR_SYNC_MAC_IRQ) 
     1517+               sc->debug.stats.istats.sync_mac_irq++; 
     1518+       if (sync_cause & AR_INTR_SYNC_EEPROM_ILLEGAL_ACCESS) 
     1519+               sc->debug.stats.istats.eeprom_illegal_access++; 
     1520+       if (sync_cause & AR_INTR_SYNC_APB_TIMEOUT) 
     1521+               sc->debug.stats.istats.apb_timeout++; 
     1522+       if (sync_cause & AR_INTR_SYNC_PCI_MODE_CONFLICT) 
     1523+               sc->debug.stats.istats.pci_mode_conflict++; 
     1524+       if (sync_cause & AR_INTR_SYNC_HOST1_FATAL) 
     1525+               sc->debug.stats.istats.host1_fatal++; 
     1526+       if (sync_cause & AR_INTR_SYNC_HOST1_PERR) 
     1527+               sc->debug.stats.istats.host1_perr++; 
     1528+       if (sync_cause & AR_INTR_SYNC_TRCV_FIFO_PERR) 
     1529+               sc->debug.stats.istats.trcv_fifo_perr++; 
     1530+       if (sync_cause & AR_INTR_SYNC_RADM_CPL_EP) 
     1531+               sc->debug.stats.istats.radm_cpl_ep++; 
     1532+       if (sync_cause & AR_INTR_SYNC_RADM_CPL_DLLP_ABORT) 
     1533+               sc->debug.stats.istats.radm_cpl_dllp_abort++; 
     1534+       if (sync_cause & AR_INTR_SYNC_RADM_CPL_TLP_ABORT) 
     1535+               sc->debug.stats.istats.radm_cpl_tlp_abort++; 
     1536+       if (sync_cause & AR_INTR_SYNC_RADM_CPL_ECRC_ERR) 
     1537+               sc->debug.stats.istats.radm_cpl_ecrc_err++; 
     1538+       if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT) 
     1539+               sc->debug.stats.istats.radm_cpl_timeout++; 
     1540+       if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT) 
     1541+               sc->debug.stats.istats.local_timeout++; 
     1542+       if (sync_cause & AR_INTR_SYNC_PM_ACCESS) 
     1543+               sc->debug.stats.istats.pm_access++; 
     1544+       if (sync_cause & AR_INTR_SYNC_MAC_AWAKE) 
     1545+               sc->debug.stats.istats.mac_awake++; 
     1546+       if (sync_cause & AR_INTR_SYNC_MAC_ASLEEP) 
     1547+               sc->debug.stats.istats.mac_asleep++; 
     1548+       if (sync_cause & AR_INTR_SYNC_MAC_SLEEP_ACCESS) 
     1549+               sc->debug.stats.istats.mac_sleep_access++; 
     1550+} 
     1551  
     1552 static ssize_t ath9k_debugfs_read_buf(struct file *file, char __user *user_buf, 
     1553                                      size_t count, loff_t *ppos) 
     1554@@ -1016,297 +1056,6 @@ static const struct file_operations fops 
     1555        .llseek = default_llseek, 
     1556 }; 
     1557  
     1558-static ssize_t read_file_spec_scan_ctl(struct file *file, char __user *user_buf, 
     1559-                                      size_t count, loff_t *ppos) 
     1560-{ 
     1561-       struct ath_softc *sc = file->private_data; 
     1562-       char *mode = ""; 
     1563-       unsigned int len; 
     1564- 
     1565-       switch (sc->spectral_mode) { 
     1566-       case SPECTRAL_DISABLED: 
     1567-               mode = "disable"; 
     1568-               break; 
     1569-       case SPECTRAL_BACKGROUND: 
     1570-               mode = "background"; 
     1571-               break; 
     1572-       case SPECTRAL_CHANSCAN: 
     1573-               mode = "chanscan"; 
     1574-               break; 
     1575-       case SPECTRAL_MANUAL: 
     1576-               mode = "manual"; 
     1577-               break; 
     1578-       } 
     1579-       len = strlen(mode); 
     1580-       return simple_read_from_buffer(user_buf, count, ppos, mode, len); 
     1581-} 
     1582- 
     1583-static ssize_t write_file_spec_scan_ctl(struct file *file, 
     1584-                                       const char __user *user_buf, 
     1585-                                       size_t count, loff_t *ppos) 
     1586-{ 
     1587-       struct ath_softc *sc = file->private_data; 
     1588-       struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     1589-       char buf[32]; 
     1590-       ssize_t len; 
     1591- 
     1592-       if (config_enabled(CPTCFG_ATH9K_TX99)) 
     1593-               return -EOPNOTSUPP; 
     1594- 
     1595-       len = min(count, sizeof(buf) - 1); 
     1596-       if (copy_from_user(buf, user_buf, len)) 
     1597-               return -EFAULT; 
     1598- 
     1599-       buf[len] = '\0'; 
     1600- 
     1601-       if (strncmp("trigger", buf, 7) == 0) { 
     1602-               ath9k_spectral_scan_trigger(sc->hw); 
     1603-       } else if (strncmp("background", buf, 9) == 0) { 
     1604-               ath9k_spectral_scan_config(sc->hw, SPECTRAL_BACKGROUND); 
     1605-               ath_dbg(common, CONFIG, "spectral scan: background mode enabled\n"); 
     1606-       } else if (strncmp("chanscan", buf, 8) == 0) { 
     1607-               ath9k_spectral_scan_config(sc->hw, SPECTRAL_CHANSCAN); 
     1608-               ath_dbg(common, CONFIG, "spectral scan: channel scan mode enabled\n"); 
     1609-       } else if (strncmp("manual", buf, 6) == 0) { 
     1610-               ath9k_spectral_scan_config(sc->hw, SPECTRAL_MANUAL); 
     1611-               ath_dbg(common, CONFIG, "spectral scan: manual mode enabled\n"); 
     1612-       } else if (strncmp("disable", buf, 7) == 0) { 
     1613-               ath9k_spectral_scan_config(sc->hw, SPECTRAL_DISABLED); 
     1614-               ath_dbg(common, CONFIG, "spectral scan: disabled\n"); 
     1615-       } else { 
     1616-               return -EINVAL; 
     1617-       } 
     1618- 
     1619-       return count; 
     1620-} 
     1621- 
     1622-static const struct file_operations fops_spec_scan_ctl = { 
     1623-       .read = read_file_spec_scan_ctl, 
     1624-       .write = write_file_spec_scan_ctl, 
     1625-       .open = simple_open, 
     1626-       .owner = THIS_MODULE, 
     1627-       .llseek = default_llseek, 
     1628-}; 
     1629- 
     1630-static ssize_t read_file_spectral_short_repeat(struct file *file, 
     1631-                                              char __user *user_buf, 
     1632-                                              size_t count, loff_t *ppos) 
     1633-{ 
     1634-       struct ath_softc *sc = file->private_data; 
     1635-       char buf[32]; 
     1636-       unsigned int len; 
     1637- 
     1638-       len = sprintf(buf, "%d\n", sc->spec_config.short_repeat); 
     1639-       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     1640-} 
     1641- 
     1642-static ssize_t write_file_spectral_short_repeat(struct file *file, 
     1643-                                               const char __user *user_buf, 
     1644-                                               size_t count, loff_t *ppos) 
     1645-{ 
     1646-       struct ath_softc *sc = file->private_data; 
     1647-       unsigned long val; 
     1648-       char buf[32]; 
     1649-       ssize_t len; 
     1650- 
     1651-       len = min(count, sizeof(buf) - 1); 
     1652-       if (copy_from_user(buf, user_buf, len)) 
     1653-               return -EFAULT; 
     1654- 
     1655-       buf[len] = '\0'; 
     1656-       if (kstrtoul(buf, 0, &val)) 
     1657-               return -EINVAL; 
     1658- 
     1659-       if (val < 0 || val > 1) 
     1660-               return -EINVAL; 
     1661- 
     1662-       sc->spec_config.short_repeat = val; 
     1663-       return count; 
     1664-} 
     1665- 
     1666-static const struct file_operations fops_spectral_short_repeat = { 
     1667-       .read = read_file_spectral_short_repeat, 
     1668-       .write = write_file_spectral_short_repeat, 
     1669-       .open = simple_open, 
     1670-       .owner = THIS_MODULE, 
     1671-       .llseek = default_llseek, 
     1672-}; 
     1673- 
     1674-static ssize_t read_file_spectral_count(struct file *file, 
     1675-                                       char __user *user_buf, 
     1676-                                       size_t count, loff_t *ppos) 
     1677-{ 
     1678-       struct ath_softc *sc = file->private_data; 
     1679-       char buf[32]; 
     1680-       unsigned int len; 
     1681- 
     1682-       len = sprintf(buf, "%d\n", sc->spec_config.count); 
     1683-       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     1684-} 
     1685- 
     1686-static ssize_t write_file_spectral_count(struct file *file, 
     1687-                                        const char __user *user_buf, 
     1688-                                        size_t count, loff_t *ppos) 
     1689-{ 
     1690-       struct ath_softc *sc = file->private_data; 
     1691-       unsigned long val; 
     1692-       char buf[32]; 
     1693-       ssize_t len; 
     1694- 
     1695-       len = min(count, sizeof(buf) - 1); 
     1696-       if (copy_from_user(buf, user_buf, len)) 
     1697-               return -EFAULT; 
     1698- 
     1699-       buf[len] = '\0'; 
     1700-       if (kstrtoul(buf, 0, &val)) 
     1701-               return -EINVAL; 
     1702- 
     1703-       if (val < 0 || val > 255) 
     1704-               return -EINVAL; 
     1705- 
     1706-       sc->spec_config.count = val; 
     1707-       return count; 
     1708-} 
     1709- 
     1710-static const struct file_operations fops_spectral_count = { 
     1711-       .read = read_file_spectral_count, 
     1712-       .write = write_file_spectral_count, 
     1713-       .open = simple_open, 
     1714-       .owner = THIS_MODULE, 
     1715-       .llseek = default_llseek, 
     1716-}; 
     1717- 
     1718-static ssize_t read_file_spectral_period(struct file *file, 
     1719-                                        char __user *user_buf, 
     1720-                                        size_t count, loff_t *ppos) 
     1721-{ 
     1722-       struct ath_softc *sc = file->private_data; 
     1723-       char buf[32]; 
     1724-       unsigned int len; 
     1725- 
     1726-       len = sprintf(buf, "%d\n", sc->spec_config.period); 
     1727-       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     1728-} 
     1729- 
     1730-static ssize_t write_file_spectral_period(struct file *file, 
     1731-                                         const char __user *user_buf, 
     1732-                                         size_t count, loff_t *ppos) 
     1733-{ 
     1734-       struct ath_softc *sc = file->private_data; 
     1735-       unsigned long val; 
     1736-       char buf[32]; 
     1737-       ssize_t len; 
     1738- 
     1739-       len = min(count, sizeof(buf) - 1); 
     1740-       if (copy_from_user(buf, user_buf, len)) 
     1741-               return -EFAULT; 
     1742- 
     1743-       buf[len] = '\0'; 
     1744-       if (kstrtoul(buf, 0, &val)) 
     1745-               return -EINVAL; 
     1746- 
     1747-       if (val < 0 || val > 255) 
     1748-               return -EINVAL; 
     1749- 
     1750-       sc->spec_config.period = val; 
     1751-       return count; 
     1752-} 
     1753- 
     1754-static const struct file_operations fops_spectral_period = { 
     1755-       .read = read_file_spectral_period, 
     1756-       .write = write_file_spectral_period, 
     1757-       .open = simple_open, 
     1758-       .owner = THIS_MODULE, 
     1759-       .llseek = default_llseek, 
     1760-}; 
     1761- 
     1762-static ssize_t read_file_spectral_fft_period(struct file *file, 
     1763-                                            char __user *user_buf, 
     1764-                                            size_t count, loff_t *ppos) 
     1765-{ 
     1766-       struct ath_softc *sc = file->private_data; 
     1767-       char buf[32]; 
     1768-       unsigned int len; 
     1769- 
     1770-       len = sprintf(buf, "%d\n", sc->spec_config.fft_period); 
     1771-       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     1772-} 
     1773- 
     1774-static ssize_t write_file_spectral_fft_period(struct file *file, 
     1775-                                             const char __user *user_buf, 
     1776-                                             size_t count, loff_t *ppos) 
     1777-{ 
     1778-       struct ath_softc *sc = file->private_data; 
     1779-       unsigned long val; 
     1780-       char buf[32]; 
     1781-       ssize_t len; 
     1782- 
     1783-       len = min(count, sizeof(buf) - 1); 
     1784-       if (copy_from_user(buf, user_buf, len)) 
     1785-               return -EFAULT; 
     1786- 
     1787-       buf[len] = '\0'; 
     1788-       if (kstrtoul(buf, 0, &val)) 
     1789-               return -EINVAL; 
     1790- 
     1791-       if (val < 0 || val > 15) 
     1792-               return -EINVAL; 
     1793- 
     1794-       sc->spec_config.fft_period = val; 
     1795-       return count; 
     1796-} 
     1797- 
     1798-static const struct file_operations fops_spectral_fft_period = { 
     1799-       .read = read_file_spectral_fft_period, 
     1800-       .write = write_file_spectral_fft_period, 
     1801-       .open = simple_open, 
     1802-       .owner = THIS_MODULE, 
     1803-       .llseek = default_llseek, 
     1804-}; 
     1805- 
     1806-static struct dentry *create_buf_file_handler(const char *filename, 
     1807-                                             struct dentry *parent, 
     1808-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) 
     1809-                                             umode_t mode, 
     1810-#else 
     1811-                                             int mode, 
     1812-#endif 
     1813-                                             struct rchan_buf *buf, 
     1814-                                             int *is_global) 
     1815-{ 
     1816-       struct dentry *buf_file; 
     1817- 
     1818-       buf_file = debugfs_create_file(filename, mode, parent, buf, 
     1819-                                      &relay_file_operations); 
     1820-       *is_global = 1; 
     1821-       return buf_file; 
     1822-} 
     1823- 
     1824-static int remove_buf_file_handler(struct dentry *dentry) 
     1825-{ 
     1826-       debugfs_remove(dentry); 
     1827- 
     1828-       return 0; 
     1829-} 
     1830- 
     1831-void ath_debug_send_fft_sample(struct ath_softc *sc, 
     1832-                              struct fft_sample_tlv *fft_sample_tlv) 
     1833-{ 
     1834-       int length; 
     1835-       if (!sc->rfs_chan_spec_scan) 
     1836-               return; 
     1837- 
     1838-       length = __be16_to_cpu(fft_sample_tlv->length) + 
     1839-                sizeof(*fft_sample_tlv); 
     1840-       relay_write(sc->rfs_chan_spec_scan, fft_sample_tlv, length); 
     1841-} 
     1842- 
     1843-static struct rchan_callbacks rfs_spec_scan_cb = { 
     1844-       .create_buf_file = create_buf_file_handler, 
     1845-       .remove_buf_file = remove_buf_file_handler, 
     1846-}; 
     1847- 
     1848- 
     1849 static ssize_t read_file_regidx(struct file *file, char __user *user_buf, 
     1850                                 size_t count, loff_t *ppos) 
     1851 { 
     1852@@ -1776,117 +1525,9 @@ void ath9k_get_et_stats(struct ieee80211 
     1853  
     1854 void ath9k_deinit_debug(struct ath_softc *sc) 
     1855 { 
     1856-       if (config_enabled(CPTCFG_ATH9K_DEBUGFS) && sc->rfs_chan_spec_scan) { 
     1857-               relay_close(sc->rfs_chan_spec_scan); 
     1858-               sc->rfs_chan_spec_scan = NULL; 
     1859-       } 
     1860+       ath9k_spectral_deinit_debug(sc); 
    10111861 } 
    10121862  
     
    11191969 { 
    11201970        struct ath_common *common = ath9k_hw_common(ah); 
    1121 @@ -1903,6 +1798,7 @@ int ath9k_init_debug(struct ath_hw *ah) 
     1971@@ -1903,6 +1544,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    11221972 #endif 
    11231973  
    11241974        ath9k_dfs_init_debug(sc); 
    11251975+       ath9k_tx99_init_debug(sc); 
     1976+       ath9k_spectral_init_debug(sc); 
    11261977  
    11271978        debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc, 
    11281979                            &fops_dma); 
    1129 @@ -1978,15 +1874,6 @@ int ath9k_init_debug(struct ath_hw *ah) 
     1980@@ -1949,23 +1592,6 @@ int ath9k_init_debug(struct ath_hw *ah) 
     1981                            &fops_base_eeprom); 
     1982        debugfs_create_file("modal_eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
     1983                            &fops_modal_eeprom); 
     1984-       sc->rfs_chan_spec_scan = relay_open("spectral_scan", 
     1985-                                           sc->debug.debugfs_phy, 
     1986-                                           1024, 256, &rfs_spec_scan_cb, 
     1987-                                           NULL); 
     1988-       debugfs_create_file("spectral_scan_ctl", S_IRUSR | S_IWUSR, 
     1989-                           sc->debug.debugfs_phy, sc, 
     1990-                           &fops_spec_scan_ctl); 
     1991-       debugfs_create_file("spectral_short_repeat", S_IRUSR | S_IWUSR, 
     1992-                           sc->debug.debugfs_phy, sc, 
     1993-                           &fops_spectral_short_repeat); 
     1994-       debugfs_create_file("spectral_count", S_IRUSR | S_IWUSR, 
     1995-                           sc->debug.debugfs_phy, sc, &fops_spectral_count); 
     1996-       debugfs_create_file("spectral_period", S_IRUSR | S_IWUSR, 
     1997-                           sc->debug.debugfs_phy, sc, &fops_spectral_period); 
     1998-       debugfs_create_file("spectral_fft_period", S_IRUSR | S_IWUSR, 
     1999-                           sc->debug.debugfs_phy, sc, 
     2000-                           &fops_spectral_fft_period); 
     2001        debugfs_create_u32("gpio_mask", S_IRUSR | S_IWUSR, 
     2002                           sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask); 
     2003        debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR, 
     2004@@ -1978,15 +1604,6 @@ int ath9k_init_debug(struct ath_hw *ah) 
    11302005        debugfs_create_file("btcoex", S_IRUSR, sc->debug.debugfs_phy, sc, 
    11312006                            &fops_btcoex); 
     
    11542029  
    11552030 #include "hw.h" 
    1156 @@ -438,23 +440,13 @@ static bool ath9k_hw_chip_test(struct at 
     2031@@ -83,48 +85,6 @@ static void ath9k_hw_ani_cache_ini_regs( 
     2032  
     2033 #ifdef CPTCFG_ATH9K_DEBUGFS 
     2034  
     2035-void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause) 
     2036-{ 
     2037-       struct ath_softc *sc = common->priv; 
     2038-       if (sync_cause) 
     2039-               sc->debug.stats.istats.sync_cause_all++; 
     2040-       if (sync_cause & AR_INTR_SYNC_RTC_IRQ) 
     2041-               sc->debug.stats.istats.sync_rtc_irq++; 
     2042-       if (sync_cause & AR_INTR_SYNC_MAC_IRQ) 
     2043-               sc->debug.stats.istats.sync_mac_irq++; 
     2044-       if (sync_cause & AR_INTR_SYNC_EEPROM_ILLEGAL_ACCESS) 
     2045-               sc->debug.stats.istats.eeprom_illegal_access++; 
     2046-       if (sync_cause & AR_INTR_SYNC_APB_TIMEOUT) 
     2047-               sc->debug.stats.istats.apb_timeout++; 
     2048-       if (sync_cause & AR_INTR_SYNC_PCI_MODE_CONFLICT) 
     2049-               sc->debug.stats.istats.pci_mode_conflict++; 
     2050-       if (sync_cause & AR_INTR_SYNC_HOST1_FATAL) 
     2051-               sc->debug.stats.istats.host1_fatal++; 
     2052-       if (sync_cause & AR_INTR_SYNC_HOST1_PERR) 
     2053-               sc->debug.stats.istats.host1_perr++; 
     2054-       if (sync_cause & AR_INTR_SYNC_TRCV_FIFO_PERR) 
     2055-               sc->debug.stats.istats.trcv_fifo_perr++; 
     2056-       if (sync_cause & AR_INTR_SYNC_RADM_CPL_EP) 
     2057-               sc->debug.stats.istats.radm_cpl_ep++; 
     2058-       if (sync_cause & AR_INTR_SYNC_RADM_CPL_DLLP_ABORT) 
     2059-               sc->debug.stats.istats.radm_cpl_dllp_abort++; 
     2060-       if (sync_cause & AR_INTR_SYNC_RADM_CPL_TLP_ABORT) 
     2061-               sc->debug.stats.istats.radm_cpl_tlp_abort++; 
     2062-       if (sync_cause & AR_INTR_SYNC_RADM_CPL_ECRC_ERR) 
     2063-               sc->debug.stats.istats.radm_cpl_ecrc_err++; 
     2064-       if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT) 
     2065-               sc->debug.stats.istats.radm_cpl_timeout++; 
     2066-       if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT) 
     2067-               sc->debug.stats.istats.local_timeout++; 
     2068-       if (sync_cause & AR_INTR_SYNC_PM_ACCESS) 
     2069-               sc->debug.stats.istats.pm_access++; 
     2070-       if (sync_cause & AR_INTR_SYNC_MAC_AWAKE) 
     2071-               sc->debug.stats.istats.mac_awake++; 
     2072-       if (sync_cause & AR_INTR_SYNC_MAC_ASLEEP) 
     2073-               sc->debug.stats.istats.mac_asleep++; 
     2074-       if (sync_cause & AR_INTR_SYNC_MAC_SLEEP_ACCESS) 
     2075-               sc->debug.stats.istats.mac_sleep_access++; 
     2076-} 
     2077 #endif 
     2078  
     2079  
     2080@@ -438,23 +398,13 @@ static bool ath9k_hw_chip_test(struct at 
    11572081  
    11582082 static void ath9k_hw_init_config(struct ath_hw *ah) 
     
    11782102        /* 
    11792103         * We need this for PCI devices only (Cardbus, PCI, miniPCI) 
    1180 @@ -486,7 +478,6 @@ static void ath9k_hw_init_defaults(struc 
     2104@@ -486,7 +436,6 @@ static void ath9k_hw_init_defaults(struc 
    11812105        ah->hw_version.magic = AR5416_MAGIC; 
    11822106        ah->hw_version.subvendorid = 0; 
     
    11862110                AR_STA_ID1_CRPT_MIC_ENABLE | 
    11872111                AR_STA_ID1_MCAST_KSRCH; 
    1188 @@ -549,11 +540,11 @@ static int ath9k_hw_post_init(struct ath 
     2112@@ -549,11 +498,11 @@ static int ath9k_hw_post_init(struct ath 
    11892113         * EEPROM needs to be initialized before we do this. 
    11902114         * This is required for regulatory compliance. 
     
    12012125        } 
    12022126  
    1203 @@ -1502,8 +1493,9 @@ static bool ath9k_hw_channel_change(stru 
     2127@@ -1282,6 +1231,42 @@ void ath9k_hw_get_delta_slope_vals(struc 
     2128        *coef_exponent = coef_exp - 16; 
     2129 } 
     2130  
     2131+/* AR9330 WAR: 
     2132+ * call external reset function to reset WMAC if: 
     2133+ * - doing a cold reset 
     2134+ * - we have pending frames in the TX queues. 
     2135+ */ 
     2136+static bool ath9k_hw_ar9330_reset_war(struct ath_hw *ah, int type) 
     2137+{ 
     2138+       int i, npend = 0; 
     2139+ 
     2140+       for (i = 0; i < AR_NUM_QCU; i++) { 
     2141+               npend = ath9k_hw_numtxpending(ah, i); 
     2142+               if (npend) 
     2143+                       break; 
     2144+       } 
     2145+ 
     2146+       if (ah->external_reset && 
     2147+           (npend || type == ATH9K_RESET_COLD)) { 
     2148+               int reset_err = 0; 
     2149+ 
     2150+               ath_dbg(ath9k_hw_common(ah), RESET, 
     2151+                       "reset MAC via external reset\n"); 
     2152+ 
     2153+               reset_err = ah->external_reset(); 
     2154+               if (reset_err) { 
     2155+                       ath_err(ath9k_hw_common(ah), 
     2156+                               "External reset failed, err=%d\n", 
     2157+                               reset_err); 
     2158+                       return false; 
     2159+               } 
     2160+ 
     2161+               REG_WRITE(ah, AR_RTC_RESET, 1); 
     2162+       } 
     2163+ 
     2164+       return true; 
     2165+} 
     2166+ 
     2167 static bool ath9k_hw_set_reset(struct ath_hw *ah, int type) 
     2168 { 
     2169        u32 rst_flags; 
     2170@@ -1332,38 +1317,8 @@ static bool ath9k_hw_set_reset(struct at 
     2171        } 
     2172  
     2173        if (AR_SREV_9330(ah)) { 
     2174-               int npend = 0; 
     2175-               int i; 
     2176- 
     2177-               /* AR9330 WAR: 
     2178-                * call external reset function to reset WMAC if: 
     2179-                * - doing a cold reset 
     2180-                * - we have pending frames in the TX queues 
     2181-                */ 
     2182- 
     2183-               for (i = 0; i < AR_NUM_QCU; i++) { 
     2184-                       npend = ath9k_hw_numtxpending(ah, i); 
     2185-                       if (npend) 
     2186-                               break; 
     2187-               } 
     2188- 
     2189-               if (ah->external_reset && 
     2190-                   (npend || type == ATH9K_RESET_COLD)) { 
     2191-                       int reset_err = 0; 
     2192- 
     2193-                       ath_dbg(ath9k_hw_common(ah), RESET, 
     2194-                               "reset MAC via external reset\n"); 
     2195- 
     2196-                       reset_err = ah->external_reset(); 
     2197-                       if (reset_err) { 
     2198-                               ath_err(ath9k_hw_common(ah), 
     2199-                                       "External reset failed, err=%d\n", 
     2200-                                       reset_err); 
     2201-                               return false; 
     2202-                       } 
     2203- 
     2204-                       REG_WRITE(ah, AR_RTC_RESET, 1); 
     2205-               } 
     2206+               if (!ath9k_hw_ar9330_reset_war(ah, type)) 
     2207+                       return false; 
     2208        } 
     2209  
     2210        if (ath9k_hw_mci_is_enabled(ah)) 
     2211@@ -1373,7 +1328,12 @@ static bool ath9k_hw_set_reset(struct at 
     2212  
     2213        REGWRITE_BUFFER_FLUSH(ah); 
     2214  
     2215-       udelay(50); 
     2216+       if (AR_SREV_9300_20_OR_LATER(ah)) 
     2217+               udelay(50); 
     2218+       else if (AR_SREV_9100(ah)) 
     2219+               udelay(10000); 
     2220+       else 
     2221+               udelay(100); 
     2222  
     2223        REG_WRITE(ah, AR_RTC_RC, 0); 
     2224        if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) { 
     2225@@ -1409,8 +1369,7 @@ static bool ath9k_hw_set_reset_power_on( 
     2226  
     2227        REGWRITE_BUFFER_FLUSH(ah); 
     2228  
     2229-       if (!AR_SREV_9300_20_OR_LATER(ah)) 
     2230-               udelay(2); 
     2231+       udelay(2); 
     2232  
     2233        if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah)) 
     2234                REG_WRITE(ah, AR_RC, 0); 
     2235@@ -1502,8 +1461,9 @@ static bool ath9k_hw_channel_change(stru 
    12042236        int r; 
    12052237  
     
    12132245  
    12142246        for (qnum = 0; qnum < AR_NUM_QCU; qnum++) { 
    1215 @@ -1815,7 +1807,7 @@ static int ath9k_hw_do_fastcc(struct ath 
     2247@@ -1815,7 +1775,7 @@ static int ath9k_hw_do_fastcc(struct ath 
    12162248         * If cross-band fcc is not supoprted, bail out if channelFlags differ. 
    12172249         */ 
     
    12222254  
    12232255        if (!ath9k_hw_check_alive(ah)) 
    1224 @@ -1856,10 +1848,12 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     2256@@ -1856,10 +1816,12 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    12252257                   struct ath9k_hw_cal_data *caldata, bool fastcc) 
    12262258 { 
     
    12352267        bool start_mci_reset = false; 
    12362268        bool save_fullsleep = ah->chip_fullsleep; 
    1237 @@ -1902,10 +1896,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     2269@@ -1902,10 +1864,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    12382270  
    12392271        macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B; 
     
    12502282        saveLedState = REG_READ(ah, AR_CFG_LED) & 
    12512283                (AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL | 
    1252 @@ -1938,8 +1932,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     2284@@ -1938,8 +1900,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    12532285        } 
    12542286  
     
    12622294        if (AR_SREV_9280_20_OR_LATER(ah)) 
    12632295                REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE); 
    1264 @@ -2261,9 +2256,6 @@ void ath9k_hw_beaconinit(struct ath_hw * 
     2296@@ -2261,9 +2224,6 @@ void ath9k_hw_beaconinit(struct ath_hw * 
    12652297        case NL80211_IFTYPE_ADHOC: 
    12662298                REG_SET_BIT(ah, AR_TXCFG, 
     
    12722304        case NL80211_IFTYPE_AP: 
    12732305                REG_WRITE(ah, AR_NEXT_TBTT_TIMER, next_beacon); 
    1274 @@ -2284,7 +2276,6 @@ void ath9k_hw_beaconinit(struct ath_hw * 
     2306@@ -2284,7 +2244,6 @@ void ath9k_hw_beaconinit(struct ath_hw * 
    12752307        REG_WRITE(ah, AR_BEACON_PERIOD, beacon_period); 
    12762308        REG_WRITE(ah, AR_DMA_BEACON_PERIOD, beacon_period); 
     
    12802312        REGWRITE_BUFFER_FLUSH(ah); 
    12812313  
    1282 @@ -2301,12 +2292,9 @@ void ath9k_hw_set_sta_beacon_timers(stru 
     2314@@ -2301,12 +2260,9 @@ void ath9k_hw_set_sta_beacon_timers(stru 
    12832315  
    12842316        ENABLE_REGWRITE_BUFFER(ah); 
     
    12962328        REGWRITE_BUFFER_FLUSH(ah); 
    12972329  
    1298 @@ -2334,9 +2322,8 @@ void ath9k_hw_set_sta_beacon_timers(stru 
     2330@@ -2334,9 +2290,8 @@ void ath9k_hw_set_sta_beacon_timers(stru 
    12992331  
    13002332        ENABLE_REGWRITE_BUFFER(ah); 
     
    13082340        REG_WRITE(ah, AR_SLEEP1, 
    13092341                  SM((CAB_TIMEOUT_VAL << 3), AR_SLEEP1_CAB_TIMEOUT) 
    1310 @@ -2350,8 +2337,8 @@ void ath9k_hw_set_sta_beacon_timers(stru 
     2342@@ -2350,8 +2305,8 @@ void ath9k_hw_set_sta_beacon_timers(stru 
    13112343        REG_WRITE(ah, AR_SLEEP2, 
    13122344                  SM(beacontimeout, AR_SLEEP2_BEACON_TIMEOUT)); 
     
    13192351        REGWRITE_BUFFER_FLUSH(ah); 
    13202352  
    1321 @@ -2987,20 +2974,6 @@ static const struct ath_gen_timer_config 
     2353@@ -2987,20 +2942,6 @@ static const struct ath_gen_timer_config 
    13222354  
    13232355 /* HW generic timer primitives */ 
     
    13402372 { 
    13412373        return REG_READ(ah, AR_TSF_L32); 
    1342 @@ -3016,6 +2989,10 @@ struct ath_gen_timer *ath_gen_timer_allo 
     2374@@ -3016,6 +2957,10 @@ struct ath_gen_timer *ath_gen_timer_allo 
    13432375        struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; 
    13442376        struct ath_gen_timer *timer; 
     
    13512383        if (timer == NULL) 
    13522384                return NULL; 
    1353 @@ -3033,23 +3010,13 @@ EXPORT_SYMBOL(ath_gen_timer_alloc); 
     2385@@ -3033,23 +2978,13 @@ EXPORT_SYMBOL(ath_gen_timer_alloc); 
    13542386  
    13552387 void ath9k_hw_gen_timer_start(struct ath_hw *ah, 
     
    13652397- 
    13662398-       set_bit(timer->index, &timer_table->timer_mask.timer_bits); 
    1367 - 
     2399+       u32 mask = 0; 
     2400  
    13682401-       tsf = ath9k_hw_gettsf32(ah); 
    1369 +       u32 mask = 0; 
    1370   
     2402- 
    13712403-       timer_next = tsf + trig_timeout; 
    13722404- 
     
    13782410        /* 
    13792411         * Program generic timer registers 
    1380 @@ -3075,10 +3042,19 @@ void ath9k_hw_gen_timer_start(struct ath 
     2412@@ -3075,10 +3010,19 @@ void ath9k_hw_gen_timer_start(struct ath 
    13812413                                       (1 << timer->index)); 
    13822414        } 
     
    14022434 EXPORT_SYMBOL(ath9k_hw_gen_timer_start); 
    14032435  
    1404 @@ -3086,11 +3062,6 @@ void ath9k_hw_gen_timer_stop(struct ath_ 
     2436@@ -3086,11 +3030,6 @@ void ath9k_hw_gen_timer_stop(struct ath_ 
    14052437 { 
    14062438        struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; 
     
    14142446        REG_CLR_BIT(ah, gen_tmr_configuration[timer->index].mode_addr, 
    14152447                        gen_tmr_configuration[timer->index].mode_mask); 
    1416 @@ -3110,7 +3081,12 @@ void ath9k_hw_gen_timer_stop(struct ath_ 
     2448@@ -3110,7 +3049,12 @@ void ath9k_hw_gen_timer_stop(struct ath_ 
    14172449                (SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_THRESH) | 
    14182450                SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_TRIG))); 
     
    14282460 EXPORT_SYMBOL(ath9k_hw_gen_timer_stop); 
    14292461  
    1430 @@ -3131,32 +3107,32 @@ void ath_gen_timer_isr(struct ath_hw *ah 
     2462@@ -3131,32 +3075,32 @@ void ath_gen_timer_isr(struct ath_hw *ah 
    14312463 { 
    14322464        struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; 
     
    15642596  
    15652597 struct ath_hw_antcomb_conf { 
    1566 @@ -785,7 +763,6 @@ struct ath_hw { 
     2598@@ -689,7 +667,8 @@ struct ath_hw_ops { 
     2599                          struct ath9k_channel *chan, 
     2600                          u8 rxchainmask, 
     2601                          bool longcal); 
     2602-       bool (*get_isr)(struct ath_hw *ah, enum ath9k_int *masked); 
     2603+       bool (*get_isr)(struct ath_hw *ah, enum ath9k_int *masked, 
     2604+                       u32 *sync_cause_p); 
     2605        void (*set_txdesc)(struct ath_hw *ah, void *ds, 
     2606                           struct ath_tx_info *i); 
     2607        int (*proc_txdesc)(struct ath_hw *ah, void *ds, 
     2608@@ -785,7 +764,6 @@ struct ath_hw { 
    15672609        u32 txurn_interrupt_mask; 
    15682610        atomic_t intr_ref_cnt; 
     
    15722614  
    15732615        /* Calibration */ 
    1574 @@ -864,6 +841,7 @@ struct ath_hw { 
     2616@@ -864,6 +842,7 @@ struct ath_hw { 
    15752617        u32 gpio_mask; 
    15762618        u32 gpio_val; 
     
    15802622        struct ar5416IniArray iniCommon; 
    15812623        struct ar5416IniArray iniBB_RfGain; 
    1582 @@ -920,7 +898,7 @@ struct ath_hw { 
     2624@@ -920,7 +899,7 @@ struct ath_hw { 
    15832625        /* Enterprise mode cap */ 
    15842626        u32 ent_mode; 
     
    15892631 #endif 
    15902632        bool is_clk_25mhz; 
    1591 @@ -1126,7 +1104,7 @@ ath9k_hw_get_btcoex_scheme(struct ath_hw 
     2633@@ -1016,13 +995,6 @@ bool ath9k_hw_check_alive(struct ath_hw  
     2634  
     2635 bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); 
     2636  
     2637-#ifdef CPTCFG_ATH9K_DEBUGFS 
     2638-void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause); 
     2639-#else 
     2640-static inline void ath9k_debug_sync_cause(struct ath_common *common, 
     2641-                                         u32 sync_cause) {} 
     2642-#endif 
     2643- 
     2644 /* Generic hw timer primitives */ 
     2645 struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, 
     2646                                          void (*trigger)(void *), 
     2647@@ -1126,7 +1098,7 @@ ath9k_hw_get_btcoex_scheme(struct ath_hw 
    15922648 #endif /* CPTCFG_ATH9K_BTCOEX_SUPPORT */ 
    15932649  
     
    16002656--- a/drivers/net/wireless/ath/ath9k/init.c 
    16012657+++ b/drivers/net/wireless/ath/ath9k/init.c 
    1602 @@ -554,7 +554,7 @@ static void ath9k_init_misc(struct ath_s 
     2658@@ -470,7 +470,6 @@ static int ath9k_init_queues(struct ath_ 
     2659  
     2660        sc->beacon.beaconq = ath9k_hw_beaconq_setup(sc->sc_ah); 
     2661        sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0); 
     2662- 
     2663        ath_cabq_update(sc); 
     2664  
     2665        sc->tx.uapsdq = ath_txq_setup(sc, ATH9K_TX_QUEUE_UAPSD, 0); 
     2666@@ -554,7 +553,7 @@ static void ath9k_init_misc(struct ath_s 
    16032667        sc->spec_config.fft_period = 0xF; 
    16042668 } 
     
    16092673        struct ath_hw *ah = sc->sc_ah; 
    16102674        struct ath9k_hw_capabilities *pCap = &ah->caps; 
    1611 @@ -609,6 +609,11 @@ static void ath9k_init_platform(struct a 
     2675@@ -609,6 +608,11 @@ static void ath9k_init_platform(struct a 
    16122676                ah->config.pcie_waen = 0x0040473b; 
    16132677                ath_info(common, "Enable WAR for ASPM D3/L1\n"); 
     
    16212685  
    16222686 static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob, 
    1623 @@ -656,6 +661,27 @@ static void ath9k_eeprom_release(struct  
     2687@@ -656,6 +660,27 @@ static void ath9k_eeprom_release(struct  
    16242688        release_firmware(sc->sc_ah->eeprom_blob); 
    16252689 } 
     
    16492713                            const struct ath_bus_ops *bus_ops) 
    16502714 { 
    1651 @@ -683,6 +709,7 @@ static int ath9k_init_softc(u16 devid, s 
     2715@@ -676,13 +701,13 @@ static int ath9k_init_softc(u16 devid, s 
     2716        ah->reg_ops.read = ath9k_ioread32; 
     2717        ah->reg_ops.write = ath9k_iowrite32; 
     2718        ah->reg_ops.rmw = ath9k_reg_rmw; 
     2719-       atomic_set(&ah->intr_ref_cnt, -1); 
     2720        sc->sc_ah = ah; 
     2721        pCap = &ah->caps; 
     2722  
    16522723        common = ath9k_hw_common(ah); 
    16532724        sc->dfs_detector = dfs_pattern_detector_init(common, NL80211_DFS_UNSET); 
     
    16572728        if (!pdata) { 
    16582729                ah->ah_flags |= AH_USE_EEPROM; 
    1659 @@ -708,7 +735,11 @@ static int ath9k_init_softc(u16 devid, s 
     2730@@ -708,7 +733,11 @@ static int ath9k_init_softc(u16 devid, s 
    16602731        /* 
    16612732         * Platform quirks. 
     
    16702741        /* 
    16712742         * Enable WLAN/BT RX Antenna diversity only when: 
    1672 @@ -722,7 +753,6 @@ static int ath9k_init_softc(u16 devid, s 
     2743@@ -722,7 +751,6 @@ static int ath9k_init_softc(u16 devid, s 
    16732744                common->bt_ant_diversity = 1; 
    16742745  
     
    16782749        spin_lock_init(&sc->sc_pm_lock); 
    16792750        mutex_init(&sc->mutex); 
    1680 @@ -730,6 +760,7 @@ static int ath9k_init_softc(u16 devid, s 
     2751@@ -730,6 +758,7 @@ static int ath9k_init_softc(u16 devid, s 
    16812752        tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet, 
    16822753                     (unsigned long)sc); 
     
    16862757        INIT_WORK(&sc->hw_check_work, ath_hw_check); 
    16872758        INIT_WORK(&sc->paprd_work, ath_paprd_calibrate); 
    1688 @@ -743,12 +774,6 @@ static int ath9k_init_softc(u16 devid, s 
     2759@@ -743,12 +772,6 @@ static int ath9k_init_softc(u16 devid, s 
    16892760        ath_read_cachesize(common, &csz); 
    16902761        common->cachelsz = csz << 2; /* convert to bytes */ 
     
    16992770        ret = ath9k_hw_init(ah); 
    17002771        if (ret) 
    1701 @@ -845,7 +870,8 @@ static const struct ieee80211_iface_limi 
     2772@@ -845,7 +868,8 @@ static const struct ieee80211_iface_limi 
    17022773 }; 
    17032774  
     
    17092780  
    17102781 static const struct ieee80211_iface_combination if_comb[] = { 
    1711 @@ -862,20 +888,11 @@ static const struct ieee80211_iface_comb 
     2782@@ -862,21 +886,12 @@ static const struct ieee80211_iface_comb 
    17122783                .max_interfaces = 1, 
    17132784                .num_different_channels = 1, 
     
    17292800-#endif 
    17302801- 
    1731  void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) 
     2802-void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) 
     2803+static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) 
    17322804 { 
    17332805        struct ath_hw *ah = sc->sc_ah; 
    1734 @@ -925,16 +942,6 @@ void ath9k_set_hw_capab(struct ath_softc 
     2806        struct ath_common *common = ath9k_hw_common(ah); 
     2807@@ -925,16 +940,6 @@ void ath9k_set_hw_capab(struct ath_softc 
    17352808        hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_5_10_MHZ; 
    17362809        hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 
     
    17492822        hw->max_rates = 4; 
    17502823        hw->channel_change_time = 5000; 
    1751 @@ -960,6 +967,7 @@ void ath9k_set_hw_capab(struct ath_softc 
     2824@@ -960,6 +965,7 @@ void ath9k_set_hw_capab(struct ath_softc 
    17522825                hw->wiphy->bands[IEEE80211_BAND_5GHZ] = 
    17532826                        &sc->sbands[IEEE80211_BAND_5GHZ]; 
     
    17572830  
    17582831        SET_IEEE80211_PERM_ADDR(hw, common->macaddr); 
    1759 @@ -1058,6 +1066,7 @@ static void ath9k_deinit_softc(struct at 
     2832@@ -1058,6 +1064,7 @@ static void ath9k_deinit_softc(struct at 
    17602833                if (ATH_TXQ_SETUP(sc, i)) 
    17612834                        ath_tx_cleanupq(sc, &sc->tx.txq[i]); 
     
    18512924  
    18522925        /* re-enable hardware interrupt */ 
    1853 @@ -579,7 +601,8 @@ irqreturn_t ath_isr(int irq, void *dev) 
     2926@@ -519,6 +541,7 @@ irqreturn_t ath_isr(int irq, void *dev) 
     2927        struct ath_hw *ah = sc->sc_ah; 
     2928        struct ath_common *common = ath9k_hw_common(ah); 
     2929        enum ath9k_int status; 
     2930+       u32 sync_cause; 
     2931        bool sched = false; 
     2932  
     2933        /* 
     2934@@ -545,7 +568,8 @@ irqreturn_t ath_isr(int irq, void *dev) 
     2935         * bits we haven't explicitly enabled so we mask the 
     2936         * value to insure we only process bits we requested. 
     2937         */ 
     2938-       ath9k_hw_getisr(ah, &status);   /* NB: clears ISR too */ 
     2939+       ath9k_hw_getisr(ah, &status, &sync_cause); /* NB: clears ISR too */ 
     2940+       ath9k_debug_sync_cause(sc, sync_cause); 
     2941        status &= ah->imask;    /* discard unasked-for bits */ 
     2942  
     2943        /* 
     2944@@ -579,7 +603,8 @@ irqreturn_t ath_isr(int irq, void *dev) 
    18542945  
    18552946                goto chip_reset; 
     
    18612952                if (atomic_read(&sc->wow_sleep_proc_intr) == 0) { 
    18622953                        ath_dbg(common, ANY, "during WoW we got a BMISS\n"); 
    1863 @@ -588,6 +611,8 @@ irqreturn_t ath_isr(int irq, void *dev) 
     2954@@ -588,6 +613,8 @@ irqreturn_t ath_isr(int irq, void *dev) 
    18642955                } 
    18652956        } 
     
    18702961                tasklet_schedule(&sc->bcon_tasklet); 
    18712962  
    1872 @@ -627,7 +652,7 @@ chip_reset: 
     2963@@ -627,7 +654,7 @@ chip_reset: 
    18732964 #undef SCHED_INTR 
    18742965 } 
     
    18792970        int r; 
    18802971  
    1881 @@ -735,6 +760,8 @@ static int ath9k_start(struct ieee80211_ 
     2972@@ -735,6 +762,8 @@ static int ath9k_start(struct ieee80211_ 
    18822973         */ 
    18832974        ath9k_cmn_init_crypto(sc->sc_ah); 
     
    18882979  
    18892980        mutex_unlock(&sc->mutex); 
    1890 @@ -1817,13 +1844,31 @@ static void ath9k_set_coverage_class(str 
     2981@@ -1635,13 +1664,8 @@ static void ath9k_bss_info_changed(struc 
     2982        } 
     2983  
     2984        if ((changed & BSS_CHANGED_BEACON_ENABLED) || 
     2985-           (changed & BSS_CHANGED_BEACON_INT)) { 
     2986-               if (ah->opmode == NL80211_IFTYPE_AP && 
     2987-                   bss_conf->enable_beacon) 
     2988-                       ath9k_set_tsfadjust(sc, vif); 
     2989-               if (ath9k_allow_beacon_config(sc, vif)) 
     2990-                       ath9k_beacon_config(sc, vif, changed); 
     2991-       } 
     2992+           (changed & BSS_CHANGED_BEACON_INT)) 
     2993+               ath9k_beacon_config(sc, vif, changed); 
     2994  
     2995        if (changed & BSS_CHANGED_ERP_SLOT) { 
     2996                if (bss_conf->use_short_slot) 
     2997@@ -1817,13 +1841,31 @@ static void ath9k_set_coverage_class(str 
    18912998        mutex_unlock(&sc->mutex); 
    18922999 } 
     
    19223029  
    19233030        mutex_lock(&sc->mutex); 
    1924 @@ -1841,25 +1886,9 @@ static void ath9k_flush(struct ieee80211 
     3031@@ -1841,25 +1883,9 @@ static void ath9k_flush(struct ieee80211 
    19253032                return; 
    19263033        } 
     
    19513058        if (drop) { 
    19523059                ath9k_ps_wakeup(sc); 
    1953 @@ -2021,333 +2050,6 @@ static int ath9k_get_antenna(struct ieee 
     3060@@ -2021,333 +2047,6 @@ static int ath9k_get_antenna(struct ieee 
    19543061        return 0; 
    19553062 } 
     
    22853392 { 
    22863393        struct ath_softc *sc = hw->priv; 
    2287 @@ -2373,134 +2075,6 @@ static void ath9k_channel_switch_beacon( 
     3394@@ -2373,134 +2072,6 @@ static void ath9k_channel_switch_beacon( 
    22883395        sc->csa_vif = vif; 
    22893396 } 
     
    24203527        .tx                 = ath9k_tx, 
    24213528        .start              = ath9k_start, 
    2422 @@ -2531,7 +2105,7 @@ struct ieee80211_ops ath9k_ops = { 
     3529@@ -2531,7 +2102,7 @@ struct ieee80211_ops ath9k_ops = { 
    24233530        .set_antenna        = ath9k_set_antenna, 
    24243531        .get_antenna        = ath9k_get_antenna, 
     
    31134220--- a/drivers/net/wireless/ath/ath9k/xmit.c 
    31144221+++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    3115 @@ -1276,6 +1276,10 @@ static void ath_tx_fill_desc(struct ath_ 
     4222@@ -174,14 +174,7 @@ static void ath_txq_skb_done(struct ath_ 
     4223 static struct ath_atx_tid * 
     4224 ath_get_skb_tid(struct ath_softc *sc, struct ath_node *an, struct sk_buff *skb) 
     4225 { 
     4226-       struct ieee80211_hdr *hdr; 
     4227-       u8 tidno = 0; 
     4228- 
     4229-       hdr = (struct ieee80211_hdr *) skb->data; 
     4230-       if (ieee80211_is_data_qos(hdr->frame_control)) 
     4231-               tidno = ieee80211_get_qos_ctl(hdr)[0]; 
     4232- 
     4233-       tidno &= IEEE80211_QOS_CTL_TID_MASK; 
     4234+       u8 tidno = skb->priority & IEEE80211_QOS_CTL_TID_MASK; 
     4235        return ATH_AN_2_TID(an, tidno); 
     4236 } 
     4237  
     4238@@ -1276,6 +1269,10 @@ static void ath_tx_fill_desc(struct ath_ 
    31164239                                if (!rts_thresh || (len > rts_thresh)) 
    31174240                                        rts = true; 
     
    31244247                } 
    31254248  
    3126 @@ -1786,6 +1790,9 @@ bool ath_drain_all_txq(struct ath_softc  
     4249@@ -1786,6 +1783,9 @@ bool ath_drain_all_txq(struct ath_softc  
    31274250                if (!ATH_TXQ_SETUP(sc, i)) 
    31284251                        continue; 
     
    31344257                        npend |= BIT(i); 
    31354258        } 
    3136 @@ -2749,6 +2756,8 @@ void ath_tx_node_cleanup(struct ath_soft 
     4259@@ -2749,6 +2749,8 @@ void ath_tx_node_cleanup(struct ath_soft 
    31374260        } 
    31384261 } 
     
    31434266                    struct ath_tx_control *txctl) 
    31444267 { 
    3145 @@ -2791,3 +2800,5 @@ int ath9k_tx99_send(struct ath_softc *sc 
     4268@@ -2791,3 +2793,5 @@ int ath9k_tx99_send(struct ath_softc *sc 
    31464269  
    31474270        return 0; 
     
    46465769  
    46475770        ieee80211_xmit(sdata, skb, chan->band); 
     5771@@ -2530,7 +2531,8 @@ struct sk_buff *ieee80211_beacon_get_tim 
     5772                         */ 
     5773                        skb = dev_alloc_skb(local->tx_headroom + 
     5774                                            beacon->head_len + 
     5775-                                           beacon->tail_len + 256); 
     5776+                                           beacon->tail_len + 256 + 
     5777+                                           local->hw.extra_beacon_tailroom); 
     5778                        if (!skb) 
     5779                                goto out; 
     5780  
     5781@@ -2562,7 +2564,8 @@ struct sk_buff *ieee80211_beacon_get_tim 
     5782                        ieee80211_update_csa(sdata, presp); 
     5783  
     5784  
     5785-               skb = dev_alloc_skb(local->tx_headroom + presp->head_len); 
     5786+               skb = dev_alloc_skb(local->tx_headroom + presp->head_len + 
     5787+                                   local->hw.extra_beacon_tailroom); 
     5788                if (!skb) 
     5789                        goto out; 
     5790                skb_reserve(skb, local->tx_headroom); 
     5791@@ -2589,7 +2592,8 @@ struct sk_buff *ieee80211_beacon_get_tim 
     5792                skb = dev_alloc_skb(local->tx_headroom + 
     5793                                    bcn->head_len + 
     5794                                    256 + /* TIM IE */ 
     5795-                                   bcn->tail_len); 
     5796+                                   bcn->tail_len + 
     5797+                                   local->hw.extra_beacon_tailroom); 
     5798                if (!skb) 
     5799                        goto out; 
     5800                skb_reserve(skb, local->tx_headroom); 
    46485801--- a/net/mac80211/util.c 
    46495802+++ b/net/mac80211/util.c 
     
    46665819                                           GFP_KERNEL); 
    46675820                } 
    4668 @@ -2459,14 +2462,9 @@ int ieee80211_send_action_csa(struct iee 
     5821@@ -2459,16 +2462,146 @@ int ieee80211_send_action_csa(struct iee 
    46695822                          WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT : 0x00; 
    46705823                put_unaligned_le16(WLAN_REASON_MESH_CHAN, pos); /* Reason Cd */ 
     
    46815834  
    46825835        ieee80211_tx_skb(sdata, skb); 
     5836        return 0; 
     5837 } 
     5838+ 
     5839+static bool 
     5840+ieee80211_extend_noa_desc(struct ieee80211_noa_data *data, u32 tsf, int i) 
     5841+{ 
     5842+       s32 end = data->desc[i].start + data->desc[i].duration - (tsf + 1); 
     5843+       int skip; 
     5844+ 
     5845+       if (end > 0) 
     5846+               return false; 
     5847+ 
     5848+       /* End time is in the past, check for repetitions */ 
     5849+       skip = DIV_ROUND_UP(-end, data->desc[i].interval); 
     5850+       if (data->count[i] < 255) { 
     5851+               if (data->count[i] <= skip) { 
     5852+                       data->count[i] = 0; 
     5853+                       return false; 
     5854+               } 
     5855+ 
     5856+               data->count[i] -= skip; 
     5857+       } 
     5858+ 
     5859+       data->desc[i].start += skip * data->desc[i].interval; 
     5860+ 
     5861+       return true; 
     5862+} 
     5863+ 
     5864+static bool 
     5865+ieee80211_extend_absent_time(struct ieee80211_noa_data *data, u32 tsf, 
     5866+                            s32 *offset) 
     5867+{ 
     5868+       bool ret = false; 
     5869+       int i; 
     5870+ 
     5871+       for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) { 
     5872+               s32 cur; 
     5873+ 
     5874+               if (!data->count[i]) 
     5875+                       continue; 
     5876+ 
     5877+               if (ieee80211_extend_noa_desc(data, tsf + *offset, i)) 
     5878+                       ret = true; 
     5879+ 
     5880+               cur = data->desc[i].start - tsf; 
     5881+               if (cur > *offset) 
     5882+                       continue; 
     5883+ 
     5884+               cur = data->desc[i].start + data->desc[i].duration - tsf; 
     5885+               if (cur > *offset) 
     5886+                       *offset = cur; 
     5887+       } 
     5888+ 
     5889+       return ret; 
     5890+} 
     5891+ 
     5892+static u32 
     5893+ieee80211_get_noa_absent_time(struct ieee80211_noa_data *data, u32 tsf) 
     5894+{ 
     5895+       s32 offset = 0; 
     5896+       int tries = 0; 
     5897+ 
     5898+       ieee80211_extend_absent_time(data, tsf, &offset); 
     5899+       do { 
     5900+               if (!ieee80211_extend_absent_time(data, tsf, &offset)) 
     5901+                       break; 
     5902+ 
     5903+               tries++; 
     5904+       } while (tries < 5); 
     5905+ 
     5906+       return offset; 
     5907+} 
     5908+ 
     5909+void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf) 
     5910+{ 
     5911+       u32 next_offset = BIT(31) - 1; 
     5912+       int i; 
     5913+ 
     5914+       data->absent = 0; 
     5915+       data->has_next_tsf = false; 
     5916+       for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) { 
     5917+               s32 start; 
     5918+ 
     5919+               if (!data->count[i]) 
     5920+                       continue; 
     5921+ 
     5922+               ieee80211_extend_noa_desc(data, tsf, i); 
     5923+               start = data->desc[i].start - tsf; 
     5924+               if (start <= 0) 
     5925+                       data->absent |= BIT(i); 
     5926+ 
     5927+               if (next_offset > start) 
     5928+                       next_offset = start; 
     5929+ 
     5930+               data->has_next_tsf = true; 
     5931+       } 
     5932+ 
     5933+       if (data->absent) 
     5934+               next_offset = ieee80211_get_noa_absent_time(data, tsf); 
     5935+ 
     5936+       data->next_tsf = tsf + next_offset; 
     5937+} 
     5938+EXPORT_SYMBOL(ieee80211_update_p2p_noa); 
     5939+ 
     5940+int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr, 
     5941+                           struct ieee80211_noa_data *data, u32 tsf) 
     5942+{ 
     5943+       int ret = 0; 
     5944+       int i; 
     5945+ 
     5946+       memset(data, 0, sizeof(*data)); 
     5947+ 
     5948+       for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) { 
     5949+               const struct ieee80211_p2p_noa_desc *desc = &attr->desc[i]; 
     5950+ 
     5951+               if (!desc->count || !desc->duration) 
     5952+                       continue; 
     5953+ 
     5954+               data->count[i] = desc->count; 
     5955+               data->desc[i].start = le32_to_cpu(desc->start_time); 
     5956+               data->desc[i].duration = le32_to_cpu(desc->duration); 
     5957+               data->desc[i].interval = le32_to_cpu(desc->interval); 
     5958+ 
     5959+               if (data->count[i] > 1 && 
     5960+                   data->desc[i].interval < data->desc[i].duration) 
     5961+                       continue; 
     5962+ 
     5963+               ieee80211_extend_noa_desc(data, tsf, i); 
     5964+               ret++; 
     5965+       } 
     5966+ 
     5967+       if (ret) 
     5968+               ieee80211_update_p2p_noa(data, tsf); 
     5969+ 
     5970+       return ret; 
     5971+} 
     5972+EXPORT_SYMBOL(ieee80211_parse_p2p_noa); 
    46835973--- a/net/wireless/chan.c 
    46845974+++ b/net/wireless/chan.c 
     
    61047394--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h 
    61057395+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h 
     7396@@ -270,7 +270,7 @@ 
     7397 #define AR_PHY_AGC              (AR_AGC_BASE + 0x14) 
     7398 #define AR_PHY_EXT_ATTEN_CTL_0  (AR_AGC_BASE + 0x18) 
     7399 #define AR_PHY_CCA_0            (AR_AGC_BASE + 0x1c) 
     7400-#define AR_PHY_EXT_CCA0         (AR_AGC_BASE + 0x20) 
     7401+#define AR_PHY_CCA_CTRL_0       (AR_AGC_BASE + 0x20) 
     7402 #define AR_PHY_RESTART          (AR_AGC_BASE + 0x24) 
     7403  
     7404 /* 
    61067405@@ -341,14 +341,15 @@ 
    61077406 #define AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ     -95 
     
    61227421 #define AR_PHY_CCA_NOM_VAL_9330_2GHZ          -118 
    61237422  
    6124 @@ -656,13 +657,24 @@ 
     7423@@ -397,6 +398,8 @@ 
     7424 #define AR9280_PHY_CCA_THRESH62_S   12 
     7425 #define AR_PHY_EXT_CCA0_THRESH62    0x000000FF 
     7426 #define AR_PHY_EXT_CCA0_THRESH62_S  0 
     7427+#define AR_PHY_EXT_CCA0_THRESH62_1    0x000001FF 
     7428+#define AR_PHY_EXT_CCA0_THRESH62_1_S  0 
     7429 #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK          0x0000003F 
     7430 #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S        0 
     7431 #define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME           0x00001FC0 
     7432@@ -656,13 +659,24 @@ 
    61257433 #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT   ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x00000001 : 0x00000002) 
    61267434 #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0 : 1) 
     
    64057713--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c 
    64067714+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c 
    6407 @@ -3965,7 +3965,7 @@ static void ar9003_hw_apply_tuning_caps( 
     7715@@ -131,6 +131,7 @@ static const struct ar9300_eeprom ar9300 
     7716                .thresh62 = 28, 
     7717                .papdRateMaskHt20 = LE32(0x0cf0e0e0), 
     7718                .papdRateMaskHt40 = LE32(0x6cf0e0e0), 
     7719+               .switchcomspdt = 0, 
     7720                .xlna_bias_strength = 0, 
     7721                .futureModal = { 
     7722                        0, 0, 0, 0, 0, 0, 0, 
     7723@@ -138,7 +139,7 @@ static const struct ar9300_eeprom ar9300 
     7724         }, 
     7725        .base_ext1 = { 
     7726                .ant_div_control = 0, 
     7727-               .future = {0, 0, 0}, 
     7728+               .future = {0, 0}, 
     7729                .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0} 
     7730        }, 
     7731        .calFreqPier2G = { 
     7732@@ -333,6 +334,7 @@ static const struct ar9300_eeprom ar9300 
     7733                .thresh62 = 28, 
     7734                .papdRateMaskHt20 = LE32(0x0c80c080), 
     7735                .papdRateMaskHt40 = LE32(0x0080c080), 
     7736+               .switchcomspdt = 0, 
     7737                .xlna_bias_strength = 0, 
     7738                .futureModal = { 
     7739                        0, 0, 0, 0, 0, 0, 0, 
     7740@@ -707,6 +709,7 @@ static const struct ar9300_eeprom ar9300 
     7741                .thresh62 = 28, 
     7742                .papdRateMaskHt20 = LE32(0x0c80c080), 
     7743                .papdRateMaskHt40 = LE32(0x0080c080), 
     7744+               .switchcomspdt = 0, 
     7745                .xlna_bias_strength = 0, 
     7746                .futureModal = { 
     7747                        0, 0, 0, 0, 0, 0, 0, 
     7748@@ -714,7 +717,7 @@ static const struct ar9300_eeprom ar9300 
     7749         }, 
     7750         .base_ext1 = { 
     7751                .ant_div_control = 0, 
     7752-               .future = {0, 0, 0}, 
     7753+               .future = {0, 0}, 
     7754                .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0} 
     7755         }, 
     7756        .calFreqPier2G = { 
     7757@@ -909,6 +912,7 @@ static const struct ar9300_eeprom ar9300 
     7758                .thresh62 = 28, 
     7759                .papdRateMaskHt20 = LE32(0x0cf0e0e0), 
     7760                .papdRateMaskHt40 = LE32(0x6cf0e0e0), 
     7761+               .switchcomspdt = 0, 
     7762                .xlna_bias_strength = 0, 
     7763                .futureModal = { 
     7764                        0, 0, 0, 0, 0, 0, 0, 
     7765@@ -1284,6 +1288,7 @@ static const struct ar9300_eeprom ar9300 
     7766                .thresh62 = 28, 
     7767                .papdRateMaskHt20 = LE32(0x0c80c080), 
     7768                .papdRateMaskHt40 = LE32(0x0080c080), 
     7769+               .switchcomspdt = 0, 
     7770                .xlna_bias_strength = 0, 
     7771                .futureModal = { 
     7772                        0, 0, 0, 0, 0, 0, 0, 
     7773@@ -1291,7 +1296,7 @@ static const struct ar9300_eeprom ar9300 
     7774        }, 
     7775        .base_ext1 = { 
     7776                .ant_div_control = 0, 
     7777-               .future = {0, 0, 0}, 
     7778+               .future = {0, 0}, 
     7779                .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0} 
     7780        }, 
     7781        .calFreqPier2G = { 
     7782@@ -1486,6 +1491,7 @@ static const struct ar9300_eeprom ar9300 
     7783                .thresh62 = 28, 
     7784                .papdRateMaskHt20 = LE32(0x0cf0e0e0), 
     7785                .papdRateMaskHt40 = LE32(0x6cf0e0e0), 
     7786+               .switchcomspdt = 0, 
     7787                .xlna_bias_strength = 0, 
     7788                .futureModal = { 
     7789                        0, 0, 0, 0, 0, 0, 0, 
     7790@@ -1861,6 +1867,7 @@ static const struct ar9300_eeprom ar9300 
     7791                .thresh62 = 28, 
     7792                .papdRateMaskHt20 = LE32(0x0c80c080), 
     7793                .papdRateMaskHt40 = LE32(0x0080c080), 
     7794+               .switchcomspdt = 0, 
     7795                .xlna_bias_strength = 0, 
     7796                .futureModal = { 
     7797                        0, 0, 0, 0, 0, 0, 0, 
     7798@@ -1868,7 +1875,7 @@ static const struct ar9300_eeprom ar9300 
     7799        }, 
     7800        .base_ext1 = { 
     7801                .ant_div_control = 0, 
     7802-               .future = {0, 0, 0}, 
     7803+               .future = {0, 0}, 
     7804                .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0} 
     7805        }, 
     7806        .calFreqPier2G = { 
     7807@@ -2063,6 +2070,7 @@ static const struct ar9300_eeprom ar9300 
     7808                .thresh62 = 28, 
     7809                .papdRateMaskHt20 = LE32(0x0cf0e0e0), 
     7810                .papdRateMaskHt40 = LE32(0x6cf0e0e0), 
     7811+               .switchcomspdt = 0, 
     7812                .xlna_bias_strength = 0, 
     7813                .futureModal = { 
     7814                        0, 0, 0, 0, 0, 0, 0, 
     7815@@ -2437,6 +2445,7 @@ static const struct ar9300_eeprom ar9300 
     7816                .thresh62 = 28, 
     7817                .papdRateMaskHt20 = LE32(0x0c80C080), 
     7818                .papdRateMaskHt40 = LE32(0x0080C080), 
     7819+               .switchcomspdt = 0, 
     7820                .xlna_bias_strength = 0, 
     7821                .futureModal = { 
     7822                        0, 0, 0, 0, 0, 0, 0, 
     7823@@ -2444,7 +2453,7 @@ static const struct ar9300_eeprom ar9300 
     7824         }, 
     7825         .base_ext1 = { 
     7826                .ant_div_control = 0, 
     7827-               .future = {0, 0, 0}, 
     7828+               .future = {0, 0}, 
     7829                .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0} 
     7830         }, 
     7831        .calFreqPier2G = { 
     7832@@ -2639,6 +2648,7 @@ static const struct ar9300_eeprom ar9300 
     7833                .thresh62 = 28, 
     7834                .papdRateMaskHt20 = LE32(0x0cf0e0e0), 
     7835                .papdRateMaskHt40 = LE32(0x6cf0e0e0), 
     7836+               .switchcomspdt = 0, 
     7837                .xlna_bias_strength = 0, 
     7838                .futureModal = { 
     7839                        0, 0, 0, 0, 0, 0, 0, 
     7840@@ -3965,7 +3975,7 @@ static void ar9003_hw_apply_tuning_caps( 
    64087841        struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; 
    64097842        u8 tuning_caps_param = eep->baseEepHeader.params_for_tuning_caps[0]; 
     
    64147847  
    64157848        if (eep->baseEepHeader.featureEnable & 0x40) { 
    6416 @@ -3984,18 +3984,20 @@ static void ar9003_hw_quick_drop_apply(s 
     7849@@ -3984,18 +3994,20 @@ static void ar9003_hw_quick_drop_apply(s 
    64177850        int quick_drop; 
    64187851        s32 t[3], f[3] = {5180, 5500, 5785}; 
     
    64447877  
    64457878 static void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, bool is2ghz) 
    6446 @@ -4035,7 +4037,7 @@ static void ar9003_hw_xlna_bias_strength 
     7879@@ -4035,7 +4047,7 @@ static void ar9003_hw_xlna_bias_strength 
    64477880        struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; 
    64487881        u8 bias; 
     
    64537886  
    64547887        if (!AR_SREV_9300(ah)) 
    6455 @@ -4120,7 +4122,7 @@ static void ath9k_hw_ar9300_set_board_va 
     7888@@ -4109,6 +4121,37 @@ static void ar9003_hw_thermo_cal_apply(s 
     7889        } 
     7890 } 
     7891  
     7892+static void ar9003_hw_apply_minccapwr_thresh(struct ath_hw *ah, 
     7893+                                            bool is2ghz) 
     7894+{ 
     7895+       struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; 
     7896+       const u_int32_t cca_ctrl[AR9300_MAX_CHAINS] = { 
     7897+               AR_PHY_CCA_CTRL_0, 
     7898+               AR_PHY_CCA_CTRL_1, 
     7899+               AR_PHY_CCA_CTRL_2, 
     7900+       }; 
     7901+       int chain; 
     7902+       u32 val; 
     7903+ 
     7904+       if (is2ghz) { 
     7905+               if (!(eep->base_ext1.misc_enable & BIT(2))) 
     7906+                       return; 
     7907+       } else { 
     7908+               if (!(eep->base_ext1.misc_enable & BIT(3))) 
     7909+                       return; 
     7910+       } 
     7911+ 
     7912+       for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { 
     7913+               if (!(ah->caps.tx_chainmask & BIT(chain))) 
     7914+                       continue; 
     7915+ 
     7916+               val = ar9003_modal_header(ah, is2ghz)->noiseFloorThreshCh[chain]; 
     7917+               REG_RMW_FIELD(ah, cca_ctrl[chain], 
     7918+                             AR_PHY_EXT_CCA0_THRESH62_1, val); 
     7919+       } 
     7920+ 
     7921+} 
     7922+ 
     7923 static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah, 
     7924                                             struct ath9k_channel *chan) 
     7925 { 
     7926@@ -4120,9 +4163,10 @@ static void ath9k_hw_ar9300_set_board_va 
    64567927        ar9003_hw_xlna_bias_strength_apply(ah, is2ghz); 
    64577928        ar9003_hw_atten_apply(ah, chan); 
     
    64617932                ar9003_hw_internal_regulator_apply(ah); 
    64627933        ar9003_hw_apply_tuning_caps(ah); 
     7934+       ar9003_hw_apply_minccapwr_thresh(ah, chan); 
    64637935        ar9003_hw_txend_to_xpa_off_apply(ah, is2ghz); 
     7936        ar9003_hw_thermometer_apply(ah); 
     7937        ar9003_hw_thermo_cal_apply(ah); 
    64647938--- a/net/mac80211/ieee80211_i.h 
    64657939+++ b/net/mac80211/ieee80211_i.h 
     
    1185813332--- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c 
    1185913333+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c 
    11860 @@ -76,9 +76,16 @@ static bool ar9002_hw_get_isr(struct ath 
     13334@@ -29,7 +29,8 @@ static void ar9002_hw_set_desc_link(void 
     13335        ((struct ath_desc*) ds)->ds_link = ds_link; 
     13336 } 
     13337  
     13338-static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) 
     13339+static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked, 
     13340+                             u32 *sync_cause_p) 
     13341 { 
     13342        u32 isr = 0; 
     13343        u32 mask2 = 0; 
     13344@@ -76,9 +77,16 @@ static bool ar9002_hw_get_isr(struct ath 
    1186113345                                mask2 |= ATH9K_INT_CST; 
    1186213346                        if (isr2 & AR_ISR_S2_TSFOOR) 
     
    1187613360                        *masked = 0; 
    1187713361                        return false; 
    11878 @@ -97,11 +104,23 @@ static bool ar9002_hw_get_isr(struct ath 
     13362@@ -97,11 +105,23 @@ static bool ar9002_hw_get_isr(struct ath 
    1187913363  
    1188013364                        *masked |= ATH9K_INT_TX; 
     
    1190313387                        ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL); 
    1190413388                } 
    11905 @@ -114,13 +133,23 @@ static bool ar9002_hw_get_isr(struct ath 
     13389@@ -114,13 +134,23 @@ static bool ar9002_hw_get_isr(struct ath 
    1190613390                *masked |= mask2; 
    1190713391        } 
     
    1192813412                                MS(s5_s, AR_ISR_S5_GENTIMER_TRIG); 
    1192913413  
    11930 @@ -133,6 +162,11 @@ static bool ar9002_hw_get_isr(struct ath 
     13414@@ -133,10 +163,16 @@ static bool ar9002_hw_get_isr(struct ath 
    1193113415                if ((s5_s & AR_ISR_S5_TIM_TIMER) && 
    1193213416                    !(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) 
     
    1194013424  
    1194113425        if (sync_cause) { 
     13426-               ath9k_debug_sync_cause(common, sync_cause); 
     13427+               if (sync_cause_p) 
     13428+                       *sync_cause_p = sync_cause; 
     13429                fatal_int = 
     13430                        (sync_cause & 
     13431                         (AR_INTR_SYNC_HOST1_FATAL | AR_INTR_SYNC_HOST1_PERR)) 
    1194213432--- a/drivers/net/wireless/ath/ath9k/antenna.c 
    1194313433+++ b/drivers/net/wireless/ath/ath9k/antenna.c 
     
    1199013480--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    1199113481+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    11992 @@ -476,12 +476,12 @@ int ath9k_hw_process_rxdesc_edma(struct  
     13482@@ -175,7 +175,8 @@ static void ar9003_hw_set_desc_link(void 
     13483        ads->ctl10 |= ar9003_calc_ptr_chksum(ads); 
     13484 } 
     13485  
     13486-static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) 
     13487+static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked, 
     13488+                             u32 *sync_cause_p) 
     13489 { 
     13490        u32 isr = 0; 
     13491        u32 mask2 = 0; 
     13492@@ -310,7 +311,8 @@ static bool ar9003_hw_get_isr(struct ath 
     13493                ar9003_mci_get_isr(ah, masked); 
     13494  
     13495        if (sync_cause) { 
     13496-               ath9k_debug_sync_cause(common, sync_cause); 
     13497+               if (sync_cause_p) 
     13498+                       *sync_cause_p = sync_cause; 
     13499                fatal_int = 
     13500                        (sync_cause & 
     13501                         (AR_INTR_SYNC_HOST1_FATAL | AR_INTR_SYNC_HOST1_PERR)) 
     13502@@ -476,12 +478,12 @@ int ath9k_hw_process_rxdesc_edma(struct  
    1199313503  
    1199413504        /* XXX: Keycache */ 
     
    1201113521--- a/drivers/net/wireless/ath/ath9k/beacon.c 
    1201213522+++ b/drivers/net/wireless/ath/ath9k/beacon.c 
    12013 @@ -431,6 +431,33 @@ static void ath9k_beacon_init(struct ath 
     13523@@ -274,18 +274,19 @@ static int ath9k_beacon_choose_slot(stru 
     13524        return slot; 
     13525 } 
     13526  
     13527-void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif) 
     13528+static void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif) 
     13529 { 
     13530        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     13531        struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; 
     13532        struct ath_vif *avp = (void *)vif->drv_priv; 
     13533-       u64 tsfadjust; 
     13534+       u32 tsfadjust; 
     13535  
     13536        if (avp->av_bslot == 0) 
     13537                return; 
     13538  
     13539-       tsfadjust = cur_conf->beacon_interval * avp->av_bslot / ATH_BCBUF; 
     13540-       avp->tsf_adjust = cpu_to_le64(TU_TO_USEC(tsfadjust)); 
     13541+       tsfadjust = cur_conf->beacon_interval * avp->av_bslot; 
     13542+       tsfadjust = TU_TO_USEC(tsfadjust) / ATH_BCBUF; 
     13543+       avp->tsf_adjust = cpu_to_le64(tsfadjust); 
     13544  
     13545        ath_dbg(common, CONFIG, "tsfadjust is: %llu for bslot: %d\n", 
     13546                (unsigned long long)tsfadjust, avp->av_bslot); 
     13547@@ -431,6 +432,33 @@ static void ath9k_beacon_init(struct ath 
    1201413548        ath9k_hw_enable_interrupts(ah); 
    1201513549 } 
     
    1204513579  * For multi-bss ap support beacons are either staggered evenly over N slots or 
    1204613580  * burst together.  For the former arrange for the SWBA to be delivered for each 
    12047 @@ -446,7 +473,8 @@ static void ath9k_beacon_config_ap(struc 
     13581@@ -446,7 +474,8 @@ static void ath9k_beacon_config_ap(struc 
    1204813582        /* NB: the beacon interval is kept internally in TU's */ 
    1204913583        intval = TU_TO_USEC(conf->beacon_interval); 
     
    1205513589        if (conf->enable_beacon) 
    1205613590                ah->imask |= ATH9K_INT_SWBA; 
    12057 @@ -458,7 +486,7 @@ static void ath9k_beacon_config_ap(struc 
     13591@@ -458,7 +487,7 @@ static void ath9k_beacon_config_ap(struc 
    1205813592                (conf->enable_beacon) ? "Enable" : "Disable", 
    1205913593                nexttbtt, intval, conf->beacon_interval); 
     
    1206413598  
    1206513599 /* 
    12066 @@ -475,11 +503,9 @@ static void ath9k_beacon_config_sta(stru 
     13600@@ -475,11 +504,9 @@ static void ath9k_beacon_config_sta(stru 
    1206713601        struct ath_hw *ah = sc->sc_ah; 
    1206813602        struct ath_common *common = ath9k_hw_common(ah); 
     
    1207813612        /* No need to configure beacon if we are not associated */ 
    1207913613        if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) { 
    12080 @@ -492,53 +518,25 @@ static void ath9k_beacon_config_sta(stru 
     13614@@ -492,53 +519,25 @@ static void ath9k_beacon_config_sta(stru 
    1208113615        intval = conf->beacon_interval; 
    1208213616  
     
    1210313637        tsf = ath9k_hw_gettsf64(ah); 
    1210413638-       tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE; 
    12105 - 
     13639+       nexttbtt = ath9k_get_next_tbtt(sc, tsf, intval); 
     13640  
    1210613641-       num_beacons = tsftu / intval + 1; 
    1210713642-       offset = tsftu % intval; 
     
    1212413659-       if (cfpcount < 0) 
    1212513660-               cfpcount += cfpperiod; 
    12126 +       nexttbtt = ath9k_get_next_tbtt(sc, tsf, intval); 
    12127   
     13661- 
    1212813662-       bs.bs_intval = intval; 
    1212913663+       bs.bs_intval = TU_TO_USEC(intval); 
     
    1214113675        /* 
    1214213676         * Calculate the number of consecutive beacons to miss* before taking 
    12143 @@ -566,18 +564,16 @@ static void ath9k_beacon_config_sta(stru 
     13677@@ -566,18 +565,16 @@ static void ath9k_beacon_config_sta(stru 
    1214413678         * XXX fixed at 100ms 
    1214513679         */ 
     
    1216413698        /* Set the computed STA beacon timers */ 
    1216513699  
    12166 @@ -600,25 +596,11 @@ static void ath9k_beacon_config_adhoc(st 
     13700@@ -600,25 +597,11 @@ static void ath9k_beacon_config_adhoc(st 
    1216713701  
    1216813702        intval = TU_TO_USEC(conf->beacon_interval); 
     
    1219413728        if (conf->enable_beacon) 
    1219513729                ah->imask |= ATH9K_INT_SWBA; 
     13730@@ -640,7 +623,8 @@ static void ath9k_beacon_config_adhoc(st 
     13731                set_bit(SC_OP_BEACONS, &sc->sc_flags); 
     13732 } 
     13733  
     13734-bool ath9k_allow_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif) 
     13735+static bool ath9k_allow_beacon_config(struct ath_softc *sc, 
     13736+                                     struct ieee80211_vif *vif) 
     13737 { 
     13738        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     13739        struct ath_vif *avp = (void *)vif->drv_priv; 
     13740@@ -711,12 +695,17 @@ void ath9k_beacon_config(struct ath_soft 
     13741        unsigned long flags; 
     13742        bool skip_beacon = false; 
     13743  
     13744+       if (vif->type == NL80211_IFTYPE_AP) 
     13745+               ath9k_set_tsfadjust(sc, vif); 
     13746+ 
     13747+       if (!ath9k_allow_beacon_config(sc, vif)) 
     13748+               return; 
     13749+ 
     13750        if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) { 
     13751                ath9k_cache_beacon_config(sc, bss_conf); 
     13752                ath9k_set_beacon(sc); 
     13753                set_bit(SC_OP_BEACONS, &sc->sc_flags); 
     13754                return; 
     13755- 
     13756        } 
     13757  
     13758        /* 
    1219613759--- a/drivers/net/wireless/ath/ath9k/btcoex.c 
    1219713760+++ b/drivers/net/wireless/ath/ath9k/btcoex.c 
     
    1267414237--- a/drivers/net/wireless/ath/ath9k/recv.c 
    1267514238+++ b/drivers/net/wireless/ath/ath9k/recv.c 
    12676 @@ -906,6 +906,7 @@ static void ath9k_process_rssi(struct at 
     14239@@ -15,7 +15,6 @@ 
     14240  */ 
     14241  
     14242 #include <linux/dma-mapping.h> 
     14243-#include <linux/relay.h> 
     14244 #include "ath9k.h" 
     14245 #include "ar9003_mac.h" 
     14246  
     14247@@ -906,6 +905,7 @@ static void ath9k_process_rssi(struct at 
    1267714248        struct ath_hw *ah = common->ah; 
    1267814249        int last_rssi; 
     
    1268214253        /* 
    1268314254         * RSSI is not available for subframes in an A-MPDU. 
    12684 @@ -924,6 +925,20 @@ static void ath9k_process_rssi(struct at 
     14255@@ -924,6 +924,20 @@ static void ath9k_process_rssi(struct at 
    1268514256                return; 
    1268614257        } 
     
    1270314274         * Update Beacon RSSI, this is used by ANI. 
    1270414275         */ 
    12705 @@ -1073,14 +1088,14 @@ static int ath_process_fft(struct ath_so 
    12706                 fft_sample_40.channel_type = chan_type; 
    12707   
    12708                 if (chan_type == NL80211_CHAN_HT40PLUS) { 
     14276@@ -960,186 +974,6 @@ static void ath9k_process_tsf(struct ath 
     14277                rxs->mactime += 0x100000000ULL; 
     14278 } 
     14279  
     14280-#ifdef CPTCFG_ATH9K_DEBUGFS 
     14281-static s8 fix_rssi_inv_only(u8 rssi_val) 
     14282-{ 
     14283-       if (rssi_val == 128) 
     14284-               rssi_val = 0; 
     14285-       return (s8) rssi_val; 
     14286-} 
     14287-#endif 
     14288- 
     14289-/* returns 1 if this was a spectral frame, even if not handled. */ 
     14290-static int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr, 
     14291-                          struct ath_rx_status *rs, u64 tsf) 
     14292-{ 
     14293-#ifdef CPTCFG_ATH9K_DEBUGFS 
     14294-       struct ath_hw *ah = sc->sc_ah; 
     14295-       u8 num_bins, *bins, *vdata = (u8 *)hdr; 
     14296-       struct fft_sample_ht20 fft_sample_20; 
     14297-       struct fft_sample_ht20_40 fft_sample_40; 
     14298-       struct fft_sample_tlv *tlv; 
     14299-       struct ath_radar_info *radar_info; 
     14300-       int len = rs->rs_datalen; 
     14301-       int dc_pos; 
     14302-       u16 fft_len, length, freq = ah->curchan->chan->center_freq; 
     14303-       enum nl80211_channel_type chan_type; 
     14304- 
     14305-       /* AR9280 and before report via ATH9K_PHYERR_RADAR, AR93xx and newer 
     14306-        * via ATH9K_PHYERR_SPECTRAL. Haven't seen ATH9K_PHYERR_FALSE_RADAR_EXT 
     14307-        * yet, but this is supposed to be possible as well. 
     14308-        */ 
     14309-       if (rs->rs_phyerr != ATH9K_PHYERR_RADAR && 
     14310-           rs->rs_phyerr != ATH9K_PHYERR_FALSE_RADAR_EXT && 
     14311-           rs->rs_phyerr != ATH9K_PHYERR_SPECTRAL) 
     14312-               return 0; 
     14313- 
     14314-       /* check if spectral scan bit is set. This does not have to be checked 
     14315-        * if received through a SPECTRAL phy error, but shouldn't hurt. 
     14316-        */ 
     14317-       radar_info = ((struct ath_radar_info *)&vdata[len]) - 1; 
     14318-       if (!(radar_info->pulse_bw_info & SPECTRAL_SCAN_BITMASK)) 
     14319-               return 0; 
     14320- 
     14321-       chan_type = cfg80211_get_chandef_type(&sc->hw->conf.chandef); 
     14322-       if ((chan_type == NL80211_CHAN_HT40MINUS) || 
     14323-           (chan_type == NL80211_CHAN_HT40PLUS)) { 
     14324-               fft_len = SPECTRAL_HT20_40_TOTAL_DATA_LEN; 
     14325-               num_bins = SPECTRAL_HT20_40_NUM_BINS; 
     14326-               bins = (u8 *)fft_sample_40.data; 
     14327-       } else { 
     14328-               fft_len = SPECTRAL_HT20_TOTAL_DATA_LEN; 
     14329-               num_bins = SPECTRAL_HT20_NUM_BINS; 
     14330-               bins = (u8 *)fft_sample_20.data; 
     14331-       } 
     14332- 
     14333-       /* Variation in the data length is possible and will be fixed later */ 
     14334-       if ((len > fft_len + 2) || (len < fft_len - 1)) 
     14335-               return 1; 
     14336- 
     14337-       switch (len - fft_len) { 
     14338-       case 0: 
     14339-               /* length correct, nothing to do. */ 
     14340-               memcpy(bins, vdata, num_bins); 
     14341-               break; 
     14342-       case -1: 
     14343-               /* first byte missing, duplicate it. */ 
     14344-               memcpy(&bins[1], vdata, num_bins - 1); 
     14345-               bins[0] = vdata[0]; 
     14346-               break; 
     14347-       case 2: 
     14348-               /* MAC added 2 extra bytes at bin 30 and 32, remove them. */ 
     14349-               memcpy(bins, vdata, 30); 
     14350-               bins[30] = vdata[31]; 
     14351-               memcpy(&bins[31], &vdata[33], num_bins - 31); 
     14352-               break; 
     14353-       case 1: 
     14354-               /* MAC added 2 extra bytes AND first byte is missing. */ 
     14355-               bins[0] = vdata[0]; 
     14356-               memcpy(&bins[1], vdata, 30); 
     14357-               bins[31] = vdata[31]; 
     14358-               memcpy(&bins[32], &vdata[33], num_bins - 32); 
     14359-               break; 
     14360-       default: 
     14361-               return 1; 
     14362-       } 
     14363- 
     14364-       /* DC value (value in the middle) is the blind spot of the spectral 
     14365-        * sample and invalid, interpolate it. 
     14366-        */ 
     14367-       dc_pos = num_bins / 2; 
     14368-       bins[dc_pos] = (bins[dc_pos + 1] + bins[dc_pos - 1]) / 2; 
     14369- 
     14370-       if ((chan_type == NL80211_CHAN_HT40MINUS) || 
     14371-           (chan_type == NL80211_CHAN_HT40PLUS)) { 
     14372-               s8 lower_rssi, upper_rssi; 
     14373-               s16 ext_nf; 
     14374-               u8 lower_max_index, upper_max_index; 
     14375-               u8 lower_bitmap_w, upper_bitmap_w; 
     14376-               u16 lower_mag, upper_mag; 
     14377-               struct ath9k_hw_cal_data *caldata = ah->caldata; 
     14378-               struct ath_ht20_40_mag_info *mag_info; 
     14379- 
     14380-               if (caldata) 
     14381-                       ext_nf = ath9k_hw_getchan_noise(ah, ah->curchan, 
     14382-                                       caldata->nfCalHist[3].privNF); 
     14383-               else 
     14384-                       ext_nf = ATH_DEFAULT_NOISE_FLOOR; 
     14385- 
     14386-               length = sizeof(fft_sample_40) - sizeof(struct fft_sample_tlv); 
     14387-               fft_sample_40.tlv.type = ATH_FFT_SAMPLE_HT20_40; 
     14388-               fft_sample_40.tlv.length = __cpu_to_be16(length); 
     14389-               fft_sample_40.freq = __cpu_to_be16(freq); 
     14390-               fft_sample_40.channel_type = chan_type; 
     14391- 
     14392-               if (chan_type == NL80211_CHAN_HT40PLUS) { 
    1270914393-                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 
    1271014394-                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0); 
     14395- 
     14396-                       fft_sample_40.lower_noise = ah->noise; 
     14397-                       fft_sample_40.upper_noise = ext_nf; 
     14398-               } else { 
     14399-                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0); 
     14400-                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 
     14401- 
     14402-                       fft_sample_40.lower_noise = ext_nf; 
     14403-                       fft_sample_40.upper_noise = ah->noise; 
     14404-               } 
     14405-               fft_sample_40.lower_rssi = lower_rssi; 
     14406-               fft_sample_40.upper_rssi = upper_rssi; 
     14407- 
     14408-               mag_info = ((struct ath_ht20_40_mag_info *)radar_info) - 1; 
     14409-               lower_mag = spectral_max_magnitude(mag_info->lower_bins); 
     14410-               upper_mag = spectral_max_magnitude(mag_info->upper_bins); 
     14411-               fft_sample_40.lower_max_magnitude = __cpu_to_be16(lower_mag); 
     14412-               fft_sample_40.upper_max_magnitude = __cpu_to_be16(upper_mag); 
     14413-               lower_max_index = spectral_max_index(mag_info->lower_bins); 
     14414-               upper_max_index = spectral_max_index(mag_info->upper_bins); 
     14415-               fft_sample_40.lower_max_index = lower_max_index; 
     14416-               fft_sample_40.upper_max_index = upper_max_index; 
     14417-               lower_bitmap_w = spectral_bitmap_weight(mag_info->lower_bins); 
     14418-               upper_bitmap_w = spectral_bitmap_weight(mag_info->upper_bins); 
     14419-               fft_sample_40.lower_bitmap_weight = lower_bitmap_w; 
     14420-               fft_sample_40.upper_bitmap_weight = upper_bitmap_w; 
     14421-               fft_sample_40.max_exp = mag_info->max_exp & 0xf; 
     14422- 
     14423-               fft_sample_40.tsf = __cpu_to_be64(tsf); 
     14424- 
     14425-               tlv = (struct fft_sample_tlv *)&fft_sample_40; 
     14426-       } else { 
     14427-               u8 max_index, bitmap_w; 
     14428-               u16 magnitude; 
     14429-               struct ath_ht20_mag_info *mag_info; 
     14430- 
     14431-               length = sizeof(fft_sample_20) - sizeof(struct fft_sample_tlv); 
     14432-               fft_sample_20.tlv.type = ATH_FFT_SAMPLE_HT20; 
     14433-               fft_sample_20.tlv.length = __cpu_to_be16(length); 
     14434-               fft_sample_20.freq = __cpu_to_be16(freq); 
     14435- 
     14436-               fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 
     14437-               fft_sample_20.noise = ah->noise; 
     14438- 
     14439-               mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1; 
     14440-               magnitude = spectral_max_magnitude(mag_info->all_bins); 
     14441-               fft_sample_20.max_magnitude = __cpu_to_be16(magnitude); 
     14442-               max_index = spectral_max_index(mag_info->all_bins); 
     14443-               fft_sample_20.max_index = max_index; 
     14444-               bitmap_w = spectral_bitmap_weight(mag_info->all_bins); 
     14445-               fft_sample_20.bitmap_weight = bitmap_w; 
     14446-               fft_sample_20.max_exp = mag_info->max_exp & 0xf; 
     14447- 
     14448-               fft_sample_20.tsf = __cpu_to_be64(tsf); 
     14449- 
     14450-               tlv = (struct fft_sample_tlv *)&fft_sample_20; 
     14451-       } 
     14452- 
     14453-       ath_debug_send_fft_sample(sc, tlv); 
     14454-       return 1; 
     14455-#else 
     14456-       return 0; 
     14457-#endif 
     14458-} 
     14459- 
     14460 static bool ath9k_is_mybeacon(struct ath_softc *sc, struct ieee80211_hdr *hdr) 
     14461 { 
     14462        struct ath_hw *ah = sc->sc_ah; 
     14463--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h 
     14464+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h 
     14465@@ -270,10 +270,20 @@ struct cal_ctl_data_5g { 
     14466        u8 ctlEdges[AR9300_NUM_BAND_EDGES_5G]; 
     14467 } __packed; 
     14468  
     14469+#define MAX_BASE_EXTENSION_FUTURE 2 
     14470+ 
     14471 struct ar9300_BaseExtension_1 { 
     14472        u8 ant_div_control; 
     14473-       u8 future[3]; 
     14474-       u8 tempslopextension[8]; 
     14475+       u8 future[MAX_BASE_EXTENSION_FUTURE]; 
     14476+       /* 
     14477+        * misc_enable: 
     14478+        * 
     14479+        * BIT 0   - TX Gain Cap enable. 
     14480+        * BIT 1   - Uncompressed Checksum enable. 
     14481+        * BIT 2/3 - MinCCApwr enable 2g/5g. 
     14482+        */ 
     14483+       u8 misc_enable; 
     14484+       int8_t tempslopextension[8]; 
     14485        int8_t quick_drop_low; 
     14486        int8_t quick_drop_high; 
     14487 } __packed; 
     14488--- a/drivers/net/wireless/ath/ath9k/debug.h 
     14489+++ b/drivers/net/wireless/ath/ath9k/debug.h 
     14490@@ -292,11 +292,11 @@ void ath9k_sta_add_debugfs(struct ieee80 
     14491                           struct ieee80211_vif *vif, 
     14492                           struct ieee80211_sta *sta, 
     14493                           struct dentry *dir); 
     14494-void ath_debug_send_fft_sample(struct ath_softc *sc, 
     14495-                              struct fft_sample_tlv *fft_sample); 
     14496 void ath9k_debug_stat_ant(struct ath_softc *sc, 
     14497                          struct ath_hw_antcomb_conf *div_ant_conf, 
     14498                          int main_rssi_avg, int alt_rssi_avg); 
     14499+void ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause); 
     14500+ 
     14501 #else 
     14502  
     14503 #define RX_STAT_INC(c) /* NOP */ 
     14504@@ -331,6 +331,11 @@ static inline void ath9k_debug_stat_ant( 
     14505  
     14506 } 
     14507  
     14508+static inline void 
     14509+ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause) 
     14510+{ 
     14511+} 
     14512+ 
     14513 #endif /* CPTCFG_ATH9K_DEBUGFS */ 
     14514  
     14515 #endif /* DEBUG_H */ 
     14516--- /dev/null 
     14517+++ b/drivers/net/wireless/ath/ath9k/spectral.c 
     14518@@ -0,0 +1,543 @@ 
     14519+/* 
     14520+ * Copyright (c) 2013 Qualcomm Atheros, Inc. 
     14521+ * 
     14522+ * Permission to use, copy, modify, and/or distribute this software for any 
     14523+ * purpose with or without fee is hereby granted, provided that the above 
     14524+ * copyright notice and this permission notice appear in all copies. 
     14525+ * 
     14526+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 
     14527+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
     14528+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 
     14529+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
     14530+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
     14531+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
     14532+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
     14533+ */ 
     14534+ 
     14535+#include <linux/relay.h> 
     14536+#include "ath9k.h" 
     14537+ 
     14538+static s8 fix_rssi_inv_only(u8 rssi_val) 
     14539+{ 
     14540+       if (rssi_val == 128) 
     14541+               rssi_val = 0; 
     14542+       return (s8) rssi_val; 
     14543+} 
     14544+ 
     14545+static void ath_debug_send_fft_sample(struct ath_softc *sc, 
     14546+                                     struct fft_sample_tlv *fft_sample_tlv) 
     14547+{ 
     14548+       int length; 
     14549+       if (!sc->rfs_chan_spec_scan) 
     14550+               return; 
     14551+ 
     14552+       length = __be16_to_cpu(fft_sample_tlv->length) + 
     14553+                sizeof(*fft_sample_tlv); 
     14554+       relay_write(sc->rfs_chan_spec_scan, fft_sample_tlv, length); 
     14555+} 
     14556+ 
     14557+/* returns 1 if this was a spectral frame, even if not handled. */ 
     14558+int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr, 
     14559+                   struct ath_rx_status *rs, u64 tsf) 
     14560+{ 
     14561+       struct ath_hw *ah = sc->sc_ah; 
     14562+       u8 num_bins, *bins, *vdata = (u8 *)hdr; 
     14563+       struct fft_sample_ht20 fft_sample_20; 
     14564+       struct fft_sample_ht20_40 fft_sample_40; 
     14565+       struct fft_sample_tlv *tlv; 
     14566+       struct ath_radar_info *radar_info; 
     14567+       int len = rs->rs_datalen; 
     14568+       int dc_pos; 
     14569+       u16 fft_len, length, freq = ah->curchan->chan->center_freq; 
     14570+       enum nl80211_channel_type chan_type; 
     14571+ 
     14572+       /* AR9280 and before report via ATH9K_PHYERR_RADAR, AR93xx and newer 
     14573+        * via ATH9K_PHYERR_SPECTRAL. Haven't seen ATH9K_PHYERR_FALSE_RADAR_EXT 
     14574+        * yet, but this is supposed to be possible as well. 
     14575+        */ 
     14576+       if (rs->rs_phyerr != ATH9K_PHYERR_RADAR && 
     14577+           rs->rs_phyerr != ATH9K_PHYERR_FALSE_RADAR_EXT && 
     14578+           rs->rs_phyerr != ATH9K_PHYERR_SPECTRAL) 
     14579+               return 0; 
     14580+ 
     14581+       /* check if spectral scan bit is set. This does not have to be checked 
     14582+        * if received through a SPECTRAL phy error, but shouldn't hurt. 
     14583+        */ 
     14584+       radar_info = ((struct ath_radar_info *)&vdata[len]) - 1; 
     14585+       if (!(radar_info->pulse_bw_info & SPECTRAL_SCAN_BITMASK)) 
     14586+               return 0; 
     14587+ 
     14588+       chan_type = cfg80211_get_chandef_type(&sc->hw->conf.chandef); 
     14589+       if ((chan_type == NL80211_CHAN_HT40MINUS) || 
     14590+           (chan_type == NL80211_CHAN_HT40PLUS)) { 
     14591+               fft_len = SPECTRAL_HT20_40_TOTAL_DATA_LEN; 
     14592+               num_bins = SPECTRAL_HT20_40_NUM_BINS; 
     14593+               bins = (u8 *)fft_sample_40.data; 
     14594+       } else { 
     14595+               fft_len = SPECTRAL_HT20_TOTAL_DATA_LEN; 
     14596+               num_bins = SPECTRAL_HT20_NUM_BINS; 
     14597+               bins = (u8 *)fft_sample_20.data; 
     14598+       } 
     14599+ 
     14600+       /* Variation in the data length is possible and will be fixed later */ 
     14601+       if ((len > fft_len + 2) || (len < fft_len - 1)) 
     14602+               return 1; 
     14603+ 
     14604+       switch (len - fft_len) { 
     14605+       case 0: 
     14606+               /* length correct, nothing to do. */ 
     14607+               memcpy(bins, vdata, num_bins); 
     14608+               break; 
     14609+       case -1: 
     14610+               /* first byte missing, duplicate it. */ 
     14611+               memcpy(&bins[1], vdata, num_bins - 1); 
     14612+               bins[0] = vdata[0]; 
     14613+               break; 
     14614+       case 2: 
     14615+               /* MAC added 2 extra bytes at bin 30 and 32, remove them. */ 
     14616+               memcpy(bins, vdata, 30); 
     14617+               bins[30] = vdata[31]; 
     14618+               memcpy(&bins[31], &vdata[33], num_bins - 31); 
     14619+               break; 
     14620+       case 1: 
     14621+               /* MAC added 2 extra bytes AND first byte is missing. */ 
     14622+               bins[0] = vdata[0]; 
     14623+               memcpy(&bins[1], vdata, 30); 
     14624+               bins[31] = vdata[31]; 
     14625+               memcpy(&bins[32], &vdata[33], num_bins - 32); 
     14626+               break; 
     14627+       default: 
     14628+               return 1; 
     14629+       } 
     14630+ 
     14631+       /* DC value (value in the middle) is the blind spot of the spectral 
     14632+        * sample and invalid, interpolate it. 
     14633+        */ 
     14634+       dc_pos = num_bins / 2; 
     14635+       bins[dc_pos] = (bins[dc_pos + 1] + bins[dc_pos - 1]) / 2; 
     14636+ 
     14637+       if ((chan_type == NL80211_CHAN_HT40MINUS) || 
     14638+           (chan_type == NL80211_CHAN_HT40PLUS)) { 
     14639+               s8 lower_rssi, upper_rssi; 
     14640+               s16 ext_nf; 
     14641+               u8 lower_max_index, upper_max_index; 
     14642+               u8 lower_bitmap_w, upper_bitmap_w; 
     14643+               u16 lower_mag, upper_mag; 
     14644+               struct ath9k_hw_cal_data *caldata = ah->caldata; 
     14645+               struct ath_ht20_40_mag_info *mag_info; 
     14646+ 
     14647+               if (caldata) 
     14648+                       ext_nf = ath9k_hw_getchan_noise(ah, ah->curchan, 
     14649+                                       caldata->nfCalHist[3].privNF); 
     14650+               else 
     14651+                       ext_nf = ATH_DEFAULT_NOISE_FLOOR; 
     14652+ 
     14653+               length = sizeof(fft_sample_40) - sizeof(struct fft_sample_tlv); 
     14654+               fft_sample_40.tlv.type = ATH_FFT_SAMPLE_HT20_40; 
     14655+               fft_sample_40.tlv.length = __cpu_to_be16(length); 
     14656+               fft_sample_40.freq = __cpu_to_be16(freq); 
     14657+               fft_sample_40.channel_type = chan_type; 
     14658+ 
     14659+               if (chan_type == NL80211_CHAN_HT40PLUS) { 
    1271114660+                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]); 
    1271214661+                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]); 
    12713   
    12714                         fft_sample_40.lower_noise = ah->noise; 
    12715                         fft_sample_40.upper_noise = ext_nf; 
    12716                 } else { 
    12717 -                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0); 
    12718 -                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 
     14662+ 
     14663+                       fft_sample_40.lower_noise = ah->noise; 
     14664+                       fft_sample_40.upper_noise = ext_nf; 
     14665+               } else { 
    1271914666+                       lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]); 
    1272014667+                       upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]); 
    12721   
    12722                         fft_sample_40.lower_noise = ext_nf; 
    12723                         fft_sample_40.upper_noise = ah->noise; 
    12724 @@ -1116,7 +1131,7 @@ static int ath_process_fft(struct ath_so 
    12725                 fft_sample_20.tlv.length = __cpu_to_be16(length); 
    12726                 fft_sample_20.freq = __cpu_to_be16(freq); 
    12727   
    12728 -               fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0); 
     14668+ 
     14669+                       fft_sample_40.lower_noise = ext_nf; 
     14670+                       fft_sample_40.upper_noise = ah->noise; 
     14671+               } 
     14672+               fft_sample_40.lower_rssi = lower_rssi; 
     14673+               fft_sample_40.upper_rssi = upper_rssi; 
     14674+ 
     14675+               mag_info = ((struct ath_ht20_40_mag_info *)radar_info) - 1; 
     14676+               lower_mag = spectral_max_magnitude(mag_info->lower_bins); 
     14677+               upper_mag = spectral_max_magnitude(mag_info->upper_bins); 
     14678+               fft_sample_40.lower_max_magnitude = __cpu_to_be16(lower_mag); 
     14679+               fft_sample_40.upper_max_magnitude = __cpu_to_be16(upper_mag); 
     14680+               lower_max_index = spectral_max_index(mag_info->lower_bins); 
     14681+               upper_max_index = spectral_max_index(mag_info->upper_bins); 
     14682+               fft_sample_40.lower_max_index = lower_max_index; 
     14683+               fft_sample_40.upper_max_index = upper_max_index; 
     14684+               lower_bitmap_w = spectral_bitmap_weight(mag_info->lower_bins); 
     14685+               upper_bitmap_w = spectral_bitmap_weight(mag_info->upper_bins); 
     14686+               fft_sample_40.lower_bitmap_weight = lower_bitmap_w; 
     14687+               fft_sample_40.upper_bitmap_weight = upper_bitmap_w; 
     14688+               fft_sample_40.max_exp = mag_info->max_exp & 0xf; 
     14689+ 
     14690+               fft_sample_40.tsf = __cpu_to_be64(tsf); 
     14691+ 
     14692+               tlv = (struct fft_sample_tlv *)&fft_sample_40; 
     14693+       } else { 
     14694+               u8 max_index, bitmap_w; 
     14695+               u16 magnitude; 
     14696+               struct ath_ht20_mag_info *mag_info; 
     14697+ 
     14698+               length = sizeof(fft_sample_20) - sizeof(struct fft_sample_tlv); 
     14699+               fft_sample_20.tlv.type = ATH_FFT_SAMPLE_HT20; 
     14700+               fft_sample_20.tlv.length = __cpu_to_be16(length); 
     14701+               fft_sample_20.freq = __cpu_to_be16(freq); 
     14702+ 
    1272914703+               fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]); 
    12730                 fft_sample_20.noise = ah->noise; 
    12731   
    12732                 mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1; 
     14704+               fft_sample_20.noise = ah->noise; 
     14705+ 
     14706+               mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1; 
     14707+               magnitude = spectral_max_magnitude(mag_info->all_bins); 
     14708+               fft_sample_20.max_magnitude = __cpu_to_be16(magnitude); 
     14709+               max_index = spectral_max_index(mag_info->all_bins); 
     14710+               fft_sample_20.max_index = max_index; 
     14711+               bitmap_w = spectral_bitmap_weight(mag_info->all_bins); 
     14712+               fft_sample_20.bitmap_weight = bitmap_w; 
     14713+               fft_sample_20.max_exp = mag_info->max_exp & 0xf; 
     14714+ 
     14715+               fft_sample_20.tsf = __cpu_to_be64(tsf); 
     14716+ 
     14717+               tlv = (struct fft_sample_tlv *)&fft_sample_20; 
     14718+       } 
     14719+ 
     14720+       ath_debug_send_fft_sample(sc, tlv); 
     14721+ 
     14722+       return 1; 
     14723+} 
     14724+ 
     14725+/*********************/ 
     14726+/* spectral_scan_ctl */ 
     14727+/*********************/ 
     14728+ 
     14729+static ssize_t read_file_spec_scan_ctl(struct file *file, char __user *user_buf, 
     14730+                                      size_t count, loff_t *ppos) 
     14731+{ 
     14732+       struct ath_softc *sc = file->private_data; 
     14733+       char *mode = ""; 
     14734+       unsigned int len; 
     14735+ 
     14736+       switch (sc->spectral_mode) { 
     14737+       case SPECTRAL_DISABLED: 
     14738+               mode = "disable"; 
     14739+               break; 
     14740+       case SPECTRAL_BACKGROUND: 
     14741+               mode = "background"; 
     14742+               break; 
     14743+       case SPECTRAL_CHANSCAN: 
     14744+               mode = "chanscan"; 
     14745+               break; 
     14746+       case SPECTRAL_MANUAL: 
     14747+               mode = "manual"; 
     14748+               break; 
     14749+       } 
     14750+       len = strlen(mode); 
     14751+       return simple_read_from_buffer(user_buf, count, ppos, mode, len); 
     14752+} 
     14753+ 
     14754+static ssize_t write_file_spec_scan_ctl(struct file *file, 
     14755+                                       const char __user *user_buf, 
     14756+                                       size_t count, loff_t *ppos) 
     14757+{ 
     14758+       struct ath_softc *sc = file->private_data; 
     14759+       struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     14760+       char buf[32]; 
     14761+       ssize_t len; 
     14762+ 
     14763+       if (config_enabled(CPTCFG_ATH9K_TX99)) 
     14764+               return -EOPNOTSUPP; 
     14765+ 
     14766+       len = min(count, sizeof(buf) - 1); 
     14767+       if (copy_from_user(buf, user_buf, len)) 
     14768+               return -EFAULT; 
     14769+ 
     14770+       buf[len] = '\0'; 
     14771+ 
     14772+       if (strncmp("trigger", buf, 7) == 0) { 
     14773+               ath9k_spectral_scan_trigger(sc->hw); 
     14774+       } else if (strncmp("background", buf, 9) == 0) { 
     14775+               ath9k_spectral_scan_config(sc->hw, SPECTRAL_BACKGROUND); 
     14776+               ath_dbg(common, CONFIG, "spectral scan: background mode enabled\n"); 
     14777+       } else if (strncmp("chanscan", buf, 8) == 0) { 
     14778+               ath9k_spectral_scan_config(sc->hw, SPECTRAL_CHANSCAN); 
     14779+               ath_dbg(common, CONFIG, "spectral scan: channel scan mode enabled\n"); 
     14780+       } else if (strncmp("manual", buf, 6) == 0) { 
     14781+               ath9k_spectral_scan_config(sc->hw, SPECTRAL_MANUAL); 
     14782+               ath_dbg(common, CONFIG, "spectral scan: manual mode enabled\n"); 
     14783+       } else if (strncmp("disable", buf, 7) == 0) { 
     14784+               ath9k_spectral_scan_config(sc->hw, SPECTRAL_DISABLED); 
     14785+               ath_dbg(common, CONFIG, "spectral scan: disabled\n"); 
     14786+       } else { 
     14787+               return -EINVAL; 
     14788+       } 
     14789+ 
     14790+       return count; 
     14791+} 
     14792+ 
     14793+static const struct file_operations fops_spec_scan_ctl = { 
     14794+       .read = read_file_spec_scan_ctl, 
     14795+       .write = write_file_spec_scan_ctl, 
     14796+       .open = simple_open, 
     14797+       .owner = THIS_MODULE, 
     14798+       .llseek = default_llseek, 
     14799+}; 
     14800+ 
     14801+/*************************/ 
     14802+/* spectral_short_repeat */ 
     14803+/*************************/ 
     14804+ 
     14805+static ssize_t read_file_spectral_short_repeat(struct file *file, 
     14806+                                              char __user *user_buf, 
     14807+                                              size_t count, loff_t *ppos) 
     14808+{ 
     14809+       struct ath_softc *sc = file->private_data; 
     14810+       char buf[32]; 
     14811+       unsigned int len; 
     14812+ 
     14813+       len = sprintf(buf, "%d\n", sc->spec_config.short_repeat); 
     14814+       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     14815+} 
     14816+ 
     14817+static ssize_t write_file_spectral_short_repeat(struct file *file, 
     14818+                                               const char __user *user_buf, 
     14819+                                               size_t count, loff_t *ppos) 
     14820+{ 
     14821+       struct ath_softc *sc = file->private_data; 
     14822+       unsigned long val; 
     14823+       char buf[32]; 
     14824+       ssize_t len; 
     14825+ 
     14826+       len = min(count, sizeof(buf) - 1); 
     14827+       if (copy_from_user(buf, user_buf, len)) 
     14828+               return -EFAULT; 
     14829+ 
     14830+       buf[len] = '\0'; 
     14831+       if (kstrtoul(buf, 0, &val)) 
     14832+               return -EINVAL; 
     14833+ 
     14834+       if (val < 0 || val > 1) 
     14835+               return -EINVAL; 
     14836+ 
     14837+       sc->spec_config.short_repeat = val; 
     14838+       return count; 
     14839+} 
     14840+ 
     14841+static const struct file_operations fops_spectral_short_repeat = { 
     14842+       .read = read_file_spectral_short_repeat, 
     14843+       .write = write_file_spectral_short_repeat, 
     14844+       .open = simple_open, 
     14845+       .owner = THIS_MODULE, 
     14846+       .llseek = default_llseek, 
     14847+}; 
     14848+ 
     14849+/******************/ 
     14850+/* spectral_count */ 
     14851+/******************/ 
     14852+ 
     14853+static ssize_t read_file_spectral_count(struct file *file, 
     14854+                                       char __user *user_buf, 
     14855+                                       size_t count, loff_t *ppos) 
     14856+{ 
     14857+       struct ath_softc *sc = file->private_data; 
     14858+       char buf[32]; 
     14859+       unsigned int len; 
     14860+ 
     14861+       len = sprintf(buf, "%d\n", sc->spec_config.count); 
     14862+       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     14863+} 
     14864+ 
     14865+static ssize_t write_file_spectral_count(struct file *file, 
     14866+                                        const char __user *user_buf, 
     14867+                                        size_t count, loff_t *ppos) 
     14868+{ 
     14869+       struct ath_softc *sc = file->private_data; 
     14870+       unsigned long val; 
     14871+       char buf[32]; 
     14872+       ssize_t len; 
     14873+ 
     14874+       len = min(count, sizeof(buf) - 1); 
     14875+       if (copy_from_user(buf, user_buf, len)) 
     14876+               return -EFAULT; 
     14877+ 
     14878+       buf[len] = '\0'; 
     14879+       if (kstrtoul(buf, 0, &val)) 
     14880+               return -EINVAL; 
     14881+ 
     14882+       if (val < 0 || val > 255) 
     14883+               return -EINVAL; 
     14884+ 
     14885+       sc->spec_config.count = val; 
     14886+       return count; 
     14887+} 
     14888+ 
     14889+static const struct file_operations fops_spectral_count = { 
     14890+       .read = read_file_spectral_count, 
     14891+       .write = write_file_spectral_count, 
     14892+       .open = simple_open, 
     14893+       .owner = THIS_MODULE, 
     14894+       .llseek = default_llseek, 
     14895+}; 
     14896+ 
     14897+/*******************/ 
     14898+/* spectral_period */ 
     14899+/*******************/ 
     14900+ 
     14901+static ssize_t read_file_spectral_period(struct file *file, 
     14902+                                        char __user *user_buf, 
     14903+                                        size_t count, loff_t *ppos) 
     14904+{ 
     14905+       struct ath_softc *sc = file->private_data; 
     14906+       char buf[32]; 
     14907+       unsigned int len; 
     14908+ 
     14909+       len = sprintf(buf, "%d\n", sc->spec_config.period); 
     14910+       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     14911+} 
     14912+ 
     14913+static ssize_t write_file_spectral_period(struct file *file, 
     14914+                                         const char __user *user_buf, 
     14915+                                         size_t count, loff_t *ppos) 
     14916+{ 
     14917+       struct ath_softc *sc = file->private_data; 
     14918+       unsigned long val; 
     14919+       char buf[32]; 
     14920+       ssize_t len; 
     14921+ 
     14922+       len = min(count, sizeof(buf) - 1); 
     14923+       if (copy_from_user(buf, user_buf, len)) 
     14924+               return -EFAULT; 
     14925+ 
     14926+       buf[len] = '\0'; 
     14927+       if (kstrtoul(buf, 0, &val)) 
     14928+               return -EINVAL; 
     14929+ 
     14930+       if (val < 0 || val > 255) 
     14931+               return -EINVAL; 
     14932+ 
     14933+       sc->spec_config.period = val; 
     14934+       return count; 
     14935+} 
     14936+ 
     14937+static const struct file_operations fops_spectral_period = { 
     14938+       .read = read_file_spectral_period, 
     14939+       .write = write_file_spectral_period, 
     14940+       .open = simple_open, 
     14941+       .owner = THIS_MODULE, 
     14942+       .llseek = default_llseek, 
     14943+}; 
     14944+ 
     14945+/***********************/ 
     14946+/* spectral_fft_period */ 
     14947+/***********************/ 
     14948+ 
     14949+static ssize_t read_file_spectral_fft_period(struct file *file, 
     14950+                                            char __user *user_buf, 
     14951+                                            size_t count, loff_t *ppos) 
     14952+{ 
     14953+       struct ath_softc *sc = file->private_data; 
     14954+       char buf[32]; 
     14955+       unsigned int len; 
     14956+ 
     14957+       len = sprintf(buf, "%d\n", sc->spec_config.fft_period); 
     14958+       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     14959+} 
     14960+ 
     14961+static ssize_t write_file_spectral_fft_period(struct file *file, 
     14962+                                             const char __user *user_buf, 
     14963+                                             size_t count, loff_t *ppos) 
     14964+{ 
     14965+       struct ath_softc *sc = file->private_data; 
     14966+       unsigned long val; 
     14967+       char buf[32]; 
     14968+       ssize_t len; 
     14969+ 
     14970+       len = min(count, sizeof(buf) - 1); 
     14971+       if (copy_from_user(buf, user_buf, len)) 
     14972+               return -EFAULT; 
     14973+ 
     14974+       buf[len] = '\0'; 
     14975+       if (kstrtoul(buf, 0, &val)) 
     14976+               return -EINVAL; 
     14977+ 
     14978+       if (val < 0 || val > 15) 
     14979+               return -EINVAL; 
     14980+ 
     14981+       sc->spec_config.fft_period = val; 
     14982+       return count; 
     14983+} 
     14984+ 
     14985+static const struct file_operations fops_spectral_fft_period = { 
     14986+       .read = read_file_spectral_fft_period, 
     14987+       .write = write_file_spectral_fft_period, 
     14988+       .open = simple_open, 
     14989+       .owner = THIS_MODULE, 
     14990+       .llseek = default_llseek, 
     14991+}; 
     14992+ 
     14993+/*******************/ 
     14994+/* Relay interface */ 
     14995+/*******************/ 
     14996+ 
     14997+static struct dentry *create_buf_file_handler(const char *filename, 
     14998+                                             struct dentry *parent, 
     14999+                                             umode_t mode, 
     15000+                                             struct rchan_buf *buf, 
     15001+                                             int *is_global) 
     15002+{ 
     15003+       struct dentry *buf_file; 
     15004+ 
     15005+       buf_file = debugfs_create_file(filename, mode, parent, buf, 
     15006+                                      &relay_file_operations); 
     15007+       *is_global = 1; 
     15008+       return buf_file; 
     15009+} 
     15010+ 
     15011+static int remove_buf_file_handler(struct dentry *dentry) 
     15012+{ 
     15013+       debugfs_remove(dentry); 
     15014+ 
     15015+       return 0; 
     15016+} 
     15017+ 
     15018+struct rchan_callbacks rfs_spec_scan_cb = { 
     15019+       .create_buf_file = create_buf_file_handler, 
     15020+       .remove_buf_file = remove_buf_file_handler, 
     15021+}; 
     15022+ 
     15023+/*********************/ 
     15024+/* Debug Init/Deinit */ 
     15025+/*********************/ 
     15026+ 
     15027+void ath9k_spectral_deinit_debug(struct ath_softc *sc) 
     15028+{ 
     15029+       if (config_enabled(CPTCFG_ATH9K_DEBUGFS) && sc->rfs_chan_spec_scan) { 
     15030+               relay_close(sc->rfs_chan_spec_scan); 
     15031+               sc->rfs_chan_spec_scan = NULL; 
     15032+       } 
     15033+} 
     15034+ 
     15035+void ath9k_spectral_init_debug(struct ath_softc *sc) 
     15036+{ 
     15037+       sc->rfs_chan_spec_scan = relay_open("spectral_scan", 
     15038+                                           sc->debug.debugfs_phy, 
     15039+                                           1024, 256, &rfs_spec_scan_cb, 
     15040+                                           NULL); 
     15041+       debugfs_create_file("spectral_scan_ctl", 
     15042+                           S_IRUSR | S_IWUSR, 
     15043+                           sc->debug.debugfs_phy, sc, 
     15044+                           &fops_spec_scan_ctl); 
     15045+       debugfs_create_file("spectral_short_repeat", 
     15046+                           S_IRUSR | S_IWUSR, 
     15047+                           sc->debug.debugfs_phy, sc, 
     15048+                           &fops_spectral_short_repeat); 
     15049+       debugfs_create_file("spectral_count", 
     15050+                           S_IRUSR | S_IWUSR, 
     15051+                           sc->debug.debugfs_phy, sc, 
     15052+                           &fops_spectral_count); 
     15053+       debugfs_create_file("spectral_period", 
     15054+                           S_IRUSR | S_IWUSR, 
     15055+                           sc->debug.debugfs_phy, sc, 
     15056+                           &fops_spectral_period); 
     15057+       debugfs_create_file("spectral_fft_period", 
     15058+                           S_IRUSR | S_IWUSR, 
     15059+                           sc->debug.debugfs_phy, sc, 
     15060+                           &fops_spectral_fft_period); 
     15061+} 
     15062--- /dev/null 
     15063+++ b/drivers/net/wireless/ath/ath9k/spectral.h 
     15064@@ -0,0 +1,212 @@ 
     15065+/* 
     15066+ * Copyright (c) 2013 Qualcomm Atheros, Inc. 
     15067+ * 
     15068+ * Permission to use, copy, modify, and/or distribute this software for any 
     15069+ * purpose with or without fee is hereby granted, provided that the above 
     15070+ * copyright notice and this permission notice appear in all copies. 
     15071+ * 
     15072+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 
     15073+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
     15074+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 
     15075+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
     15076+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
     15077+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
     15078+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
     15079+ */ 
     15080+ 
     15081+#ifndef SPECTRAL_H 
     15082+#define SPECTRAL_H 
     15083+ 
     15084+/* enum spectral_mode: 
     15085+ * 
     15086+ * @SPECTRAL_DISABLED: spectral mode is disabled 
     15087+ * @SPECTRAL_BACKGROUND: hardware sends samples when it is not busy with 
     15088+ *     something else. 
     15089+ * @SPECTRAL_MANUAL: spectral scan is enabled, triggering for samples 
     15090+ *     is performed manually. 
     15091+ * @SPECTRAL_CHANSCAN: Like manual, but also triggered when changing channels 
     15092+ *     during a channel scan. 
     15093+ */ 
     15094+enum spectral_mode { 
     15095+       SPECTRAL_DISABLED = 0, 
     15096+       SPECTRAL_BACKGROUND, 
     15097+       SPECTRAL_MANUAL, 
     15098+       SPECTRAL_CHANSCAN, 
     15099+}; 
     15100+ 
     15101+#define SPECTRAL_SCAN_BITMASK          0x10 
     15102+/* Radar info packet format, used for DFS and spectral formats. */ 
     15103+struct ath_radar_info { 
     15104+       u8 pulse_length_pri; 
     15105+       u8 pulse_length_ext; 
     15106+       u8 pulse_bw_info; 
     15107+} __packed; 
     15108+ 
     15109+/* The HT20 spectral data has 4 bytes of additional information at it's end. 
     15110+ * 
     15111+ * [7:0]: all bins {max_magnitude[1:0], bitmap_weight[5:0]} 
     15112+ * [7:0]: all bins  max_magnitude[9:2] 
     15113+ * [7:0]: all bins {max_index[5:0], max_magnitude[11:10]} 
     15114+ * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned) 
     15115+ */ 
     15116+struct ath_ht20_mag_info { 
     15117+       u8 all_bins[3]; 
     15118+       u8 max_exp; 
     15119+} __packed; 
     15120+ 
     15121+#define SPECTRAL_HT20_NUM_BINS         56 
     15122+ 
     15123+/* WARNING: don't actually use this struct! MAC may vary the amount of 
     15124+ * data by -1/+2. This struct is for reference only. 
     15125+ */ 
     15126+struct ath_ht20_fft_packet { 
     15127+       u8 data[SPECTRAL_HT20_NUM_BINS]; 
     15128+       struct ath_ht20_mag_info mag_info; 
     15129+       struct ath_radar_info radar_info; 
     15130+} __packed; 
     15131+ 
     15132+#define SPECTRAL_HT20_TOTAL_DATA_LEN   (sizeof(struct ath_ht20_fft_packet)) 
     15133+ 
     15134+/* Dynamic 20/40 mode: 
     15135+ * 
     15136+ * [7:0]: lower bins {max_magnitude[1:0], bitmap_weight[5:0]} 
     15137+ * [7:0]: lower bins  max_magnitude[9:2] 
     15138+ * [7:0]: lower bins {max_index[5:0], max_magnitude[11:10]} 
     15139+ * [7:0]: upper bins {max_magnitude[1:0], bitmap_weight[5:0]} 
     15140+ * [7:0]: upper bins  max_magnitude[9:2] 
     15141+ * [7:0]: upper bins {max_index[5:0], max_magnitude[11:10]} 
     15142+ * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned) 
     15143+ */ 
     15144+struct ath_ht20_40_mag_info { 
     15145+       u8 lower_bins[3]; 
     15146+       u8 upper_bins[3]; 
     15147+       u8 max_exp; 
     15148+} __packed; 
     15149+ 
     15150+#define SPECTRAL_HT20_40_NUM_BINS              128 
     15151+ 
     15152+/* WARNING: don't actually use this struct! MAC may vary the amount of 
     15153+ * data. This struct is for reference only. 
     15154+ */ 
     15155+struct ath_ht20_40_fft_packet { 
     15156+       u8 data[SPECTRAL_HT20_40_NUM_BINS]; 
     15157+       struct ath_ht20_40_mag_info mag_info; 
     15158+       struct ath_radar_info radar_info; 
     15159+} __packed; 
     15160+ 
     15161+ 
     15162+#define SPECTRAL_HT20_40_TOTAL_DATA_LEN        (sizeof(struct ath_ht20_40_fft_packet)) 
     15163+ 
     15164+/* grabs the max magnitude from the all/upper/lower bins */ 
     15165+static inline u16 spectral_max_magnitude(u8 *bins) 
     15166+{ 
     15167+       return (bins[0] & 0xc0) >> 6 | 
     15168+              (bins[1] & 0xff) << 2 | 
     15169+              (bins[2] & 0x03) << 10; 
     15170+} 
     15171+ 
     15172+/* return the max magnitude from the all/upper/lower bins */ 
     15173+static inline u8 spectral_max_index(u8 *bins) 
     15174+{ 
     15175+       s8 m = (bins[2] & 0xfc) >> 2; 
     15176+ 
     15177+       /* TODO: this still doesn't always report the right values ... */ 
     15178+       if (m > 32) 
     15179+               m |= 0xe0; 
     15180+       else 
     15181+               m &= ~0xe0; 
     15182+ 
     15183+       return m + 29; 
     15184+} 
     15185+ 
     15186+/* return the bitmap weight from the all/upper/lower bins */ 
     15187+static inline u8 spectral_bitmap_weight(u8 *bins) 
     15188+{ 
     15189+       return bins[0] & 0x3f; 
     15190+} 
     15191+ 
     15192+/* FFT sample format given to userspace via debugfs. 
     15193+ * 
     15194+ * Please keep the type/length at the front position and change 
     15195+ * other fields after adding another sample type 
     15196+ * 
     15197+ * TODO: this might need rework when switching to nl80211-based 
     15198+ * interface. 
     15199+ */ 
     15200+enum ath_fft_sample_type { 
     15201+       ATH_FFT_SAMPLE_HT20 = 1, 
     15202+       ATH_FFT_SAMPLE_HT20_40, 
     15203+}; 
     15204+ 
     15205+struct fft_sample_tlv { 
     15206+       u8 type;        /* see ath_fft_sample */ 
     15207+       __be16 length; 
     15208+       /* type dependent data follows */ 
     15209+} __packed; 
     15210+ 
     15211+struct fft_sample_ht20 { 
     15212+       struct fft_sample_tlv tlv; 
     15213+ 
     15214+       u8 max_exp; 
     15215+ 
     15216+       __be16 freq; 
     15217+       s8 rssi; 
     15218+       s8 noise; 
     15219+ 
     15220+       __be16 max_magnitude; 
     15221+       u8 max_index; 
     15222+       u8 bitmap_weight; 
     15223+ 
     15224+       __be64 tsf; 
     15225+ 
     15226+       u8 data[SPECTRAL_HT20_NUM_BINS]; 
     15227+} __packed; 
     15228+ 
     15229+struct fft_sample_ht20_40 { 
     15230+       struct fft_sample_tlv tlv; 
     15231+ 
     15232+       u8 channel_type; 
     15233+       __be16 freq; 
     15234+ 
     15235+       s8 lower_rssi; 
     15236+       s8 upper_rssi; 
     15237+ 
     15238+       __be64 tsf; 
     15239+ 
     15240+       s8 lower_noise; 
     15241+       s8 upper_noise; 
     15242+ 
     15243+       __be16 lower_max_magnitude; 
     15244+       __be16 upper_max_magnitude; 
     15245+ 
     15246+       u8 lower_max_index; 
     15247+       u8 upper_max_index; 
     15248+ 
     15249+       u8 lower_bitmap_weight; 
     15250+       u8 upper_bitmap_weight; 
     15251+ 
     15252+       u8 max_exp; 
     15253+ 
     15254+       u8 data[SPECTRAL_HT20_40_NUM_BINS]; 
     15255+} __packed; 
     15256+ 
     15257+void ath9k_spectral_init_debug(struct ath_softc *sc); 
     15258+void ath9k_spectral_deinit_debug(struct ath_softc *sc); 
     15259+ 
     15260+void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw); 
     15261+int ath9k_spectral_scan_config(struct ieee80211_hw *hw, 
     15262+                              enum spectral_mode spectral_mode); 
     15263+ 
     15264+#ifdef CPTCFG_ATH9K_DEBUGFS 
     15265+int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr, 
     15266+                   struct ath_rx_status *rs, u64 tsf); 
     15267+#else 
     15268+static inline int ath_process_fft(struct ath_softc *sc, 
     15269+                                 struct ieee80211_hdr *hdr, 
     15270+                                 struct ath_rx_status *rs, u64 tsf) 
     15271+{ 
     15272+       return 0; 
     15273+} 
     15274+#endif /* CPTCFG_ATH9K_DEBUGFS */ 
     15275+ 
     15276+#endif /* SPECTRAL_H */ 
     15277--- a/include/net/mac80211.h 
     15278+++ b/include/net/mac80211.h 
     15279@@ -1566,6 +1566,9 @@ enum ieee80211_hw_flags { 
     15280  * @extra_tx_headroom: headroom to reserve in each transmit skb 
     15281  *     for use by the driver (e.g. for transmit headers.) 
     15282  * 
     15283+ * @extra_beacon_tailroom: tailroom to reserve in each beacon tx skb. 
     15284+ *     Can be used by drivers to add extra IEs. 
     15285+ * 
     15286  * @channel_change_time: time (in microseconds) it takes to change channels. 
     15287  * 
     15288  * @max_signal: Maximum value for signal (rssi) in RX information, used 
     15289@@ -1644,6 +1647,7 @@ struct ieee80211_hw { 
     15290        void *priv; 
     15291        u32 flags; 
     15292        unsigned int extra_tx_headroom; 
     15293+       unsigned int extra_beacon_tailroom; 
     15294        int channel_change_time; 
     15295        int vif_data_size; 
     15296        int sta_data_size; 
     15297@@ -4595,4 +4599,49 @@ bool ieee80211_tx_prepare_skb(struct iee 
     15298                              struct ieee80211_vif *vif, struct sk_buff *skb, 
     15299                              int band, struct ieee80211_sta **sta); 
     15300  
     15301+/** 
     15302+ * struct ieee80211_noa_data - holds temporary data for tracking P2P NoA state 
     15303+ * 
     15304+ * @next_tsf: TSF timestamp of the next absent state change 
     15305+ * @has_next_tsf: next absent state change event pending 
     15306+ * 
     15307+ * @absent: descriptor bitmask, set if GO is currently absent 
     15308+ * 
     15309+ * private: 
     15310+ * 
     15311+ * @count: count fields from the NoA descriptors 
     15312+ * @desc: adjusted data from the NoA 
     15313+ */ 
     15314+struct ieee80211_noa_data { 
     15315+       u32 next_tsf; 
     15316+       bool has_next_tsf; 
     15317+ 
     15318+       u8 absent; 
     15319+ 
     15320+       u8 count[IEEE80211_P2P_NOA_DESC_MAX]; 
     15321+       struct { 
     15322+               u32 start; 
     15323+               u32 duration; 
     15324+               u32 interval; 
     15325+       } desc[IEEE80211_P2P_NOA_DESC_MAX]; 
     15326+}; 
     15327+ 
     15328+/** 
     15329+ * ieee80211_parse_p2p_noa - initialize NoA tracking data from P2P IE 
     15330+ * 
     15331+ * @attr: P2P NoA IE 
     15332+ * @data: NoA tracking data 
     15333+ * @tsf: current TSF timestamp 
     15334+ */ 
     15335+int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr, 
     15336+                           struct ieee80211_noa_data *data, u32 tsf); 
     15337+ 
     15338+/** 
     15339+ * ieee80211_update_p2p_noa - get next pending P2P GO absent state change 
     15340+ * 
     15341+ * @data: NoA tracking data 
     15342+ * @tsf: current TSF timestamp 
     15343+ */ 
     15344+void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf); 
     15345+ 
     15346 #endif /* MAC80211_H */ 
     15347--- a/drivers/net/wireless/ath/ath9k/hw-ops.h 
     15348+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h 
     15349@@ -49,9 +49,10 @@ static inline bool ath9k_hw_calibrate(st 
     15350        return ath9k_hw_ops(ah)->calibrate(ah, chan, rxchainmask, longcal); 
     15351 } 
     15352  
     15353-static inline bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked) 
     15354+static inline bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked, 
     15355+                                  u32 *sync_cause_p) 
     15356 { 
     15357-       return ath9k_hw_ops(ah)->get_isr(ah, masked); 
     15358+       return ath9k_hw_ops(ah)->get_isr(ah, masked, sync_cause_p); 
     15359 } 
     15360  
     15361 static inline void ath9k_hw_set_txdesc(struct ath_hw *ah, void *ds, 
  • trunk/package/kernel/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch

    r39054 r39138  
    99  
    1010 #include "hw.h" 
    11 @@ -504,8 +505,16 @@ static int ath9k_hw_init_macaddr(struct  
     11@@ -462,8 +463,16 @@ static int ath9k_hw_init_macaddr(struct  
    1212                common->macaddr[2 * i] = eeval >> 8; 
    1313                common->macaddr[2 * i + 1] = eeval & 0xff; 
  • trunk/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

    r39001 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -867,6 +867,7 @@ static const struct ieee80211_iface_limi 
     3@@ -865,6 +865,7 @@ static const struct ieee80211_iface_limi 
    44 #endif 
    55                                 BIT(NL80211_IFTYPE_AP) | 
  • trunk/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch

    r38783 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1782,6 +1782,53 @@ void ath9k_deinit_debug(struct ath_softc 
    4         } 
     3@@ -1528,6 +1528,53 @@ void ath9k_deinit_debug(struct ath_softc 
     4        ath9k_spectral_deinit_debug(sc); 
    55 } 
    66  
     
    5555 { 
    5656        struct ath_common *common = ath9k_hw_common(ah); 
    57 @@ -1800,6 +1847,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    58         ath9k_dfs_init_debug(sc); 
     57@@ -1547,6 +1594,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5958        ath9k_tx99_init_debug(sc); 
     59        ath9k_spectral_init_debug(sc); 
    6060  
    6161+       debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
  • trunk/package/kernel/mac80211/patches/501-ath9k-eeprom_endianess.patch

    r39054 r39138  
    7272--- a/drivers/net/wireless/ath/ath9k/hw.h 
    7373+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    74 @@ -706,6 +706,7 @@ enum ath_cal_list { 
     74@@ -707,6 +707,7 @@ enum ath_cal_list { 
    7575 #define AH_USE_EEPROM   0x1 
    7676 #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */ 
     
    8282--- a/drivers/net/wireless/ath/ath9k/init.c 
    8383+++ b/drivers/net/wireless/ath/ath9k/init.c 
    84 @@ -721,6 +721,8 @@ static int ath9k_init_softc(u16 devid, s 
     84@@ -719,6 +719,8 @@ static int ath9k_init_softc(u16 devid, s 
    8585                ah->is_clk_25mhz = pdata->is_clk_25mhz; 
    8686                ah->get_mac_revision = pdata->get_mac_revision; 
  • trunk/package/kernel/mac80211/patches/502-ath9k_ahb_init.patch

    r39001 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -1110,23 +1110,23 @@ static int __init ath9k_init(void) 
     3@@ -1108,23 +1108,23 @@ static int __init ath9k_init(void) 
    44                goto err_out; 
    55        } 
  • trunk/package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

    r39054 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -2010,8 +2010,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     3@@ -1978,8 +1978,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    44                REG_WRITE(ah, AR_OBS, 8); 
    55  
  • trunk/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch

    r38354 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -113,7 +113,7 @@ int ath_descdma_setup(struct ath_softc * 
    4  /* RX / TX */ 
    5  /***********/ 
     3@@ -90,7 +90,7 @@ int ath_descdma_setup(struct ath_softc * 
     4                (_l) &= ((_sz) - 1);            \ 
     5        } while (0) 
    66  
    77-#define ATH_RXBUF               512 
  • trunk/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch

    r38854 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1829,6 +1829,52 @@ static const struct file_operations fops 
     3@@ -1575,6 +1575,52 @@ static const struct file_operations fops 
    44        .owner = THIS_MODULE 
    55 }; 
     
    5454 { 
    5555        struct ath_common *common = ath9k_hw_common(ah); 
    56 @@ -1849,6 +1895,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     56@@ -1596,6 +1642,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5757  
    5858        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
  • trunk/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch

    r39054 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -724,6 +724,7 @@ int ath9k_hw_init(struct ath_hw *ah) 
     3@@ -682,6 +682,7 @@ int ath9k_hw_init(struct ath_hw *ah) 
    44        case AR9300_DEVID_AR9462: 
    55        case AR9485_DEVID_AR1111: 
  • trunk/package/kernel/mac80211/patches/520-mac80211_cur_txpower.patch

    r38918 r39138  
    11--- a/include/net/mac80211.h 
    22+++ b/include/net/mac80211.h 
    3 @@ -1659,6 +1659,7 @@ struct ieee80211_hw { 
     3@@ -1663,6 +1663,7 @@ struct ieee80211_hw { 
    44        u8 max_tx_aggregation_subframes; 
    55        u8 offchannel_tx_hw_queue; 
  • trunk/package/kernel/mac80211/patches/521-ath9k_cur_txpower.patch

    r39054 r39138  
    1515 out: 
    1616        spin_unlock_bh(&sc->sc_pcu_lock); 
    17 @@ -1345,6 +1349,7 @@ static int ath9k_config(struct ieee80211 
     17@@ -1347,6 +1351,7 @@ static int ath9k_config(struct ieee80211 
    1818                sc->config.txpowlimit = 2 * conf->power_level; 
    1919                ath9k_cmn_update_txpow(ah, sc->curtxpow, 
  • trunk/package/kernel/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch

    r39054 r39138  
    1111--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1212+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    13 @@ -2841,7 +2841,7 @@ void ath9k_hw_apply_txpower(struct ath_h 
     13@@ -2809,7 +2809,7 @@ void ath9k_hw_apply_txpower(struct ath_h 
    1414        channel = chan->chan; 
    1515        chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER); 
     
    2222--- a/drivers/net/wireless/ath/ath9k/main.c 
    2323+++ b/drivers/net/wireless/ath/ath9k/main.c 
    24 @@ -1345,7 +1345,10 @@ static int ath9k_config(struct ieee80211 
     24@@ -1347,7 +1347,10 @@ static int ath9k_config(struct ieee80211 
    2525        } 
    2626  
  • trunk/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch

    r39054 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -557,6 +557,9 @@ struct ath9k_wow_pattern { 
     3@@ -559,6 +559,9 @@ static inline int ath9k_dump_btcoex(stru 
    44 void ath_init_leds(struct ath_softc *sc); 
    55 void ath_deinit_leds(struct ath_softc *sc); 
     
    1111 static inline void ath_init_leds(struct ath_softc *sc) 
    1212 { 
    13 @@ -732,6 +735,13 @@ enum spectral_mode { 
    14         SPECTRAL_CHANSCAN, 
    15  }; 
     13@@ -704,6 +707,13 @@ enum sc_op_flags { 
     14 #define PS_BEACON_SYNC            BIT(4) 
     15 #define PS_WAIT_FOR_ANI           BIT(5) 
    1616  
    1717+struct ath_led { 
     
    2525        struct ieee80211_hw *hw; 
    2626        struct device *dev; 
    27 @@ -774,9 +784,8 @@ struct ath_softc { 
     27@@ -746,9 +756,8 @@ struct ath_softc { 
    2828        struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; 
    2929  
     
    163163--- a/drivers/net/wireless/ath/ath9k/init.c 
    164164+++ b/drivers/net/wireless/ath/ath9k/init.c 
    165 @@ -1016,7 +1016,7 @@ int ath9k_init_device(u16 devid, struct  
     165@@ -1014,7 +1014,7 @@ int ath9k_init_device(u16 devid, struct  
    166166  
    167167 #ifdef CPTCFG_MAC80211_LEDS 
     
    174174--- a/drivers/net/wireless/ath/ath9k/debug.c 
    175175+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    176 @@ -1874,6 +1874,61 @@ static const struct file_operations fops 
     176@@ -1620,6 +1620,61 @@ static const struct file_operations fops 
    177177        .llseek = default_llseek, 
    178178 }; 
     
    236236 int ath9k_init_debug(struct ath_hw *ah) 
    237237 { 
    238 @@ -1897,6 +1952,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
     238@@ -1644,6 +1699,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
    239239                            &fops_eeprom); 
    240240        debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 
  • trunk/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch

    r39054 r39138  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1930,6 +1930,50 @@ static const struct file_operations fops 
     3@@ -1676,6 +1676,50 @@ static const struct file_operations fops 
    44 #endif 
    55  
     
    5252 { 
    5353        struct ath_common *common = ath9k_hw_common(ah); 
    54 @@ -1956,6 +2000,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     54@@ -1703,6 +1747,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5555        debugfs_create_file("gpio_led", S_IWUSR, 
    5656                           sc->debug.debugfs_phy, sc, &fops_gpio_led); 
     
    7676        u32 magic; 
    7777        u16 devid; 
    78 @@ -744,6 +750,8 @@ struct ath_hw { 
     78@@ -745,6 +751,8 @@ struct ath_hw { 
    7979        u32 rfkill_polarity; 
    8080        u32 ah_flags; 
     
    8585        bool htc_reset_init; 
    8686  
    87 @@ -995,6 +1003,7 @@ void ath9k_hw_check_nav(struct ath_hw *a 
     87@@ -996,6 +1004,7 @@ void ath9k_hw_check_nav(struct ath_hw *a 
    8888 bool ath9k_hw_check_alive(struct ath_hw *ah); 
    8989  
     
    9191+void ath9k_hw_update_diag(struct ath_hw *ah); 
    9292  
    93  #ifdef CPTCFG_ATH9K_DEBUGFS 
    94  void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause); 
     93 /* Generic hw timer primitives */ 
     94 struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, 
    9595--- a/drivers/net/wireless/ath/ath9k/hw.c 
    9696+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    97 @@ -1854,6 +1854,20 @@ fail: 
     97@@ -1822,6 +1822,20 @@ fail: 
    9898        return -EINVAL; 
    9999 } 
     
    116116                   struct ath9k_hw_cal_data *caldata, bool fastcc) 
    117117 { 
    118 @@ -2056,6 +2070,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     118@@ -2024,6 +2038,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    119119        } 
    120120  
     
    126126--- a/drivers/net/wireless/ath/ath9k/main.c 
    127127+++ b/drivers/net/wireless/ath/ath9k/main.c 
    128 @@ -574,6 +574,11 @@ irqreturn_t ath_isr(int irq, void *dev) 
    129         ath9k_hw_getisr(ah, &status);   /* NB: clears ISR too */ 
     128@@ -576,6 +576,11 @@ irqreturn_t ath_isr(int irq, void *dev) 
     129        ath9k_debug_sync_cause(sc, sync_cause); 
    130130        status &= ah->imask;    /* discard unasked-for bits */ 
    131131  
  • trunk/package/kernel/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch

    r39054 r39138  
    1212--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1313+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    14 @@ -2441,17 +2441,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
     14@@ -2409,17 +2409,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    1515        } 
    1616  
     
    4848--- a/drivers/net/wireless/ath/ath9k/hw.h 
    4949+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    50 @@ -914,6 +914,8 @@ struct ath_hw { 
     50@@ -915,6 +915,8 @@ struct ath_hw { 
    5151        bool is_clk_25mhz; 
    5252        int (*get_mac_revision)(void); 
     
    5959--- a/drivers/net/wireless/ath/ath9k/init.c 
    6060+++ b/drivers/net/wireless/ath/ath9k/init.c 
    61 @@ -721,6 +721,8 @@ static int ath9k_init_softc(u16 devid, s 
     61@@ -719,6 +719,8 @@ static int ath9k_init_softc(u16 devid, s 
    6262                ah->is_clk_25mhz = pdata->is_clk_25mhz; 
    6363                ah->get_mac_revision = pdata->get_mac_revision; 
  • trunk/package/kernel/mac80211/patches/550-ath9k_entropy_from_adc.patch

    r39054 r39138  
    99  * @spectral_scan_trigger: trigger a spectral scan run 
    1010  * @spectral_scan_wait: wait for a spectral scan run to finish 
    11 @@ -683,6 +684,7 @@ struct ath_hw_ops { 
     11@@ -684,6 +685,7 @@ struct ath_hw_ops { 
    1212                        struct ath_hw_antcomb_conf *antconf); 
    1313        void (*antdiv_comb_conf_set)(struct ath_hw *ah, 
     
    5656--- a/drivers/net/wireless/ath/ath9k/init.c 
    5757+++ b/drivers/net/wireless/ath/ath9k/init.c 
    58 @@ -847,7 +847,8 @@ static void ath9k_init_txpower_limits(st 
     58@@ -845,7 +845,8 @@ static void ath9k_init_txpower_limits(st 
    5959        if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) 
    6060                ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ); 
     
    6666  
    6767 void ath9k_reload_chainmask_settings(struct ath_softc *sc) 
    68 @@ -978,6 +979,18 @@ void ath9k_set_hw_capab(struct ath_softc 
     68@@ -976,6 +977,18 @@ static void ath9k_set_hw_capab(struct at 
    6969        SET_IEEE80211_PERM_ADDR(hw, common->macaddr); 
    7070 } 
     
    8585                    const struct ath_bus_ops *bus_ops) 
    8686 { 
    87 @@ -1023,6 +1036,8 @@ int ath9k_init_device(u16 devid, struct  
     87@@ -1021,6 +1034,8 @@ int ath9k_init_device(u16 devid, struct  
    8888                ARRAY_SIZE(ath9k_tpt_blink)); 
    8989 #endif 
     
    9696--- a/drivers/net/wireless/ath/ath9k/hw-ops.h 
    9797+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h 
    98 @@ -94,6 +94,12 @@ static inline void ath9k_hw_tx99_set_txp 
     98@@ -95,6 +95,12 @@ static inline void ath9k_hw_tx99_set_txp 
    9999                ath9k_hw_ops(ah)->tx99_set_txpower(ah, power); 
    100100 } 
Note: See TracChangeset for help on using the changeset viewer.