mac80211: update to latest version, fix tx gain patch
authorFelix Fietkau <nbd@openwrt.org>
Tue, 10 Jul 2012 00:21:25 +0000 (00:21 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 10 Jul 2012 00:21:25 +0000 (00:21 +0000)
SVN-Revision: 32655

79 files changed:
package/mac80211/Makefile
package/mac80211/patches/000-disable_ethernet.patch
package/mac80211/patches/001-disable_b44.patch
package/mac80211/patches/002-disable_rfkill.patch
package/mac80211/patches/005-disable_ssb_build.patch
package/mac80211/patches/006-disable_bcma_build.patch
package/mac80211/patches/007-remove_misc_drivers.patch
package/mac80211/patches/010-no_pcmcia.patch
package/mac80211/patches/011-no_sdio.patch
package/mac80211/patches/013-disable_b43_nphy.patch
package/mac80211/patches/015-remove-rt2x00-options.patch
package/mac80211/patches/019-remove_ath5k_pci_option.patch
package/mac80211/patches/021-add_include_for_bcma.patch
package/mac80211/patches/023-ath9k_disable_btcoex.patch
package/mac80211/patches/060-compat_add_module_pci_driver.patch
package/mac80211/patches/071-add_codel_ifdef.patch
package/mac80211/patches/110-disable_usb_compat.patch
package/mac80211/patches/130-mesh_pathtbl_backport.patch
package/mac80211/patches/300-pending_work.patch
package/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch
package/mac80211/patches/405-regd_no_assoc_hints.patch
package/mac80211/patches/412-mac80211_allow_adhoc_and_ap.patch
package/mac80211/patches/440-ath5k_channel_bw_debugfs.patch
package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
package/mac80211/patches/501-ath9k-eeprom_endianess.patch
package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
package/mac80211/patches/513-mac80211_reduce_txqueuelen.patch
package/mac80211/patches/520-mac80211_cur_txpower.patch
package/mac80211/patches/521-ath9k_cur_txpower.patch
package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch
package/mac80211/patches/530-ath9k_fix_initvals.patch
package/mac80211/patches/540-ath9k_extra_leds.patch
package/mac80211/patches/550-mac80211_optimize_mcs_rate_mask.patch
package/mac80211/patches/561-ath9k_antenna_mask_validate.patch
package/mac80211/patches/563-ath9k_enable_ar9340_ani.patch
package/mac80211/patches/564-ath9k_fix_ani_update.patch [deleted file]
package/mac80211/patches/564-ath9k_revert_initval_change.patch [new file with mode: 0644]
package/mac80211/patches/565-ath9k_fix_txgain.patch [new file with mode: 0644]
package/mac80211/patches/565-ath9k_update_ar9340_initvals.patch [deleted file]
package/mac80211/patches/566-ath9k_deduplicate_initvals.patch [deleted file]
package/mac80211/patches/567-ath9k_revert_initval_change.patch [deleted file]
package/mac80211/patches/568-ath9k_fix_ar9340_tx_gain.patch [deleted file]
package/mac80211/patches/570-ath9k-define-DEVID-for-QCA955x.patch [deleted file]
package/mac80211/patches/570-ath9k_config_qlen.patch
package/mac80211/patches/571-ath9k-define-MAC-version-for-AR9550.patch [deleted file]
package/mac80211/patches/572-ath9k-set-MAC-version-for-AR9550.patch [deleted file]
package/mac80211/patches/573-ath9k-add-platform_device_id-for-AR9550.patch [deleted file]
package/mac80211/patches/574-ath9k-add-BB-name-string-for-AR9550.patch [deleted file]
package/mac80211/patches/575-ath9k-clear-pciexpress-flag-for-AR9550.patch [deleted file]
package/mac80211/patches/576-ath9k-enable-TX-RX-data-byte-swap-for-AR9550.patch [deleted file]
package/mac80211/patches/577-ath9k-add-initvals-for-AR9550.patch [deleted file]
package/mac80211/patches/578-ath9k-add-mode-register-initialization-code-for-AR95.patch [deleted file]
package/mac80211/patches/579-ath9k-read-spur-frequency-information-from-eeprom-fo.patch [deleted file]
package/mac80211/patches/580-ath9k-fix-XPABIASLEVEL-settings-for-AR9550.patch [deleted file]
package/mac80211/patches/581-ath9k-fix-antenna-control-configuration-for-AR9550.patch [deleted file]
package/mac80211/patches/582-ath9k-fix-PAPRD-settings-for-AR9550.patch [deleted file]
package/mac80211/patches/583-ath9k-fix-RF-channel-frequency-configuration-for-AR9.patch [deleted file]
package/mac80211/patches/584-ath9k-disable-SYNC_HOST1_FATAL-interrupts-for-AR9550.patch [deleted file]
package/mac80211/patches/585-ath9k-skip-internal-regulator-configuration-for-AR95.patch [deleted file]
package/mac80211/patches/586-ath9k-fix-PLL-initialization-for-AR9550.patch [deleted file]
package/mac80211/patches/587-ath9k-enable-PLL-workaround-for-AR9550.patch [deleted file]
package/mac80211/patches/588-ath9k-set-4ADDRESS-bit-in-RX-filter-for-AR9550.patch [deleted file]
package/mac80211/patches/589-ath9k-enable-support-for-AR9550.patch [deleted file]
package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch
package/mac80211/patches/601-rt2x00-set_pci_mwi.patch
package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch
package/mac80211/patches/605-rt2x00-pci-eeprom.patch
package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
package/mac80211/patches/608-add_platform_data_mac_addr.patch
package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
package/mac80211/patches/846-brcmsmac-remove-some-unnessessacry-casts-and-void-po.patch
package/mac80211/patches/847-brcmsmac-add-suome-conditions-for-the-bcm4716-again.patch
package/mac80211/patches/848-brcmsmac-some-more-fixes-for-different-core-revs.patch
package/mac80211/patches/849-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch
package/mac80211/patches/850-brcmsmac-add-support-for-BCM43224.patch
package/mac80211/patches/851-brcmsmac-start-adding-support-for-core-rev-28.patch

index 0e2b25c..7143612 100644 (file)
@@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=2012-06-14
-PKG_RELEASE:=2
+PKG_VERSION:=2012-07-06
+PKG_RELEASE:=1
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
-PKG_MD5SUM:=009fd7aa420693e30df9090cee9ea189
+PKG_MD5SUM:=71e1ba84a7d1c3ab69ee1b68fa9e1269
 
 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
index 2c5e3d0..08f908b 100644 (file)
@@ -1,6 +1,6 @@
 --- a/Makefile
 +++ b/Makefile
-@@ -44,9 +44,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) +=
+@@ -45,9 +45,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) +=
  
  obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/
  
index aae8ef9..2bcead9 100644 (file)
@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -371,8 +371,8 @@ export CONFIG_B43_BCMA_EXTRA=y
+@@ -376,8 +376,8 @@ export CONFIG_B43_BCMA_EXTRA=y
  
  export CONFIG_P54_PCI=m
  
index 4660909..f977c96 100644 (file)
@@ -9,7 +9,7 @@
  
  ifeq ($(CONFIG_MAC80211),y)
  $(error "ERROR: you have MAC80211 compiled into the kernel, CONFIG_MAC80211=y, as such you cannot replace its mac80211 driver. You need this set to CONFIG_MAC80211=m. If you are using Fedora upgrade your kernel as later version should this set as modular. For further information on Fedora see https://bugzilla.redhat.com/show_bug.cgi?id=470143. If you are using your own kernel recompile it and make mac80211 modular")
-@@ -683,10 +683,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27
+@@ -688,10 +688,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27
  # We need the backported rfkill module on kernel < 2.6.31.
  # In more recent kernel versions use the in kernel rfkill module.
  ifdef CONFIG_COMPAT_KERNEL_2_6_31
index 23ce924..4bf9797 100644 (file)
@@ -1,6 +1,6 @@
 --- a/Makefile
 +++ b/Makefile
-@@ -44,7 +44,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) +=
+@@ -45,7 +45,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) +=
  
  obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/
  
@@ -19,7 +19,7 @@
  else
  include $(KLIB_BUILD)/.config
  endif
-@@ -347,7 +347,8 @@ export CONFIG_IPW2200_QOS=y
+@@ -352,7 +352,8 @@ export CONFIG_IPW2200_QOS=y
  # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
  endif #CONFIG_WIRELESS_EXT
  
@@ -29,7 +29,7 @@
  # Sonics Silicon Backplane
  export CONFIG_SSB_SPROM=y
  
-@@ -360,7 +361,7 @@ endif #CONFIG_PCMCIA
+@@ -365,7 +366,7 @@ endif #CONFIG_PCMCIA
  # export CONFIG_SSB_DEBUG=y
  export CONFIG_SSB_DRIVER_PCICORE=y
  export CONFIG_B43_SSB=y
@@ -38,7 +38,7 @@
  
  export CONFIG_BCMA=m
  export CONFIG_BCMA_BLOCKIO=y
-@@ -577,7 +578,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
+@@ -582,7 +583,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
  
  ifdef CONFIG_MMC
  
index a0265ac..1b53070 100644 (file)
@@ -1,6 +1,6 @@
 --- a/Makefile
 +++ b/Makefile
-@@ -44,7 +44,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) +=
+@@ -45,7 +45,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) +=
  
  obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/
  
@@ -10,7 +10,7 @@
  ifeq ($(CONFIG_STAGING_EXCLUDE_BUILD),)
 --- a/config.mk
 +++ b/config.mk
-@@ -363,12 +363,12 @@ export CONFIG_SSB_DRIVER_PCICORE=y
+@@ -368,12 +368,12 @@ export CONFIG_SSB_DRIVER_PCICORE=y
  export CONFIG_B43_SSB=y
  endif #__CONFIG_SSB
  
index b89089d..d22bee4 100644 (file)
@@ -9,7 +9,7 @@
  endif #CONFIG_STAGING
  
  # mac80211 test driver
-@@ -400,15 +400,15 @@ endif #CONFIG_CRC_ITU_T
+@@ -405,15 +405,15 @@ endif #CONFIG_CRC_ITU_T
  export CONFIG_MWL8K=m
  
  # Ethernet drivers go here
@@ -32,7 +32,7 @@
  endif #CONFIG_COMPAT_KERNEL_2_6_28
  
  ifdef CONFIG_WIRELESS_EXT
-@@ -469,21 +469,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
+@@ -474,21 +474,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
  # Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER
  # it also requires new RNDIS_HOST and CDC_ETHER modules which we add
  ifdef CONFIG_COMPAT_KERNEL_2_6_29
index e9b5ab7..6bde2d9 100644 (file)
@@ -9,7 +9,7 @@
  # export CONFIG_SSB=m
  else
  include $(KLIB_BUILD)/.config
-@@ -298,7 +298,7 @@ export CONFIG_B43=m
+@@ -303,7 +303,7 @@ export CONFIG_B43=m
  export CONFIG_B43_HWRNG=y
  export CONFIG_B43_PCI_AUTOSELECT=y
  ifdef CONFIG_PCMCIA
index 3800747..19df10b 100644 (file)
@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -579,7 +579,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
+@@ -584,7 +584,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv
  ifdef CONFIG_MMC
  
  # export CONFIG_SSB_SDIOHOST=y
index ae5be9f..b959804 100644 (file)
@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -304,8 +304,8 @@ ifdef CONFIG_MAC80211_LEDS
+@@ -309,8 +309,8 @@ ifdef CONFIG_MAC80211_LEDS
  export CONFIG_B43_LEDS=y
  endif #CONFIG_MAC80211_LEDS
  export CONFIG_B43_PHY_LP=y
index 5b029c4..3762f73 100644 (file)
@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -379,7 +379,7 @@ export CONFIG_RTL8180=m
+@@ -384,7 +384,7 @@ export CONFIG_RTL8180=m
  
  export CONFIG_ADM8211=m
  
@@ -9,7 +9,7 @@
  export CONFIG_RT2400PCI=m
  export CONFIG_RT2500PCI=m
  ifdef CONFIG_CRC_CCITT
-@@ -525,7 +525,7 @@ export CONFIG_RT2800USB_RT35XX=y
+@@ -530,7 +530,7 @@ export CONFIG_RT2800USB_RT35XX=y
  export CONFIG_RT2800USB_RT53XX=y
  export CONFIG_RT2800USB_UNKNOWN=y
  endif #CONFIG_CRC_CCITT
index 581fbfc..0dd905c 100644 (file)
@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -276,7 +276,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27
+@@ -281,7 +281,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27
  # PCI Drivers
  ifdef CONFIG_PCI
  
index 21b624e..e2e856e 100644 (file)
@@ -1,8 +1,8 @@
 --- a/include/linux/compat-3.0.h
 +++ b/include/linux/compat-3.0.h
-@@ -7,6 +7,8 @@
+@@ -36,6 +36,8 @@ static inline struct page *shmem_read_ma
+ #endif
  
- #include <linux/rcupdate.h>
  
 +#include <linux/mod_devicetable.h>
 +
index 36645fc..900f030 100644 (file)
@@ -7,5 +7,5 @@
 -export CONFIG_ATH9K_BTCOEX_SUPPORT=y
 +# export CONFIG_ATH9K_BTCOEX_SUPPORT=y
  
- ifndef CONFIG_COMPAT_KERNEL_2_6_27
- export CONFIG_ATH6KL=m
+ # WIL6210 requires MSI only available >= 2.6.30
+ ifndef CONFIG_COMPAT_KERNEL_2_6_30
index 6ddfc7d..8a35d4e 100644 (file)
@@ -1,6 +1,6 @@
 --- a/include/linux/compat-3.4.h
 +++ b/include/linux/compat-3.4.h
-@@ -77,6 +77,19 @@ static inline void eth_hw_addr_random(st
+@@ -81,6 +81,19 @@ static inline void eth_hw_addr_random(st
        module_driver(__pci_driver, pci_register_driver, \
                       pci_unregister_driver)
  
index 45a599c..86b4151 100644 (file)
@@ -9,7 +9,7 @@
  /*
   * This backports:
   *
-@@ -106,6 +108,7 @@ struct vga_switcheroo_client_ops {
+@@ -135,6 +137,7 @@ static inline int compat_vga_switcheroo_
  
  #define SIZE_MAX    (~(size_t)0)
  
index 6f67400..35f5814 100644 (file)
@@ -33,7 +33,7 @@
  #endif
 --- a/config.mk
 +++ b/config.mk
-@@ -507,7 +507,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
+@@ -512,7 +512,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29
  # This activates a threading fix for usb urb.
  # this is mainline commit: b3e670443b7fb8a2d29831b62b44a039c283e351
  # This fix will be included in some stable releases.
index 817060d..bf6635a 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net/mac80211/mesh_pathtbl.c
 +++ b/net/mac80211/mesh_pathtbl.c
-@@ -826,7 +826,6 @@ static void table_flush_by_iface(struct 
+@@ -817,7 +817,6 @@ static void table_flush_by_iface(struct 
        struct hlist_node *p;
        int i;
  
index 6062e9d..c8dce03 100644 (file)
---- a/drivers/net/wireless/ath/ath9k/ani.c
-+++ b/drivers/net/wireless/ath/ath9k/ani.c
-@@ -104,11 +104,6 @@ static const struct ani_cck_level_entry 
- #define ATH9K_ANI_CCK_DEF_LEVEL \
-       2 /* default level - matches the INI settings */
+--- a/drivers/net/wireless/ath/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+@@ -360,7 +360,7 @@ void ath_tx_aggr_sleep(struct ieee80211_
+ struct ath_vif {
+       int av_bslot;
+-      bool is_bslot_active, primary_sta_vif;
++      bool primary_sta_vif;
+       __le64 tsf_adjust; /* TSF adjustment for staggered beacons */
+       struct ath_buf *av_bcbuf;
+ };
+@@ -386,6 +386,7 @@ struct ath_beacon_config {
+       u16 dtim_period;
+       u16 bmiss_timeout;
+       u8 dtim_count;
++      bool enable_beacon;
+ };
  
--static bool use_new_ani(struct ath_hw *ah)
--{
--      return AR_SREV_9300_20_OR_LATER(ah) || modparam_force_new_ani;
--}
--
- static void ath9k_hw_update_mibstats(struct ath_hw *ah,
-                                    struct ath9k_mib_stats *stats)
+ struct ath_beacon {
+@@ -397,7 +398,6 @@ struct ath_beacon {
+       u32 beaconq;
+       u32 bmisscnt;
+-      u32 ast_be_xmit;
+       u32 bc_tstamp;
+       struct ieee80211_vif *bslot[ATH_BCBUF];
+       int slottime;
+@@ -411,12 +411,14 @@ struct ath_beacon {
+       bool tx_last;
+ };
+-void ath_beacon_tasklet(unsigned long data);
+-void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif);
+-int ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_vif *vif);
+-void ath_beacon_return(struct ath_softc *sc, struct ath_vif *avp);
+-int ath_beaconq_config(struct ath_softc *sc);
+-void ath_set_beacon(struct ath_softc *sc);
++void ath9k_beacon_tasklet(unsigned long data);
++bool ath9k_allow_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif);
++void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif,
++                       u32 changed);
++void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif);
++void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif);
++void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif);
++void ath9k_set_beacon(struct ath_softc *sc);
+ void ath9k_set_beaconing_status(struct ath_softc *sc, bool status);
+ /*******************/
+@@ -442,9 +444,12 @@ void ath_rx_poll(unsigned long data);
+ void ath_start_rx_poll(struct ath_softc *sc, u8 nbeacon);
+ void ath_paprd_calibrate(struct work_struct *work);
+ void ath_ani_calibrate(unsigned long data);
+-void ath_start_ani(struct ath_common *common);
++void ath_start_ani(struct ath_softc *sc);
++void ath_stop_ani(struct ath_softc *sc);
++void ath_check_ani(struct ath_softc *sc);
+ int ath_update_survey_stats(struct ath_softc *sc);
+ void ath_update_survey_nf(struct ath_softc *sc, int channel);
++void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);
+ /**********/
+ /* BTCOEX */
+@@ -613,7 +618,6 @@ enum sc_op_flags {
+       SC_OP_INVALID,
+       SC_OP_BEACONS,
+       SC_OP_RXFLUSH,
+-      SC_OP_TSF_RESET,
+       SC_OP_ANI_RUN,
+       SC_OP_PRIM_STA_VIF,
+       SC_OP_HW_RESET,
+--- a/drivers/net/wireless/ath/ath9k/beacon.c
++++ b/drivers/net/wireless/ath/ath9k/beacon.c
+@@ -30,7 +30,7 @@ static void ath9k_reset_beacon_status(st
+  *  the operating mode of the station (AP or AdHoc).  Parameters are AIFS
+  *  settings and channel width min/max
+ */
+-int ath_beaconq_config(struct ath_softc *sc)
++static void ath9k_beaconq_config(struct ath_softc *sc)
  {
-@@ -122,8 +117,6 @@ static void ath9k_hw_update_mibstats(str
- static void ath9k_ani_restart(struct ath_hw *ah)
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
+@@ -38,6 +38,7 @@ int ath_beaconq_config(struct ath_softc 
+       struct ath_txq *txq;
+       ath9k_hw_get_txq_props(ah, sc->beacon.beaconq, &qi);
++
+       if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) {
+               /* Always burst out beacon and CAB traffic. */
+               qi.tqi_aifs = 1;
+@@ -56,12 +57,9 @@ int ath_beaconq_config(struct ath_softc 
+       }
+       if (!ath9k_hw_set_txq_props(ah, sc->beacon.beaconq, &qi)) {
+-              ath_err(common,
+-                      "Unable to update h/w beacon queue parameters\n");
+-              return 0;
++              ath_err(common, "Unable to update h/w beacon queue parameters\n");
+       } else {
+               ath9k_hw_resettxqueue(ah, sc->beacon.beaconq);
+-              return 1;
+       }
+ }
+@@ -70,7 +68,7 @@ int ath_beaconq_config(struct ath_softc 
+  *  up rate codes, and channel flags. Beacons are always sent out at the
+  *  lowest rate, and are not retried.
+ */
+-static void ath_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,
++static void ath9k_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,
+                            struct ath_buf *bf, int rateidx)
  {
-       struct ar5416AniState *aniState;
--      struct ath_common *common = ath9k_hw_common(ah);
--      u32 ofdm_base = 0, cck_base = 0;
+       struct sk_buff *skb = bf->bf_mpdu;
+@@ -81,8 +79,6 @@ static void ath_beacon_setup(struct ath_
+       u8 chainmask = ah->txchainmask;
+       u8 rate = 0;
  
-       if (!DO_ANI(ah))
-               return;
-@@ -131,18 +124,10 @@ static void ath9k_ani_restart(struct ath
-       aniState = &ah->curchan->ani;
-       aniState->listenTime = 0;
+-      ath9k_reset_beacon_status(sc);
+-
+       sband = &sc->sbands[common->hw->conf.channel->band];
+       rate = sband->bitrates[rateidx].hw_value;
+       if (vif->bss_conf.use_short_preamble)
+@@ -111,7 +107,7 @@ static void ath_beacon_setup(struct ath_
+       ath9k_hw_set_txdesc(ah, bf->bf_desc, &info);
+ }
  
--      if (!use_new_ani(ah)) {
--              ofdm_base = AR_PHY_COUNTMAX - ah->config.ofdm_trig_high;
--              cck_base = AR_PHY_COUNTMAX - ah->config.cck_trig_high;
--      }
+-static void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
++static void ath9k_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
+ {
+       struct ath_softc *sc = hw->priv;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+@@ -128,28 +124,22 @@ static void ath_tx_cabq(struct ieee80211
+       }
+ }
+-static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw,
+-                                         struct ieee80211_vif *vif)
++static struct ath_buf *ath9k_beacon_generate(struct ieee80211_hw *hw,
++                                           struct ieee80211_vif *vif)
+ {
+       struct ath_softc *sc = hw->priv;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+       struct ath_buf *bf;
+-      struct ath_vif *avp;
++      struct ath_vif *avp = (void *)vif->drv_priv;
+       struct sk_buff *skb;
+-      struct ath_txq *cabq;
++      struct ath_txq *cabq = sc->beacon.cabq;
+       struct ieee80211_tx_info *info;
++      struct ieee80211_mgmt *mgmt_hdr;
+       int cabq_depth;
+-      ath9k_reset_beacon_status(sc);
+-
+-      avp = (void *)vif->drv_priv;
+-      cabq = sc->beacon.cabq;
+-
+-      if ((avp->av_bcbuf == NULL) || !avp->is_bslot_active)
++      if (avp->av_bcbuf == NULL)
+               return NULL;
+-      /* Release the old beacon first */
 -
--      ath_dbg(common, ANI, "Writing ofdmbase=%u   cckbase=%u\n",
--              ofdm_base, cck_base);
+       bf = avp->av_bcbuf;
+       skb = bf->bf_mpdu;
+       if (skb) {
+@@ -159,14 +149,14 @@ static struct ath_buf *ath_beacon_genera
+               bf->bf_buf_addr = 0;
+       }
+-      /* Get a new beacon from mac80211 */
 -
-       ENABLE_REGWRITE_BUFFER(ah);
+       skb = ieee80211_beacon_get(hw, vif);
+-      bf->bf_mpdu = skb;
+       if (skb == NULL)
+               return NULL;
+-      ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp =
+-              avp->tsf_adjust;
++
++      bf->bf_mpdu = skb;
++
++      mgmt_hdr = (struct ieee80211_mgmt *)skb->data;
++      mgmt_hdr->u.beacon.timestamp = avp->tsf_adjust;
+       info = IEEE80211_SKB_CB(skb);
+       if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
+@@ -212,61 +202,52 @@ static struct ath_buf *ath_beacon_genera
+               }
+       }
  
--      REG_WRITE(ah, AR_PHY_ERR_1, ofdm_base);
--      REG_WRITE(ah, AR_PHY_ERR_2, cck_base);
-+      REG_WRITE(ah, AR_PHY_ERR_1, 0);
-+      REG_WRITE(ah, AR_PHY_ERR_2, 0);
-       REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
-       REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
+-      ath_beacon_setup(sc, vif, bf, info->control.rates[0].idx);
++      ath9k_beacon_setup(sc, vif, bf, info->control.rates[0].idx);
  
-@@ -154,110 +139,6 @@ static void ath9k_ani_restart(struct ath
-       aniState->cckPhyErrCount = 0;
+       while (skb) {
+-              ath_tx_cabq(hw, skb);
++              ath9k_tx_cabq(hw, skb);
+               skb = ieee80211_get_buffered_bc(hw, vif);
+       }
+       return bf;
  }
  
--static void ath9k_hw_ani_ofdm_err_trigger_old(struct ath_hw *ah)
--{
--      struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
--      struct ar5416AniState *aniState;
--      int32_t rssi;
--
--      aniState = &ah->curchan->ani;
+-int ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_vif *vif)
++void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif)
+ {
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+-      struct ath_vif *avp;
+-      struct ath_buf *bf;
+-      struct sk_buff *skb;
+-      struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
+-      __le64 tstamp;
++      struct ath_vif *avp = (void *)vif->drv_priv;
++      int slot;
+-      avp = (void *)vif->drv_priv;
++      avp->av_bcbuf = list_first_entry(&sc->beacon.bbuf, struct ath_buf, list);
++      list_del(&avp->av_bcbuf->list);
+-      /* Allocate a beacon descriptor if we haven't done so. */
+-      if (!avp->av_bcbuf) {
+-              /* Allocate beacon state for hostap/ibss.  We know
+-               * a buffer is available. */
+-              avp->av_bcbuf = list_first_entry(&sc->beacon.bbuf,
+-                                               struct ath_buf, list);
+-              list_del(&avp->av_bcbuf->list);
 -
--      if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) {
--              if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL,
--                                       aniState->noiseImmunityLevel + 1)) {
--                      return;
--              }
--      }
+-              if (ath9k_uses_beacons(vif->type)) {
+-                      int slot;
+-                      /*
+-                       * Assign the vif to a beacon xmit slot. As
+-                       * above, this cannot fail to find one.
+-                       */
+-                      avp->av_bslot = 0;
+-                      for (slot = 0; slot < ATH_BCBUF; slot++)
+-                              if (sc->beacon.bslot[slot] == NULL) {
+-                                      avp->av_bslot = slot;
+-                                      avp->is_bslot_active = false;
 -
--      if (aniState->spurImmunityLevel < HAL_SPUR_IMMUNE_MAX) {
--              if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL,
--                                       aniState->spurImmunityLevel + 1)) {
--                      return;
--              }
--      }
+-                                      /* NB: keep looking for a double slot */
+-                                      if (slot == 0 || !sc->beacon.bslot[slot-1])
+-                                              break;
+-                              }
+-                      BUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL);
+-                      sc->beacon.bslot[avp->av_bslot] = vif;
+-                      sc->nbcnvifs++;
++      for (slot = 0; slot < ATH_BCBUF; slot++) {
++              if (sc->beacon.bslot[slot] == NULL) {
++                      avp->av_bslot = slot;
++                      break;
+               }
+       }
+-      /* release the previous beacon frame, if it already exists. */
+-      bf = avp->av_bcbuf;
+-      if (bf->bf_mpdu != NULL) {
+-              skb = bf->bf_mpdu;
++      sc->beacon.bslot[avp->av_bslot] = vif;
++      sc->nbcnvifs++;
++
++      ath_dbg(common, CONFIG, "Added interface at beacon slot: %d\n",
++              avp->av_bslot);
++}
++
++void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif)
++{
++      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
++      struct ath_vif *avp = (void *)vif->drv_priv;
++      struct ath_buf *bf = avp->av_bcbuf;
++
++      ath_dbg(common, CONFIG, "Removing interface at beacon slot: %d\n",
++              avp->av_bslot);
++
++      tasklet_disable(&sc->bcon_tasklet);
++
++      if (bf && bf->bf_mpdu) {
++              struct sk_buff *skb = bf->bf_mpdu;
+               dma_unmap_single(sc->dev, bf->bf_buf_addr,
+                                skb->len, DMA_TO_DEVICE);
+               dev_kfree_skb_any(skb);
+@@ -274,99 +255,74 @@ int ath_beacon_alloc(struct ath_softc *s
+               bf->bf_buf_addr = 0;
+       }
+-      /* NB: the beacon data buffer must be 32-bit aligned. */
+-      skb = ieee80211_beacon_get(sc->hw, vif);
+-      if (skb == NULL)
+-              return -ENOMEM;
 -
--      if (ah->opmode == NL80211_IFTYPE_AP) {
--              if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) {
--                      ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
--                                           aniState->firstepLevel + 1);
--              }
--              return;
+-      tstamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp;
+-      sc->beacon.bc_tstamp = (u32) le64_to_cpu(tstamp);
+-      /* Calculate a TSF adjustment factor required for staggered beacons. */
+-      if (avp->av_bslot > 0) {
+-              u64 tsfadjust;
+-              int intval;
++      avp->av_bcbuf = NULL;
++      sc->beacon.bslot[avp->av_bslot] = NULL;
++      sc->nbcnvifs--;
++      list_add_tail(&bf->list, &sc->beacon.bbuf);
+-              intval = cur_conf->beacon_interval ? : ATH_DEFAULT_BINTVAL;
++      tasklet_enable(&sc->bcon_tasklet);
++}
+-              /*
+-               * Calculate the TSF offset for this beacon slot, i.e., the
+-               * number of usecs that need to be added to the timestamp field
+-               * in Beacon and Probe Response frames. Beacon slot 0 is
+-               * processed at the correct offset, so it does not require TSF
+-               * adjustment. Other slots are adjusted to get the timestamp
+-               * close to the TBTT for the BSS.
+-               */
+-              tsfadjust = TU_TO_USEC(intval * avp->av_bslot) / ATH_BCBUF;
+-              avp->tsf_adjust = cpu_to_le64(tsfadjust);
++static int ath9k_beacon_choose_slot(struct ath_softc *sc)
++{
++      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
++      struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
++      u16 intval;
++      u32 tsftu;
++      u64 tsf;
++      int slot;
+-              ath_dbg(common, BEACON,
+-                      "stagger beacons, bslot %d intval %u tsfadjust %llu\n",
+-                      avp->av_bslot, intval, (unsigned long long)tsfadjust);
++      if (sc->sc_ah->opmode != NL80211_IFTYPE_AP) {
++              ath_dbg(common, BEACON, "slot 0, tsf: %llu\n",
++                      ath9k_hw_gettsf64(sc->sc_ah));
++              return 0;
++      }
+-              ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp =
+-                      avp->tsf_adjust;
+-      } else
+-              avp->tsf_adjust = cpu_to_le64(0);
++      intval = cur_conf->beacon_interval ? : ATH_DEFAULT_BINTVAL;
++      tsf = ath9k_hw_gettsf64(sc->sc_ah);
++      tsf += TU_TO_USEC(sc->sc_ah->config.sw_beacon_response_time);
++      tsftu = TSF_TO_TU((tsf * ATH_BCBUF) >>32, tsf * ATH_BCBUF);
++      slot = (tsftu % (intval * ATH_BCBUF)) / intval;
+-      bf->bf_mpdu = skb;
+-      bf->bf_buf_addr = dma_map_single(sc->dev, skb->data,
+-                                       skb->len, DMA_TO_DEVICE);
+-      if (unlikely(dma_mapping_error(sc->dev, bf->bf_buf_addr))) {
+-              dev_kfree_skb_any(skb);
+-              bf->bf_mpdu = NULL;
+-              bf->bf_buf_addr = 0;
+-              ath_err(common, "dma_mapping_error on beacon alloc\n");
+-              return -ENOMEM;
 -      }
--      rssi = BEACON_RSSI(ah);
--      if (rssi > aniState->rssiThrHigh) {
--              if (!aniState->ofdmWeakSigDetectOff) {
--                      if (ath9k_hw_ani_control(ah,
--                                       ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
--                                       false)) {
--                              ath9k_hw_ani_control(ah,
--                                      ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0);
--                              return;
--                      }
--              }
--              if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) {
--                      ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
--                                           aniState->firstepLevel + 1);
--                      return;
+-      avp->is_bslot_active = true;
++      ath_dbg(common, BEACON, "slot: %d tsf: %llu tsftu: %u\n",
++              slot, tsf, tsftu / ATH_BCBUF);
+-      return 0;
++      return slot;
+ }
+-void ath_beacon_return(struct ath_softc *sc, struct ath_vif *avp)
++void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif)
+ {
+-      if (avp->av_bcbuf != NULL) {
+-              struct ath_buf *bf;
++      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
++      struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
++      struct ath_vif *avp = (void *)vif->drv_priv;
++      u64 tsfadjust;
+-              avp->is_bslot_active = false;
+-              if (avp->av_bslot != -1) {
+-                      sc->beacon.bslot[avp->av_bslot] = NULL;
+-                      sc->nbcnvifs--;
+-                      avp->av_bslot = -1;
 -              }
--      } else if (rssi > aniState->rssiThrLow) {
--              if (aniState->ofdmWeakSigDetectOff)
--                      ath9k_hw_ani_control(ah,
--                                   ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
--                                   true);
--              if (aniState->firstepLevel < HAL_FIRST_STEP_MAX)
--                      ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
--                                           aniState->firstepLevel + 1);
--              return;
--      } else {
--              if ((conf->channel->band == IEEE80211_BAND_2GHZ) &&
--                  !conf_is_ht(conf)) {
--                      if (!aniState->ofdmWeakSigDetectOff)
--                              ath9k_hw_ani_control(ah,
--                                   ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
--                                   false);
--                      if (aniState->firstepLevel > 0)
--                              ath9k_hw_ani_control(ah,
--                                           ATH9K_ANI_FIRSTEP_LEVEL, 0);
--                      return;
++      if (avp->av_bslot == 0)
++              return;
+-              bf = avp->av_bcbuf;
+-              if (bf->bf_mpdu != NULL) {
+-                      struct sk_buff *skb = bf->bf_mpdu;
+-                      dma_unmap_single(sc->dev, bf->bf_buf_addr,
+-                                       skb->len, DMA_TO_DEVICE);
+-                      dev_kfree_skb_any(skb);
+-                      bf->bf_mpdu = NULL;
+-                      bf->bf_buf_addr = 0;
 -              }
+-              list_add_tail(&bf->list, &sc->beacon.bbuf);
++      tsfadjust = cur_conf->beacon_interval * avp->av_bslot / ATH_BCBUF;
++      avp->tsf_adjust = cpu_to_le64(TU_TO_USEC(tsfadjust));
+-              avp->av_bcbuf = NULL;
 -      }
--}
++      ath_dbg(common, CONFIG, "tsfadjust is: %llu for bslot: %d\n",
++              (unsigned long long)tsfadjust, avp->av_bslot);
+ }
+-void ath_beacon_tasklet(unsigned long data)
++void ath9k_beacon_tasklet(unsigned long data)
+ {
+       struct ath_softc *sc = (struct ath_softc *)data;
+-      struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
+       struct ath_buf *bf = NULL;
+       struct ieee80211_vif *vif;
+       bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
+       int slot;
+-      u32 bfaddr, bc = 0;
+-      if (work_pending(&sc->hw_reset_work)) {
++      if (test_bit(SC_OP_HW_RESET, &sc->sc_flags)) {
+               ath_dbg(common, RESET,
+                       "reset work is pending, skip beaconing now\n");
+               return;
+       }
++
+       /*
+        * Check if the previous beacon has gone out.  If
+        * not don't try to post another, skip this period
+@@ -390,55 +346,25 @@ void ath_beacon_tasklet(unsigned long da
+               } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) {
+                       ath_dbg(common, BSTUCK, "beacon is officially stuck\n");
+                       sc->beacon.bmisscnt = 0;
+-                      set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
+-                      ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
++                      ath9k_queue_reset(sc, RESET_TYPE_BEACON_STUCK);
+               }
+               return;
+       }
+-      /*
+-       * Generate beacon frames. we are sending frames
+-       * staggered so calculate the slot for this frame based
+-       * on the tsf to safeguard against missing an swba.
+-       */
 -
--static void ath9k_hw_ani_cck_err_trigger_old(struct ath_hw *ah)
--{
--      struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
--      struct ar5416AniState *aniState;
--      int32_t rssi;
 -
--      aniState = &ah->curchan->ani;
--      if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) {
--              if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL,
--                                       aniState->noiseImmunityLevel + 1)) {
--                      return;
--              }
--      }
 -      if (ah->opmode == NL80211_IFTYPE_AP) {
--              if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) {
--                      ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
--                                           aniState->firstepLevel + 1);
--              }
--              return;
--      }
--      rssi = BEACON_RSSI(ah);
--      if (rssi > aniState->rssiThrLow) {
--              if (aniState->firstepLevel < HAL_FIRST_STEP_MAX)
--                      ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
--                                           aniState->firstepLevel + 1);
+-              u16 intval;
+-              u32 tsftu;
+-              u64 tsf;
+-
+-              intval = cur_conf->beacon_interval ? : ATH_DEFAULT_BINTVAL;
+-              tsf = ath9k_hw_gettsf64(ah);
+-              tsf += TU_TO_USEC(ah->config.sw_beacon_response_time);
+-              tsftu = TSF_TO_TU((tsf * ATH_BCBUF) >>32, tsf * ATH_BCBUF);
+-              slot = (tsftu % (intval * ATH_BCBUF)) / intval;
+-              vif = sc->beacon.bslot[slot];
+-
+-              ath_dbg(common, BEACON,
+-                      "slot %d [tsf %llu tsftu %u intval %u] vif %p\n",
+-                      slot, tsf, tsftu / ATH_BCBUF, intval, vif);
 -      } else {
--              if ((conf->channel->band == IEEE80211_BAND_2GHZ) &&
--                  !conf_is_ht(conf)) {
--                      if (aniState->firstepLevel > 0)
--                              ath9k_hw_ani_control(ah,
--                                           ATH9K_ANI_FIRSTEP_LEVEL, 0);
+-              slot = 0;
+-              vif = sc->beacon.bslot[slot];
+-      }
++      slot = ath9k_beacon_choose_slot(sc);
++      vif = sc->beacon.bslot[slot];
++      if (!vif || !vif->bss_conf.enable_beacon)
++              return;
+-      bfaddr = 0;
+-      if (vif) {
+-              bf = ath_beacon_generate(sc->hw, vif);
+-              if (bf != NULL) {
+-                      bfaddr = bf->bf_daddr;
+-                      bc = 1;
+-              }
++      bf = ath9k_beacon_generate(sc->hw, vif);
++      WARN_ON(!bf);
+-              if (sc->beacon.bmisscnt != 0) {
+-                      ath_dbg(common, BSTUCK,
+-                              "resume beacon xmit after %u misses\n",
+-                              sc->beacon.bmisscnt);
+-                      sc->beacon.bmisscnt = 0;
 -              }
++      if (sc->beacon.bmisscnt != 0) {
++              ath_dbg(common, BSTUCK, "resume beacon xmit after %u misses\n",
++                      sc->beacon.bmisscnt);
++              sc->beacon.bmisscnt = 0;
+       }
+       /*
+@@ -458,39 +384,37 @@ void ath_beacon_tasklet(unsigned long da
+        *     set to ATH_BCBUF so this check is a noop.
+        */
+       if (sc->beacon.updateslot == UPDATE) {
+-              sc->beacon.updateslot = COMMIT; /* commit next beacon */
++              sc->beacon.updateslot = COMMIT;
+               sc->beacon.slotupdate = slot;
+-      } else if (sc->beacon.updateslot == COMMIT && sc->beacon.slotupdate == slot) {
++      } else if (sc->beacon.updateslot == COMMIT &&
++                 sc->beacon.slotupdate == slot) {
+               ah->slottime = sc->beacon.slottime;
+               ath9k_hw_init_global_settings(ah);
+               sc->beacon.updateslot = OK;
+       }
+-      if (bfaddr != 0) {
++
++      if (bf) {
++              ath9k_reset_beacon_status(sc);
++
+               /* NB: cabq traffic should already be queued and primed */
+-              ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bfaddr);
++              ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);
+               if (!edma)
+                       ath9k_hw_txstart(ah, sc->beacon.beaconq);
+-
+-              sc->beacon.ast_be_xmit += bc;     /* XXX per-vif? */
+       }
+ }
+-static void ath9k_beacon_init(struct ath_softc *sc,
+-                            u32 next_beacon,
+-                            u32 beacon_period)
++static void ath9k_beacon_init(struct ath_softc *sc, u32 nexttbtt, u32 intval)
+ {
+-      if (test_bit(SC_OP_TSF_RESET, &sc->sc_flags)) {
+-              ath9k_ps_wakeup(sc);
+-              ath9k_hw_reset_tsf(sc->sc_ah);
 -      }
--}
 -
