Changeset 29275


Ignore:
Timestamp:
2011-11-20T13:04:29+01:00 (6 years ago)
Author:
nbd
Message:

mac80211: update to 2011-11-15 from trunk

Location:
branches/backfire/package/mac80211
Files:
8 added
13 deleted
41 edited
2 moved

Legend:

Unmodified
Added
Removed
  • branches/backfire/package/mac80211/Makefile

    r28485 r29275  
    1111PKG_NAME:=mac80211 
    1212 
    13 PKG_VERSION:=2011-09-14 
     13PKG_VERSION:=2011-11-15 
    1414PKG_RELEASE:=1 
    1515PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources 
    16 PKG_MD5SUM:=a5627e6079e8d0f0baf7045141503a3d 
     16PKG_MD5SUM:=0bb667c7fecbc244840d806df0604661 
    1717 
    1818PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 
     
    413413  TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc) 
    414414  URL:=http://linuxwireless.org/en/users/Drivers/ath9k 
    415   DEPENDS+= @PCI_SUPPORT||TARGET_ar71xx +kmod-ath +@DRIVER_11N_SUPPORT 
     415  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx +kmod-ath +@DRIVER_11N_SUPPORT 
    416416  FILES:= \ 
    417417        $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \ 
     
    453453  $(call KernelPackage/mac80211/Default) 
    454454  TITLE:=Driver for Atheros AR9170 USB sticks 
    455   DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +@DRIVER_11N_SUPPORT 
     455  DEPENDS:=@USB_SUPPORT +kmod-mac80211 +kmod-ath +kmod-usb-core +kmod-input-core +@DRIVER_11N_SUPPORT 
    456456  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/carl9170/carl9170.ko 
    457457  AUTOLOAD:=$(call AutoLoad,60,carl9170) 
     
    490490define KernelPackage/libertas-usb 
    491491  $(call KernelPackage/mac80211/Default) 
    492   DEPENDS+= @USB_SUPPORT +kmod-mac80211 +kmod-usb-core +kmod-lib80211 
     492  DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT 
    493493  TITLE:=Marvell 88W8015 Wireless Driver 
    494494  FILES:= \ 
     
    500500define KernelPackage/libertas-sd 
    501501  $(call KernelPackage/mac80211/Default) 
    502   DEPENDS+= +kmod-mac80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT @!LINUX_2_6_30 
     502  DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT 
    503503  TITLE:=Marvell 88W8686 Wireless Driver 
    504504  FILES:= \ 
     
    519519  $(call KernelPackage/mac80211/Default) 
    520520  TITLE:=libipw for ipw2100 and ipw2200 
    521   DEPENDS:=@PCI_SUPPORT +kmod-crypto-core +kmod-crypto-arc4 +kmod-crypto-aes +kmod-crypto-michael-mic +kmod-lib80211 +kmod-cfg80211 
     521  DEPENDS:=@PCI_SUPPORT +kmod-crypto-core +kmod-crypto-arc4 +kmod-crypto-aes +kmod-crypto-michael-mic +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT 
    522522  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ipw2x00/libipw.ko 
    523523  AUTOLOAD:=$(call AutoLoad,49,libipw) 
     
    592592  $(call KernelPackage/mac80211/Default) 
    593593  TITLE:=Intersil Prism 2.5 PCI support 
    594   DEPENDS:=@PCI_SUPPORT +kmod-net-hermes +kmod-cfg80211 
     594  DEPENDS:=@PCI_SUPPORT +kmod-net-hermes 
    595595  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_pci.ko 
    596596  AUTOLOAD:=$(call AutoLoad,55,orinoco_pci) 
     
    604604  $(call KernelPackage/mac80211/Default) 
    605605  TITLE:=PLX9052 based PCI adaptor 
    606   DEPENDS:=@PCI_SUPPORT +kmod-net-hermes +kmod-cfg80211 
     606  DEPENDS:=@PCI_SUPPORT +kmod-net-hermes 
    607607  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_plx.ko 
    608608  AUTOLOAD:=$(call AutoLoad,55,orinoco_plx) 
     
    616616  $(call KernelPackage/mac80211/Default) 
    617617  TITLE:=Hermes based PCMCIA adaptors 
    618   DEPENDS:=@PCMCIA_SUPPORT +kmod-net-hermes +kmod-cfg80211 @BROKEN 
     618  DEPENDS:=@PCMCIA_SUPPORT +kmod-net-hermes @BROKEN 
    619619  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/orinoco/orinoco_cs.ko 
    620620  AUTOLOAD:=$(call AutoLoad,55,orinoco_cs) 
     
    629629  DEPENDS:= +kmod-mac80211 @PCI_SUPPORT 
    630630  TITLE:=Intel AGN Wireless support 
    631   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/iwlagn.$(LINUX_KMOD_SUFFIX) 
     631  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlwifi/iwlwifi.ko 
    632632  AUTOLOAD:=$(call AutoLoad,60,iwlagn) 
    633633  MENU:=1 
     
    705705  DEPENDS:= +kmod-mac80211 @PCI_SUPPORT 
    706706  TITLE:=Intel legacy Wireless support 
    707   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl-legacy.$(LINUX_KMOD_SUFFIX) 
     707  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl-legacy.ko 
    708708  AUTOLOAD:=$(call AutoLoad,60,iwl-legacy) 
    709709endef 
     
    717717  DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy 
    718718  TITLE:=Intel iwl3945 Wireless support 
    719   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl3945.$(LINUX_KMOD_SUFFIX) 
     719  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl3945.ko 
    720720  AUTOLOAD:=$(call AutoLoad,61,iwl3945) 
    721721endef 
     
    729729  DEPENDS:= +kmod-mac80211 +kmod-iwl-legacy 
    730730  TITLE:=Intel iwl4965 Wireless support 
    731   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl4965.$(LINUX_KMOD_SUFFIX) 
     731  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/iwlegacy/iwl4965.ko 
    732732  AUTOLOAD:=$(call AutoLoad,61,iwl4965) 
    733733endef 
     
    10601060        EXTRA_CFLAGS="$(BUILDFLAGS)" \ 
    10611061        $(foreach opt,$(CONFOPTS),CONFIG_$(opt)=m) \ 
     1062        CONFIG_CFG80211=$(if $(CONFIG_PACKAGE_kmod-cfg80211),m) \ 
    10621063        CONFIG_MAC80211=$(if $(CONFIG_PACKAGE_kmod-mac80211),m) \ 
    10631064        CONFIG_MAC80211_RC_MINSTREL=y \ 
     
    11201121        CONFIG_RT2800PCI=$(if $(CONFIG_PACKAGE_kmod-rt2800-pci),m) \ 
    11211122        CONFIG_RT2800USB=$(if $(CONFIG_PACKAGE_kmod-rt2800-usb),m) \ 
     1123        CONFIG_RT2800USB_RT53XX=$(if $(CONFIG_PACKAGE_kmod-rt2800-usb),y) \ 
    11221124        CONFIG_RTL8180=$(if $(CONFIG_PACKAGE_kmod-rtl8180),m) \ 
    11231125        CONFIG_RTL8187=$(if $(CONFIG_PACKAGE_kmod-rtl8187),m) \ 
     
    11401142        CONFIG_LIB80211_CRYPT_CCMP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \ 
    11411143        CONFIG_LIB80211_CRYPT_TKIP=$(if $(CONFIG_PACKAGE_kmod-lib80211),m) \ 
    1142         CONFIG_IWLAGN=$(if $(CONFIG_PACKAGE_kmod-iwlagn),m) \ 
     1144        CONFIG_IWLWIFI=$(if $(CONFIG_PACKAGE_kmod-iwlagn),m) \ 
    11431145        CONFIG_IWLWIFI_LEGACY=$(if $(CONFIG_PACKAGE_kmod-iwl-legacy),m) \ 
    11441146        CONFIG_COMPAT_IWL4965=$(if $(CONFIG_PACKAGE_kmod-iwl4965),m) \ 
     
    11751177        CONFIG_ATL1E= \ 
    11761178        CONFIG_ATL1C= \ 
     1179        CONFIG_BRCMFMAC= \ 
     1180        CONFIG_BRCMUMAC= \ 
     1181        CONFIG_BRCMSMAC= \ 
    11771182        KLIB_BUILD="$(LINUX_DIR)" \ 
    11781183        MODPROBE=: \ 
     
    11981203endef 
    11991204 
    1200 ifneq ($(CONFIG_PACKAGE_kmod-cfg80211),) 
     1205ifneq ($(CONFIG_PACKAGE_kmod-cfg80211)$(CONFIG_PACKAGE_kmod-lib80211),) 
    12011206 define Build/Compile/kmod 
    12021207        rm -rf $(PKG_BUILD_DIR)/modules 
  • branches/backfire/package/mac80211/patches/001-disable_b44.patch

    r28138 r29275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -340,8 +340,8 @@ CONFIG_B43_BCMA_PIO=y 
     3@@ -339,8 +339,8 @@ CONFIG_B43_BCMA_PIO=y 
    44  
    55 CONFIG_P54_PCI=m 
  • branches/backfire/package/mac80211/patches/002-disable_rfkill.patch

    r28138 r29275  
    1010 ifeq ($(CONFIG_MAC80211),y) 
    1111 $(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") 
    12 @@ -642,10 +642,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27 
     12@@ -632,10 +632,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27 
    1313 # We need the backported rfkill module on kernel < 2.6.31. 
    1414 # In more recent kernel versions use the in kernel rfkill module. 
  • branches/backfire/package/mac80211/patches/005-disable_ssb_build.patch

    r28138 r29275  
    1919 include $(KLIB_BUILD)/.config 
    2020 endif 
    21 @@ -316,7 +315,8 @@ CONFIG_IPW2200_QOS=y 
     21@@ -315,7 +314,8 @@ CONFIG_IPW2200_QOS=y 
    2222 # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface 
    2323 endif #CONFIG_WIRELESS_EXT 
     
    2929 CONFIG_SSB_SPROM=y 
    3030  
    31 @@ -329,7 +329,7 @@ endif #CONFIG_PCMCIA 
     31@@ -328,7 +328,7 @@ endif #CONFIG_PCMCIA 
    3232 # CONFIG_SSB_DEBUG=y 
    3333 CONFIG_SSB_DRIVER_PCICORE=y 
     
    3838 CONFIG_BCMA=m 
    3939 CONFIG_BCMA_BLOCKIO=y 
    40 @@ -538,7 +538,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
     40@@ -535,7 +535,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
    4141  
    4242 ifdef CONFIG_MMC 
  • branches/backfire/package/mac80211/patches/006-disable_bcma_build.patch

    r28138 r29275  
    1111--- a/config.mk 
    1212+++ b/config.mk 
    13 @@ -331,12 +331,12 @@ CONFIG_SSB_DRIVER_PCICORE=y 
     13@@ -330,12 +330,12 @@ CONFIG_SSB_DRIVER_PCICORE=y 
    1414 CONFIG_B43_SSB=y 
    1515 endif #__CONFIG_SSB 
  • branches/backfire/package/mac80211/patches/007-remove_misc_drivers.patch

    r28138 r29275  
    1010  
    1111 # mac80211 test driver 
    12 @@ -368,13 +368,13 @@ endif #CONFIG_CRC_ITU_T 
     12@@ -367,13 +367,13 @@ endif #CONFIG_CRC_ITU_T 
    1313 CONFIG_MWL8K=m 
    1414  
     
    2929  
    3030 ifdef CONFIG_WIRELESS_EXT 
    31 @@ -435,21 +435,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
     31@@ -432,21 +432,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
    3232 # Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER 
    3333 # it also requires new RNDIS_HOST and CDC_ETHER modules which we add 
  • branches/backfire/package/mac80211/patches/010-no_pcmcia.patch

    r28138 r29275  
    1010 include $(KLIB_BUILD)/.config 
    1111 endif 
    12 @@ -248,7 +248,7 @@ CONFIG_B43=m 
     12@@ -247,7 +247,7 @@ CONFIG_B43=m 
    1313 CONFIG_B43_HWRNG=y 
    1414 CONFIG_B43_PCI_AUTOSELECT=y 
  • branches/backfire/package/mac80211/patches/011-no_sdio.patch

    r28138 r29275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -521,7 +521,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
     3@@ -518,7 +518,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
    44  
    55 ifdef CONFIG_MMC 
  • branches/backfire/package/mac80211/patches/013-disable_b43_nphy.patch

    r28138 r29275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -254,7 +254,7 @@ ifdef CONFIG_MAC80211_LEDS 
     3@@ -253,8 +253,8 @@ ifdef CONFIG_MAC80211_LEDS 
    44 CONFIG_B43_LEDS=y 
    55 endif #CONFIG_MAC80211_LEDS 
    66 CONFIG_B43_PHY_LP=y 
    77-CONFIG_B43_PHY_N=y 
     8-CONFIG_B43_PHY_HT=y 
    89+# CONFIG_B43_PHY_N=y 
    9  # CONFIG_B43_PHY_HT=y 
     10+# CONFIG_B43_PHY_HT=y 
    1011 # CONFIG_B43_PHY_LCN=y 
    1112 # CONFIG_B43_FORCE_PIO=y 
     13 # CONFIG_B43_DEBUG=y 
  • branches/backfire/package/mac80211/patches/015-remove-rt2x00-options.patch

    r28138 r29275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -330,7 +330,7 @@ CONFIG_RTL8180=m 
     3@@ -329,7 +329,7 @@ CONFIG_RTL8180=m 
    44  
    55 CONFIG_ADM8211=m 
     
    1010 CONFIG_RT2500PCI=m 
    1111 ifdef CONFIG_CRC_CCITT 
    12 @@ -470,7 +470,7 @@ CONFIG_RT2800USB_RT35XX=y 
     12@@ -467,7 +467,7 @@ CONFIG_RT2800USB_RT35XX=y 
    1313 # CONFIG_RT2800USB_RT53XX=y 
    1414 CONFIG_RT2800USB_UNKNOWN=y 
  • branches/backfire/package/mac80211/patches/050-compat_firmware.patch

    r27871 r29275  
    6060 { 
    6161        /* pm-qos for kernels <= 2.6.24, this is a no-op on newer kernels */ 
    62 @@ -45,15 +56,15 @@ static int __init compat_init(void) 
     62@@ -46,7 +57,8 @@ static int __init compat_init(void) 
    6363               COMPAT_BASE_TREE " " COMPAT_BASE_TREE_VERSION 
    6464               "\n"); 
     
    7070 module_init(compat_init); 
    7171  
    72  static void __exit compat_exit(void) 
    73  { 
     72@@ -55,7 +67,8 @@ static void __exit compat_exit(void) 
    7473        compat_pm_qos_power_deinit(); 
    75 - 
     74        compat_system_workqueue_destroy(); 
     75  
    7676-        return; 
    7777+       firmware_class_exit(); 
     78+       return; 
    7879 } 
    7980 module_exit(compat_exit); 
  • branches/backfire/package/mac80211/patches/100-disable_pcmcia_compat.patch

    r24962 r29275  
    5252 #include <pcmcia/cistpl.h> 
    5353 #include <pcmcia/ds.h> 
    54 @@ -65,9 +65,9 @@ static inline struct sk_buff *netdev_all 
     54@@ -68,9 +68,9 @@ static inline struct sk_buff *netdev_all 
    5555        return skb; 
    5656 } 
  • branches/backfire/package/mac80211/patches/110-disable_usb_compat.patch

    r28138 r29275  
    3434--- a/config.mk 
    3535+++ b/config.mk 
    36 @@ -456,7 +456,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
     36@@ -453,7 +453,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
    3737 # This activates a threading fix for usb urb. 
    3838 # this is mainline commit: b3e670443b7fb8a2d29831b62b44a039c283e351 
  • branches/backfire/package/mac80211/patches/120-pr_fmt_warnings.patch

    r28388 r29275  
    148148 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 
    149149  
    150  #include <linux/moduleparam.h> 
     150 #include <linux/module.h> 
    151151--- a/drivers/net/wireless/libertas/mesh.c 
    152152+++ b/drivers/net/wireless/libertas/mesh.c 
  • branches/backfire/package/mac80211/patches/140-mesh_pathtbl_backport.patch

    r28388 r29275  
    11--- a/net/mac80211/mesh_pathtbl.c 
    22+++ b/net/mac80211/mesh_pathtbl.c 
    3 @@ -844,7 +844,6 @@ static void table_flush_by_iface(struct  
     3@@ -841,7 +841,6 @@ static void table_flush_by_iface(struct  
    44        struct hlist_node *p; 
    55        int i; 
  • branches/backfire/package/mac80211/patches/300-pending_work.patch

    r28388 r29275  
    1 --- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c 
    2 +++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c 
    3 @@ -170,33 +170,104 @@ static bool ar9002_hw_get_isr(struct ath 
    4         return true; 
    5  } 
    6   
    7 -static void ar9002_hw_fill_txdesc(struct ath_hw *ah, void *ds, u32 seglen, 
    8 -                                 bool is_firstseg, bool is_lastseg, 
    9 -                                 const void *ds0, dma_addr_t buf_addr, 
    10 -                                 unsigned int qcu) 
    11 +static void 
    12 +ar9002_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) 
     1--- a/drivers/net/wireless/ath/ath9k/main.c 
     2+++ b/drivers/net/wireless/ath/ath9k/main.c 
     3@@ -118,7 +118,7 @@ void ath9k_ps_restore(struct ath_softc * 
     4        if (--sc->ps_usecount != 0) 
     5                goto unlock; 
     6  
     7-       if (sc->ps_idle) 
     8+       if (sc->ps_idle && (sc->ps_flags & PS_WAIT_FOR_TX_ACK)) 
     9                mode = ATH9K_PM_FULL_SLEEP; 
     10        else if (sc->ps_enabled && 
     11                 !(sc->ps_flags & (PS_WAIT_FOR_BEACON | 
     12@@ -332,7 +332,8 @@ static int ath_reset_internal(struct ath 
     13                hchan = ah->curchan; 
     14        } 
     15  
     16-       if (fastcc && !ath9k_hw_check_alive(ah)) 
     17+       if (fastcc && (ah->chip_fullsleep || 
     18+           !ath9k_hw_check_alive(ah))) 
     19                fastcc = false; 
     20  
     21        if (!ath_prepare_reset(sc, retry_tx, flush)) 
     22@@ -882,82 +883,6 @@ chip_reset: 
     23 #undef SCHED_INTR 
     24 } 
     25  
     26-static void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw) 
     27-{ 
     28-       struct ath_hw *ah = sc->sc_ah; 
     29-       struct ath_common *common = ath9k_hw_common(ah); 
     30-       struct ieee80211_channel *channel = hw->conf.channel; 
     31-       int r; 
     32- 
     33-       ath9k_ps_wakeup(sc); 
     34-       spin_lock_bh(&sc->sc_pcu_lock); 
     35-       atomic_set(&ah->intr_ref_cnt, -1); 
     36- 
     37-       ath9k_hw_configpcipowersave(ah, false); 
     38- 
     39-       if (!ah->curchan) 
     40-               ah->curchan = ath9k_cmn_get_curchannel(sc->hw, ah); 
     41- 
     42-       r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); 
     43-       if (r) { 
     44-               ath_err(common, 
     45-                       "Unable to reset channel (%u MHz), reset status %d\n", 
     46-                       channel->center_freq, r); 
     47-       } 
     48- 
     49-       ath_complete_reset(sc, true); 
     50- 
     51-       /* Enable LED */ 
     52-       ath9k_hw_cfg_output(ah, ah->led_pin, 
     53-                           AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
     54-       ath9k_hw_set_gpio(ah, ah->led_pin, 0); 
     55- 
     56-       spin_unlock_bh(&sc->sc_pcu_lock); 
     57- 
     58-       ath9k_ps_restore(sc); 
     59-} 
     60- 
     61-void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw) 
     62-{ 
     63-       struct ath_hw *ah = sc->sc_ah; 
     64-       struct ieee80211_channel *channel = hw->conf.channel; 
     65-       int r; 
     66- 
     67-       ath9k_ps_wakeup(sc); 
     68- 
     69-       ath_cancel_work(sc); 
     70- 
     71-       spin_lock_bh(&sc->sc_pcu_lock); 
     72- 
     73-       /* 
     74-        * Keep the LED on when the radio is disabled 
     75-        * during idle unassociated state. 
     76-        */ 
     77-       if (!sc->ps_idle) { 
     78-               ath9k_hw_set_gpio(ah, ah->led_pin, 1); 
     79-               ath9k_hw_cfg_gpio_input(ah, ah->led_pin); 
     80-       } 
     81- 
     82-       ath_prepare_reset(sc, false, true); 
     83- 
     84-       if (!ah->curchan) 
     85-               ah->curchan = ath9k_cmn_get_curchannel(hw, ah); 
     86- 
     87-       r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); 
     88-       if (r) { 
     89-               ath_err(ath9k_hw_common(sc->sc_ah), 
     90-                       "Unable to reset channel (%u MHz), reset status %d\n", 
     91-                       channel->center_freq, r); 
     92-       } 
     93- 
     94-       ath9k_hw_phy_disable(ah); 
     95- 
     96-       ath9k_hw_configpcipowersave(ah, true); 
     97- 
     98-       spin_unlock_bh(&sc->sc_pcu_lock); 
     99-       ath9k_ps_restore(sc); 
     100-} 
     101- 
     102 static int ath_reset(struct ath_softc *sc, bool retry_tx) 
    13103 { 
    14         struct ar5416_desc *ads = AR5416DESC(ds); 
    15 +       u32 ctl1, ctl6; 
    16   
    17 -       ads->ds_data = buf_addr; 
    18 - 
    19 -       if (is_firstseg) { 
    20 -               ads->ds_ctl1 |= seglen | (is_lastseg ? 0 : AR_TxMore); 
    21 -       } else if (is_lastseg) { 
    22 -               ads->ds_ctl0 = 0; 
    23 -               ads->ds_ctl1 = seglen; 
    24 -               ads->ds_ctl2 = AR5416DESC_CONST(ds0)->ds_ctl2; 
    25 -               ads->ds_ctl3 = AR5416DESC_CONST(ds0)->ds_ctl3; 
    26 -       } else { 
    27 -               ads->ds_ctl0 = 0; 
    28 -               ads->ds_ctl1 = seglen | AR_TxMore; 
    29 -               ads->ds_ctl2 = 0; 
    30 -               ads->ds_ctl3 = 0; 
    31 -       } 
    32         ads->ds_txstatus0 = ads->ds_txstatus1 = 0; 
    33         ads->ds_txstatus2 = ads->ds_txstatus3 = 0; 
    34         ads->ds_txstatus4 = ads->ds_txstatus5 = 0; 
    35         ads->ds_txstatus6 = ads->ds_txstatus7 = 0; 
    36         ads->ds_txstatus8 = ads->ds_txstatus9 = 0; 
    37 + 
    38 +       ACCESS_ONCE(ads->ds_link) = i->link; 
    39 +       ACCESS_ONCE(ads->ds_data) = i->buf_addr[0]; 
    40 + 
    41 +       ctl1 = i->buf_len[0] | (i->is_last ? 0 : AR_TxMore); 
    42 +       ctl6 = SM(i->keytype, AR_EncrType); 
    43 + 
    44 +       if (AR_SREV_9285(ah)) { 
    45 +               ads->ds_ctl8 = 0; 
    46 +               ads->ds_ctl9 = 0; 
    47 +               ads->ds_ctl10 = 0; 
    48 +               ads->ds_ctl11 = 0; 
     104        int r; 
     105@@ -1093,6 +1018,9 @@ static int ath9k_start(struct ieee80211_ 
     106         * and then setup of the interrupt mask. 
     107         */ 
     108        spin_lock_bh(&sc->sc_pcu_lock); 
     109+ 
     110+       atomic_set(&ah->intr_ref_cnt, -1); 
     111+ 
     112        r = ath9k_hw_reset(ah, init_channel, ah->caldata, false); 
     113        if (r) { 
     114                ath_err(common, 
     115@@ -1131,6 +1059,18 @@ static int ath9k_start(struct ieee80211_ 
     116                goto mutex_unlock; 
     117        } 
     118  
     119+       if (ah->led_pin >= 0) { 
     120+               ath9k_hw_cfg_output(ah, ah->led_pin, 
     121+                                   AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
     122+               ath9k_hw_set_gpio(ah, ah->led_pin, 0); 
    49123+       } 
    50124+ 
    51 +       if ((i->is_first || i->is_last) && 
    52 +           i->aggr != AGGR_BUF_MIDDLE && i->aggr != AGGR_BUF_LAST) { 
    53 +               ACCESS_ONCE(ads->ds_ctl2) = set11nTries(i->rates, 0) 
    54 +                       | set11nTries(i->rates, 1) 
    55 +                       | set11nTries(i->rates, 2) 
    56 +                       | set11nTries(i->rates, 3) 
    57 +                       | (i->dur_update ? AR_DurUpdateEna : 0) 
    58 +                       | SM(0, AR_BurstDur); 
    59 + 
    60 +               ACCESS_ONCE(ads->ds_ctl3) = set11nRate(i->rates, 0) 
    61 +                       | set11nRate(i->rates, 1) 
    62 +                       | set11nRate(i->rates, 2) 
    63 +                       | set11nRate(i->rates, 3); 
    64 +       } else { 
    65 +               ACCESS_ONCE(ads->ds_ctl2) = 0; 
    66 +               ACCESS_ONCE(ads->ds_ctl3) = 0; 
    67 +       } 
    68 + 
    69 +       if (!i->is_first) { 
    70 +               ACCESS_ONCE(ads->ds_ctl0) = 0; 
    71 +               ACCESS_ONCE(ads->ds_ctl1) = ctl1; 
    72 +               ACCESS_ONCE(ads->ds_ctl6) = ctl6; 
    73 +               return; 
    74 +       } 
    75 + 
    76 +       ctl1 |= (i->keyix != ATH9K_TXKEYIX_INVALID ? SM(i->keyix, AR_DestIdx) : 0) 
    77 +               | SM(i->type, AR_FrameType) 
    78 +               | (i->flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0) 
    79 +               | (i->flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0) 
    80 +               | (i->flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0); 
    81 + 
    82 +       switch (i->aggr) { 
    83 +       case AGGR_BUF_FIRST: 
    84 +               ctl6 |= SM(i->aggr_len, AR_AggrLen); 
    85 +               /* fall through */ 
    86 +       case AGGR_BUF_MIDDLE: 
    87 +               ctl1 |= AR_IsAggr | AR_MoreAggr; 
    88 +               ctl6 |= SM(i->ndelim, AR_PadDelim); 
    89 +               break; 
    90 +       case AGGR_BUF_LAST: 
    91 +               ctl1 |= AR_IsAggr; 
    92 +               break; 
    93 +       case AGGR_BUF_NONE: 
    94 +               break; 
    95 +       } 
    96 + 
    97 +       ACCESS_ONCE(ads->ds_ctl0) = (i->pkt_len & AR_FrameLen) 
    98 +               | (i->flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) 
    99 +               | SM(i->txpower, AR_XmitPower) 
    100 +               | (i->flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) 
    101 +               | (i->flags & ATH9K_TXDESC_INTREQ ? AR_TxIntrReq : 0) 
    102 +               | (i->keyix != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0) 
    103 +               | (i->flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0) 
    104 +               | (i->flags & ATH9K_TXDESC_RTSENA ? AR_RTSEnable : 
    105 +                  (i->flags & ATH9K_TXDESC_CTSENA ? AR_CTSEnable : 0)); 
    106 + 
    107 +       ACCESS_ONCE(ads->ds_ctl1) = ctl1; 
    108 +       ACCESS_ONCE(ads->ds_ctl6) = ctl6; 
    109 + 
    110 +       if (i->aggr == AGGR_BUF_MIDDLE || i->aggr == AGGR_BUF_LAST) 
    111 +               return; 
    112 + 
    113 +       ACCESS_ONCE(ads->ds_ctl4) = set11nPktDurRTSCTS(i->rates, 0) 
    114 +               | set11nPktDurRTSCTS(i->rates, 1); 
    115 + 
    116 +       ACCESS_ONCE(ads->ds_ctl5) = set11nPktDurRTSCTS(i->rates, 2) 
    117 +               | set11nPktDurRTSCTS(i->rates, 3); 
    118 + 
    119 +       ACCESS_ONCE(ads->ds_ctl7) = set11nRateFlags(i->rates, 0) 
    120 +               | set11nRateFlags(i->rates, 1) 
    121 +               | set11nRateFlags(i->rates, 2) 
    122 +               | set11nRateFlags(i->rates, 3) 
    123 +               | SM(i->rtscts_rate, AR_RTSCTSRate); 
    124  } 
    125   
    126  static int ar9002_hw_proc_txdesc(struct ath_hw *ah, void *ds, 
    127 @@ -271,145 +342,6 @@ static int ar9002_hw_proc_txdesc(struct  
    128         return 0; 
    129  } 
    130   
    131 -static void ar9002_hw_set11n_txdesc(struct ath_hw *ah, void *ds, 
    132 -                                   u32 pktLen, enum ath9k_pkt_type type, 
    133 -                                   u32 txPower, u8 keyIx, 
    134 -                                   enum ath9k_key_type keyType, u32 flags) 
    135 -{ 
    136 -       struct ar5416_desc *ads = AR5416DESC(ds); 
    137 - 
    138 -       if (txPower > 63) 
    139 -               txPower = 63; 
    140 - 
    141 -       ads->ds_ctl0 = (pktLen & AR_FrameLen) 
    142 -               | (flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) 
    143 -               | SM(txPower, AR_XmitPower) 
    144 -               | (flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) 
    145 -               | (flags & ATH9K_TXDESC_INTREQ ? AR_TxIntrReq : 0) 
    146 -               | (keyIx != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0); 
    147 - 
    148 -       ads->ds_ctl1 = 
    149 -               (keyIx != ATH9K_TXKEYIX_INVALID ? SM(keyIx, AR_DestIdx) : 0) 
    150 -               | SM(type, AR_FrameType) 
    151 -               | (flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0) 
    152 -               | (flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0) 
    153 -               | (flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0); 
    154 - 
    155 -       ads->ds_ctl6 = SM(keyType, AR_EncrType); 
    156 - 
    157 -       if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) { 
    158 -               ads->ds_ctl8 = 0; 
    159 -               ads->ds_ctl9 = 0; 
    160 -               ads->ds_ctl10 = 0; 
    161 -               ads->ds_ctl11 = 0; 
    162 -       } 
    163 -} 
    164 - 
    165 -static void ar9002_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val) 
    166 -{ 
    167 -       struct ar5416_desc *ads = AR5416DESC(ds); 
    168 - 
    169 -       if (val) 
    170 -               ads->ds_ctl0 |= AR_ClrDestMask; 
    171 -       else 
    172 -               ads->ds_ctl0 &= ~AR_ClrDestMask; 
    173 -} 
    174 - 
    175 -static void ar9002_hw_set11n_ratescenario(struct ath_hw *ah, void *ds, 
    176 -                                         void *lastds, 
    177 -                                         u32 durUpdateEn, u32 rtsctsRate, 
    178 -                                         u32 rtsctsDuration, 
    179 -                                         struct ath9k_11n_rate_series series[], 
    180 -                                         u32 nseries, u32 flags) 
    181 -{ 
    182 -       struct ar5416_desc *ads = AR5416DESC(ds); 
    183 -       struct ar5416_desc *last_ads = AR5416DESC(lastds); 
    184 -       u32 ds_ctl0; 
    185 - 
    186 -       if (flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)) { 
    187 -               ds_ctl0 = ads->ds_ctl0; 
    188 - 
    189 -               if (flags & ATH9K_TXDESC_RTSENA) { 
    190 -                       ds_ctl0 &= ~AR_CTSEnable; 
    191 -                       ds_ctl0 |= AR_RTSEnable; 
    192 -               } else { 
    193 -                       ds_ctl0 &= ~AR_RTSEnable; 
    194 -                       ds_ctl0 |= AR_CTSEnable; 
    195 -               } 
    196 - 
    197 -               ads->ds_ctl0 = ds_ctl0; 
    198 -       } else { 
    199 -               ads->ds_ctl0 = 
    200 -                       (ads->ds_ctl0 & ~(AR_RTSEnable | AR_CTSEnable)); 
    201 -       } 
    202 - 
    203 -       ads->ds_ctl2 = set11nTries(series, 0) 
    204 -               | set11nTries(series, 1) 
    205 -               | set11nTries(series, 2) 
    206 -               | set11nTries(series, 3) 
    207 -               | (durUpdateEn ? AR_DurUpdateEna : 0) 
    208 -               | SM(0, AR_BurstDur); 
    209 - 
    210 -       ads->ds_ctl3 = set11nRate(series, 0) 
    211 -               | set11nRate(series, 1) 
    212 -               | set11nRate(series, 2) 
    213 -               | set11nRate(series, 3); 
    214 - 
    215 -       ads->ds_ctl4 = set11nPktDurRTSCTS(series, 0) 
    216 -               | set11nPktDurRTSCTS(series, 1); 
    217 - 
    218 -       ads->ds_ctl5 = set11nPktDurRTSCTS(series, 2) 
    219 -               | set11nPktDurRTSCTS(series, 3); 
    220 - 
    221 -       ads->ds_ctl7 = set11nRateFlags(series, 0) 
    222 -               | set11nRateFlags(series, 1) 
    223 -               | set11nRateFlags(series, 2) 
    224 -               | set11nRateFlags(series, 3) 
    225 -               | SM(rtsctsRate, AR_RTSCTSRate); 
    226 -       last_ads->ds_ctl2 = ads->ds_ctl2; 
    227 -       last_ads->ds_ctl3 = ads->ds_ctl3; 
    228 -} 
    229 - 
    230 -static void ar9002_hw_set11n_aggr_first(struct ath_hw *ah, void *ds, 
    231 -                                       u32 aggrLen) 
    232 -{ 
    233 -       struct ar5416_desc *ads = AR5416DESC(ds); 
    234 - 
    235 -       ads->ds_ctl1 |= (AR_IsAggr | AR_MoreAggr); 
    236 -       ads->ds_ctl6 &= ~AR_AggrLen; 
    237 -       ads->ds_ctl6 |= SM(aggrLen, AR_AggrLen); 
    238 -} 
    239 - 
    240 -static void ar9002_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds, 
    241 -                                        u32 numDelims) 
    242 -{ 
    243 -       struct ar5416_desc *ads = AR5416DESC(ds); 
    244 -       unsigned int ctl6; 
    245 - 
    246 -       ads->ds_ctl1 |= (AR_IsAggr | AR_MoreAggr); 
    247 - 
    248 -       ctl6 = ads->ds_ctl6; 
    249 -       ctl6 &= ~AR_PadDelim; 
    250 -       ctl6 |= SM(numDelims, AR_PadDelim); 
    251 -       ads->ds_ctl6 = ctl6; 
    252 -} 
    253 - 
    254 -static void ar9002_hw_set11n_aggr_last(struct ath_hw *ah, void *ds) 
    255 -{ 
    256 -       struct ar5416_desc *ads = AR5416DESC(ds); 
    257 - 
    258 -       ads->ds_ctl1 |= AR_IsAggr; 
    259 -       ads->ds_ctl1 &= ~AR_MoreAggr; 
    260 -       ads->ds_ctl6 &= ~AR_PadDelim; 
    261 -} 
    262 - 
    263 -static void ar9002_hw_clr11n_aggr(struct ath_hw *ah, void *ds) 
    264 -{ 
    265 -       struct ar5416_desc *ads = AR5416DESC(ds); 
    266 - 
    267 -       ads->ds_ctl1 &= (~AR_IsAggr & ~AR_MoreAggr); 
    268 -} 
    269 - 
    270  void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds, 
    271                           u32 size, u32 flags) 
    272  { 
    273 @@ -433,13 +365,6 @@ void ar9002_hw_attach_mac_ops(struct ath 
    274         ops->rx_enable = ar9002_hw_rx_enable; 
    275         ops->set_desc_link = ar9002_hw_set_desc_link; 
    276         ops->get_isr = ar9002_hw_get_isr; 
    277 -       ops->fill_txdesc = ar9002_hw_fill_txdesc; 
    278 +       ops->set_txdesc = ar9002_set_txdesc; 
    279         ops->proc_txdesc = ar9002_hw_proc_txdesc; 
    280 -       ops->set11n_txdesc = ar9002_hw_set11n_txdesc; 
    281 -       ops->set11n_ratescenario = ar9002_hw_set11n_ratescenario; 
    282 -       ops->set11n_aggr_first = ar9002_hw_set11n_aggr_first; 
    283 -       ops->set11n_aggr_middle = ar9002_hw_set11n_aggr_middle; 
    284 -       ops->set11n_aggr_last = ar9002_hw_set11n_aggr_last; 
    285 -       ops->clr11n_aggr = ar9002_hw_clr11n_aggr; 
    286 -       ops->set_clrdmask = ar9002_hw_set_clrdmask; 
    287  } 
    288 --- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c 
    289 +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c 
    290 @@ -652,8 +652,9 @@ static void ar9003_hw_detect_outlier(int 
    291                         outlier_idx = max_idx; 
    292                 else 
    293                         outlier_idx = min_idx; 
    294 + 
    295 +               mp_coeff[outlier_idx] = mp_avg; 
    296         } 
    297 -       mp_coeff[outlier_idx] = mp_avg; 
    298  } 
    299   
    300  static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah, 
    301 @@ -884,6 +885,7 @@ static bool ar9003_hw_init_cal(struct at 
    302         if (txiqcal_done) 
    303                 ar9003_hw_tx_iq_cal_post_proc(ah); 
    304   
    305 +       ath9k_hw_loadnf(ah, chan); 
    306         ath9k_hw_start_nfcal(ah, true); 
    307   
    308         /* Initialize list pointers */ 
    309 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    310 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    311 @@ -21,6 +21,132 @@ static void ar9003_hw_rx_enable(struct a 
    312         REG_WRITE(hw, AR_CR, 0); 
    313  } 
    314   
    315 +static void 
    316 +ar9003_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) 
    317 +{ 
    318 +       struct ar9003_txc *ads = ds; 
    319 +       int checksum = 0; 
    320 +       u32 val, ctl12, ctl17; 
    321 + 
    322 +       val = (ATHEROS_VENDOR_ID << AR_DescId_S) | 
    323 +             (1 << AR_TxRxDesc_S) | 
    324 +             (1 << AR_CtrlStat_S) | 
    325 +             (i->qcu << AR_TxQcuNum_S) | 0x17; 
    326 + 
    327 +       checksum += val; 
    328 +       ACCESS_ONCE(ads->info) = val; 
    329 + 
    330 +       checksum += i->link; 
    331 +       ACCESS_ONCE(ads->link) = i->link; 
    332 + 
    333 +       checksum += i->buf_addr[0]; 
    334 +       ACCESS_ONCE(ads->data0) = i->buf_addr[0]; 
    335 +       checksum += i->buf_addr[1]; 
    336 +       ACCESS_ONCE(ads->data1) = i->buf_addr[1]; 
    337 +       checksum += i->buf_addr[2]; 
    338 +       ACCESS_ONCE(ads->data2) = i->buf_addr[2]; 
    339 +       checksum += i->buf_addr[3]; 
    340 +       ACCESS_ONCE(ads->data3) = i->buf_addr[3]; 
    341 + 
    342 +       checksum += (val = (i->buf_len[0] << AR_BufLen_S) & AR_BufLen); 
    343 +       ACCESS_ONCE(ads->ctl3) = val; 
    344 +       checksum += (val = (i->buf_len[1] << AR_BufLen_S) & AR_BufLen); 
    345 +       ACCESS_ONCE(ads->ctl5) = val; 
    346 +       checksum += (val = (i->buf_len[2] << AR_BufLen_S) & AR_BufLen); 
    347 +       ACCESS_ONCE(ads->ctl7) = val; 
    348 +       checksum += (val = (i->buf_len[3] << AR_BufLen_S) & AR_BufLen); 
    349 +       ACCESS_ONCE(ads->ctl9) = val; 
    350 + 
    351 +       checksum = (u16) (((checksum & 0xffff) + (checksum >> 16)) & 0xffff); 
    352 +       ACCESS_ONCE(ads->ctl10) = checksum; 
    353 + 
    354 +       if (i->is_first || i->is_last) { 
    355 +               ACCESS_ONCE(ads->ctl13) = set11nTries(i->rates, 0) 
    356 +                       | set11nTries(i->rates, 1) 
    357 +                       | set11nTries(i->rates, 2) 
    358 +                       | set11nTries(i->rates, 3) 
    359 +                       | (i->dur_update ? AR_DurUpdateEna : 0) 
    360 +                       | SM(0, AR_BurstDur); 
    361 + 
    362 +               ACCESS_ONCE(ads->ctl14) = set11nRate(i->rates, 0) 
    363 +                       | set11nRate(i->rates, 1) 
    364 +                       | set11nRate(i->rates, 2) 
    365 +                       | set11nRate(i->rates, 3); 
    366 +       } else { 
    367 +               ACCESS_ONCE(ads->ctl13) = 0; 
    368 +               ACCESS_ONCE(ads->ctl14) = 0; 
    369 +       } 
    370 + 
    371 +       ads->ctl20 = 0; 
    372 +       ads->ctl21 = 0; 
    373 +       ads->ctl22 = 0; 
    374 + 
    375 +       ctl17 = SM(i->keytype, AR_EncrType); 
    376 +       if (!i->is_first) { 
    377 +               ACCESS_ONCE(ads->ctl11) = 0; 
    378 +               ACCESS_ONCE(ads->ctl12) = i->is_last ? 0 : AR_TxMore; 
    379 +               ACCESS_ONCE(ads->ctl15) = 0; 
    380 +               ACCESS_ONCE(ads->ctl16) = 0; 
    381 +               ACCESS_ONCE(ads->ctl17) = ctl17; 
    382 +               ACCESS_ONCE(ads->ctl18) = 0; 
    383 +               ACCESS_ONCE(ads->ctl19) = 0; 
    384 +               return; 
    385 +       } 
    386 + 
    387 +       ACCESS_ONCE(ads->ctl11) = (i->pkt_len & AR_FrameLen) 
    388 +               | (i->flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) 
    389 +               | SM(i->txpower, AR_XmitPower) 
    390 +               | (i->flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) 
    391 +               | (i->keyix != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0) 
    392 +               | (i->flags & ATH9K_TXDESC_LOWRXCHAIN ? AR_LowRxChain : 0) 
    393 +               | (i->flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0) 
    394 +               | (i->flags & ATH9K_TXDESC_RTSENA ? AR_RTSEnable : 
    395 +                  (i->flags & ATH9K_TXDESC_CTSENA ? AR_CTSEnable : 0)); 
    396 + 
    397 +       ctl12 = (i->keyix != ATH9K_TXKEYIX_INVALID ? 
    398 +                SM(i->keyix, AR_DestIdx) : 0) 
    399 +               | SM(i->type, AR_FrameType) 
    400 +               | (i->flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0) 
    401 +               | (i->flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0) 
    402 +               | (i->flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0); 
    403 + 
    404 +       ctl17 |= (i->flags & ATH9K_TXDESC_LDPC ? AR_LDPC : 0); 
    405 +       switch (i->aggr) { 
    406 +       case AGGR_BUF_FIRST: 
    407 +               ctl17 |= SM(i->aggr_len, AR_AggrLen); 
    408 +               /* fall through */ 
    409 +       case AGGR_BUF_MIDDLE: 
    410 +               ctl12 |= AR_IsAggr | AR_MoreAggr; 
    411 +               ctl17 |= SM(i->ndelim, AR_PadDelim); 
    412 +               break; 
    413 +       case AGGR_BUF_LAST: 
    414 +               ctl12 |= AR_IsAggr; 
    415 +               break; 
    416 +       case AGGR_BUF_NONE: 
    417 +               break; 
    418 +       } 
    419 + 
    420 +       val = (i->flags & ATH9K_TXDESC_PAPRD) >> ATH9K_TXDESC_PAPRD_S; 
    421 +       ctl12 |= SM(val, AR_PAPRDChainMask); 
    422 + 
    423 +       ACCESS_ONCE(ads->ctl12) = ctl12; 
    424 +       ACCESS_ONCE(ads->ctl17) = ctl17; 
    425 + 
    426 +       ACCESS_ONCE(ads->ctl15) = set11nPktDurRTSCTS(i->rates, 0) 
    427 +               | set11nPktDurRTSCTS(i->rates, 1); 
    428 + 
    429 +       ACCESS_ONCE(ads->ctl16) = set11nPktDurRTSCTS(i->rates, 2) 
    430 +               | set11nPktDurRTSCTS(i->rates, 3); 
    431 + 
    432 +       ACCESS_ONCE(ads->ctl18) = set11nRateFlags(i->rates, 0) 
    433 +               | set11nRateFlags(i->rates, 1) 
    434 +               | set11nRateFlags(i->rates, 2) 
    435 +               | set11nRateFlags(i->rates, 3) 
    436 +               | SM(i->rtscts_rate, AR_RTSCTSRate); 
    437 + 
    438 +       ACCESS_ONCE(ads->ctl19) = AR_Not_Sounding; 
    439 +} 
    440 + 
    441  static u16 ar9003_calc_ptr_chksum(struct ar9003_txc *ads) 
    442  { 
    443         int checksum; 
    444 @@ -185,47 +311,6 @@ static bool ar9003_hw_get_isr(struct ath 
    445         return true; 
    446  } 
    447   
    448 -static void ar9003_hw_fill_txdesc(struct ath_hw *ah, void *ds, u32 seglen, 
    449 -                                 bool is_firstseg, bool is_lastseg, 
    450 -                                 const void *ds0, dma_addr_t buf_addr, 
    451 -                                 unsigned int qcu) 
    452 -{ 
    453 -       struct ar9003_txc *ads = (struct ar9003_txc *) ds; 
    454 -       unsigned int descid = 0; 
    455 - 
    456 -       ads->info = (ATHEROS_VENDOR_ID << AR_DescId_S) | 
    457 -                                    (1 << AR_TxRxDesc_S) | 
    458 -                                    (1 << AR_CtrlStat_S) | 
    459 -                                    (qcu << AR_TxQcuNum_S) | 0x17; 
    460 - 
    461 -       ads->data0 = buf_addr; 
    462 -       ads->data1 = 0; 
    463 -       ads->data2 = 0; 
    464 -       ads->data3 = 0; 
    465 - 
    466 -       ads->ctl3 = (seglen << AR_BufLen_S); 
    467 -       ads->ctl3 &= AR_BufLen; 
    468 - 
    469 -       /* Fill in pointer checksum and descriptor id */ 
    470 -       ads->ctl10 = ar9003_calc_ptr_chksum(ads); 
    471 -       ads->ctl10 |= (descid << AR_TxDescId_S); 
    472 - 
    473 -       if (is_firstseg) { 
    474 -               ads->ctl12 |= (is_lastseg ? 0 : AR_TxMore); 
    475 -       } else if (is_lastseg) { 
    476 -               ads->ctl11 = 0; 
    477 -               ads->ctl12 = 0; 
    478 -               ads->ctl13 = AR9003TXC_CONST(ds0)->ctl13; 
    479 -               ads->ctl14 = AR9003TXC_CONST(ds0)->ctl14; 
    480 -       } else { 
    481 -               /* XXX Intermediate descriptor in a multi-descriptor frame.*/ 
    482 -               ads->ctl11 = 0; 
    483 -               ads->ctl12 = AR_TxMore; 
    484 -               ads->ctl13 = 0; 
    485 -               ads->ctl14 = 0; 
    486 -       } 
    487 -} 
    488 - 
    489  static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, 
    490                                  struct ath_tx_status *ts) 
    491  { 
    492 @@ -310,161 +395,6 @@ static int ar9003_hw_proc_txdesc(struct  
    493         return 0; 
    494  } 
    495   
    496 -static void ar9003_hw_set11n_txdesc(struct ath_hw *ah, void *ds, 
    497 -               u32 pktlen, enum ath9k_pkt_type type, u32 txpower, 
    498 -               u8 keyIx, enum ath9k_key_type keyType, u32 flags) 
    499 -{ 
    500 -       struct ar9003_txc *ads = (struct ar9003_txc *) ds; 
    501 - 
    502 -       if (txpower > ah->txpower_limit) 
    503 -               txpower = ah->txpower_limit; 
    504 - 
    505 -       if (txpower > 63) 
    506 -               txpower = 63; 
    507 - 
    508 -       ads->ctl11 = (pktlen & AR_FrameLen) 
    509 -               | (flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) 
    510 -               | SM(txpower, AR_XmitPower) 
    511 -               | (flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) 
    512 -               | (keyIx != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0) 
    513 -               | (flags & ATH9K_TXDESC_LOWRXCHAIN ? AR_LowRxChain : 0); 
    514 - 
    515 -       ads->ctl12 = 
    516 -               (keyIx != ATH9K_TXKEYIX_INVALID ? SM(keyIx, AR_DestIdx) : 0) 
    517 -               | SM(type, AR_FrameType) 
    518 -               | (flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0) 
    519 -               | (flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0) 
    520 -               | (flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0); 
    521 - 
    522 -       ads->ctl17 = SM(keyType, AR_EncrType) | 
    523 -                    (flags & ATH9K_TXDESC_LDPC ? AR_LDPC : 0); 
    524 -       ads->ctl18 = 0; 
    525 -       ads->ctl19 = AR_Not_Sounding; 
    526 - 
    527 -       ads->ctl20 = 0; 
    528 -       ads->ctl21 = 0; 
    529 -       ads->ctl22 = 0; 
    530 -} 
    531 - 
    532 -static void ar9003_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val) 
    533 -{ 
    534 -       struct ar9003_txc *ads = (struct ar9003_txc *) ds; 
    535 - 
    536 -       if (val) 
    537 -               ads->ctl11 |= AR_ClrDestMask; 
    538 -       else 
    539 -               ads->ctl11 &= ~AR_ClrDestMask; 
    540 -} 
    541 - 
    542 -static void ar9003_hw_set11n_ratescenario(struct ath_hw *ah, void *ds, 
    543 -                                         void *lastds, 
    544 -                                         u32 durUpdateEn, u32 rtsctsRate, 
    545 -                                         u32 rtsctsDuration, 
    546 -                                         struct ath9k_11n_rate_series series[], 
    547 -                                         u32 nseries, u32 flags) 
    548 -{ 
    549 -       struct ar9003_txc *ads = (struct ar9003_txc *) ds; 
    550 -       struct ar9003_txc *last_ads = (struct ar9003_txc *) lastds; 
    551 -       u_int32_t ctl11; 
    552 - 
    553 -       if (flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)) { 
    554 -               ctl11 = ads->ctl11; 
    555 - 
    556 -               if (flags & ATH9K_TXDESC_RTSENA) { 
    557 -                       ctl11 &= ~AR_CTSEnable; 
    558 -                       ctl11 |= AR_RTSEnable; 
    559 -               } else { 
    560 -                       ctl11 &= ~AR_RTSEnable; 
    561 -                       ctl11 |= AR_CTSEnable; 
    562 -               } 
    563 - 
    564 -               ads->ctl11 = ctl11; 
    565 -       } else { 
    566 -               ads->ctl11 = (ads->ctl11 & ~(AR_RTSEnable | AR_CTSEnable)); 
    567 -       } 
    568 - 
    569 -       ads->ctl13 = set11nTries(series, 0) 
    570 -               |  set11nTries(series, 1) 
    571 -               |  set11nTries(series, 2) 
    572 -               |  set11nTries(series, 3) 
    573 -               |  (durUpdateEn ? AR_DurUpdateEna : 0) 
    574 -               |  SM(0, AR_BurstDur); 
    575 - 
    576 -       ads->ctl14 = set11nRate(series, 0) 
    577 -               |  set11nRate(series, 1) 
    578 -               |  set11nRate(series, 2) 
    579 -               |  set11nRate(series, 3); 
    580 - 
    581 -       ads->ctl15 = set11nPktDurRTSCTS(series, 0) 
    582 -               |  set11nPktDurRTSCTS(series, 1); 
    583 - 
    584 -       ads->ctl16 = set11nPktDurRTSCTS(series, 2) 
    585 -               |  set11nPktDurRTSCTS(series, 3); 
    586 - 
    587 -       ads->ctl18 = set11nRateFlags(series, 0) 
    588 -               |  set11nRateFlags(series, 1) 
    589 -               |  set11nRateFlags(series, 2) 
    590 -               |  set11nRateFlags(series, 3) 
    591 -               | SM(rtsctsRate, AR_RTSCTSRate); 
    592 -       ads->ctl19 = AR_Not_Sounding; 
    593 - 
    594 -       last_ads->ctl13 = ads->ctl13; 
    595 -       last_ads->ctl14 = ads->ctl14; 
    596 -} 
    597 - 
    598 -static void ar9003_hw_set11n_aggr_first(struct ath_hw *ah, void *ds, 
    599 -                                       u32 aggrLen) 
    600 -{ 
    601 -       struct ar9003_txc *ads = (struct ar9003_txc *) ds; 
    602 - 
    603 -       ads->ctl12 |= (AR_IsAggr | AR_MoreAggr); 
    604 - 
    605 -       ads->ctl17 &= ~AR_AggrLen; 
    606 -       ads->ctl17 |= SM(aggrLen, AR_AggrLen); 
    607 -} 
    608 - 
    609 -static void ar9003_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds, 
    610 -                                        u32 numDelims) 
    611 -{ 
    612 -       struct ar9003_txc *ads = (struct ar9003_txc *) ds; 
    613 -       unsigned int ctl17; 
    614 - 
    615 -       ads->ctl12 |= (AR_IsAggr | AR_MoreAggr); 
    616 - 
    617 -       /* 
    618 -        * We use a stack variable to manipulate ctl6 to reduce uncached 
    619 -        * read modify, modfiy, write. 
    620 -        */ 
    621 -       ctl17 = ads->ctl17; 
    622 -       ctl17 &= ~AR_PadDelim; 
    623 -       ctl17 |= SM(numDelims, AR_PadDelim); 
    624 -       ads->ctl17 = ctl17; 
    625 -} 
    626 - 
    627 -static void ar9003_hw_set11n_aggr_last(struct ath_hw *ah, void *ds) 
    628 -{ 
    629 -       struct ar9003_txc *ads = (struct ar9003_txc *) ds; 
    630 - 
    631 -       ads->ctl12 |= AR_IsAggr; 
    632 -       ads->ctl12 &= ~AR_MoreAggr; 
    633 -       ads->ctl17 &= ~AR_PadDelim; 
    634 -} 
    635 - 
    636 -static void ar9003_hw_clr11n_aggr(struct ath_hw *ah, void *ds) 
    637 -{ 
    638 -       struct ar9003_txc *ads = (struct ar9003_txc *) ds; 
    639 - 
    640 -       ads->ctl12 &= (~AR_IsAggr & ~AR_MoreAggr); 
    641 -} 
    642 - 
    643 -void ar9003_hw_set_paprd_txdesc(struct ath_hw *ah, void *ds, u8 chains) 
    644 -{ 
    645 -       struct ar9003_txc *ads = ds; 
    646 - 
    647 -       ads->ctl12 |= SM(chains, AR_PAPRDChainMask); 
    648 -} 
    649 -EXPORT_SYMBOL(ar9003_hw_set_paprd_txdesc); 
    650 - 
    651  void ar9003_hw_attach_mac_ops(struct ath_hw *hw) 
    652  { 
    653         struct ath_hw_ops *ops = ath9k_hw_ops(hw); 
    654 @@ -472,15 +402,8 @@ void ar9003_hw_attach_mac_ops(struct ath 
    655         ops->rx_enable = ar9003_hw_rx_enable; 
    656         ops->set_desc_link = ar9003_hw_set_desc_link; 
    657         ops->get_isr = ar9003_hw_get_isr; 
    658 -       ops->fill_txdesc = ar9003_hw_fill_txdesc; 
    659 +       ops->set_txdesc = ar9003_set_txdesc; 
    660         ops->proc_txdesc = ar9003_hw_proc_txdesc; 
    661 -       ops->set11n_txdesc = ar9003_hw_set11n_txdesc; 
    662 -       ops->set11n_ratescenario = ar9003_hw_set11n_ratescenario; 
    663 -       ops->set11n_aggr_first = ar9003_hw_set11n_aggr_first; 
    664 -       ops->set11n_aggr_middle = ar9003_hw_set11n_aggr_middle; 
    665 -       ops->set11n_aggr_last = ar9003_hw_set11n_aggr_last; 
    666 -       ops->clr11n_aggr = ar9003_hw_clr11n_aggr; 
    667 -       ops->set_clrdmask = ar9003_hw_set_clrdmask; 
    668  } 
    669   
    670  void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size) 
    671 --- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    672 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    673 @@ -87,17 +87,14 @@ struct ath_config { 
    674   * @BUF_AMPDU: This buffer is an ampdu, as part of an aggregate (during TX) 
    675   * @BUF_AGGR: Indicates whether the buffer can be aggregated 
    676   *     (used in aggregation scheduling) 
    677 - * @BUF_XRETRY: To denote excessive retries of the buffer 
    678   */ 
    679  enum buffer_type { 
    680         BUF_AMPDU               = BIT(0), 
    681         BUF_AGGR                = BIT(1), 
    682 -       BUF_XRETRY              = BIT(2), 
    683  }; 
    684   
    685  #define bf_isampdu(bf)         (bf->bf_state.bf_type & BUF_AMPDU) 
    686  #define bf_isaggr(bf)          (bf->bf_state.bf_type & BUF_AGGR) 
    687 -#define bf_isxretried(bf)      (bf->bf_state.bf_type & BUF_XRETRY) 
    688   
    689  #define ATH_TXSTATUS_RING_SIZE 64 
    690   
    691 @@ -216,6 +213,7 @@ struct ath_frame_info { 
    692  struct ath_buf_state { 
    693         u8 bf_type; 
    694         u8 bfs_paprd; 
    695 +       u8 ndelim; 
    696         u16 seqno; 
    697         unsigned long bfs_paprd_timestamp; 
    698  }; 
    699 @@ -230,7 +228,6 @@ struct ath_buf { 
    700         dma_addr_t bf_daddr;            /* physical addr of desc */ 
    701         dma_addr_t bf_buf_addr; /* physical addr of data buffer, for DMA */ 
    702         bool bf_stale; 
    703 -       u16 bf_flags; 
    704         struct ath_buf_state bf_state; 
    705  }; 
    706   
    707 @@ -277,8 +274,7 @@ struct ath_tx_control { 
    708  }; 
    709   
    710  #define ATH_TX_ERROR        0x01 
    711 -#define ATH_TX_XRETRY       0x02 
    712 -#define ATH_TX_BAR          0x04 
    713 +#define ATH_TX_BAR          0x02 
    714   
    715  /** 
    716   * @txq_map:  Index is mac80211 queue number.  This is 
    717 --- a/drivers/net/wireless/ath/ath9k/beacon.c 
    718 +++ b/drivers/net/wireless/ath/ath9k/beacon.c 
    719 @@ -73,44 +73,39 @@ static void ath_beacon_setup(struct ath_ 
    720         struct sk_buff *skb = bf->bf_mpdu; 
     125+       /* 
     126+        * Reset key cache to sane defaults (all entries cleared) instead of 
     127+        * semi-random values after suspend/resume. 
     128+        */ 
     129+       ath9k_cmn_init_crypto(sc->sc_ah); 
     130+ 
     131        spin_unlock_bh(&sc->sc_pcu_lock); 
     132  
     133        if ((ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE) && 
     134@@ -1176,6 +1116,13 @@ static void ath9k_tx(struct ieee80211_hw 
     135                } 
     136        } 
     137  
     138+       /* 
     139+        * Cannot tx while the hardware is in full sleep, it first needs a full 
     140+        * chip reset to recover from that 
     141+        */ 
     142+       if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_FULL_SLEEP)) 
     143+               goto exit; 
     144+ 
     145        if (unlikely(sc->sc_ah->power_mode != ATH9K_PM_AWAKE)) { 
     146                /* 
     147                 * We are using PS-Poll and mac80211 can request TX while in 
     148@@ -1222,6 +1169,7 @@ static void ath9k_stop(struct ieee80211_ 
     149        struct ath_softc *sc = hw->priv; 
    721150        struct ath_hw *ah = sc->sc_ah; 
    722151        struct ath_common *common = ath9k_hw_common(ah); 
    723 -       struct ath_desc *ds; 
    724 -       struct ath9k_11n_rate_series series[4]; 
    725 -       int flags, ctsrate = 0, ctsduration = 0; 
    726 +       struct ath_tx_info info; 
    727         struct ieee80211_supported_band *sband; 
    728 +       u8 chainmask = ah->txchainmask; 
    729         u8 rate = 0; 
    730   
    731         ath9k_reset_beacon_status(sc); 
    732   
    733 -       ds = bf->bf_desc; 
    734 -       flags = ATH9K_TXDESC_NOACK; 
    735 - 
    736 -       ds->ds_link = 0; 
    737 - 
    738         sband = &sc->sbands[common->hw->conf.channel->band]; 
    739         rate = sband->bitrates[rateidx].hw_value; 
    740         if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) 
    741                 rate |= sband->bitrates[rateidx].hw_value_short; 
    742   
    743 -       ath9k_hw_set11n_txdesc(ah, ds, skb->len + FCS_LEN, 
    744 -                              ATH9K_PKT_TYPE_BEACON, 
    745 -                              MAX_RATE_POWER, 
    746 -                              ATH9K_TXKEYIX_INVALID, 
    747 -                              ATH9K_KEY_TYPE_CLEAR, 
    748 -                              flags); 
    749 - 
    750 -       /* NB: beacon's BufLen must be a multiple of 4 bytes */ 
    751 -       ath9k_hw_filltxdesc(ah, ds, roundup(skb->len, 4), 
    752 -                           true, true, ds, bf->bf_buf_addr, 
    753 -                           sc->beacon.beaconq); 
    754 - 
    755 -       memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); 
    756 -       series[0].Tries = 1; 
    757 -       series[0].Rate = rate; 
    758 -       series[0].ChSel = ath_txchainmask_reduction(sc, 
    759 -                       ah->txchainmask, series[0].Rate); 
    760 -       series[0].RateFlags = (ctsrate) ? ATH9K_RATESERIES_RTS_CTS : 0; 
    761 -       ath9k_hw_set11n_ratescenario(ah, ds, ds, 0, ctsrate, ctsduration, 
    762 -                                    series, 4, 0); 
    763 +       memset(&info, 0, sizeof(info)); 
    764 +       info.pkt_len = skb->len + FCS_LEN; 
    765 +       info.type = ATH9K_PKT_TYPE_BEACON; 
    766 +       info.txpower = MAX_RATE_POWER; 
    767 +       info.keyix = ATH9K_TXKEYIX_INVALID; 
    768 +       info.keytype = ATH9K_KEY_TYPE_CLEAR; 
    769 +       info.flags = ATH9K_TXDESC_NOACK; 
    770 + 
    771 +       info.buf_addr[0] = bf->bf_buf_addr; 
    772 +       info.buf_len[0] = roundup(skb->len, 4); 
    773 + 
    774 +       info.is_first = true; 
    775 +       info.is_last = true; 
    776 + 
    777 +       info.qcu = sc->beacon.beaconq; 
    778 + 
    779 +       info.rates[0].Tries = 1; 
    780 +       info.rates[0].Rate = rate; 
    781 +       info.rates[0].ChSel = ath_txchainmask_reduction(sc, chainmask, rate); 
    782 + 
    783 +       ath9k_hw_set_txdesc(ah, bf->bf_desc, &info); 
    784  } 
    785   
    786  static void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb) 
    787 @@ -517,6 +512,7 @@ static void ath_beacon_config_ap(struct  
    788         /* Set the computed AP beacon timers */ 
    789   
     152+       bool prev_idle; 
     153  
     154        mutex_lock(&sc->mutex); 
     155  
     156@@ -1252,35 +1200,45 @@ static void ath9k_stop(struct ieee80211_ 
     157         * before setting the invalid flag. */ 
    790158        ath9k_hw_disable_interrupts(ah); 
    791 +       sc->sc_flags |= SC_OP_TSF_RESET; 
    792         ath9k_beacon_init(sc, nexttbtt, intval); 
    793         sc->beacon.bmisscnt = 0; 
    794         ath9k_hw_set_interrupts(ah, ah->imask); 
    795 --- a/drivers/net/wireless/ath/ath9k/debug.c 
    796 +++ b/drivers/net/wireless/ath/ath9k/debug.c 
    797 @@ -826,7 +826,8 @@ static ssize_t read_file_misc(struct fil 
    798  } 
    799   
    800  void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf, 
    801 -                      struct ath_tx_status *ts, struct ath_txq *txq) 
    802 +                      struct ath_tx_status *ts, struct ath_txq *txq, 
    803 +                      unsigned int flags) 
    804  { 
    805  #define TX_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].ts\ 
    806                         [sc->debug.tsidx].c) 
    807 @@ -836,12 +837,12 @@ void ath_debug_stat_tx(struct ath_softc  
    808         sc->debug.stats.txstats[qnum].tx_bytes_all += bf->bf_mpdu->len; 
    809   
    810         if (bf_isampdu(bf)) { 
    811 -               if (bf_isxretried(bf)) 
    812 +               if (flags & ATH_TX_BAR) 
    813                         TX_STAT_INC(qnum, a_xretries); 
    814                 else 
    815                         TX_STAT_INC(qnum, a_completed); 
    816         } else { 
    817 -               if (bf_isxretried(bf)) 
    818 +               if (ts->ts_status & ATH9K_TXERR_XRETRY) 
    819                         TX_STAT_INC(qnum, xretries); 
    820                 else 
    821                         TX_STAT_INC(qnum, completed); 
    822 --- a/drivers/net/wireless/ath/ath9k/debug.h 
    823 +++ b/drivers/net/wireless/ath/ath9k/debug.h 
    824 @@ -230,7 +230,8 @@ int ath9k_init_debug(struct ath_hw *ah); 
    825  void ath9k_debug_samp_bb_mac(struct ath_softc *sc); 
    826  void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status); 
    827  void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf, 
    828 -                      struct ath_tx_status *ts, struct ath_txq *txq); 
    829 +                      struct ath_tx_status *ts, struct ath_txq *txq, 
    830 +                      unsigned int flags); 
    831  void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs); 
    832   
    833  #else 
    834 @@ -252,7 +253,8 @@ static inline void ath_debug_stat_interr 
    835  static inline void ath_debug_stat_tx(struct ath_softc *sc, 
    836                                      struct ath_buf *bf, 
    837                                      struct ath_tx_status *ts, 
    838 -                                    struct ath_txq *txq) 
    839 +                                    struct ath_txq *txq, 
    840 +                                    unsigned int flags) 
    841  { 
    842  } 
    843   
    844 --- a/drivers/net/wireless/ath/ath9k/hw-ops.h 
    845 +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h 
    846 @@ -54,13 +54,10 @@ static inline bool ath9k_hw_getisr(struc 
    847         return ath9k_hw_ops(ah)->get_isr(ah, masked); 
    848  } 
    849   
    850 -static inline void ath9k_hw_filltxdesc(struct ath_hw *ah, void *ds, u32 seglen, 
    851 -                                 bool is_firstseg, bool is_lastseg, 
    852 -                                 const void *ds0, dma_addr_t buf_addr, 
    853 -                                 unsigned int qcu) 
    854 +static inline void ath9k_hw_set_txdesc(struct ath_hw *ah, void *ds, 
    855 +                                      struct ath_tx_info *i) 
    856  { 
    857 -       ath9k_hw_ops(ah)->fill_txdesc(ah, ds, seglen, is_firstseg, is_lastseg, 
    858 -                                     ds0, buf_addr, qcu); 
    859 +       return ath9k_hw_ops(ah)->set_txdesc(ah, ds, i); 
    860  } 
    861   
    862  static inline int ath9k_hw_txprocdesc(struct ath_hw *ah, void *ds, 
    863 @@ -69,55 +66,6 @@ static inline int ath9k_hw_txprocdesc(st 
    864         return ath9k_hw_ops(ah)->proc_txdesc(ah, ds, ts); 
    865  } 
    866   
    867 -static inline void ath9k_hw_set11n_txdesc(struct ath_hw *ah, void *ds, 
    868 -                                         u32 pktLen, enum ath9k_pkt_type type, 
    869 -                                         u32 txPower, u32 keyIx, 
    870 -                                         enum ath9k_key_type keyType, 
    871 -                                         u32 flags) 
    872 -{ 
    873 -       ath9k_hw_ops(ah)->set11n_txdesc(ah, ds, pktLen, type, txPower, keyIx, 
    874 -                                     keyType, flags); 
    875 -} 
    876 - 
    877 -static inline void ath9k_hw_set11n_ratescenario(struct ath_hw *ah, void *ds, 
    878 -                                       void *lastds, 
    879 -                                       u32 durUpdateEn, u32 rtsctsRate, 
    880 -                                       u32 rtsctsDuration, 
    881 -                                       struct ath9k_11n_rate_series series[], 
    882 -                                       u32 nseries, u32 flags) 
    883 -{ 
    884 -       ath9k_hw_ops(ah)->set11n_ratescenario(ah, ds, lastds, durUpdateEn, 
    885 -                                           rtsctsRate, rtsctsDuration, series, 
    886 -                                           nseries, flags); 
    887 -} 
    888 - 
    889 -static inline void ath9k_hw_set11n_aggr_first(struct ath_hw *ah, void *ds, 
    890 -                                       u32 aggrLen) 
    891 -{ 
    892 -       ath9k_hw_ops(ah)->set11n_aggr_first(ah, ds, aggrLen); 
    893 -} 
    894 - 
    895 -static inline void ath9k_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds, 
    896 -                                              u32 numDelims) 
    897 -{ 
    898 -       ath9k_hw_ops(ah)->set11n_aggr_middle(ah, ds, numDelims); 
    899 -} 
    900 - 
    901 -static inline void ath9k_hw_set11n_aggr_last(struct ath_hw *ah, void *ds) 
    902 -{ 
    903 -       ath9k_hw_ops(ah)->set11n_aggr_last(ah, ds); 
    904 -} 
    905 - 
    906 -static inline void ath9k_hw_clr11n_aggr(struct ath_hw *ah, void *ds) 
    907 -{ 
    908 -       ath9k_hw_ops(ah)->clr11n_aggr(ah, ds); 
    909 -} 
    910 - 
    911 -static inline void ath9k_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val) 
    912 -{ 
    913 -       ath9k_hw_ops(ah)->set_clrdmask(ah, ds, val); 
    914 -} 
    915 - 
    916  static inline void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah, 
    917                 struct ath_hw_antcomb_conf *antconf) 
    918  { 
    919 @@ -233,11 +181,6 @@ static inline void ath9k_hw_restore_chai 
    920         return ath9k_hw_private_ops(ah)->restore_chainmask(ah); 
    921  } 
    922   
    923 -static inline void ath9k_hw_set_diversity(struct ath_hw *ah, bool value) 
    924 -{ 
    925 -       return ath9k_hw_private_ops(ah)->set_diversity(ah, value); 
    926 -} 
    927 - 
    928  static inline bool ath9k_hw_ani_control(struct ath_hw *ah, 
    929                                         enum ath9k_ani_cmd cmd, int param) 
    930  { 
    931 --- a/drivers/net/wireless/ath/ath9k/hw.c 
    932 +++ b/drivers/net/wireless/ath/ath9k/hw.c 
    933 @@ -1496,14 +1496,16 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    934         } 
    935         ah->noise = ath9k_hw_getchan_noise(ah, chan); 
    936   
    937 +       if ((AR_SREV_9280(ah) && common->bus_ops->ath_bus_type == ATH_PCI) || 
    938 +           (AR_SREV_9300_20_OR_LATER(ah) && IS_CHAN_5GHZ(chan))) 
    939 +               bChannelChange = false; 
    940 + 
    941         if (bChannelChange && 
    942             (ah->chip_fullsleep != true) && 
    943             (ah->curchan != NULL) && 
    944             (chan->channel != ah->curchan->channel) && 
    945             ((chan->channelFlags & CHANNEL_ALL) == 
    946 -            (ah->curchan->channelFlags & CHANNEL_ALL)) && 
    947 -           (!AR_SREV_9280(ah) || AR_DEVID_7010(ah))) { 
    948 - 
    949 +            (ah->curchan->channelFlags & CHANNEL_ALL))) { 
    950                 if (ath9k_hw_channel_change(ah, chan)) { 
    951                         ath9k_hw_loadnf(ah, ah->curchan); 
    952                         ath9k_hw_start_nfcal(ah, true); 
    953 --- a/drivers/net/wireless/ath/ath9k/hw.h 
    954 +++ b/drivers/net/wireless/ath/ath9k/hw.h 
    955 @@ -583,7 +583,6 @@ struct ath_hw_private_ops { 
    956         bool (*rfbus_req)(struct ath_hw *ah); 
    957         void (*rfbus_done)(struct ath_hw *ah); 
    958         void (*restore_chainmask)(struct ath_hw *ah); 
    959 -       void (*set_diversity)(struct ath_hw *ah, bool value); 
    960         u32 (*compute_pll_control)(struct ath_hw *ah, 
    961                                    struct ath9k_channel *chan); 
    962         bool (*ani_control)(struct ath_hw *ah, enum ath9k_ani_cmd cmd, 
    963 @@ -615,30 +614,10 @@ struct ath_hw_ops { 
    964                           u8 rxchainmask, 
    965                           bool longcal); 
    966         bool (*get_isr)(struct ath_hw *ah, enum ath9k_int *masked); 
    967 -       void (*fill_txdesc)(struct ath_hw *ah, void *ds, u32 seglen, 
    968 -                           bool is_firstseg, bool is_is_lastseg, 
    969 -                           const void *ds0, dma_addr_t buf_addr, 
    970 -                           unsigned int qcu); 
    971 +       void (*set_txdesc)(struct ath_hw *ah, void *ds, 
    972 +                          struct ath_tx_info *i); 
    973         int (*proc_txdesc)(struct ath_hw *ah, void *ds, 
    974                            struct ath_tx_status *ts); 
    975 -       void (*set11n_txdesc)(struct ath_hw *ah, void *ds, 
    976 -                             u32 pktLen, enum ath9k_pkt_type type, 
    977 -                             u32 txPower, u8 keyIx, 
    978 -                             enum ath9k_key_type keyType, 
    979 -                             u32 flags); 
    980 -       void (*set11n_ratescenario)(struct ath_hw *ah, void *ds, 
    981 -                               void *lastds, 
    982 -                               u32 durUpdateEn, u32 rtsctsRate, 
    983 -                               u32 rtsctsDuration, 
    984 -                               struct ath9k_11n_rate_series series[], 
    985 -                               u32 nseries, u32 flags); 
    986 -       void (*set11n_aggr_first)(struct ath_hw *ah, void *ds, 
    987 -                                 u32 aggrLen); 
    988 -       void (*set11n_aggr_middle)(struct ath_hw *ah, void *ds, 
    989 -                                  u32 numDelims); 
    990 -       void (*set11n_aggr_last)(struct ath_hw *ah, void *ds); 
    991 -       void (*clr11n_aggr)(struct ath_hw *ah, void *ds); 
    992 -       void (*set_clrdmask)(struct ath_hw *ah, void *ds, bool val); 
    993         void (*antdiv_comb_conf_get)(struct ath_hw *ah, 
    994                         struct ath_hw_antcomb_conf *antconf); 
    995         void (*antdiv_comb_conf_set)(struct ath_hw *ah, 
    996 --- a/drivers/net/wireless/ath/ath9k/mac.c 
    997 +++ b/drivers/net/wireless/ath/ath9k/mac.c 
    998 @@ -62,18 +62,6 @@ void ath9k_hw_txstart(struct ath_hw *ah, 
    999  } 
    1000  EXPORT_SYMBOL(ath9k_hw_txstart); 
    1001   
    1002 -void ath9k_hw_cleartxdesc(struct ath_hw *ah, void *ds) 
    1003 -{ 
    1004 -       struct ar5416_desc *ads = AR5416DESC(ds); 
    1005 - 
    1006 -       ads->ds_txstatus0 = ads->ds_txstatus1 = 0; 
    1007 -       ads->ds_txstatus2 = ads->ds_txstatus3 = 0; 
    1008 -       ads->ds_txstatus4 = ads->ds_txstatus5 = 0; 
    1009 -       ads->ds_txstatus6 = ads->ds_txstatus7 = 0; 
    1010 -       ads->ds_txstatus8 = ads->ds_txstatus9 = 0; 
    1011 -} 
    1012 -EXPORT_SYMBOL(ath9k_hw_cleartxdesc); 
    1013 - 
    1014  u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q) 
    1015  { 
    1016         u32 npend; 
    1017 @@ -596,7 +584,7 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a 
    1018         else 
    1019                 rs->rs_keyix = ATH9K_RXKEYIX_INVALID; 
    1020   
    1021 -       rs->rs_rate = RXSTATUS_RATE(ah, (&ads)); 
    1022 +       rs->rs_rate = MS(ads.ds_rxstatus0, AR_RxRate); 
    1023         rs->rs_more = (ads.ds_rxstatus1 & AR_RxMore) ? 1 : 0; 
    1024   
    1025         rs->rs_isaggr = (ads.ds_rxstatus8 & AR_RxAggr) ? 1 : 0; 
    1026 --- a/drivers/net/wireless/ath/ath9k/mac.h 
    1027 +++ b/drivers/net/wireless/ath/ath9k/mac.h 
    1028 @@ -17,10 +17,6 @@ 
    1029  #ifndef MAC_H 
    1030  #define MAC_H 
    1031   
    1032 -#define RXSTATUS_RATE(ah, ads) (AR_SREV_5416_20_OR_LATER(ah) ?         \ 
    1033 -                               MS(ads->ds_rxstatus0, AR_RxRate) :      \ 
    1034 -                               (ads->ds_rxstatus3 >> 2) & 0xFF) 
    1035 - 
    1036  #define set11nTries(_series, _index) \ 
    1037         (SM((_series)[_index].Tries, AR_XmitDataTries##_index)) 
    1038   
    1039 @@ -263,7 +259,11 @@ struct ath_desc { 
    1040  #define ATH9K_TXDESC_VMF               0x0100 
    1041  #define ATH9K_TXDESC_FRAG_IS_ON        0x0200 
    1042  #define ATH9K_TXDESC_LOWRXCHAIN                0x0400 
    1043 -#define ATH9K_TXDESC_LDPC              0x00010000 
    1044 +#define ATH9K_TXDESC_LDPC              0x0800 
    1045 +#define ATH9K_TXDESC_CLRDMASK          0x1000 
    1046 + 
    1047 +#define ATH9K_TXDESC_PAPRD             0x70000 
    1048 +#define ATH9K_TXDESC_PAPRD_S           16 
    1049   
    1050  #define ATH9K_RXDESC_INTREQ            0x0020 
    1051   
    1052 @@ -659,6 +659,13 @@ struct ath9k_11n_rate_series { 
    1053         u32 RateFlags; 
    1054  }; 
    1055   
    1056 +enum aggr_type { 
    1057 +       AGGR_BUF_NONE, 
    1058 +       AGGR_BUF_FIRST, 
    1059 +       AGGR_BUF_MIDDLE, 
    1060 +       AGGR_BUF_LAST, 
    1061 +}; 
    1062 + 
    1063  enum ath9k_key_type { 
    1064         ATH9K_KEY_TYPE_CLEAR, 
    1065         ATH9K_KEY_TYPE_WEP, 
    1066 @@ -666,6 +673,33 @@ enum ath9k_key_type { 
    1067         ATH9K_KEY_TYPE_TKIP, 
    1068  }; 
    1069   
    1070 +struct ath_tx_info { 
    1071 +       u8 qcu; 
    1072 + 
    1073 +       bool is_first; 
    1074 +       bool is_last; 
    1075 + 
    1076 +       enum aggr_type aggr; 
    1077 +       u8 ndelim; 
    1078 +       u16 aggr_len; 
    1079 + 
    1080 +       dma_addr_t link; 
    1081 +       int pkt_len; 
    1082 +       u32 flags; 
    1083 + 
    1084 +       dma_addr_t buf_addr[4]; 
    1085 +       int buf_len[4]; 
    1086 + 
    1087 +       struct ath9k_11n_rate_series rates[4]; 
    1088 +       u8 rtscts_rate; 
    1089 +       bool dur_update; 
    1090 + 
    1091 +       enum ath9k_pkt_type type; 
    1092 +       enum ath9k_key_type keytype; 
    1093 +       u8 keyix; 
    1094 +       u8 txpower; 
    1095 +}; 
    1096 + 
    1097  struct ath_hw; 
    1098  struct ath9k_channel; 
    1099  enum ath9k_int; 
    1100 @@ -673,7 +707,6 @@ enum ath9k_int; 
    1101  u32 ath9k_hw_gettxbuf(struct ath_hw *ah, u32 q); 
    1102  void ath9k_hw_puttxbuf(struct ath_hw *ah, u32 q, u32 txdp); 
    1103  void ath9k_hw_txstart(struct ath_hw *ah, u32 q); 
    1104 -void ath9k_hw_cleartxdesc(struct ath_hw *ah, void *ds); 
    1105  u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q); 
    1106  bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel); 
    1107  bool ath9k_hw_stop_dma_queue(struct ath_hw *ah, u32 q); 
    1108 --- a/drivers/net/wireless/ath/ath9k/main.c 
    1109 +++ b/drivers/net/wireless/ath/ath9k/main.c 
    1110 @@ -111,24 +111,29 @@ void ath9k_ps_wakeup(struct ath_softc *s 
    1111  void ath9k_ps_restore(struct ath_softc *sc) 
    1112  { 
    1113         struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
    1114 +       enum ath9k_power_mode mode; 
    1115         unsigned long flags; 
    1116   
    1117         spin_lock_irqsave(&sc->sc_pm_lock, flags); 
    1118         if (--sc->ps_usecount != 0) 
    1119                 goto unlock; 
    1120   
    1121 -       spin_lock(&common->cc_lock); 
    1122 -       ath_hw_cycle_counters_update(common); 
    1123 -       spin_unlock(&common->cc_lock); 
    1124 - 
    1125         if (sc->ps_idle) 
    1126 -               ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); 
    1127 +               mode = ATH9K_PM_FULL_SLEEP; 
    1128         else if (sc->ps_enabled && 
    1129                  !(sc->ps_flags & (PS_WAIT_FOR_BEACON | 
    1130                               PS_WAIT_FOR_CAB | 
    1131                               PS_WAIT_FOR_PSPOLL_DATA | 
    1132                               PS_WAIT_FOR_TX_ACK))) 
    1133 -               ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP); 
    1134 +               mode = ATH9K_PM_NETWORK_SLEEP; 
    1135 +       else 
    1136 +               goto unlock; 
    1137 + 
    1138 +       spin_lock(&common->cc_lock); 
    1139 +       ath_hw_cycle_counters_update(common); 
    1140 +       spin_unlock(&common->cc_lock); 
    1141 + 
    1142 +       ath9k_hw_setpower(sc->sc_ah, mode); 
    1143   
    1144   unlock: 
    1145         spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 
    1146 @@ -247,8 +252,8 @@ static bool ath_prepare_reset(struct ath 
    1147   
    1148         if (!flush) { 
    1149                 if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 
    1150 -                       ath_rx_tasklet(sc, 0, true); 
    1151 -               ath_rx_tasklet(sc, 0, false); 
    1152 +                       ath_rx_tasklet(sc, 1, true); 
    1153 +               ath_rx_tasklet(sc, 1, false); 
    1154         } else { 
    1155                 ath_flushrecv(sc); 
    1156         } 
    1157 @@ -669,15 +674,15 @@ void ath9k_tasklet(unsigned long data) 
    1158         u32 status = sc->intrstatus; 
    1159         u32 rxmask; 
     159  
     160-       if (!(sc->sc_flags & SC_OP_INVALID)) { 
     161-               ath_drain_all_txq(sc, false); 
     162-               ath_stoprecv(sc); 
     163-               ath9k_hw_phy_disable(ah); 
     164-       } else 
     165-               sc->rx.rxlink = NULL; 
     166+       spin_unlock_bh(&sc->sc_pcu_lock); 
     167+ 
     168+       /* we can now sync irq and kill any running tasklets, since we already 
     169+        * disabled interrupts and not holding a spin lock */ 
     170+       synchronize_irq(sc->irq); 
     171+       tasklet_kill(&sc->intr_tq); 
     172+       tasklet_kill(&sc->bcon_tasklet); 
     173+ 
     174+       prev_idle = sc->ps_idle; 
     175+       sc->ps_idle = true; 
     176+ 
     177+       spin_lock_bh(&sc->sc_pcu_lock); 
     178+ 
     179+       if (ah->led_pin >= 0) { 
     180+               ath9k_hw_set_gpio(ah, ah->led_pin, 1); 
     181+               ath9k_hw_cfg_gpio_input(ah, ah->led_pin); 
     182+       } 
     183+ 
     184+       ath_prepare_reset(sc, false, true); 
     185  
     186        if (sc->rx.frag) { 
     187                dev_kfree_skb_any(sc->rx.frag); 
     188                sc->rx.frag = NULL; 
     189        } 
     190  
     191-       /* disable HAL and put h/w to sleep */ 
     192-       ath9k_hw_disable(ah); 
     193+       if (!ah->curchan) 
     194+               ah->curchan = ath9k_cmn_get_curchannel(hw, ah); 
     195  
     196-       spin_unlock_bh(&sc->sc_pcu_lock); 
     197+       ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); 
     198+       ath9k_hw_phy_disable(ah); 
     199  
     200-       /* we can now sync irq and kill any running tasklets, since we already 
     201-        * disabled interrupts and not holding a spin lock */ 
     202-       synchronize_irq(sc->irq); 
     203-       tasklet_kill(&sc->intr_tq); 
     204-       tasklet_kill(&sc->bcon_tasklet); 
     205+       ath9k_hw_configpcipowersave(ah, true); 
     206  
     207-       ath9k_ps_restore(sc); 
     208+       spin_unlock_bh(&sc->sc_pcu_lock); 
     209  
     210-       sc->ps_idle = true; 
     211-       ath_radio_disable(sc, hw); 
     212+       ath9k_ps_restore(sc); 
     213  
     214        sc->sc_flags |= SC_OP_INVALID; 
     215+       sc->ps_idle = prev_idle; 
     216  
     217        mutex_unlock(&sc->mutex); 
     218  
     219@@ -1620,8 +1578,8 @@ static int ath9k_config(struct ieee80211 
     220        struct ath_hw *ah = sc->sc_ah; 
     221        struct ath_common *common = ath9k_hw_common(ah); 
     222        struct ieee80211_conf *conf = &hw->conf; 
     223-       bool disable_radio = false; 
    1160224  
    1161225+       ath9k_ps_wakeup(sc); 
    1162 +       spin_lock(&sc->sc_pcu_lock); 
    1163 + 
    1164         if ((status & ATH9K_INT_FATAL) || 
    1165             (status & ATH9K_INT_BB_WATCHDOG)) { 
    1166                 ieee80211_queue_work(sc->hw, &sc->hw_reset_work); 
    1167 -               return; 
    1168 +               goto out; 
     226        mutex_lock(&sc->mutex); 
     227  
     228        /* 
     229@@ -1632,13 +1590,8 @@ static int ath9k_config(struct ieee80211 
     230         */ 
     231        if (changed & IEEE80211_CONF_CHANGE_IDLE) { 
     232                sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE); 
     233-               if (!sc->ps_idle) { 
     234-                       ath_radio_enable(sc, hw); 
     235-                       ath_dbg(common, ATH_DBG_CONFIG, 
     236-                               "not-idle: enabling radio\n"); 
     237-               } else { 
     238-                       disable_radio = true; 
     239-               } 
     240+               if (sc->ps_idle) 
     241+                       ath_cancel_work(sc); 
     242        } 
     243  
     244        /* 
     245@@ -1745,18 +1698,12 @@ static int ath9k_config(struct ieee80211 
     246                ath_dbg(common, ATH_DBG_CONFIG, 
     247                        "Set power: %d\n", conf->power_level); 
     248                sc->config.txpowlimit = 2 * conf->power_level; 
     249-               ath9k_ps_wakeup(sc); 
     250                ath9k_cmn_update_txpow(ah, sc->curtxpow, 
     251                                       sc->config.txpowlimit, &sc->curtxpow); 
     252-               ath9k_ps_restore(sc); 
     253-       } 
     254- 
     255-       if (disable_radio) { 
     256-               ath_dbg(common, ATH_DBG_CONFIG, "idle: disabling radio\n"); 
     257-               ath_radio_disable(sc, hw); 
     258        } 
     259  
     260        mutex_unlock(&sc->mutex); 
     261+       ath9k_ps_restore(sc); 
     262  
     263        return 0; 
     264 } 
     265@@ -2324,9 +2271,6 @@ static void ath9k_flush(struct ieee80211 
     266                return; 
     267        } 
     268  
     269-       if (drop) 
     270-               timeout = 1; 
     271- 
     272        for (j = 0; j < timeout; j++) { 
     273                bool npend = false; 
     274  
     275@@ -2344,21 +2288,22 @@ static void ath9k_flush(struct ieee80211 
     276                } 
     277  
     278                if (!npend) 
     279-                   goto out; 
     280+                   break; 
    1169281        } 
    1170282  
    1171283-       ath9k_ps_wakeup(sc); 
    1172 -       spin_lock(&sc->sc_pcu_lock); 
    1173 - 
    1174         /* 
    1175          * Only run the baseband hang check if beacons stop working in AP or 
    1176          * IBSS mode, because it has a high false positive rate. For station 
    1177 @@ -725,6 +730,7 @@ void ath9k_tasklet(unsigned long data) 
    1178                 if (status & ATH9K_INT_GENTIMER) 
    1179                         ath_gen_timer_isr(sc->sc_ah); 
    1180   
    1181 +out: 
    1182         /* re-enable hardware interrupt */ 
    1183         ath9k_hw_enable_interrupts(ah); 
    1184   
    1185 @@ -2015,6 +2021,7 @@ static void ath9k_config_bss(struct ath_ 
    1186                 /* Stop ANI */ 
    1187                 sc->sc_flags &= ~SC_OP_ANI_RUN; 
    1188                 del_timer_sync(&common->ani.timer); 
    1189 +               memset(&sc->caldata, 0, sizeof(sc->caldata)); 
    1190         } 
    1191  } 
    1192   
     284-       spin_lock_bh(&sc->sc_pcu_lock); 
     285-       drain_txq = ath_drain_all_txq(sc, false); 
     286-       spin_unlock_bh(&sc->sc_pcu_lock); 
     287+       if (drop) { 
     288+               ath9k_ps_wakeup(sc); 
     289+               spin_lock_bh(&sc->sc_pcu_lock); 
     290+               drain_txq = ath_drain_all_txq(sc, false); 
     291+               spin_unlock_bh(&sc->sc_pcu_lock); 
     292  
     293-       if (!drain_txq) 
     294-               ath_reset(sc, false); 
     295+               if (!drain_txq) 
     296+                       ath_reset(sc, false); 
     297  
     298-       ath9k_ps_restore(sc); 
     299-       ieee80211_wake_queues(hw); 
     300+               ath9k_ps_restore(sc); 
     301+               ieee80211_wake_queues(hw); 
     302+       } 
     303  
     304-out: 
     305        ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); 
     306        mutex_unlock(&sc->mutex); 
     307 } 
    1193308--- a/drivers/net/wireless/ath/ath9k/pci.c 
    1194309+++ b/drivers/net/wireless/ath/ath9k/pci.c 
    1195 @@ -332,16 +332,16 @@ static int ath_pci_resume(struct device  
     310@@ -307,12 +307,11 @@ static int ath_pci_suspend(struct device 
     311        struct ieee80211_hw *hw = pci_get_drvdata(pdev); 
     312        struct ath_softc *sc = hw->priv; 
     313  
     314-       ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); 
     315- 
     316        /* The device has to be moved to FULLSLEEP forcibly. 
     317         * Otherwise the chip never moved to full sleep, 
     318         * when no interface is up. 
     319         */ 
     320+       ath9k_hw_disable(sc->sc_ah); 
     321        ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); 
     322  
     323        return 0; 
     324@@ -334,22 +333,6 @@ static int ath_pci_resume(struct device  
    1196325        if ((val & 0x0000ff00) != 0) 
    1197326                pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); 
    1198327  
    1199 +       ath9k_ps_wakeup(sc); 
    1200         /* Enable LED */ 
    1201         ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin, 
    1202                             AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
    1203 -       ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); 
    1204 +       ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); 
    1205   
    1206           /* 
    1207            * Reset key cache to sane defaults (all entries cleared) instead of 
    1208            * semi-random values after suspend/resume. 
    1209            */ 
    1210328-       ath9k_ps_wakeup(sc); 
    1211         ath9k_cmn_init_crypto(sc->sc_ah); 
    1212         ath9k_ps_restore(sc); 
    1213   
    1214 --- a/drivers/net/wireless/ath/ath9k/recv.c 
    1215 +++ b/drivers/net/wireless/ath/ath9k/recv.c 
    1216 @@ -1839,7 +1839,7 @@ int ath_rx_tasklet(struct ath_softc *sc, 
    1217                  * If we're asked to flush receive queue, directly 
    1218                  * chain it back at the queue without processing it. 
    1219                  */ 
    1220 -               if (flush) 
    1221 +               if (sc->sc_flags & SC_OP_RXFLUSH) 
    1222                         goto requeue_drop_frag; 
    1223   
    1224                 retval = ath9k_rx_skb_preprocess(common, hw, hdr, &rs, 
    1225 @@ -1967,7 +1967,8 @@ requeue: 
    1226                 } else { 
    1227                         list_move_tail(&bf->list, &sc->rx.rxbuf); 
    1228                         ath_rx_buf_link(sc, bf); 
    1229 -                       ath9k_hw_rxena(ah); 
    1230 +                       if (!flush) 
    1231 +                               ath9k_hw_rxena(ah); 
    1232                 } 
    1233         } while (1); 
     329-       /* Enable LED */ 
     330-       ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin, 
     331-                           AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
     332-       ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); 
     333- 
     334-         /* 
     335-          * Reset key cache to sane defaults (all entries cleared) instead of 
     336-          * semi-random values after suspend/resume. 
     337-          */ 
     338-       ath9k_cmn_init_crypto(sc->sc_ah); 
     339-       ath9k_ps_restore(sc); 
     340- 
     341-       sc->ps_idle = true; 
     342-       ath_radio_disable(sc, hw); 
     343- 
     344        return 0; 
     345 } 
    1234346  
    1235347--- a/drivers/net/wireless/ath/ath9k/xmit.c 
    1236348+++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    1237 @@ -56,10 +56,9 @@ static void ath_tx_complete_buf(struct a 
    1238                                 struct ath_tx_status *ts, int txok, int sendbar); 
    1239  static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq, 
    1240                              struct list_head *head, bool internal); 
    1241 -static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, int len); 
    1242  static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf, 
    1243                              struct ath_tx_status *ts, int nframes, int nbad, 
    1244 -                            int txok, bool update_rc); 
    1245 +                            int txok); 
    1246  static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, 
    1247                               int seqno); 
    1248  static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, 
    1249 @@ -263,6 +262,7 @@ static void ath_tx_set_retry(struct ath_ 
    1250                              struct sk_buff *skb) 
    1251  { 
    1252         struct ath_frame_info *fi = get_frame_info(skb); 
    1253 +       struct ath_buf *bf = fi->bf; 
    1254         struct ieee80211_hdr *hdr; 
    1255   
    1256         TX_STAT_INC(txq->axq_qnum, a_retries); 
    1257 @@ -271,6 +271,8 @@ static void ath_tx_set_retry(struct ath_ 
    1258   
    1259         hdr = (struct ieee80211_hdr *)skb->data; 
    1260         hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_RETRY); 
    1261 +       dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, 
    1262 +               sizeof(*hdr), DMA_TO_DEVICE); 
    1263  } 
    1264   
    1265  static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc) 
    1266 @@ -390,11 +392,9 @@ static void ath_tx_complete_aggr(struct  
    1267                 while (bf) { 
    1268                         bf_next = bf->bf_next; 
    1269   
    1270 -                       bf->bf_state.bf_type |= BUF_XRETRY; 
    1271                         if (!bf->bf_stale || bf_next != NULL) 
    1272                                 list_move_tail(&bf->list, &bf_head); 
    1273   
    1274 -                       ath_tx_rc_status(sc, bf, ts, 1, 1, 0, false); 
    1275                         ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, 
    1276                                 0, 0); 
    1277   
    1278 @@ -470,7 +470,6 @@ static void ath_tx_complete_aggr(struct  
    1279                                 clear_filter = true; 
    1280                                 txpending = 1; 
    1281                         } else { 
    1282 -                               bf->bf_state.bf_type |= BUF_XRETRY; 
    1283                                 txfail = 1; 
    1284                                 sendbar = 1; 
    1285                                 txfail_cnt++; 
    1286 @@ -497,17 +496,14 @@ static void ath_tx_complete_aggr(struct  
    1287   
    1288                         if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) { 
    1289                                 memcpy(tx_info->control.rates, rates, sizeof(rates)); 
    1290 -                               ath_tx_rc_status(sc, bf, ts, nframes, nbad, txok, true); 
    1291 +                               ath_tx_rc_status(sc, bf, ts, nframes, nbad, txok); 
    1292                                 rc_update = false; 
    1293 -                       } else { 
    1294 -                               ath_tx_rc_status(sc, bf, ts, nframes, nbad, txok, false); 
    1295                         } 
    1296   
    1297                         ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, 
    1298                                 !txfail, sendbar); 
    1299                 } else { 
    1300                         /* retry the un-acked ones */ 
    1301 -                       ath9k_hw_set_clrdmask(sc->sc_ah, bf->bf_desc, false); 
    1302                         if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) { 
    1303                                 if (bf->bf_next == NULL && bf_last->bf_stale) { 
    1304                                         struct ath_buf *tbf; 
    1305 @@ -523,26 +519,13 @@ static void ath_tx_complete_aggr(struct  
    1306                                                 ath_tx_update_baw(sc, tid, seqno); 
    1307                                                 spin_unlock_bh(&txq->axq_lock); 
    1308   
    1309 -                                               bf->bf_state.bf_type |= 
    1310 -                                                       BUF_XRETRY; 
    1311 -                                               ath_tx_rc_status(sc, bf, ts, nframes, 
    1312 -                                                               nbad, 0, false); 
    1313                                                 ath_tx_complete_buf(sc, bf, txq, 
    1314                                                                     &bf_head, 
    1315 -                                                                   ts, 0, 0); 
    1316 +                                                                   ts, 0, 1); 
    1317                                                 break; 
    1318                                         } 
    1319   
    1320 -                                       ath9k_hw_cleartxdesc(sc->sc_ah, 
    1321 -                                                            tbf->bf_desc); 
    1322                                         fi->bf = tbf; 
    1323 -                               } else { 
    1324 -                                       /* 
    1325 -                                        * Clear descriptor status words for 
    1326 -                                        * software retry 
    1327 -                                        */ 
    1328 -                                       ath9k_hw_cleartxdesc(sc->sc_ah, 
    1329 -                                                            bf->bf_desc); 
    1330                                 } 
    1331                         } 
    1332   
    1333 @@ -778,7 +761,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
    1334                 if (!bf) 
    1335                         continue; 
    1336   
    1337 -               bf->bf_state.bf_type |= BUF_AMPDU; 
    1338 +               bf->bf_state.bf_type = BUF_AMPDU | BUF_AGGR; 
    1339                 seqno = bf->bf_state.seqno; 
    1340                 if (!bf_first) 
    1341                         bf_first = bf; 
    1342 @@ -805,8 +788,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
    1343                 } 
    1344   
    1345                 tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); 
    1346 -               if (nframes && ((tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) || 
    1347 -                       !(tx_info->control.rates[0].flags & IEEE80211_TX_RC_MCS))) 
    1348 +               if (nframes && (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)) 
    1349                         break; 
    1350   
    1351                 /* do not exceed subframe limit */ 
    1352 @@ -828,20 +810,17 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
    1353   
    1354                 nframes++; 
    1355                 bf->bf_next = NULL; 
    1356 -               ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, 0); 
    1357   
    1358                 /* link buffers of this frame to the aggregate */ 
    1359                 if (!fi->retries) 
    1360                         ath_tx_addto_baw(sc, tid, seqno); 
    1361 -               ath9k_hw_set11n_aggr_middle(sc->sc_ah, bf->bf_desc, ndelim); 
    1362 +               bf->bf_state.ndelim = ndelim; 
    1363   
    1364                 __skb_unlink(skb, &tid->buf_q); 
    1365                 list_add_tail(&bf->list, bf_q); 
    1366 -               if (bf_prev) { 
    1367 +               if (bf_prev) 
    1368                         bf_prev->bf_next = bf; 
    1369 -                       ath9k_hw_set_desc_link(sc->sc_ah, bf_prev->bf_desc, 
    1370 -                                              bf->bf_daddr); 
     349@@ -179,6 +179,11 @@ static void ath_tx_flush_tid(struct ath_ 
     350                spin_lock_bh(&txq->axq_lock); 
     351        } 
     352  
     353+       if (tid->baw_head == tid->baw_tail) { 
     354+               tid->state &= ~AGGR_ADDBA_COMPLETE; 
     355+               tid->state &= ~AGGR_CLEANUP; 
     356+       } 
     357+ 
     358        spin_unlock_bh(&txq->axq_lock); 
     359 } 
     360  
     361@@ -556,15 +561,9 @@ static void ath_tx_complete_aggr(struct  
     362                spin_unlock_bh(&txq->axq_lock); 
     363        } 
     364  
     365-       if (tid->state & AGGR_CLEANUP) { 
     366+       if (tid->state & AGGR_CLEANUP) 
     367                ath_tx_flush_tid(sc, tid); 
     368  
     369-               if (tid->baw_head == tid->baw_tail) { 
     370-                       tid->state &= ~AGGR_ADDBA_COMPLETE; 
     371-                       tid->state &= ~AGGR_CLEANUP; 
    1371372-               } 
    1372 + 
    1373                 bf_prev = bf; 
    1374   
    1375         } while (!skb_queue_empty(&tid->buf_q)); 
    1376 @@ -852,12 +831,245 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
    1377  #undef PADBYTES 
    1378  } 
    1379   
    1380 +/* 
    1381 + * rix - rate index 
    1382 + * pktlen - total bytes (delims + data + fcs + pads + pad delims) 
    1383 + * width  - 0 for 20 MHz, 1 for 40 MHz 
    1384 + * half_gi - to use 4us v/s 3.6 us for symbol time 
     373-       } 
     374- 
     375        rcu_read_unlock(); 
     376  
     377        if (needreset) { 
     378@@ -1955,7 +1954,7 @@ static void ath_tx_complete(struct ath_s 
     379                skb_pull(skb, padsize); 
     380        } 
     381  
     382-       if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) { 
     383+       if ((sc->ps_flags & PS_WAIT_FOR_TX_ACK) && !txq->axq_depth) { 
     384                sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK; 
     385                ath_dbg(common, ATH_DBG_PS, 
     386                        "Going back to sleep after having received TX status (0x%lx)\n", 
     387--- a/include/net/cfg80211.h 
     388+++ b/include/net/cfg80211.h 
     389@@ -1130,6 +1130,7 @@ struct cfg80211_ibss_params { 
     390        u8 *ssid; 
     391        u8 *bssid; 
     392        struct ieee80211_channel *channel; 
     393+       enum nl80211_channel_type channel_type; 
     394        u8 *ie; 
     395        u8 ssid_len, ie_len; 
     396        u16 beacon_interval; 
     397@@ -3292,6 +3293,16 @@ void cfg80211_report_obss_beacon(struct  
     398                                 const u8 *frame, size_t len, 
     399                                 int freq, gfp_t gfp); 
     400  
     401+/** 
     402+ * cfg80211_can_use_ext_chan - test if ht40 on extension channel can be used 
     403+ * @wiphy: the wiphy 
     404+ * @chan: main channel 
     405+ * @channel_type: HT mode 
    1385406+ */ 
    1386 +static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, int pktlen, 
    1387 +                           int width, int half_gi, bool shortPreamble) 
    1388 +{ 
    1389 +       u32 nbits, nsymbits, duration, nsymbols; 
    1390 +       int streams; 
    1391 + 
    1392 +       /* find number of symbols: PLCP + data */ 
    1393 +       streams = HT_RC_2_STREAMS(rix); 
    1394 +       nbits = (pktlen << 3) + OFDM_PLCP_BITS; 
    1395 +       nsymbits = bits_per_symbol[rix % 8][width] * streams; 
    1396 +       nsymbols = (nbits + nsymbits - 1) / nsymbits; 
    1397 + 
    1398 +       if (!half_gi) 
    1399 +               duration = SYMBOL_TIME(nsymbols); 
    1400 +       else 
    1401 +               duration = SYMBOL_TIME_HALFGI(nsymbols); 
    1402 + 
    1403 +       /* addup duration for legacy/ht training and signal fields */ 
    1404 +       duration += L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams); 
    1405 + 
    1406 +       return duration; 
    1407 +} 
    1408 + 
    1409 +static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, 
    1410 +                            struct ath_tx_info *info, int len) 
    1411 +{ 
    1412 +       struct ath_hw *ah = sc->sc_ah; 
    1413 +       struct sk_buff *skb; 
    1414 +       struct ieee80211_tx_info *tx_info; 
    1415 +       struct ieee80211_tx_rate *rates; 
    1416 +       const struct ieee80211_rate *rate; 
    1417 +       struct ieee80211_hdr *hdr; 
    1418 +       int i; 
    1419 +       u8 rix = 0; 
    1420 + 
    1421 +       skb = bf->bf_mpdu; 
    1422 +       tx_info = IEEE80211_SKB_CB(skb); 
    1423 +       rates = tx_info->control.rates; 
    1424 +       hdr = (struct ieee80211_hdr *)skb->data; 
    1425 + 
    1426 +       /* set dur_update_en for l-sig computation except for PS-Poll frames */ 
    1427 +       info->dur_update = !ieee80211_is_pspoll(hdr->frame_control); 
    1428 + 
    1429 +       /* 
    1430 +        * We check if Short Preamble is needed for the CTS rate by 
    1431 +        * checking the BSS's global flag. 
    1432 +        * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. 
    1433 +        */ 
    1434 +       rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info); 
    1435 +       info->rtscts_rate = rate->hw_value; 
    1436 +       if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) 
    1437 +               info->rtscts_rate |= rate->hw_value_short; 
    1438 + 
    1439 +       for (i = 0; i < 4; i++) { 
    1440 +               bool is_40, is_sgi, is_sp; 
    1441 +               int phy; 
    1442 + 
    1443 +               if (!rates[i].count || (rates[i].idx < 0)) 
    1444 +                       continue; 
    1445 + 
    1446 +               rix = rates[i].idx; 
    1447 +               info->rates[i].Tries = rates[i].count; 
    1448 + 
    1449 +                   if (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS) { 
    1450 +                       info->rates[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; 
    1451 +                       info->flags |= ATH9K_TXDESC_RTSENA; 
    1452 +               } else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { 
    1453 +                       info->rates[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; 
    1454 +                       info->flags |= ATH9K_TXDESC_CTSENA; 
    1455 +               } 
    1456 + 
    1457 +               if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) 
    1458 +                       info->rates[i].RateFlags |= ATH9K_RATESERIES_2040; 
    1459 +               if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) 
    1460 +                       info->rates[i].RateFlags |= ATH9K_RATESERIES_HALFGI; 
    1461 + 
    1462 +               is_sgi = !!(rates[i].flags & IEEE80211_TX_RC_SHORT_GI); 
    1463 +               is_40 = !!(rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH); 
    1464 +               is_sp = !!(rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE); 
    1465 + 
    1466 +               if (rates[i].flags & IEEE80211_TX_RC_MCS) { 
    1467 +                       /* MCS rates */ 
    1468 +                       info->rates[i].Rate = rix | 0x80; 
    1469 +                       info->rates[i].ChSel = ath_txchainmask_reduction(sc, 
    1470 +                                       ah->txchainmask, info->rates[i].Rate); 
    1471 +                       info->rates[i].PktDuration = ath_pkt_duration(sc, rix, len, 
    1472 +                                is_40, is_sgi, is_sp); 
    1473 +                       if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC)) 
    1474 +                               info->rates[i].RateFlags |= ATH9K_RATESERIES_STBC; 
    1475 +                       continue; 
    1476 +               } 
    1477 + 
    1478 +               /* legacy rates */ 
    1479 +               if ((tx_info->band == IEEE80211_BAND_2GHZ) && 
    1480 +                   !(rate->flags & IEEE80211_RATE_ERP_G)) 
    1481 +                       phy = WLAN_RC_PHY_CCK; 
    1482 +               else 
    1483 +                       phy = WLAN_RC_PHY_OFDM; 
    1484 + 
    1485 +               rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx]; 
    1486 +               info->rates[i].Rate = rate->hw_value; 
    1487 +               if (rate->hw_value_short) { 
    1488 +                       if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) 
    1489 +                               info->rates[i].Rate |= rate->hw_value_short; 
    1490 +               } else { 
    1491 +                       is_sp = false; 
    1492 +               } 
    1493 + 
    1494 +               if (bf->bf_state.bfs_paprd) 
    1495 +                       info->rates[i].ChSel = ah->txchainmask; 
    1496 +               else 
    1497 +                       info->rates[i].ChSel = ath_txchainmask_reduction(sc, 
    1498 +                                       ah->txchainmask, info->rates[i].Rate); 
    1499 + 
    1500 +               info->rates[i].PktDuration = ath9k_hw_computetxtime(sc->sc_ah, 
    1501 +                       phy, rate->bitrate * 100, len, rix, is_sp); 
    1502 +       } 
    1503 + 
    1504 +       /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ 
    1505 +       if (bf_isaggr(bf) && (len > sc->sc_ah->caps.rts_aggr_limit)) 
    1506 +               info->flags &= ~ATH9K_TXDESC_RTSENA; 
    1507 + 
    1508 +       /* ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. */ 
    1509 +       if (info->flags & ATH9K_TXDESC_RTSENA) 
    1510 +               info->flags &= ~ATH9K_TXDESC_CTSENA; 
    1511 +} 
    1512 + 
    1513 +static enum ath9k_pkt_type get_hw_packet_type(struct sk_buff *skb) 
    1514 +{ 
    1515 +       struct ieee80211_hdr *hdr; 
    1516 +       enum ath9k_pkt_type htype; 
    1517 +       __le16 fc; 
    1518 + 
    1519 +       hdr = (struct ieee80211_hdr *)skb->data; 
    1520 +       fc = hdr->frame_control; 
    1521 + 
    1522 +       if (ieee80211_is_beacon(fc)) 
    1523 +               htype = ATH9K_PKT_TYPE_BEACON; 
    1524 +       else if (ieee80211_is_probe_resp(fc)) 
    1525 +               htype = ATH9K_PKT_TYPE_PROBE_RESP; 
    1526 +       else if (ieee80211_is_atim(fc)) 
    1527 +               htype = ATH9K_PKT_TYPE_ATIM; 
    1528 +       else if (ieee80211_is_pspoll(fc)) 
    1529 +               htype = ATH9K_PKT_TYPE_PSPOLL; 
    1530 +       else 
    1531 +               htype = ATH9K_PKT_TYPE_NORMAL; 
    1532 + 
    1533 +       return htype; 
    1534 +} 
    1535 + 
    1536 +static void ath_tx_fill_desc(struct ath_softc *sc, struct ath_buf *bf, 
    1537 +                            struct ath_txq *txq, int len) 
    1538 +{ 
    1539 +       struct ath_hw *ah = sc->sc_ah; 
    1540 +       struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); 
    1541 +       struct ath_buf *bf_first = bf; 
    1542 +       struct ath_tx_info info; 
    1543 +       bool aggr = !!(bf->bf_state.bf_type & BUF_AGGR); 
    1544 + 
    1545 +       memset(&info, 0, sizeof(info)); 
    1546 +       info.is_first = true; 
    1547 +       info.is_last = true; 
    1548 +       info.txpower = MAX_RATE_POWER; 
    1549 +       info.qcu = txq->axq_qnum; 
    1550 + 
    1551 +       info.flags = ATH9K_TXDESC_INTREQ; 
    1552 +       if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) 
    1553 +               info.flags |= ATH9K_TXDESC_NOACK; 
    1554 +       if (tx_info->flags & IEEE80211_TX_CTL_LDPC) 
    1555 +               info.flags |= ATH9K_TXDESC_LDPC; 
    1556 + 
    1557 +       ath_buf_set_rate(sc, bf, &info, len); 
    1558 + 
    1559 +       if (tx_info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) 
    1560 +               info.flags |= ATH9K_TXDESC_CLRDMASK; 
    1561 + 
    1562 +       if (bf->bf_state.bfs_paprd) 
    1563 +               info.flags |= (u32) bf->bf_state.bfs_paprd << ATH9K_TXDESC_PAPRD_S; 
    1564 + 
    1565 + 
    1566 +       while (bf) { 
    1567 +               struct sk_buff *skb = bf->bf_mpdu; 
    1568 +               struct ath_frame_info *fi = get_frame_info(skb); 
    1569 +               struct ieee80211_hdr *hdr; 
    1570 +               int padpos, padsize; 
    1571 + 
    1572 +               info.type = get_hw_packet_type(skb); 
    1573 +               if (bf->bf_next) 
    1574 +                       info.link = bf->bf_next->bf_daddr; 
    1575 +               else 
    1576 +                       info.link = 0; 
    1577 + 
    1578 +               if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 
    1579 +                       hdr = (struct ieee80211_hdr *)skb->data; 
    1580 +                       padpos = ath9k_cmn_padpos(hdr->frame_control); 
    1581 +                       padsize = padpos & 3; 
    1582 + 
    1583 +                       info.buf_addr[0] = bf->bf_buf_addr; 
    1584 +                       info.buf_len[0] = padpos + padsize; 
    1585 +                       info.buf_addr[1] = info.buf_addr[0] + padpos; 
    1586 +                       info.buf_len[1] = skb->len - padpos; 
    1587 +               } else { 
    1588 +                       info.buf_addr[0] = bf->bf_buf_addr; 
    1589 +                       info.buf_len[0] = skb->len; 
    1590 +               } 
    1591 + 
    1592 +               info.pkt_len = fi->framelen; 
    1593 +               info.keyix = fi->keyix; 
    1594 +               info.keytype = fi->keytype; 
    1595 + 
    1596 +               if (aggr) { 
    1597 +                       if (bf == bf_first) 
    1598 +                               info.aggr = AGGR_BUF_FIRST; 
    1599 +                       else if (!bf->bf_next) 
    1600 +                               info.aggr = AGGR_BUF_LAST; 
    1601 +                       else 
    1602 +                               info.aggr = AGGR_BUF_MIDDLE; 
    1603 + 
    1604 +                       info.ndelim = bf->bf_state.ndelim; 
    1605 +                       info.aggr_len = len; 
    1606 +               } 
    1607 + 
    1608 +               ath9k_hw_set_txdesc(ah, bf->bf_desc, &info); 
    1609 +               bf = bf->bf_next; 
    1610 +       } 
    1611 +} 
    1612 + 
    1613  static void ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq, 
    1614                               struct ath_atx_tid *tid) 
    1615  { 
    1616         struct ath_buf *bf; 
    1617         enum ATH_AGGR_STATUS status; 
    1618 -       struct ath_frame_info *fi; 
    1619 +       struct ieee80211_tx_info *tx_info; 
    1620         struct list_head bf_q; 
    1621         int aggr_len; 
    1622   
    1623 @@ -878,34 +1090,25 @@ static void ath_tx_sched_aggr(struct ath 
    1624   
    1625                 bf = list_first_entry(&bf_q, struct ath_buf, list); 
    1626                 bf->bf_lastbf = list_entry(bf_q.prev, struct ath_buf, list); 
    1627 +               tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); 
    1628   
    1629                 if (tid->ac->clear_ps_filter) { 
    1630                         tid->ac->clear_ps_filter = false; 
    1631 -                       ath9k_hw_set_clrdmask(sc->sc_ah, bf->bf_desc, true); 
    1632 +                       tx_info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; 
    1633 +               } else { 
    1634 +                       tx_info->flags &= ~IEEE80211_TX_CTL_CLEAR_PS_FILT; 
    1635                 } 
    1636   
    1637                 /* if only one frame, send as non-aggregate */ 
    1638                 if (bf == bf->bf_lastbf) { 
    1639 -                       fi = get_frame_info(bf->bf_mpdu); 
    1640 - 
    1641 -                       bf->bf_state.bf_type &= ~BUF_AGGR; 
    1642 -                       ath9k_hw_clr11n_aggr(sc->sc_ah, bf->bf_desc); 
    1643 -                       ath_buf_set_rate(sc, bf, fi->framelen); 
    1644 -                       ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
    1645 -                       continue; 
    1646 +                       aggr_len = get_frame_info(bf->bf_mpdu)->framelen; 
    1647 +                       bf->bf_state.bf_type = BUF_AMPDU; 
    1648 +               } else { 
    1649 +                       TX_STAT_INC(txq->axq_qnum, a_aggr); 
    1650                 } 
    1651   
    1652 -               /* setup first desc of aggregate */ 
    1653 -               bf->bf_state.bf_type |= BUF_AGGR; 
    1654 -               ath_buf_set_rate(sc, bf, aggr_len); 
    1655 -               ath9k_hw_set11n_aggr_first(sc->sc_ah, bf->bf_desc, aggr_len); 
    1656 - 
    1657 -               /* anchor last desc of aggregate */ 
    1658 -               ath9k_hw_set11n_aggr_last(sc->sc_ah, bf->bf_lastbf->bf_desc); 
    1659 - 
    1660 +               ath_tx_fill_desc(sc, bf, txq, aggr_len); 
    1661                 ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
    1662 -               TX_STAT_INC(txq->axq_qnum, a_aggr); 
    1663 - 
    1664         } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH && 
    1665                  status != ATH_AGGR_BAW_CLOSED); 
    1666  } 
    1667 @@ -1483,7 +1686,7 @@ static void ath_tx_send_ampdu(struct ath 
    1668         if (!bf) 
    1669                 return; 
    1670   
    1671 -       bf->bf_state.bf_type |= BUF_AMPDU; 
    1672 +       bf->bf_state.bf_type = BUF_AMPDU; 
    1673         INIT_LIST_HEAD(&bf_head); 
    1674         list_add(&bf->list, &bf_head); 
    1675   
    1676 @@ -1493,7 +1696,7 @@ static void ath_tx_send_ampdu(struct ath 
    1677         /* Queue to h/w without aggregation */ 
    1678         TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw); 
    1679         bf->bf_lastbf = bf; 
    1680 -       ath_buf_set_rate(sc, bf, fi->framelen); 
    1681 +       ath_tx_fill_desc(sc, bf, txctl->txq, fi->framelen); 
    1682         ath_tx_txqaddbuf(sc, txctl->txq, &bf_head, false); 
    1683  } 
    1684   
    1685 @@ -1513,41 +1716,18 @@ static void ath_tx_send_normal(struct at 
    1686   
    1687         INIT_LIST_HEAD(&bf_head); 
    1688         list_add_tail(&bf->list, &bf_head); 
    1689 -       bf->bf_state.bf_type &= ~BUF_AMPDU; 
    1690 +       bf->bf_state.bf_type = 0; 
    1691   
    1692         /* update starting sequence number for subsequent ADDBA request */ 
    1693         if (tid) 
    1694                 INCR(tid->seq_start, IEEE80211_SEQ_MAX); 
    1695   
    1696         bf->bf_lastbf = bf; 
    1697 -       ath_buf_set_rate(sc, bf, fi->framelen); 
    1698 +       ath_tx_fill_desc(sc, bf, txq, fi->framelen); 
    1699         ath_tx_txqaddbuf(sc, txq, &bf_head, false); 
    1700         TX_STAT_INC(txq->axq_qnum, queued); 
    1701  } 
    1702   
    1703 -static enum ath9k_pkt_type get_hw_packet_type(struct sk_buff *skb) 
    1704 -{ 
    1705 -       struct ieee80211_hdr *hdr; 
    1706 -       enum ath9k_pkt_type htype; 
    1707 -       __le16 fc; 
    1708 - 
    1709 -       hdr = (struct ieee80211_hdr *)skb->data; 
    1710 -       fc = hdr->frame_control; 
    1711 - 
    1712 -       if (ieee80211_is_beacon(fc)) 
    1713 -               htype = ATH9K_PKT_TYPE_BEACON; 
    1714 -       else if (ieee80211_is_probe_resp(fc)) 
    1715 -               htype = ATH9K_PKT_TYPE_PROBE_RESP; 
    1716 -       else if (ieee80211_is_atim(fc)) 
    1717 -               htype = ATH9K_PKT_TYPE_ATIM; 
    1718 -       else if (ieee80211_is_pspoll(fc)) 
    1719 -               htype = ATH9K_PKT_TYPE_PSPOLL; 
    1720 -       else 
    1721 -               htype = ATH9K_PKT_TYPE_NORMAL; 
    1722 - 
    1723 -       return htype; 
    1724 -} 
    1725 - 
    1726  static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb, 
    1727                              int framelen) 
    1728  { 
    1729 @@ -1575,51 +1755,6 @@ static void setup_frame_info(struct ieee 
    1730         fi->framelen = framelen; 
    1731  } 
    1732   
    1733 -static int setup_tx_flags(struct sk_buff *skb) 
    1734 -{ 
    1735 -       struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 
    1736 -       int flags = 0; 
    1737 - 
    1738 -       flags |= ATH9K_TXDESC_INTREQ; 
    1739 - 
    1740 -       if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) 
    1741 -               flags |= ATH9K_TXDESC_NOACK; 
    1742 - 
    1743 -       if (tx_info->flags & IEEE80211_TX_CTL_LDPC) 
    1744 -               flags |= ATH9K_TXDESC_LDPC; 
    1745 - 
    1746 -       return flags; 
    1747 -} 
    1748 - 
    1749 -/* 
    1750 - * rix - rate index 
    1751 - * pktlen - total bytes (delims + data + fcs + pads + pad delims) 
    1752 - * width  - 0 for 20 MHz, 1 for 40 MHz 
    1753 - * half_gi - to use 4us v/s 3.6 us for symbol time 
    1754 - */ 
    1755 -static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, int pktlen, 
    1756 -                           int width, int half_gi, bool shortPreamble) 
    1757 -{ 
    1758 -       u32 nbits, nsymbits, duration, nsymbols; 
    1759 -       int streams; 
    1760 - 
    1761 -       /* find number of symbols: PLCP + data */ 
    1762 -       streams = HT_RC_2_STREAMS(rix); 
    1763 -       nbits = (pktlen << 3) + OFDM_PLCP_BITS; 
    1764 -       nsymbits = bits_per_symbol[rix % 8][width] * streams; 
    1765 -       nsymbols = (nbits + nsymbits - 1) / nsymbits; 
    1766 - 
    1767 -       if (!half_gi) 
    1768 -               duration = SYMBOL_TIME(nsymbols); 
    1769 -       else 
    1770 -               duration = SYMBOL_TIME_HALFGI(nsymbols); 
    1771 - 
    1772 -       /* addup duration for legacy/ht training and signal fields */ 
    1773 -       duration += L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams); 
    1774 - 
    1775 -       return duration; 
    1776 -} 
    1777 - 
    1778  u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate) 
    1779  { 
    1780         struct ath_hw *ah = sc->sc_ah; 
    1781 @@ -1632,118 +1767,6 @@ u8 ath_txchainmask_reduction(struct ath_ 
    1782                 return chainmask; 
    1783  } 
    1784   
    1785 -static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, int len) 
    1786 -{ 
    1787 -       struct ath_hw *ah = sc->sc_ah; 
    1788 -       struct ath9k_11n_rate_series series[4]; 
    1789 -       struct sk_buff *skb; 
    1790 -       struct ieee80211_tx_info *tx_info; 
    1791 -       struct ieee80211_tx_rate *rates; 
    1792 -       const struct ieee80211_rate *rate; 
    1793 -       struct ieee80211_hdr *hdr; 
    1794 -       int i, flags = 0; 
    1795 -       u8 rix = 0, ctsrate = 0; 
    1796 -       bool is_pspoll; 
    1797 - 
    1798 -       memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); 
    1799 - 
    1800 -       skb = bf->bf_mpdu; 
    1801 -       tx_info = IEEE80211_SKB_CB(skb); 
    1802 -       rates = tx_info->control.rates; 
    1803 -       hdr = (struct ieee80211_hdr *)skb->data; 
    1804 -       is_pspoll = ieee80211_is_pspoll(hdr->frame_control); 
    1805 - 
    1806 -       /* 
    1807 -        * We check if Short Preamble is needed for the CTS rate by 
    1808 -        * checking the BSS's global flag. 
    1809 -        * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. 
    1810 -        */ 
    1811 -       rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info); 
    1812 -       ctsrate = rate->hw_value; 
    1813 -       if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) 
    1814 -               ctsrate |= rate->hw_value_short; 
    1815 - 
    1816 -       for (i = 0; i < 4; i++) { 
    1817 -               bool is_40, is_sgi, is_sp; 
    1818 -               int phy; 
    1819 - 
    1820 -               if (!rates[i].count || (rates[i].idx < 0)) 
    1821 -                       continue; 
    1822 - 
    1823 -               rix = rates[i].idx; 
    1824 -               series[i].Tries = rates[i].count; 
    1825 - 
    1826 -                   if (rates[i].flags & IEEE80211_TX_RC_USE_RTS_CTS) { 
    1827 -                       series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; 
    1828 -                       flags |= ATH9K_TXDESC_RTSENA; 
    1829 -               } else if (rates[i].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { 
    1830 -                       series[i].RateFlags |= ATH9K_RATESERIES_RTS_CTS; 
    1831 -                       flags |= ATH9K_TXDESC_CTSENA; 
    1832 -               } 
    1833 - 
    1834 -               if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) 
    1835 -                       series[i].RateFlags |= ATH9K_RATESERIES_2040; 
    1836 -               if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) 
    1837 -                       series[i].RateFlags |= ATH9K_RATESERIES_HALFGI; 
    1838 - 
    1839 -               is_sgi = !!(rates[i].flags & IEEE80211_TX_RC_SHORT_GI); 
    1840 -               is_40 = !!(rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH); 
    1841 -               is_sp = !!(rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE); 
    1842 - 
    1843 -               if (rates[i].flags & IEEE80211_TX_RC_MCS) { 
    1844 -                       /* MCS rates */ 
    1845 -                       series[i].Rate = rix | 0x80; 
    1846 -                       series[i].ChSel = ath_txchainmask_reduction(sc, 
    1847 -                                       ah->txchainmask, series[i].Rate); 
    1848 -                       series[i].PktDuration = ath_pkt_duration(sc, rix, len, 
    1849 -                                is_40, is_sgi, is_sp); 
    1850 -                       if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC)) 
    1851 -                               series[i].RateFlags |= ATH9K_RATESERIES_STBC; 
    1852 -                       continue; 
    1853 -               } 
    1854 - 
    1855 -               /* legacy rates */ 
    1856 -               if ((tx_info->band == IEEE80211_BAND_2GHZ) && 
    1857 -                   !(rate->flags & IEEE80211_RATE_ERP_G)) 
    1858 -                       phy = WLAN_RC_PHY_CCK; 
    1859 -               else 
    1860 -                       phy = WLAN_RC_PHY_OFDM; 
    1861 - 
    1862 -               rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx]; 
    1863 -               series[i].Rate = rate->hw_value; 
    1864 -               if (rate->hw_value_short) { 
    1865 -                       if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) 
    1866 -                               series[i].Rate |= rate->hw_value_short; 
    1867 -               } else { 
    1868 -                       is_sp = false; 
    1869 -               } 
    1870 - 
    1871 -               if (bf->bf_state.bfs_paprd) 
    1872 -                       series[i].ChSel = ah->txchainmask; 
    1873 -               else 
    1874 -                       series[i].ChSel = ath_txchainmask_reduction(sc, 
    1875 -                                       ah->txchainmask, series[i].Rate); 
    1876 - 
    1877 -               series[i].PktDuration = ath9k_hw_computetxtime(sc->sc_ah, 
    1878 -                       phy, rate->bitrate * 100, len, rix, is_sp); 
    1879 -       } 
    1880 - 
    1881 -       /* For AR5416 - RTS cannot be followed by a frame larger than 8K */ 
    1882 -       if (bf_isaggr(bf) && (len > sc->sc_ah->caps.rts_aggr_limit)) 
    1883 -               flags &= ~ATH9K_TXDESC_RTSENA; 
    1884 - 
    1885 -       /* ATH9K_TXDESC_RTSENA and ATH9K_TXDESC_CTSENA are mutually exclusive. */ 
    1886 -       if (flags & ATH9K_TXDESC_RTSENA) 
    1887 -               flags &= ~ATH9K_TXDESC_CTSENA; 
    1888 - 
    1889 -       /* set dur_update_en for l-sig computation except for PS-Poll frames */ 
    1890 -       ath9k_hw_set11n_ratescenario(sc->sc_ah, bf->bf_desc, 
    1891 -                                    bf->bf_lastbf->bf_desc, 
    1892 -                                    !is_pspoll, ctsrate, 
    1893 -                                    0, series, 4, flags); 
    1894 - 
    1895 -} 
    1896 - 
    1897  /* 
    1898   * Assign a descriptor (and sequence number if necessary, 
    1899   * and map buffer for DMA. Frees skb on error 
    1900 @@ -1753,13 +1776,10 @@ static struct ath_buf *ath_tx_setup_buff 
    1901                                            struct ath_atx_tid *tid, 
    1902                                            struct sk_buff *skb) 
    1903  { 
    1904 -       struct ath_hw *ah = sc->sc_ah; 
    1905         struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
    1906         struct ath_frame_info *fi = get_frame_info(skb); 
    1907         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    1908         struct ath_buf *bf; 
    1909 -       struct ath_desc *ds; 
    1910 -       int frm_type; 
    1911         u16 seqno; 
    1912   
    1913         bf = ath_tx_get_buffer(sc); 
    1914 @@ -1777,7 +1797,6 @@ static struct ath_buf *ath_tx_setup_buff 
    1915                 bf->bf_state.seqno = seqno; 
    1916         } 
    1917   
    1918 -       bf->bf_flags = setup_tx_flags(skb); 
    1919         bf->bf_mpdu = skb; 
    1920   
    1921         bf->bf_buf_addr = dma_map_single(sc->dev, skb->data, 
    1922 @@ -1791,22 +1810,6 @@ static struct ath_buf *ath_tx_setup_buff 
    1923                 goto error; 
    1924         } 
    1925   
    1926 -       frm_type = get_hw_packet_type(skb); 
    1927 - 
    1928 -       ds = bf->bf_desc; 
    1929 -       ath9k_hw_set_desc_link(ah, ds, 0); 
    1930 - 
    1931 -       ath9k_hw_set11n_txdesc(ah, ds, fi->framelen, frm_type, MAX_RATE_POWER, 
    1932 -                              fi->keyix, fi->keytype, bf->bf_flags); 
    1933 - 
    1934 -       ath9k_hw_filltxdesc(ah, ds, 
    1935 -                           skb->len,   /* segment length */ 
    1936 -                           true,       /* first segment */ 
    1937 -                           true,       /* last segment */ 
    1938 -                           ds,         /* first descriptor */ 
    1939 -                           bf->bf_buf_addr, 
    1940 -                           txq->axq_qnum); 
    1941 - 
    1942         fi->bf = bf; 
    1943   
    1944         return bf; 
    1945 @@ -1849,16 +1852,9 @@ static void ath_tx_start_dma(struct ath_ 
    1946   
    1947                 bf->bf_state.bfs_paprd = txctl->paprd; 
    1948   
    1949 -               if (bf->bf_state.bfs_paprd) 
    1950 -                       ar9003_hw_set_paprd_txdesc(sc->sc_ah, bf->bf_desc, 
    1951 -                                                  bf->bf_state.bfs_paprd); 
    1952 - 
    1953                 if (txctl->paprd) 
    1954                         bf->bf_state.bfs_paprd_timestamp = jiffies; 
    1955   
    1956 -               if (tx_info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) 
    1957 -                       ath9k_hw_set_clrdmask(sc->sc_ah, bf->bf_desc, true); 
    1958 - 
    1959                 ath_tx_send_normal(sc, txctl->txq, tid, skb); 
    1960         } 
    1961   
    1962 @@ -1899,15 +1895,18 @@ int ath_tx_start(struct ieee80211_hw *hw 
    1963                 hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no); 
    1964         } 
    1965   
    1966 -       /* Add the padding after the header if this is not already done */ 
    1967 -       padpos = ath9k_cmn_padpos(hdr->frame_control); 
    1968 -       padsize = padpos & 3; 
    1969 -       if (padsize && skb->len > padpos) { 
    1970 -               if (skb_headroom(skb) < padsize) 
    1971 -                       return -ENOMEM; 
    1972 - 
    1973 -               skb_push(skb, padsize); 
    1974 -               memmove(skb->data, skb->data + padsize, padpos); 
    1975 +       if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) { 
    1976 +               /* Add the padding after the header if this is not already done */ 
    1977 +               padpos = ath9k_cmn_padpos(hdr->frame_control); 
    1978 +               padsize = padpos & 3; 
    1979 +               if (padsize && skb->len > padpos) { 
    1980 +                       if (skb_headroom(skb) < padsize) 
    1981 +                               return -ENOMEM; 
    1982 + 
    1983 +                       skb_push(skb, padsize); 
    1984 +                       memmove(skb->data, skb->data + padsize, padpos); 
    1985 +                       hdr = (struct ieee80211_hdr *) skb->data; 
    1986 +               } 
    1987         } 
    1988   
    1989         if ((vif && vif->type != NL80211_IFTYPE_AP && 
    1990 @@ -1953,20 +1952,21 @@ static void ath_tx_complete(struct ath_s 
    1991         if (tx_flags & ATH_TX_BAR) 
    1992                 tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK; 
    1993   
    1994 -       if (!(tx_flags & (ATH_TX_ERROR | ATH_TX_XRETRY))) { 
    1995 +       if (!(tx_flags & ATH_TX_ERROR)) 
    1996                 /* Frame was ACKed */ 
    1997                 tx_info->flags |= IEEE80211_TX_STAT_ACK; 
    1998 -       } 
    1999   
    2000 -       padpos = ath9k_cmn_padpos(hdr->frame_control); 
    2001 -       padsize = padpos & 3; 
    2002 -       if (padsize && skb->len>padpos+padsize) { 
    2003 -               /* 
    2004 -                * Remove MAC header padding before giving the frame back to 
    2005 -                * mac80211. 
    2006 -                */ 
    2007 -               memmove(skb->data + padsize, skb->data, padpos); 
    2008 -               skb_pull(skb, padsize); 
    2009 +       if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) { 
    2010 +               padpos = ath9k_cmn_padpos(hdr->frame_control); 
    2011 +               padsize = padpos & 3; 
    2012 +               if (padsize && skb->len>padpos+padsize) { 
    2013 +                       /* 
    2014 +                        * Remove MAC header padding before giving the frame back to 
    2015 +                        * mac80211. 
    2016 +                        */ 
    2017 +                       memmove(skb->data + padsize, skb->data, padpos); 
    2018 +                       skb_pull(skb, padsize); 
    2019 +               } 
    2020         } 
    2021   
    2022         if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) { 
    2023 @@ -2000,18 +2000,18 @@ static void ath_tx_complete_buf(struct a 
    2024                                 struct ath_tx_status *ts, int txok, int sendbar) 
    2025  { 
    2026         struct sk_buff *skb = bf->bf_mpdu; 
    2027 +       struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 
    2028         unsigned long flags; 
    2029         int tx_flags = 0; 
    2030   
    2031         if (sendbar) 
    2032                 tx_flags = ATH_TX_BAR; 
    2033   
    2034 -       if (!txok) { 
    2035 +       if (!txok) 
    2036                 tx_flags |= ATH_TX_ERROR; 
    2037   
    2038 -               if (bf_isxretried(bf)) 
    2039 -                       tx_flags |= ATH_TX_XRETRY; 
    2040 -       } 
    2041 +       if (ts->ts_status & ATH9K_TXERR_FILT) 
    2042 +               tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED; 
    2043   
    2044         dma_unmap_single(sc->dev, bf->bf_buf_addr, skb->len, DMA_TO_DEVICE); 
    2045         bf->bf_buf_addr = 0; 
    2046 @@ -2024,7 +2024,7 @@ static void ath_tx_complete_buf(struct a 
    2047                 else 
    2048                         complete(&sc->paprd_complete); 
    2049         } else { 
    2050 -               ath_debug_stat_tx(sc, bf, ts, txq); 
    2051 +               ath_debug_stat_tx(sc, bf, ts, txq, tx_flags); 
    2052                 ath_tx_complete(sc, skb, tx_flags, txq); 
    2053         } 
    2054         /* At this point, skb (bf->bf_mpdu) is consumed...make sure we don't 
    2055 @@ -2042,7 +2042,7 @@ static void ath_tx_complete_buf(struct a 
    2056   
    2057  static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf, 
    2058                              struct ath_tx_status *ts, int nframes, int nbad, 
    2059 -                            int txok, bool update_rc) 
    2060 +                            int txok) 
    2061  { 
    2062         struct sk_buff *skb = bf->bf_mpdu; 
    2063         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    2064 @@ -2057,9 +2057,7 @@ static void ath_tx_rc_status(struct ath_ 
    2065         tx_rateindex = ts->ts_rateindex; 
    2066         WARN_ON(tx_rateindex >= hw->max_rates); 
    2067   
    2068 -       if (ts->ts_status & ATH9K_TXERR_FILT) 
    2069 -               tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED; 
    2070 -       if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc) { 
    2071 +       if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) { 
    2072                 tx_info->flags |= IEEE80211_TX_STAT_AMPDU; 
    2073   
    2074                 BUG_ON(nbad > nframes); 
    2075 @@ -2069,7 +2067,7 @@ static void ath_tx_rc_status(struct ath_ 
    2076         } 
    2077   
    2078         if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 && 
    2079 -           (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) { 
    2080 +           (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) == 0) { 
    2081                 /* 
    2082                  * If an underrun error is seen assume it as an excessive 
    2083                  * retry only if max frame trigger level has been reached 
    2084 @@ -2082,9 +2080,9 @@ static void ath_tx_rc_status(struct ath_ 
    2085                  * successfully by eventually preferring slower rates. 
    2086                  * This itself should also alleviate congestion on the bus. 
    2087                  */ 
    2088 -               if (ieee80211_is_data(hdr->frame_control) && 
    2089 -                   (ts->ts_flags & (ATH9K_TX_DATA_UNDERRUN | 
    2090 -                                    ATH9K_TX_DELIM_UNDERRUN)) && 
    2091 +               if (unlikely(ts->ts_flags & (ATH9K_TX_DATA_UNDERRUN | 
    2092 +                                            ATH9K_TX_DELIM_UNDERRUN)) && 
    2093 +                   ieee80211_is_data(hdr->frame_control) && 
    2094                     ah->tx_trig_level >= sc->sc_ah->config.max_txtrig_level) 
    2095                         tx_info->status.rates[tx_rateindex].count = 
    2096                                 hw->max_rate_tries; 
    2097 @@ -2115,13 +2113,7 @@ static void ath_tx_process_buffer(struct 
    2098         spin_unlock_bh(&txq->axq_lock); 
    2099   
    2100         if (!bf_isampdu(bf)) { 
    2101 -               /* 
    2102 -                * This frame is sent out as a single frame. 
    2103 -                * Use hardware retry status for this frame. 
    2104 -                */ 
    2105 -               if (ts->ts_status & ATH9K_TXERR_XRETRY) 
    2106 -                       bf->bf_state.bf_type |= BUF_XRETRY; 
    2107 -               ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok, true); 
    2108 +               ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok); 
    2109                 ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok, 0); 
    2110         } else 
    2111                 ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok, true); 
     407+bool cfg80211_can_beacon_sec_chan(struct wiphy *wiphy, 
     408+                                 struct ieee80211_channel *chan, 
     409+                                 enum nl80211_channel_type channel_type); 
     410+ 
     411 /* Logging, debugging and troubleshooting/diagnostic helpers. */ 
     412  
     413 /* wiphy_printk helpers, similar to dev_printk */ 
    2112414--- a/net/mac80211/agg-rx.c 
    2113415+++ b/net/mac80211/agg-rx.c 
    2114 @@ -180,6 +180,8 @@ static void ieee80211_send_addba_resp(st 
     416@@ -182,6 +182,10 @@ static void ieee80211_send_addba_resp(st 
    2115417                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 
    2116418        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
     
    2118420+       else if (sdata->vif.type == NL80211_IFTYPE_WDS) 
    2119421+               memcpy(mgmt->bssid, da, ETH_ALEN); 
     422+       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
     423+               memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
    2120424  
    2121425        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
     
    2123427--- a/net/mac80211/agg-tx.c 
    2124428+++ b/net/mac80211/agg-tx.c 
    2125 @@ -77,7 +77,8 @@ static void ieee80211_send_addba_request 
    2126         memcpy(mgmt->da, da, ETH_ALEN); 
     429@@ -79,10 +79,13 @@ static void ieee80211_send_addba_request 
    2127430        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 
    2128431        if (sdata->vif.type == NL80211_IFTYPE_AP || 
    2129 -           sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 
    2130 +           sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 
     432            sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 
     433-           sdata->vif.type == NL80211_IFTYPE_MESH_POINT) 
     434+           sdata->vif.type == NL80211_IFTYPE_MESH_POINT || 
    2131435+           sdata->vif.type == NL80211_IFTYPE_WDS) 
    2132436                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 
    2133437        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
    2134438                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    2135 @@ -397,7 +398,8 @@ int ieee80211_start_tx_ba_session(struct 
    2136          */ 
     439+       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
     440+               memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
     441  
     442        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
     443                                          IEEE80211_STYPE_ACTION); 
     444@@ -394,7 +397,9 @@ int ieee80211_start_tx_ba_session(struct 
    2137445        if (sdata->vif.type != NL80211_IFTYPE_STATION && 
     446            sdata->vif.type != NL80211_IFTYPE_MESH_POINT && 
    2138447            sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
    2139448-           sdata->vif.type != NL80211_IFTYPE_AP) 
    2140449+           sdata->vif.type != NL80211_IFTYPE_AP && 
     450+           sdata->vif.type != NL80211_IFTYPE_ADHOC && 
    2141451+           sdata->vif.type != NL80211_IFTYPE_WDS) 
    2142452                return -EINVAL; 
    2143453  
    2144         if (test_sta_flags(sta, WLAN_STA_BLOCK_BA)) { 
     454        if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) { 
    2145455--- a/net/mac80211/debugfs_sta.c 
    2146456+++ b/net/mac80211/debugfs_sta.c 
    2147 @@ -59,7 +59,7 @@ static ssize_t sta_flags_read(struct fil 
    2148         char buf[100]; 
    2149         struct sta_info *sta = file->private_data; 
    2150         u32 staflags = get_sta_flags(sta); 
    2151 -       int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s", 
    2152 +       int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s", 
    2153                 staflags & WLAN_STA_AUTH ? "AUTH\n" : "", 
    2154                 staflags & WLAN_STA_ASSOC ? "ASSOC\n" : "", 
    2155                 staflags & WLAN_STA_PS_STA ? "PS (sta)\n" : "", 
    2156 @@ -67,7 +67,6 @@ static ssize_t sta_flags_read(struct fil 
    2157                 staflags & WLAN_STA_AUTHORIZED ? "AUTHORIZED\n" : "", 
    2158                 staflags & WLAN_STA_SHORT_PREAMBLE ? "SHORT PREAMBLE\n" : "", 
    2159                 staflags & WLAN_STA_WME ? "WME\n" : "", 
    2160 -               staflags & WLAN_STA_WDS ? "WDS\n" : "", 
    2161                 staflags & WLAN_STA_MFP ? "MFP\n" : ""); 
    2162         return simple_read_from_buffer(userbuf, count, ppos, buf, res); 
    2163  } 
     457@@ -63,11 +63,11 @@ static ssize_t sta_flags_read(struct fil 
     458        test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : "" 
     459  
     460        int res = scnprintf(buf, sizeof(buf), 
     461-                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
     462+                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
     463                            TEST(AUTH), TEST(ASSOC), TEST(PS_STA), 
     464                            TEST(PS_DRIVER), TEST(AUTHORIZED), 
     465                            TEST(SHORT_PREAMBLE), TEST(ASSOC_AP), 
     466-                           TEST(WME), TEST(WDS), TEST(CLEAR_PS_FILT), 
     467+                           TEST(WME), TEST(CLEAR_PS_FILT), 
     468                            TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL), 
     469                            TEST(UAPSD), TEST(SP), TEST(TDLS_PEER), 
     470                            TEST(TDLS_PEER_AUTH)); 
     471--- a/net/mac80211/ht.c 
     472+++ b/net/mac80211/ht.c 
     473@@ -201,6 +201,8 @@ void ieee80211_send_delba(struct ieee802 
     474                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 
     475        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
     476                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
     477+       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
     478+               memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
     479  
     480        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
     481                                          IEEE80211_STYPE_ACTION); 
     482--- a/net/mac80211/ibss.c 
     483+++ b/net/mac80211/ibss.c 
     484@@ -77,6 +77,7 @@ static void __ieee80211_sta_join_ibss(st 
     485        struct cfg80211_bss *bss; 
     486        u32 bss_change; 
     487        u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; 
     488+       enum nl80211_channel_type channel_type; 
     489  
     490        lockdep_assert_held(&ifibss->mtx); 
     491  
     492@@ -105,8 +106,16 @@ static void __ieee80211_sta_join_ibss(st 
     493  
     494        sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; 
     495  
     496-       local->oper_channel = chan; 
     497-       WARN_ON(!ieee80211_set_channel_type(local, sdata, NL80211_CHAN_NO_HT)); 
     498+       channel_type = ifibss->channel_type; 
     499+       if (channel_type > NL80211_CHAN_HT20 && 
     500+           !cfg80211_can_beacon_sec_chan(local->hw.wiphy, chan, channel_type)) 
     501+               channel_type = NL80211_CHAN_HT20; 
     502+       if (!ieee80211_set_channel_type(local, sdata, channel_type)) { 
     503+               /* can only fail due to HT40+/- mismatch */ 
     504+               channel_type = NL80211_CHAN_HT20; 
     505+               WARN_ON(!ieee80211_set_channel_type(local, sdata, 
     506+                                                   NL80211_CHAN_HT20)); 
     507+       } 
     508        ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); 
     509  
     510        sband = local->hw.wiphy->bands[chan->band]; 
     511@@ -172,6 +181,18 @@ static void __ieee80211_sta_join_ibss(st 
     512                memcpy(skb_put(skb, ifibss->ie_len), 
     513                       ifibss->ie, ifibss->ie_len); 
     514  
     515+       /* add HT capability and information IEs */ 
     516+       if (channel_type && sband->ht_cap.ht_supported) { 
     517+               pos = skb_put(skb, 4 + 
     518+                                  sizeof(struct ieee80211_ht_cap) + 
     519+                                  sizeof(struct ieee80211_ht_info)); 
     520+               pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap); 
     521+               pos = ieee80211_ie_build_ht_info(pos, 
     522+                                                &sband->ht_cap, 
     523+                                                chan, 
     524+                                                channel_type); 
     525+       } 
     526+ 
     527        if (local->hw.queues >= 4) { 
     528                pos = skb_put(skb, 9); 
     529                *pos++ = WLAN_EID_VENDOR_SPECIFIC; 
     530@@ -195,6 +216,7 @@ static void __ieee80211_sta_join_ibss(st 
     531        bss_change |= BSS_CHANGED_BEACON; 
     532        bss_change |= BSS_CHANGED_BEACON_ENABLED; 
     533        bss_change |= BSS_CHANGED_BASIC_RATES; 
     534+       bss_change |= BSS_CHANGED_HT; 
     535        bss_change |= BSS_CHANGED_IBSS; 
     536        sdata->vif.bss_conf.ibss_joined = true; 
     537        ieee80211_bss_info_change_notify(sdata, bss_change); 
     538@@ -268,6 +290,7 @@ static void ieee80211_rx_bss_info(struct 
     539        u64 beacon_timestamp, rx_timestamp; 
     540        u32 supp_rates = 0; 
     541        enum ieee80211_band band = rx_status->band; 
     542+       struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band]; 
     543  
     544        if (elems->ds_params && elems->ds_params_len == 1) 
     545                freq = ieee80211_channel_to_frequency(elems->ds_params[0], 
     546@@ -277,7 +300,10 @@ static void ieee80211_rx_bss_info(struct 
     547  
     548        channel = ieee80211_get_channel(local->hw.wiphy, freq); 
     549  
     550-       if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) 
     551+       if (!channel || 
     552+           channel->flags & (IEEE80211_CHAN_DISABLED || 
     553+                             IEEE80211_CHAN_NO_IBSS || 
     554+                             IEEE80211_CHAN_RADAR)) 
     555                return; 
     556  
     557        if (sdata->vif.type == NL80211_IFTYPE_ADHOC && 
     558@@ -315,8 +341,41 @@ static void ieee80211_rx_bss_info(struct 
     559                                                GFP_ATOMIC); 
     560                } 
     561  
     562-               if (sta && elems->wmm_info) 
     563-                       set_sta_flag(sta, WLAN_STA_WME); 
     564+               if (sta) { 
     565+                       if (elems->wmm_info) 
     566+                               set_sta_flag(sta, WLAN_STA_WME); 
     567+ 
     568+                       /* we both use HT */ 
     569+                       if (elems->ht_info_elem && elems->ht_cap_elem && 
     570+                           sdata->u.ibss.channel_type) { 
     571+                               enum nl80211_channel_type channel_type = 
     572+                                       ieee80211_ht_info_to_channel_type( 
     573+                                                          elems->ht_info_elem); 
     574+                               struct ieee80211_sta_ht_cap sta_ht_cap_new; 
     575+ 
     576+                               /* 
     577+                                * fall back to HT20 if we don't use or use 
     578+                                * the other extension channel 
     579+                                */ 
     580+                               if (channel_type > NL80211_CHAN_HT20 && 
     581+                                   channel_type != sdata->u.ibss.channel_type) 
     582+                                       channel_type = NL80211_CHAN_HT20; 
     583+ 
     584+                               ieee80211_ht_cap_ie_to_sta_ht_cap(sband, 
     585+                                               elems->ht_cap_elem, 
     586+                                               &sta_ht_cap_new); 
     587+                               if (memcmp(&sta->sta.ht_cap, &sta_ht_cap_new, 
     588+                                          sizeof(sta_ht_cap_new))) { 
     589+                                       memcpy(&sta->sta.ht_cap, 
     590+                                              &sta_ht_cap_new, 
     591+                                              sizeof(sta_ht_cap_new)); 
     592+                                       rate_control_rate_update(local, sband, 
     593+                                                       sta, 
     594+                                                       IEEE80211_RC_HT_CHANGED, 
     595+                                                       channel_type); 
     596+                               } 
     597+                       } 
     598+               } 
     599  
     600                rcu_read_unlock(); 
     601        } 
     602@@ -898,10 +957,15 @@ int ieee80211_ibss_join(struct ieee80211 
     603        struct sk_buff *skb; 
     604  
     605        skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + 
     606-                           36 /* bitrates */ + 
     607-                           34 /* SSID */ + 
     608-                           3  /* DS params */ + 
     609-                           4  /* IBSS params */ + 
     610+                           sizeof(struct ieee80211_hdr_3addr) + 
     611+                           12 /* struct ieee80211_mgmt.u.beacon */ + 
     612+                           2 + IEEE80211_MAX_SSID_LEN /* max SSID */ + 
     613+                           2 + 8 /* max Supported Rates */ + 
     614+                           3 /* max DS params */ + 
     615+                           4 /* IBSS params */ + 
     616+                           2 + (IEEE80211_MAX_SUPP_RATES - 8) + 
     617+                           2 + sizeof(struct ieee80211_ht_cap) + 
     618+                           2 + sizeof(struct ieee80211_ht_info) + 
     619                            params->ie_len); 
     620        if (!skb) 
     621                return -ENOMEM; 
     622@@ -922,13 +986,15 @@ int ieee80211_ibss_join(struct ieee80211 
     623        sdata->vif.bss_conf.beacon_int = params->beacon_interval; 
     624  
     625        sdata->u.ibss.channel = params->channel; 
     626+       sdata->u.ibss.channel_type = params->channel_type; 
     627        sdata->u.ibss.fixed_channel = params->channel_fixed; 
     628  
     629        /* fix ourselves to that channel now already */ 
     630        if (params->channel_fixed) { 
     631                sdata->local->oper_channel = params->channel; 
     632-               WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata, 
     633-                                                   NL80211_CHAN_NO_HT)); 
     634+               if (!ieee80211_set_channel_type(sdata->local, sdata, 
     635+                                              params->channel_type)) 
     636+                       return -EINVAL; 
     637        } 
     638  
     639        if (params->ie) { 
     640--- a/net/mac80211/ieee80211_i.h 
     641+++ b/net/mac80211/ieee80211_i.h 
     642@@ -470,6 +470,7 @@ struct ieee80211_if_ibss { 
     643        u8 ssid_len, ie_len; 
     644        u8 *ie; 
     645        struct ieee80211_channel *channel; 
     646+       enum nl80211_channel_type channel_type; 
     647  
     648        unsigned long ibss_join_req; 
     649        /* probe response/beacon for IBSS */ 
    2164650--- a/net/mac80211/iface.c 
    2165651+++ b/net/mac80211/iface.c 
     
    2172658        int res; 
    2173659        u32 hw_reconf_flags = 0; 
    2174 @@ -290,27 +289,6 @@ static int ieee80211_do_open(struct net_ 
     660@@ -309,27 +308,6 @@ static int ieee80211_do_open(struct net_ 
    2175661  
    2176662        set_bit(SDATA_STATE_RUNNING, &sdata->state); 
     
    2185671-               } 
    2186672- 
    2187 -               /* no locking required since STA is not live yet */ 
    2188 -               sta->flags |= WLAN_STA_AUTHORIZED; 
     673-               /* no atomic bitop required since STA is not live yet */ 
     674-               set_sta_flag(sta, WLAN_STA_AUTHORIZED); 
    2189675- 
    2190676-               res = sta_info_insert(sta); 
     
    2200686         * set_multicast_list will be invoked by the networking core 
    2201687         * which will check whether any increments here were done in 
    2202 @@ -344,8 +322,7 @@ static int ieee80211_do_open(struct net_ 
     688@@ -356,8 +334,7 @@ static int ieee80211_do_open(struct net_ 
    2203689        netif_tx_start_all_queues(dev); 
    2204690  
    2205691        return 0; 
    2206692- err_del_interface: 
    2207 -       drv_remove_interface(local, &sdata->vif); 
     693-       drv_remove_interface(local, sdata); 
    2208694+ 
    2209695  err_stop: 
    2210696        if (!local->open_count) 
    2211697                drv_stop(local); 
    2212 @@ -718,6 +695,70 @@ static void ieee80211_if_setup(struct ne 
     698@@ -732,6 +709,70 @@ static void ieee80211_if_setup(struct ne 
    2213699        dev->destructor = free_netdev; 
    2214700 } 
     
    2267753+ 
    2268754+       if (elems.wmm_param) 
    2269 +               set_sta_flags(sta, WLAN_STA_WME); 
     755+               set_sta_flag(sta, WLAN_STA_WME); 
    2270756+ 
    2271757+       if (new) { 
    2272 +               sta->flags = WLAN_STA_AUTHORIZED; 
     758+               set_sta_flag(sta, WLAN_STA_AUTHORIZED); 
    2273759+               rate_control_rate_init(sta); 
    2274760+               sta_info_insert_rcu(sta); 
     
    2281767 { 
    2282768        struct ieee80211_sub_if_data *sdata = 
    2283 @@ -822,6 +863,9 @@ static void ieee80211_iface_work(struct  
     769@@ -836,6 +877,9 @@ static void ieee80211_iface_work(struct  
    2284770                                break; 
    2285771                        ieee80211_mesh_rx_queued_mgmt(sdata, skb); 
     
    2291777                        WARN(1, "frame for unexpected interface type"); 
    2292778                        break; 
     779--- a/net/mac80211/mlme.c 
     780+++ b/net/mac80211/mlme.c 
     781@@ -1359,9 +1359,6 @@ static void __ieee80211_connection_loss( 
     782        ieee80211_set_disassoc(sdata, true, true); 
     783        mutex_unlock(&ifmgd->mtx); 
     784  
     785-       mutex_lock(&local->mtx); 
     786-       ieee80211_recalc_idle(local); 
     787-       mutex_unlock(&local->mtx); 
     788        /* 
     789         * must be outside lock due to cfg80211, 
     790         * but that's not a problem. 
     791@@ -1370,6 +1367,10 @@ static void __ieee80211_connection_loss( 
     792                                       IEEE80211_STYPE_DEAUTH, 
     793                                       WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY, 
     794                                       NULL, true); 
     795+ 
     796+       mutex_lock(&local->mtx); 
     797+       ieee80211_recalc_idle(local); 
     798+       mutex_unlock(&local->mtx); 
     799 } 
     800  
     801 void ieee80211_beacon_connection_loss_work(struct work_struct *work) 
     802@@ -2136,9 +2137,6 @@ static void ieee80211_sta_connection_los 
     803  
     804        ieee80211_set_disassoc(sdata, true, true); 
     805        mutex_unlock(&ifmgd->mtx); 
     806-       mutex_lock(&local->mtx); 
     807-       ieee80211_recalc_idle(local); 
     808-       mutex_unlock(&local->mtx); 
     809        /* 
     810         * must be outside lock due to cfg80211, 
     811         * but that's not a problem. 
     812@@ -2146,6 +2144,11 @@ static void ieee80211_sta_connection_los 
     813        ieee80211_send_deauth_disassoc(sdata, bssid, 
     814                        IEEE80211_STYPE_DEAUTH, reason, 
     815                        NULL, true); 
     816+ 
     817+       mutex_lock(&local->mtx); 
     818+       ieee80211_recalc_idle(local); 
     819+       mutex_unlock(&local->mtx); 
     820+ 
     821        mutex_lock(&ifmgd->mtx); 
     822 } 
     823  
     824--- a/net/mac80211/offchannel.c 
     825+++ b/net/mac80211/offchannel.c 
     826@@ -212,8 +212,6 @@ static void ieee80211_hw_roc_start(struc 
     827                return; 
     828        } 
     829  
     830-       ieee80211_recalc_idle(local); 
     831- 
     832        if (local->hw_roc_skb) { 
     833                sdata = IEEE80211_DEV_TO_SUB_IF(local->hw_roc_dev); 
     834                ieee80211_tx_skb(sdata, local->hw_roc_skb); 
     835@@ -227,6 +225,8 @@ static void ieee80211_hw_roc_start(struc 
     836                                          GFP_KERNEL); 
     837        } 
     838  
     839+       ieee80211_recalc_idle(local); 
     840+ 
     841        mutex_unlock(&local->mtx); 
     842 } 
     843  
    2293844--- a/net/mac80211/rx.c 
    2294845+++ b/net/mac80211/rx.c 
    2295 @@ -2163,7 +2163,8 @@ ieee80211_rx_h_action(struct ieee80211_r 
    2296                  */ 
     846@@ -2250,7 +2250,9 @@ ieee80211_rx_h_action(struct ieee80211_r 
    2297847                if (sdata->vif.type != NL80211_IFTYPE_STATION && 
     848                    sdata->vif.type != NL80211_IFTYPE_MESH_POINT && 
    2298849                    sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
    2299850-                   sdata->vif.type != NL80211_IFTYPE_AP) 
    2300851+                   sdata->vif.type != NL80211_IFTYPE_AP && 
     852+                   sdata->vif.type != NL80211_IFTYPE_ADHOC && 
    2301853+                   sdata->vif.type != NL80211_IFTYPE_WDS) 
    2302854                        break; 
    2303855  
    2304856                /* verify action_code is present */ 
    2305 @@ -2378,13 +2379,14 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
     857@@ -2465,13 +2467,14 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
    2306858  
    2307859        if (!ieee80211_vif_is_mesh(&sdata->vif) && 
     
    2320872        case cpu_to_le16(IEEE80211_STYPE_DEAUTH): 
    2321873        case cpu_to_le16(IEEE80211_STYPE_DISASSOC): 
    2322 @@ -2727,10 +2729,16 @@ static int prepare_for_handlers(struct i 
     874@@ -2818,10 +2821,16 @@ static int prepare_for_handlers(struct i 
    2323875                } 
    2324876                break; 
     
    2341893--- a/net/mac80211/sta_info.h 
    2342894+++ b/net/mac80211/sta_info.h 
    2343 @@ -31,7 +31,6 @@ 
     895@@ -32,7 +32,6 @@ 
    2344896  *     frames. 
    2345897  * @WLAN_STA_ASSOC_AP: We're associated to that station, it is an AP. 
     
    2349901  *     IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next 
    2350902  *     frame to this station is transmitted. 
    2351 @@ -54,7 +53,6 @@ enum ieee80211_sta_info_flags { 
    2352         WLAN_STA_SHORT_PREAMBLE = 1<<4, 
    2353         WLAN_STA_ASSOC_AP       = 1<<5, 
    2354         WLAN_STA_WME            = 1<<6, 
    2355 -       WLAN_STA_WDS            = 1<<7, 
    2356         WLAN_STA_CLEAR_PS_FILT  = 1<<9, 
    2357         WLAN_STA_MFP            = 1<<10, 
    2358         WLAN_STA_BLOCK_BA       = 1<<11, 
    2359 --- a/net/mac80211/status.c 
    2360 +++ b/net/mac80211/status.c 
    2361 @@ -278,17 +278,19 @@ void ieee80211_tx_status(struct ieee8021 
    2362                 } 
    2363   
    2364                 if (!acked && ieee80211_is_back_req(fc)) { 
    2365 +                       u16 control; 
    2366 + 
    2367                         /* 
    2368 -                        * BAR failed, let's tear down the BA session as a 
    2369 -                        * last resort as some STAs (Intel 5100 on Windows) 
    2370 -                        * can get stuck when the BA window isn't flushed 
    2371 -                        * correctly. 
    2372 +                        * BAR failed, store the last SSN and retry sending 
    2373 +                        * the BAR when the next unicast transmission on the 
    2374 +                        * same TID succeeds. 
    2375                          */ 
    2376                         bar = (struct ieee80211_bar *) skb->data; 
    2377 -                       if (!(bar->control & IEEE80211_BAR_CTRL_MULTI_TID)) { 
    2378 +                       control = le16_to_cpu(bar->control); 
    2379 +                       if (!(control & IEEE80211_BAR_CTRL_MULTI_TID)) { 
    2380                                 u16 ssn = le16_to_cpu(bar->start_seq_num); 
    2381   
    2382 -                               tid = (bar->control & 
    2383 +                               tid = (control & 
    2384                                        IEEE80211_BAR_CTRL_TID_INFO_MASK) >> 
    2385                                       IEEE80211_BAR_CTRL_TID_INFO_SHIFT; 
    2386   
    2387 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    2388 +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    2389 @@ -704,8 +704,10 @@ static void ar5008_hw_override_ini(struc 
    2390                 REG_WRITE(ah, AR_PCU_MISC_MODE2, val); 
    2391         } 
    2392   
    2393 -       if (!AR_SREV_5416_20_OR_LATER(ah) || 
    2394 -           AR_SREV_9280_20_OR_LATER(ah)) 
    2395 +       REG_SET_BIT(ah, AR_PHY_CCK_DETECT, 
    2396 +                   AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV); 
    2397 + 
    2398 +       if (AR_SREV_9280_20_OR_LATER(ah)) 
    2399                 return; 
    2400         /* 
    2401          * Disable BB clock gating 
    2402 @@ -802,7 +804,8 @@ static int ar5008_hw_process_ini(struct  
    2403   
    2404         /* Write ADDAC shifts */ 
    2405         REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_EXTERNAL_RADIO); 
    2406 -       ah->eep_ops->set_addac(ah, chan); 
    2407 +       if (ah->eep_ops->set_addac) 
    2408 +               ah->eep_ops->set_addac(ah, chan); 
    2409   
    2410         if (AR_SREV_5416_22_OR_LATER(ah)) { 
    2411                 REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites); 
    2412 @@ -1007,24 +1010,6 @@ static void ar5008_restore_chainmask(str 
    2413         } 
    2414  } 
    2415   
    2416 -static void ar5008_set_diversity(struct ath_hw *ah, bool value) 
    2417 -{ 
    2418 -       u32 v = REG_READ(ah, AR_PHY_CCK_DETECT); 
    2419 -       if (value) 
    2420 -               v |= AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; 
    2421 -       else 
    2422 -               v &= ~AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; 
    2423 -       REG_WRITE(ah, AR_PHY_CCK_DETECT, v); 
    2424 -} 
    2425 - 
    2426 -static u32 ar9100_hw_compute_pll_control(struct ath_hw *ah, 
    2427 -                                        struct ath9k_channel *chan) 
    2428 -{ 
    2429 -       if (chan && IS_CHAN_5GHZ(chan)) 
    2430 -               return 0x1450; 
    2431 -       return 0x1458; 
    2432 -} 
    2433 - 
    2434  static u32 ar9160_hw_compute_pll_control(struct ath_hw *ah, 
    2435                                          struct ath9k_channel *chan) 
     903@@ -62,7 +61,6 @@ enum ieee80211_sta_info_flags { 
     904        WLAN_STA_SHORT_PREAMBLE, 
     905        WLAN_STA_ASSOC_AP, 
     906        WLAN_STA_WME, 
     907-       WLAN_STA_WDS, 
     908        WLAN_STA_CLEAR_PS_FILT, 
     909        WLAN_STA_MFP, 
     910        WLAN_STA_BLOCK_BA, 
     911--- a/net/wireless/chan.c 
     912+++ b/net/wireless/chan.c 
     913@@ -44,9 +44,9 @@ rdev_freq_to_chan(struct cfg80211_regist 
     914        return chan; 
     915 } 
     916  
     917-static bool can_beacon_sec_chan(struct wiphy *wiphy, 
     918-                               struct ieee80211_channel *chan, 
     919-                               enum nl80211_channel_type channel_type) 
     920+bool cfg80211_can_beacon_sec_chan(struct wiphy *wiphy, 
     921+                                 struct ieee80211_channel *chan, 
     922+                                 enum nl80211_channel_type channel_type) 
    2436923 { 
    2437 @@ -1654,7 +1639,6 @@ void ar5008_hw_attach_phy_ops(struct ath 
    2438         priv_ops->rfbus_req = ar5008_hw_rfbus_req; 
    2439         priv_ops->rfbus_done = ar5008_hw_rfbus_done; 
    2440         priv_ops->restore_chainmask = ar5008_restore_chainmask; 
    2441 -       priv_ops->set_diversity = ar5008_set_diversity; 
    2442         priv_ops->do_getnf = ar5008_hw_do_getnf; 
    2443         priv_ops->set_radar_params = ar5008_hw_set_radar_params; 
    2444   
    2445 @@ -1664,9 +1648,7 @@ void ar5008_hw_attach_phy_ops(struct ath 
    2446         } else 
    2447                 priv_ops->ani_control = ar5008_hw_ani_control_old; 
    2448   
    2449 -       if (AR_SREV_9100(ah)) 
    2450 -               priv_ops->compute_pll_control = ar9100_hw_compute_pll_control; 
    2451 -       else if (AR_SREV_9160_10_OR_LATER(ah)) 
    2452 +       if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) 
    2453                 priv_ops->compute_pll_control = ar9160_hw_compute_pll_control; 
    2454         else 
    2455                 priv_ops->compute_pll_control = ar5008_hw_compute_pll_control; 
    2456 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
    2457 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
    2458 @@ -592,6 +592,9 @@ static void ar9003_hw_override_ini(struc 
    2459         val = REG_READ(ah, AR_PCU_MISC_MODE2) & (~AR_ADHOC_MCAST_KEYID_ENABLE); 
    2460         REG_WRITE(ah, AR_PCU_MISC_MODE2, 
    2461                   val | AR_AGG_WEP_ENABLE_FIX | AR_AGG_WEP_ENABLE); 
    2462 + 
    2463 +       REG_SET_BIT(ah, AR_PHY_CCK_DETECT, 
    2464 +                   AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV); 
    2465  } 
    2466   
    2467  static void ar9003_hw_prog_ini(struct ath_hw *ah, 
    2468 @@ -785,16 +788,6 @@ static void ar9003_hw_rfbus_done(struct  
    2469         REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0); 
    2470  } 
    2471   
    2472 -static void ar9003_hw_set_diversity(struct ath_hw *ah, bool value) 
    2473 -{ 
    2474 -       u32 v = REG_READ(ah, AR_PHY_CCK_DETECT); 
    2475 -       if (value) 
    2476 -               v |= AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; 
    2477 -       else 
    2478 -               v &= ~AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; 
    2479 -       REG_WRITE(ah, AR_PHY_CCK_DETECT, v); 
    2480 -} 
    2481 - 
    2482  static bool ar9003_hw_ani_control(struct ath_hw *ah, 
    2483                                   enum ath9k_ani_cmd cmd, int param) 
    2484  { 
    2485 @@ -1277,7 +1270,6 @@ void ar9003_hw_attach_phy_ops(struct ath 
    2486         priv_ops->set_delta_slope = ar9003_hw_set_delta_slope; 
    2487         priv_ops->rfbus_req = ar9003_hw_rfbus_req; 
    2488         priv_ops->rfbus_done = ar9003_hw_rfbus_done; 
    2489 -       priv_ops->set_diversity = ar9003_hw_set_diversity; 
    2490         priv_ops->ani_control = ar9003_hw_ani_control; 
    2491         priv_ops->do_getnf = ar9003_hw_do_getnf; 
    2492         priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs; 
    2493 --- a/drivers/net/wireless/ath/ath9k/eeprom.c 
    2494 +++ b/drivers/net/wireless/ath/ath9k/eeprom.c 
    2495 @@ -456,12 +456,7 @@ void ath9k_hw_get_gain_boundaries_pdadcs 
    2496                 pPdGainBoundaries[i] = 
    2497                         min((u16)MAX_RATE_POWER, pPdGainBoundaries[i]); 
    2498   
    2499 -               if ((i == 0) && !AR_SREV_5416_20_OR_LATER(ah)) { 
    2500 -                       minDelta = pPdGainBoundaries[0] - 23; 
    2501 -                       pPdGainBoundaries[0] = 23; 
    2502 -               } else { 
    2503 -                       minDelta = 0; 
    2504 -               } 
    2505 +               minDelta = 0; 
    2506   
    2507                 if (i == 0) { 
    2508                         if (AR_SREV_9280_20_OR_LATER(ah)) 
    2509 --- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c 
    2510 +++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c 
    2511 @@ -405,12 +405,7 @@ static void ath9k_hw_set_4k_power_cal_ta 
    2512         REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, 0); 
    2513   
    2514         for (i = 0; i < AR5416_EEP4K_MAX_CHAINS; i++) { 
    2515 -               if (AR_SREV_5416_20_OR_LATER(ah) && 
    2516 -                   (ah->rxchainmask == 5 || ah->txchainmask == 5) && 
    2517 -                   (i != 0)) { 
    2518 -                       regChainOffset = (i == 1) ? 0x2000 : 0x1000; 
    2519 -               } else 
    2520 -                       regChainOffset = i * 0x1000; 
    2521 +               regChainOffset = i * 0x1000; 
    2522   
    2523                 if (pEepData->baseEepHeader.txMask & (1 << i)) { 
    2524                         pRawDataset = pEepData->calPierData2G[i]; 
    2525 @@ -423,19 +418,17 @@ static void ath9k_hw_set_4k_power_cal_ta 
    2526   
    2527                         ENABLE_REGWRITE_BUFFER(ah); 
    2528   
    2529 -                       if ((i == 0) || AR_SREV_5416_20_OR_LATER(ah)) { 
    2530 -                               REG_WRITE(ah, AR_PHY_TPCRG5 + regChainOffset, 
    2531 -                                         SM(pdGainOverlap_t2, 
    2532 -                                            AR_PHY_TPCRG5_PD_GAIN_OVERLAP) 
    2533 -                                         | SM(gainBoundaries[0], 
    2534 -                                              AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1) 
    2535 -                                         | SM(gainBoundaries[1], 
    2536 -                                              AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2) 
    2537 -                                         | SM(gainBoundaries[2], 
    2538 -                                              AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3) 
    2539 -                                         | SM(gainBoundaries[3], 
    2540 -                                      AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4)); 
    2541 -                       } 
    2542 +                       REG_WRITE(ah, AR_PHY_TPCRG5 + regChainOffset, 
    2543 +                                 SM(pdGainOverlap_t2, 
    2544 +                                    AR_PHY_TPCRG5_PD_GAIN_OVERLAP) 
    2545 +                                 | SM(gainBoundaries[0], 
    2546 +                                      AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1) 
    2547 +                                 | SM(gainBoundaries[1], 
    2548 +                                      AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2) 
    2549 +                                 | SM(gainBoundaries[2], 
    2550 +                                      AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3) 
    2551 +                                 | SM(gainBoundaries[3], 
    2552 +                              AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4)); 
    2553   
    2554                         regOffset = AR_PHY_BASE + (672 << 2) + regChainOffset; 
    2555                         for (j = 0; j < 32; j++) { 
    2556 @@ -715,10 +708,8 @@ static void ath9k_hw_4k_set_txpower(stru 
    2557         if (test) 
    2558             return; 
    2559   
    2560 -       if (AR_SREV_9280_20_OR_LATER(ah)) { 
    2561 -               for (i = 0; i < Ar5416RateSize; i++) 
    2562 -                       ratesArray[i] -= AR5416_PWR_TABLE_OFFSET_DB * 2; 
    2563 -       } 
    2564 +       for (i = 0; i < Ar5416RateSize; i++) 
    2565 +               ratesArray[i] -= AR5416_PWR_TABLE_OFFSET_DB * 2; 
    2566   
    2567         ENABLE_REGWRITE_BUFFER(ah); 
    2568   
    2569 @@ -788,28 +779,6 @@ static void ath9k_hw_4k_set_txpower(stru 
    2570         REGWRITE_BUFFER_FLUSH(ah); 
    2571  } 
    2572   
    2573 -static void ath9k_hw_4k_set_addac(struct ath_hw *ah, 
    2574 -                                 struct ath9k_channel *chan) 
    2575 -{ 
    2576 -       struct modal_eep_4k_header *pModal; 
    2577 -       struct ar5416_eeprom_4k *eep = &ah->eeprom.map4k; 
    2578 -       u8 biaslevel; 
    2579 - 
    2580 -       if (ah->hw_version.macVersion != AR_SREV_VERSION_9160) 
    2581 -               return; 
    2582 - 
    2583 -       if (ah->eep_ops->get_eeprom_rev(ah) < AR5416_EEP_MINOR_VER_7) 
    2584 -               return; 
    2585 - 
    2586 -       pModal = &eep->modalHeader; 
    2587 - 
    2588 -       if (pModal->xpaBiasLvl != 0xff) { 
    2589 -               biaslevel = pModal->xpaBiasLvl; 
    2590 -               INI_RA(&ah->iniAddac, 7, 1) = 
    2591 -                 (INI_RA(&ah->iniAddac, 7, 1) & (~0x18)) | biaslevel << 3; 
    2592 -       } 
    2593 -} 
    2594 - 
    2595  static void ath9k_hw_4k_set_gain(struct ath_hw *ah, 
    2596                                  struct modal_eep_4k_header *pModal, 
    2597                                  struct ar5416_eeprom_4k *eep, 
    2598 @@ -877,6 +846,7 @@ static void ath9k_hw_4k_set_board_values 
    2599         u8 txRxAttenLocal; 
    2600         u8 ob[5], db1[5], db2[5]; 
    2601         u8 ant_div_control1, ant_div_control2; 
    2602 +       u8 bb_desired_scale; 
    2603         u32 regVal; 
    2604   
    2605         pModal = &eep->modalHeader; 
    2606 @@ -1096,30 +1066,29 @@ static void ath9k_hw_4k_set_board_values 
    2607                                       AR_PHY_SETTLING_SWITCH, 
    2608                                       pModal->swSettleHt40); 
    2609         } 
    2610 -       if (AR_SREV_9271(ah) || AR_SREV_9285(ah)) { 
    2611 -               u8 bb_desired_scale = (pModal->bb_scale_smrt_antenna & 
    2612 -                               EEP_4K_BB_DESIRED_SCALE_MASK); 
    2613 -               if ((pBase->txGainType == 0) && (bb_desired_scale != 0)) { 
    2614 -                       u32 pwrctrl, mask, clr; 
    2615 - 
    2616 -                       mask = BIT(0)|BIT(5)|BIT(10)|BIT(15)|BIT(20)|BIT(25); 
    2617 -                       pwrctrl = mask * bb_desired_scale; 
    2618 -                       clr = mask * 0x1f; 
    2619 -                       REG_RMW(ah, AR_PHY_TX_PWRCTRL8, pwrctrl, clr); 
    2620 -                       REG_RMW(ah, AR_PHY_TX_PWRCTRL10, pwrctrl, clr); 
    2621 -                       REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL12, pwrctrl, clr); 
    2622 - 
    2623 -                       mask = BIT(0)|BIT(5)|BIT(15); 
    2624 -                       pwrctrl = mask * bb_desired_scale; 
    2625 -                       clr = mask * 0x1f; 
    2626 -                       REG_RMW(ah, AR_PHY_TX_PWRCTRL9, pwrctrl, clr); 
    2627 - 
    2628 -                       mask = BIT(0)|BIT(5); 
    2629 -                       pwrctrl = mask * bb_desired_scale; 
    2630 -                       clr = mask * 0x1f; 
    2631 -                       REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL11, pwrctrl, clr); 
    2632 -                       REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL13, pwrctrl, clr); 
    2633 -               } 
    2634 + 
    2635 +       bb_desired_scale = (pModal->bb_scale_smrt_antenna & 
    2636 +                       EEP_4K_BB_DESIRED_SCALE_MASK); 
    2637 +       if ((pBase->txGainType == 0) && (bb_desired_scale != 0)) { 
    2638 +               u32 pwrctrl, mask, clr; 
    2639 + 
    2640 +               mask = BIT(0)|BIT(5)|BIT(10)|BIT(15)|BIT(20)|BIT(25); 
    2641 +               pwrctrl = mask * bb_desired_scale; 
    2642 +               clr = mask * 0x1f; 
    2643 +               REG_RMW(ah, AR_PHY_TX_PWRCTRL8, pwrctrl, clr); 
    2644 +               REG_RMW(ah, AR_PHY_TX_PWRCTRL10, pwrctrl, clr); 
    2645 +               REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL12, pwrctrl, clr); 
    2646 + 
    2647 +               mask = BIT(0)|BIT(5)|BIT(15); 
    2648 +               pwrctrl = mask * bb_desired_scale; 
    2649 +               clr = mask * 0x1f; 
    2650 +               REG_RMW(ah, AR_PHY_TX_PWRCTRL9, pwrctrl, clr); 
    2651 + 
    2652 +               mask = BIT(0)|BIT(5); 
    2653 +               pwrctrl = mask * bb_desired_scale; 
    2654 +               clr = mask * 0x1f; 
    2655 +               REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL11, pwrctrl, clr); 
    2656 +               REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL13, pwrctrl, clr); 
    2657         } 
    2658  } 
    2659   
    2660 @@ -1161,7 +1130,6 @@ const struct eeprom_ops eep_4k_ops = { 
    2661         .get_eeprom_ver         = ath9k_hw_4k_get_eeprom_ver, 
    2662         .get_eeprom_rev         = ath9k_hw_4k_get_eeprom_rev, 
    2663         .set_board_values       = ath9k_hw_4k_set_board_values, 
    2664 -       .set_addac              = ath9k_hw_4k_set_addac, 
    2665         .set_txpower            = ath9k_hw_4k_set_txpower, 
    2666         .get_spur_channel       = ath9k_hw_4k_get_spur_channel 
    2667  }; 
    2668 --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c 
    2669 +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c 
    2670 @@ -851,10 +851,8 @@ static void ath9k_hw_ar9287_set_txpower( 
    2671         if (test) 
    2672                 return; 
    2673   
    2674 -       if (AR_SREV_9280_20_OR_LATER(ah)) { 
    2675 -               for (i = 0; i < Ar5416RateSize; i++) 
    2676 -                       ratesArray[i] -= AR9287_PWR_TABLE_OFFSET_DB * 2; 
    2677 -       } 
    2678 +       for (i = 0; i < Ar5416RateSize; i++) 
    2679 +               ratesArray[i] -= AR9287_PWR_TABLE_OFFSET_DB * 2; 
    2680   
    2681         ENABLE_REGWRITE_BUFFER(ah); 
    2682   
    2683 @@ -944,11 +942,6 @@ static void ath9k_hw_ar9287_set_txpower( 
    2684         REGWRITE_BUFFER_FLUSH(ah); 
    2685  } 
    2686   
    2687 -static void ath9k_hw_ar9287_set_addac(struct ath_hw *ah, 
    2688 -                                     struct ath9k_channel *chan) 
    2689 -{ 
    2690 -} 
    2691 - 
    2692  static void ath9k_hw_ar9287_set_board_values(struct ath_hw *ah, 
    2693                                              struct ath9k_channel *chan) 
    2694  { 
    2695 @@ -1100,7 +1093,6 @@ const struct eeprom_ops eep_ar9287_ops = 
    2696         .get_eeprom_ver         = ath9k_hw_ar9287_get_eeprom_ver, 
    2697         .get_eeprom_rev         = ath9k_hw_ar9287_get_eeprom_rev, 
    2698         .set_board_values       = ath9k_hw_ar9287_set_board_values, 
    2699 -       .set_addac              = ath9k_hw_ar9287_set_addac, 
    2700         .set_txpower            = ath9k_hw_ar9287_set_txpower, 
    2701         .get_spur_channel       = ath9k_hw_ar9287_get_spur_channel 
    2702  }; 
    2703 --- a/drivers/net/wireless/ath/ath9k/eeprom_def.c 
    2704 +++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c 
    2705 @@ -547,8 +547,7 @@ static void ath9k_hw_def_set_board_value 
    2706                                 break; 
    2707                 } 
    2708   
    2709 -               if (AR_SREV_5416_20_OR_LATER(ah) && 
    2710 -                   (ah->rxchainmask == 5 || ah->txchainmask == 5) && (i != 0)) 
    2711 +               if ((ah->rxchainmask == 5 || ah->txchainmask == 5) && (i != 0)) 
    2712                         regChainOffset = (i == 1) ? 0x2000 : 0x1000; 
    2713                 else 
    2714                         regChainOffset = i * 0x1000; 
    2715 @@ -565,9 +564,8 @@ static void ath9k_hw_def_set_board_value 
    2716                           SM(pModal->iqCalQCh[i], 
    2717                              AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF)); 
    2718   
    2719 -               if ((i == 0) || AR_SREV_5416_20_OR_LATER(ah)) 
    2720 -                       ath9k_hw_def_set_gain(ah, pModal, eep, txRxAttenLocal, 
    2721 -                                             regChainOffset, i); 
    2722 +               ath9k_hw_def_set_gain(ah, pModal, eep, txRxAttenLocal, 
    2723 +                                     regChainOffset, i); 
    2724         } 
    2725   
    2726         if (AR_SREV_9280_20_OR_LATER(ah)) { 
    2727 @@ -893,8 +891,7 @@ static void ath9k_hw_set_def_power_cal_t 
    2728                       xpdGainValues[2]); 
    2729   
    2730         for (i = 0; i < AR5416_MAX_CHAINS; i++) { 
    2731 -               if (AR_SREV_5416_20_OR_LATER(ah) && 
    2732 -                   (ah->rxchainmask == 5 || ah->txchainmask == 5) && 
    2733 +               if ((ah->rxchainmask == 5 || ah->txchainmask == 5) && 
    2734                     (i != 0)) { 
    2735                         regChainOffset = (i == 1) ? 0x2000 : 0x1000; 
    2736                 } else 
    2737 @@ -935,27 +932,24 @@ static void ath9k_hw_set_def_power_cal_t 
    2738   
    2739                         ENABLE_REGWRITE_BUFFER(ah); 
    2740   
    2741 -                       if ((i == 0) || AR_SREV_5416_20_OR_LATER(ah)) { 
    2742 -                               if (OLC_FOR_AR9280_20_LATER) { 
    2743 -                                       REG_WRITE(ah, 
    2744 -                                               AR_PHY_TPCRG5 + regChainOffset, 
    2745 -                                               SM(0x6, 
    2746 -                                               AR_PHY_TPCRG5_PD_GAIN_OVERLAP) | 
    2747 -                                               SM_PD_GAIN(1) | SM_PD_GAIN(2) | 
    2748 -                                               SM_PD_GAIN(3) | SM_PD_GAIN(4)); 
    2749 -                               } else { 
    2750 -                                       REG_WRITE(ah, 
    2751 -                                               AR_PHY_TPCRG5 + regChainOffset, 
    2752 -                                               SM(pdGainOverlap_t2, 
    2753 -                                               AR_PHY_TPCRG5_PD_GAIN_OVERLAP)| 
    2754 -                                               SM_PDGAIN_B(0, 1) | 
    2755 -                                               SM_PDGAIN_B(1, 2) | 
    2756 -                                               SM_PDGAIN_B(2, 3) | 
    2757 -                                               SM_PDGAIN_B(3, 4)); 
    2758 -                               } 
    2759 +                       if (OLC_FOR_AR9280_20_LATER) { 
    2760 +                               REG_WRITE(ah, 
    2761 +                                       AR_PHY_TPCRG5 + regChainOffset, 
    2762 +                                       SM(0x6, 
    2763 +                                       AR_PHY_TPCRG5_PD_GAIN_OVERLAP) | 
    2764 +                                       SM_PD_GAIN(1) | SM_PD_GAIN(2) | 
    2765 +                                       SM_PD_GAIN(3) | SM_PD_GAIN(4)); 
    2766 +                       } else { 
    2767 +                               REG_WRITE(ah, 
    2768 +                                       AR_PHY_TPCRG5 + regChainOffset, 
    2769 +                                       SM(pdGainOverlap_t2, 
    2770 +                                       AR_PHY_TPCRG5_PD_GAIN_OVERLAP)| 
    2771 +                                       SM_PDGAIN_B(0, 1) | 
    2772 +                                       SM_PDGAIN_B(1, 2) | 
    2773 +                                       SM_PDGAIN_B(2, 3) | 
    2774 +                                       SM_PDGAIN_B(3, 4)); 
    2775                         } 
    2776   
    2777 - 
    2778                         ath9k_adjust_pdadc_values(ah, pwr_table_offset, 
    2779                                                   diff, pdadcValues); 
    2780   
    2781 --- a/drivers/net/wireless/ath/ath9k/init.c 
    2782 +++ b/drivers/net/wireless/ath/ath9k/init.c 
    2783 @@ -506,7 +506,6 @@ static void ath9k_init_misc(struct ath_s 
    2784                 sc->sc_flags |= SC_OP_RXAGGR; 
    2785         } 
    2786   
    2787 -       ath9k_hw_set_diversity(sc->sc_ah, true); 
    2788         sc->rx.defant = ath9k_hw_getdefantenna(sc->sc_ah); 
    2789   
    2790         memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN); 
    2791 --- a/drivers/net/wireless/ath/ath9k/reg.h 
    2792 +++ b/drivers/net/wireless/ath/ath9k/reg.h 
    2793 @@ -800,10 +800,6 @@ 
    2794  #define AR_SREV_5416(_ah) \ 
    2795         (((_ah)->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) || \ 
    2796          ((_ah)->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)) 
    2797 -#define AR_SREV_5416_20_OR_LATER(_ah) \ 
    2798 -       (((AR_SREV_5416(_ah)) && \ 
    2799 -        ((_ah)->hw_version.macRev >= AR_SREV_REVISION_5416_20)) || \ 
    2800 -        ((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9100)) 
    2801  #define AR_SREV_5416_22_OR_LATER(_ah) \ 
    2802         (((AR_SREV_5416(_ah)) && \ 
    2803          ((_ah)->hw_version.macRev >= AR_SREV_REVISION_5416_22)) || \ 
    2804 --- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c 
    2805 +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c 
    2806 @@ -869,6 +869,7 @@ static bool ar9002_hw_init_cal(struct at 
    2807         ar9002_hw_pa_cal(ah, true); 
    2808   
    2809         /* Do NF Calibration after DC offset and other calibrations */ 
    2810 +       ath9k_hw_loadnf(ah, chan); 
    2811         ath9k_hw_start_nfcal(ah, true); 
    2812   
    2813         if (ah->caldata) 
    2814 --- a/net/mac80211/ieee80211_i.h 
    2815 +++ b/net/mac80211/ieee80211_i.h 
    2816 @@ -671,7 +671,6 @@ enum queue_stop_reason { 
    2817         IEEE80211_QUEUE_STOP_REASON_AGGREGATION, 
    2818         IEEE80211_QUEUE_STOP_REASON_SUSPEND, 
    2819         IEEE80211_QUEUE_STOP_REASON_SKB_ADD, 
    2820 -       IEEE80211_QUEUE_STOP_REASON_CHTYPE_CHANGE, 
    2821  }; 
    2822   
    2823  #ifdef CONFIG_MAC80211_LEDS 
    2824 --- a/net/mac80211/mlme.c 
    2825 +++ b/net/mac80211/mlme.c 
    2826 @@ -1921,24 +1921,8 @@ static void ieee80211_rx_mgmt_beacon(str 
    2827   
    2828                 rcu_read_unlock(); 
    2829   
    2830 -               /* 
    2831 -                * Whenever the AP announces the HT mode change that can be 
    2832 -                * 40MHz intolerant or etc., it would be safer to stop tx 
    2833 -                * queues before doing hw config to avoid buffer overflow. 
    2834 -                */ 
    2835 -               ieee80211_stop_queues_by_reason(&sdata->local->hw, 
    2836 -                               IEEE80211_QUEUE_STOP_REASON_CHTYPE_CHANGE); 
    2837 - 
    2838 -               /* flush out all packets */ 
    2839 -               synchronize_net(); 
    2840 - 
    2841 -               drv_flush(local, false); 
    2842 - 
    2843                 changed |= ieee80211_enable_ht(sdata, elems.ht_info_elem, 
    2844                                                bssid, ap_ht_cap_flags); 
    2845 - 
    2846 -               ieee80211_wake_queues_by_reason(&sdata->local->hw, 
    2847 -                               IEEE80211_QUEUE_STOP_REASON_CHTYPE_CHANGE); 
    2848         } 
    2849   
    2850         /* Note: country IE parsing is done for us by cfg80211 */ 
    2851 --- a/drivers/net/wireless/b43/main.c 
    2852 +++ b/drivers/net/wireless/b43/main.c 
    2853 @@ -1613,7 +1613,8 @@ static void handle_irq_beacon(struct b43 
    2854         u32 cmd, beacon0_valid, beacon1_valid; 
    2855   
    2856         if (!b43_is_mode(wl, NL80211_IFTYPE_AP) && 
    2857 -           !b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT)) 
    2858 +           !b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) && 
    2859 +           !b43_is_mode(wl, NL80211_IFTYPE_ADHOC)) 
    2860                 return; 
    2861   
    2862         /* This is the bottom half of the asynchronous beacon update. */ 
     924        struct ieee80211_channel *sec_chan; 
     925        int diff; 
     926@@ -75,6 +75,7 @@ static bool can_beacon_sec_chan(struct w 
     927  
     928        return true; 
     929 } 
     930+EXPORT_SYMBOL(cfg80211_can_beacon_sec_chan); 
     931  
     932 int cfg80211_set_freq(struct cfg80211_registered_device *rdev, 
     933                      struct wireless_dev *wdev, int freq, 
     934@@ -109,8 +110,8 @@ int cfg80211_set_freq(struct cfg80211_re 
     935                switch (channel_type) { 
     936                case NL80211_CHAN_HT40PLUS: 
     937                case NL80211_CHAN_HT40MINUS: 
     938-                       if (!can_beacon_sec_chan(&rdev->wiphy, chan, 
     939-                                                channel_type)) { 
     940+                       if (!cfg80211_can_beacon_sec_chan(&rdev->wiphy, chan, 
     941+                                                         channel_type)) { 
     942                                printk(KERN_DEBUG 
     943                                       "cfg80211: Secondary channel not " 
     944                                       "allowed to initiate communication\n"); 
     945--- a/net/wireless/nl80211.c 
     946+++ b/net/wireless/nl80211.c 
     947@@ -4604,13 +4604,34 @@ static int nl80211_join_ibss(struct sk_b 
     948                ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 
     949        } 
     950  
     951-       ibss.channel = ieee80211_get_channel(wiphy, 
     952-               nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 
     953+       if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 
     954+               enum nl80211_channel_type channel_type; 
     955+ 
     956+               channel_type = nla_get_u32( 
     957+                               info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 
     958+               if (channel_type > NL80211_CHAN_HT40PLUS) 
     959+                       return -EINVAL; 
     960+               ibss.channel_type = channel_type; 
     961+       } else { 
     962+               ibss.channel_type = NL80211_CHAN_NO_HT; 
     963+       } 
     964+ 
     965+       ibss.channel = rdev_freq_to_chan(rdev, 
     966+               nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]), 
     967+               ibss.channel_type); 
     968        if (!ibss.channel || 
     969+           ibss.channel->flags & IEEE80211_CHAN_RADAR || 
     970            ibss.channel->flags & IEEE80211_CHAN_NO_IBSS || 
     971            ibss.channel->flags & IEEE80211_CHAN_DISABLED) 
     972                return -EINVAL; 
     973  
     974+       /* Both channels should be able to initiate communication */ 
     975+       if ((ibss.channel_type == NL80211_CHAN_HT40PLUS || 
     976+            ibss.channel_type == NL80211_CHAN_HT40MINUS) && 
     977+           !cfg80211_can_beacon_sec_chan(&rdev->wiphy, ibss.channel, 
     978+                                         ibss.channel_type)) 
     979+               return -EINVAL; 
     980+ 
     981        ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 
     982        ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 
     983  
  • branches/backfire/package/mac80211/patches/400-ath_move_debug_code.patch

    r28388 r29275  
    1212--- a/drivers/net/wireless/ath/ath.h 
    1313+++ b/drivers/net/wireless/ath/ath.h 
    14 @@ -274,13 +274,6 @@ void ath_dbg(struct ath_common *common,  
     14@@ -272,13 +272,6 @@ void ath_dbg(struct ath_common *common,  
    1515 #endif /* CONFIG_ATH_DEBUG */ 
    1616  
  • branches/backfire/package/mac80211/patches/402-ath9k_blink_default.patch

    r28138 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -35,7 +35,7 @@ int ath9k_modparam_nohwcrypt; 
     3@@ -36,7 +36,7 @@ int ath9k_modparam_nohwcrypt; 
    44 module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444); 
    55 MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption"); 
  • branches/backfire/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch

    r28138 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -16,6 +16,7 @@ 
    4   
     3@@ -17,6 +17,7 @@ 
    54 #include <linux/io.h> 
    65 #include <linux/slab.h> 
     6 #include <linux/module.h> 
    77+#include <linux/etherdevice.h> 
    88 #include <asm/unaligned.h> 
    99  
    1010 #include "hw.h" 
    11 @@ -460,8 +461,16 @@ static int ath9k_hw_init_macaddr(struct  
     11@@ -465,8 +466,16 @@ static int ath9k_hw_init_macaddr(struct  
    1212                common->macaddr[2 * i] = eeval >> 8; 
    1313                common->macaddr[2 * i + 1] = eeval & 0xff; 
  • branches/backfire/package/mac80211/patches/404-ath_regd_optional.patch

    r26763 r29275  
    11--- a/drivers/net/wireless/ath/regd.c 
    22+++ b/drivers/net/wireless/ath/regd.c 
    3 @@ -193,6 +193,10 @@ ath_reg_apply_beaconing_flags(struct wip 
     3@@ -194,6 +194,10 @@ ath_reg_apply_beaconing_flags(struct wip 
    44        u32 bandwidth = 0; 
    55        int r; 
     
    1212  
    1313                if (!wiphy->bands[band]) 
    14 @@ -252,6 +256,10 @@ ath_reg_apply_active_scan_flags(struct w 
     14@@ -253,6 +257,10 @@ ath_reg_apply_active_scan_flags(struct w 
    1515        u32 bandwidth = 0; 
    1616        int r; 
     
    2121+ 
    2222        sband = wiphy->bands[IEEE80211_BAND_2GHZ]; 
    23   
    24         /* 
    25 @@ -299,6 +307,10 @@ static void ath_reg_apply_radar_flags(st 
     23        if (!sband) 
     24                return; 
     25@@ -302,6 +310,10 @@ static void ath_reg_apply_radar_flags(st 
    2626        struct ieee80211_channel *ch; 
    2727        unsigned int i; 
     
    3434                return; 
    3535  
    36 @@ -466,6 +478,10 @@ ath_regd_init_wiphy(struct ath_regulator 
     36@@ -469,6 +481,10 @@ ath_regd_init_wiphy(struct ath_regulator 
    3737 { 
    3838        const struct ieee80211_regdomain *regd; 
  • branches/backfire/package/mac80211/patches/405-world_regd_fixup.patch

    r26763 r29275  
    11--- a/drivers/net/wireless/ath/regd.c 
    22+++ b/drivers/net/wireless/ath/regd.c 
    3 @@ -37,7 +37,8 @@ 
     3@@ -38,7 +38,8 @@ 
    44                                NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM) 
    55  
     
    1111 #define ATH9K_5GHZ_5470_5850   REG_RULE(5470-10, 5850+10, 40, 0, 30,\ 
    1212                                NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS) 
    13 @@ -55,57 +56,56 @@ 
     13@@ -56,57 +57,56 @@ 
    1414 #define ATH9K_5GHZ_NO_MIDBAND  ATH9K_5GHZ_5150_5350, \ 
    1515                                ATH9K_5GHZ_5725_5850 
  • branches/backfire/package/mac80211/patches/406-regd_no_assoc_hints.patch

    r28388 r29275  
    11--- a/net/wireless/reg.c 
    22+++ b/net/wireless/reg.c 
    3 @@ -1653,6 +1653,8 @@ void regulatory_hint_11d(struct wiphy *w 
     3@@ -1656,6 +1656,8 @@ void regulatory_hint_11d(struct wiphy *w 
    44        enum environment_cap env = ENVIRON_ANY; 
    55        struct regulatory_request *request; 
     
    1010  
    1111        if (unlikely(!last_request)) 
    12 @@ -1859,6 +1861,8 @@ static void restore_regulatory_settings( 
     12@@ -1862,6 +1864,8 @@ static void restore_regulatory_settings( 
    1313  
    1414 void regulatory_hint_disconnect(void) 
  • branches/backfire/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -1473,15 +1473,6 @@ static int ath9k_add_interface(struct ie 
     3@@ -1448,15 +1448,6 @@ static int ath9k_add_interface(struct ie 
    44                } 
    55        } 
     
    1717                "Attach a VIF of type: %d\n", vif->type); 
    1818  
    19 @@ -1507,15 +1498,6 @@ static int ath9k_change_interface(struct 
     19@@ -1482,15 +1473,6 @@ static int ath9k_change_interface(struct 
    2020        mutex_lock(&sc->mutex); 
    2121        ath9k_ps_wakeup(sc); 
  • branches/backfire/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch

    r28138 r29275  
    1919--- a/drivers/net/wireless/ath/ath5k/base.c 
    2020+++ b/drivers/net/wireless/ath/ath5k/base.c 
    21 @@ -1866,7 +1866,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
     21@@ -1860,7 +1860,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
    2222                ah->bmisscount = 0; 
    2323        } 
     
    2828                u64 tsf = ath5k_hw_get_tsf64(ah); 
    2929                u32 tsftu = TSF_TO_TU(tsf); 
    30 @@ -1951,7 +1951,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
     30@@ -1945,7 +1945,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
    3131        u64 hw_tsf; 
    3232  
  • branches/backfire/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1585,6 +1585,53 @@ static const struct file_operations fops 
     3@@ -1616,6 +1616,53 @@ static const struct file_operations fops 
    44 }; 
    55  
     
    5555 { 
    5656        struct ath_common *common = ath9k_hw_common(ah); 
    57 @@ -1643,6 +1690,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
     57@@ -1674,6 +1721,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5858        debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR, 
    5959                           sc->debug.debugfs_phy, &sc->sc_ah->gpio_val); 
  • branches/backfire/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

    r28138 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -1674,8 +1674,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     3@@ -1715,8 +1715,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    44        REG_WRITE(ah, AR_OBS, 8); 
    55  
  • branches/backfire/package/mac80211/patches/511-ath9k_increase_bcbuf.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -363,7 +363,7 @@ struct ath_vif { 
     3@@ -366,7 +366,7 @@ struct ath_vif { 
    44  * number of beacon intervals, the game's up. 
    55  */ 
     
    1212--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1313+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    14 @@ -382,8 +382,8 @@ static void ath9k_hw_init_config(struct  
     14@@ -388,8 +388,8 @@ static void ath9k_hw_init_config(struct  
    1515 { 
    1616        int i; 
  • branches/backfire/package/mac80211/patches/512-ath9k_reduce_rxbuf.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -120,7 +120,7 @@ void ath_descdma_cleanup(struct ath_soft 
     3@@ -121,7 +121,7 @@ void ath_descdma_cleanup(struct ath_soft 
    44 /* RX / TX */ 
    55 /***********/ 
  • branches/backfire/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -585,6 +585,7 @@ struct ath_softc { 
     3@@ -591,6 +591,7 @@ struct ath_softc { 
    44        struct ieee80211_hw *hw; 
    55        struct device *dev; 
     
    99        int chan_is_ht; 
    1010        struct survey_info *cur_survey; 
     11@@ -654,6 +655,7 @@ struct ath_softc { 
     12        u8 ant_tx, ant_rx; 
     13 }; 
     14  
     15+int ath9k_config(struct ieee80211_hw *hw, u32 changed); 
     16 void ath9k_tasklet(unsigned long data); 
     17 int ath_cabq_update(struct ath_softc *); 
     18  
    1119--- a/drivers/net/wireless/ath/ath9k/debug.c 
    1220+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    13 @@ -1693,6 +1693,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
     21@@ -1663,6 +1663,50 @@ static const struct file_operations fops 
     22        .owner = THIS_MODULE 
     23 }; 
     24  
     25+ 
     26+static ssize_t read_file_chan_bw(struct file *file, char __user *user_buf, 
     27+                            size_t count, loff_t *ppos) 
     28+{ 
     29+       struct ath_softc *sc = file->private_data; 
     30+       char buf[32]; 
     31+       unsigned int len; 
     32+ 
     33+       len = sprintf(buf, "0x%08x\n", sc->chan_bw); 
     34+       return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     35+} 
     36+ 
     37+static ssize_t write_file_chan_bw(struct file *file, const char __user *user_buf, 
     38+                            size_t count, loff_t *ppos) 
     39+{ 
     40+       struct ath_softc *sc = file->private_data; 
     41+       unsigned long chan_bw; 
     42+       char buf[32]; 
     43+       ssize_t len; 
     44+ 
     45+       len = min(count, sizeof(buf) - 1); 
     46+       if (copy_from_user(buf, user_buf, len)) 
     47+               return -EFAULT; 
     48+ 
     49+       buf[len] = '\0'; 
     50+       if (strict_strtoul(buf, 0, &chan_bw)) 
     51+               return -EINVAL; 
     52+ 
     53+       sc->chan_bw = chan_bw; 
     54+       if (!sc->ps_idle) 
     55+               ath9k_config(sc->hw, IEEE80211_CONF_CHANGE_CHANNEL); 
     56+ 
     57+       return count; 
     58+} 
     59+ 
     60+static const struct file_operations fops_chanbw = { 
     61+       .read = read_file_chan_bw, 
     62+       .write = write_file_chan_bw, 
     63+       .open = ath9k_debugfs_open, 
     64+       .owner = THIS_MODULE, 
     65+       .llseek = default_llseek, 
     66+}; 
     67+ 
     68+ 
     69 int ath9k_init_debug(struct ath_hw *ah) 
     70 { 
     71        struct ath_common *common = ath9k_hw_common(ah); 
     72@@ -1724,6 +1768,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
    1473        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
    1574                            &fops_eeprom); 
    1675  
    17 +       debugfs_create_u32("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 
    18 +                          &sc->chan_bw); 
     76+       debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 
     77+                           sc, &fops_chanbw); 
    1978+ 
    2079        sc->debug.regidx = 0; 
     
    2382--- a/drivers/net/wireless/ath/ath9k/main.c 
    2483+++ b/drivers/net/wireless/ath/ath9k/main.c 
    25 @@ -1636,9 +1636,10 @@ static int ath9k_config(struct ieee80211 
     84@@ -1554,7 +1554,7 @@ static void ath9k_disable_ps(struct ath_ 
     85  
     86 } 
     87  
     88-static int ath9k_config(struct ieee80211_hw *hw, u32 changed) 
     89+int ath9k_config(struct ieee80211_hw *hw, u32 changed) 
     90 { 
     91        struct ath_softc *sc = hw->priv; 
     92        struct ath_hw *ah = sc->sc_ah; 
     93@@ -1606,9 +1606,10 @@ static int ath9k_config(struct ieee80211 
    2694  
    2795        if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 
     
    35103  
    36104                if (ah->curchan) 
    37 @@ -1691,7 +1692,23 @@ static int ath9k_config(struct ieee80211 
     105@@ -1661,7 +1662,23 @@ static int ath9k_config(struct ieee80211 
    38106                        memset(&sc->survey[pos], 0, sizeof(struct survey_info)); 
    39107                } 
     
    62130--- a/drivers/net/wireless/ath/ath9k/hw.c 
    63131+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    64 @@ -1509,6 +1509,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    65             (AR_SREV_9300_20_OR_LATER(ah) && IS_CHAN_5GHZ(chan))) 
    66                 bChannelChange = false; 
     132@@ -1549,6 +1549,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     133            caldata->rtt_hist.num_readings) 
     134                allow_fbs = true; 
    67135  
    68136+       if (!ah->curchan || ((ah->curchan->channelFlags ^ chan->channelFlags) & 
  • branches/backfire/package/mac80211/patches/520-mac80211_minstrel_ht_aggr_delay.patch

    r28388 r29275  
    11--- a/net/mac80211/rc80211_minstrel_ht.c 
    22+++ b/net/mac80211/rc80211_minstrel_ht.c 
    3 @@ -355,10 +355,12 @@ minstrel_downgrade_rate(struct minstrel_ 
     3@@ -357,10 +357,12 @@ minstrel_downgrade_rate(struct minstrel_ 
    44 } 
    55  
     
    1515  
    1616        if (unlikely(!ieee80211_is_data_qos(hdr->frame_control))) 
    17 @@ -374,6 +376,12 @@ minstrel_aggr_check(struct minstrel_priv 
     17@@ -376,6 +378,12 @@ minstrel_aggr_check(struct minstrel_priv 
    1818        if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO) 
    1919                return; 
     
    2828 } 
    2929  
    30 @@ -453,7 +461,7 @@ minstrel_ht_tx_status(void *priv, struct 
     30@@ -455,7 +463,7 @@ minstrel_ht_tx_status(void *priv, struct 
    3131        if (time_after(jiffies, mi->stats_update + (mp->update_interval / 2 * HZ) / 1000)) { 
    3232                minstrel_ht_update_stats(mp, mi); 
  • branches/backfire/package/mac80211/patches/521-mac80211_ht_change_rate_update.patch

    r27431 r29275  
    11--- a/net/mac80211/main.c 
    22+++ b/net/mac80211/main.c 
    3 @@ -239,7 +239,9 @@ void ieee80211_bss_info_change_notify(st 
     3@@ -237,7 +237,9 @@ void ieee80211_bss_info_change_notify(st 
    44                                      u32 changed) 
    55 { 
     
    1111        if (!changed) 
    1212                return; 
    13 @@ -269,6 +271,22 @@ void ieee80211_bss_info_change_notify(st 
     13@@ -267,6 +269,22 @@ void ieee80211_bss_info_change_notify(st 
    1414  
    1515        switch (sdata->vif.type) { 
  • branches/backfire/package/mac80211/patches/522-mac80211_reduce_txqueuelen.patch

    r28388 r29275  
    11--- a/net/mac80211/iface.c 
    22+++ b/net/mac80211/iface.c 
    3 @@ -685,6 +685,7 @@ static const struct net_device_ops ieee8 
     3@@ -699,6 +699,7 @@ static const struct net_device_ops ieee8 
    44 static void ieee80211_if_setup(struct net_device *dev) 
    55 { 
  • branches/backfire/package/mac80211/patches/523-minstrel_ht_optimize.patch

    r29259 r29275  
    4141  * Update rate statistics and select new primary rates 
    4242  * 
    43 @@ -292,6 +307,7 @@ minstrel_ht_update_stats(struct minstrel 
     43@@ -294,6 +309,7 @@ minstrel_ht_update_stats(struct minstrel 
    4444                } 
    4545        } 
     
    4949 } 
    5050  
    51 @@ -330,8 +346,8 @@ minstrel_next_sample_idx(struct minstrel 
     51@@ -332,8 +348,8 @@ minstrel_next_sample_idx(struct minstrel 
    5252 } 
    5353  
     
    6060        int group, orig_group; 
    6161  
    62 @@ -350,6 +366,7 @@ minstrel_downgrade_rate(struct minstrel_ 
     62@@ -352,6 +368,7 @@ minstrel_downgrade_rate(struct minstrel_ 
    6363                        *idx = mi->groups[group].max_tp_rate; 
    6464                else 
     
    6868        } 
    6969 } 
    70 @@ -450,13 +467,13 @@ minstrel_ht_tx_status(void *priv, struct 
     70@@ -452,13 +469,13 @@ minstrel_ht_tx_status(void *priv, struct 
    7171        if (rate->attempts > 30 && 
    7272            MINSTREL_FRAC(rate->success, rate->attempts) < 
     
    8484        if (time_after(jiffies, mi->stats_update + (mp->update_interval / 2 * HZ) / 1000)) { 
    8585                minstrel_ht_update_stats(mp, mi); 
    86 @@ -521,7 +538,6 @@ minstrel_calc_retransmit(struct minstrel 
     86@@ -523,7 +540,6 @@ minstrel_calc_retransmit(struct minstrel 
    8787 static void 
    8888 minstrel_ht_set_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, 
     
    9292 { 
    9393        const struct mcs_group *group = &minstrel_mcs_groups[index / MCS_GROUP_RATES]; 
    94 @@ -609,6 +625,7 @@ minstrel_ht_get_rate(void *priv, struct  
     94@@ -611,6 +627,7 @@ minstrel_ht_get_rate(void *priv, struct  
    9595        struct minstrel_priv *mp = priv; 
    9696        int sample_idx; 
     
    100100        if (rate_control_send_low(sta, priv_sta, txrc)) 
    101101                return; 
    102 @@ -634,11 +651,10 @@ minstrel_ht_get_rate(void *priv, struct  
     102@@ -636,11 +653,10 @@ minstrel_ht_get_rate(void *priv, struct  
    103103        if (sample_idx >= 0) { 
    104104                sample = true; 
     
    114114  
    115115        if (mp->hw->max_rates >= 3) { 
    116 @@ -648,33 +664,27 @@ minstrel_ht_get_rate(void *priv, struct  
     116@@ -650,33 +666,27 @@ minstrel_ht_get_rate(void *priv, struct  
    117117                 * max_tp_rate -> max_tp_rate2 -> max_prob_rate by default. 
    118118                 */ 
     
    158158        mi->total_packets++; 
    159159  
    160 @@ -766,6 +776,7 @@ minstrel_ht_update_caps(void *priv, stru 
     160@@ -768,6 +778,7 @@ minstrel_ht_update_caps(void *priv, stru 
    161161        if (!n_supported) 
    162162                goto use_legacy; 
  • branches/backfire/package/mac80211/patches/530-mac80211_cur_txpower.patch

    r28388 r29275  
    11--- a/include/net/mac80211.h 
    22+++ b/include/net/mac80211.h 
    3 @@ -798,7 +798,7 @@ enum ieee80211_smps_mode { 
     3@@ -816,7 +816,7 @@ enum ieee80211_smps_mode { 
    44  */ 
    55 struct ieee80211_conf { 
     
    1212--- a/net/mac80211/cfg.c 
    1313+++ b/net/mac80211/cfg.c 
    14 @@ -1568,7 +1568,7 @@ static int ieee80211_get_tx_power(struct 
     14@@ -1677,7 +1677,7 @@ static int ieee80211_get_tx_power(struct 
    1515 { 
    1616        struct ieee80211_local *local = wiphy_priv(wiphy); 
     
    2323--- a/net/mac80211/main.c 
    2424+++ b/net/mac80211/main.c 
    25 @@ -210,6 +210,7 @@ int ieee80211_hw_config(struct ieee80211 
     25@@ -208,6 +208,7 @@ int ieee80211_hw_config(struct ieee80211 
    2626  
    2727        if (local->hw.conf.power_level != power) { 
  • branches/backfire/package/mac80211/patches/531-ath9k_cur_txpower.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -1714,6 +1714,8 @@ static int ath9k_config(struct ieee80211 
     3@@ -1684,6 +1684,8 @@ int ath9k_config(struct ieee80211_hw *hw 
    44                        return -EINVAL; 
    55                } 
     
    1010                 * The most recent snapshot of channel->noisefloor for the old 
    1111                 * channel is only available after the hardware reset. Copy it to 
    12 @@ -1731,6 +1733,7 @@ static int ath9k_config(struct ieee80211 
     12@@ -1699,6 +1701,7 @@ int ath9k_config(struct ieee80211_hw *hw 
     13                sc->config.txpowlimit = 2 * conf->power_level; 
    1314                ath9k_cmn_update_txpow(ah, sc->curtxpow, 
    1415                                       sc->config.txpowlimit, &sc->curtxpow); 
    15                 ath9k_ps_restore(sc); 
    1616+               conf->cur_power_level = sc->curtxpow / 2; 
    1717        } 
    1818  
    19         if (disable_radio) { 
     19        mutex_unlock(&sc->mutex); 
  • branches/backfire/package/mac80211/patches/540-ath9k_limit_qlen.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -237,6 +237,7 @@ struct ath_atx_tid { 
     3@@ -238,6 +238,7 @@ struct ath_atx_tid { 
    44        struct ath_node *an; 
    55        struct ath_atx_ac *ac; 
     
    99        u16 seq_next; 
    1010        u16 baw_size; 
    11 @@ -282,6 +283,9 @@ struct ath_tx_control { 
     11@@ -284,6 +285,9 @@ struct ath_tx_control { 
    1212  *  (axq_qnum). 
    1313  */ 
     
    2121--- a/drivers/net/wireless/ath/ath9k/debug.c 
    2222+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    23 @@ -1654,6 +1654,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
     23@@ -1729,6 +1729,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
    2424                            sc, &fops_wiphy); 
    2525        debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, 
     
    3434--- a/drivers/net/wireless/ath/ath9k/xmit.c 
    3535+++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    36 @@ -350,6 +350,14 @@ static void ath_tx_count_frames(struct a 
     36@@ -355,6 +355,14 @@ static void ath_tx_count_frames(struct a 
    3737        } 
    3838 } 
     
    4949 static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, 
    5050                                 struct ath_buf *bf, struct list_head *bf_q, 
    51 @@ -438,6 +446,8 @@ static void ath_tx_complete_aggr(struct  
     51@@ -443,6 +451,8 @@ static void ath_tx_complete_aggr(struct  
    5252        __skb_queue_head_init(&bf_pending); 
    5353  
     
    5858                u16 seqno = bf->bf_state.seqno; 
    5959  
    60 @@ -816,6 +826,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
     60@@ -823,6 +833,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
    6161                        ath_tx_addto_baw(sc, tid, seqno); 
    6262                bf->bf_state.ndelim = ndelim; 
     
    6666                list_add_tail(&bf->list, bf_q); 
    6767                if (bf_prev) 
    68 @@ -1693,6 +1704,8 @@ static void ath_tx_send_ampdu(struct ath 
     68@@ -1682,6 +1693,8 @@ static void ath_tx_send_ampdu(struct ath 
    6969        /* Add sub-frame to BAW */ 
    7070        ath_tx_addto_baw(sc, tid, bf->bf_state.seqno); 
     
    7575        TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw); 
    7676        bf->bf_lastbf = bf; 
    77 @@ -1821,23 +1834,13 @@ error: 
     77@@ -1810,23 +1823,13 @@ error: 
    7878  
    7979 /* FIXME: tx power */ 
     
    101101        if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { 
    102102                /* 
    103 @@ -1872,6 +1875,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
     103@@ -1861,6 +1864,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
    104104        struct ieee80211_vif *vif = info->control.vif; 
    105105        struct ath_softc *sc = hw->priv; 
     
    109109        int frmlen = skb->len + FCS_LEN; 
    110110        int q; 
    111 @@ -1916,6 +1920,24 @@ int ath_tx_start(struct ieee80211_hw *hw 
     111@@ -1903,6 +1907,24 @@ int ath_tx_start(struct ieee80211_hw *hw 
    112112  
    113113        setup_frame_info(hw, skb, frmlen); 
     
    134134         * At this point, the vif, hw_key and sta pointers in the tx control 
    135135         * info are no longer valid (overwritten by the ath_frame_info data. 
    136 @@ -1930,7 +1952,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
     136@@ -1917,7 +1939,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
    137137        } 
    138138        spin_unlock_bh(&txq->axq_lock); 
  • branches/backfire/package/mac80211/patches/541-ath9k_sw_retry_reduce.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/xmit.c 
    22+++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    3 @@ -259,14 +259,17 @@ static void ath_tid_drain(struct ath_sof 
     3@@ -264,14 +264,17 @@ static void ath_tid_drain(struct ath_sof 
    44 } 
    55  
     
    2121  
    2222        hdr = (struct ieee80211_hdr *)skb->data; 
    23 @@ -382,6 +385,7 @@ static void ath_tx_complete_aggr(struct  
     23@@ -387,6 +390,7 @@ static void ath_tx_complete_aggr(struct  
    2424        int nframes; 
    2525        u8 tidno; 
    26         bool clear_filter; 
     26        bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH); 
    2727+       int i, retries; 
    2828  
    2929        skb = bf->bf_mpdu; 
    3030        hdr = (struct ieee80211_hdr *)skb->data; 
    31 @@ -390,6 +394,10 @@ static void ath_tx_complete_aggr(struct  
     31@@ -395,6 +399,10 @@ static void ath_tx_complete_aggr(struct  
    3232  
    3333        memcpy(rates, tx_info->control.rates, sizeof(rates)); 
     
    4040  
    4141        sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); 
    42 @@ -475,7 +483,8 @@ static void ath_tx_complete_aggr(struct  
     42@@ -481,7 +489,8 @@ static void ath_tx_complete_aggr(struct  
     43                                txpending = 1; 
    4344                        } else if (fi->retries < ATH_MAX_SW_RETRIES) { 
    44                                 if (!(ts->ts_status & ATH9K_TXERR_FILT) || 
    45                                     !an->sleeping) 
     45                                if (txok || !an->sleeping) 
    4646-                                       ath_tx_set_retry(sc, txq, bf->bf_mpdu); 
    4747+                                       ath_tx_set_retry(sc, txq, bf->bf_mpdu, 
    4848+                                                        retries); 
    4949  
    50                                 clear_filter = true; 
    5150                                txpending = 1; 
     51                        } else { 
    5252--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    5353+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    54 @@ -540,7 +540,7 @@ struct ath_ant_comb { 
     54@@ -546,7 +546,7 @@ struct ath_ant_comb { 
    5555 #define DEFAULT_CACHELINE       32 
    5656 #define ATH_REGCLASSIDS_MAX     10 
  • branches/backfire/package/mac80211/patches/542-ath9k_ar9280_cold_reset.patch

    r29259 r29275  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -1371,10 +1371,16 @@ static bool ath9k_hw_set_reset_reg(struc 
     3@@ -1382,10 +1382,16 @@ static bool ath9k_hw_set_reset_reg(struc 
    44 static bool ath9k_hw_chip_reset(struct ath_hw *ah, 
    55                                struct ath9k_channel *chan) 
  • branches/backfire/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch

    r28388 r29275  
    118118        /* 
    119119         * Capabilities 
    120 @@ -960,6 +962,11 @@ struct rt2x00_dev { 
     120@@ -961,6 +963,11 @@ struct rt2x00_dev { 
    121121        const struct firmware *fw; 
    122122  
     
    240240--- a/drivers/net/wireless/rt2x00/rt2x00dev.c 
    241241+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c 
    242 @@ -1142,6 +1142,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de 
    243         INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); 
    244         INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); 
     242@@ -1145,6 +1145,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de 
     243                    BIT(NL80211_IFTYPE_MESH_POINT) | 
     244                    BIT(NL80211_IFTYPE_WDS); 
    245245  
    246246+       retval = rt2x00lib_load_eeprom_file(rt2x00dev); 
     
    249249+ 
    250250        /* 
    251          * Let the driver probe the device to detect the capabilities. 
     251         * Initialize work. 
    252252         */ 
    253 @@ -1243,6 +1247,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ 
     253@@ -1261,6 +1265,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ 
    254254         * Free queue structures. 
    255255         */ 
  • branches/backfire/package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch

    r28138 r29275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -574,6 +574,7 @@ CONFIG_RT2X00=y 
     3@@ -567,6 +567,7 @@ CONFIG_RT2X00=y 
    44 CONFIG_RT2X00_LIB=m 
    55 CONFIG_RT2800_LIB=m 
  • branches/backfire/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch

    r28138 r29275  
    11--- a/drivers/net/wireless/mwl8k.c 
    22+++ b/drivers/net/wireless/mwl8k.c 
    3 @@ -5192,6 +5192,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") 
     3@@ -5193,6 +5193,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") 
    44 MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API)); 
    55  
  • branches/backfire/package/mac80211/patches/800-b43-gpio-mask-module-option.patch

    r28388 r29275  
    11--- a/drivers/net/wireless/b43/b43.h 
    22+++ b/drivers/net/wireless/b43/b43.h 
    3 @@ -753,6 +753,7 @@ struct b43_wldev { 
     3@@ -791,6 +791,7 @@ struct b43_wldev { 
    44        bool qos_enabled;               /* TRUE, if QoS is used. */ 
    55        bool hwcrypto_enabled;          /* TRUE, if HW crypto acceleration is enabled. */ 
     
    2323 module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); 
    2424 MODULE_PARM_DESC(bad_frames_preempt, 
    25 @@ -2679,10 +2684,10 @@ static int b43_gpio_init(struct b43_wlde 
     25@@ -2686,10 +2691,10 @@ static int b43_gpio_init(struct b43_wlde 
    2626                    & ~B43_MACCTL_GPOUTSMSK); 
    2727  
  • branches/backfire/package/mac80211/patches/810-b43_no_pio.patch

    r28388 r29275  
    1212--- a/drivers/net/wireless/b43/main.c 
    1313+++ b/drivers/net/wireless/b43/main.c 
    14 @@ -1886,9 +1886,11 @@ static void b43_do_interrupt_thread(stru 
     14@@ -1893,9 +1893,11 @@ static void b43_do_interrupt_thread(stru 
    1515                               dma_reason[4], dma_reason[5]); 
    1616                        b43err(dev->wl, "This device does not support DMA " 
Note: See TracChangeset for help on using the changeset viewer.