- /* Adjust the OFDM Noise Immunity Level */
- static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel)
+-      ath9k_hw_beaconinit(sc->sc_ah, next_beacon, beacon_period);
++      struct ath_hw *ah = sc->sc_ah;
+-      if (test_bit(SC_OP_TSF_RESET, &sc->sc_flags)) {
+-              ath9k_ps_restore(sc);
+-              clear_bit(SC_OP_TSF_RESET, &sc->sc_flags);
+-      }
++      ath9k_hw_disable_interrupts(ah);
++      ath9k_hw_reset_tsf(ah);
++      ath9k_beaconq_config(sc);
++      ath9k_hw_beaconinit(ah, nexttbtt, intval);
++      sc->beacon.bmisscnt = 0;
++      ath9k_hw_set_interrupts(ah);
++      ath9k_hw_enable_interrupts(ah);
+ }
+ /*
+@@ -498,32 +422,27 @@ static void ath9k_beacon_init(struct ath
+  * burst together.  For the former arrange for the SWBA to be delivered for each
+  * slot. Slots that are not occupied will generate nothing.
+  */
+-static void ath_beacon_config_ap(struct ath_softc *sc,
+-                               struct ath_beacon_config *conf)
++static void ath9k_beacon_config_ap(struct ath_softc *sc,
++                                 struct ath_beacon_config *conf)
  {
-@@ -265,18 +146,15 @@ static void ath9k_hw_set_ofdm_nil(struct
+       struct ath_hw *ah = sc->sc_ah;
++      struct ath_common *common = ath9k_hw_common(ah);
+       u32 nexttbtt, intval;
+       /* NB: the beacon interval is kept internally in TU's */
+       intval = TU_TO_USEC(conf->beacon_interval);
+-      intval /= ATH_BCBUF;    /* for staggered beacons */
++      intval /= ATH_BCBUF;
+       nexttbtt = intval;
+-      /*
+-       * In AP mode we enable the beacon timers and SWBA interrupts to
+-       * prepare beacon frames.
+-       */
+-      ah->imask |= ATH9K_INT_SWBA;
+-      ath_beaconq_config(sc);
++      if (conf->enable_beacon)
++              ah->imask |= ATH9K_INT_SWBA;
++      else
++              ah->imask &= ~ATH9K_INT_SWBA;
+-      /* Set the computed AP beacon timers */
++      ath_dbg(common, BEACON, "AP nexttbtt: %u intval: %u conf_intval: %u\n",
++              nexttbtt, intval, conf->beacon_interval);
+-      ath9k_hw_disable_interrupts(ah);
+-      set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
+       ath9k_beacon_init(sc, nexttbtt, intval);
+-      sc->beacon.bmisscnt = 0;
+-      ath9k_hw_set_interrupts(ah);
+-      ath9k_hw_enable_interrupts(ah);
+ }
+ /*
+@@ -534,8 +453,8 @@ static void ath_beacon_config_ap(struct 
+  * we'll receive a BMISS interrupt when we stop seeing beacons from the AP
+  * we've associated with.
+  */
+-static void ath_beacon_config_sta(struct ath_softc *sc,
+-                                struct ath_beacon_config *conf)
++static void ath9k_beacon_config_sta(struct ath_softc *sc,
++                                  struct ath_beacon_config *conf)
+ {
+       struct ath_hw *ah = sc->sc_ah;
        struct ath_common *common = ath9k_hw_common(ah);
-       const struct ani_ofdm_level_entry *entry_ofdm;
-       const struct ani_cck_level_entry *entry_cck;
+@@ -654,8 +573,8 @@ static void ath_beacon_config_sta(struct
+       ath9k_hw_enable_interrupts(ah);
+ }
+-static void ath_beacon_config_adhoc(struct ath_softc *sc,
+-                                  struct ath_beacon_config *conf)
++static void ath9k_beacon_config_adhoc(struct ath_softc *sc,
++                                    struct ath_beacon_config *conf)
+ {
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
+@@ -669,82 +588,53 @@ static void ath_beacon_config_adhoc(stru
+       tsf = roundup(ath9k_hw_gettsf32(ah) + TU_TO_USEC(FUDGE), intval);
+       nexttbtt = tsf + intval;
+-      ath_dbg(common, BEACON, "IBSS nexttbtt %u intval %u (%u)\n",
+-              nexttbtt, intval, conf->beacon_interval);
+-
+-      /*
+-       * In IBSS mode enable the beacon timers but only enable SWBA interrupts
+-       * if we need to manually prepare beacon frames.  Otherwise we use a
+-       * self-linked tx descriptor and let the hardware deal with things.
+-       */
+-      ah->imask |= ATH9K_INT_SWBA;
 -
--      aniState->noiseFloor = BEACON_RSSI(ah);
-+      bool weak_sig;
-       ath_dbg(common, ANI, "**** ofdmlevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",
-               aniState->ofdmNoiseImmunityLevel,
--              immunityLevel, aniState->noiseFloor,
-+              immunityLevel, BEACON_RSSI(ah),
-               aniState->rssiThrLow, aniState->rssiThrHigh);
-       if (aniState->update_ani)
--              aniState->ofdmNoiseImmunityLevel =
--                      (immunityLevel > ATH9K_ANI_OFDM_DEF_LEVEL) ?
--                      immunityLevel : ATH9K_ANI_OFDM_DEF_LEVEL;
-+              aniState->ofdmNoiseImmunityLevel = immunityLevel;
-       entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel];
-       entry_cck = &cck_level_table[aniState->cckNoiseImmunityLevel];
-@@ -292,12 +170,22 @@ static void ath9k_hw_set_ofdm_nil(struct
-                                    ATH9K_ANI_FIRSTEP_LEVEL,
-                                    entry_ofdm->fir_step_level);
--      if ((aniState->noiseFloor >= aniState->rssiThrHigh) &&
--          (!aniState->ofdmWeakSigDetectOff !=
--           entry_ofdm->ofdm_weak_signal_on)) {
-+      weak_sig = entry_ofdm->ofdm_weak_signal_on;
-+      if (ah->opmode == NL80211_IFTYPE_STATION &&
-+          BEACON_RSSI(ah) <= aniState->rssiThrHigh)
-+              weak_sig = true;
+-      ath_beaconq_config(sc);
++      if (conf->enable_beacon)
++              ah->imask |= ATH9K_INT_SWBA;
++      else
++              ah->imask &= ~ATH9K_INT_SWBA;
+-      /* Set the computed ADHOC beacon timers */
++      ath_dbg(common, BEACON, "IBSS nexttbtt: %u intval: %u conf_intval: %u\n",
++              nexttbtt, intval, conf->beacon_interval);
+-      ath9k_hw_disable_interrupts(ah);
+       ath9k_beacon_init(sc, nexttbtt, intval);
+-      sc->beacon.bmisscnt = 0;
+-
+-      ath9k_hw_set_interrupts(ah);
+-      ath9k_hw_enable_interrupts(ah);
+ }
+-static bool ath9k_allow_beacon_config(struct ath_softc *sc,
+-                                    struct ieee80211_vif *vif)
++bool ath9k_allow_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
+ {
+-      struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+-      struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
+       struct ath_vif *avp = (void *)vif->drv_priv;
+-      /*
+-       * Can not have different beacon interval on multiple
+-       * AP interface case
+-       */
+-      if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) &&
+-          (sc->nbcnvifs > 1) &&
+-          (vif->type == NL80211_IFTYPE_AP) &&
+-          (cur_conf->beacon_interval != bss_conf->beacon_int)) {
+-              ath_dbg(common, CONFIG,
+-                      "Changing beacon interval of multiple AP interfaces !\n");
+-              return false;
+-      }
+-      /*
+-       * Can not configure station vif's beacon config
+-       * while on AP opmode
+-       */
+-      if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) &&
+-          (vif->type != NL80211_IFTYPE_AP)) {
+-              ath_dbg(common, CONFIG,
+-                      "STA vif's beacon not allowed on AP mode\n");
+-              return false;
++      if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) {
++              if ((vif->type != NL80211_IFTYPE_AP) ||
++                  (sc->nbcnvifs > 1)) {
++                      ath_dbg(common, CONFIG,
++                              "An AP interface is already present !\n");
++                      return false;
++              }
+       }
+-      /*
+-       * Do not allow beacon config if HW was already configured
+-       * with another STA vif
+-       */
+-      if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) &&
+-          (vif->type == NL80211_IFTYPE_STATION) &&
+-          test_bit(SC_OP_BEACONS, &sc->sc_flags) &&
+-          !avp->primary_sta_vif) {
+-              ath_dbg(common, CONFIG,
+-                      "Beacon already configured for a station interface\n");
+-              return false;
 +
-+      if (aniState->ofdmWeakSigDetect != weak_sig)
-                       ath9k_hw_ani_control(ah,
-                               ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
-                               entry_ofdm->ofdm_weak_signal_on);
++      if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) {
++              if ((vif->type == NL80211_IFTYPE_STATION) &&
++                  test_bit(SC_OP_BEACONS, &sc->sc_flags) &&
++                  !avp->primary_sta_vif) {
++                      ath_dbg(common, CONFIG,
++                              "Beacon already configured for a station interface\n");
++                      return false;
++              }
+       }
 +
-+      if (aniState->ofdmNoiseImmunityLevel >= ATH9K_ANI_OFDM_DEF_LEVEL) {
-+              ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
-+              ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI;
+       return true;
+ }
+-void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
++static void ath9k_cache_beacon_config(struct ath_softc *sc,
++                                    struct ieee80211_bss_conf *bss_conf)
+ {
++      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+       struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
+-      struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
+-      if (!ath9k_allow_beacon_config(sc, vif))
+-              return;
++      ath_dbg(common, BEACON,
++              "Caching beacon data for BSS: %pM\n", bss_conf->bssid);
+-      /* Setup the beacon configuration parameters */
+       cur_conf->beacon_interval = bss_conf->beacon_int;
+       cur_conf->dtim_period = bss_conf->dtim_period;
+       cur_conf->listen_interval = 1;
+@@ -769,73 +659,59 @@ void ath_beacon_config(struct ath_softc 
+       if (cur_conf->dtim_period == 0)
+               cur_conf->dtim_period = 1;
+-      ath_set_beacon(sc);
+ }
+-static bool ath_has_valid_bslot(struct ath_softc *sc)
++void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif,
++                       u32 changed)
+ {
+-      struct ath_vif *avp;
+-      int slot;
+-      bool found = false;
++      struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
++      struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
+-      for (slot = 0; slot < ATH_BCBUF; slot++) {
+-              if (sc->beacon.bslot[slot]) {
+-                      avp = (void *)sc->beacon.bslot[slot]->drv_priv;
+-                      if (avp->is_bslot_active) {
+-                              found = true;
+-                              break;
+-                      }
++      ath9k_cache_beacon_config(sc, bss_conf);
++
++      if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) {
++              ath9k_set_beacon(sc);
++              set_bit(SC_OP_BEACONS, &sc->sc_flags);
 +      } else {
-+              ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI;
-+              ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW;
++              /*
++               * Take care of multiple interfaces when
++               * enabling/disabling SWBA.
++               */
++              if (changed & BSS_CHANGED_BEACON_ENABLED) {
++                      if (!bss_conf->enable_beacon &&
++                          (sc->nbcnvifs <= 1))
++                              cur_conf->enable_beacon = false;
++                      else if (bss_conf->enable_beacon)
++                              cur_conf->enable_beacon = true;
+               }
++
++              ath9k_set_beacon(sc);
++
++              if (cur_conf->enable_beacon)
++                      set_bit(SC_OP_BEACONS, &sc->sc_flags);
++              else
++                      clear_bit(SC_OP_BEACONS, &sc->sc_flags);
        }
+-      return found;
  }
  
-@@ -308,11 +196,6 @@ static void ath9k_hw_ani_ofdm_err_trigge
-       if (!DO_ANI(ah))
+-
+-void ath_set_beacon(struct ath_softc *sc)
++void ath9k_set_beacon(struct ath_softc *sc)
+ {
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+       struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
+       switch (sc->sc_ah->opmode) {
+       case NL80211_IFTYPE_AP:
+-              if (ath_has_valid_bslot(sc))
+-                      ath_beacon_config_ap(sc, cur_conf);
++              ath9k_beacon_config_ap(sc, cur_conf);
+               break;
+       case NL80211_IFTYPE_ADHOC:
+       case NL80211_IFTYPE_MESH_POINT:
+-              ath_beacon_config_adhoc(sc, cur_conf);
++              ath9k_beacon_config_adhoc(sc, cur_conf);
+               break;
+       case NL80211_IFTYPE_STATION:
+-              ath_beacon_config_sta(sc, cur_conf);
++              ath9k_beacon_config_sta(sc, cur_conf);
+               break;
+       default:
+               ath_dbg(common, CONFIG, "Unsupported beaconing mode\n");
                return;
--      if (!use_new_ani(ah)) {
--              ath9k_hw_ani_ofdm_err_trigger_old(ah);
+       }
+-
+-      set_bit(SC_OP_BEACONS, &sc->sc_flags);
+-}
+-
+-void ath9k_set_beaconing_status(struct ath_softc *sc, bool status)
+-{
+-      struct ath_hw *ah = sc->sc_ah;
+-
+-      if (!ath_has_valid_bslot(sc)) {
+-              clear_bit(SC_OP_BEACONS, &sc->sc_flags);
 -              return;
 -      }
 -
-       aniState = &ah->curchan->ani;
-       if (aniState->ofdmNoiseImmunityLevel < ATH9K_ANI_OFDM_MAX_LEVEL)
-@@ -329,22 +212,18 @@ static void ath9k_hw_set_cck_nil(struct 
-       const struct ani_ofdm_level_entry *entry_ofdm;
-       const struct ani_cck_level_entry *entry_cck;
--      aniState->noiseFloor = BEACON_RSSI(ah);
-       ath_dbg(common, ANI, "**** ccklevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",
-               aniState->cckNoiseImmunityLevel, immunityLevel,
--              aniState->noiseFloor, aniState->rssiThrLow,
-+              BEACON_RSSI(ah), aniState->rssiThrLow,
-               aniState->rssiThrHigh);
--      if ((ah->opmode == NL80211_IFTYPE_STATION ||
--           ah->opmode == NL80211_IFTYPE_ADHOC) &&
--          aniState->noiseFloor <= aniState->rssiThrLow &&
-+      if (ah->opmode == NL80211_IFTYPE_STATION &&
-+          BEACON_RSSI(ah) <= aniState->rssiThrLow &&
-           immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI)
-               immunityLevel = ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI;
-       if (aniState->update_ani)
--              aniState->cckNoiseImmunityLevel =
--                      (immunityLevel > ATH9K_ANI_CCK_DEF_LEVEL) ?
--                      immunityLevel : ATH9K_ANI_CCK_DEF_LEVEL;
-+              aniState->cckNoiseImmunityLevel = immunityLevel;
-       entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel];
-       entry_cck = &cck_level_table[aniState->cckNoiseImmunityLevel];
-@@ -372,70 +251,12 @@ static void ath9k_hw_ani_cck_err_trigger
-       if (!DO_ANI(ah))
+-      ath9k_ps_wakeup(sc);
+-      if (status) {
+-              /* Re-enable beaconing */
+-              ah->imask |= ATH9K_INT_SWBA;
+-              ath9k_hw_set_interrupts(ah);
+-      } else {
+-              /* Disable SWBA interrupt */
+-              ah->imask &= ~ATH9K_INT_SWBA;
+-              ath9k_hw_set_interrupts(ah);
+-              tasklet_kill(&sc->bcon_tasklet);
+-              ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq);
+-      }
+-      ath9k_ps_restore(sc);
+ }
+--- a/drivers/net/wireless/ath/ath9k/debug.c
++++ b/drivers/net/wireless/ath/ath9k/debug.c
+@@ -206,10 +206,9 @@ static ssize_t write_file_disable_ani(st
+       if (disable_ani) {
+               clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
+-              del_timer_sync(&common->ani.timer);
++              ath_stop_ani(sc);
+       } else {
+-              set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
+-              ath_start_ani(common);
++              ath_check_ani(sc);
+       }
+       return count;
+--- a/drivers/net/wireless/ath/ath9k/debug.h
++++ b/drivers/net/wireless/ath/ath9k/debug.h
+@@ -32,6 +32,19 @@ struct ath_buf;
+ #define RESET_STAT_INC(sc, type) do { } while (0)
+ #endif
++enum ath_reset_type {
++      RESET_TYPE_BB_HANG,
++      RESET_TYPE_BB_WATCHDOG,
++      RESET_TYPE_FATAL_INT,
++      RESET_TYPE_TX_ERROR,
++      RESET_TYPE_TX_HANG,
++      RESET_TYPE_PLL_HANG,
++      RESET_TYPE_MAC_HANG,
++      RESET_TYPE_BEACON_STUCK,
++      RESET_TYPE_MCI,
++      __RESET_TYPE_MAX
++};
++
+ #ifdef CONFIG_ATH9K_DEBUGFS
+ /**
+@@ -209,17 +222,6 @@ struct ath_rx_stats {
+       u32 rx_frags;
+ };
+-enum ath_reset_type {
+-      RESET_TYPE_BB_HANG,
+-      RESET_TYPE_BB_WATCHDOG,
+-      RESET_TYPE_FATAL_INT,
+-      RESET_TYPE_TX_ERROR,
+-      RESET_TYPE_TX_HANG,
+-      RESET_TYPE_PLL_HANG,
+-      RESET_TYPE_MAC_HANG,
+-      __RESET_TYPE_MAX
+-};
+-
+ struct ath_stats {
+       struct ath_interrupt_stats istats;
+       struct ath_tx_stats txstats[ATH9K_NUM_TX_QUEUES];
+--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
++++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+@@ -1111,7 +1111,7 @@ static int ath9k_htc_add_interface(struc
+       if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
+           !test_bit(OP_ANI_RUNNING, &priv->op_flags)) {
+-              ath9k_hw_set_tsfadjust(priv->ah, 1);
++              ath9k_hw_set_tsfadjust(priv->ah, true);
+               ath9k_htc_start_ani(priv);
+       }
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -2908,9 +2908,9 @@ void ath9k_hw_reset_tsf(struct ath_hw *a
+ }
+ EXPORT_SYMBOL(ath9k_hw_reset_tsf);
+-void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting)
++void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set)
+ {
+-      if (setting)
++      if (set)
+               ah->misc_mode |= AR_PCU_TX_ADD_TSF;
+       else
+               ah->misc_mode &= ~AR_PCU_TX_ADD_TSF;
+--- a/drivers/net/wireless/ath/ath9k/hw.h
++++ b/drivers/net/wireless/ath/ath9k/hw.h
+@@ -943,7 +943,7 @@ u32 ath9k_hw_gettsf32(struct ath_hw *ah)
+ u64 ath9k_hw_gettsf64(struct ath_hw *ah);
+ void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64);
+ void ath9k_hw_reset_tsf(struct ath_hw *ah);
+-void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting);
++void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set);
+ void ath9k_hw_init_global_settings(struct ath_hw *ah);
+ u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah);
+ void ath9k_hw_set11nmac2040(struct ath_hw *ah);
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -560,7 +560,7 @@ static int ath9k_init_softc(u16 devid, s
+       spin_lock_init(&sc->debug.samp_lock);
+ #endif
+       tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
+-      tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet,
++      tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet,
+                    (unsigned long)sc);
+       INIT_WORK(&sc->hw_reset_work, ath_reset_work);
+--- a/drivers/net/wireless/ath/ath9k/link.c
++++ b/drivers/net/wireless/ath/ath9k/link.c
+@@ -50,8 +50,7 @@ void ath_tx_complete_poll_work(struct wo
+       if (needreset) {
+               ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
+                       "tx hung, resetting the chip\n");
+-              RESET_STAT_INC(sc, RESET_TYPE_TX_HANG);
+-              ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
++              ath9k_queue_reset(sc, RESET_TYPE_TX_HANG);
                return;
+       }
+@@ -69,6 +68,7 @@ void ath_hw_check(struct work_struct *wo
+       unsigned long flags;
+       int busy;
+       u8 is_alive, nbeacon = 1;
++      enum ath_reset_type type;
+       ath9k_ps_wakeup(sc);
+       is_alive = ath9k_hw_check_alive(sc->sc_ah);
+@@ -78,7 +78,7 @@ void ath_hw_check(struct work_struct *wo
+       else if (!is_alive && AR_SREV_9300(sc->sc_ah)) {
+               ath_dbg(common, RESET,
+                       "DCU stuck is detected. Schedule chip reset\n");
+-              RESET_STAT_INC(sc, RESET_TYPE_MAC_HANG);
++              type = RESET_TYPE_MAC_HANG;
+               goto sched_reset;
+       }
  
--      if (!use_new_ani(ah)) {
--              ath9k_hw_ani_cck_err_trigger_old(ah);
+@@ -90,7 +90,7 @@ void ath_hw_check(struct work_struct *wo
+               busy, sc->hw_busy_count + 1);
+       if (busy >= 99) {
+               if (++sc->hw_busy_count >= 3) {
+-                      RESET_STAT_INC(sc, RESET_TYPE_BB_HANG);
++                      type = RESET_TYPE_BB_HANG;
+                       goto sched_reset;
+               }
+       } else if (busy >= 0) {
+@@ -102,7 +102,7 @@ void ath_hw_check(struct work_struct *wo
+       goto out;
+ sched_reset:
+-      ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
++      ath9k_queue_reset(sc, type);
+ out:
+       ath9k_ps_restore(sc);
+ }
+@@ -119,8 +119,7 @@ static bool ath_hw_pll_rx_hang_check(str
+               count++;
+               if (count == 3) {
+                       ath_dbg(common, RESET, "PLL WAR, resetting the chip\n");
+-                      RESET_STAT_INC(sc, RESET_TYPE_PLL_HANG);
+-                      ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
++                      ath9k_queue_reset(sc, RESET_TYPE_PLL_HANG);
+                       count = 0;
+                       return true;
+               }
+@@ -432,26 +431,69 @@ set_timer:
+       }
+ }
+-void ath_start_ani(struct ath_common *common)
++void ath_start_ani(struct ath_softc *sc)
+ {
+-      struct ath_hw *ah = common->ah;
++      struct ath_hw *ah = sc->sc_ah;
++      struct ath_common *common = ath9k_hw_common(ah);
+       unsigned long timestamp = jiffies_to_msecs(jiffies);
+-      struct ath_softc *sc = (struct ath_softc *) common->priv;
+-      if (!test_bit(SC_OP_ANI_RUN, &sc->sc_flags))
 -              return;
--      }
 -
-       aniState = &ah->curchan->ani;
+-      if (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
++      if (common->disable_ani ||
++          !test_bit(SC_OP_ANI_RUN, &sc->sc_flags) ||
++          (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
+               return;
+       common->ani.longcal_timer = timestamp;
+       common->ani.shortcal_timer = timestamp;
+       common->ani.checkani_timer = timestamp;
  
-       if (aniState->cckNoiseImmunityLevel < ATH9K_ANI_CCK_MAX_LEVEL)
-               ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1);
++      ath_dbg(common, ANI, "Starting ANI\n");
+       mod_timer(&common->ani.timer,
+                 jiffies + msecs_to_jiffies((u32)ah->config.ani_poll_interval));
  }
  
--static void ath9k_hw_ani_lower_immunity_old(struct ath_hw *ah)
--{
--      struct ar5416AniState *aniState;
--      int32_t rssi;
--
--      aniState = &ah->curchan->ani;
--
--      if (ah->opmode == NL80211_IFTYPE_AP) {
--              if (aniState->firstepLevel > 0) {
--                      if (ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
--                                               aniState->firstepLevel - 1))
--                              return;
--              }
--      } else {
--              rssi = BEACON_RSSI(ah);
--              if (rssi > aniState->rssiThrHigh) {
--                      /* XXX: Handle me */
--              } else if (rssi > aniState->rssiThrLow) {
--                      if (aniState->ofdmWeakSigDetectOff) {
--                              if (ath9k_hw_ani_control(ah,
--                                       ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
--                                       true))
--                                      return;
--                      }
--                      if (aniState->firstepLevel > 0) {
--                              if (ath9k_hw_ani_control(ah,
--                                       ATH9K_ANI_FIRSTEP_LEVEL,
--                                       aniState->firstepLevel - 1))
--                                      return;
--                      }
--              } else {
--                      if (aniState->firstepLevel > 0) {
--                              if (ath9k_hw_ani_control(ah,
--                                       ATH9K_ANI_FIRSTEP_LEVEL,
--                                       aniState->firstepLevel - 1))
--                                      return;
--                      }
--              }
--      }
--
--      if (aniState->spurImmunityLevel > 0) {
--              if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL,
--                                       aniState->spurImmunityLevel - 1))
--                      return;
--      }
--
--      if (aniState->noiseImmunityLevel > 0) {
--              ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL,
--                                   aniState->noiseImmunityLevel - 1);
--              return;
--      }
--}
++void ath_stop_ani(struct ath_softc *sc)
++{
++      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
++
++      ath_dbg(common, ANI, "Stopping ANI\n");
++      del_timer_sync(&common->ani.timer);
++}
++
++void ath_check_ani(struct ath_softc *sc)
++{
++      struct ath_hw *ah = sc->sc_ah;
++      struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
++
++      /*
++       * Check for the various conditions in which ANI has to
++       * be stopped.
++       */
++      if (ah->opmode == NL80211_IFTYPE_ADHOC) {
++              if (!cur_conf->enable_beacon)
++                      goto stop_ani;
++      } else if (ah->opmode == NL80211_IFTYPE_AP) {
++              if (!cur_conf->enable_beacon) {
++                      /*
++                       * Disable ANI only when there are no
++                       * associated stations.
++                       */
++                      if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))
++                              goto stop_ani;
++              }
++      } else if (ah->opmode == NL80211_IFTYPE_STATION) {
++              if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))
++                      goto stop_ani;
++      }
++
++      set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
++      ath_start_ani(sc);
++      return;
++
++stop_ani:
++      clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
++      ath_stop_ani(sc);
++}
++
+ void ath_update_survey_nf(struct ath_softc *sc, int channel)
+ {
+       struct ath_hw *ah = sc->sc_ah;
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -167,8 +167,6 @@ static void ath_cancel_work(struct ath_s
+ static void ath_restart_work(struct ath_softc *sc)
+ {
+-      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 -
- /*
-  * only lower either OFDM or CCK errors per turn
-  * we lower the other one next time
-@@ -446,11 +267,6 @@ static void ath9k_hw_ani_lower_immunity(
+       ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
  
-       aniState = &ah->curchan->ani;
+       if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9485(sc->sc_ah) ||
+@@ -177,21 +175,18 @@ static void ath_restart_work(struct ath_
+                                    msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
  
--      if (!use_new_ani(ah)) {
--              ath9k_hw_ani_lower_immunity_old(ah);
--              return;
--      }
+       ath_start_rx_poll(sc, 3);
 -
-       /* lower OFDM noise immunity */
-       if (aniState->ofdmNoiseImmunityLevel > 0 &&
-           (aniState->ofdmsTurn || aniState->cckNoiseImmunityLevel == 0)) {
-@@ -463,72 +279,6 @@ static void ath9k_hw_ani_lower_immunity(
-               ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel - 1);
+-      if (!common->disable_ani)
+-              ath_start_ani(common);
++      ath_start_ani(sc);
  }
  
--static void ath9k_ani_reset_old(struct ath_hw *ah, bool is_scanning)
--{
--      struct ar5416AniState *aniState;
--      struct ath9k_channel *chan = ah->curchan;
+ static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush)
+ {
+       struct ath_hw *ah = sc->sc_ah;
 -      struct ath_common *common = ath9k_hw_common(ah);
+       bool ret = true;
+       ieee80211_stop_queues(sc->hw);
+       sc->hw_busy_count = 0;
+-      del_timer_sync(&common->ani.timer);
++      ath_stop_ani(sc);
+       del_timer_sync(&sc->rx_poll_timer);
+       ath9k_debug_samp_bb_mac(sc);
+@@ -236,7 +231,7 @@ static bool ath_complete_reset(struct at
+               if (!test_bit(SC_OP_BEACONS, &sc->sc_flags))
+                       goto work;
+-              ath_set_beacon(sc);
++              ath9k_set_beacon(sc);
+               if (ah->opmode == NL80211_IFTYPE_STATION &&
+                   test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
+@@ -365,6 +360,7 @@ void ath9k_tasklet(unsigned long data)
+       struct ath_softc *sc = (struct ath_softc *)data;
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
++      enum ath_reset_type type;
+       unsigned long flags;
+       u32 status = sc->intrstatus;
+       u32 rxmask;
+@@ -374,18 +370,13 @@ void ath9k_tasklet(unsigned long data)
+       if ((status & ATH9K_INT_FATAL) ||
+           (status & ATH9K_INT_BB_WATCHDOG)) {
+-#ifdef CONFIG_ATH9K_DEBUGFS
+-              enum ath_reset_type type;
+               if (status & ATH9K_INT_FATAL)
+                       type = RESET_TYPE_FATAL_INT;
+               else
+                       type = RESET_TYPE_BB_WATCHDOG;
+-              RESET_STAT_INC(sc, type);
+-#endif
+-              set_bit(SC_OP_HW_RESET, &sc->sc_flags);
+-              ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
++              ath9k_queue_reset(sc, type);
+               goto out;
+       }
+@@ -575,6 +566,15 @@ static int ath_reset(struct ath_softc *s
+       return r;
+ }
++void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type)
++{
++#ifdef CONFIG_ATH9K_DEBUGFS
++      RESET_STAT_INC(sc, type);
++#endif
++      set_bit(SC_OP_HW_RESET, &sc->sc_flags);
++      ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
++}
++
+ void ath_reset_work(struct work_struct *work)
+ {
+       struct ath_softc *sc = container_of(work, struct ath_softc, hw_reset_work);
+@@ -841,16 +841,6 @@ bool ath9k_uses_beacons(int type)
+       }
+ }
+-static void ath9k_reclaim_beacon(struct ath_softc *sc,
+-                               struct ieee80211_vif *vif)
+-{
+-      struct ath_vif *avp = (void *)vif->drv_priv;
 -
--      if (!DO_ANI(ah))
--              return;
+-      ath9k_set_beaconing_status(sc, false);
+-      ath_beacon_return(sc, avp);
+-      ath9k_set_beaconing_status(sc, true);
+-}
 -
--      aniState = &ah->curchan->ani;
+ static void ath9k_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
+ {
+       struct ath9k_vif_iter_data *iter_data = data;
+@@ -918,18 +908,14 @@ static void ath9k_calculate_summary_stat
+       ath9k_calculate_iter_data(hw, vif, &iter_data);
+-      /* Set BSSID mask. */
+       memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
+       ath_hw_setbssidmask(common);
+-      /* Set op-mode & TSF */
+       if (iter_data.naps > 0) {
+-              ath9k_hw_set_tsfadjust(ah, 1);
+-              set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
++              ath9k_hw_set_tsfadjust(ah, true);
+               ah->opmode = NL80211_IFTYPE_AP;
+       } else {
+-              ath9k_hw_set_tsfadjust(ah, 0);
+-              clear_bit(SC_OP_TSF_RESET, &sc->sc_flags);
++              ath9k_hw_set_tsfadjust(ah, false);
+               if (iter_data.nmeshes)
+                       ah->opmode = NL80211_IFTYPE_MESH_POINT;
+@@ -941,45 +927,14 @@ static void ath9k_calculate_summary_stat
+                       ah->opmode = NL80211_IFTYPE_STATION;
+       }
+-      /*
+-       * Enable MIB interrupts when there are hardware phy counters.
+-       */
++      ath9k_hw_setopmode(ah);
++
+       if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0)
+               ah->imask |= ATH9K_INT_TSFOOR;
+       else
+               ah->imask &= ~ATH9K_INT_TSFOOR;
+       ath9k_hw_set_interrupts(ah);
 -
--      if (ah->opmode != NL80211_IFTYPE_STATION
--          && ah->opmode != NL80211_IFTYPE_ADHOC) {
--              ath_dbg(common, ANI, "Reset ANI state opmode %u\n", ah->opmode);
--              ah->stats.ast_ani_reset++;
+-      /* Set up ANI */
+-      if (iter_data.naps > 0) {
+-              sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
 -
--              if (ah->opmode == NL80211_IFTYPE_AP) {
--                      /*
--                       * ath9k_hw_ani_control() will only process items set on
--                       * ah->ani_function
--                       */
--                      if (IS_CHAN_2GHZ(chan))
--                              ah->ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL |
--                                                  ATH9K_ANI_FIRSTEP_LEVEL);
--                      else
--                              ah->ani_function = 0;
+-              if (!common->disable_ani) {
+-                      set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
+-                      ath_start_ani(common);
 -              }
 -
--              ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, 0);
--              ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0);
--              ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, 0);
--              ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
--                                   !ATH9K_ANI_USE_OFDM_WEAK_SIG);
--              ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR,
--                                   ATH9K_ANI_CCK_WEAK_SIG_THR);
--
--              ath9k_ani_restart(ah);
--              return;
+-      } else {
+-              clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
+-              del_timer_sync(&common->ani.timer);
 -      }
+-}
 -
--      if (aniState->noiseImmunityLevel != 0)
--              ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL,
--                                   aniState->noiseImmunityLevel);
--      if (aniState->spurImmunityLevel != 0)
--              ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL,
--                                   aniState->spurImmunityLevel);
--      if (aniState->ofdmWeakSigDetectOff)
--              ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
--                                   !aniState->ofdmWeakSigDetectOff);
--      if (aniState->cckWeakSigThreshold)
--              ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR,
--                                   aniState->cckWeakSigThreshold);
--      if (aniState->firstepLevel != 0)
--              ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL,
--                                   aniState->firstepLevel);
--
--      ath9k_ani_restart(ah);
--
--      ENABLE_REGWRITE_BUFFER(ah);
--
--      REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
--      REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
+-/* Called with sc->mutex held, vif counts set up properly. */
+-static void ath9k_do_vif_add_setup(struct ieee80211_hw *hw,
+-                                 struct ieee80211_vif *vif)
+-{
+-      struct ath_softc *sc = hw->priv;
 -
--      REGWRITE_BUFFER_FLUSH(ah);
--}
+-      ath9k_calculate_summary_state(hw, vif);
 -
- /*
-  * Restore the ANI parameters in the HAL and reset the statistics.
-  * This routine should be called for every hardware reset and for
-@@ -539,13 +289,11 @@ void ath9k_ani_reset(struct ath_hw *ah, 
-       struct ar5416AniState *aniState = &ah->curchan->ani;
-       struct ath9k_channel *chan = ah->curchan;
-       struct ath_common *common = ath9k_hw_common(ah);
-+      int ofdm_nil, cck_nil;
+-      if (ath9k_uses_beacons(vif->type)) {
+-              /* Reserve a beacon slot for the vif */
+-              ath9k_set_beaconing_status(sc, false);
+-              ath_beacon_alloc(sc, vif);
+-              ath9k_set_beaconing_status(sc, true);
+-      }
+ }
  
-       if (!DO_ANI(ah))
-               return;
+ static int ath9k_add_interface(struct ieee80211_hw *hw,
+@@ -1021,7 +976,10 @@ static int ath9k_add_interface(struct ie
  
--      if (!use_new_ani(ah))
--              return ath9k_ani_reset_old(ah, is_scanning);
--
-       BUG_ON(aniState == NULL);
-       ah->stats.ast_ani_reset++;
+       sc->nvifs++;
  
-@@ -563,6 +311,11 @@ void ath9k_ani_reset(struct ath_hw *ah, 
-       /* always allow mode (on/off) to be controlled */
-       ah->ani_function |= ATH9K_ANI_MODE;
+-      ath9k_do_vif_add_setup(hw, vif);
++      ath9k_calculate_summary_state(hw, vif);
++      if (ath9k_uses_beacons(vif->type))
++              ath9k_beacon_assign_slot(sc, vif);
++
+ out:
+       mutex_unlock(&sc->mutex);
+       ath9k_ps_restore(sc);
+@@ -1038,6 +996,7 @@ static int ath9k_change_interface(struct
+       int ret = 0;
  
-+      ofdm_nil = max_t(int, ATH9K_ANI_OFDM_DEF_LEVEL,
-+                       aniState->ofdmNoiseImmunityLevel);
-+      cck_nil = max_t(int, ATH9K_ANI_CCK_DEF_LEVEL,
-+                       aniState->cckNoiseImmunityLevel);
+       ath_dbg(common, CONFIG, "Change Interface\n");
 +
-       if (is_scanning ||
-           (ah->opmode != NL80211_IFTYPE_STATION &&
-            ah->opmode != NL80211_IFTYPE_ADHOC)) {
-@@ -586,8 +339,8 @@ void ath9k_ani_reset(struct ath_hw *ah, 
-                               aniState->cckNoiseImmunityLevel);
-                       aniState->update_ani = false;
--                      ath9k_hw_set_ofdm_nil(ah, ATH9K_ANI_OFDM_DEF_LEVEL);
--                      ath9k_hw_set_cck_nil(ah, ATH9K_ANI_CCK_DEF_LEVEL);
-+                      ofdm_nil = ATH9K_ANI_OFDM_DEF_LEVEL;
-+                      cck_nil = ATH9K_ANI_CCK_DEF_LEVEL;
+       mutex_lock(&sc->mutex);
+       ath9k_ps_wakeup(sc);
+@@ -1050,15 +1009,16 @@ static int ath9k_change_interface(struct
                }
-       } else {
-               /*
-@@ -603,11 +356,9 @@ void ath9k_ani_reset(struct ath_hw *ah, 
-                       aniState->cckNoiseImmunityLevel);
-                       aniState->update_ani = true;
--                      ath9k_hw_set_ofdm_nil(ah,
--                                            aniState->ofdmNoiseImmunityLevel);
--                      ath9k_hw_set_cck_nil(ah,
--                                           aniState->cckNoiseImmunityLevel);
        }
-+      ath9k_hw_set_ofdm_nil(ah, ofdm_nil);
-+      ath9k_hw_set_cck_nil(ah, cck_nil);
  
-       /*
-        * enable phy counters if hw supports or if not, enable phy
-@@ -627,9 +378,6 @@ static bool ath9k_hw_ani_read_counters(s
- {
-       struct ath_common *common = ath9k_hw_common(ah);
-       struct ar5416AniState *aniState = &ah->curchan->ani;
--      u32 ofdm_base = 0;
--      u32 cck_base = 0;
--      u32 ofdmPhyErrCnt, cckPhyErrCnt;
-       u32 phyCnt1, phyCnt2;
-       int32_t listenTime;
-@@ -642,11 +390,6 @@ static bool ath9k_hw_ani_read_counters(s
-               return false;
-       }
+-      /* Clean up old vif stuff */
+       if (ath9k_uses_beacons(vif->type))
+-              ath9k_reclaim_beacon(sc, vif);
++              ath9k_beacon_remove_slot(sc, vif);
  
--      if (!use_new_ani(ah)) {
--              ofdm_base = AR_PHY_COUNTMAX - ah->config.ofdm_trig_high;
--              cck_base = AR_PHY_COUNTMAX - ah->config.cck_trig_high;
--      }
--
-       aniState->listenTime += listenTime;
-       ath9k_hw_update_mibstats(ah, &ah->ah_mibStats);
-@@ -654,35 +397,12 @@ static bool ath9k_hw_ani_read_counters(s
-       phyCnt1 = REG_READ(ah, AR_PHY_ERR_1);
-       phyCnt2 = REG_READ(ah, AR_PHY_ERR_2);
--      if (!use_new_ani(ah) && (phyCnt1 < ofdm_base || phyCnt2 < cck_base)) {
--              if (phyCnt1 < ofdm_base) {
--                      ath_dbg(common, ANI,
--                              "phyCnt1 0x%x, resetting counter value to 0x%x\n",
--                              phyCnt1, ofdm_base);
--                      REG_WRITE(ah, AR_PHY_ERR_1, ofdm_base);
--                      REG_WRITE(ah, AR_PHY_ERR_MASK_1,
--                                AR_PHY_ERR_OFDM_TIMING);
--              }
--              if (phyCnt2 < cck_base) {
--                      ath_dbg(common, ANI,
--                              "phyCnt2 0x%x, resetting counter value to 0x%x\n",
--                              phyCnt2, cck_base);
--                      REG_WRITE(ah, AR_PHY_ERR_2, cck_base);
--                      REG_WRITE(ah, AR_PHY_ERR_MASK_2,
--                                AR_PHY_ERR_CCK_TIMING);
--              }
--              return false;
--      }
-+      ah->stats.ast_ani_ofdmerrs += phyCnt1 - aniState->ofdmPhyErrCount;
-+      aniState->ofdmPhyErrCount = phyCnt1;
+-      /* Add new settings */
+       vif->type = new_type;
+       vif->p2p = p2p;
+-      ath9k_do_vif_add_setup(hw, vif);
++      ath9k_calculate_summary_state(hw, vif);
++      if (ath9k_uses_beacons(vif->type))
++              ath9k_beacon_assign_slot(sc, vif);
 +
-+      ah->stats.ast_ani_cckerrs += phyCnt2 - aniState->cckPhyErrCount;
-+      aniState->cckPhyErrCount = phyCnt2;
+ out:
+       ath9k_ps_restore(sc);
+       mutex_unlock(&sc->mutex);
+@@ -1078,9 +1038,8 @@ static void ath9k_remove_interface(struc
+       sc->nvifs--;
+-      /* Reclaim beacon resources */
+       if (ath9k_uses_beacons(vif->type))
+-              ath9k_reclaim_beacon(sc, vif);
++              ath9k_beacon_remove_slot(sc, vif);
  
--      ofdmPhyErrCnt = phyCnt1 - ofdm_base;
--      ah->stats.ast_ani_ofdmerrs +=
--              ofdmPhyErrCnt - aniState->ofdmPhyErrCount;
--      aniState->ofdmPhyErrCount = ofdmPhyErrCnt;
+       ath9k_calculate_summary_state(hw, NULL);
+@@ -1388,10 +1347,6 @@ static int ath9k_conf_tx(struct ieee8021
+       if (ret)
+               ath_err(common, "TXQ Update failed\n");
+-      if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)
+-              if (queue == WME_AC_BE && !ret)
+-                      ath_beaconq_config(sc);
 -
--      cckPhyErrCnt = phyCnt2 - cck_base;
--      ah->stats.ast_ani_cckerrs +=
--              cckPhyErrCnt - aniState->cckPhyErrCount;
--      aniState->cckPhyErrCount = cckPhyErrCnt;
-       return true;
- }
+       mutex_unlock(&sc->mutex);
+       ath9k_ps_restore(sc);
+@@ -1460,85 +1415,36 @@ static int ath9k_set_key(struct ieee8021
  
-@@ -716,21 +436,10 @@ void ath9k_hw_ani_monitor(struct ath_hw 
-       if (aniState->listenTime > ah->aniperiod) {
-               if (cckPhyErrRate < ah->config.cck_trig_low &&
--                  ((ofdmPhyErrRate < ah->config.ofdm_trig_low &&
--                    aniState->ofdmNoiseImmunityLevel <
--                    ATH9K_ANI_OFDM_DEF_LEVEL) ||
--                   (ofdmPhyErrRate < ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI &&
--                    aniState->ofdmNoiseImmunityLevel >=
--                    ATH9K_ANI_OFDM_DEF_LEVEL))) {
-+                  ofdmPhyErrRate < ah->config.ofdm_trig_low) {
-                       ath9k_hw_ani_lower_immunity(ah);
-                       aniState->ofdmsTurn = !aniState->ofdmsTurn;
--              } else if ((ofdmPhyErrRate > ah->config.ofdm_trig_high &&
--                          aniState->ofdmNoiseImmunityLevel >=
--                          ATH9K_ANI_OFDM_DEF_LEVEL) ||
--                         (ofdmPhyErrRate >
--                          ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI &&
--                          aniState->ofdmNoiseImmunityLevel <
--                          ATH9K_ANI_OFDM_DEF_LEVEL)) {
-+              } else if (ofdmPhyErrRate > ah->config.ofdm_trig_high) {
-                       ath9k_hw_ani_ofdm_err_trigger(ah);
-                       aniState->ofdmsTurn = false;
-               } else if (cckPhyErrRate > ah->config.cck_trig_high) {
-@@ -778,49 +487,6 @@ void ath9k_hw_disable_mib_counters(struc
+       return ret;
  }
- EXPORT_SYMBOL(ath9k_hw_disable_mib_counters);
+-static void ath9k_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
++
++static void ath9k_bss_assoc_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
+ {
+       struct ath_softc *sc = data;
+       struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+-      struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
+       struct ath_vif *avp = (void *)vif->drv_priv;
++      struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
+       unsigned long flags;
+-      /*
+-       * Skip iteration if primary station vif's bss info
+-       * was not changed
+-       */
++
+       if (test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))
+               return;
  
--/*
-- * Process a MIB interrupt.  We may potentially be invoked because
-- * any of the MIB counters overflow/trigger so don't assume we're
-- * here because a PHY error counter triggered.
-- */
--void ath9k_hw_proc_mib_event(struct ath_hw *ah)
--{
--      u32 phyCnt1, phyCnt2;
--
--      /* Reset these counters regardless */
--      REG_WRITE(ah, AR_FILT_OFDM, 0);
--      REG_WRITE(ah, AR_FILT_CCK, 0);
--      if (!(REG_READ(ah, AR_SLP_MIB_CTRL) & AR_SLP_MIB_PENDING))
--              REG_WRITE(ah, AR_SLP_MIB_CTRL, AR_SLP_MIB_CLEAR);
--
--      /* Clear the mib counters and save them in the stats */
--      ath9k_hw_update_mibstats(ah, &ah->ah_mibStats);
--
--      if (!DO_ANI(ah)) {
+       if (bss_conf->assoc) {
+               set_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
+               avp->primary_sta_vif = true;
++
+               memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
+               common->curaid = bss_conf->aid;
+               ath9k_hw_write_associd(sc->sc_ah);
+-              ath_dbg(common, CONFIG, "Bss Info ASSOC %d, bssid: %pM\n",
+-                      bss_conf->aid, common->curbssid);
+-              ath_beacon_config(sc, vif);
 -              /*
--               * We must always clear the interrupt cause by
--               * resetting the phy error regs.
+-               * Request a re-configuration of Beacon related timers
+-               * on the receipt of the first Beacon frame (i.e.,
+-               * after time sync with the AP).
 -               */
--              REG_WRITE(ah, AR_PHY_ERR_1, 0);
--              REG_WRITE(ah, AR_PHY_ERR_2, 0);
--              return;
--      }
--
--      /* NB: these are not reset-on-read */
--      phyCnt1 = REG_READ(ah, AR_PHY_ERR_1);
--      phyCnt2 = REG_READ(ah, AR_PHY_ERR_2);
--      if (((phyCnt1 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK) ||
--          ((phyCnt2 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK)) {
+-              spin_lock_irqsave(&sc->sc_pm_lock, flags);
+-              sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON;
+-              spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
+-              /* Reset rssi stats */
+               sc->last_rssi = ATH_RSSI_DUMMY_MARKER;
+               sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
+-              ath_start_rx_poll(sc, 3);
 -
--              if (!use_new_ani(ah))
--                      ath9k_hw_ani_read_counters(ah);
+-              if (!common->disable_ani) {
+-                      set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
+-                      ath_start_ani(common);
+-              }
 -
--              /* NB: always restart to insure the h/w counters are reset */
--              ath9k_ani_restart(ah);
 -      }
 -}
--EXPORT_SYMBOL(ath9k_hw_proc_mib_event);
 -
- void ath9k_hw_ani_setup(struct ath_hw *ah)
- {
-       int i;
-@@ -845,50 +511,31 @@ void ath9k_hw_ani_init(struct ath_hw *ah
-       ath_dbg(common, ANI, "Initialize ANI\n");
--      if (use_new_ani(ah)) {
--              ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_NEW;
--              ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_NEW;
-+      ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
-+      ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW;
--              ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_NEW;
--              ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_NEW;
--      } else {
--              ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_OLD;
--              ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_OLD;
+-static void ath9k_config_bss(struct ath_softc *sc, struct ieee80211_vif *vif)
+-{
+-      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+-      struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
+-      struct ath_vif *avp = (void *)vif->drv_priv;
+-
+-      if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION)
+-              return;
 -
--              ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_OLD;
--              ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_OLD;
+-      /* Reconfigure bss info */
+-      if (avp->primary_sta_vif && !bss_conf->assoc) {
+-              ath_dbg(common, CONFIG, "Bss Info DISASSOC %d, bssid %pM\n",
+-                      common->curaid, common->curbssid);
+-              clear_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
+-              clear_bit(SC_OP_BEACONS, &sc->sc_flags);
+-              avp->primary_sta_vif = false;
+-              memset(common->curbssid, 0, ETH_ALEN);
+-              common->curaid = 0;
 -      }
-+      ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH;
-+      ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW;
-       for (i = 0; i < ARRAY_SIZE(ah->channels); i++) {
-               struct ath9k_channel *chan = &ah->channels[i];
-               struct ar5416AniState *ani = &chan->ani;
--              if (use_new_ani(ah)) {
--                      ani->spurImmunityLevel =
--                              ATH9K_ANI_SPUR_IMMUNE_LVL_NEW;
-+              ani->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL;
--                      ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW;
-+              ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL;
--                      if (AR_SREV_9300_20_OR_LATER(ah))
--                              ani->mrcCCKOff =
--                                      !ATH9K_ANI_ENABLE_MRC_CCK;
--                      else
--                              ani->mrcCCKOff = true;
 -
--                      ani->ofdmsTurn = true;
--              } else {
--                      ani->spurImmunityLevel =
--                              ATH9K_ANI_SPUR_IMMUNE_LVL_OLD;
--                      ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_OLD;
-+              if (AR_SREV_9300_20_OR_LATER(ah))
-+                      ani->mrcCCKOff =
-+                              !ATH9K_ANI_ENABLE_MRC_CCK;
-+              else
-+                      ani->mrcCCKOff = true;
+-      ieee80211_iterate_active_interfaces_atomic(
+-                      sc->hw, ath9k_bss_iter, sc);
++              spin_lock_irqsave(&sc->sc_pm_lock, flags);
++              sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON;
++              spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
  
--                      ani->cckWeakSigThreshold =
--                              ATH9K_ANI_CCK_WEAK_SIG_THR;
--              }
-+              ani->ofdmsTurn = true;
-               ani->rssiThrHigh = ATH9K_ANI_RSSI_THR_HIGH;
-               ani->rssiThrLow = ATH9K_ANI_RSSI_THR_LOW;
--              ani->ofdmWeakSigDetectOff =
--                      !ATH9K_ANI_USE_OFDM_WEAK_SIG;
-+              ani->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG;
-               ani->cckNoiseImmunityLevel = ATH9K_ANI_CCK_DEF_LEVEL;
-               ani->ofdmNoiseImmunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL;
-               ani->update_ani = false;
-@@ -898,13 +545,8 @@ void ath9k_hw_ani_init(struct ath_hw *ah
-        * since we expect some ongoing maintenance on the tables, let's sanity
-        * check here default level should not modify INI setting.
-        */
--      if (use_new_ani(ah)) {
--              ah->aniperiod = ATH9K_ANI_PERIOD_NEW;
--              ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_NEW;
--      } else {
--              ah->aniperiod = ATH9K_ANI_PERIOD_OLD;
--              ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_OLD;
--      }
-+      ah->aniperiod = ATH9K_ANI_PERIOD;
-+      ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL;
-       if (ah->config.enable_ani)
-               ah->proc_phyerr |= HAL_PROCESS_ANI;
---- a/drivers/net/wireless/ath/ath9k/ani.h
-+++ b/drivers/net/wireless/ath/ath9k/ani.h
-@@ -24,42 +24,34 @@
- #define BEACON_RSSI(ahp) (ahp->stats.avgbrssi)
- /* units are errors per second */
--#define ATH9K_ANI_OFDM_TRIG_HIGH_OLD      500
--#define ATH9K_ANI_OFDM_TRIG_HIGH_NEW      3500
-+#define ATH9K_ANI_OFDM_TRIG_HIGH          3500
- #define ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI 1000
- /* units are errors per second */
--#define ATH9K_ANI_OFDM_TRIG_LOW_OLD       200
--#define ATH9K_ANI_OFDM_TRIG_LOW_NEW       400
-+#define ATH9K_ANI_OFDM_TRIG_LOW           400
- #define ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI 900
- /* units are errors per second */
--#define ATH9K_ANI_CCK_TRIG_HIGH_OLD       200
--#define ATH9K_ANI_CCK_TRIG_HIGH_NEW       600
-+#define ATH9K_ANI_CCK_TRIG_HIGH           600
- /* units are errors per second */
--#define ATH9K_ANI_CCK_TRIG_LOW_OLD        100
--#define ATH9K_ANI_CCK_TRIG_LOW_NEW        300
-+#define ATH9K_ANI_CCK_TRIG_LOW            300
- #define ATH9K_ANI_NOISE_IMMUNE_LVL        4
- #define ATH9K_ANI_USE_OFDM_WEAK_SIG       true
- #define ATH9K_ANI_CCK_WEAK_SIG_THR        false
--#define ATH9K_ANI_SPUR_IMMUNE_LVL_OLD     7
--#define ATH9K_ANI_SPUR_IMMUNE_LVL_NEW     3
-+#define ATH9K_ANI_SPUR_IMMUNE_LVL         3
--#define ATH9K_ANI_FIRSTEP_LVL_OLD         0
--#define ATH9K_ANI_FIRSTEP_LVL_NEW         2
-+#define ATH9K_ANI_FIRSTEP_LVL             2
- #define ATH9K_ANI_RSSI_THR_HIGH           40
- #define ATH9K_ANI_RSSI_THR_LOW            7
--#define ATH9K_ANI_PERIOD_OLD              100
--#define ATH9K_ANI_PERIOD_NEW              300
-+#define ATH9K_ANI_PERIOD                  300
- /* in ms */
--#define ATH9K_ANI_POLLINTERVAL_OLD        100
--#define ATH9K_ANI_POLLINTERVAL_NEW        1000
-+#define ATH9K_ANI_POLLINTERVAL            1000
- #define HAL_NOISE_IMMUNE_MAX              4
- #define HAL_SPUR_IMMUNE_MAX               7
-@@ -122,13 +114,12 @@ struct ar5416AniState {
-       u8 mrcCCKOff;
-       u8 spurImmunityLevel;
-       u8 firstepLevel;
--      u8 ofdmWeakSigDetectOff;
-+      u8 ofdmWeakSigDetect;
-       u8 cckWeakSigThreshold;
-       bool update_ani;
-       u32 listenTime;
-       int32_t rssiThrLow;
-       int32_t rssiThrHigh;
--      u32 noiseFloor;
-       u32 ofdmPhyErrCount;
-       u32 cckPhyErrCount;
-       int16_t pktRssi[2];
---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -995,141 +995,6 @@ static u32 ar5008_hw_compute_pll_control
-       return pll;
+-      /*
+-       * None of station vifs are associated.
+-       * Clear bssid & aid
+-       */
+-      if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
+-              ath9k_hw_write_associd(sc->sc_ah);
+-              clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
+-              del_timer_sync(&common->ani.timer);
+-              del_timer_sync(&sc->rx_poll_timer);
+-              memset(&sc->caldata, 0, sizeof(sc->caldata));
++              ath_dbg(common, CONFIG,
++                      "Primary Station interface: %pM, BSSID: %pM\n",
++                      vif->addr, common->curbssid);
+       }
  }
  
--static bool ar5008_hw_ani_control_old(struct ath_hw *ah,
--                                    enum ath9k_ani_cmd cmd,
--                                    int param)
--{
--      struct ar5416AniState *aniState = &ah->curchan->ani;
--      struct ath_common *common = ath9k_hw_common(ah);
--
--      switch (cmd & ah->ani_function) {
--      case ATH9K_ANI_NOISE_IMMUNITY_LEVEL:{
--              u32 level = param;
--
--              if (level >= ARRAY_SIZE(ah->totalSizeDesired)) {
--                      ath_dbg(common, ANI, "level out of range (%u > %zu)\n",
--                              level, ARRAY_SIZE(ah->totalSizeDesired));
--                      return false;
--              }
--
--              REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ,
--                            AR_PHY_DESIRED_SZ_TOT_DES,
--                            ah->totalSizeDesired[level]);
--              REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1,
--                            AR_PHY_AGC_CTL1_COARSE_LOW,
--                            ah->coarse_low[level]);
--              REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1,
--                            AR_PHY_AGC_CTL1_COARSE_HIGH,
--                            ah->coarse_high[level]);
--              REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,
--                            AR_PHY_FIND_SIG_FIRPWR,
--                            ah->firpwr[level]);
--
--              if (level > aniState->noiseImmunityLevel)
--                      ah->stats.ast_ani_niup++;
--              else if (level < aniState->noiseImmunityLevel)
--                      ah->stats.ast_ani_nidown++;
--              aniState->noiseImmunityLevel = level;
--              break;
--      }
--      case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{
--              u32 on = param ? 1 : 0;
--
--              if (on)
--                      REG_SET_BIT(ah, AR_PHY_SFCORR_LOW,
--                                  AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
--              else
--                      REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW,
--                                  AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
--
--              if (!on != aniState->ofdmWeakSigDetectOff) {
--                      if (on)
--                              ah->stats.ast_ani_ofdmon++;
--                      else
--                              ah->stats.ast_ani_ofdmoff++;
--                      aniState->ofdmWeakSigDetectOff = !on;
--              }
--              break;
--      }
--      case ATH9K_ANI_CCK_WEAK_SIGNAL_THR:{
--              static const int weakSigThrCck[] = { 8, 6 };
--              u32 high = param ? 1 : 0;
+@@ -1547,6 +1453,11 @@ static void ath9k_bss_info_changed(struc
+                                  struct ieee80211_bss_conf *bss_conf,
+                                  u32 changed)
+ {
++#define CHECK_ANI                             \
++      (BSS_CHANGED_ASSOC |                    \
++       BSS_CHANGED_IBSS |                     \
++       BSS_CHANGED_BEACON_ENABLED)
++
+       struct ath_softc *sc = hw->priv;
+       struct ath_hw *ah = sc->sc_ah;
+       struct ath_common *common = ath9k_hw_common(ah);
+@@ -1557,53 +1468,43 @@ static void ath9k_bss_info_changed(struc
+       mutex_lock(&sc->mutex);
+       if (changed & BSS_CHANGED_ASSOC) {
+-              ath9k_config_bss(sc, vif);
++              ath_dbg(common, CONFIG, "BSSID %pM Changed ASSOC %d\n",
++                      bss_conf->bssid, bss_conf->assoc);
+-              ath_dbg(common, CONFIG, "BSSID: %pM aid: 0x%x\n",
+-                      common->curbssid, common->curaid);
++              /*
++               * Do not do anything when the opmode is not STATION.
++               */
++              if (ah->opmode == NL80211_IFTYPE_STATION) {
++                      if (avp->primary_sta_vif && !bss_conf->assoc) {
++                              clear_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
++                              clear_bit(SC_OP_BEACONS, &sc->sc_flags);
++                              avp->primary_sta_vif = false;
++                      }
++
++                      ieee80211_iterate_active_interfaces_atomic(sc->hw,
++                                                 ath9k_bss_assoc_iter, sc);
++
++                      if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
++                              memset(common->curbssid, 0, ETH_ALEN);
++                              common->curaid = 0;
++                              ath9k_hw_write_associd(sc->sc_ah);
++                      }
++              }
+       }
+       if (changed & BSS_CHANGED_IBSS) {
+-              /* There can be only one vif available */
+               memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
+               common->curaid = bss_conf->aid;
+               ath9k_hw_write_associd(sc->sc_ah);
 -
--              REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT,
--                            AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK,
--                            weakSigThrCck[high]);
--              if (high != aniState->cckWeakSigThreshold) {
--                      if (high)
--                              ah->stats.ast_ani_cckhigh++;
--                      else
--                              ah->stats.ast_ani_ccklow++;
--                      aniState->cckWeakSigThreshold = high;
--              }
--              break;
--      }
--      case ATH9K_ANI_FIRSTEP_LEVEL:{
--              static const int firstep[] = { 0, 4, 8 };
--              u32 level = param;
+-              if (bss_conf->ibss_joined) {
+-                      sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
 -
--              if (level >= ARRAY_SIZE(firstep)) {
--                      ath_dbg(common, ANI, "level out of range (%u > %zu)\n",
--                              level, ARRAY_SIZE(firstep));
--                      return false;
--              }
--              REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,
--                            AR_PHY_FIND_SIG_FIRSTEP,
--                            firstep[level]);
--              if (level > aniState->firstepLevel)
--                      ah->stats.ast_ani_stepup++;
--              else if (level < aniState->firstepLevel)
--                      ah->stats.ast_ani_stepdown++;
--              aniState->firstepLevel = level;
--              break;
--      }
--      case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{
--              static const int cycpwrThr1[] = { 2, 4, 6, 8, 10, 12, 14, 16 };
--              u32 level = param;
+-                      if (!common->disable_ani) {
+-                              set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
+-                              ath_start_ani(common);
+-                      }
 -
--              if (level >= ARRAY_SIZE(cycpwrThr1)) {
--                      ath_dbg(common, ANI, "level out of range (%u > %zu)\n",
--                              level, ARRAY_SIZE(cycpwrThr1));
--                      return false;
+-              } else {
+-                      clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
+-                      del_timer_sync(&common->ani.timer);
+-                      del_timer_sync(&sc->rx_poll_timer);
 -              }
--              REG_RMW_FIELD(ah, AR_PHY_TIMING5,
--                            AR_PHY_TIMING5_CYCPWR_THR1,
--                            cycpwrThr1[level]);
--              if (level > aniState->spurImmunityLevel)
--                      ah->stats.ast_ani_spurup++;
--              else if (level < aniState->spurImmunityLevel)
--                      ah->stats.ast_ani_spurdown++;
--              aniState->spurImmunityLevel = level;
--              break;
--      }
--      case ATH9K_ANI_PRESENT:
--              break;
--      default:
--              ath_dbg(common, ANI, "invalid cmd %u\n", cmd);
--              return false;
--      }
--
--      ath_dbg(common, ANI, "ANI parameters:\n");
--      ath_dbg(common, ANI,
--              "noiseImmunityLevel=%d, spurImmunityLevel=%d, ofdmWeakSigDetectOff=%d\n",
--              aniState->noiseImmunityLevel,
--              aniState->spurImmunityLevel,
--              !aniState->ofdmWeakSigDetectOff);
--      ath_dbg(common, ANI,
--              "cckWeakSigThreshold=%d, firstepLevel=%d, listenTime=%d\n",
--              aniState->cckWeakSigThreshold,
--              aniState->firstepLevel,
--              aniState->listenTime);
--      ath_dbg(common, ANI, "ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n",
--              aniState->ofdmPhyErrCount,
--              aniState->cckPhyErrCount);
--
--      return true;
--}
+       }
+-      /*
+-       * In case of AP mode, the HW TSF has to be reset
+-       * when the beacon interval changes.
+-       */
+-      if ((changed & BSS_CHANGED_BEACON_INT) &&
+-          (vif->type == NL80211_IFTYPE_AP))
+-              set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
 -
- static bool ar5008_hw_ani_control_new(struct ath_hw *ah,
-                                     enum ath9k_ani_cmd cmd,
-                                     int param)
-@@ -1206,18 +1071,18 @@ static bool ar5008_hw_ani_control_new(st
-                       REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW,
-                                   AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
--              if (!on != aniState->ofdmWeakSigDetectOff) {
-+              if (on != aniState->ofdmWeakSigDetect) {
-                       ath_dbg(common, ANI,
-                               "** ch %d: ofdm weak signal: %s=>%s\n",
-                               chan->channel,
--                              !aniState->ofdmWeakSigDetectOff ?
-+                              aniState->ofdmWeakSigDetect ?
-                               "on" : "off",
-                               on ? "on" : "off");
-                       if (on)
-                               ah->stats.ast_ani_ofdmon++;
-                       else
-                               ah->stats.ast_ani_ofdmoff++;
--                      aniState->ofdmWeakSigDetectOff = !on;
-+                      aniState->ofdmWeakSigDetect = on;
+-      /* Configure beaconing (AP, IBSS, MESH) */
+-      if (ath9k_uses_beacons(vif->type) &&
+-          ((changed & BSS_CHANGED_BEACON) ||
+-           (changed & BSS_CHANGED_BEACON_ENABLED) ||
+-           (changed & BSS_CHANGED_BEACON_INT))) {
+-              ath9k_set_beaconing_status(sc, false);
+-              if (bss_conf->enable_beacon)
+-                      ath_beacon_alloc(sc, vif);
+-              else
+-                      avp->is_bslot_active = false;
+-              ath_beacon_config(sc, vif);
+-              ath9k_set_beaconing_status(sc, true);
++      if ((changed & BSS_CHANGED_BEACON) ||
++          (changed & BSS_CHANGED_BEACON_ENABLED) ||
++          (changed & BSS_CHANGED_BEACON_INT)) {
++              if (ah->opmode == NL80211_IFTYPE_AP)
++                      ath9k_set_tsfadjust(sc, vif);
++              if (ath9k_allow_beacon_config(sc, vif))
++                      ath9k_beacon_config(sc, vif, changed);
+       }
+       if (changed & BSS_CHANGED_ERP_SLOT) {
+@@ -1625,8 +1526,13 @@ static void ath9k_bss_info_changed(struc
                }
-               break;
        }
-@@ -1236,7 +1101,7 @@ static bool ar5008_hw_ani_control_new(st
-                * from INI file & cap value
-                */
-               value = firstep_table[level] -
--                      firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] +
-+                      firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
-                       aniState->iniDef.firstep;
-               if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN)
-                       value = ATH9K_SIG_FIRSTEP_SETTING_MIN;
-@@ -1251,7 +1116,7 @@ static bool ar5008_hw_ani_control_new(st
-                * from INI file & cap value
-                */
-               value2 = firstep_table[level] -
--                       firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] +
-+                       firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
-                        aniState->iniDef.firstepLow;
-               if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN)
-                       value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN;
-@@ -1267,7 +1132,7 @@ static bool ar5008_hw_ani_control_new(st
-                               chan->channel,
-                               aniState->firstepLevel,
-                               level,
--                              ATH9K_ANI_FIRSTEP_LVL_NEW,
-+                              ATH9K_ANI_FIRSTEP_LVL,
-                               value,
-                               aniState->iniDef.firstep);
-                       ath_dbg(common, ANI,
-@@ -1275,7 +1140,7 @@ static bool ar5008_hw_ani_control_new(st
-                               chan->channel,
-                               aniState->firstepLevel,
-                               level,
--                              ATH9K_ANI_FIRSTEP_LVL_NEW,
-+                              ATH9K_ANI_FIRSTEP_LVL,
-                               value2,
-                               aniState->iniDef.firstepLow);
-                       if (level > aniState->firstepLevel)
-@@ -1300,7 +1165,7 @@ static bool ar5008_hw_ani_control_new(st
-                * from INI file & cap value
-                */
-               value = cycpwrThr1_table[level] -
--                      cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] +
-+                      cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +
-                       aniState->iniDef.cycpwrThr1;
-               if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN)
-                       value = ATH9K_SIG_SPUR_IMM_SETTING_MIN;
-@@ -1316,7 +1181,7 @@ static bool ar5008_hw_ani_control_new(st
-                * from INI file & cap value
-                */
-               value2 = cycpwrThr1_table[level] -
--                       cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] +
-+                       cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +
-                        aniState->iniDef.cycpwrThr1Ext;
-               if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN)
-                       value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN;
-@@ -1331,7 +1196,7 @@ static bool ar5008_hw_ani_control_new(st
-                               chan->channel,
-                               aniState->spurImmunityLevel,
-                               level,
--                              ATH9K_ANI_SPUR_IMMUNE_LVL_NEW,
-+                              ATH9K_ANI_SPUR_IMMUNE_LVL,
-                               value,
-                               aniState->iniDef.cycpwrThr1);
-                       ath_dbg(common, ANI,
-@@ -1339,7 +1204,7 @@ static bool ar5008_hw_ani_control_new(st
-                               chan->channel,
-                               aniState->spurImmunityLevel,
-                               level,
--                              ATH9K_ANI_SPUR_IMMUNE_LVL_NEW,
-+                              ATH9K_ANI_SPUR_IMMUNE_LVL,
-                               value2,
-                               aniState->iniDef.cycpwrThr1Ext);
-                       if (level > aniState->spurImmunityLevel)
-@@ -1367,7 +1232,7 @@ static bool ar5008_hw_ani_control_new(st
-       ath_dbg(common, ANI,
-               "ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n",
-               aniState->spurImmunityLevel,
--              !aniState->ofdmWeakSigDetectOff ? "on" : "off",
-+              aniState->ofdmWeakSigDetect ? "on" : "off",
-               aniState->firstepLevel,
-               !aniState->mrcCCKOff ? "on" : "off",
-               aniState->listenTime,
-@@ -1454,9 +1319,9 @@ static void ar5008_hw_ani_cache_ini_regs
-                                              AR_PHY_EXT_TIMING5_CYCPWR_THR1);
-       /* these levels just got reset to defaults by the INI */
--      aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW;
--      aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW;
--      aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG;
-+      aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL;
-+      aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL;
-+      aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG;
-       aniState->mrcCCKOff = true; /* not available on pre AR9003 */
++      if (changed & CHECK_ANI)
++              ath_check_ani(sc);
++
+       mutex_unlock(&sc->mutex);
+       ath9k_ps_restore(sc);
++
++#undef CHECK_ANI
  }
  
-@@ -1545,11 +1410,8 @@ void ar5008_hw_attach_phy_ops(struct ath
-       priv_ops->do_getnf = ar5008_hw_do_getnf;
-       priv_ops->set_radar_params = ar5008_hw_set_radar_params;
+ static u64 ath9k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+@@ -1855,10 +1761,11 @@ static int ath9k_tx_last_beacon(struct i
+       if (!vif)
+               return 0;
  
--      if (modparam_force_new_ani) {
--              priv_ops->ani_control = ar5008_hw_ani_control_new;
--              priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs;
--      } else
--              priv_ops->ani_control = ar5008_hw_ani_control_old;
-+      priv_ops->ani_control = ar5008_hw_ani_control_new;
-+      priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs;
-       if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah))
-               priv_ops->compute_pll_control = ar9160_hw_compute_pll_control;
---- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
-@@ -21,10 +21,6 @@
- #include "ar9002_initvals.h"
- #include "ar9002_phy.h"
--int modparam_force_new_ani;
--module_param_named(force_new_ani, modparam_force_new_ani, int, 0444);
--MODULE_PARM_DESC(force_new_ani, "Force new ANI for AR5008, AR9001, AR9002");
--
- /* General hardware code for the A5008/AR9001/AR9002 hadware families */
- static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-@@ -825,18 +825,18 @@ static bool ar9003_hw_ani_control(struct
-                       REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW,
-                                   AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
--              if (!on != aniState->ofdmWeakSigDetectOff) {
-+              if (on != aniState->ofdmWeakSigDetect) {
-                       ath_dbg(common, ANI,
-                               "** ch %d: ofdm weak signal: %s=>%s\n",
-                               chan->channel,
--                              !aniState->ofdmWeakSigDetectOff ?
-+                              aniState->ofdmWeakSigDetect ?
-                               "on" : "off",
-                               on ? "on" : "off");
-                       if (on)
-                               ah->stats.ast_ani_ofdmon++;
-                       else
-                               ah->stats.ast_ani_ofdmoff++;
--                      aniState->ofdmWeakSigDetectOff = !on;
-+                      aniState->ofdmWeakSigDetect = on;
+-      avp = (void *)vif->drv_priv;
+-      if (!avp->is_bslot_active)
++      if (!vif->bss_conf.enable_beacon)
+               return 0;
++      avp = (void *)vif->drv_priv;
++
+       if (!sc->beacon.tx_processed && !edma) {
+               tasklet_disable(&sc->bcon_tasklet);
+--- a/drivers/net/wireless/ath/ath9k/mci.c
++++ b/drivers/net/wireless/ath/ath9k/mci.c
+@@ -202,7 +202,7 @@ static void ath_mci_cal_msg(struct ath_s
+       case MCI_GPM_BT_CAL_REQ:
+               if (mci_hw->bt_state == MCI_BT_AWAKE) {
+                       ar9003_mci_state(ah, MCI_STATE_SET_BT_CAL_START);
+-                      ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
++                      ath9k_queue_reset(sc, RESET_TYPE_MCI);
                }
+               ath_dbg(common, MCI, "MCI State : %d\n", mci_hw->bt_state);
                break;
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -553,7 +553,7 @@ static void ath_rx_ps_beacon(struct ath_
+               sc->ps_flags &= ~PS_BEACON_SYNC;
+               ath_dbg(common, PS,
+                       "Reconfigure Beacon timers based on timestamp from the AP\n");
+-              ath_set_beacon(sc);
++              ath9k_set_beacon(sc);
        }
-@@ -855,7 +855,7 @@ static bool ar9003_hw_ani_control(struct
-                * from INI file & cap value
-                */
-               value = firstep_table[level] -
--                      firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] +
-+                      firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
-                       aniState->iniDef.firstep;
-               if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN)
-                       value = ATH9K_SIG_FIRSTEP_SETTING_MIN;
-@@ -870,7 +870,7 @@ static bool ar9003_hw_ani_control(struct
-                * from INI file & cap value
-                */
-               value2 = firstep_table[level] -
--                       firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] +
-+                       firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
-                        aniState->iniDef.firstepLow;
-               if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN)
-                       value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN;
-@@ -886,7 +886,7 @@ static bool ar9003_hw_ani_control(struct
-                               chan->channel,
-                               aniState->firstepLevel,
-                               level,
--                              ATH9K_ANI_FIRSTEP_LVL_NEW,
-+                              ATH9K_ANI_FIRSTEP_LVL,
-                               value,
-                               aniState->iniDef.firstep);
-                       ath_dbg(common, ANI,
-@@ -894,7 +894,7 @@ static bool ar9003_hw_ani_control(struct
-                               chan->channel,
-                               aniState->firstepLevel,
-                               level,
--                              ATH9K_ANI_FIRSTEP_LVL_NEW,
-+                              ATH9K_ANI_FIRSTEP_LVL,
-                               value2,
-                               aniState->iniDef.firstepLow);
-                       if (level > aniState->firstepLevel)
-@@ -919,7 +919,7 @@ static bool ar9003_hw_ani_control(struct
-                * from INI file & cap value
-                */
-               value = cycpwrThr1_table[level] -
--                      cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] +
-+                      cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +
-                       aniState->iniDef.cycpwrThr1;
-               if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN)
-                       value = ATH9K_SIG_SPUR_IMM_SETTING_MIN;
-@@ -935,7 +935,7 @@ static bool ar9003_hw_ani_control(struct
-                * from INI file & cap value
-                */
-               value2 = cycpwrThr1_table[level] -
--                       cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] +
-+                       cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +
-                        aniState->iniDef.cycpwrThr1Ext;
-               if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN)
-                       value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN;
-@@ -950,7 +950,7 @@ static bool ar9003_hw_ani_control(struct
-                               chan->channel,
-                               aniState->spurImmunityLevel,
-                               level,
--                              ATH9K_ANI_SPUR_IMMUNE_LVL_NEW,
-+                              ATH9K_ANI_SPUR_IMMUNE_LVL,
-                               value,
-                               aniState->iniDef.cycpwrThr1);
-                       ath_dbg(common, ANI,
-@@ -958,7 +958,7 @@ static bool ar9003_hw_ani_control(struct
-                               chan->channel,
-                               aniState->spurImmunityLevel,
-                               level,
--                              ATH9K_ANI_SPUR_IMMUNE_LVL_NEW,
-+                              ATH9K_ANI_SPUR_IMMUNE_LVL,
-                               value2,
-                               aniState->iniDef.cycpwrThr1Ext);
-                       if (level > aniState->spurImmunityLevel)
-@@ -1002,7 +1002,7 @@ static bool ar9003_hw_ani_control(struct
-       ath_dbg(common, ANI,
-               "ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n",
-               aniState->spurImmunityLevel,
--              !aniState->ofdmWeakSigDetectOff ? "on" : "off",
-+              aniState->ofdmWeakSigDetect ? "on" : "off",
-               aniState->firstepLevel,
-               !aniState->mrcCCKOff ? "on" : "off",
-               aniState->listenTime,
-@@ -1111,9 +1111,9 @@ static void ar9003_hw_ani_cache_ini_regs
-                                              AR_PHY_EXT_CYCPWR_THR1);
-       /* these levels just got reset to defaults by the INI */
--      aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW;
--      aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW;
--      aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG;
-+      aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL;
-+      aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL;
-+      aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG;
-       aniState->mrcCCKOff = !ATH9K_ANI_ENABLE_MRC_CCK;
- }
  
---- a/drivers/net/wireless/ath/ath9k/debug.c
-+++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -348,8 +348,6 @@ void ath_debug_stat_interrupt(struct ath
-               sc->debug.stats.istats.txok++;
-       if (status & ATH9K_INT_TXURN)
-               sc->debug.stats.istats.txurn++;
--      if (status & ATH9K_INT_MIB)
--              sc->debug.stats.istats.mib++;
-       if (status & ATH9K_INT_RXPHY)
-               sc->debug.stats.istats.rxphyerr++;
-       if (status & ATH9K_INT_RXKCM)
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -1019,16 +1019,8 @@ void ar9002_hw_attach_ops(struct ath_hw 
- void ar9003_hw_attach_ops(struct ath_hw *ah);
- void ar9002_hw_load_ani_reg(struct ath_hw *ah, struct ath9k_channel *chan);
--/*
-- * ANI work can be shared between all families but a next
-- * generation implementation of ANI will be used only for AR9003 only
-- * for now as the other families still need to be tested with the same
-- * next generation ANI. Feel free to start testing it though for the
-- * older families (AR5008, AR9001, AR9002) by using modparam_force_new_ani.
-- */
--extern int modparam_force_new_ani;
-+
- void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning);
--void ath9k_hw_proc_mib_event(struct ath_hw *ah);
- void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan);
- #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -19,7 +19,7 @@
- #include "ath9k.h"
- #include "btcoex.h"
+       if (ath_beacon_dtim_pending_cab(skb)) {
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -614,10 +614,8 @@ static void ath_tx_complete_aggr(struct 
  
--static u8 parse_mpdudensity(u8 mpdudensity)
-+u8 ath9k_parse_mpdudensity(u8 mpdudensity)
- {
-       /*
-        * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
-@@ -320,6 +320,7 @@ static void ath_node_attach(struct ath_s
-                           struct ieee80211_vif *vif)
- {
-       struct ath_node *an;
-+      u8 density;
-       an = (struct ath_node *)sta->drv_priv;
+       rcu_read_unlock();
  
- #ifdef CONFIG_ATH9K_DEBUGFS
-@@ -334,7 +335,8 @@ static void ath_node_attach(struct ath_s
-               ath_tx_node_init(sc, an);
-               an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
-                                    sta->ht_cap.ampdu_factor);
--              an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density);
-+              density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
-+              an->mpdudensity = density;
-       }
+-      if (needreset) {
+-              RESET_STAT_INC(sc, RESET_TYPE_TX_ERROR);
+-              ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
+-      }
++      if (needreset)
++              ath9k_queue_reset(sc, RESET_TYPE_TX_ERROR);
  }
  
-@@ -516,24 +518,6 @@ irqreturn_t ath_isr(int irq, void *dev)
-               ath9k_hw_set_interrupts(ah);
-       }
+ static bool ath_lookup_legacy(struct ath_buf *bf)
+@@ -1586,7 +1584,8 @@ void ath_txq_schedule(struct ath_softc *
+       struct ath_atx_ac *ac, *ac_tmp, *last_ac;
+       struct ath_atx_tid *tid, *last_tid;
  
--      if (status & ATH9K_INT_MIB) {
--              /*
--               * Disable interrupts until we service the MIB
--               * interrupt; otherwise it will continue to
--               * fire.
--               */
--              ath9k_hw_disable_interrupts(ah);
--              /*
--               * Let the hal handle the event. We assume
--               * it will clear whatever condition caused
--               * the interrupt.
--               */
--              spin_lock(&common->cc_lock);
--              ath9k_hw_proc_mib_event(ah);
--              spin_unlock(&common->cc_lock);
--              ath9k_hw_enable_interrupts(ah);
--      }
--
-       if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
-               if (status & ATH9K_INT_TIM_TIMER) {
-                       if (ATH_DBG_WARN_ON_ONCE(sc->ps_idle))
-@@ -959,14 +943,10 @@ static void ath9k_calculate_summary_stat
-       /*
-        * Enable MIB interrupts when there are hardware phy counters.
-        */
--      if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0) {
--              if (ah->config.enable_ani)
--                      ah->imask |= ATH9K_INT_MIB;
-+      if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0)
-               ah->imask |= ATH9K_INT_TSFOOR;
--      } else {
--              ah->imask &= ~ATH9K_INT_MIB;
-+      else
-               ah->imask &= ~ATH9K_INT_TSFOOR;
--      }
+-      if (work_pending(&sc->hw_reset_work) || list_empty(&txq->axq_acq) ||
++      if (test_bit(SC_OP_HW_RESET, &sc->sc_flags) ||
++          list_empty(&txq->axq_acq) ||
+           txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH)
+               return;
  
-       ath9k_hw_set_interrupts(ah);
+@@ -2191,7 +2190,7 @@ static void ath_tx_processq(struct ath_s
+       ath_txq_lock(sc, txq);
+       for (;;) {
+-              if (work_pending(&sc->hw_reset_work))
++              if (test_bit(SC_OP_HW_RESET, &sc->sc_flags))
+                       break;
+               if (list_empty(&txq->axq_q)) {
+@@ -2274,7 +2273,7 @@ void ath_tx_edma_tasklet(struct ath_soft
+       int status;
  
+       for (;;) {
+-              if (work_pending(&sc->hw_reset_work))
++              if (test_bit(SC_OP_HW_RESET, &sc->sc_flags))
+                       break;
+               status = ath9k_hw_txprocdesc(ah, NULL, (void *)&ts);
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -3596,22 +3596,6 @@ void ieee80211_request_smps(struct ieee8
+                           enum ieee80211_smps_mode smps_mode);
+ /**
+- * ieee80211_key_removed - disable hw acceleration for key
+- * @key_conf: The key hw acceleration should be disabled for
+- *
+- * This allows drivers to indicate that the given key has been
+- * removed from hardware acceleration, due to a new key that
+- * was added. Don't use this if the key can continue to be used
+- * for TX, if the key restriction is on RX only it is permitted
+- * to keep the key for TX only and not call this function.
+- *
+- * Due to locking constraints, it may only be called during
+- * @set_key. This function must be allowed to sleep, and the
+- * key it tries to disable may still be used until it returns.
+- */
+-void ieee80211_key_removed(struct ieee80211_key_conf *key_conf);
+-
+-/**
+  * ieee80211_ready_on_channel - notification of remain-on-channel start
+  * @hw: pointer as obtained from ieee80211_alloc_hw()
+  */
 --- a/net/mac80211/agg-rx.c
 +++ b/net/mac80211/agg-rx.c
-@@ -201,6 +201,8 @@ static void ieee80211_send_addba_resp(st
+@@ -203,6 +203,8 @@ static void ieee80211_send_addba_resp(st
                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
        else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
                memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
        else if (sdata->vif.type == NL80211_IFTYPE_STATION)
                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
-@@ -456,6 +457,7 @@ int ieee80211_start_tx_ba_session(struct
+@@ -459,6 +460,7 @@ int ieee80211_start_tx_ba_session(struct
            sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
            sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
            sdata->vif.type != NL80211_IFTYPE_AP &&
            sdata->vif.type != NL80211_IFTYPE_ADHOC)
                return -EINVAL;
  
+--- a/net/mac80211/cfg.c
++++ b/net/mac80211/cfg.c
+@@ -1741,6 +1741,8 @@ static int ieee80211_set_txq_params(stru
+               return -EINVAL;
+       }
++      ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
++
+       return 0;
+ }
 --- a/net/mac80211/debugfs_sta.c
 +++ b/net/mac80211/debugfs_sta.c
 @@ -63,11 +63,11 @@ static ssize_t sta_flags_read(struct fil
                            TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
-@@ -284,7 +284,6 @@ static int ieee80211_do_open(struct net_
+@@ -400,7 +400,6 @@ static int ieee80211_do_open(struct net_
  {
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_local *local = sdata->local;
        u32 changed = 0;
        int res;
        u32 hw_reconf_flags = 0;
-@@ -430,28 +429,6 @@ static int ieee80211_do_open(struct net_
+@@ -538,28 +537,6 @@ static int ieee80211_do_open(struct net_
  
        set_bit(SDATA_STATE_RUNNING, &sdata->state);
  
        /*
         * set_multicast_list will be invoked by the networking core
         * which will check whether any increments here were done in
-@@ -639,6 +616,8 @@ static void ieee80211_do_stop(struct iee
-               ieee80211_configure_filter(local);
-               break;
-       default:
-+              flush_work(&local->hw_roc_start);
-+              flush_work(&local->hw_roc_done);
-               flush_work(&sdata->work);
-               /*
-                * When we get here, the interface is marked down.
-@@ -845,6 +824,72 @@ static void ieee80211_if_setup(struct ne
+@@ -949,6 +926,72 @@ static void ieee80211_if_setup(struct ne
        dev->destructor = free_netdev;
  }
  
  static void ieee80211_iface_work(struct work_struct *work)
  {
        struct ieee80211_sub_if_data *sdata =
-@@ -949,6 +994,9 @@ static void ieee80211_iface_work(struct 
+@@ -1053,6 +1096,9 @@ static void ieee80211_iface_work(struct 
                                break;
                        ieee80211_mesh_rx_queued_mgmt(sdata, skb);
                        break;
                default:
                        WARN(1, "frame for unexpected interface type");
                        break;
+--- a/net/mac80211/key.c
++++ b/net/mac80211/key.c
+@@ -197,26 +197,6 @@ static void ieee80211_key_disable_hw_acc
+       key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
+ }
+-void ieee80211_key_removed(struct ieee80211_key_conf *key_conf)
+-{
+-      struct ieee80211_key *key;
+-
+-      key = container_of(key_conf, struct ieee80211_key, conf);
+-
+-      might_sleep();
+-      assert_key_lock(key->local);
+-
+-      key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
+-
+-      /*
+-       * Flush TX path to avoid attempts to use this key
+-       * after this function returns. Until then, drivers
+-       * must be prepared to handle the key.
+-       */
+-      synchronize_rcu();
+-}
+-EXPORT_SYMBOL_GPL(ieee80211_key_removed);
+-
+ static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
+                                       int idx, bool uni, bool multi)
+ {
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -1108,7 +1108,7 @@ void ieee80211_dynamic_ps_timer(unsigned
+ }
+ /* MLME */
+-static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
++static bool ieee80211_sta_wmm_params(struct ieee80211_local *local,
+                                    struct ieee80211_sub_if_data *sdata,
+                                    u8 *wmm_param, size_t wmm_param_len)
+ {
+@@ -1119,23 +1119,23 @@ static void ieee80211_sta_wmm_params(str
+       u8 *pos, uapsd_queues = 0;
+       if (!local->ops->conf_tx)
+-              return;
++              return false;
+       if (local->hw.queues < IEEE80211_NUM_ACS)
+-              return;
++              return false;
+       if (!wmm_param)
+-              return;
++              return false;
+       if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1)
+-              return;
++              return false;
+       if (ifmgd->flags & IEEE80211_STA_UAPSD_ENABLED)
+               uapsd_queues = ifmgd->uapsd_queues;
+       count = wmm_param[6] & 0x0f;
+       if (count == ifmgd->wmm_last_param_set)
+-              return;
++              return false;
+       ifmgd->wmm_last_param_set = count;
+       pos = wmm_param + 8;
+@@ -1202,6 +1202,7 @@ static void ieee80211_sta_wmm_params(str
+       /* enable WMM or activate new settings */
+       sdata->vif.bss_conf.qos = true;
++      return true;
+ }
+ static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
+@@ -2435,14 +2436,6 @@ static void ieee80211_rx_mgmt_beacon(str
+               directed_tim = ieee80211_check_tim(elems.tim, elems.tim_len,
+                                                  ifmgd->aid);
+-      if (ncrc != ifmgd->beacon_crc || !ifmgd->beacon_crc_valid) {
+-              ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems,
+-                                    true);
+-
+-              ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
+-                                       elems.wmm_param_len);
+-      }
+-
+       if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) {
+               if (directed_tim) {
+                       if (local->hw.conf.dynamic_ps_timeout > 0) {
+@@ -2473,6 +2466,13 @@ static void ieee80211_rx_mgmt_beacon(str
+       ifmgd->beacon_crc = ncrc;
+       ifmgd->beacon_crc_valid = true;
++      ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems,
++                            true);
++
++      if (ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
++                                   elems.wmm_param_len))
++              changed |= BSS_CHANGED_QOS;
++
+       if (elems.erp_info && elems.erp_info_len >= 1) {
+               erp_valid = true;
+               erp_value = elems.erp_info[0];
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -626,8 +626,12 @@ minstrel_ht_get_rate(void *priv, struct 
+ #ifdef CONFIG_MAC80211_DEBUGFS
+       /* use fixed index if set */
+-      if (mp->fixed_rate_idx != -1)
+-              sample_idx = mp->fixed_rate_idx;
++      if (mp->fixed_rate_idx != -1) {
++              mi->max_tp_rate = mp->fixed_rate_idx;
++              mi->max_tp_rate2 = mp->fixed_rate_idx;
++              mi->max_prob_rate = mp->fixed_rate_idx;
++              sample_idx = -1;
++      }
+ #endif
+       if (sample_idx >= 0) {
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -2281,6 +2281,7 @@ ieee80211_rx_h_action(struct ieee80211_r
+@@ -2262,6 +2262,7 @@ ieee80211_rx_h_action(struct ieee80211_r
                    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
                    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
                    sdata->vif.type != NL80211_IFTYPE_AP &&
                    sdata->vif.type != NL80211_IFTYPE_ADHOC)
                        break;
  
-@@ -2495,14 +2496,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
+@@ -2479,14 +2480,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
  
        if (!ieee80211_vif_is_mesh(&sdata->vif) &&
            sdata->vif.type != NL80211_IFTYPE_ADHOC &&
                break;
        case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
        case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
-@@ -2833,10 +2835,16 @@ static int prepare_for_handlers(struct i
+@@ -2817,10 +2819,16 @@ static int prepare_for_handlers(struct i
                }
                break;
        case NL80211_IFTYPE_WDS:
        WLAN_STA_CLEAR_PS_FILT,
        WLAN_STA_MFP,
        WLAN_STA_BLOCK_BA,
---- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -214,6 +214,7 @@ struct ath_frame_info {
-       enum ath9k_key_type keytype;
-       u8 keyix;
-       u8 retries;
-+      u8 rtscts_rate;
- };
- struct ath_buf_state {
-@@ -721,6 +722,7 @@ extern int ath9k_modparam_nohwcrypt;
- extern int led_blink;
- extern bool is_ath9k_unloaded;
-+u8 ath9k_parse_mpdudensity(u8 mpdudensity);
- irqreturn_t ath_isr(int irq, void *dev);
- int ath9k_init_device(u16 devid, struct ath_softc *sc,
-                   const struct ath_bus_ops *bus_ops);
---- a/drivers/net/wireless/ath/ath9k/xmit.c
-+++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -938,6 +938,7 @@ static void ath_buf_set_rate(struct ath_
-       struct ieee80211_tx_rate *rates;
-       const struct ieee80211_rate *rate;
-       struct ieee80211_hdr *hdr;
-+      struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu);
-       int i;
-       u8 rix = 0;
-@@ -948,18 +949,7 @@ static void ath_buf_set_rate(struct ath_
-       /* set dur_update_en for l-sig computation except for PS-Poll frames */
-       info->dur_update = !ieee80211_is_pspoll(hdr->frame_control);
--
--      /*
--       * We check if Short Preamble is needed for the CTS rate by
--       * checking the BSS's global flag.
--       * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
--       */
--      rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info);
--      info->rtscts_rate = rate->hw_value;
--
--      if (tx_info->control.vif &&
--          tx_info->control.vif->bss_conf.use_short_preamble)
--              info->rtscts_rate |= rate->hw_value_short;
-+      info->rtscts_rate = fi->rtscts_rate;
-       for (i = 0; i < 4; i++) {
-               bool is_40, is_sgi, is_sp;
-@@ -1001,13 +991,13 @@ static void ath_buf_set_rate(struct ath_
-               }
-               /* legacy rates */
-+              rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
-               if ((tx_info->band == IEEE80211_BAND_2GHZ) &&
-                   !(rate->flags & IEEE80211_RATE_ERP_G))
-                       phy = WLAN_RC_PHY_CCK;
-               else
-                       phy = WLAN_RC_PHY_OFDM;
--              rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
-               info->rates[i].Rate = rate->hw_value;
-               if (rate->hw_value_short) {
-                       if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
-@@ -1175,6 +1165,7 @@ int ath_tx_aggr_start(struct ath_softc *
- {
-       struct ath_atx_tid *txtid;
-       struct ath_node *an;
-+      u8 density;
-       an = (struct ath_node *)sta->drv_priv;
-       txtid = ATH_AN_2_TID(an, tid);
-@@ -1182,6 +1173,17 @@ int ath_tx_aggr_start(struct ath_softc *
-       if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE))
-               return -EAGAIN;
-+      /* update ampdu factor/density, they may have changed. This may happen
-+       * in HT IBSS when a beacon with HT-info is received after the station
-+       * has already been added.
-+       */
-+      if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
-+              an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
-+                                   sta->ht_cap.ampdu_factor);
-+              density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
-+              an->mpdudensity = density;
-+      }
-+
-       txtid->state |= AGGR_ADDBA_PROGRESS;
-       txtid->paused = true;
-       *ssn = txtid->seq_start = txtid->seq_next;
-@@ -1776,10 +1778,22 @@ static void setup_frame_info(struct ieee
-       struct ieee80211_sta *sta = tx_info->control.sta;
-       struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-+      const struct ieee80211_rate *rate;
-       struct ath_frame_info *fi = get_frame_info(skb);
-       struct ath_node *an = NULL;
-       enum ath9k_key_type keytype;
-+      bool short_preamble = false;
-+
-+      /*
-+       * We check if Short Preamble is needed for the CTS rate by
-+       * checking the BSS's global flag.
-+       * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
-+       */
-+      if (tx_info->control.vif &&
-+          tx_info->control.vif->bss_conf.use_short_preamble)
-+              short_preamble = true;
-+      rate = ieee80211_get_rts_cts_rate(hw, tx_info);
-       keytype = ath9k_cmn_get_hw_crypto_keytype(skb);
-       if (sta)
-@@ -1794,6 +1808,9 @@ static void setup_frame_info(struct ieee
-               fi->keyix = ATH9K_TXKEYIX_INVALID;
-       fi->keytype = keytype;
-       fi->framelen = framelen;
-+      fi->rtscts_rate = rate->hw_value;
-+      if (short_preamble)
-+              fi->rtscts_rate |= rate->hw_value_short;
- }
- u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -2246,6 +2246,33 @@ static int nl80211_parse_beacon(struct g
-       return 0;
- }
-+static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
-+                                 struct cfg80211_ap_settings *params)
-+{
-+      struct wireless_dev *wdev;
-+      bool ret = false;
-+
-+      mutex_lock(&rdev->devlist_mtx);
-+
-+      list_for_each_entry(wdev, &rdev->netdev_list, list) {
-+              if (wdev->iftype != NL80211_IFTYPE_AP &&
-+                  wdev->iftype != NL80211_IFTYPE_P2P_GO)
-+                      continue;
-+
-+              if (!wdev->preset_chan)
-+                      continue;
-+
-+              params->channel = wdev->preset_chan;
-+              params->channel_type = wdev->preset_chantype;
-+              ret = true;
-+              break;
-+      }
-+
-+      mutex_unlock(&rdev->devlist_mtx);
-+
-+      return ret;
-+}
-+
- static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -2716,7 +2716,7 @@ EXPORT_SYMBOL(ieee80211_get_buffered_bc)
+ void ieee80211_tx_skb_tid(struct ieee80211_sub_if_data *sdata,
+                         struct sk_buff *skb, int tid)
  {
-       struct cfg80211_registered_device *rdev = info->user_ptr[0];
-@@ -2348,7 +2375,7 @@ static int nl80211_start_ap(struct sk_bu
-       } else if (wdev->preset_chan) {
-               params.channel = wdev->preset_chan;
-               params.channel_type = wdev->preset_chantype;
--      } else
-+      } else if (!nl80211_get_ap_channel(rdev, &params))
-               return -EINVAL;
-       if (!cfg80211_can_beacon_sec_chan(&rdev->wiphy, params.channel,
-@@ -2356,8 +2383,11 @@ static int nl80211_start_ap(struct sk_bu
-               return -EINVAL;
-       err = rdev->ops->start_ap(&rdev->wiphy, dev, &params);
--      if (!err)
-+      if (!err) {
-+              wdev->preset_chan = params.channel;
-+              wdev->preset_chantype = params.channel_type;
-               wdev->beacon_interval = params.beacon_interval;
-+      }
-       return err;
- }
---- a/drivers/net/wireless/ath/ath9k/link.c
-+++ b/drivers/net/wireless/ath/ath9k/link.c
-@@ -407,6 +407,7 @@ void ath_ani_calibrate(unsigned long dat
-               longcal ? "long" : "", shortcal ? "short" : "",
-               aniflag ? "ani" : "", common->ani.caldone ? "true" : "false");
-+      ath9k_debug_samp_bb_mac(sc);
-       ath9k_ps_restore(sc);
- set_timer:
-@@ -415,7 +416,6 @@ set_timer:
-       * The interval must be the shortest necessary to satisfy ANI,
-       * short calibration and long calibration.
-       */
--      ath9k_debug_samp_bb_mac(sc);
-       cal_interval = ATH_LONG_CALINTERVAL;
-       if (sc->sc_ah->config.enable_ani)
-               cal_interval = min(cal_interval,
---- a/drivers/net/wireless/ath/ath.h
-+++ b/drivers/net/wireless/ath/ath.h
-@@ -143,6 +143,7 @@ struct ath_common {
-       u32 keymax;
-       DECLARE_BITMAP(keymap, ATH_KEYMAX);
-       DECLARE_BITMAP(tkip_keymap, ATH_KEYMAX);
-+      DECLARE_BITMAP(ccmp_keymap, ATH_KEYMAX);
-       enum ath_crypt_caps crypt_caps;
-       unsigned int clockrate;
---- a/drivers/net/wireless/ath/ath9k/recv.c
-+++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -785,7 +785,8 @@ static bool ath9k_rx_accept(struct ath_c
-        * descriptor does contain a valid key index. This has been observed
-        * mostly with CCMP encryption.
-        */
--      if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID)
-+      if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID ||
-+          !test_bit(rx_stats->rs_keyix, common->ccmp_keymap))
-               rx_stats->rs_status &= ~ATH9K_RXERR_KEYMISS;
-       if (!rx_stats->rs_datalen) {
---- a/drivers/net/wireless/ath/key.c
-+++ b/drivers/net/wireless/ath/key.c
-@@ -556,6 +556,9 @@ int ath_key_config(struct ath_common *co
-               return -EIO;
-       set_bit(idx, common->keymap);
-+      if (key->cipher == WLAN_CIPHER_SUITE_CCMP)
-+              set_bit(idx, common->ccmp_keymap);
-+
-       if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
-               set_bit(idx + 64, common->keymap);
-               set_bit(idx, common->tkip_keymap);
-@@ -582,6 +585,7 @@ void ath_key_delete(struct ath_common *c
-               return;
-       clear_bit(key->hw_key_idx, common->keymap);
-+      clear_bit(key->hw_key_idx, common->ccmp_keymap);
-       if (key->cipher != WLAN_CIPHER_SUITE_TKIP)
-               return;
+-      int ac = ieee802_1d_to_ac[tid];
++      int ac = ieee802_1d_to_ac[tid & 7];
  
+       skb_set_mac_header(skb, 0);
+       skb_set_network_header(skb, 0);
index 7c59e1f..2f469b6 100644 (file)
@@ -8,7 +8,7 @@
  #include <asm/unaligned.h>
  
  #include "hw.h"
-@@ -523,8 +524,16 @@ static int ath9k_hw_init_macaddr(struct 
+@@ -526,8 +527,16 @@ static int ath9k_hw_init_macaddr(struct 
                common->macaddr[2 * i] = eeval >> 8;
                common->macaddr[2 * i + 1] = eeval & 0xff;
        }
index 577275d..f58f805 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net/wireless/reg.c
 +++ b/net/wireless/reg.c
-@@ -1699,6 +1699,8 @@ void regulatory_hint_11d(struct wiphy *w
+@@ -1702,6 +1702,8 @@ void regulatory_hint_11d(struct wiphy *w
        enum environment_cap env = ENVIRON_ANY;
        struct regulatory_request *request;
  
@@ -9,7 +9,7 @@
        mutex_lock(&reg_mutex);
  
        if (unlikely(!last_request))
-@@ -1934,6 +1936,8 @@ static void restore_regulatory_settings(
+@@ -1937,6 +1939,8 @@ static void restore_regulatory_settings(
  
  void regulatory_hint_disconnect(void)
  {
index 2f23096..8fa6f2a 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -776,17 +776,11 @@ int ieee80211_register_hw(struct ieee802
+@@ -786,17 +786,11 @@ int ieee80211_register_hw(struct ieee802
         */
        for (i = 0; i < hw->wiphy->n_iface_combinations; i++) {
                const struct ieee80211_iface_combination *c;
index 0d53d5c..ec33376 100644 (file)
@@ -9,11 +9,9 @@ Other devices will need to be added to the switch in  write_file_bwmode
 drivers/net/wireless/ath/ath5k/debug.c |   86 ++++++++++++++++++++++++++++++++
  1 files changed, 86 insertions(+), 0 deletions(-)
 
-diff --git a/drivers/net/wireless/ath/ath5k/debug.c b/drivers/net/wireless/ath/ath5k/debug.c
-index 8c5ce8b..bb41066 100644
 --- a/drivers/net/wireless/ath/ath5k/debug.c
 +++ b/drivers/net/wireless/ath/ath5k/debug.c
-@@ -815,6 +815,89 @@ static const struct file_operations fops_ani = {
+@@ -812,6 +812,89 @@ static const struct file_operations fops
        .llseek = default_llseek,
  };
  
@@ -103,7 +101,7 @@ index 8c5ce8b..bb41066 100644
  
  /* debugfs: queues etc */
  
-@@ -906,6 +989,9 @@ ath5k_debug_init_device(struct ath5k_hw *ah)
+@@ -903,6 +986,9 @@ ath5k_debug_init_device(struct ath5k_hw 
        debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah,
                            &fops_beacon);
  
@@ -113,4 +111,3 @@ index 8c5ce8b..bb41066 100644
        debugfs_create_file("reset", S_IWUSR, phydir, ah, &fops_reset);
  
        debugfs_create_file("antenna", S_IWUSR | S_IRUSR, phydir, ah,
--- 
index ed50ea4..49e80ca 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1533,6 +1533,53 @@ static const struct file_operations fops
+@@ -1532,6 +1532,53 @@ static const struct file_operations fops
  
  #endif
  
@@ -54,7 +54,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
        struct ath_common *common = ath9k_hw_common(ah);
-@@ -1596,5 +1643,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1595,5 +1642,8 @@ int ath9k_init_debug(struct ath_hw *ah)
        debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
                           sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
  
index 710ca7b..19975c8 100644 (file)
@@ -71,7 +71,7 @@
                        ath_err(common, "Reading Magic # failed\n");
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -657,6 +657,7 @@ enum ath_cal_list {
+@@ -658,6 +658,7 @@ enum ath_cal_list {
  #define AH_USE_EEPROM   0x1
  #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
  #define AH_FASTCC       0x4
index 9ff7781..fb6b270 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1928,8 +1928,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -1956,8 +1956,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
                REG_WRITE(ah, AR_OBS, 8);
  
        if (ah->config.rx_intr_mitigation) {
index 6126313..d688b06 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -641,6 +641,7 @@ struct ath_softc {
+@@ -649,6 +649,7 @@ struct ath_softc {
        struct ieee80211_hw *hw;
        struct device *dev;
  
@@ -8,7 +8,7 @@
        struct survey_info *cur_survey;
        struct survey_info survey[ATH9K_NUM_CHANNELS];
  
-@@ -709,6 +710,7 @@ struct ath_softc {
+@@ -717,6 +718,7 @@ struct ath_softc {
        struct dfs_pattern_detector *dfs_detector;
  };
  
@@ -18,7 +18,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1580,6 +1580,50 @@ static const struct file_operations fops
+@@ -1579,6 +1579,50 @@ static const struct file_operations fops
        .owner = THIS_MODULE
  };
  
@@ -69,7 +69,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
        struct ath_common *common = ath9k_hw_common(ah);
-@@ -1646,5 +1690,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1645,5 +1689,8 @@ int ath9k_init_debug(struct ath_hw *ah)
        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_eeprom);
  
@@ -80,7 +80,7 @@
  }
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1124,7 +1124,7 @@ static void ath9k_disable_ps(struct ath_
+@@ -1084,7 +1084,7 @@ static void ath9k_disable_ps(struct ath_
        ath_dbg(common, PS, "PowerSave disabled\n");
  }
  
@@ -89,7 +89,7 @@
  {
        struct ath_softc *sc = hw->priv;
        struct ath_hw *ah = sc->sc_ah;
-@@ -1175,9 +1175,11 @@ static int ath9k_config(struct ieee80211
+@@ -1138,9 +1138,11 @@ static int ath9k_config(struct ieee80211
  
        if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
                struct ieee80211_channel *curchan = hw->conf.channel;
  
                if (ah->curchan)
                        old_pos = ah->curchan - &ah->channels[0];
-@@ -1220,7 +1222,23 @@ static int ath9k_config(struct ieee80211
+@@ -1183,7 +1185,23 @@ static int ath9k_config(struct ieee80211
                        memset(&sc->survey[pos], 0, sizeof(struct survey_info));
                }
  
index 11f0215..604fcb1 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
-@@ -814,6 +814,7 @@ static const struct net_device_ops ieee8
+@@ -916,6 +916,7 @@ static const struct net_device_ops ieee8
  static void ieee80211_if_setup(struct net_device *dev)
  {
        ether_setup(dev);
index 9bb2ce8..b907e50 100644 (file)
@@ -11,7 +11,7 @@
        u16 listen_interval;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1940,7 +1940,7 @@ static int ieee80211_get_tx_power(struct
+@@ -1956,7 +1956,7 @@ static int ieee80211_get_tx_power(struct
  {
        struct ieee80211_local *local = wiphy_priv(wiphy);
  
index 2b47818..fa8d6c6 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1245,6 +1245,8 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1208,6 +1208,8 @@ int ath9k_config(struct ieee80211_hw *hw
                        return -EINVAL;
                }
  
@@ -9,7 +9,7 @@
                /*
                 * The most recent snapshot of channel->noisefloor for the old
                 * channel is only available after the hardware reset. Copy it to
-@@ -1259,6 +1261,7 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1222,6 +1224,7 @@ int ath9k_config(struct ieee80211_hw *hw
                sc->config.txpowlimit = 2 * conf->power_level;
                ath9k_cmn_update_txpow(ah, sc->curtxpow,
                                       sc->config.txpowlimit, &sc->curtxpow);
index 671ae7a..4740608 100644 (file)
@@ -37,7 +37,7 @@
  
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -1263,6 +1263,7 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1254,6 +1254,7 @@ ieee80211_rx_h_sta_process(struct ieee80
        struct sk_buff *skb = rx->skb;
        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
@@ -45,7 +45,7 @@
  
        if (!sta)
                return RX_CONTINUE;
-@@ -1307,6 +1308,19 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1298,6 +1299,19 @@ ieee80211_rx_h_sta_process(struct ieee80
                ewma_add(&sta->avg_signal, -status->signal);
        }
  
@@ -67,7 +67,7 @@
         * exchange sequence.
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -256,6 +256,8 @@ struct sta_info *sta_info_alloc(struct i
+@@ -254,6 +254,8 @@ struct sta_info *sta_info_alloc(struct i
        do_posix_clock_monotonic_gettime(&uptime);
        sta->last_connected = uptime.tv_sec;
        ewma_init(&sta->avg_signal, 1024, 8);
@@ -78,7 +78,7 @@
                kfree(sta);
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -527,6 +527,8 @@ struct station_parameters {
+@@ -546,6 +546,8 @@ struct station_parameters {
   * @STATION_INFO_STA_FLAGS: @sta_flags filled
   * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled
   * @STATION_INFO_T_OFFSET: @t_offset filled
@@ -87,7 +87,7 @@
   */
  enum station_info_flags {
        STATION_INFO_INACTIVE_TIME      = 1<<0,
-@@ -550,6 +552,8 @@ enum station_info_flags {
+@@ -569,6 +571,8 @@ enum station_info_flags {
        STATION_INFO_STA_FLAGS          = 1<<18,
        STATION_INFO_BEACON_LOSS_COUNT  = 1<<19,
        STATION_INFO_T_OFFSET           = 1<<20,
  };
  
  /**
-@@ -631,6 +635,9 @@ struct sta_bss_parameters {
-       NOTE: For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
-  * @signal_avg: avg signal strength, type depends on the wiphy's signal_type
-       NOTE: For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
+@@ -652,6 +656,9 @@ struct sta_bss_parameters {
+  *    For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
+  * @signal_avg: Average signal strength, type depends on the wiphy's signal_type.
+  *    For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
 + * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg
 + * @chain_signal: per-chain signal strength of last received packet in dBm
 + * @chain_signal_avg: per-chain signal strength average in dBm
   * @txrate: current unicast bitrate from this station
   * @rxrate: current unicast bitrate to this station
   * @rx_packets: packets received from this station
-@@ -663,6 +670,11 @@ struct station_info {
+@@ -684,6 +691,11 @@ struct station_info {
        u8 plink_state;
        s8 signal;
        s8 signal_avg;
        u8 rs_num_delims;
 --- a/drivers/net/wireless/ath/ath9k/recv.c
 +++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -952,6 +952,7 @@ static int ath9k_rx_skb_preprocess(struc
+@@ -955,6 +955,7 @@ static int ath9k_rx_skb_preprocess(struc
                                   bool *decrypt_error)
  {
        struct ath_hw *ah = common->ah;
  
        /*
         * everything but the rate is checked here, the rate check is done
-@@ -977,6 +978,20 @@ static int ath9k_rx_skb_preprocess(struc
+@@ -980,6 +981,20 @@ static int ath9k_rx_skb_preprocess(struc
        if (rx_stats->rs_moreaggr)
                rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
  
        if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -998,12 +998,12 @@ void ath_debug_stat_rx(struct ath_softc 
+@@ -997,12 +997,12 @@ void ath_debug_stat_rx(struct ath_softc 
  #ifdef CONFIG_ATH9K_MAC_DEBUG
        spin_lock(&sc->debug.samp_lock);
        RX_SAMP_DBG(jiffies) = jiffies;
        RX_SAMP_DBG(rate) = rs->rs_rate;
 --- a/include/linux/nl80211.h
 +++ b/include/linux/nl80211.h
-@@ -1699,6 +1699,8 @@ enum nl80211_sta_bss_param {
+@@ -1729,6 +1729,8 @@ enum nl80211_sta_bss_param {
   * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.
   * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32)
   * @NL80211_STA_INFO_T_OFFSET: timing offset with respect to this STA (s64)
   * @__NL80211_STA_INFO_AFTER_LAST: internal
   * @NL80211_STA_INFO_MAX: highest possible station info attribute
   */
-@@ -1723,6 +1725,8 @@ enum nl80211_sta_info {
+@@ -1753,6 +1755,8 @@ enum nl80211_sta_info {
        NL80211_STA_INFO_STA_FLAGS,
        NL80211_STA_INFO_BEACON_LOSS,
        NL80211_STA_INFO_T_OFFSET,
        __NL80211_STA_INFO_AFTER_LAST,
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -2553,6 +2553,32 @@ nla_put_failure:
+@@ -2648,6 +2648,32 @@ nla_put_failure:
        return false;
  }
  
  static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
                                int flags,
                                struct cfg80211_registered_device *rdev,
-@@ -2614,6 +2640,18 @@ static int nl80211_send_station(struct s
+@@ -2709,6 +2735,18 @@ static int nl80211_send_station(struct s
        default:
                break;
        }
                                          NL80211_STA_INFO_TX_BITRATE))
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -354,6 +354,7 @@ static void sta_set_sinfo(struct sta_inf
- {
+@@ -355,6 +355,7 @@ static void sta_set_sinfo(struct sta_inf
        struct ieee80211_sub_if_data *sdata = sta->sdata;
+       struct ieee80211_local *local = sdata->local;
        struct timespec uptime;
 +      int i;
  
        sinfo->generation = sdata->local->sta_generation;
  
-@@ -391,6 +392,17 @@ static void sta_set_sinfo(struct sta_inf
-               sinfo->signal = (s8)sta->last_signal;
+@@ -394,6 +395,17 @@ static void sta_set_sinfo(struct sta_inf
+                       sinfo->signal = (s8)sta->last_signal;
                sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
        }
 +      if (sta->chains) {
index 99121f7..d86e718 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
-@@ -533,108 +533,108 @@ static const u32 ar9300_2p2_baseband_cor
+@@ -534,108 +534,108 @@ static const u32 ar9300_2p2_baseband_cor
  
  static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = {
        /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
index dbda5ef..2dfc1ed 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -519,6 +519,9 @@ static inline u16 ath9k_btcoex_aggr_limi
+@@ -528,6 +528,9 @@ static inline void ath9k_btcoex_stop_gen
  #ifdef CONFIG_MAC80211_LEDS
  void ath_init_leds(struct ath_softc *sc);
  void ath_deinit_leds(struct ath_softc *sc);
@@ -10,7 +10,7 @@
  #else
  static inline void ath_init_leds(struct ath_softc *sc)
  {
-@@ -637,6 +640,13 @@ struct ath9k_vif_iter_data {
+@@ -645,6 +648,13 @@ struct ath9k_vif_iter_data {
        int nadhocs;   /* number of adhoc vifs */
  };
  
@@ -24,7 +24,7 @@
  struct ath_softc {
        struct ieee80211_hw *hw;
        struct device *dev;
-@@ -678,9 +688,8 @@ struct ath_softc {
+@@ -686,9 +696,8 @@ struct ath_softc {
        struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
  
  #ifdef CONFIG_MAC80211_LEDS
  #endif
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1256,6 +1256,61 @@ static const struct file_operations fops
+@@ -1255,6 +1255,61 @@ static const struct file_operations fops
        .llseek = default_llseek,
  };
  
  #ifdef CONFIG_ATH9K_MAC_DEBUG
  
  void ath9k_debug_samp_bb_mac(struct ath_softc *sc)
-@@ -1681,6 +1736,11 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1680,6 +1735,11 @@ int ath9k_init_debug(struct ath_hw *ah)
                            &fops_samps);
  #endif
  
index ea066a8..ae962b5 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -702,6 +702,8 @@ struct ieee80211_sub_if_data {
+@@ -710,6 +710,8 @@ struct ieee80211_sub_if_data {
  
        /* bitmap of allowed (non-MCS) rate indexes for rate control */
        u32 rc_rateidx_mask[IEEE80211_NUM_BANDS];
@@ -11,7 +11,7 @@
        union {
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2119,9 +2119,20 @@ static int ieee80211_set_bitrate_mask(st
+@@ -2135,9 +2135,20 @@ static int ieee80211_set_bitrate_mask(st
        }
  
        for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
@@ -34,7 +34,7 @@
        return 0;
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -3676,7 +3676,7 @@ void ieee80211_send_bar(struct ieee80211
+@@ -3665,7 +3665,7 @@ void ieee80211_send_bar(struct ieee80211
   *    (deprecated; this will be removed once drivers get updated to use
   *    rate_idx_mask)
   * @rate_idx_mask: user-requested (legacy) rate mask
@@ -43,7 +43,7 @@
   * @bss: whether this frame is sent out in AP or IBSS mode
   */
  struct ieee80211_tx_rate_control {
-@@ -3688,7 +3688,7 @@ struct ieee80211_tx_rate_control {
+@@ -3677,7 +3677,7 @@ struct ieee80211_tx_rate_control {
        bool rts, short_preamble;
        u8 max_rate_idx;
        u32 rate_idx_mask;
@@ -54,7 +54,7 @@
  
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -637,9 +637,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
+@@ -624,9 +624,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
                txrc.max_rate_idx = -1;
        else
                txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
@@ -69,7 +69,7 @@
        txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP ||
                    tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
                    tx->sdata->vif.type == NL80211_IFTYPE_ADHOC);
-@@ -2475,8 +2477,6 @@ struct sk_buff *ieee80211_beacon_get_tim
+@@ -2454,8 +2456,6 @@ struct sk_buff *ieee80211_beacon_get_tim
                txrc.max_rate_idx = -1;
        else
                txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
index 8b5005b..9ad4f57 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1929,12 +1929,29 @@ static u32 fill_chainmask(u32 cap, u32 n
+@@ -1840,12 +1840,29 @@ static u32 fill_chainmask(u32 cap, u32 n
        return filled;
  }
  
index 7503634..72a56a6 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -676,10 +676,6 @@ static int __ath9k_hw_init(struct ath_hw
+@@ -680,10 +680,6 @@ static int __ath9k_hw_init(struct ath_hw
        if (!AR_SREV_9300_20_OR_LATER(ah))
                ah->ani_function &= ~ATH9K_ANI_MRC_CCK;
  
diff --git a/package/mac80211/patches/564-ath9k_fix_ani_update.patch b/package/mac80211/patches/564-ath9k_fix_ani_update.patch
deleted file mode 100644 (file)
index 19df768..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ani.c
-+++ b/drivers/net/wireless/ath/ath9k/ani.c
-@@ -140,7 +140,8 @@ static void ath9k_ani_restart(struct ath
- }
- /* Adjust the OFDM Noise Immunity Level */
--static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel)
-+static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel,
-+                                bool scan)
- {
-       struct ar5416AniState *aniState = &ah->curchan->ani;
-       struct ath_common *common = ath9k_hw_common(ah);
-@@ -153,7 +154,7 @@ static void ath9k_hw_set_ofdm_nil(struct
-               immunityLevel, BEACON_RSSI(ah),
-               aniState->rssiThrLow, aniState->rssiThrHigh);
--      if (aniState->update_ani)
-+      if (!scan)
-               aniState->ofdmNoiseImmunityLevel = immunityLevel;
-       entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel];
-@@ -199,13 +200,14 @@ static void ath9k_hw_ani_ofdm_err_trigge
-       aniState = &ah->curchan->ani;
-       if (aniState->ofdmNoiseImmunityLevel < ATH9K_ANI_OFDM_MAX_LEVEL)
--              ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel + 1);
-+              ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel + 1, false);
- }
- /*
-  * Set the ANI settings to match an CCK level.
-  */
--static void ath9k_hw_set_cck_nil(struct ath_hw *ah, u_int8_t immunityLevel)
-+static void ath9k_hw_set_cck_nil(struct ath_hw *ah, u_int8_t immunityLevel,
-+                               bool scan)
- {
-       struct ar5416AniState *aniState = &ah->curchan->ani;
-       struct ath_common *common = ath9k_hw_common(ah);
-@@ -222,7 +224,7 @@ static void ath9k_hw_set_cck_nil(struct 
-           immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI)
-               immunityLevel = ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI;
--      if (aniState->update_ani)
-+      if (!scan)
-               aniState->cckNoiseImmunityLevel = immunityLevel;
-       entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel];
-@@ -254,7 +256,8 @@ static void ath9k_hw_ani_cck_err_trigger
-       aniState = &ah->curchan->ani;
-       if (aniState->cckNoiseImmunityLevel < ATH9K_ANI_CCK_MAX_LEVEL)
--              ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1);
-+              ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1,
-+                                   false);
- }
- /*
-@@ -270,13 +273,15 @@ static void ath9k_hw_ani_lower_immunity(
-       /* lower OFDM noise immunity */
-       if (aniState->ofdmNoiseImmunityLevel > 0 &&
-           (aniState->ofdmsTurn || aniState->cckNoiseImmunityLevel == 0)) {
--              ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel - 1);
-+              ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel - 1,
-+                                    false);
-               return;
-       }
-       /* lower CCK noise immunity */
-       if (aniState->cckNoiseImmunityLevel > 0)
--              ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel - 1);
-+              ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel - 1,
-+                                   false);
- }
- /*
-@@ -338,7 +343,6 @@ void ath9k_ani_reset(struct ath_hw *ah, 
-                               aniState->ofdmNoiseImmunityLevel,
-                               aniState->cckNoiseImmunityLevel);
--                      aniState->update_ani = false;
-                       ofdm_nil = ATH9K_ANI_OFDM_DEF_LEVEL;
-                       cck_nil = ATH9K_ANI_CCK_DEF_LEVEL;
-               }
-@@ -354,11 +358,9 @@ void ath9k_ani_reset(struct ath_hw *ah, 
-                       is_scanning,
-                       aniState->ofdmNoiseImmunityLevel,
-                       aniState->cckNoiseImmunityLevel);
--
--                      aniState->update_ani = true;
-       }
--      ath9k_hw_set_ofdm_nil(ah, ofdm_nil);
--      ath9k_hw_set_cck_nil(ah, cck_nil);
-+      ath9k_hw_set_ofdm_nil(ah, ofdm_nil, is_scanning);
-+      ath9k_hw_set_cck_nil(ah, cck_nil, is_scanning);
-       /*
-        * enable phy counters if hw supports or if not, enable phy
-@@ -538,7 +540,6 @@ void ath9k_hw_ani_init(struct ath_hw *ah
-               ani->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG;
-               ani->cckNoiseImmunityLevel = ATH9K_ANI_CCK_DEF_LEVEL;
-               ani->ofdmNoiseImmunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL;
--              ani->update_ani = false;
-       }
-       /*
---- a/drivers/net/wireless/ath/ath9k/ani.h
-+++ b/drivers/net/wireless/ath/ath9k/ani.h
-@@ -116,7 +116,6 @@ struct ar5416AniState {
-       u8 firstepLevel;
-       u8 ofdmWeakSigDetect;
-       u8 cckWeakSigThreshold;
--      bool update_ani;
-       u32 listenTime;
-       int32_t rssiThrLow;
-       int32_t rssiThrHigh;
diff --git a/package/mac80211/patches/564-ath9k_revert_initval_change.patch b/package/mac80211/patches/564-ath9k_revert_initval_change.patch
new file mode 100644 (file)
index 0000000..49aea35
--- /dev/null
@@ -0,0 +1,19 @@
+--- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
++++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
+@@ -778,11 +778,11 @@ static const u32 ar9300Common_rx_gain_ta
+       {0x0000a074, 0x00000000},
+       {0x0000a078, 0x00000000},
+       {0x0000a07c, 0x00000000},
+-      {0x0000a080, 0x1a1a1a1a},
+-      {0x0000a084, 0x1a1a1a1a},
+-      {0x0000a088, 0x1a1a1a1a},
+-      {0x0000a08c, 0x1a1a1a1a},
+-      {0x0000a090, 0x171a1a1a},
++      {0x0000a080, 0x22222229},
++      {0x0000a084, 0x1d1d1d1d},
++      {0x0000a088, 0x1d1d1d1d},
++      {0x0000a08c, 0x1d1d1d1d},
++      {0x0000a090, 0x171d1d1d},
+       {0x0000a094, 0x11111717},
+       {0x0000a098, 0x00030311},
+       {0x0000a09c, 0x00000000},
diff --git a/package/mac80211/patches/565-ath9k_fix_txgain.patch b/package/mac80211/patches/565-ath9k_fix_txgain.patch
new file mode 100644 (file)
index 0000000..c2f54d6
--- /dev/null
@@ -0,0 +1,66 @@
+--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
++++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
+@@ -561,8 +561,8 @@ static void ar9003_tx_gain_table_mode1(s
+                       5);
+       else if (AR_SREV_9340(ah))
+               INIT_INI_ARRAY(&ah->iniModesTxGain,
+-                      ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
+-                      ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
++                      ar9340Modes_high_ob_db_tx_gain_table_1p0,
++                      ARRAY_SIZE(ar9340Modes_high_ob_db_tx_gain_table_1p0),
+                       5);
+       else if (AR_SREV_9485_11(ah))
+               INIT_INI_ARRAY(&ah->iniModesTxGain,
+@@ -605,8 +605,8 @@ static void ar9003_tx_gain_table_mode2(s
+                       5);
+       else if (AR_SREV_9340(ah))
+               INIT_INI_ARRAY(&ah->iniModesTxGain,
+-                      ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
+-                      ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
++                      ar9340Modes_low_ob_db_tx_gain_table_1p0,
++                      ARRAY_SIZE(ar9340Modes_low_ob_db_tx_gain_table_1p0),
+                       5);
+       else if (AR_SREV_9485_11(ah))
+               INIT_INI_ARRAY(&ah->iniModesTxGain,
+@@ -639,8 +639,8 @@ static void ar9003_tx_gain_table_mode3(s
+                       5);
+       else if (AR_SREV_9340(ah))
+               INIT_INI_ARRAY(&ah->iniModesTxGain,
+-                      ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
+-                      ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
++                      ar9340Modes_high_power_tx_gain_table_1p0,
++                      ARRAY_SIZE(ar9340Modes_high_power_tx_gain_table_1p0),
+                       5);
+       else if (AR_SREV_9485_11(ah))
+               INIT_INI_ARRAY(&ah->iniModesTxGain,
+@@ -659,6 +659,20 @@ static void ar9003_tx_gain_table_mode3(s
+                       5);
+ }
++static void ar9003_tx_gain_table_mode4(struct ath_hw *ah)
++{
++      if (AR_SREV_9340(ah))
++              INIT_INI_ARRAY(&ah->iniModesTxGain,
++                      ar9340Modes_mixed_ob_db_tx_gain_table_1p0,
++                      ARRAY_SIZE(ar9340Modes_mixed_ob_db_tx_gain_table_1p0),
++                      5);
++      else if (AR_SREV_9580(ah))
++              INIT_INI_ARRAY(&ah->iniModesTxGain,
++                      ar9580_1p0_mixed_ob_db_tx_gain_table,
++                      ARRAY_SIZE(ar9580_1p0_mixed_ob_db_tx_gain_table),
++                      5);
++}
++
+ static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
+ {
+       switch (ar9003_hw_get_tx_gain_idx(ah)) {
+@@ -675,6 +689,9 @@ static void ar9003_tx_gain_table_apply(s
+       case 3:
+               ar9003_tx_gain_table_mode3(ah);
+               break;
++      case 4:
++              ar9003_tx_gain_table_mode4(ah);
++              break;
+       }
+ }
diff --git a/package/mac80211/patches/565-ath9k_update_ar9340_initvals.patch b/package/mac80211/patches/565-ath9k_update_ar9340_initvals.patch
deleted file mode 100644 (file)
index 7298293..0000000
+++ /dev/null
@@ -1,786 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
-@@ -1,5 +1,6 @@
- /*
-- * Copyright (c) 2011 Atheros Communications Inc.
-+ * Copyright (c) 2010-2011 Atheros Communications Inc.
-+ * Copyright (c) 2011-2012 Qualcomm Atheros Inc.
-  *
-  * Permission to use, copy, modify, and/or distribute this software for any
-  * purpose with or without fee is hereby granted, provided that the above
-@@ -18,16 +19,16 @@
- #define INITVALS_9340_H
- static const u32 ar9340_1p0_radio_postamble[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x000160ac, 0xa4646800, 0xa4646800, 0xa4646800, 0xa4646800},
--      {0x0001610c, 0x08000000, 0x08000000, 0x00000000, 0x00000000},
-+      {0x0001610c, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x00016140, 0x10804000, 0x10804000, 0x50804000, 0x50804000},
--      {0x0001650c, 0x08000000, 0x08000000, 0x00000000, 0x00000000},
-+      {0x0001650c, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x00016540, 0x10804000, 0x10804000, 0x50804000, 0x50804000},
- };
- static const u32 ar9340Modes_lowest_ob_db_tx_gain_table_1p0[][5] = {
--      /*   Addr     5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
-@@ -100,20 +101,20 @@ static const u32 ar9340Modes_lowest_ob_d
- };
- static const u32 ar9340Modes_fast_clock_1p0[][3] = {
--      /*  Addr      5G_HT20     5G_HT40  */
-+      /* Addr      5G_HT20     5G_HT40   */
-       {0x00001030, 0x00000268, 0x000004d0},
-       {0x00001070, 0x0000018c, 0x00000318},
-       {0x000010b0, 0x00000fd0, 0x00001fa0},
-       {0x00008014, 0x044c044c, 0x08980898},
-       {0x0000801c, 0x148ec02b, 0x148ec057},
-       {0x00008318, 0x000044c0, 0x00008980},
--      {0x00009e00, 0x03721821, 0x03721821},
-+      {0x00009e00, 0x0372131c, 0x0372131c},
-       {0x0000a230, 0x0000000b, 0x00000016},
-       {0x0000a254, 0x00000898, 0x00001130},
- };
- static const u32 ar9340_1p0_radio_core[][2] = {
--      /*  Addr     allmodes  */
-+      /* Addr      allmodes  */
-       {0x00016000, 0x36db6db6},
-       {0x00016004, 0x6db6db40},
-       {0x00016008, 0x73f00000},
-@@ -146,15 +147,13 @@ static const u32 ar9340_1p0_radio_core[]
-       {0x00016100, 0x04cb0001},
-       {0x00016104, 0xfff80000},
-       {0x00016108, 0x00080010},
--      {0x0001610c, 0x00000000},
-       {0x00016140, 0x50804008},
-       {0x00016144, 0x01884080},
-       {0x00016148, 0x000080c0},
-       {0x00016280, 0x01000015},
--      {0x00016284, 0x05530000},
-+      {0x00016284, 0x15530000},
-       {0x00016288, 0x00318000},
-       {0x0001628c, 0x50000000},
--      {0x00016290, 0x4080294f},
-       {0x00016380, 0x00000000},
-       {0x00016384, 0x00000000},
-       {0x00016388, 0x00800700},
-@@ -219,13 +218,14 @@ static const u32 ar9340_1p0_radio_core[]
- };
- static const u32 ar9340_1p0_radio_core_40M[][2] = {
-+      /* Addr      allmodes  */
-       {0x0001609c, 0x02566f3a},
-       {0x000160ac, 0xa4647c00},
-       {0x000160b0, 0x01885f5a},
- };
- static const u32 ar9340_1p0_mac_postamble[][5] = {
--      /* Addr       5G_HT20     5G_HT40     2G_HT40    2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
-       {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
-       {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
-@@ -237,34 +237,37 @@ static const u32 ar9340_1p0_mac_postambl
- };
- static const u32 ar9340_1p0_soc_postamble[][5] = {
--      /*   Addr     5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00007010, 0x00000023, 0x00000023, 0x00000023, 0x00000023},
- };
- static const u32 ar9340_1p0_baseband_postamble[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a8011},
-       {0x00009820, 0x206a022e, 0x206a022e, 0x206a022e, 0x206a022e},
-       {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
-       {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},
-       {0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},
-       {0x00009830, 0x0000059c, 0x0000059c, 0x0000119c, 0x0000119c},
--      {0x00009c00, 0x00000044, 0x000000c4, 0x000000c4, 0x00000044},
--      {0x00009e00, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0},
--      {0x00009e04, 0x00182020, 0x00182020, 0x00182020, 0x00182020},
-+      {0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4},
-+      {0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0},
-+      {0x00009e04, 0x001c2020, 0x001c2020, 0x001c2020, 0x001c2020},
-       {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
-       {0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec88d2e, 0x7ec88d2e},
--      {0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e},
-+      {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e},
-       {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
-       {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},
-       {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021},
-+      {0x00009e3c, 0xcf946220, 0xcf946220, 0xcf946222, 0xcf946222},
-       {0x00009e44, 0x02321e27, 0x02321e27, 0x02291e27, 0x02291e27},
-       {0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012},
-       {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000},
--      {0x0000a204, 0x00003fc0, 0x00003fc4, 0x00003fc4, 0x00003fc0},
-+      {0x0000a204, 0x00003ec0, 0x00003ec4, 0x00003ec4, 0x00003ec0},
-       {0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},
-+      {0x0000a22c, 0x07e26a2f, 0x07e26a2f, 0x01026a2f, 0x01026a2f},
-       {0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b},
-+      {0x0000a234, 0x00000fff, 0x10000fff, 0x10000fff, 0x00000fff},
-       {0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018},
-       {0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108},
-       {0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898},
-@@ -277,11 +280,11 @@ static const u32 ar9340_1p0_baseband_pos
-       {0x0000a288, 0x00000220, 0x00000220, 0x00000110, 0x00000110},
-       {0x0000a28c, 0x00011111, 0x00011111, 0x00022222, 0x00022222},
-       {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
--      {0x0000a2d0, 0x00071981, 0x00071981, 0x00071981, 0x00071982},
--      {0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a},
-+      {0x0000a2d0, 0x00041983, 0x00041983, 0x00041982, 0x00041982},
-+      {0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a},
-       {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
--      {0x0000ae04, 0x00180000, 0x00180000, 0x00180000, 0x00180000},
-+      {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x001c0000},
-       {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
-       {0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce},
-@@ -289,21 +292,21 @@ static const u32 ar9340_1p0_baseband_pos
- };
- static const u32 ar9340_1p0_baseband_core[][2] = {
--      /*  Addr     allmodes  */
-+      /* Addr      allmodes  */
-       {0x00009800, 0xafe68e30},
-       {0x00009804, 0xfd14e000},
-       {0x00009808, 0x9c0a9f6b},
-       {0x0000980c, 0x04900000},
--      {0x00009814, 0xb280c00a},
-+      {0x00009814, 0x3280c00a},
-       {0x00009818, 0x00000000},
-       {0x0000981c, 0x00020028},
--      {0x00009834, 0x5f3ca3de},
-+      {0x00009834, 0x6400a190},
-       {0x00009838, 0x0108ecff},
--      {0x0000983c, 0x14750600},
-+      {0x0000983c, 0x14000600},
-       {0x00009880, 0x201fff00},
-       {0x00009884, 0x00001042},
-       {0x000098a4, 0x00200400},
--      {0x000098b0, 0x52440bbe},
-+      {0x000098b0, 0x32840bbe},
-       {0x000098d0, 0x004b6a8e},
-       {0x000098d4, 0x00000820},
-       {0x000098dc, 0x00000000},
-@@ -329,7 +332,6 @@ static const u32 ar9340_1p0_baseband_cor
-       {0x00009e30, 0x06336f77},
-       {0x00009e34, 0x6af6532f},
-       {0x00009e38, 0x0cc80c00},
--      {0x00009e3c, 0xcf946222},
-       {0x00009e40, 0x0d261820},
-       {0x00009e4c, 0x00001004},
-       {0x00009e50, 0x00ff03f1},
-@@ -342,8 +344,6 @@ static const u32 ar9340_1p0_baseband_cor
-       {0x0000a220, 0x00000000},
-       {0x0000a224, 0x00000000},
-       {0x0000a228, 0x10002310},
--      {0x0000a22c, 0x01036a1e},
--      {0x0000a234, 0x10000fff},
-       {0x0000a23c, 0x00000000},
-       {0x0000a244, 0x0c000000},
-       {0x0000a2a0, 0x00000001},
-@@ -351,10 +351,6 @@ static const u32 ar9340_1p0_baseband_cor
-       {0x0000a2c8, 0x00000000},
-       {0x0000a2cc, 0x18c43433},
-       {0x0000a2d4, 0x00000000},
--      {0x0000a2dc, 0x00000000},
--      {0x0000a2e0, 0x00000000},
--      {0x0000a2e4, 0x00000000},
--      {0x0000a2e8, 0x00000000},
-       {0x0000a2ec, 0x00000000},
-       {0x0000a2f0, 0x00000000},
-       {0x0000a2f4, 0x00000000},
-@@ -385,7 +381,7 @@ static const u32 ar9340_1p0_baseband_cor
-       {0x0000a3e8, 0x20202020},
-       {0x0000a3ec, 0x20202020},
-       {0x0000a3f0, 0x00000000},
--      {0x0000a3f4, 0x00000246},
-+      {0x0000a3f4, 0x00000000},
-       {0x0000a3f8, 0x0cdbd380},
-       {0x0000a3fc, 0x000f0f01},
-       {0x0000a400, 0x8fa91f01},
-@@ -402,33 +398,17 @@ static const u32 ar9340_1p0_baseband_cor
-       {0x0000a430, 0x1ce739ce},
-       {0x0000a434, 0x00000000},
-       {0x0000a438, 0x00001801},
--      {0x0000a43c, 0x00000000},
-+      {0x0000a43c, 0x00100000},
-       {0x0000a440, 0x00000000},
-       {0x0000a444, 0x00000000},
--      {0x0000a448, 0x04000080},
-+      {0x0000a448, 0x05000080},
-       {0x0000a44c, 0x00000001},
-       {0x0000a450, 0x00010000},
-       {0x0000a458, 0x00000000},
--      {0x0000a600, 0x00000000},
--      {0x0000a604, 0x00000000},
--      {0x0000a608, 0x00000000},
--      {0x0000a60c, 0x00000000},
--      {0x0000a610, 0x00000000},
--      {0x0000a614, 0x00000000},
--      {0x0000a618, 0x00000000},
--      {0x0000a61c, 0x00000000},
--      {0x0000a620, 0x00000000},
--      {0x0000a624, 0x00000000},
--      {0x0000a628, 0x00000000},
--      {0x0000a62c, 0x00000000},
--      {0x0000a630, 0x00000000},
--      {0x0000a634, 0x00000000},
--      {0x0000a638, 0x00000000},
--      {0x0000a63c, 0x00000000},
-       {0x0000a640, 0x00000000},
-       {0x0000a644, 0x3fad9d74},
-       {0x0000a648, 0x0048060a},
--      {0x0000a64c, 0x00000637},
-+      {0x0000a64c, 0x00003c37},
-       {0x0000a670, 0x03020100},
-       {0x0000a674, 0x09080504},
-       {0x0000a678, 0x0d0c0b0a},
-@@ -451,10 +431,6 @@ static const u32 ar9340_1p0_baseband_cor
-       {0x0000a8f4, 0x00000000},
-       {0x0000b2d0, 0x00000080},
-       {0x0000b2d4, 0x00000000},
--      {0x0000b2dc, 0x00000000},
--      {0x0000b2e0, 0x00000000},
--      {0x0000b2e4, 0x00000000},
--      {0x0000b2e8, 0x00000000},
-       {0x0000b2ec, 0x00000000},
-       {0x0000b2f0, 0x00000000},
-       {0x0000b2f4, 0x00000000},
-@@ -465,80 +441,108 @@ static const u32 ar9340_1p0_baseband_cor
- };
- static const u32 ar9340Modes_high_power_tx_gain_table_1p0[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+      {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
-+      {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
-+      {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
-+      {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-+      {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
-+      {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
-+      {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
-+      {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
-+      {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
-+      {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
-+      {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
-+      {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
-+      {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
-+      {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
-+      {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
-       {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
--      {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
--      {0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004},
--      {0x0000a50c, 0x0d002621, 0x0d002621, 0x0b000200, 0x0b000200},
--      {0x0000a510, 0x13004620, 0x13004620, 0x0f000202, 0x0f000202},
--      {0x0000a514, 0x19004a20, 0x19004a20, 0x11000400, 0x11000400},
--      {0x0000a518, 0x1d004e20, 0x1d004e20, 0x15000402, 0x15000402},
--      {0x0000a51c, 0x21005420, 0x21005420, 0x19000404, 0x19000404},
--      {0x0000a520, 0x26005e20, 0x26005e20, 0x1b000603, 0x1b000603},
--      {0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000a02, 0x1f000a02},
--      {0x0000a528, 0x2f005e42, 0x2f005e42, 0x23000a04, 0x23000a04},
--      {0x0000a52c, 0x33005e44, 0x33005e44, 0x26000a20, 0x26000a20},
--      {0x0000a530, 0x38005e65, 0x38005e65, 0x2a000e20, 0x2a000e20},
--      {0x0000a534, 0x3c005e69, 0x3c005e69, 0x2e000e22, 0x2e000e22},
--      {0x0000a538, 0x40005e6b, 0x40005e6b, 0x31000e24, 0x31000e24},
--      {0x0000a53c, 0x44005e6d, 0x44005e6d, 0x34001640, 0x34001640},
--      {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660},
--      {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861},
--      {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81},
--      {0x0000a54c, 0x59025eb5, 0x59025eb5, 0x42001a83, 0x42001a83},
--      {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84},
--      {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3},
--      {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5},
--      {0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x50001ce9, 0x50001ce9},
--      {0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x54001ceb, 0x54001ceb},
--      {0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
--      {0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
--      {0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
--      {0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
--      {0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
--      {0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
--      {0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
-+      {0x0000a504, 0x04002222, 0x04002222, 0x02000001, 0x02000001},
-+      {0x0000a508, 0x09002421, 0x09002421, 0x05000003, 0x05000003},
-+      {0x0000a50c, 0x0d002621, 0x0d002621, 0x0a000005, 0x0a000005},
-+      {0x0000a510, 0x13004620, 0x13004620, 0x0e000201, 0x0e000201},
-+      {0x0000a514, 0x19004a20, 0x19004a20, 0x11000203, 0x11000203},
-+      {0x0000a518, 0x1d004e20, 0x1d004e20, 0x14000401, 0x14000401},
-+      {0x0000a51c, 0x21005420, 0x21005420, 0x18000403, 0x18000403},
-+      {0x0000a520, 0x26005e20, 0x26005e20, 0x1b000602, 0x1b000602},
-+      {0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000802, 0x1f000802},
-+      {0x0000a528, 0x2f005e42, 0x2f005e42, 0x21000620, 0x21000620},
-+      {0x0000a52c, 0x33005e44, 0x33005e44, 0x25000820, 0x25000820},
-+      {0x0000a530, 0x38005e65, 0x38005e65, 0x29000822, 0x29000822},
-+      {0x0000a534, 0x3c005e69, 0x3c005e69, 0x2d000824, 0x2d000824},
-+      {0x0000a538, 0x40005e6b, 0x40005e6b, 0x30000828, 0x30000828},
-+      {0x0000a53c, 0x44005e6d, 0x44005e6d, 0x3400082a, 0x3400082a},
-+      {0x0000a540, 0x49005e72, 0x49005e72, 0x38000849, 0x38000849},
-+      {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b000a2c, 0x3b000a2c},
-+      {0x0000a548, 0x53005f12, 0x53005f12, 0x3e000e2b, 0x3e000e2b},
-+      {0x0000a54c, 0x59025eb5, 0x59025eb5, 0x42000e2d, 0x42000e2d},
-+      {0x0000a550, 0x5e025f12, 0x5e025f12, 0x4500124a, 0x4500124a},
-+      {0x0000a554, 0x61027f12, 0x61027f12, 0x4900124c, 0x4900124c},
-+      {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c00126c, 0x4c00126c},
-+      {0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x4f00128c, 0x4f00128c},
-+      {0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x52001290, 0x52001290},
-+      {0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292},
-+      {0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292},
-+      {0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292},
-+      {0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292},
-+      {0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292},
-+      {0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292},
-+      {0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001292, 0x56001292},
-       {0x0000a580, 0x00802220, 0x00802220, 0x00800000, 0x00800000},
--      {0x0000a584, 0x04802222, 0x04802222, 0x04800002, 0x04800002},
--      {0x0000a588, 0x09802421, 0x09802421, 0x08800004, 0x08800004},
--      {0x0000a58c, 0x0d802621, 0x0d802621, 0x0b800200, 0x0b800200},
--      {0x0000a590, 0x13804620, 0x13804620, 0x0f800202, 0x0f800202},
--      {0x0000a594, 0x19804a20, 0x19804a20, 0x11800400, 0x11800400},
--      {0x0000a598, 0x1d804e20, 0x1d804e20, 0x15800402, 0x15800402},
--      {0x0000a59c, 0x21805420, 0x21805420, 0x19800404, 0x19800404},
--      {0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800603, 0x1b800603},
--      {0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800a02, 0x1f800a02},
--      {0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x23800a04, 0x23800a04},
--      {0x0000a5ac, 0x33805e44, 0x33805e44, 0x26800a20, 0x26800a20},
--      {0x0000a5b0, 0x38805e65, 0x38805e65, 0x2a800e20, 0x2a800e20},
--      {0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2e800e22, 0x2e800e22},
--      {0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x31800e24, 0x31800e24},
--      {0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x34801640, 0x34801640},
--      {0x0000a5c0, 0x49805e72, 0x49805e72, 0x38801660, 0x38801660},
--      {0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b801861, 0x3b801861},
--      {0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e801a81, 0x3e801a81},
--      {0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42801a83, 0x42801a83},
--      {0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x44801c84, 0x44801c84},
--      {0x0000a5d4, 0x61827f12, 0x61827f12, 0x48801ce3, 0x48801ce3},
--      {0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c801ce5, 0x4c801ce5},
--      {0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x50801ce9, 0x50801ce9},
--      {0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x54801ceb, 0x54801ceb},
--      {0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
--      {0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
--      {0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
--      {0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
--      {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
--      {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
--      {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
--      {0x00016044, 0x056db2db, 0x056db2db, 0x056db2db, 0x056db2db},
-+      {0x0000a584, 0x04802222, 0x04802222, 0x02800001, 0x02800001},
-+      {0x0000a588, 0x09802421, 0x09802421, 0x05800003, 0x05800003},
-+      {0x0000a58c, 0x0d802621, 0x0d802621, 0x0a800005, 0x0a800005},
-+      {0x0000a590, 0x13804620, 0x13804620, 0x0e800201, 0x0e800201},
-+      {0x0000a594, 0x19804a20, 0x19804a20, 0x11800203, 0x11800203},
-+      {0x0000a598, 0x1d804e20, 0x1d804e20, 0x14800401, 0x14800401},
-+      {0x0000a59c, 0x21805420, 0x21805420, 0x18800403, 0x18800403},
-+      {0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800602, 0x1b800602},
-+      {0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800802, 0x1f800802},
-+      {0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x21800620, 0x21800620},
-+      {0x0000a5ac, 0x33805e44, 0x33805e44, 0x25800820, 0x25800820},
-+      {0x0000a5b0, 0x38805e65, 0x38805e65, 0x29800822, 0x29800822},
-+      {0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2d800824, 0x2d800824},
-+      {0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x30800828, 0x30800828},
-+      {0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x3480082a, 0x3480082a},
-+      {0x0000a5c0, 0x49805e72, 0x49805e72, 0x38800849, 0x38800849},
-+      {0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b800a2c, 0x3b800a2c},
-+      {0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e800e2b, 0x3e800e2b},
-+      {0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42800e2d, 0x42800e2d},
-+      {0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x4580124a, 0x4580124a},
-+      {0x0000a5d4, 0x61827f12, 0x61827f12, 0x4980124c, 0x4980124c},
-+      {0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c80126c, 0x4c80126c},
-+      {0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x4f80128c, 0x4f80128c},
-+      {0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x52801290, 0x52801290},
-+      {0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292},
-+      {0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292},
-+      {0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292},
-+      {0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292},
-+      {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292},
-+      {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292},
-+      {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801292, 0x56801292},
-+      {0x00016044, 0x056db2db, 0x056db2db, 0x022492db, 0x022492db},
-       {0x00016048, 0x24925266, 0x24925266, 0x24925266, 0x24925266},
--      {0x00016444, 0x056db2db, 0x056db2db, 0x056db2db, 0x056db2db},
-+      {0x00016444, 0x056db2db, 0x056db2db, 0x022492db, 0x022492db},
-       {0x00016448, 0x24925266, 0x24925266, 0x24925266, 0x24925266},
- };
- static const u32 ar9340Modes_high_ob_db_tx_gain_table_1p0[][5] = {
--      /*  Addr       5G_HT20    5G_HT40     2G_HT40     2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+      {0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
-+      {0x0000a2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
-+      {0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
-+      {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
-       {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
-       {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
-@@ -559,7 +563,7 @@ static const u32 ar9340Modes_high_ob_db_
-       {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660},
-       {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861},
-       {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81},
--      {0x0000a54c, 0x59025eb5, 0x59025eb5, 0x42001a83, 0x42001a83},
-+      {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83},
-       {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84},
-       {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3},
-       {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5},
-@@ -604,13 +608,43 @@ static const u32 ar9340Modes_high_ob_db_
-       {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
-       {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
-       {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
-+      {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
-+      {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
-+      {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
-+      {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
-+      {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
-+      {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
-+      {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
-+      {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000b2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
-+      {0x0000b2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
-+      {0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
-+      {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x00016044, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4},
--      {0x00016048, 0x8e481266, 0x8e481266, 0x8e481266, 0x8e481266},
-+      {0x00016048, 0x8e481666, 0x8e481666, 0x8e481266, 0x8e481266},
-+      {0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015},
-       {0x00016444, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4},
--      {0x00016448, 0x8e481266, 0x8e481266, 0x8e481266, 0x8e481266},
-+      {0x00016448, 0x8e481666, 0x8e481666, 0x8e481266, 0x8e481266},
- };
-+
- static const u32 ar9340Modes_ub124_tx_gain_table_1p0[][5] = {
--      /*  Addr      5G_HT20      5G_HT40     2G_HT40    2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+      {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005},
-+      {0x00009820, 0x206a022e, 0x206a022e, 0x206a00ae, 0x206a00ae},
-+      {0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c},
-+      {0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec82d2e, 0x7ec82d2e},
-+      {0x0000a2dc, 0xfef5d402, 0xfef5d402, 0xfdab5b52, 0xfdab5b52},
-+      {0x0000a2e0, 0xfe896600, 0xfe896600, 0xfd339c84, 0xfd339c84},
-+      {0x0000a2e4, 0xff01f800, 0xff01f800, 0xfec3e000, 0xfec3e000},
-+      {0x0000a2e8, 0xfffe0000, 0xfffe0000, 0xfffc0000, 0xfffc0000},
-       {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
-       {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
-       {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
-@@ -676,15 +710,34 @@ static const u32 ar9340Modes_ub124_tx_ga
-       {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
-       {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
-       {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
--      {0x00016044, 0x036db2db, 0x036db2db, 0x036db2db, 0x036db2db},
--      {0x00016048, 0x69b65266, 0x69b65266, 0x69b65266, 0x69b65266},
--      {0x00016444, 0x036db2db, 0x036db2db, 0x036db2db, 0x036db2db},
--      {0x00016448, 0x69b65266, 0x69b65266, 0x69b65266, 0x69b65266},
-+      {0x00016044, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4},
-+      {0x00016048, 0x8e480086, 0x8e480086, 0x8e480086, 0x8e480086},
-+      {0x00016444, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4, 0x03b6d2e4},
-+      {0x00016448, 0x8e480086, 0x8e480086, 0x8e480086, 0x8e480086},
-+      {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
-+      {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
-+      {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
-+      {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
-+      {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
-+      {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
-+      {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
-+      {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
-+      {0x0000b2dc, 0xfef5d402, 0xfef5d402, 0xfdab5b52, 0xfdab5b52},
-+      {0x0000b2e0, 0xfe896600, 0xfe896600, 0xfd339c84, 0xfd339c84},
-+      {0x0000b2e4, 0xff01f800, 0xff01f800, 0xfec3e000, 0xfec3e000},
-+      {0x0000b2e8, 0xfffe0000, 0xfffe0000, 0xfffc0000, 0xfffc0000},
- };
--
- static const u32 ar9340Common_rx_gain_table_1p0[][2] = {
--      /*   Addr     allmodes */
-+      /* Addr      allmodes  */
-       {0x0000a000, 0x00010000},
-       {0x0000a004, 0x00030002},
-       {0x0000a008, 0x00050004},
-@@ -845,14 +898,14 @@ static const u32 ar9340Common_rx_gain_ta
-       {0x0000b074, 0x00000000},
-       {0x0000b078, 0x00000000},
-       {0x0000b07c, 0x00000000},
--      {0x0000b080, 0x32323232},
--      {0x0000b084, 0x2f2f3232},
--      {0x0000b088, 0x23282a2d},
--      {0x0000b08c, 0x1c1e2123},
--      {0x0000b090, 0x14171919},
--      {0x0000b094, 0x0e0e1214},
--      {0x0000b098, 0x03050707},
--      {0x0000b09c, 0x00030303},
-+      {0x0000b080, 0x23232323},
-+      {0x0000b084, 0x21232323},
-+      {0x0000b088, 0x19191c1e},
-+      {0x0000b08c, 0x12141417},
-+      {0x0000b090, 0x07070e0e},
-+      {0x0000b094, 0x03030305},
-+      {0x0000b098, 0x00000003},
-+      {0x0000b09c, 0x00000000},
-       {0x0000b0a0, 0x00000000},
-       {0x0000b0a4, 0x00000000},
-       {0x0000b0a8, 0x00000000},
-@@ -944,7 +997,11 @@ static const u32 ar9340Common_rx_gain_ta
- };
- static const u32 ar9340Modes_low_ob_db_tx_gain_table_1p0[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+      {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
-+      {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
-+      {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
-+      {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
-@@ -952,8 +1009,8 @@ static const u32 ar9340Modes_low_ob_db_t
-       {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
-       {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
-       {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400},
--      {0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402},
--      {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404},
-+      {0x0000a518, 0x21002220, 0x21002220, 0x16000402, 0x16000402},
-+      {0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404},
-       {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603},
-       {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02},
-       {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04},
-@@ -965,19 +1022,19 @@ static const u32 ar9340Modes_low_ob_db_t
-       {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660},
-       {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861},
-       {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81},
--      {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83},
--      {0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84},
--      {0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3},
--      {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5},
--      {0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9},
--      {0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb},
--      {0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
--      {0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
--      {0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
--      {0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
--      {0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
--      {0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
--      {0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
-+      {0x0000a54c, 0x5c02486b, 0x5c02486b, 0x47001a83, 0x47001a83},
-+      {0x0000a550, 0x61024a6c, 0x61024a6c, 0x4a001c84, 0x4a001c84},
-+      {0x0000a554, 0x66026a6c, 0x66026a6c, 0x4e001ce3, 0x4e001ce3},
-+      {0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x52001ce5, 0x52001ce5},
-+      {0x0000a55c, 0x7002708c, 0x7002708c, 0x56001ce9, 0x56001ce9},
-+      {0x0000a560, 0x7302b08a, 0x7302b08a, 0x5a001ceb, 0x5a001ceb},
-+      {0x0000a564, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
-+      {0x0000a568, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
-+      {0x0000a56c, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
-+      {0x0000a570, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
-+      {0x0000a574, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
-+      {0x0000a578, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
-+      {0x0000a57c, 0x7702b08c, 0x7702b08c, 0x5d001eec, 0x5d001eec},
-       {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
-       {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},
-       {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004},
-@@ -1010,14 +1067,40 @@ static const u32 ar9340Modes_low_ob_db_t
-       {0x0000a5f4, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec},
-       {0x0000a5f8, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec},
-       {0x0000a5fc, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec},
-+      {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
-+      {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
-+      {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
-+      {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
-+      {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
-+      {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
-+      {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
-+      {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
-+      {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
-+      {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
-+      {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x00016044, 0x056db2db, 0x056db2db, 0x056db2db, 0x056db2db},
--      {0x00016048, 0x24925266, 0x24925266, 0x24925266, 0x24925266},
-+      {0x00016048, 0x24925666, 0x24925666, 0x24925266, 0x24925266},
-+      {0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015},
-+      {0x00016288, 0xf0318000, 0xf0318000, 0xf0318000, 0xf0318000},
-       {0x00016444, 0x056db2db, 0x056db2db, 0x056db2db, 0x056db2db},
--      {0x00016448, 0x24925266, 0x24925266, 0x24925266, 0x24925266},
-+      {0x00016448, 0x24925666, 0x24925666, 0x24925266, 0x24925266},
- };
- static const u32 ar9340Modes_mixed_ob_db_tx_gain_table_1p0[][5] = {
--      /*  Addr       5G_HT20     5G_HT40     2G_HT40    2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-+      {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
-+      {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
-+      {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
-+      {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
-       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-       {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
-@@ -1025,8 +1108,8 @@ static const u32 ar9340Modes_mixed_ob_db
-       {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
-       {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
-       {0x0000a514, 0x1c000223, 0x1c000223, 0x11000400, 0x11000400},
--      {0x0000a518, 0x21020220, 0x21020220, 0x15000402, 0x15000402},
--      {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404},
-+      {0x0000a518, 0x21002220, 0x21002220, 0x15000402, 0x15000402},
-+      {0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404},
-       {0x0000a520, 0x2b022220, 0x2b022220, 0x1b000603, 0x1b000603},
-       {0x0000a524, 0x2f022222, 0x2f022222, 0x1f000a02, 0x1f000a02},
-       {0x0000a528, 0x34022225, 0x34022225, 0x23000a04, 0x23000a04},
-@@ -1038,19 +1121,19 @@ static const u32 ar9340Modes_mixed_ob_db
-       {0x0000a540, 0x4e02246c, 0x4e02246c, 0x38001660, 0x38001660},
-       {0x0000a544, 0x5302266c, 0x5302266c, 0x3b001861, 0x3b001861},
-       {0x0000a548, 0x5702286c, 0x5702286c, 0x3e001a81, 0x3e001a81},
--      {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x42001a83, 0x42001a83},
--      {0x0000a550, 0x61042a6c, 0x61042a6c, 0x44001c84, 0x44001c84},
--      {0x0000a554, 0x66062a6c, 0x66062a6c, 0x48001ce3, 0x48001ce3},
--      {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x4c001ce5, 0x4c001ce5},
--      {0x0000a55c, 0x7006308c, 0x7006308c, 0x50001ce9, 0x50001ce9},
--      {0x0000a560, 0x730a308a, 0x730a308a, 0x54001ceb, 0x54001ceb},
--      {0x0000a564, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec},
--      {0x0000a568, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec},
--      {0x0000a56c, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec},
--      {0x0000a570, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec},
--      {0x0000a574, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec},
--      {0x0000a578, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec},
--      {0x0000a57c, 0x770a308c, 0x770a308c, 0x56001eec, 0x56001eec},
-+      {0x0000a54c, 0x5c02486b, 0x5c02486b, 0x42001a83, 0x42001a83},
-+      {0x0000a550, 0x61024a6c, 0x61024a6c, 0x44001c84, 0x44001c84},
-+      {0x0000a554, 0x66026a6c, 0x66026a6c, 0x48001ce3, 0x48001ce3},
-+      {0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x4c001ce5, 0x4c001ce5},
-+      {0x0000a55c, 0x7002708c, 0x7002708c, 0x50001ce9, 0x50001ce9},
-+      {0x0000a560, 0x7302b08a, 0x7302b08a, 0x54001ceb, 0x54001ceb},
-+      {0x0000a564, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
-+      {0x0000a568, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
-+      {0x0000a56c, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
-+      {0x0000a570, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
-+      {0x0000a574, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
-+      {0x0000a578, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
-+      {0x0000a57c, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
-       {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
-       {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},
-       {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004},
-@@ -1083,14 +1166,36 @@ static const u32 ar9340Modes_mixed_ob_db
-       {0x0000a5f4, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
-       {0x0000a5f8, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
-       {0x0000a5fc, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
-+      {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-+      {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
-+      {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
-+      {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
-+      {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
-+      {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
-+      {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
-+      {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
-+      {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
-+      {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
-+      {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
-+      {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
-+      {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
-       {0x00016044, 0x056db2db, 0x056db2db, 0x03b6d2e4, 0x03b6d2e4},
--      {0x00016048, 0x24927266, 0x24927266, 0x8e483266, 0x8e483266},
-+      {0x00016048, 0x24925666, 0x24925666, 0x8e481266, 0x8e481266},
-+      {0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015},
-+      {0x00016288, 0x30318000, 0x30318000, 0x00318000, 0x00318000},
-       {0x00016444, 0x056db2db, 0x056db2db, 0x03b6d2e4, 0x03b6d2e4},
--      {0x00016448, 0x24927266, 0x24927266, 0x8e482266, 0x8e482266},
-+      {0x00016448, 0x24925666, 0x24925666, 0x8e481266, 0x8e481266},
- };
- static const u32 ar9340_1p0_mac_core[][2] = {
--      /*    Addr        allmodes        */
-+      /* Addr      allmodes  */
-       {0x00000008, 0x00000000},
-       {0x00000030, 0x00020085},
-       {0x00000034, 0x00000005},
-@@ -1119,6 +1224,7 @@ static const u32 ar9340_1p0_mac_core[][2
-       {0x00008004, 0x00000000},
-       {0x00008008, 0x00000000},
-       {0x0000800c, 0x00000000},
-+      {0x00008010, 0x00080800},
-       {0x00008018, 0x00000000},
-       {0x00008020, 0x00000000},
-       {0x00008038, 0x00000000},
-@@ -1146,7 +1252,7 @@ static const u32 ar9340_1p0_mac_core[][2
-       {0x000080bc, 0x00000000},
-       {0x000080c0, 0x2a800000},
-       {0x000080c4, 0x06900168},
--      {0x000080c8, 0x13881c20},
-+      {0x000080c8, 0x13881c22},
-       {0x000080cc, 0x01f40000},
-       {0x000080d0, 0x00252500},
-       {0x000080d4, 0x00a00000},
-@@ -1250,11 +1356,11 @@ static const u32 ar9340_1p0_mac_core[][2
-       {0x000083c4, 0x00000000},
-       {0x000083c8, 0x00000000},
-       {0x000083cc, 0x00000200},
--      {0x000083d0, 0x000301ff},
-+      {0x000083d0, 0x000101ff},
- };
- static const u32 ar9340Common_wo_xlna_rx_gain_table_1p0[][2] = {
--      /*    Addr        allmodes        */
-+      /* Addr      allmodes  */
-       {0x0000a000, 0x00010000},
-       {0x0000a004, 0x00030002},
-       {0x0000a008, 0x00050004},
-@@ -1514,12 +1620,11 @@ static const u32 ar9340Common_wo_xlna_rx
- };
- static const u32 ar9340_1p0_soc_preamble[][2] = {
--      /*    Addr        allmodes        */
--      {0x000040a4, 0x00a0c1c9},
-+      /* Addr      allmodes  */
-       {0x00007008, 0x00000000},
-       {0x00007020, 0x00000000},
-       {0x00007034, 0x00000002},
-       {0x00007038, 0x000004c2},
- };
--#endif
-+#endif /* INITVALS_9340_1P0_H */
diff --git a/package/mac80211/patches/566-ath9k_deduplicate_initvals.patch b/package/mac80211/patches/566-ath9k_deduplicate_initvals.patch
deleted file mode 100644 (file)
index a3c918b..0000000
+++ /dev/null
@@ -1,3745 +0,0 @@
---- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
-@@ -1,5 +1,6 @@
- /*
-  * Copyright (c) 2010-2011 Atheros Communications Inc.
-+ * Copyright (c) 2011-2012 Qualcomm Atheros Inc.
-  *
-  * Permission to use, copy, modify, and/or distribute this software for any
-  * purpose with or without fee is hereby granted, provided that the above
---- a/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h
-@@ -337,12 +337,7 @@ static const u32 ar9331_modes_low_ob_db_
-       {0x00016284, 0x14d3f000, 0x14d3f000, 0x14d3f000, 0x14d3f000},
- };
--static const u32 ar9331_1p1_baseband_core_txfir_coeff_japan_2484[][2] = {
--      /* Addr      allmodes  */
--      {0x0000a398, 0x00000000},
--      {0x0000a39c, 0x6f7f0301},
--      {0x0000a3a0, 0xca9228ee},
--};
-+#define ar9331_1p1_baseband_core_txfir_coeff_japan_2484 ar9462_2p0_baseband_core_txfir_coeff_japan_2484
- static const u32 ar9331_1p1_xtal_25M[][2] = {
-       /* Addr      allmodes  */
-@@ -783,17 +778,7 @@ static const u32 ar9331_modes_high_power
-       {0x00016284, 0x14d3f000, 0x14d3f000, 0x14d3f000, 0x14d3f000},
- };
--static const u32 ar9331_1p1_mac_postamble[][5] = {
--      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
--      {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
--      {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
--      {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
--      {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
--      {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
--      {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
--      {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
--      {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
--};
-+#define ar9331_1p1_mac_postamble ar9300_2p2_mac_postamble
- static const u32 ar9331_1p1_soc_preamble[][2] = {
-       /* Addr      allmodes  */
-@@ -1112,38 +1097,4 @@ static const u32 ar9331_common_tx_gain_o
-       {0x00000000},
- };
--static const u32 ar9331_1p1_chansel_xtal_25M[] = {
--      0x0101479e,
--      0x0101d027,
--      0x010258af,
--      0x0102e138,
--      0x010369c0,
--      0x0103f249,
--      0x01047ad1,
--      0x0105035a,
--      0x01058be2,
--      0x0106146b,
--      0x01069cf3,
--      0x0107257c,
--      0x0107ae04,
--      0x0108f5b2,
--};
--
--static const u32 ar9331_1p1_chansel_xtal_40M[] = {
--      0x00a0ccbe,
--      0x00a12213,
--      0x00a17769,
--      0x00a1ccbe,
--      0x00a22213,
--      0x00a27769,
--      0x00a2ccbe,
--      0x00a32213,
--      0x00a37769,
--      0x00a3ccbe,
--      0x00a42213,
--      0x00a47769,
--      0x00a4ccbe,
--      0x00a5998b,
--};
--
- #endif /* INITVALS_9330_1P1_H */
---- a/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h
-@@ -1,5 +1,6 @@
- /*
-- * Copyright (c) 2011 Atheros Communications Inc.
-+ * Copyright (c) 2010-2011 Atheros Communications Inc.
-+ * Copyright (c) 2011-2012 Qualcomm Atheros Inc.
-  *
-  * Permission to use, copy, modify, and/or distribute this software for any
-  * purpose with or without fee is hereby granted, provided that the above
-@@ -17,8 +18,8 @@
- #ifndef INITVALS_9330_1P2_H
- #define INITVALS_9330_1P2_H
--static const u32 ar9331_modes_lowest_ob_db_tx_gain_1p2[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
-+static const u32 ar9331_modes_high_ob_db_tx_gain_1p2[][5] = {
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7},
-       {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
-       {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
-@@ -102,8 +103,14 @@ static const u32 ar9331_modes_lowest_ob_
-       {0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
- };
-+#define ar9331_modes_high_power_tx_gain_1p2 ar9331_modes_high_ob_db_tx_gain_1p2
-+
-+#define ar9331_modes_low_ob_db_tx_gain_1p2 ar9331_modes_high_power_tx_gain_1p2
-+
-+#define ar9331_modes_lowest_ob_db_tx_gain_1p2 ar9331_modes_low_ob_db_tx_gain_1p2
-+
- static const u32 ar9331_1p2_baseband_postamble[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005},
-       {0x00009820, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e},
-       {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
-@@ -147,191 +154,6 @@ static const u32 ar9331_1p2_baseband_pos
-       {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
- };
--static const u32 ar9331_modes_high_ob_db_tx_gain_1p2[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
--      {0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7},
--      {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200},
--      {0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202},
--      {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400},
--      {0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402},
--      {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404},
--      {0x0000a520, 0x2f001f04, 0x2f001f04, 0x23000a00, 0x23000a00},
--      {0x0000a524, 0x35001fc4, 0x35001fc4, 0x27000a02, 0x27000a02},
--      {0x0000a528, 0x3c022f04, 0x3c022f04, 0x2b000a04, 0x2b000a04},
--      {0x0000a52c, 0x41023e85, 0x41023e85, 0x3f001620, 0x3f001620},
--      {0x0000a530, 0x48023ec6, 0x48023ec6, 0x41001621, 0x41001621},
--      {0x0000a534, 0x4d023f01, 0x4d023f01, 0x44001640, 0x44001640},
--      {0x0000a538, 0x53023f4b, 0x53023f4b, 0x46001641, 0x46001641},
--      {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x48001642, 0x48001642},
--      {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x4b001644, 0x4b001644},
--      {0x0000a544, 0x6502feca, 0x6502feca, 0x4e001a81, 0x4e001a81},
--      {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x51001a83, 0x51001a83},
--      {0x0000a54c, 0x7203feca, 0x7203feca, 0x54001c84, 0x54001c84},
--      {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x57001ce3, 0x57001ce3},
--      {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x5b001ce5, 0x5b001ce5},
--      {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5f001ce9, 0x5f001ce9},
--      {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x66001eec, 0x66001eec},
--      {0x0000a560, 0x900fff0b, 0x900fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a564, 0x960fffcb, 0x960fffcb, 0x66001eec, 0x66001eec},
--      {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a580, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a584, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a588, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a58c, 0x11062202, 0x11062202, 0x0b000200, 0x0b000200},
--      {0x0000a590, 0x17022e00, 0x17022e00, 0x0f000202, 0x0f000202},
--      {0x0000a594, 0x1d000ec2, 0x1d000ec2, 0x11000400, 0x11000400},
--      {0x0000a598, 0x25020ec0, 0x25020ec0, 0x15000402, 0x15000402},
--      {0x0000a59c, 0x2b020ec3, 0x2b020ec3, 0x19000404, 0x19000404},
--      {0x0000a5a0, 0x2f001f04, 0x2f001f04, 0x1b000603, 0x1b000603},
--      {0x0000a5a4, 0x35001fc4, 0x35001fc4, 0x1f000a02, 0x1f000a02},
--      {0x0000a5a8, 0x3c022f04, 0x3c022f04, 0x23000a04, 0x23000a04},
--      {0x0000a5ac, 0x41023e85, 0x41023e85, 0x26000a20, 0x26000a20},
--      {0x0000a5b0, 0x48023ec6, 0x48023ec6, 0x2a000e20, 0x2a000e20},
--      {0x0000a5b4, 0x4d023f01, 0x4d023f01, 0x2e000e22, 0x2e000e22},
--      {0x0000a5b8, 0x53023f4b, 0x53023f4b, 0x31000e24, 0x31000e24},
--      {0x0000a5bc, 0x5a027f09, 0x5a027f09, 0x34001640, 0x34001640},
--      {0x0000a5c0, 0x5f027fc9, 0x5f027fc9, 0x38001660, 0x38001660},
--      {0x0000a5c4, 0x6502feca, 0x6502feca, 0x3b001861, 0x3b001861},
--      {0x0000a5c8, 0x6b02ff4a, 0x6b02ff4a, 0x3e001a81, 0x3e001a81},
--      {0x0000a5cc, 0x7203feca, 0x7203feca, 0x42001a83, 0x42001a83},
--      {0x0000a5d0, 0x7703ff0b, 0x7703ff0b, 0x44001c84, 0x44001c84},
--      {0x0000a5d4, 0x7d06ffcb, 0x7d06ffcb, 0x48001ce3, 0x48001ce3},
--      {0x0000a5d8, 0x8407ff0b, 0x8407ff0b, 0x4c001ce5, 0x4c001ce5},
--      {0x0000a5dc, 0x8907ffcb, 0x8907ffcb, 0x50001ce9, 0x50001ce9},
--      {0x0000a5e0, 0x900fff0b, 0x900fff0b, 0x54001ceb, 0x54001ceb},
--      {0x0000a5e4, 0x960fffcb, 0x960fffcb, 0x56001eec, 0x56001eec},
--      {0x0000a5e8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5ec, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f0, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f4, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5fc, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
--      {0x0000a618, 0x02008501, 0x02008501, 0x02008501, 0x02008501},
--      {0x0000a61c, 0x02008802, 0x02008802, 0x02008802, 0x02008802},
--      {0x0000a620, 0x0300c802, 0x0300c802, 0x0300c802, 0x0300c802},
--      {0x0000a624, 0x0300cc03, 0x0300cc03, 0x0300cc03, 0x0300cc03},
--      {0x0000a628, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a62c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a630, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a634, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a638, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--};
--
--static const u32 ar9331_modes_low_ob_db_tx_gain_1p2[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
--      {0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7},
--      {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200},
--      {0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202},
--      {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400},
--      {0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402},
--      {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404},
--      {0x0000a520, 0x2f001f04, 0x2f001f04, 0x23000a00, 0x23000a00},
--      {0x0000a524, 0x35001fc4, 0x35001fc4, 0x27000a02, 0x27000a02},
--      {0x0000a528, 0x3c022f04, 0x3c022f04, 0x2b000a04, 0x2b000a04},
--      {0x0000a52c, 0x41023e85, 0x41023e85, 0x3f001620, 0x3f001620},
--      {0x0000a530, 0x48023ec6, 0x48023ec6, 0x41001621, 0x41001621},
--      {0x0000a534, 0x4d023f01, 0x4d023f01, 0x44001640, 0x44001640},
--      {0x0000a538, 0x53023f4b, 0x53023f4b, 0x46001641, 0x46001641},
--      {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x48001642, 0x48001642},
--      {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x4b001644, 0x4b001644},
--      {0x0000a544, 0x6502feca, 0x6502feca, 0x4e001a81, 0x4e001a81},
--      {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x51001a83, 0x51001a83},
--      {0x0000a54c, 0x7203feca, 0x7203feca, 0x54001c84, 0x54001c84},
--      {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x57001ce3, 0x57001ce3},
--      {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x5b001ce5, 0x5b001ce5},
--      {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5f001ce9, 0x5f001ce9},
--      {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x66001eec, 0x66001eec},
--      {0x0000a560, 0x900fff0b, 0x900fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a564, 0x960fffcb, 0x960fffcb, 0x66001eec, 0x66001eec},
--      {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a580, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a584, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a588, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a58c, 0x11062202, 0x11062202, 0x0b000200, 0x0b000200},
--      {0x0000a590, 0x17022e00, 0x17022e00, 0x0f000202, 0x0f000202},
--      {0x0000a594, 0x1d000ec2, 0x1d000ec2, 0x11000400, 0x11000400},
--      {0x0000a598, 0x25020ec0, 0x25020ec0, 0x15000402, 0x15000402},
--      {0x0000a59c, 0x2b020ec3, 0x2b020ec3, 0x19000404, 0x19000404},
--      {0x0000a5a0, 0x2f001f04, 0x2f001f04, 0x1b000603, 0x1b000603},
--      {0x0000a5a4, 0x35001fc4, 0x35001fc4, 0x1f000a02, 0x1f000a02},
--      {0x0000a5a8, 0x3c022f04, 0x3c022f04, 0x23000a04, 0x23000a04},
--      {0x0000a5ac, 0x41023e85, 0x41023e85, 0x26000a20, 0x26000a20},
--      {0x0000a5b0, 0x48023ec6, 0x48023ec6, 0x2a000e20, 0x2a000e20},
--      {0x0000a5b4, 0x4d023f01, 0x4d023f01, 0x2e000e22, 0x2e000e22},
--      {0x0000a5b8, 0x53023f4b, 0x53023f4b, 0x31000e24, 0x31000e24},
--      {0x0000a5bc, 0x5a027f09, 0x5a027f09, 0x34001640, 0x34001640},
--      {0x0000a5c0, 0x5f027fc9, 0x5f027fc9, 0x38001660, 0x38001660},
--      {0x0000a5c4, 0x6502feca, 0x6502feca, 0x3b001861, 0x3b001861},
--      {0x0000a5c8, 0x6b02ff4a, 0x6b02ff4a, 0x3e001a81, 0x3e001a81},
--      {0x0000a5cc, 0x7203feca, 0x7203feca, 0x42001a83, 0x42001a83},
--      {0x0000a5d0, 0x7703ff0b, 0x7703ff0b, 0x44001c84, 0x44001c84},
--      {0x0000a5d4, 0x7d06ffcb, 0x7d06ffcb, 0x48001ce3, 0x48001ce3},
--      {0x0000a5d8, 0x8407ff0b, 0x8407ff0b, 0x4c001ce5, 0x4c001ce5},
--      {0x0000a5dc, 0x8907ffcb, 0x8907ffcb, 0x50001ce9, 0x50001ce9},
--      {0x0000a5e0, 0x900fff0b, 0x900fff0b, 0x54001ceb, 0x54001ceb},
--      {0x0000a5e4, 0x960fffcb, 0x960fffcb, 0x56001eec, 0x56001eec},
--      {0x0000a5e8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5ec, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f0, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f4, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5fc, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
--      {0x0000a618, 0x02008501, 0x02008501, 0x02008501, 0x02008501},
--      {0x0000a61c, 0x02008802, 0x02008802, 0x02008802, 0x02008802},
--      {0x0000a620, 0x0300c802, 0x0300c802, 0x0300c802, 0x0300c802},
--      {0x0000a624, 0x0300cc03, 0x0300cc03, 0x0300cc03, 0x0300cc03},
--      {0x0000a628, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a62c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a630, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a634, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a638, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--};
--
--static const u32 ar9331_1p2_baseband_core_txfir_coeff_japan_2484[][2] = {
--      /* Addr      allmodes  */
--      {0x0000a398, 0x00000000},
--      {0x0000a39c, 0x6f7f0301},
--      {0x0000a3a0, 0xca9228ee},
--};
--
--static const u32 ar9331_1p2_xtal_25M[][2] = {
--      /* Addr      allmodes  */
--      {0x00007038, 0x000002f8},
--      {0x00008244, 0x0010f3d7},
--      {0x0000824c, 0x0001e7ae},
--      {0x0001609c, 0x0f508f29},
--};
--
- static const u32 ar9331_1p2_radio_core[][2] = {
-       /* Addr      allmodes  */
-       {0x00016000, 0x36db6db6},
-@@ -397,684 +219,24 @@ static const u32 ar9331_1p2_radio_core[]
-       {0x000163d4, 0x00000000},
- };
--static const u32 ar9331_1p2_soc_postamble[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
--      {0x00007010, 0x00000022, 0x00000022, 0x00000022, 0x00000022},
--};
-+#define ar9331_1p2_baseband_core_txfir_coeff_japan_2484 ar9331_1p1_baseband_core_txfir_coeff_japan_2484
--static const u32 ar9331_common_wo_xlna_rx_gain_1p2[][2] = {
--      /* Addr      allmodes  */
--      {0x0000a000, 0x00060005},
--      {0x0000a004, 0x00810080},
--      {0x0000a008, 0x00830082},
--      {0x0000a00c, 0x00850084},
--      {0x0000a010, 0x01820181},
--      {0x0000a014, 0x01840183},
--      {0x0000a018, 0x01880185},
--      {0x0000a01c, 0x018a0189},
--      {0x0000a020, 0x02850284},
--      {0x0000a024, 0x02890288},
--      {0x0000a028, 0x028b028a},
--      {0x0000a02c, 0x03850384},
--      {0x0000a030, 0x03890388},
--      {0x0000a034, 0x038b038a},
--      {0x0000a038, 0x038d038c},
--      {0x0000a03c, 0x03910390},
--      {0x0000a040, 0x03930392},
--      {0x0000a044, 0x03950394},
--      {0x0000a048, 0x00000396},
--      {0x0000a04c, 0x00000000},
--      {0x0000a050, 0x00000000},
--      {0x0000a054, 0x00000000},
--      {0x0000a058, 0x00000000},
--      {0x0000a05c, 0x00000000},
--      {0x0000a060, 0x00000000},
--      {0x0000a064, 0x00000000},
--      {0x0000a068, 0x00000000},
--      {0x0000a06c, 0x00000000},
--      {0x0000a070, 0x00000000},
--      {0x0000a074, 0x00000000},
--      {0x0000a078, 0x00000000},
--      {0x0000a07c, 0x00000000},
--      {0x0000a080, 0x28282828},
--      {0x0000a084, 0x28282828},
--      {0x0000a088, 0x28282828},
--      {0x0000a08c, 0x28282828},
--      {0x0000a090, 0x28282828},
--      {0x0000a094, 0x24242428},
--      {0x0000a098, 0x171e1e1e},
--      {0x0000a09c, 0x02020b0b},
--      {0x0000a0a0, 0x02020202},
--      {0x0000a0a4, 0x00000000},
--      {0x0000a0a8, 0x00000000},
--      {0x0000a0ac, 0x00000000},
--      {0x0000a0b0, 0x00000000},
--      {0x0000a0b4, 0x00000000},
--      {0x0000a0b8, 0x00000000},
--      {0x0000a0bc, 0x00000000},
--      {0x0000a0c0, 0x22072208},
--      {0x0000a0c4, 0x22052206},
--      {0x0000a0c8, 0x22032204},
--      {0x0000a0cc, 0x22012202},
--      {0x0000a0d0, 0x221f2200},
--      {0x0000a0d4, 0x221d221e},
--      {0x0000a0d8, 0x33023303},
--      {0x0000a0dc, 0x33003301},
--      {0x0000a0e0, 0x331e331f},
--      {0x0000a0e4, 0x4402331d},
--      {0x0000a0e8, 0x44004401},
--      {0x0000a0ec, 0x441e441f},
--      {0x0000a0f0, 0x55025503},
--      {0x0000a0f4, 0x55005501},
--      {0x0000a0f8, 0x551e551f},
--      {0x0000a0fc, 0x6602551d},
--      {0x0000a100, 0x66006601},
--      {0x0000a104, 0x661e661f},
--      {0x0000a108, 0x7703661d},
--      {0x0000a10c, 0x77017702},
--      {0x0000a110, 0x00007700},
--      {0x0000a114, 0x00000000},
--      {0x0000a118, 0x00000000},
--      {0x0000a11c, 0x00000000},
--      {0x0000a120, 0x00000000},
--      {0x0000a124, 0x00000000},
--      {0x0000a128, 0x00000000},
--      {0x0000a12c, 0x00000000},
--      {0x0000a130, 0x00000000},
--      {0x0000a134, 0x00000000},
--      {0x0000a138, 0x00000000},
--      {0x0000a13c, 0x00000000},
--      {0x0000a140, 0x001f0000},
--      {0x0000a144, 0x111f1100},
--      {0x0000a148, 0x111d111e},
--      {0x0000a14c, 0x111b111c},
--      {0x0000a150, 0x22032204},
--      {0x0000a154, 0x22012202},
--      {0x0000a158, 0x221f2200},
--      {0x0000a15c, 0x221d221e},
--      {0x0000a160, 0x33013302},
--      {0x0000a164, 0x331f3300},
--      {0x0000a168, 0x4402331e},
--      {0x0000a16c, 0x44004401},
--      {0x0000a170, 0x441e441f},
--      {0x0000a174, 0x55015502},
--      {0x0000a178, 0x551f5500},
--      {0x0000a17c, 0x6602551e},
--      {0x0000a180, 0x66006601},
--      {0x0000a184, 0x661e661f},
--      {0x0000a188, 0x7703661d},
--      {0x0000a18c, 0x77017702},
--      {0x0000a190, 0x00007700},
--      {0x0000a194, 0x00000000},
--      {0x0000a198, 0x00000000},
--      {0x0000a19c, 0x00000000},
--      {0x0000a1a0, 0x00000000},
--      {0x0000a1a4, 0x00000000},
--      {0x0000a1a8, 0x00000000},
--      {0x0000a1ac, 0x00000000},
--      {0x0000a1b0, 0x00000000},
--      {0x0000a1b4, 0x00000000},
--      {0x0000a1b8, 0x00000000},
--      {0x0000a1bc, 0x00000000},
--      {0x0000a1c0, 0x00000000},
--      {0x0000a1c4, 0x00000000},
--      {0x0000a1c8, 0x00000000},
--      {0x0000a1cc, 0x00000000},
--      {0x0000a1d0, 0x00000000},
--      {0x0000a1d4, 0x00000000},
--      {0x0000a1d8, 0x00000000},
--      {0x0000a1dc, 0x00000000},
--      {0x0000a1e0, 0x00000000},
--      {0x0000a1e4, 0x00000000},
--      {0x0000a1e8, 0x00000000},
--      {0x0000a1ec, 0x00000000},
--      {0x0000a1f0, 0x00000396},
--      {0x0000a1f4, 0x00000396},
--      {0x0000a1f8, 0x00000396},
--      {0x0000a1fc, 0x00000296},
--};
-+#define ar9331_1p2_xtal_25M ar9331_1p1_xtal_25M
--static const u32 ar9331_1p2_baseband_core[][2] = {
--      /* Addr      allmodes  */
--      {0x00009800, 0xafe68e30},
--      {0x00009804, 0xfd14e000},
--      {0x00009808, 0x9c0a8f6b},
--      {0x0000980c, 0x04800000},
--      {0x00009814, 0x9280c00a},
--      {0x00009818, 0x00000000},
--      {0x0000981c, 0x00020028},
--      {0x00009834, 0x5f3ca3de},
--      {0x00009838, 0x0108ecff},
--      {0x0000983c, 0x14750600},
--      {0x00009880, 0x201fff00},
--      {0x00009884, 0x00001042},
--      {0x000098a4, 0x00200400},
--      {0x000098b0, 0x32840bbe},
--      {0x000098d0, 0x004b6a8e},
--      {0x000098d4, 0x00000820},
--      {0x000098dc, 0x00000000},
--      {0x000098f0, 0x00000000},
--      {0x000098f4, 0x00000000},
--      {0x00009c04, 0x00000000},
--      {0x00009c08, 0x03200000},
--      {0x00009c0c, 0x00000000},
--      {0x00009c10, 0x00000000},
--      {0x00009c14, 0x00046384},
--      {0x00009c18, 0x05b6b440},
--      {0x00009c1c, 0x00b6b440},
--      {0x00009d00, 0xc080a333},
--      {0x00009d04, 0x40206c10},
--      {0x00009d08, 0x009c4060},
--      {0x00009d0c, 0x1883800a},
--      {0x00009d10, 0x01834061},
--      {0x00009d14, 0x00c00400},
--      {0x00009d18, 0x00000000},
--      {0x00009e08, 0x0038233c},
--      {0x00009e24, 0x9927b515},
--      {0x00009e28, 0x12ef0200},
--      {0x00009e30, 0x06336f77},
--      {0x00009e34, 0x6af6532f},
--      {0x00009e38, 0x0cc80c00},
--      {0x00009e40, 0x0d261820},
--      {0x00009e4c, 0x00001004},
--      {0x00009e50, 0x00ff03f1},
--      {0x00009fc0, 0x803e4788},
--      {0x00009fc4, 0x0001efb5},
--      {0x00009fcc, 0x40000014},
--      {0x0000a20c, 0x00000000},
--      {0x0000a220, 0x00000000},
--      {0x0000a224, 0x00000000},
--      {0x0000a228, 0x10002310},
--      {0x0000a23c, 0x00000000},
--      {0x0000a244, 0x0c000000},
--      {0x0000a2a0, 0x00000001},
--      {0x0000a2c0, 0x00000001},
--      {0x0000a2c8, 0x00000000},
--      {0x0000a2cc, 0x18c43433},
--      {0x0000a2d4, 0x00000000},
--      {0x0000a2dc, 0x00000000},
--      {0x0000a2e0, 0x00000000},
--      {0x0000a2e4, 0x00000000},
--      {0x0000a2e8, 0x00000000},
--      {0x0000a2ec, 0x00000000},
--      {0x0000a2f0, 0x00000000},
--      {0x0000a2f4, 0x00000000},
--      {0x0000a2f8, 0x00000000},
--      {0x0000a344, 0x00000000},
--      {0x0000a34c, 0x00000000},
--      {0x0000a350, 0x0000a000},
--      {0x0000a364, 0x00000000},
--      {0x0000a370, 0x00000000},
--      {0x0000a390, 0x00000001},
--      {0x0000a394, 0x00000444},
--      {0x0000a398, 0x001f0e0f},
--      {0x0000a39c, 0x0075393f},
--      {0x0000a3a0, 0xb79f6427},
--      {0x0000a3a4, 0x00000000},
--      {0x0000a3a8, 0xaaaaaaaa},
--      {0x0000a3ac, 0x3c466478},
--      {0x0000a3c0, 0x20202020},
--      {0x0000a3c4, 0x22222220},
--      {0x0000a3c8, 0x20200020},
--      {0x0000a3cc, 0x20202020},
--      {0x0000a3d0, 0x20202020},
--      {0x0000a3d4, 0x20202020},
--      {0x0000a3d8, 0x20202020},
--      {0x0000a3dc, 0x20202020},
--      {0x0000a3e0, 0x20202020},
--      {0x0000a3e4, 0x20202020},
--      {0x0000a3e8, 0x20202020},
--      {0x0000a3ec, 0x20202020},
--      {0x0000a3f0, 0x00000000},
--      {0x0000a3f4, 0x00000006},
--      {0x0000a3f8, 0x0cdbd380},
--      {0x0000a3fc, 0x000f0f01},
--      {0x0000a400, 0x8fa91f01},
--      {0x0000a404, 0x00000000},
--      {0x0000a408, 0x0e79e5c6},
--      {0x0000a40c, 0x00820820},
--      {0x0000a414, 0x1ce739ce},
--      {0x0000a418, 0x2d001dce},
--      {0x0000a41c, 0x1ce739ce},
--      {0x0000a420, 0x000001ce},
--      {0x0000a424, 0x1ce739ce},
--      {0x0000a428, 0x000001ce},
--      {0x0000a42c, 0x1ce739ce},
--      {0x0000a430, 0x1ce739ce},
--      {0x0000a434, 0x00000000},
--      {0x0000a438, 0x00001801},
--      {0x0000a43c, 0x00000000},
--      {0x0000a440, 0x00000000},
--      {0x0000a444, 0x00000000},
--      {0x0000a448, 0x04000000},
--      {0x0000a44c, 0x00000001},
--      {0x0000a450, 0x00010000},
--      {0x0000a458, 0x00000000},
--      {0x0000a640, 0x00000000},
--      {0x0000a644, 0x3fad9d74},
--      {0x0000a648, 0x0048060a},
--      {0x0000a64c, 0x00003c37},
--      {0x0000a670, 0x03020100},
--      {0x0000a674, 0x09080504},
--      {0x0000a678, 0x0d0c0b0a},
--      {0x0000a67c, 0x13121110},
--      {0x0000a680, 0x31301514},
--      {0x0000a684, 0x35343332},
--      {0x0000a688, 0x00000036},
--      {0x0000a690, 0x00000838},
--      {0x0000a7c0, 0x00000000},
--      {0x0000a7c4, 0xfffffffc},
--      {0x0000a7c8, 0x00000000},
--      {0x0000a7cc, 0x00000000},
--      {0x0000a7d0, 0x00000000},
--      {0x0000a7d4, 0x00000004},
--      {0x0000a7dc, 0x00000001},
--};
-+#define ar9331_1p2_xtal_40M ar9331_1p1_xtal_40M
--static const u32 ar9331_modes_high_power_tx_gain_1p2[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
--      {0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7},
--      {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200},
--      {0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202},
--      {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400},
--      {0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402},
--      {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404},
--      {0x0000a520, 0x2f001f04, 0x2f001f04, 0x23000a00, 0x23000a00},
--      {0x0000a524, 0x35001fc4, 0x35001fc4, 0x27000a02, 0x27000a02},
--      {0x0000a528, 0x3c022f04, 0x3c022f04, 0x2b000a04, 0x2b000a04},
--      {0x0000a52c, 0x41023e85, 0x41023e85, 0x3f001620, 0x3f001620},
--      {0x0000a530, 0x48023ec6, 0x48023ec6, 0x41001621, 0x41001621},
--      {0x0000a534, 0x4d023f01, 0x4d023f01, 0x44001640, 0x44001640},
--      {0x0000a538, 0x53023f4b, 0x53023f4b, 0x46001641, 0x46001641},
--      {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x48001642, 0x48001642},
--      {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x4b001644, 0x4b001644},
--      {0x0000a544, 0x6502feca, 0x6502feca, 0x4e001a81, 0x4e001a81},
--      {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x51001a83, 0x51001a83},
--      {0x0000a54c, 0x7203feca, 0x7203feca, 0x54001c84, 0x54001c84},
--      {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x57001ce3, 0x57001ce3},
--      {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x5b001ce5, 0x5b001ce5},
--      {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5f001ce9, 0x5f001ce9},
--      {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x66001eec, 0x66001eec},
--      {0x0000a560, 0x900fff0b, 0x900fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a564, 0x960fffcb, 0x960fffcb, 0x66001eec, 0x66001eec},
--      {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x66001eec, 0x66001eec},
--      {0x0000a580, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a584, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a588, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a58c, 0x11062202, 0x11062202, 0x0b000200, 0x0b000200},
--      {0x0000a590, 0x17022e00, 0x17022e00, 0x0f000202, 0x0f000202},
--      {0x0000a594, 0x1d000ec2, 0x1d000ec2, 0x11000400, 0x11000400},
--      {0x0000a598, 0x25020ec0, 0x25020ec0, 0x15000402, 0x15000402},
--      {0x0000a59c, 0x2b020ec3, 0x2b020ec3, 0x19000404, 0x19000404},
--      {0x0000a5a0, 0x2f001f04, 0x2f001f04, 0x1b000603, 0x1b000603},
--      {0x0000a5a4, 0x35001fc4, 0x35001fc4, 0x1f000a02, 0x1f000a02},
--      {0x0000a5a8, 0x3c022f04, 0x3c022f04, 0x23000a04, 0x23000a04},
--      {0x0000a5ac, 0x41023e85, 0x41023e85, 0x26000a20, 0x26000a20},
--      {0x0000a5b0, 0x48023ec6, 0x48023ec6, 0x2a000e20, 0x2a000e20},
--      {0x0000a5b4, 0x4d023f01, 0x4d023f01, 0x2e000e22, 0x2e000e22},
--      {0x0000a5b8, 0x53023f4b, 0x53023f4b, 0x31000e24, 0x31000e24},
--      {0x0000a5bc, 0x5a027f09, 0x5a027f09, 0x34001640, 0x34001640},
--      {0x0000a5c0, 0x5f027fc9, 0x5f027fc9, 0x38001660, 0x38001660},
--      {0x0000a5c4, 0x6502feca, 0x6502feca, 0x3b001861, 0x3b001861},
--      {0x0000a5c8, 0x6b02ff4a, 0x6b02ff4a, 0x3e001a81, 0x3e001a81},
--      {0x0000a5cc, 0x7203feca, 0x7203feca, 0x42001a83, 0x42001a83},
--      {0x0000a5d0, 0x7703ff0b, 0x7703ff0b, 0x44001c84, 0x44001c84},
--      {0x0000a5d4, 0x7d06ffcb, 0x7d06ffcb, 0x48001ce3, 0x48001ce3},
--      {0x0000a5d8, 0x8407ff0b, 0x8407ff0b, 0x4c001ce5, 0x4c001ce5},
--      {0x0000a5dc, 0x8907ffcb, 0x8907ffcb, 0x50001ce9, 0x50001ce9},
--      {0x0000a5e0, 0x900fff0b, 0x900fff0b, 0x54001ceb, 0x54001ceb},
--      {0x0000a5e4, 0x960fffcb, 0x960fffcb, 0x56001eec, 0x56001eec},
--      {0x0000a5e8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5ec, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f0, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f4, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5f8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a5fc, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
--      {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
--      {0x0000a618, 0x02008501, 0x02008501, 0x02008501, 0x02008501},
--      {0x0000a61c, 0x02008802, 0x02008802, 0x02008802, 0x02008802},
--      {0x0000a620, 0x0300c802, 0x0300c802, 0x0300c802, 0x0300c802},
--      {0x0000a624, 0x0300cc03, 0x0300cc03, 0x0300cc03, 0x0300cc03},
--      {0x0000a628, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a62c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a630, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a634, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a638, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--      {0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
--};
-+#define ar9331_1p2_baseband_core ar9331_1p1_baseband_core
--static const u32 ar9331_1p2_mac_postamble[][5] = {
--      /*  Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20  */
--      {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
--      {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
--      {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
--      {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
--      {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
--      {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
--      {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
--      {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
--};
-+#define ar9331_1p2_soc_postamble ar9331_1p1_soc_postamble
--static const u32 ar9331_1p2_soc_preamble[][2] = {
--      /* Addr      allmodes  */
--      {0x00007020, 0x00000000},
--      {0x00007034, 0x00000002},
--      {0x00007038, 0x000002f8},
--};
-+#define ar9331_1p2_mac_postamble ar9331_1p1_mac_postamble
--static const u32 ar9331_1p2_xtal_40M[][2] = {
--      /* Addr      allmodes  */
--      {0x00007038, 0x000004c2},
--      {0x00008244, 0x0010f400},
--      {0x0000824c, 0x0001e800},
--      {0x0001609c, 0x0b283f31},
--};
-+#define ar9331_1p2_soc_preamble ar9331_1p1_soc_preamble
--static const u32 ar9331_1p2_mac_core[][2] = {
--      /* Addr      allmodes  */
--      {0x00000008, 0x00000000},
--      {0x00000030, 0x00020085},
--      {0x00000034, 0x00000005},
--      {0x00000040, 0x00000000},
--      {0x00000044, 0x00000000},
--      {0x00000048, 0x00000008},
--      {0x0000004c, 0x00000010},
--      {0x00000050, 0x00000000},
--      {0x00001040, 0x002ffc0f},
--      {0x00001044, 0x002ffc0f},
--      {0x00001048, 0x002ffc0f},
--      {0x0000104c, 0x002ffc0f},
--      {0x00001050, 0x002ffc0f},
--      {0x00001054, 0x002ffc0f},
--      {0x00001058, 0x002ffc0f},
--      {0x0000105c, 0x002ffc0f},
--      {0x00001060, 0x002ffc0f},
--      {0x00001064, 0x002ffc0f},
--      {0x000010f0, 0x00000100},
--      {0x00001270, 0x00000000},
--      {0x000012b0, 0x00000000},
--      {0x000012f0, 0x00000000},
--      {0x0000143c, 0x00000000},
--      {0x0000147c, 0x00000000},
--      {0x00008000, 0x00000000},
--      {0x00008004, 0x00000000},
--      {0x00008008, 0x00000000},
--      {0x0000800c, 0x00000000},
--      {0x00008018, 0x00000000},
--      {0x00008020, 0x00000000},
--      {0x00008038, 0x00000000},
--      {0x0000803c, 0x00000000},
--      {0x00008040, 0x00000000},
--      {0x00008044, 0x00000000},
--      {0x00008048, 0x00000000},
--      {0x0000804c, 0xffffffff},
--      {0x00008054, 0x00000000},
--      {0x00008058, 0x00000000},
--      {0x0000805c, 0x000fc78f},
--      {0x00008060, 0x0000000f},
--      {0x00008064, 0x00000000},
--      {0x00008070, 0x00000310},
--      {0x00008074, 0x00000020},
--      {0x00008078, 0x00000000},
--      {0x0000809c, 0x0000000f},
--      {0x000080a0, 0x00000000},
--      {0x000080a4, 0x02ff0000},
--      {0x000080a8, 0x0e070605},
--      {0x000080ac, 0x0000000d},
--      {0x000080b0, 0x00000000},
--      {0x000080b4, 0x00000000},
--      {0x000080b8, 0x00000000},
--      {0x000080bc, 0x00000000},
--      {0x000080c0, 0x2a800000},
--      {0x000080c4, 0x06900168},
--      {0x000080c8, 0x13881c20},
--      {0x000080cc, 0x01f40000},
--      {0x000080d0, 0x00252500},
--      {0x000080d4, 0x00a00000},
--      {0x000080d8, 0x00400000},
--      {0x000080dc, 0x00000000},
--      {0x000080e0, 0xffffffff},
--      {0x000080e4, 0x0000ffff},
--      {0x000080e8, 0x3f3f3f3f},
--      {0x000080ec, 0x00000000},
--      {0x000080f0, 0x00000000},
--      {0x000080f4, 0x00000000},
--      {0x000080fc, 0x00020000},
--      {0x00008100, 0x00000000},
--      {0x00008108, 0x00000052},
--      {0x0000810c, 0x00000000},
--      {0x00008110, 0x00000000},
--      {0x00008114, 0x000007ff},
--      {0x00008118, 0x000000aa},
--      {0x0000811c, 0x00003210},
--      {0x00008124, 0x00000000},
--      {0x00008128, 0x00000000},
--      {0x0000812c, 0x00000000},
--      {0x00008130, 0x00000000},
--      {0x00008134, 0x00000000},
--      {0x00008138, 0x00000000},
--      {0x0000813c, 0x0000ffff},
--      {0x00008144, 0xffffffff},
--      {0x00008168, 0x00000000},
--      {0x0000816c, 0x00000000},
--      {0x00008170, 0x18486200},
--      {0x00008174, 0x33332210},
--      {0x00008178, 0x00000000},
--      {0x0000817c, 0x00020000},
--      {0x000081c0, 0x00000000},
--      {0x000081c4, 0x33332210},
--      {0x000081c8, 0x00000000},
--      {0x000081cc, 0x00000000},
--      {0x000081d4, 0x00000000},
--      {0x000081ec, 0x00000000},
--      {0x000081f0, 0x00000000},
--      {0x000081f4, 0x00000000},
--      {0x000081f8, 0x00000000},
--      {0x000081fc, 0x00000000},
--      {0x00008240, 0x00100000},
--      {0x00008248, 0x00000800},
--      {0x00008250, 0x00000000},
--      {0x00008254, 0x00000000},
--      {0x00008258, 0x00000000},
--      {0x0000825c, 0x40000000},
--      {0x00008260, 0x00080922},
--      {0x00008264, 0x9d400010},
--      {0x00008268, 0xffffffff},
--      {0x0000826c, 0x0000ffff},
--      {0x00008270, 0x00000000},
--      {0x00008274, 0x40000000},
--      {0x00008278, 0x003e4180},
--      {0x0000827c, 0x00000004},
--      {0x00008284, 0x0000002c},
--      {0x00008288, 0x0000002c},
--      {0x0000828c, 0x000000ff},
--      {0x00008294, 0x00000000},
--      {0x00008298, 0x00000000},
--      {0x0000829c, 0x00000000},
--      {0x00008300, 0x00000140},
--      {0x00008314, 0x00000000},
--      {0x0000831c, 0x0000010d},
--      {0x00008328, 0x00000000},
--      {0x0000832c, 0x00000007},
--      {0x00008330, 0x00000302},
--      {0x00008334, 0x00000700},
--      {0x00008338, 0x00ff0000},
--      {0x0000833c, 0x02400000},
--      {0x00008340, 0x000107ff},
--      {0x00008344, 0xaa48105b},
--      {0x00008348, 0x008f0000},
--      {0x0000835c, 0x00000000},
--      {0x00008360, 0xffffffff},
--      {0x00008364, 0xffffffff},
--      {0x00008368, 0x00000000},
--      {0x00008370, 0x00000000},
--      {0x00008374, 0x000000ff},
--      {0x00008378, 0x00000000},
--      {0x0000837c, 0x00000000},
--      {0x00008380, 0xffffffff},
--      {0x00008384, 0xffffffff},
--      {0x00008390, 0xffffffff},
--      {0x00008394, 0xffffffff},
--      {0x00008398, 0x00000000},
--      {0x0000839c, 0x00000000},
--      {0x000083a0, 0x00000000},
--      {0x000083a4, 0x0000fa14},
--      {0x000083a8, 0x000f0c00},
--      {0x000083ac, 0x33332210},
--      {0x000083b0, 0x33332210},
--      {0x000083b4, 0x33332210},
--      {0x000083b8, 0x33332210},
--      {0x000083bc, 0x00000000},
--      {0x000083c0, 0x00000000},
--      {0x000083c4, 0x00000000},
--      {0x000083c8, 0x00000000},
--      {0x000083cc, 0x00000200},
--      {0x000083d0, 0x000301ff},
--};
-+#define ar9331_1p2_mac_core ar9331_1p1_mac_core
--static const u32 ar9331_common_rx_gain_1p2[][2] = {
--      /* Addr      allmodes  */
--      {0x0000a000, 0x00010000},
--      {0x0000a004, 0x00030002},
--      {0x0000a008, 0x00050004},
--      {0x0000a00c, 0x00810080},
--      {0x0000a010, 0x01800082},
--      {0x0000a014, 0x01820181},
--      {0x0000a018, 0x01840183},
--      {0x0000a01c, 0x01880185},
--      {0x0000a020, 0x018a0189},
--      {0x0000a024, 0x02850284},
--      {0x0000a028, 0x02890288},
--      {0x0000a02c, 0x03850384},
--      {0x0000a030, 0x03890388},
--      {0x0000a034, 0x038b038a},
--      {0x0000a038, 0x038d038c},
--      {0x0000a03c, 0x03910390},
--      {0x0000a040, 0x03930392},
--      {0x0000a044, 0x03950394},
--      {0x0000a048, 0x00000396},
--      {0x0000a04c, 0x00000000},
--      {0x0000a050, 0x00000000},
--      {0x0000a054, 0x00000000},
--      {0x0000a058, 0x00000000},
--      {0x0000a05c, 0x00000000},
--      {0x0000a060, 0x00000000},
--      {0x0000a064, 0x00000000},
--      {0x0000a068, 0x00000000},
--      {0x0000a06c, 0x00000000},
--      {0x0000a070, 0x00000000},
--      {0x0000a074, 0x00000000},
--      {0x0000a078, 0x00000000},
--      {0x0000a07c, 0x00000000},
--      {0x0000a080, 0x28282828},
--      {0x0000a084, 0x28282828},
--      {0x0000a088, 0x28282828},
--      {0x0000a08c, 0x28282828},
--      {0x0000a090, 0x28282828},
--      {0x0000a094, 0x21212128},
--      {0x0000a098, 0x171c1c1c},
--      {0x0000a09c, 0x02020212},
--      {0x0000a0a0, 0x00000202},
--      {0x0000a0a4, 0x00000000},
--      {0x0000a0a8, 0x00000000},
--      {0x0000a0ac, 0x00000000},
--      {0x0000a0b0, 0x00000000},
--      {0x0000a0b4, 0x00000000},
--      {0x0000a0b8, 0x00000000},
--      {0x0000a0bc, 0x00000000},
--      {0x0000a0c0, 0x001f0000},
--      {0x0000a0c4, 0x111f1100},
--      {0x0000a0c8, 0x111d111e},
--      {0x0000a0cc, 0x111b111c},
--      {0x0000a0d0, 0x22032204},
--      {0x0000a0d4, 0x22012202},
--      {0x0000a0d8, 0x221f2200},
--      {0x0000a0dc, 0x221d221e},
--      {0x0000a0e0, 0x33013302},
--      {0x0000a0e4, 0x331f3300},
--      {0x0000a0e8, 0x4402331e},
--      {0x0000a0ec, 0x44004401},
--      {0x0000a0f0, 0x441e441f},
--      {0x0000a0f4, 0x55015502},
--      {0x0000a0f8, 0x551f5500},
--      {0x0000a0fc, 0x6602551e},
--      {0x0000a100, 0x66006601},
--      {0x0000a104, 0x661e661f},
--      {0x0000a108, 0x7703661d},
--      {0x0000a10c, 0x77017702},
--      {0x0000a110, 0x00007700},
--      {0x0000a114, 0x00000000},
--      {0x0000a118, 0x00000000},
--      {0x0000a11c, 0x00000000},
--      {0x0000a120, 0x00000000},
--      {0x0000a124, 0x00000000},
--      {0x0000a128, 0x00000000},
--      {0x0000a12c, 0x00000000},
--      {0x0000a130, 0x00000000},
--      {0x0000a134, 0x00000000},
--      {0x0000a138, 0x00000000},
--      {0x0000a13c, 0x00000000},
--      {0x0000a140, 0x001f0000},
--      {0x0000a144, 0x111f1100},
--      {0x0000a148, 0x111d111e},
--      {0x0000a14c, 0x111b111c},
--      {0x0000a150, 0x22032204},
--      {0x0000a154, 0x22012202},
--      {0x0000a158, 0x221f2200},
--      {0x0000a15c, 0x221d221e},
--      {0x0000a160, 0x33013302},
--      {0x0000a164, 0x331f3300},
--      {0x0000a168, 0x4402331e},
--      {0x0000a16c, 0x44004401},
--      {0x0000a170, 0x441e441f},
--      {0x0000a174, 0x55015502},
--      {0x0000a178, 0x551f5500},
--      {0x0000a17c, 0x6602551e},
--      {0x0000a180, 0x66006601},
--      {0x0000a184, 0x661e661f},
--      {0x0000a188, 0x7703661d},
--      {0x0000a18c, 0x77017702},
--      {0x0000a190, 0x00007700},
--      {0x0000a194, 0x00000000},
--      {0x0000a198, 0x00000000},
--      {0x0000a19c, 0x00000000},
--      {0x0000a1a0, 0x00000000},
--      {0x0000a1a4, 0x00000000},
--      {0x0000a1a8, 0x00000000},
--      {0x0000a1ac, 0x00000000},
--      {0x0000a1b0, 0x00000000},
--      {0x0000a1b4, 0x00000000},
--      {0x0000a1b8, 0x00000000},
--      {0x0000a1bc, 0x00000000},
--      {0x0000a1c0, 0x00000000},
--      {0x0000a1c4, 0x00000000},
--      {0x0000a1c8, 0x00000000},
--      {0x0000a1cc, 0x00000000},
--      {0x0000a1d0, 0x00000000},
--      {0x0000a1d4, 0x00000000},
--      {0x0000a1d8, 0x00000000},
--      {0x0000a1dc, 0x00000000},
--      {0x0000a1e0, 0x00000000},
--      {0x0000a1e4, 0x00000000},
--      {0x0000a1e8, 0x00000000},
--      {0x0000a1ec, 0x00000000},
--      {0x0000a1f0, 0x00000396},
--      {0x0000a1f4, 0x00000396},
--      {0x0000a1f8, 0x00000396},
--      {0x0000a1fc, 0x00000296},
--};
-+#define ar9331_common_wo_xlna_rx_gain_1p2 ar9331_common_wo_xlna_rx_gain_1p1
-+
-+#define ar9331_common_rx_gain_1p2 ar9485_common_rx_gain_1_1
- #endif /* INITVALS_9330_1P2_H */
---- a/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
-@@ -100,18 +100,7 @@ static const u32 ar9340Modes_lowest_ob_d
-       {0x00016448, 0x24925266, 0x24925266, 0x24925266, 0x24925266},
- };
--static const u32 ar9340Modes_fast_clock_1p0[][3] = {
--      /* Addr      5G_HT20     5G_HT40   */
--      {0x00001030, 0x00000268, 0x000004d0},
--      {0x00001070, 0x0000018c, 0x00000318},
--      {0x000010b0, 0x00000fd0, 0x00001fa0},
--      {0x00008014, 0x044c044c, 0x08980898},
--      {0x0000801c, 0x148ec02b, 0x148ec057},
--      {0x00008318, 0x000044c0, 0x00008980},
--      {0x00009e00, 0x0372131c, 0x0372131c},
--      {0x0000a230, 0x0000000b, 0x00000016},
--      {0x0000a254, 0x00000898, 0x00001130},
--};
-+#define ar9340Modes_fast_clock_1p0 ar9300Modes_fast_clock_2p2
- static const u32 ar9340_1p0_radio_core[][2] = {
-       /* Addr      allmodes  */
-@@ -224,22 +213,9 @@ static const u32 ar9340_1p0_radio_core_4
-       {0x000160b0, 0x01885f5a},
- };
--static const u32 ar9340_1p0_mac_postamble[][5] = {
--      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
--      {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
--      {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
--      {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
--      {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
--      {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
--      {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
--      {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
--      {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
--};
-+#define ar9340_1p0_mac_postamble ar9300_2p2_mac_postamble
--static const u32 ar9340_1p0_soc_postamble[][5] = {
--      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
--      {0x00007010, 0x00000023, 0x00000023, 0x00000023, 0x00000023},
--};
-+#define ar9340_1p0_soc_postamble ar9300_2p2_soc_postamble
- static const u32 ar9340_1p0_baseband_postamble[][5] = {
-       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-@@ -1359,265 +1335,7 @@ static const u32 ar9340_1p0_mac_core[][2
-       {0x000083d0, 0x000101ff},
- };
--static const u32 ar9340Common_wo_xlna_rx_gain_table_1p0[][2] = {
--      /* Addr      allmodes  */
--      {0x0000a000, 0x00010000},
--      {0x0000a004, 0x00030002},
--      {0x0000a008, 0x00050004},
--      {0x0000a00c, 0x00810080},
--      {0x0000a010, 0x00830082},
--      {0x0000a014, 0x01810180},
--      {0x0000a018, 0x01830182},
--      {0x0000a01c, 0x01850184},
--      {0x0000a020, 0x01890188},
--      {0x0000a024, 0x018b018a},
--      {0x0000a028, 0x018d018c},
--      {0x0000a02c, 0x03820190},
--      {0x0000a030, 0x03840383},
--      {0x0000a034, 0x03880385},
--      {0x0000a038, 0x038a0389},
--      {0x0000a03c, 0x038c038b},
--      {0x0000a040, 0x0390038d},
--      {0x0000a044, 0x03920391},
--      {0x0000a048, 0x03940393},
--      {0x0000a04c, 0x03960395},
--      {0x0000a050, 0x00000000},
--      {0x0000a054, 0x00000000},
--      {0x0000a058, 0x00000000},
--      {0x0000a05c, 0x00000000},
--      {0x0000a060, 0x00000000},
--      {0x0000a064, 0x00000000},
--      {0x0000a068, 0x00000000},
--      {0x0000a06c, 0x00000000},
--      {0x0000a070, 0x00000000},
--      {0x0000a074, 0x00000000},
--      {0x0000a078, 0x00000000},
--      {0x0000a07c, 0x00000000},
--      {0x0000a080, 0x29292929},
--      {0x0000a084, 0x29292929},
--      {0x0000a088, 0x29292929},
--      {0x0000a08c, 0x29292929},
--      {0x0000a090, 0x22292929},
--      {0x0000a094, 0x1d1d2222},
--      {0x0000a098, 0x0c111117},
--      {0x0000a09c, 0x00030303},
--      {0x0000a0a0, 0x00000000},
--      {0x0000a0a4, 0x00000000},
--      {0x0000a0a8, 0x00000000},
--      {0x0000a0ac, 0x00000000},
--      {0x0000a0b0, 0x00000000},
--      {0x0000a0b4, 0x00000000},
--      {0x0000a0b8, 0x00000000},
--      {0x0000a0bc, 0x00000000},
--      {0x0000a0c0, 0x001f0000},
--      {0x0000a0c4, 0x01000101},
--      {0x0000a0c8, 0x011e011f},
--      {0x0000a0cc, 0x011c011d},
--      {0x0000a0d0, 0x02030204},
--      {0x0000a0d4, 0x02010202},
--      {0x0000a0d8, 0x021f0200},
--      {0x0000a0dc, 0x0302021e},
--      {0x0000a0e0, 0x03000301},
--      {0x0000a0e4, 0x031e031f},
--      {0x0000a0e8, 0x0402031d},
--      {0x0000a0ec, 0x04000401},
--      {0x0000a0f0, 0x041e041f},
--      {0x0000a0f4, 0x0502041d},
--      {0x0000a0f8, 0x05000501},
--      {0x0000a0fc, 0x051e051f},
--      {0x0000a100, 0x06010602},
--      {0x0000a104, 0x061f0600},
--      {0x0000a108, 0x061d061e},
--      {0x0000a10c, 0x07020703},
--      {0x0000a110, 0x07000701},
--      {0x0000a114, 0x00000000},
--      {0x0000a118, 0x00000000},
--      {0x0000a11c, 0x00000000},
--      {0x0000a120, 0x00000000},
--      {0x0000a124, 0x00000000},
--      {0x0000a128, 0x00000000},
--      {0x0000a12c, 0x00000000},
--      {0x0000a130, 0x00000000},
--      {0x0000a134, 0x00000000},
--      {0x0000a138, 0x00000000},
--      {0x0000a13c, 0x00000000},
--      {0x0000a140, 0x001f0000},
--      {0x0000a144, 0x01000101},
--      {0x0000a148, 0x011e011f},
--      {0x0000a14c, 0x011c011d},
--      {0x0000a150, 0x02030204},
--      {0x0000a154, 0x02010202},
--      {0x0000a158, 0x021f0200},
--      {0x0000a15c, 0x0302021e},
--      {0x0000a160, 0x03000301},
--      {0x0000a164, 0x031e031f},
--      {0x0000a168, 0x0402031d},
--      {0x0000a16c, 0x04000401},
--      {0x0000a170, 0x041e041f},
--      {0x0000a174, 0x0502041d},
--      {0x0000a178, 0x05000501},
--      {0x0000a17c, 0x051e051f},
--      {0x0000a180, 0x06010602},
--      {0x0000a184, 0x061f0600},
--      {0x0000a188, 0x061d061e},
--      {0x0000a18c, 0x07020703},
--      {0x0000a190, 0x07000701},
--      {0x0000a194, 0x00000000},
--      {0x0000a198, 0x00000000},
--      {0x0000a19c, 0x00000000},
--      {0x0000a1a0, 0x00000000},
--      {0x0000a1a4, 0x00000000},
--      {0x0000a1a8, 0x00000000},
--      {0x0000a1ac, 0x00000000},
--      {0x0000a1b0, 0x00000000},
--      {0x0000a1b4, 0x00000000},
--      {0x0000a1b8, 0x00000000},
--      {0x0000a1bc, 0x00000000},
--      {0x0000a1c0, 0x00000000},
--      {0x0000a1c4, 0x00000000},
--      {0x0000a1c8, 0x00000000},
--      {0x0000a1cc, 0x00000000},
--      {0x0000a1d0, 0x00000000},
--      {0x0000a1d4, 0x00000000},
--      {0x0000a1d8, 0x00000000},
--      {0x0000a1dc, 0x00000000},
--      {0x0000a1e0, 0x00000000},
--      {0x0000a1e4, 0x00000000},
--      {0x0000a1e8, 0x00000000},
--      {0x0000a1ec, 0x00000000},
--      {0x0000a1f0, 0x00000396},
--      {0x0000a1f4, 0x00000396},
--      {0x0000a1f8, 0x00000396},
--      {0x0000a1fc, 0x00000196},
--      {0x0000b000, 0x00010000},
--      {0x0000b004, 0x00030002},
--      {0x0000b008, 0x00050004},
--      {0x0000b00c, 0x00810080},
--      {0x0000b010, 0x00830082},
--      {0x0000b014, 0x01810180},
--      {0x0000b018, 0x01830182},
--      {0x0000b01c, 0x01850184},
--      {0x0000b020, 0x02810280},
--      {0x0000b024, 0x02830282},
--      {0x0000b028, 0x02850284},
--      {0x0000b02c, 0x02890288},
--      {0x0000b030, 0x028b028a},
--      {0x0000b034, 0x0388028c},
--      {0x0000b038, 0x038a0389},
--      {0x0000b03c, 0x038c038b},
--      {0x0000b040, 0x0390038d},
--      {0x0000b044, 0x03920391},
--      {0x0000b048, 0x03940393},
--      {0x0000b04c, 0x03960395},
--      {0x0000b050, 0x00000000},
--      {0x0000b054, 0x00000000},
--      {0x0000b058, 0x00000000},
--      {0x0000b05c, 0x00000000},
--      {0x0000b060, 0x00000000},
--      {0x0000b064, 0x00000000},
--      {0x0000b068, 0x00000000},
--      {0x0000b06c, 0x00000000},
--      {0x0000b070, 0x00000000},
--      {0x0000b074, 0x00000000},
--      {0x0000b078, 0x00000000},
--      {0x0000b07c, 0x00000000},
--      {0x0000b080, 0x32323232},
--      {0x0000b084, 0x2f2f3232},
--      {0x0000b088, 0x23282a2d},
--      {0x0000b08c, 0x1c1e2123},
--      {0x0000b090, 0x14171919},
--      {0x0000b094, 0x0e0e1214},
--      {0x0000b098, 0x03050707},
--      {0x0000b09c, 0x00030303},
--      {0x0000b0a0, 0x00000000},
--      {0x0000b0a4, 0x00000000},
--      {0x0000b0a8, 0x00000000},
--      {0x0000b0ac, 0x00000000},
--      {0x0000b0b0, 0x00000000},
--      {0x0000b0b4, 0x00000000},
--      {0x0000b0b8, 0x00000000},
--      {0x0000b0bc, 0x00000000},
--      {0x0000b0c0, 0x003f0020},
--      {0x0000b0c4, 0x00400041},
--      {0x0000b0c8, 0x0140005f},
--      {0x0000b0cc, 0x0160015f},
--      {0x0000b0d0, 0x017e017f},
--      {0x0000b0d4, 0x02410242},
--      {0x0000b0d8, 0x025f0240},
--      {0x0000b0dc, 0x027f0260},
--      {0x0000b0e0, 0x0341027e},
--      {0x0000b0e4, 0x035f0340},
--      {0x0000b0e8, 0x037f0360},
--      {0x0000b0ec, 0x04400441},
--      {0x0000b0f0, 0x0460045f},
--      {0x0000b0f4, 0x0541047f},
--      {0x0000b0f8, 0x055f0540},
--      {0x0000b0fc, 0x057f0560},
--      {0x0000b100, 0x06400641},
--      {0x0000b104, 0x0660065f},
--      {0x0000b108, 0x067e067f},
--      {0x0000b10c, 0x07410742},
--      {0x0000b110, 0x075f0740},
--      {0x0000b114, 0x077f0760},
--      {0x0000b118, 0x07800781},
--      {0x0000b11c, 0x07a0079f},
--      {0x0000b120, 0x07c107bf},
--      {0x0000b124, 0x000007c0},
--      {0x0000b128, 0x00000000},
--      {0x0000b12c, 0x00000000},
--      {0x0000b130, 0x00000000},
--      {0x0000b134, 0x00000000},
--      {0x0000b138, 0x00000000},
--      {0x0000b13c, 0x00000000},
--      {0x0000b140, 0x003f0020},
--      {0x0000b144, 0x00400041},
--      {0x0000b148, 0x0140005f},
--      {0x0000b14c, 0x0160015f},
--      {0x0000b150, 0x017e017f},
--      {0x0000b154, 0x02410242},
--      {0x0000b158, 0x025f0240},
--      {0x0000b15c, 0x027f0260},
--      {0x0000b160, 0x0341027e},
--      {0x0000b164, 0x035f0340},
--      {0x0000b168, 0x037f0360},
--      {0x0000b16c, 0x04400441},
--      {0x0000b170, 0x0460045f},
--      {0x0000b174, 0x0541047f},
--      {0x0000b178, 0x055f0540},
--      {0x0000b17c, 0x057f0560},
--      {0x0000b180, 0x06400641},
--      {0x0000b184, 0x0660065f},
--      {0x0000b188, 0x067e067f},
--      {0x0000b18c, 0x07410742},
--      {0x0000b190, 0x075f0740},
--      {0x0000b194, 0x077f0760},
--      {0x0000b198, 0x07800781},
--      {0x0000b19c, 0x07a0079f},
--      {0x0000b1a0, 0x07c107bf},
--      {0x0000b1a4, 0x000007c0},
--      {0x0000b1a8, 0x00000000},
--      {0x0000b1ac, 0x00000000},
--      {0x0000b1b0, 0x00000000},
--      {0x0000b1b4, 0x00000000},
--      {0x0000b1b8, 0x00000000},
--      {0x0000b1bc, 0x00000000},
--      {0x0000b1c0, 0x00000000},
--      {0x0000b1c4, 0x00000000},
--      {0x0000b1c8, 0x00000000},
--      {0x0000b1cc, 0x00000000},
--      {0x0000b1d0, 0x00000000},
--      {0x0000b1d4, 0x00000000},
--      {0x0000b1d8, 0x00000000},
--      {0x0000b1dc, 0x00000000},
--      {0x0000b1e0, 0x00000000},
--      {0x0000b1e4, 0x00000000},
--      {0x0000b1e8, 0x00000000},
--      {0x0000b1ec, 0x00000000},
--      {0x0000b1f0, 0x00000396},
--      {0x0000b1f4, 0x00000396},
--      {0x0000b1f8, 0x00000396},
--      {0x0000b1fc, 0x00000196},
--};
-+#define ar9340Common_wo_xlna_rx_gain_table_1p0 ar9300Common_wo_xlna_rx_gain_table_2p2
- static const u32 ar9340_1p0_soc_preamble[][2] = {
-       /* Addr      allmodes  */
---- a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h
-@@ -1,5 +1,6 @@
- /*
-- * Copyright (c) 2010 Atheros Communications Inc.
-+ * Copyright (c) 2010-2011 Atheros Communications Inc.
-+ * Copyright (c) 2011-2012 Qualcomm Atheros Inc.
-  *
-  * Permission to use, copy, modify, and/or distribute this software for any
-  * purpose with or without fee is hereby granted, provided that the above
-@@ -1007,7 +1008,7 @@ static const u32 ar9462_2p0_radio_core[]
- static const u32 ar9462_2p0_soc_preamble[][2] = {
-       /* Addr      allmodes  */
--      {0x000040a4 ,0x00a0c1c9},
-+      {0x000040a4, 0x00a0c1c9},
-       {0x00007020, 0x00000000},
-       {0x00007034, 0x00000002},
-       {0x00007038, 0x000004c2},
---- a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h
-@@ -1,5 +1,6 @@
- /*
-  * Copyright (c) 2010-2011 Atheros Communications Inc.
-+ * Copyright (c) 2011-2012 Qualcomm Atheros Inc.
-  *
-  * Permission to use, copy, modify, and/or distribute this software for any
-  * purpose with or without fee is hereby granted, provided that the above
-@@ -17,599 +18,151 @@
- #ifndef INITVALS_9485_H
- #define INITVALS_9485_H
--static const u32 ar9485_1_1_mac_core[][2] = {
--      /*  Addr       allmodes */
--      {0x00000008, 0x00000000},
--      {0x00000030, 0x00020085},
--      {0x00000034, 0x00000005},
--      {0x00000040, 0x00000000},
--      {0x00000044, 0x00000000},
--      {0x00000048, 0x00000008},
--      {0x0000004c, 0x00000010},
--      {0x00000050, 0x00000000},
--      {0x00001040, 0x002ffc0f},
--      {0x00001044, 0x002ffc0f},
--      {0x00001048, 0x002ffc0f},
--      {0x0000104c, 0x002ffc0f},
--      {0x00001050, 0x002ffc0f},
--      {0x00001054, 0x002ffc0f},
--      {0x00001058, 0x002ffc0f},
--      {0x0000105c, 0x002ffc0f},
--      {0x00001060, 0x002ffc0f},
--      {0x00001064, 0x002ffc0f},
--      {0x000010f0, 0x00000100},
--      {0x00001270, 0x00000000},
--      {0x000012b0, 0x00000000},
--      {0x000012f0, 0x00000000},
--      {0x0000143c, 0x00000000},
--      {0x0000147c, 0x00000000},
--      {0x00008000, 0x00000000},
--      {0x00008004, 0x00000000},
--      {0x00008008, 0x00000000},
--      {0x0000800c, 0x00000000},
--      {0x00008018, 0x00000000},
--      {0x00008020, 0x00000000},
--      {0x00008038, 0x00000000},
--      {0x0000803c, 0x00000000},
--      {0x00008040, 0x00000000},
--      {0x00008044, 0x00000000},
--      {0x00008048, 0x00000000},
--      {0x0000804c, 0xffffffff},
--      {0x00008054, 0x00000000},
--      {0x00008058, 0x00000000},
--      {0x0000805c, 0x000fc78f},
--      {0x00008060, 0x0000000f},
--      {0x00008064, 0x00000000},
--      {0x00008070, 0x00000310},
--      {0x00008074, 0x00000020},
--      {0x00008078, 0x00000000},
--      {0x0000809c, 0x0000000f},
--      {0x000080a0, 0x00000000},
--      {0x000080a4, 0x02ff0000},
--      {0x000080a8, 0x0e070605},
--      {0x000080ac, 0x0000000d},
--      {0x000080b0, 0x00000000},
--      {0x000080b4, 0x00000000},
--      {0x000080b8, 0x00000000},
--      {0x000080bc, 0x00000000},
--      {0x000080c0, 0x2a800000},
--      {0x000080c4, 0x06900168},
--      {0x000080c8, 0x13881c22},
--      {0x000080cc, 0x01f40000},
--      {0x000080d0, 0x00252500},
--      {0x000080d4, 0x00a00000},
--      {0x000080d8, 0x00400000},
--      {0x000080dc, 0x00000000},
--      {0x000080e0, 0xffffffff},
--      {0x000080e4, 0x0000ffff},
--      {0x000080e8, 0x3f3f3f3f},
--      {0x000080ec, 0x00000000},
--      {0x000080f0, 0x00000000},
--      {0x000080f4, 0x00000000},
--      {0x000080fc, 0x00020000},
--      {0x00008100, 0x00000000},
--      {0x00008108, 0x00000052},
--      {0x0000810c, 0x00000000},
--      {0x00008110, 0x00000000},
--      {0x00008114, 0x000007ff},
--      {0x00008118, 0x000000aa},
--      {0x0000811c, 0x00003210},
--      {0x00008124, 0x00000000},
--      {0x00008128, 0x00000000},
--      {0x0000812c, 0x00000000},
--      {0x00008130, 0x00000000},
--      {0x00008134, 0x00000000},
--      {0x00008138, 0x00000000},
--      {0x0000813c, 0x0000ffff},
--      {0x00008144, 0xffffffff},
--      {0x00008168, 0x00000000},
--      {0x0000816c, 0x00000000},
--      {0x00008170, 0x18486200},
--      {0x00008174, 0x33332210},
--      {0x00008178, 0x00000000},
--      {0x0000817c, 0x00020000},
--      {0x000081c0, 0x00000000},
--      {0x000081c4, 0x33332210},
--      {0x000081d4, 0x00000000},
--      {0x000081ec, 0x00000000},
--      {0x000081f0, 0x00000000},
--      {0x000081f4, 0x00000000},
--      {0x000081f8, 0x00000000},
--      {0x000081fc, 0x00000000},
--      {0x00008240, 0x00100000},
--      {0x00008244, 0x0010f400},
--      {0x00008248, 0x00000800},
--      {0x0000824c, 0x0001e800},
--      {0x00008250, 0x00000000},
--      {0x00008254, 0x00000000},
--      {0x00008258, 0x00000000},
--      {0x0000825c, 0x40000000},
--      {0x00008260, 0x00080922},
--      {0x00008264, 0x9ca00010},
--      {0x00008268, 0xffffffff},
--      {0x0000826c, 0x0000ffff},
--      {0x00008270, 0x00000000},
--      {0x00008274, 0x40000000},
--      {0x00008278, 0x003e4180},
--      {0x0000827c, 0x00000004},
--      {0x00008284, 0x0000002c},
--      {0x00008288, 0x0000002c},
--      {0x0000828c, 0x000000ff},
--      {0x00008294, 0x00000000},
--      {0x00008298, 0x00000000},
--      {0x0000829c, 0x00000000},
--      {0x00008300, 0x00000140},
--      {0x00008314, 0x00000000},
--      {0x0000831c, 0x0000010d},
--      {0x00008328, 0x00000000},
--      {0x0000832c, 0x00000007},
--      {0x00008330, 0x00000302},
--      {0x00008334, 0x00000700},
--      {0x00008338, 0x00ff0000},
--      {0x0000833c, 0x02400000},
--      {0x00008340, 0x000107ff},
--      {0x00008344, 0xa248105b},
--      {0x00008348, 0x008f0000},
--      {0x0000835c, 0x00000000},
--      {0x00008360, 0xffffffff},
--      {0x00008364, 0xffffffff},
--      {0x00008368, 0x00000000},
--      {0x00008370, 0x00000000},
--      {0x00008374, 0x000000ff},
--      {0x00008378, 0x00000000},
--      {0x0000837c, 0x00000000},
--      {0x00008380, 0xffffffff},
--      {0x00008384, 0xffffffff},
--      {0x00008390, 0xffffffff},
--      {0x00008394, 0xffffffff},
--      {0x00008398, 0x00000000},
--      {0x0000839c, 0x00000000},
--      {0x000083a0, 0x00000000},
--      {0x000083a4, 0x0000fa14},
--      {0x000083a8, 0x000f0c00},
--      {0x000083ac, 0x33332210},
--      {0x000083b0, 0x33332210},
--      {0x000083b4, 0x33332210},
--      {0x000083b8, 0x33332210},
--      {0x000083bc, 0x00000000},
--      {0x000083c0, 0x00000000},
--      {0x000083c4, 0x00000000},
--      {0x000083c8, 0x00000000},
--      {0x000083cc, 0x00000200},
--      {0x000083d0, 0x000301ff},
--};
--
--static const u32 ar9485_1_1_baseband_core[][2] = {
--      /* Addr       allmodes */
--      {0x00009800, 0xafe68e30},
--      {0x00009804, 0xfd14e000},
--      {0x00009808, 0x9c0a8f6b},
--      {0x0000980c, 0x04800000},
--      {0x00009814, 0x9280c00a},
--      {0x00009818, 0x00000000},
--      {0x0000981c, 0x00020028},
--      {0x00009834, 0x5f3ca3de},
--      {0x00009838, 0x0108ecff},
--      {0x0000983c, 0x14750600},
--      {0x00009880, 0x201fff00},
--      {0x00009884, 0x00001042},
--      {0x000098a4, 0x00200400},
--      {0x000098b0, 0x52440bbe},
--      {0x000098d0, 0x004b6a8e},
--      {0x000098d4, 0x00000820},
--      {0x000098dc, 0x00000000},
--      {0x000098f0, 0x00000000},
--      {0x000098f4, 0x00000000},
--      {0x00009c04, 0x00000000},
--      {0x00009c08, 0x03200000},
--      {0x00009c0c, 0x00000000},
--      {0x00009c10, 0x00000000},
--      {0x00009c14, 0x00046384},
--      {0x00009c18, 0x05b6b440},
--      {0x00009c1c, 0x00b6b440},
--      {0x00009d00, 0xc080a333},
--      {0x00009d04, 0x40206c10},
--      {0x00009d08, 0x009c4060},
--      {0x00009d0c, 0x1883800a},
--      {0x00009d10, 0x01834061},
--      {0x00009d14, 0x00c00400},
--      {0x00009d18, 0x00000000},
--      {0x00009d1c, 0x00000000},
--      {0x00009e08, 0x0038233c},
--      {0x00009e24, 0x9927b515},
--      {0x00009e28, 0x12ef0200},
--      {0x00009e30, 0x06336f77},
--      {0x00009e34, 0x6af6532f},
--      {0x00009e38, 0x0cc80c00},
--      {0x00009e40, 0x0d261820},
--      {0x00009e4c, 0x00001004},
--      {0x00009e50, 0x00ff03f1},
--      {0x00009fc0, 0x80be4788},
--      {0x00009fc4, 0x0001efb5},
--      {0x00009fcc, 0x40000014},
--      {0x0000a20c, 0x00000000},
--      {0x0000a210, 0x00000000},
--      {0x0000a220, 0x00000000},
--      {0x0000a224, 0x00000000},
--      {0x0000a228, 0x10002310},
--      {0x0000a23c, 0x00000000},
--      {0x0000a244, 0x0c000000},
--      {0x0000a2a0, 0x00000001},
--      {0x0000a2c0, 0x00000001},
--      {0x0000a2c8, 0x00000000},
--      {0x0000a2cc, 0x18c43433},
--      {0x0000a2d4, 0x00000000},
--      {0x0000a2dc, 0x00000000},
--      {0x0000a2e0, 0x00000000},
--      {0x0000a2e4, 0x00000000},
--      {0x0000a2e8, 0x00000000},
--      {0x0000a2ec, 0x00000000},
--      {0x0000a2f0, 0x00000000},
--      {0x0000a2f4, 0x00000000},
--      {0x0000a2f8, 0x00000000},
--      {0x0000a344, 0x00000000},
--      {0x0000a34c, 0x00000000},
--      {0x0000a350, 0x0000a000},
--      {0x0000a364, 0x00000000},
--      {0x0000a370, 0x00000000},
--      {0x0000a390, 0x00000001},
--      {0x0000a394, 0x00000444},
--      {0x0000a398, 0x001f0e0f},
--      {0x0000a39c, 0x0075393f},
--      {0x0000a3a0, 0xb79f6427},
--      {0x0000a3a4, 0x000000ff},
--      {0x0000a3a8, 0x3b3b3b3b},
--      {0x0000a3ac, 0x2f2f2f2f},
--      {0x0000a3c0, 0x20202020},
--      {0x0000a3c4, 0x22222220},
--      {0x0000a3c8, 0x20200020},
--      {0x0000a3cc, 0x20202020},
--      {0x0000a3d0, 0x20202020},
--      {0x0000a3d4, 0x20202020},
--      {0x0000a3d8, 0x20202020},
--      {0x0000a3dc, 0x20202020},
--      {0x0000a3e0, 0x20202020},
--      {0x0000a3e4, 0x20202020},
--      {0x0000a3e8, 0x20202020},
--      {0x0000a3ec, 0x20202020},
--      {0x0000a3f0, 0x00000000},
--      {0x0000a3f4, 0x00000006},
--      {0x0000a3f8, 0x0cdbd380},
--      {0x0000a3fc, 0x000f0f01},
--      {0x0000a400, 0x8fa91f01},
--      {0x0000a404, 0x00000000},
--      {0x0000a408, 0x0e79e5c6},
--      {0x0000a40c, 0x00820820},
--      {0x0000a414, 0x1ce739cf},
--      {0x0000a418, 0x2d0019ce},
--      {0x0000a41c, 0x1ce739ce},
--      {0x0000a420, 0x000001ce},
--      {0x0000a424, 0x1ce739ce},
--      {0x0000a428, 0x000001ce},
--      {0x0000a42c, 0x1ce739ce},
--      {0x0000a430, 0x1ce739ce},
--      {0x0000a434, 0x00000000},
--      {0x0000a438, 0x00001801},
--      {0x0000a43c, 0x00000000},
--      {0x0000a440, 0x00000000},
--      {0x0000a444, 0x00000000},
--      {0x0000a448, 0x04000000},
--      {0x0000a44c, 0x00000001},
--      {0x0000a450, 0x00010000},
--      {0x0000a5c4, 0xbfad9d74},
--      {0x0000a5c8, 0x0048060a},
--      {0x0000a5cc, 0x00000637},
--      {0x0000a760, 0x03020100},
--      {0x0000a764, 0x09080504},
--      {0x0000a768, 0x0d0c0b0a},
--      {0x0000a76c, 0x13121110},
--      {0x0000a770, 0x31301514},
--      {0x0000a774, 0x35343332},
--      {0x0000a778, 0x00000036},
--      {0x0000a780, 0x00000838},
--      {0x0000a7c0, 0x00000000},
--      {0x0000a7c4, 0xfffffffc},
--      {0x0000a7c8, 0x00000000},
--      {0x0000a7cc, 0x00000000},
--      {0x0000a7d0, 0x00000000},
--      {0x0000a7d4, 0x00000004},
--      {0x0000a7dc, 0x00000000},
--};
--
--static const u32 ar9485Common_1_1[][2] = {
--      /*  Addr      allmodes */
--      {0x00007010, 0x00000022},
--      {0x00007020, 0x00000000},
--      {0x00007034, 0x00000002},
--      {0x00007038, 0x000004c2},
--};
--
--static const u32 ar9485_1_1_baseband_postamble[][5] = {
--      /* Addr       5G_HT20        5G_HT40       2G_HT40       2G_HT20 */
--      {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005},
--      {0x00009820, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e},
--      {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
--      {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},
--      {0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},
--      {0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c},
--      {0x00009c00, 0x00000044, 0x00000044, 0x00000044, 0x00000044},
--      {0x00009e00, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0},
--      {0x00009e04, 0x00182020, 0x00182020, 0x00182020, 0x00182020},
--      {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
--      {0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec80d2e, 0x7ec80d2e},
--      {0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e},
--      {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
--      {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},
--      {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021},
--      {0x00009e3c, 0xcf946220, 0xcf946220, 0xcf946222, 0xcf946222},
--      {0x00009e44, 0x02321e27, 0x02321e27, 0x02282324, 0x02282324},
--      {0x00009e48, 0x5030201a, 0x5030201a, 0x50302010, 0x50302010},
--      {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000},
--      {0x0000a204, 0x01303fc0, 0x01303fc4, 0x01303fc4, 0x01303fc0},
--      {0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},
--      {0x0000a230, 0x0000400a, 0x00004014, 0x00004016, 0x0000400b},
--      {0x0000a234, 0x10000fff, 0x10000fff, 0x10000fff, 0x10000fff},
--      {0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018},
--      {0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108},
--      {0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898},
--      {0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002},
--      {0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e},
--      {0x0000a260, 0x3a021501, 0x3a021501, 0x3a021501, 0x3a021501},
--      {0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e},
--      {0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b},
--      {0x0000a284, 0x00000000, 0x00000000, 0x000002a0, 0x000002a0},
--      {0x0000a288, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a28c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
--      {0x0000a2d0, 0x00071981, 0x00071981, 0x00071982, 0x00071982},
--      {0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a},
--      {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000be04, 0x00802020, 0x00802020, 0x00802020, 0x00802020},
--      {0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--};
--
--static const u32 ar9485Modes_high_ob_db_tx_gain_1_1[][5] = {
--      /* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20 */
--      {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
--      {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},
--      {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200},
--      {0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202},
--      {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400},
--      {0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402},
--      {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404},
--      {0x0000a520, 0x2f001f04, 0x2f001f04, 0x21000603, 0x21000603},
--      {0x0000a524, 0x35001fc4, 0x35001fc4, 0x25000605, 0x25000605},
--      {0x0000a528, 0x3c022f04, 0x3c022f04, 0x2a000a03, 0x2a000a03},
--      {0x0000a52c, 0x41023e85, 0x41023e85, 0x2c000a04, 0x2c000a04},
--      {0x0000a530, 0x48023ec6, 0x48023ec6, 0x34000e20, 0x34000e20},
--      {0x0000a534, 0x4d023f01, 0x4d023f01, 0x35000e21, 0x35000e21},
--      {0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62},
--      {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63},
--      {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65},
--      {0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66},
--      {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645},
--      {0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865},
--      {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86},
--      {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9},
--      {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb},
--      {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000b500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b504, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b508, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b50c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b510, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b514, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b518, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b51c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b520, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b524, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b528, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b52c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b530, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b534, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b538, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b53c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b540, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b544, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b548, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b54c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b550, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b554, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b558, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b55c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b560, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b564, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b568, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b56c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b570, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b574, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b578, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b57c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db},
--      {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
--};
--
--static const u32 ar9485_modes_lowest_ob_db_tx_gain_1_1[][5] = {
--      /* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20  */
--      {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
--      {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},
--      {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200},
--      {0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202},
--      {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400},
--      {0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402},
--      {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404},
--      {0x0000a520, 0x2f001f04, 0x2f001f04, 0x21000603, 0x21000603},
--      {0x0000a524, 0x35001fc4, 0x35001fc4, 0x25000605, 0x25000605},
--      {0x0000a528, 0x3c022f04, 0x3c022f04, 0x2a000a03, 0x2a000a03},
--      {0x0000a52c, 0x41023e85, 0x41023e85, 0x2c000a04, 0x2c000a04},
--      {0x0000a530, 0x48023ec6, 0x48023ec6, 0x34000e20, 0x34000e20},
--      {0x0000a534, 0x4d023f01, 0x4d023f01, 0x35000e21, 0x35000e21},
--      {0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62},
--      {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63},
--      {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65},
--      {0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66},
--      {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645},
--      {0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865},
--      {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86},
--      {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9},
--      {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb},
--      {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000b500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b504, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b508, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b50c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b510, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b514, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b518, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b51c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b520, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b524, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b528, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b52c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b530, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b534, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b538, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b53c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b540, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b544, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b548, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b54c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b550, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b554, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b558, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b55c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b560, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b564, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b568, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b56c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b570, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b574, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b578, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b57c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db},
--      {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
--};
--
--static const u32 ar9485_1_1_radio_postamble[][2] = {
--      /* Addr        allmodes */
--      {0x0001609c, 0x0b283f31},
--      {0x000160ac, 0x24611800},
--      {0x000160b0, 0x03284f3e},
--      {0x0001610c, 0x00170000},
--      {0x00016140, 0x50804008},
--};
--
--static const u32 ar9485_1_1_mac_postamble[][5] = {
--      /* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20 */
--      {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
--      {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
--      {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
--      {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
--      {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
--      {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
--      {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
--      {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
--};
-+/* AR9485 1.0 */
--static const u32 ar9485_1_1_radio_core[][2] = {
--      /* Addr        allmodes */
--      {0x00016000, 0x36db6db6},
--      {0x00016004, 0x6db6db40},
--      {0x00016008, 0x73800000},
--      {0x0001600c, 0x00000000},
--      {0x00016040, 0x7f80fff8},
--      {0x0001604c, 0x000f0278},
--      {0x00016050, 0x4db6db8c},
--      {0x00016054, 0x6db60000},
--      {0x00016080, 0x00080000},
--      {0x00016084, 0x0e48048c},
--      {0x00016088, 0x14214514},
--      {0x0001608c, 0x119f081e},
--      {0x00016090, 0x24926490},
--      {0x00016098, 0xd28b3330},
--      {0x000160a0, 0xc2108ffe},
--      {0x000160a4, 0x812fc370},
--      {0x000160a8, 0x423c8000},
--      {0x000160b4, 0x92480040},
--      {0x000160c0, 0x006db6db},
--      {0x000160c4, 0x0186db60},
--      {0x000160c8, 0x6db6db6c},
--      {0x000160cc, 0x6de6fbe0},
--      {0x000160d0, 0xf7dfcf3c},
--      {0x00016100, 0x04cb0001},
--      {0x00016104, 0xfff80015},
--      {0x00016108, 0x00080010},
--      {0x00016144, 0x01884080},
--      {0x00016148, 0x00008040},
--      {0x00016240, 0x08400000},
--      {0x00016244, 0x1bf90f00},
--      {0x00016248, 0x00000000},
--      {0x0001624c, 0x00000000},
--      {0x00016280, 0x01000015},
--      {0x00016284, 0x00d30000},
--      {0x00016288, 0x00318000},
--      {0x0001628c, 0x50000000},
--      {0x00016290, 0x4b96210f},
--      {0x00016380, 0x00000000},
--      {0x00016384, 0x00000000},
--      {0x00016388, 0x00800700},
--      {0x0001638c, 0x00800700},
--      {0x00016390, 0x00800700},
--      {0x00016394, 0x00000000},
--      {0x00016398, 0x00000000},
--      {0x0001639c, 0x00000000},
--      {0x000163a0, 0x00000001},
--      {0x000163a4, 0x00000001},
--      {0x000163a8, 0x00000000},
--      {0x000163ac, 0x00000000},
--      {0x000163b0, 0x00000000},
--      {0x000163b4, 0x00000000},
--      {0x000163b8, 0x00000000},
--      {0x000163bc, 0x00000000},
--      {0x000163c0, 0x000000a0},
--      {0x000163c4, 0x000c0000},
--      {0x000163c8, 0x14021402},
--      {0x000163cc, 0x00001402},
--      {0x000163d0, 0x00000000},
--      {0x000163d4, 0x00000000},
--      {0x00016c40, 0x13188278},
--      {0x00016c44, 0x12000000},
--};
-+#define ar9485_1_1_mac_postamble ar9300_2p2_mac_postamble
--static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_enable_L1[][2] = {
--      /* Addr        allmodes */
--      {0x00018c00, 0x18052e5e},
-+static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_disable_L1[][2] = {
-+      /* Addr      allmodes  */
-+      {0x00018c00, 0x18012e5e},
-       {0x00018c04, 0x000801d8},
-       {0x00018c08, 0x0000080c},
- };
-+static const u32 ar9485Common_wo_xlna_rx_gain_1_1[][2] = {
-+      /* Addr      allmodes  */
-+      {0x0000a000, 0x00060005},
-+      {0x0000a004, 0x00810080},
-+      {0x0000a008, 0x00830082},
-+      {0x0000a00c, 0x00850084},
-+      {0x0000a010, 0x01820181},
-+      {0x0000a014, 0x01840183},
-+      {0x0000a018, 0x01880185},
-+      {0x0000a01c, 0x018a0189},
-+      {0x0000a020, 0x02850284},
-+      {0x0000a024, 0x02890288},
-+      {0x0000a028, 0x028b028a},
-+      {0x0000a02c, 0x03850384},
-+      {0x0000a030, 0x03890388},
-+      {0x0000a034, 0x038b038a},
-+      {0x0000a038, 0x038d038c},
-+      {0x0000a03c, 0x03910390},
-+      {0x0000a040, 0x03930392},
-+      {0x0000a044, 0x03950394},
-+      {0x0000a048, 0x00000396},
-+      {0x0000a04c, 0x00000000},
-+      {0x0000a050, 0x00000000},
-+      {0x0000a054, 0x00000000},
-+      {0x0000a058, 0x00000000},
-+      {0x0000a05c, 0x00000000},
-+      {0x0000a060, 0x00000000},
-+      {0x0000a064, 0x00000000},
-+      {0x0000a068, 0x00000000},
-+      {0x0000a06c, 0x00000000},
-+      {0x0000a070, 0x00000000},
-+      {0x0000a074, 0x00000000},
-+      {0x0000a078, 0x00000000},
-+      {0x0000a07c, 0x00000000},
-+      {0x0000a080, 0x28282828},
-+      {0x0000a084, 0x28282828},
-+      {0x0000a088, 0x28282828},
-+      {0x0000a08c, 0x28282828},
-+      {0x0000a090, 0x28282828},
-+      {0x0000a094, 0x24242428},
-+      {0x0000a098, 0x171e1e1e},
-+      {0x0000a09c, 0x02020b0b},
-+      {0x0000a0a0, 0x02020202},
-+      {0x0000a0a4, 0x00000000},
-+      {0x0000a0a8, 0x00000000},
-+      {0x0000a0ac, 0x00000000},
-+      {0x0000a0b0, 0x00000000},
-+      {0x0000a0b4, 0x00000000},
-+      {0x0000a0b8, 0x00000000},
-+      {0x0000a0bc, 0x00000000},
-+      {0x0000a0c0, 0x22072208},
-+      {0x0000a0c4, 0x22052206},
-+      {0x0000a0c8, 0x22032204},
-+      {0x0000a0cc, 0x22012202},
-+      {0x0000a0d0, 0x221f2200},
-+      {0x0000a0d4, 0x221d221e},
-+      {0x0000a0d8, 0x33023303},
-+      {0x0000a0dc, 0x33003301},
-+      {0x0000a0e0, 0x331e331f},
-+      {0x0000a0e4, 0x4402331d},
-+      {0x0000a0e8, 0x44004401},
-+      {0x0000a0ec, 0x441e441f},
-+      {0x0000a0f0, 0x55025503},
-+      {0x0000a0f4, 0x55005501},
-+      {0x0000a0f8, 0x551e551f},
-+      {0x0000a0fc, 0x6602551d},
-+      {0x0000a100, 0x66006601},
-+      {0x0000a104, 0x661e661f},
-+      {0x0000a108, 0x7703661d},
-+      {0x0000a10c, 0x77017702},
-+      {0x0000a110, 0x00007700},
-+      {0x0000a114, 0x00000000},
-+      {0x0000a118, 0x00000000},
-+      {0x0000a11c, 0x00000000},
-+      {0x0000a120, 0x00000000},
-+      {0x0000a124, 0x00000000},
-+      {0x0000a128, 0x00000000},
-+      {0x0000a12c, 0x00000000},
-+      {0x0000a130, 0x00000000},
-+      {0x0000a134, 0x00000000},
-+      {0x0000a138, 0x00000000},
-+      {0x0000a13c, 0x00000000},
-+      {0x0000a140, 0x001f0000},
-+      {0x0000a144, 0x111f1100},
-+      {0x0000a148, 0x111d111e},
-+      {0x0000a14c, 0x111b111c},
-+      {0x0000a150, 0x22032204},
-+      {0x0000a154, 0x22012202},
-+      {0x0000a158, 0x221f2200},
-+      {0x0000a15c, 0x221d221e},
-+      {0x0000a160, 0x33013302},
-+      {0x0000a164, 0x331f3300},
-+      {0x0000a168, 0x4402331e},
-+      {0x0000a16c, 0x44004401},
-+      {0x0000a170, 0x441e441f},
-+      {0x0000a174, 0x55015502},
-+      {0x0000a178, 0x551f5500},
-+      {0x0000a17c, 0x6602551e},
-+      {0x0000a180, 0x66006601},
-+      {0x0000a184, 0x661e661f},
-+      {0x0000a188, 0x7703661d},
-+      {0x0000a18c, 0x77017702},
-+      {0x0000a190, 0x00007700},
-+      {0x0000a194, 0x00000000},
-+      {0x0000a198, 0x00000000},
-+      {0x0000a19c, 0x00000000},
-+      {0x0000a1a0, 0x00000000},
-+      {0x0000a1a4, 0x00000000},
-+      {0x0000a1a8, 0x00000000},
-+      {0x0000a1ac, 0x00000000},
-+      {0x0000a1b0, 0x00000000},
-+      {0x0000a1b4, 0x00000000},
-+      {0x0000a1b8, 0x00000000},
-+      {0x0000a1bc, 0x00000000},
-+      {0x0000a1c0, 0x00000000},
-+      {0x0000a1c4, 0x00000000},
-+      {0x0000a1c8, 0x00000000},
-+      {0x0000a1cc, 0x00000000},
-+      {0x0000a1d0, 0x00000000},
-+      {0x0000a1d4, 0x00000000},
-+      {0x0000a1d8, 0x00000000},
-+      {0x0000a1dc, 0x00000000},
-+      {0x0000a1e0, 0x00000000},
-+      {0x0000a1e4, 0x00000000},
-+      {0x0000a1e8, 0x00000000},
-+      {0x0000a1ec, 0x00000000},
-+      {0x0000a1f0, 0x00000396},
-+      {0x0000a1f4, 0x00000396},
-+      {0x0000a1f8, 0x00000396},
-+      {0x0000a1fc, 0x00000296},
-+};
-+
- static const u32 ar9485Modes_high_power_tx_gain_1_1[][5] = {
--      /* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20 */
-+      /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */
-       {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
-       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},
-       {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
-@@ -681,8 +234,14 @@ static const u32 ar9485Modes_high_power_
-       {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
- };
-+#define ar9485Modes_high_ob_db_tx_gain_1_1 ar9485Modes_high_power_tx_gain_1_1
-+
-+#define ar9485Modes_low_ob_db_tx_gain_1_1 ar9485Modes_high_ob_db_tx_gain_1_1
-+
-+#define ar9485_modes_lowest_ob_db_tx_gain_1_1 ar9485Modes_low_ob_db_tx_gain_1_1
-+
- static const u32 ar9485_1_1[][2] = {
--      /* Addr        allmodes */
-+      /* Addr      allmodes  */
-       {0x0000a580, 0x00000000},
-       {0x0000a584, 0x00000000},
-       {0x0000a588, 0x00000000},
-@@ -701,194 +260,210 @@ static const u32 ar9485_1_1[][2] = {
-       {0x0000a5bc, 0x00000000},
- };
--static const u32 ar9485_modes_green_ob_db_tx_gain_1_1[][5] = {
--      /* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20 */
--      {0x000098bc, 0x00000003, 0x00000003, 0x00000003, 0x00000003},
--      {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},
--      {0x0000a458, 0x80000000, 0x80000000, 0x80000000, 0x80000000},
--      {0x0000a500, 0x00022200, 0x00022200, 0x00000006, 0x00000006},
--      {0x0000a504, 0x05062002, 0x05062002, 0x03000201, 0x03000201},
--      {0x0000a508, 0x0c002e00, 0x0c002e00, 0x06000203, 0x06000203},
--      {0x0000a50c, 0x11062202, 0x11062202, 0x0a000401, 0x0a000401},
--      {0x0000a510, 0x17022e00, 0x17022e00, 0x0e000403, 0x0e000403},
--      {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x12000405, 0x12000405},
--      {0x0000a518, 0x25020ec0, 0x25020ec0, 0x15000604, 0x15000604},
--      {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x18000605, 0x18000605},
--      {0x0000a520, 0x2f001f04, 0x2f001f04, 0x1c000a04, 0x1c000a04},
--      {0x0000a524, 0x35001fc4, 0x35001fc4, 0x21000a06, 0x21000a06},
--      {0x0000a528, 0x3c022f04, 0x3c022f04, 0x29000a24, 0x29000a24},
--      {0x0000a52c, 0x41023e85, 0x41023e85, 0x2f000e21, 0x2f000e21},
--      {0x0000a530, 0x48023ec6, 0x48023ec6, 0x31000e20, 0x31000e20},
--      {0x0000a534, 0x4d023f01, 0x4d023f01, 0x33000e20, 0x33000e20},
--      {0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62},
--      {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63},
--      {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65},
--      {0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66},
--      {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645},
--      {0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865},
--      {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86},
--      {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9},
--      {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb},
--      {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000b500, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b504, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b508, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b50c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b510, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b514, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b518, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b51c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b520, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b524, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b528, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a},
--      {0x0000b52c, 0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a},
--      {0x0000b530, 0x0000003a, 0x0000003a, 0x0000003a, 0x0000003a},
--      {0x0000b534, 0x0000004a, 0x0000004a, 0x0000004a, 0x0000004a},
--      {0x0000b538, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b53c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b540, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b544, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b548, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b54c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b550, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b554, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b558, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b55c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b560, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b564, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b568, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b56c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b570, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b574, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b578, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x0000b57c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b},
--      {0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db},
--      {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
--};
--
--static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = {
--      /* Addr        allmodes */
--      {0x00018c00, 0x18013e5e},
--      {0x00018c04, 0x000801d8},
--      {0x00018c08, 0x0000080c},
--};
--
--static const u32 ar9485_1_1_soc_preamble[][2] = {
--      /* Addr        allmodes */
--      {0x00004014, 0xba280400},
--      {0x00004090, 0x00aa10aa},
--      {0x000040a4, 0x00a0c9c9},
--      {0x00007010, 0x00000022},
--      {0x00007020, 0x00000000},
--      {0x00007034, 0x00000002},
--      {0x00007038, 0x000004c2},
--      {0x00007048, 0x00000002},
--};
--
--static const u32 ar9485_1_1_baseband_core_txfir_coeff_japan_2484[][2] = {
--      /* Addr        allmodes */
--      {0x0000a398, 0x00000000},
--      {0x0000a39c, 0x6f7f0301},
--      {0x0000a3a0, 0xca9228ee},
--};
--
--static const u32 ar9485Modes_low_ob_db_tx_gain_1_1[][5] = {
--      /* Addr        5G_HT20       5G_HT40       2G_HT40       2G_HT20  */
--      {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
--      {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},
--      {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
--      {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
--      {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
--      {0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200},
--      {0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202},
--      {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400},
--      {0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402},
--      {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404},
--      {0x0000a520, 0x2f001f04, 0x2f001f04, 0x21000603, 0x21000603},
--      {0x0000a524, 0x35001fc4, 0x35001fc4, 0x25000605, 0x25000605},
--      {0x0000a528, 0x3c022f04, 0x3c022f04, 0x2a000a03, 0x2a000a03},
--      {0x0000a52c, 0x41023e85, 0x41023e85, 0x2c000a04, 0x2c000a04},
--      {0x0000a530, 0x48023ec6, 0x48023ec6, 0x34000e20, 0x34000e20},
--      {0x0000a534, 0x4d023f01, 0x4d023f01, 0x35000e21, 0x35000e21},
--      {0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62},
--      {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63},
--      {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65},
--      {0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66},
--      {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645},
--      {0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865},
--      {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86},
--      {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9},
--      {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb},
--      {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
--      {0x0000b500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b504, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b508, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b50c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b510, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b514, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b518, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b51c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b520, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b524, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b528, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b52c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b530, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b534, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b538, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b53c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b540, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b544, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
--      {0x0000b548, 0x00000000, 0x00000000, 0x00000000, 0x000