Changeset 36470


Ignore:
Timestamp:
2013-04-28T14:37:09+02:00 (5 years ago)
Author:
nbd
Message:

mac80211: update to 2013-02-22 from trunk + backports

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

Location:
branches/attitude_adjustment
Files:
39 added
40 deleted
35 edited
1 copied
18 moved

Legend:

Unmodified
Added
Removed
  • branches/attitude_adjustment/Config.in

    r34412 r36470  
    285285                default y 
    286286 
     287        config KERNEL_RELAY 
     288                bool 
     289 
    287290        comment "Package build options" 
    288291 
  • branches/attitude_adjustment/package/mac80211/Makefile

    r35777 r36470  
    1111PKG_NAME:=mac80211 
    1212 
    13 PKG_VERSION:=2012-09-07 
    14 PKG_RELEASE:=3 
     13PKG_VERSION:=2013-02-22 
     14PKG_RELEASE:=1 
    1515PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources 
    16 PKG_MD5SUM:=59e0a114ee4b755a6e47cb6cd0f32ebc 
     16PKG_MD5SUM:=de1a03ca1f72748d4523672c8facbf7e 
    1717 
    1818PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 
     
    2020PKG_BUILD_PARALLEL:=1 
    2121 
     22PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org> 
     23 
    2224PKG_DRIVERS = \ 
    23         ath5k libertas-usb libertas-sd p54-common p54-pci p54-usb p54-spi \ 
     25        adm8211 ath5k libertas-usb libertas-sd p54-common p54-pci p54-usb p54-spi \ 
    2426        rt2x00-lib rt2x00-pci rt2x00-usb rt2x00-soc rt2800-lib rt2400-pci \ 
    2527        rt2500-pci rt2500-usb rt61-pci rt73-usb rt2800-pci rt2800-usb \ 
     
    4042        CONFIG_ATH_USER_REGD \ 
    4143 
    42 CARL9170_FW_VERSION:=1.9.4 
     44CARL9170_FW_VERSION:=1.9.6 
    4345 
    4446include $(INCLUDE_DIR)/package.mk 
     
    7981 
    8082define KernelPackage/mac80211/config 
    81         menu "Configuration" 
    82                 depends on PACKAGE_kmod-mac80211 
     83  if PACKAGE_kmod-mac80211 
    8384 
    8485        config PACKAGE_MAC80211_DEBUGFS 
    8586                bool "Export mac80211 internals in DebugFS" 
     87                select KERNEL_DEBUG_FS 
     88                select KERNEL_RELAY if PACKAGE_kmod-ath9k-common 
    8689                default y 
    8790                help 
     
    8992                  the internal state of mac80211 in debugfs. 
    9093 
    91                   Say N unless you know you need this. 
    92  
    9394        config PACKAGE_MAC80211_MESH 
    9495                bool "Enable 802.11s mesh support" 
    9596                default y 
    9697 
    97         endmenu 
     98  endif 
    9899endef 
    99100 
     
    103104 
    104105PKG_LINUX_FIRMWARE_NAME:=linux-firmware 
    105 PKG_LINUX_FIRMWARE_VERSION:=375e9548bf75a5664256d47a2f9e14b79181e02d 
     106PKG_LINUX_FIRMWARE_VERSION:=6942dba419d2ebf8c15514972e89734fd7a8cebc 
    106107PKG_LINUX_FIRMWARE_SOURCE:=$(PKG_LINUX_FIRMWARE_NAME)-$(PKG_LINUX_FIRMWARE_VERSION).tar.bz2 
    107108PKG_LINUX_FIRMWARE_PROTO:=git 
    108 # PKG_LINUX_FIRMWARE_SOURCE_URL:=git://git.infradead.org/users/dwmw2/linux-firmware.git 
    109109PKG_LINUX_FIRMWARE_SOURCE_URL:=git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git 
    110110PKG_LINUX_FIRMWARE_SUBDIR:=$(PKG_LINUX_FIRMWARE_NAME)-$(PKG_LINUX_FIRMWARE_VERSION) 
     111PKG_LINUX_FIRMWARE_MIRROR_MD5SUM:=a5f8c27af9e43f0ad24d7f821c5a781e 
    111112 
    112113define Download/linux-firmware 
     
    117118  VERSION:=$(PKG_LINUX_FIRMWARE_VERSION) 
    118119  SUBDIR:=$(PKG_LINUX_FIRMWARE_SUBDIR) 
     120  MIRROR_MD5SUM:=$(PKG_LINUX_FIRMWARE_MIRROR_MD5SUM) 
    119121endef 
    120122$(eval $(call Download,linux-firmware)) 
     
    150152  FILE:=$(CARL9170_FW)-$(CARL9170_FW_VERSION) 
    151153  URL:=http://downloads.openwrt.org/sources/ 
    152   MD5SUM:=30e2ae80c33b3008d271556d1a14e3ea 
     154  MD5SUM:=2fa6ed98d53d0b5fbcc136d1cf5e9609 
    153155endef 
    154156$(eval $(call Download,carl9170)) 
     
    216218 
    217219define KernelPackage/rt2x00-lib/config 
    218         menu "Configuration" 
    219                 depends PACKAGE_kmod-rt2x00-lib 
     220  if PACKAGE_kmod-rt2x00-lib 
    220221 
    221222        config PACKAGE_RT2X00_LIB_DEBUGFS 
    222223                bool "Enable rt2x00 debugfs support" 
    223                 depends PACKAGE_MAC80211_DEBUGFS 
     224                depends on PACKAGE_MAC80211_DEBUGFS 
    224225                help 
    225226                  Enable creation of debugfs files for the rt2x00 drivers. 
     
    232233                  Enable debugging output for all rt2x00 modules 
    233234 
    234         endmenu 
     235  endif 
    235236endef 
    236237 
     
    363364endef 
    364365 
     366define KernelPackage/adm8211 
     367  $(call KernelPackage/mac80211/Default) 
     368  TITLE:=ADMTek 8211 support 
     369  DEPENDS+=@PCI_SUPPORT +kmod-mac80211 +kmod-eeprom-93cx6 
     370  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/adm8211.ko 
     371  AUTOLOAD:=$(call AutoLoad,60,adm8211) 
     372endef 
     373 
    365374define KernelPackage/ath/config 
    366         menu "Configuration" 
    367                 depends on PACKAGE_kmod-ath 
    368  
     375  if PACKAGE_kmod-ath 
    369376        config ATH_USER_REGD 
    370377                bool "Force Atheros drivers to respect the user's regdomain settings" 
     
    383390                  Say Y, if you want to debug atheros wireless drivers. 
    384391                  Right now only ath9k makes use of this. 
    385  
    386         endmenu 
     392  endif 
    387393endef 
    388394 
     
    644650 
    645651define KernelPackage/iwlagn/config 
    646         menu "Configuration" 
    647                 depends on PACKAGE_kmod-iwlagn 
     652  if PACKAGE_kmod-iwlagn 
    648653 
    649654        config IWL5000_FW 
     
    652657                help 
    653658                  Download and install firmware for: 
    654                     Intel 5000 wireless card into /lib/firmware. 
     659                    Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN 
    655660 
    656661        config IWL5150_FW 
     
    659664                help 
    660665                  Download and install firmware for: 
    661                     Intel 5150 wireless card into /lib/firmware. 
     666                    Intel Wireless WiFi 5150AGN 
    662667 
    663668        config IWL1000_FW 
     
    666671                help 
    667672                  Download and install firmware for: 
    668                     Intel 1000 wireless card into /lib/firmware. 
     673                    Intel Centrino Wireless-N 1000 
    669674 
    670675        config IWL6000_FW 
     
    673678                help 
    674679                  Download and install firmware for: 
    675                     Intel 6000 wireless card into /lib/firmware. 
     680                    Intel Centrino Ultimate-N 6300 and Advanced-N 6200 
    676681 
    677682        config IWL6050_FW 
     
    680685                help 
    681686                  Download and install firmware for: 
    682                     Intel 6050 wireless card into /lib/firmware. 
     687                    Intel Centrino Advanced-N + WiMAX 6250 and Wireless-N + WiMAX 6150 
    683688 
    684689        config IWL6005_FW 
     
    687692                help 
    688693                  Download and install firmware for: 
    689                     Intel 6005 wireless card into /lib/firmware. 
     694                    Intel Centrino Advanced-N 6205 
    690695 
    691696        config IWL6030_FW 
     
    694699                help 
    695700                  Download and install firmware for: 
    696                     Intel 6030 wireless card into /lib/firmware. 
     701                    Intel Centrino Advanced-N 6230, Wireless-N 1030, Wireless-N 130 and Advanced-N 6235 
    697702 
    698703        config IWL100_FW 
     
    701706                help 
    702707                  Download and install firmware for: 
    703                     Intel 100 wireless card into /lib/firmware. 
    704  
    705         endmenu 
     708                    Intel Centrino Wireless-N 100 
     709 
     710        config IWL2000_FW 
     711                bool "Intel 2000 Firmware" 
     712                default y 
     713                help 
     714                  Download and install firmware for: 
     715                    Intel Centrino Wireless-N 2200 
     716 
     717        config IWL2030_FW 
     718                bool "Intel 2030 Firmware" 
     719                default y 
     720                help 
     721                  Download and install firmware for: 
     722                    Intel Centrino Wireless-N 2230 
     723 
     724        config IWL105_FW 
     725                bool "Intel 105 Firmware" 
     726                default y 
     727                help 
     728                  Download and install firmware for: 
     729                    Intel Centrino Wireless-N 105 
     730 
     731        config IWL135_FW 
     732                bool "Intel 135 Firmware" 
     733                default y 
     734                help 
     735                  Download and install firmware for: 
     736                    Intel Centrino Wireless-N 135 
     737  endif 
    706738endef 
    707739 
     
    823855PKG_B43_FWV3_MD5SUM:=e08665c5c5b66beb9c3b2dd54aa80cb3 
    824856 
    825 ifeq ($(CONFIG_B43_OPENFIRMWARE),y) 
    826   PKG_B43_FWCUTTER_NAME:=b43-fwcutter 
    827   PKG_B43_FWCUTTER_VERSION:=3e69531aa65b8f664a0ab00dfc3e2eefeb0cb417 
    828   PKG_B43_FWCUTTER_SOURCE:=$(PKG_B43_FWCUTTER_NAME)-$(PKG_B43_FWCUTTER_VERSION).tar.bz2 
    829   PKG_B43_FWCUTTER_PROTO:=git 
    830   PKG_B43_FWCUTTER_SOURCE_URL:=http://git.bu3sch.de/git/b43-tools.git 
    831   PKG_B43_FWCUTTER_SUBDIR:=$(PKG_B43_FWCUTTER_NAME)-$(PKG_B43_FWCUTTER_VERSION) 
    832   PKG_B43_FWCUTTER_OBJECT:=$(PKG_B43_FWCUTTER_NAME)-$(PKG_B43_FWCUTTER_VERSION)/fwcutter/ 
    833 else 
    834   PKG_B43_FWCUTTER_NAME:=b43-fwcutter 
    835   PKG_B43_FWCUTTER_VERSION:=015 
    836   PKG_B43_FWCUTTER_SOURCE:=$(PKG_B43_FWCUTTER_NAME)-$(PKG_B43_FWCUTTER_VERSION).tar.bz2 
    837   PKG_B43_FWCUTTER_PROTO:=default 
    838   PKG_B43_FWCUTTER_SOURCE_URL:=http://bu3sch.de/b43/fwcutter/ 
    839   PKG_B43_FWCUTTER_MD5SUM:=628e030565222a107bc40300313cbe76 
    840   PKG_B43_FWCUTTER_SUBDIR:=b43-fwcutter-$(PKG_B43_FWCUTTER_VERSION) 
    841   PKG_B43_FWCUTTER_OBJECT:=$(PKG_B43_FWCUTTER_NAME)-$(PKG_B43_FWCUTTER_VERSION)/ 
    842 endif 
    843  
    844 define Download/b43-common 
    845   FILE:=$(PKG_B43_FWCUTTER_SOURCE) 
    846   URL:=$(PKG_B43_FWCUTTER_SOURCE_URL) 
    847   MD5SUM:=$(PKG_B43_FWCUTTER_MD5SUM) 
    848   PROTO:=$(PKG_B43_FWCUTTER_PROTO) 
    849   VERSION:=$(PKG_B43_FWCUTTER_VERSION) 
    850   SUBDIR:=$(PKG_B43_FWCUTTER_SUBDIR) 
    851 endef 
    852 $(eval $(call Download,b43-common)) 
    853  
    854857define Download/b43 
    855858  FILE:=$(PKG_B43_FWV4_SOURCE) 
     
    866869$(eval $(call Download,b43legacy)) 
    867870 
    868 define KernelPackage/b43-common 
    869   $(call KernelPackage/mac80211/Default) 
    870   TITLE:=Generic stuff for Broadcom wireless devices 
     871 
     872define KernelPackage/b43 
     873  $(call KernelPackage/mac80211/Default) 
     874  TITLE:=Broadcom 43xx wireless support 
    871875  URL:=http://linuxwireless.org/en/users/Drivers/b43 
    872876  KCONFIG:= \ 
    873877        CONFIG_HW_RANDOM=y 
    874   DEPENDS+= +kmod-mac80211 +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb 
    875 endef 
    876  
    877 define KernelPackage/b43 
    878 $(call KernelPackage/b43-common) 
    879   DEPENDS+= +@DRIVER_11N_SUPPORT +!TARGET_brcm47xx:kmod-bcma 
    880   TITLE:=Broadcom 43xx wireless support 
     878  DEPENDS+= +kmod-mac80211 +!TARGET_brcm47xx:kmod-bcma +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb 
    881879  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/b43/b43.ko 
    882880  AUTOLOAD:=$(call AutoLoad,30,b43) 
     
    885883 
    886884define KernelPackage/b43/config 
    887         menu "Configuration" 
    888                 depends on PACKAGE_kmod-b43 
     885  if PACKAGE_kmod-b43 
    889886 
    890887        choice 
     
    918915 
    919916                  If unsure, select the "stable" firmware. 
    920     
     917 
    921918        config B43_FW_5_100_138 
    922919                bool "Firmware 666.2 from driver 5.100.138 (stable)" 
     
    957954                string "Core revisions to include" 
    958955                depends on B43_FW_SQUASH 
    959                 default "5,6,7,8,9,10,11,13,14,15,16" 
     956                default "5,6,7,8,9,10,11,13,15,16,29" 
    960957                help 
    961958                  This is a comma seperated list of core revision numbers. 
     
    970967                string "PHY types to include" 
    971968                depends on B43_FW_SQUASH 
    972                 default "G,LP,N" 
     969                default "G,LP,N,HT" 
    973970                help 
    974971                  This is a comma seperated list of PHY types: 
     
    10091006                default y 
    10101007                help 
    1011                   Enable support for BCM4321 and BCM4322. 
     1008                  Enable support for N-PHY. This includes support for the following devices: 
     1009                  PCI: BCM4321, BCM4322, BCM43222, BCM43224, BCM43225 
     1010                  SoC: BCM4716, BCM4717, BCM4718 
    10121011 
    10131012                  Currently only 11g speed is available. 
     
    10171016        config PACKAGE_B43_PHY_HT 
    10181017                bool "Enable support for HT-PHYs" 
    1019                 default n 
    1020                 help 
    1021                   Currently broken. 
    1022  
    1023                   If unsure, say N. 
     1018                default y 
     1019                help 
     1020                  Enable support for HT-PHY. This includes support for the following devices: 
     1021                  PCI: BCM4331 
     1022 
     1023                  Currently only 11g speed is available. 
     1024 
     1025                  If unsure, say Y. 
    10241026 
    10251027        config PACKAGE_B43_PHY_LCN 
     
    10321034                  If unsure, say N. 
    10331035 
    1034         endmenu 
     1036  endif 
    10351037endef 
    10361038 
     
    10401042 
    10411043define KernelPackage/b43legacy 
    1042 $(call KernelPackage/b43-common) 
     1044  $(call KernelPackage/mac80211/Default) 
    10431045  TITLE:=Broadcom 43xx-legacy wireless support 
     1046  URL:=http://linuxwireless.org/en/users/Drivers/b43 
     1047  KCONFIG:= \ 
     1048        CONFIG_HW_RANDOM=y 
     1049  DEPENDS+= +kmod-mac80211 +!(TARGET_brcm47xx||TARGET_brcm63xx):kmod-ssb 
    10441050  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/b43legacy/b43legacy.ko 
    10451051  AUTOLOAD:=$(call AutoLoad,30,b43legacy) 
     
    10481054 
    10491055define KernelPackage/b43legacy/config 
    1050         menu "Configuration" 
    1051                 depends on PACKAGE_kmod-b43legacy 
     1056  if PACKAGE_kmod-b43legacy 
    10521057 
    10531058        config B43LEGACY_FW_SQUASH 
     
    10741079                    2,4 
    10751080 
    1076         endmenu 
     1081  endif 
    10771082endef 
    10781083 
     
    10971102 
    10981103define KernelPackage/brcmutil/config 
    1099         menu "Configuration" 
    1100                 depends on PACKAGE_kmod-brcmutil 
     1104  if PACKAGE_kmod-brcmutil 
    11011105 
    11021106        config PACKAGE_BRCM80211_DEBUG 
     
    11051109                  Say Y, if you want to debug brcmsmac and brcmfmac wireless driver. 
    11061110 
    1107         endmenu 
    1108 endef 
     1111  endif 
     1112endef 
     1113 
     1114PKG_BRCMSMAC_FW_NAME:=broadcom-wl 
     1115PKG_BRCMSMAC_FW_VERSION:=5.100.138 
     1116PKG_BRCMSMAC_FW_OBJECT:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION)/linux/wl_apsta.o 
     1117PKG_BRCMSMAC_FW_SOURCE:=$(PKG_BRCMSMAC_FW_NAME)-$(PKG_BRCMSMAC_FW_VERSION).tar.bz2 
     1118PKG_BRCMSMAC_FW_SOURCE_URL:=http://www.lwfinger.com/b43-firmware/ 
     1119PKG_BRCMSMAC_FW_MD5SUM:=f4e357b09eaf5d8b1f1920cf3493a555 
     1120 
     1121define Download/brcmsmac 
     1122  FILE:=$(PKG_BRCMSMAC_FW_SOURCE) 
     1123  URL:=$(PKG_BRCMSMAC_FW_SOURCE_URL) 
     1124  MD5SUM:=$(PKG_BRCMSMAC_FW_MD5SUM) 
     1125endef 
     1126$(eval $(call Download,brcmsmac)) 
    11091127 
    11101128define KernelPackage/brcmsmac 
     
    11151133  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/brcm80211/brcmsmac/brcmsmac.ko 
    11161134  AUTOLOAD:=$(call AutoLoad,31,brcmsmac) 
     1135  MENU:=1 
    11171136endef 
    11181137 
     
    11201139 Kernel module for Broadcom IEEE802.11n PCIe Wireless cards 
    11211140endef 
     1141 
     1142define KernelPackage/brcmsmac/config 
     1143  if PACKAGE_kmod-brcmsmac 
     1144 
     1145        config BRCMSMAC_USE_FW_FROM_WL 
     1146                bool "Use firmware extracted from broadcom proprietary driver" 
     1147                default y 
     1148                help 
     1149                  Instead of using the official brcmsmac firmware a firmware 
     1150                  version 666.2 extracted from the proprietary Broadcom driver 
     1151                  is used. This is needed to get core rev 17 used in bcm4716 
     1152                  to work. 
     1153 
     1154                  If unsure, say Y. 
     1155 
     1156  endif 
     1157endef 
     1158 
    11221159 
    11231160define KernelPackage/brcmfmac 
     
    11781215        CROSS_COMPILE="$(KERNEL_CROSS)" \ 
    11791216        ARCH="$(LINUX_KARCH)" \ 
    1180         EXTRA_CFLAGS="$(BUILDFLAGS)" \ 
     1217        EXTRA_CFLAGS="$(BUILDFLAGS) -Wno-undef" \ 
    11811218        $(foreach opt,$(CONFOPTS),CONFIG_$(opt)=m) \ 
    11821219        CONFIG_CFG80211_INTERNAL_REGDB=y \ 
     
    12051242        CONFIG_B43_BCMA=y \ 
    12061243        CONFIG_B43_SSB=y \ 
     1244        CONFIG_ATH_CARDS=$(if $(CONFIG_PACKAGE_kmod-ath),m) \ 
    12071245        CONFIG_ATH_COMMON=$(if $(CONFIG_PACKAGE_kmod-ath),m) \ 
    12081246        CONFIG_ATH_DEBUG=$(if $(CONFIG_PACKAGE_ATH_DEBUG),y) \ 
     
    12201258        CONFIG_ATH9K_COMMON=$(if $(CONFIG_PACKAGE_kmod-ath9k-common),m) \ 
    12211259        CONFIG_ATH9K_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \ 
     1260        CONFIG_AR5523= \ 
     1261        CONFIG_WIL6210= \ 
    12221262        CONFIG_CARL9170=$(if $(CONFIG_PACKAGE_kmod-carl9170),m) \ 
    12231263        CONFIG_CARL9170_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \ 
     
    12741314        CONFIG_ATMEL= \ 
    12751315        CONFIG_PCMCIA_ATMEL= \ 
    1276         CONFIG_ADM8211= \ 
     1316        CONFIG_ADM8211=$(if $(CONFIG_PACKAGE_kmod-adm8211),m) \ 
    12771317        CONFIG_USB_NET_RNDIS_HOST= \ 
    12781318        CONFIG_USB_NET_RNDIS_WLAN= \ 
     
    13011341        CONFIG_MAC80211_RC_MINSTREL_HT=y \ 
    13021342        MADWIFI= \ 
    1303         CONFIG_B44= \ 
    1304         CONFIG_ATL1= \ 
    1305         CONFIG_ATL2= \ 
    1306         CONFIG_ATL1E= \ 
    1307         CONFIG_ATL1C= \ 
    13081343        CONFIG_BRCMUTIL=$(if $(CONFIG_PACKAGE_kmod-brcmutil),m) \ 
    13091344        CONFIG_BRCMSMAC=$(if $(CONFIG_PACKAGE_kmod-brcmsmac),m) \ 
     
    13211356endif 
    13221357 
     1358DISABLE_CONFIG = \ 
     1359        COMPAT_BLUETOOTH.* \ 
     1360        COMPAT_CORDIC \ 
     1361        COMPAT_CRC8 \ 
     1362        COMPAT_MDIO \ 
     1363        COMPAT_NETWORK_MODULES \ 
     1364        COMPAT_NET_USB_MODULES \ 
     1365        COMPAT_VAR_MODULES \ 
     1366        COMPAT_RFKILL \ 
     1367        COMPAT_RFKILL_.* \ 
     1368        COMPAT_STAGING \ 
     1369        \ 
     1370        B43_PCMCIA \ 
     1371        B43_SDIO \ 
     1372        BCMA.* \ 
     1373        COMPAT_ATH9K_RATE_CONTROL \ 
     1374        HID_GENERIC \ 
     1375        MAC80211_RC_PID \ 
     1376        PCMCIA \ 
     1377        RFKILL_BACKPORT.* \ 
     1378        SSB \ 
     1379        SSB_SDIOHOST \ 
     1380        \ 
     1381        ATH5K_PCI \ 
     1382        ATH9K_BTCOEX_SUPPORT \ 
     1383        B43_PHY_N \ 
     1384        B43_PHY_HT \ 
     1385        B43_BCMA.* \ 
     1386        MAC80211_MESH \ 
     1387        RT2X00_LIB_PCI \ 
     1388        RT2X00_LIB_USB \ 
     1389        COMPAT_MWIFIEX 
     1390 
     1391 
    13231392define Build/Prepare 
    13241393        rm -rf $(PKG_BUILD_DIR) 
     
    13301399        $(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(ZD1211FW_NAME)-$(ZD1211FW_VERSION).tar.bz2 
    13311400        $(TAR) -C $(PKG_BUILD_DIR) -xjf $(DL_DIR)/$(PKG_LINUX_FIRMWARE_SOURCE) 
    1332         rm -rf $(PKG_BUILD_DIR)/include/linux/ssb 
    1333         rm -rf $(PKG_BUILD_DIR)/include/linux/bcma 
    1334         rm -rf $(PKG_BUILD_DIR)/include/net/bluetooth/ 
    1335         rm -f $(PKG_BUILD_DIR)/include/linux/eeprom_93cx6.h 
    1336         rm -f $(PKG_BUILD_DIR)/include/linux/wl12xx.h 
    1337         rm -f $(PKG_BUILD_DIR)/include/linux/spi/libertas_spi.h 
    1338         rm -f $(PKG_BUILD_DIR)/include/net/ieee80211.h 
     1401        rm -rf \ 
     1402                $(PKG_BUILD_DIR)/include/linux/ssb \ 
     1403                $(PKG_BUILD_DIR)/include/linux/bcma \ 
     1404                $(PKG_BUILD_DIR)/include/net/bluetooth 
     1405 
     1406        rm -f \ 
     1407                $(PKG_BUILD_DIR)/include/linux/cordic.h \ 
     1408                $(PKG_BUILD_DIR)/include/linux/crc8.h \ 
     1409                $(PKG_BUILD_DIR)/include/linux/eeprom_93cx6.h \ 
     1410                $(PKG_BUILD_DIR)/include/linux/wl12xx.h \ 
     1411                $(PKG_BUILD_DIR)/include/linux/spi/libertas_spi.h \ 
     1412                $(PKG_BUILD_DIR)/include/net/ieee80211.h 
     1413 
    13391414        echo 'compat-wireless-$(PKG_VERSION)-$(PKG_RELEASE)-$(REVISION)' > $(PKG_BUILD_DIR)/compat_version 
    13401415        $(CP) ./files/regdb.txt $(PKG_BUILD_DIR)/net/wireless/db.txt 
     1416 
     1417        sed -i $(foreach config,$(DISABLE_CONFIG),-e 's,^\([    ]*export *CONFIG_$(config)=\),# \1,') $(PKG_BUILD_DIR)/config.mk 
    13411418endef 
    13421419 
     
    13691446 
    13701447define KernelPackage/libertas-usb/install 
    1371         $(INSTALL_DIR) $(1)/lib/firmware 
     1448        $(INSTALL_DIR) $(1)/lib/firmware/libertas 
    13721449        $(INSTALL_DATA) \ 
    13731450                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/usb8388_v9.bin \ 
    1374                 $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/usb8388_v5.bin \ 
    13751451                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/usb8682.bin \ 
    1376                 $(1)/lib/firmware/ 
     1452                $(1)/lib/firmware/libertas/ 
    13771453endef 
    13781454 
     
    13841460                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8686_v9_helper.bin \ 
    13851461                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8686_v9.bin \ 
    1386                 $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8686_v8_helper.bin \ 
    1387                 $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8686_v8.bin \ 
    13881462                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8688_helper.bin \ 
    13891463                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8688.bin \ 
     
    14271501define KernelPackage/rt2800-pci/install 
    14281502        $(INSTALL_DIR) $(1)/lib/firmware 
    1429         $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2860.bin $(1)/lib/firmware/ 
     1503        $(INSTALL_DATA) \ 
     1504                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt2860.bin \ 
     1505                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/rt3290.bin \ 
     1506                $(1)/lib/firmware 
    14301507endef 
    14311508 
     
    14381515        $(INSTALL_DIR) $(1)/lib/firmware/ti-connectivity 
    14391516        $(INSTALL_DATA) \ 
    1440                 $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-4-mr.bin \ 
    1441                 $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-4-plt.bin \ 
    1442                 $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-4-sr.bin \ 
     1517                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-mr.bin \ 
     1518                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-plt.bin \ 
     1519                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl127x-fw-5-sr.bin \ 
    14431520                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl1271-nvs.bin \ 
    14441521                $(1)/lib/firmware/ti-connectivity 
     
    14621539        $(INSTALL_DIR) $(1)/lib/firmware/mwl8k 
    14631540        $(INSTALL_DATA) \ 
    1464                 $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8366_ap-2.fw \ 
     1541                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8366_ap-3.fw \ 
    14651542                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/fmimage_8366.fw \ 
    14661543                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/mwl8k/helper_8366.fw \ 
     
    14811558 
    14821559define KernelPackage/iwlagn/install 
    1483         $(INSTALL_DIR) $(1)/lib/firmware 
     1560        $(INSTALL_DIR) $(1)/lib/firmware 
    14841561ifneq ($(CONFIG_IWL5000_FW),) 
    14851562        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-5000-5.ucode $(1)/lib/firmware 
     
    14981575endif 
    14991576ifneq ($(CONFIG_IWL6005_FW),) 
    1500         $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2a-5.ucode $(1)/lib/firmware 
     1577        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2a-6.ucode $(1)/lib/firmware 
    15011578endif 
    15021579ifneq ($(CONFIG_IWL6030_FW),) 
    1503         $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2b-5.ucode $(1)/lib/firmware 
     1580        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2b-6.ucode $(1)/lib/firmware 
    15041581endif 
    15051582ifneq ($(CONFIG_IWL100_FW),) 
    15061583        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-100-5.ucode $(1)/lib/firmware 
    15071584endif 
     1585ifneq ($(CONFIG_IWL2000_FW),) 
     1586        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-2000-6.ucode $(1)/lib/firmware 
     1587endif 
     1588ifneq ($(CONFIG_IWL2030_FW),) 
     1589        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-2030-6.ucode $(1)/lib/firmware 
     1590endif 
     1591ifneq ($(CONFIG_IWL105_FW),) 
     1592        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-105-6.ucode $(1)/lib/firmware 
     1593endif 
     1594ifneq ($(CONFIG_IWL135_FW),) 
     1595        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-135-6.ucode $(1)/lib/firmware 
     1596endif 
    15081597endef 
    15091598 
    15101599define KernelPackage/iwl3945/install 
    1511         $(INSTALL_DIR) $(1)/lib/firmware 
     1600        $(INSTALL_DIR) $(1)/lib/firmware 
    15121601        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-3945-2.ucode $(1)/lib/firmware 
    15131602endef 
    15141603 
    15151604define KernelPackage/iwl4965/install 
    1516         $(INSTALL_DIR) $(1)/lib/firmware 
     1605        $(INSTALL_DIR) $(1)/lib/firmware 
    15171606        $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-4965-2.ucode $(1)/lib/firmware 
    1518 endef 
    1519  
    1520 define Build/b43-common 
    1521         tar xjf "$(DL_DIR)/$(PKG_B43_FWCUTTER_SOURCE)" -C "$(PKG_BUILD_DIR)" 
    1522         patch -p1 -d  "$(PKG_BUILD_DIR)/$(PKG_B43_FWCUTTER_OBJECT)" < ./files/b43-fwcutter-fw-dirname.patch 
    1523         $(MAKE) -C "$(PKG_BUILD_DIR)/$(PKG_B43_FWCUTTER_OBJECT)" \ 
    1524                 CFLAGS="-I$(STAGING_DIR_HOST)/include -include endian.h" \ 
    1525                 QUIET_SPARSE=: 
    1526         $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_B43_FWCUTTER_OBJECT)/b43-fwcutter $(STAGING_DIR_HOST)/bin/ 
    1527 ifeq ($(CONFIG_B43_OPENFIRMWARE),y) 
    1528         $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin/ 
    1529         $(MAKE) -C "$(PKG_BUILD_DIR)/$(PKG_B43_FWCUTTER_SUBDIR)/assembler/" 
    1530         $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_B43_FWCUTTER_SUBDIR)/assembler/b43-asm $(STAGING_DIR_HOST)/bin/ 
    1531         $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_B43_FWCUTTER_SUBDIR)/assembler/b43-asm.bin $(STAGING_DIR_HOST)/bin/ 
    1532 endif 
    1533         $(INSTALL_BIN) ./files/host_bin/b43-fwsquash.py $(STAGING_DIR_HOST)/bin/ 
    15341607endef 
    15351608 
    15361609define KernelPackage/b43/install 
    15371610        rm -rf $(1)/lib/firmware/ 
    1538         $(call Build/b43-common) 
    15391611ifeq ($(CONFIG_B43_OPENFIRMWARE),y) 
    15401612        tar xzf "$(DL_DIR)/$(PKG_B43_FWV4_SOURCE)" -C "$(PKG_BUILD_DIR)" 
     
    15581630 
    15591631define KernelPackage/b43legacy/install 
    1560         $(call Build/b43-common) 
    15611632        $(INSTALL_DIR) $(1)/lib/firmware/ 
    1562  
    15631633        b43-fwcutter --unsupported -w $(1)/lib/firmware/ $(DL_DIR)/$(PKG_B43_FWV3_SOURCE) 
    15641634ifneq ($(CONFIG_B43LEGACY_FW_SQUASH),) 
     
    15691639define KernelPackage/brcmsmac/install 
    15701640        $(INSTALL_DIR) $(1)/lib/firmware/brcm 
     1641ifeq ($(CONFIG_BRCMSMAC_USE_FW_FROM_WL),y) 
     1642        tar xjf "$(DL_DIR)/$(PKG_BRCMSMAC_FW_SOURCE)" -C "$(PKG_BUILD_DIR)" 
     1643        b43-fwcutter --brcmsmac -w $(1)/lib/firmware/ $(PKG_BUILD_DIR)/$(PKG_BRCMSMAC_FW_OBJECT) 
     1644else 
    15711645        $(INSTALL_DATA) \ 
    15721646                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/bcm43xx-0.fw \ 
    15731647                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/brcm/bcm43xx_hdr-0.fw \ 
    15741648                $(1)/lib/firmware/brcm/ 
     1649endif 
    15751650endef 
    15761651 
     
    15821657endef 
    15831658 
     1659$(eval $(call KernelPackage,adm8211)) 
    15841660$(eval $(call KernelPackage,ath5k)) 
    15851661$(eval $(call KernelPackage,lib80211)) 
  • branches/attitude_adjustment/package/mac80211/files/lib/wifi/mac80211.sh

    r36409 r36470  
    77 
    88        cfgfile="/var/run/hostapd-$phy.conf" 
    9         macfile="/var/run/hostapd-$phy.maclist" 
    10         [ -e "$macfile" ] && rm -f "$macfile" 
    119 
    1210        config_get device "$vif" device 
     
    1715        config_get basic_rate_list "$device" basic_rate 
    1816        config_get_bool noscan "$device" noscan 
    19         config_get_bool short_preamble "$device" short_preamble "0" 
    2017 
    2118        hostapd_set_log_options base_cfg "$device" 
     
    5249        [ "$country_ie" -gt 0 ] && append base_cfg "ieee80211d=1" "$N" 
    5350 
    54         config_get macfilter "$vif" macfilter 
    55         case "$macfilter" in 
    56                 allow) 
    57                         append base_cfg "macaddr_acl=1" "$N" 
    58                         append base_cfg "accept_mac_file=$macfile" "$N" 
    59                         ;; 
    60                 deny) 
    61                         append base_cfg "macaddr_acl=0" "$N" 
    62                         append base_cfg "deny_mac_file=$macfile" "$N" 
    63                         ;; 
    64         esac 
    65         config_get maclist "$vif" maclist 
    66         [ -n "$maclist" ] && { 
    67                 for mac in $maclist; do 
    68                         echo "$mac" >> $macfile 
    69                 done 
    70         } 
    71  
    7251        local br brval brstr 
    7352        [ -n "$basic_rate_list" ] && { 
     
    7958        } 
    8059 
    81         append base_cfg "preamble=$short_preamble" "$N" 
    82          
    8360        cat >> "$cfgfile" <<EOF 
    8461ctrl_interface=/var/run/hostapd-$phy 
     
    185162} 
    186163 
     164lookup_phy() { 
     165        [ -n "$phy" ] && { 
     166                [ -d /sys/class/ieee80211/$phy ] && return 
     167        } 
     168 
     169        local devpath 
     170        config_get devpath "$device" path 
     171        [ -n "$devpath" -a -d "/sys/devices/$devpath/ieee80211" ] && { 
     172                phy="$(ls /sys/devices/$devpath/ieee80211 | grep -m 1 phy)" 
     173                [ -n "$phy" ] && return 
     174        } 
     175 
     176        local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')" 
     177        [ -n "$macaddr" ] && { 
     178                for _phy in $(ls /sys/class/ieee80211 2>/dev/null); do 
     179                        [ "$macaddr" = "$(cat /sys/class/ieee80211/${_phy}/macaddress)" ] || continue 
     180                        phy="$_phy" 
     181                        return 
     182                done 
     183        } 
     184        phy= 
     185        return 
     186} 
     187 
    187188find_mac80211_phy() { 
    188189        local device="$1" 
    189190 
    190         local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')" 
    191191        config_get phy "$device" phy 
    192         [ -z "$phy" -a -n "$macaddr" ] && { 
    193                 for phy in $(ls /sys/class/ieee80211 2>/dev/null); do 
    194                         [ "$macaddr" = "$(cat /sys/class/ieee80211/${phy}/macaddress)" ] || continue 
    195                         config_set "$device" phy "$phy" 
    196                         break 
    197                 done 
    198                 config_get phy "$device" phy 
    199         } 
     192        lookup_phy 
    200193        [ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || { 
    201194                echo "PHY for wifi device $1 not found" 
    202195                return 1 
    203196        } 
     197        config_set "$device" phy "$phy" 
     198 
     199        config_get macaddr "$device" macaddr 
    204200        [ -z "$macaddr" ] && { 
    205201                config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)" 
    206202        } 
     203 
    207204        return 0 
    208205} 
     
    594591                iw phy "$dev" info | grep -q '2412 MHz' || { mode_band="a"; channel="36"; } 
    595592 
     593                if [ -x /usr/bin/readlink ]; then 
     594                        path="$(readlink -f /sys/class/ieee80211/${dev}/device)" 
     595                        path="${path##/sys/devices/}" 
     596                        dev_id="        option path     '$path'" 
     597                else 
     598                        dev_id="        option macaddr  $(cat /sys/class/ieee80211/${dev}/macaddress)" 
     599                fi 
     600 
    596601                cat <<EOF 
    597602config wifi-device  radio$devidx 
    598603        option type     mac80211 
    599604        option channel  ${channel} 
    600         option macaddr  $(cat /sys/class/ieee80211/${dev}/macaddress) 
    601605        option hwmode   11${mode_11n}${mode_band} 
     606$dev_id 
    602607$ht_capab 
    603608        # REMOVE THIS LINE TO ENABLE WIFI: 
  • branches/attitude_adjustment/package/mac80211/patches/130-mesh_pathtbl_backport.patch

    r33990 r36470  
    11--- a/net/mac80211/mesh_pathtbl.c 
    22+++ b/net/mac80211/mesh_pathtbl.c 
    3 @@ -813,7 +813,6 @@ static void table_flush_by_iface(struct  
    4         struct hlist_node *p; 
     3@@ -72,9 +72,9 @@ static inline struct mesh_table *resize_ 
     4  * it's used twice. So it is illegal to do 
     5  *     for_each_mesh_entry(rcu_dereference(...), ...) 
     6  */ 
     7-#define for_each_mesh_entry(tbl, p, node, i) \ 
     8+#define for_each_mesh_entry(tbl, node, i) \ 
     9        for (i = 0; i <= tbl->hash_mask; i++) \ 
     10-               hlist_for_each_entry_rcu(node, p, &tbl->hash_buckets[i], list) 
     11+               hlist_for_each_entry_rcu(node, &tbl->hash_buckets[i], list) 
     12  
     13  
     14 static struct mesh_table *mesh_table_alloc(int size_order) 
     15@@ -139,7 +139,7 @@ static void mesh_table_free(struct mesh_ 
     16        } 
     17        if (free_leafs) { 
     18                spin_lock_bh(&tbl->gates_lock); 
     19-               hlist_for_each_entry_safe(gate, p, q, 
     20+               hlist_for_each_entry_safe(gate, q, 
     21                                         tbl->known_gates, list) { 
     22                        hlist_del(&gate->list); 
     23                        kfree(gate); 
     24@@ -333,12 +333,11 @@ static struct mesh_path *mpath_lookup(st 
     25                                      struct ieee80211_sub_if_data *sdata) 
     26 { 
     27        struct mesh_path *mpath; 
     28-       struct hlist_node *n; 
     29        struct hlist_head *bucket; 
     30        struct mpath_node *node; 
     31  
     32        bucket = &tbl->hash_buckets[mesh_table_hash(dst, sdata, tbl)]; 
     33-       hlist_for_each_entry_rcu(node, n, bucket, list) { 
     34+       hlist_for_each_entry_rcu(node, bucket, list) { 
     35                mpath = node->mpath; 
     36                if (mpath->sdata == sdata && 
     37                    ether_addr_equal(dst, mpath->dst)) { 
     38@@ -389,11 +388,10 @@ mesh_path_lookup_by_idx(struct ieee80211 
     39 { 
     40        struct mesh_table *tbl = rcu_dereference(mesh_paths); 
     41        struct mpath_node *node; 
     42-       struct hlist_node *p; 
     43        int i; 
     44        int j = 0; 
     45  
     46-       for_each_mesh_entry(tbl, p, node, i) { 
     47+       for_each_mesh_entry(tbl, node, i) { 
     48                if (sdata && node->mpath->sdata != sdata) 
     49                        continue; 
     50                if (j++ == idx) { 
     51@@ -417,13 +415,12 @@ int mesh_path_add_gate(struct mesh_path 
     52 { 
     53        struct mesh_table *tbl; 
     54        struct mpath_node *gate, *new_gate; 
     55-       struct hlist_node *n; 
     56        int err; 
     57  
     58        rcu_read_lock(); 
     59        tbl = rcu_dereference(mesh_paths); 
     60  
     61-       hlist_for_each_entry_rcu(gate, n, tbl->known_gates, list) 
     62+       hlist_for_each_entry_rcu(gate, tbl->known_gates, list) 
     63                if (gate->mpath == mpath) { 
     64                        err = -EEXIST; 
     65                        goto err_rcu; 
     66@@ -460,9 +457,9 @@ err_rcu: 
     67 static void mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath) 
     68 { 
     69        struct mpath_node *gate; 
     70-       struct hlist_node *p, *q; 
     71+       struct hlist_node *q; 
     72  
     73-       hlist_for_each_entry_safe(gate, p, q, tbl->known_gates, list) { 
     74+       hlist_for_each_entry_safe(gate, q, tbl->known_gates, list) { 
     75                if (gate->mpath != mpath) 
     76                        continue; 
     77                spin_lock_bh(&tbl->gates_lock); 
     78@@ -504,7 +501,6 @@ int mesh_path_add(struct ieee80211_sub_i 
     79        struct mesh_path *mpath, *new_mpath; 
     80        struct mpath_node *node, *new_node; 
     81        struct hlist_head *bucket; 
     82-       struct hlist_node *n; 
     83        int grow = 0; 
     84        int err = 0; 
     85        u32 hash_idx; 
     86@@ -550,7 +546,7 @@ int mesh_path_add(struct ieee80211_sub_i 
     87        spin_lock(&tbl->hashwlock[hash_idx]); 
     88  
     89        err = -EEXIST; 
     90-       hlist_for_each_entry(node, n, bucket, list) { 
     91+       hlist_for_each_entry(node, bucket, list) { 
     92                mpath = node->mpath; 
     93                if (mpath->sdata == sdata && 
     94                    ether_addr_equal(dst, mpath->dst)) 
     95@@ -640,7 +636,6 @@ int mpp_path_add(struct ieee80211_sub_if 
     96        struct mesh_path *mpath, *new_mpath; 
     97        struct mpath_node *node, *new_node; 
     98        struct hlist_head *bucket; 
     99-       struct hlist_node *n; 
     100        int grow = 0; 
     101        int err = 0; 
     102        u32 hash_idx; 
     103@@ -680,7 +675,7 @@ int mpp_path_add(struct ieee80211_sub_if 
     104        spin_lock(&tbl->hashwlock[hash_idx]); 
     105  
     106        err = -EEXIST; 
     107-       hlist_for_each_entry(node, n, bucket, list) { 
     108+       hlist_for_each_entry(node, bucket, list) { 
     109                mpath = node->mpath; 
     110                if (mpath->sdata == sdata && 
     111                    ether_addr_equal(dst, mpath->dst)) 
     112@@ -725,14 +720,13 @@ void mesh_plink_broken(struct sta_info * 
     113        static const u8 bcast[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 
     114        struct mesh_path *mpath; 
     115        struct mpath_node *node; 
     116-       struct hlist_node *p; 
     117        struct ieee80211_sub_if_data *sdata = sta->sdata; 
     118        int i; 
     119        __le16 reason = cpu_to_le16(WLAN_REASON_MESH_PATH_DEST_UNREACHABLE); 
     120  
     121        rcu_read_lock(); 
     122        tbl = rcu_dereference(mesh_paths); 
     123-       for_each_mesh_entry(tbl, p, node, i) { 
     124+       for_each_mesh_entry(tbl, node, i) { 
     125                mpath = node->mpath; 
     126                if (rcu_dereference(mpath->next_hop) == sta && 
     127                    mpath->flags & MESH_PATH_ACTIVE && 
     128@@ -792,13 +786,12 @@ void mesh_path_flush_by_nexthop(struct s 
     129        struct mesh_table *tbl; 
     130        struct mesh_path *mpath; 
     131        struct mpath_node *node; 
     132-       struct hlist_node *p; 
     133        int i; 
     134  
     135        rcu_read_lock(); 
     136        read_lock_bh(&pathtbl_resize_lock); 
     137        tbl = resize_dereference_mesh_paths(); 
     138-       for_each_mesh_entry(tbl, p, node, i) { 
     139+       for_each_mesh_entry(tbl, node, i) { 
     140                mpath = node->mpath; 
     141                if (rcu_dereference(mpath->next_hop) == sta) { 
     142                        spin_lock(&tbl->hashwlock[i]); 
     143@@ -815,11 +808,9 @@ static void table_flush_by_iface(struct 
     144 { 
     145        struct mesh_path *mpath; 
     146        struct mpath_node *node; 
     147-       struct hlist_node *p; 
    5148        int i; 
    6149  
    7150-       WARN_ON(!rcu_read_lock_held()); 
    8         for_each_mesh_entry(tbl, p, node, i) { 
     151-       for_each_mesh_entry(tbl, p, node, i) { 
     152+       for_each_mesh_entry(tbl, node, i) { 
    9153                mpath = node->mpath; 
    10154                if (mpath->sdata != sdata) 
     155                        continue; 
     156@@ -865,7 +856,6 @@ int mesh_path_del(struct ieee80211_sub_i 
     157        struct mesh_path *mpath; 
     158        struct mpath_node *node; 
     159        struct hlist_head *bucket; 
     160-       struct hlist_node *n; 
     161        int hash_idx; 
     162        int err = 0; 
     163  
     164@@ -875,7 +865,7 @@ int mesh_path_del(struct ieee80211_sub_i 
     165        bucket = &tbl->hash_buckets[hash_idx]; 
     166  
     167        spin_lock(&tbl->hashwlock[hash_idx]); 
     168-       hlist_for_each_entry(node, n, bucket, list) { 
     169+       hlist_for_each_entry(node, bucket, list) { 
     170                mpath = node->mpath; 
     171                if (mpath->sdata == sdata && 
     172                    ether_addr_equal(addr, mpath->dst)) { 
     173@@ -920,7 +910,6 @@ void mesh_path_tx_pending(struct mesh_pa 
     174 int mesh_path_send_to_gates(struct mesh_path *mpath) 
     175 { 
     176        struct ieee80211_sub_if_data *sdata = mpath->sdata; 
     177-       struct hlist_node *n; 
     178        struct mesh_table *tbl; 
     179        struct mesh_path *from_mpath = mpath; 
     180        struct mpath_node *gate = NULL; 
     181@@ -935,7 +924,7 @@ int mesh_path_send_to_gates(struct mesh_ 
     182        if (!known_gates) 
     183                return -EHOSTUNREACH; 
     184  
     185-       hlist_for_each_entry_rcu(gate, n, known_gates, list) { 
     186+       hlist_for_each_entry_rcu(gate, known_gates, list) { 
     187                if (gate->mpath->sdata != sdata) 
     188                        continue; 
     189  
     190@@ -951,7 +940,7 @@ int mesh_path_send_to_gates(struct mesh_ 
     191                } 
     192        } 
     193  
     194-       hlist_for_each_entry_rcu(gate, n, known_gates, list) 
     195+       hlist_for_each_entry_rcu(gate, known_gates, list) 
     196                if (gate->mpath->sdata == sdata) { 
     197                        mpath_dbg(sdata, "Sending to %pM\n", gate->mpath->dst); 
     198                        mesh_path_tx_pending(gate->mpath); 
     199@@ -1096,12 +1085,11 @@ void mesh_path_expire(struct ieee80211_s 
     200        struct mesh_table *tbl; 
     201        struct mesh_path *mpath; 
     202        struct mpath_node *node; 
     203-       struct hlist_node *p; 
     204        int i; 
     205  
     206        rcu_read_lock(); 
     207        tbl = rcu_dereference(mesh_paths); 
     208-       for_each_mesh_entry(tbl, p, node, i) { 
     209+       for_each_mesh_entry(tbl, node, i) { 
     210                if (node->mpath->sdata != sdata) 
     211                        continue; 
     212                mpath = node->mpath; 
  • branches/attitude_adjustment/package/mac80211/patches/300-pending_work.patch

    r36052 r36470  
    1 --- a/drivers/net/wireless/ath/ath5k/base.c 
    2 +++ b/drivers/net/wireless/ath/ath5k/base.c 
    3 @@ -325,6 +325,8 @@ ath5k_setup_channels(struct ath5k_hw *ah 
    4                 if (!ath5k_is_standard_channel(ch, band)) 
    5                         continue; 
    6   
    7 +               channels[count].max_power = AR5K_TUNE_MAX_TXPOWER/2; 
    8 + 
    9                 count++; 
    10         } 
    11   
    12 @@ -850,7 +852,7 @@ ath5k_txbuf_free_skb(struct ath5k_hw *ah 
    13                 return; 
    14         dma_unmap_single(ah->dev, bf->skbaddr, bf->skb->len, 
    15                         DMA_TO_DEVICE); 
    16 -       dev_kfree_skb_any(bf->skb); 
    17 +       ieee80211_free_txskb(ah->hw, bf->skb); 
    18         bf->skb = NULL; 
    19         bf->skbaddr = 0; 
    20         bf->desc->ds_data = 0; 
    21 @@ -1577,7 +1579,7 @@ ath5k_tx_queue(struct ieee80211_hw *hw,  
    22         return; 
    23   
    24  drop_packet: 
    25 -       dev_kfree_skb_any(skb); 
    26 +       ieee80211_free_txskb(hw, skb); 
    27  } 
    28   
    29  static void 
     1--- a/drivers/net/wireless/ath/ath9k/common.h 
     2+++ b/drivers/net/wireless/ath/ath9k/common.h 
     3@@ -27,7 +27,7 @@ 
     4 #define WME_MAX_BA              WME_BA_BMP_SIZE 
     5 #define ATH_TID_MAX_BUFS        (2 * WME_MAX_BA) 
     6  
     7-#define ATH_RSSI_DUMMY_MARKER   0x127 
     8+#define ATH_RSSI_DUMMY_MARKER   127 
     9 #define ATH_RSSI_LPF_LEN               10 
     10 #define RSSI_LPF_THRESHOLD             -20 
     11 #define ATH_RSSI_EP_MULTIPLIER     (1<<7) 
     12--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
     13+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
     14@@ -1067,15 +1067,19 @@ static bool ath9k_rx_prepare(struct ath9 
     15  
     16        last_rssi = priv->rx.last_rssi; 
     17  
     18-       if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER)) 
     19-               rxbuf->rxstatus.rs_rssi = ATH_EP_RND(last_rssi, 
     20-                                                    ATH_RSSI_EP_MULTIPLIER); 
     21+       if (ieee80211_is_beacon(hdr->frame_control) && 
     22+           !is_zero_ether_addr(common->curbssid) && 
     23+           ether_addr_equal(hdr->addr3, common->curbssid)) { 
     24+               s8 rssi = rxbuf->rxstatus.rs_rssi; 
     25  
     26-       if (rxbuf->rxstatus.rs_rssi < 0) 
     27-               rxbuf->rxstatus.rs_rssi = 0; 
     28+               if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER)) 
     29+                       rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER); 
     30  
     31-       if (ieee80211_is_beacon(fc)) 
     32-               priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi; 
     33+               if (rssi < 0) 
     34+                       rssi = 0; 
     35+ 
     36+               priv->ah->stats.avgbrssi = rssi; 
     37+       } 
     38  
     39        rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp); 
     40        rx_status->band = hw->conf.channel->band; 
     41--- a/include/linux/ieee80211.h 
     42+++ b/include/linux/ieee80211.h 
     43@@ -185,7 +185,7 @@ struct ieee80211_hdr { 
     44        u8 addr3[6]; 
     45        __le16 seq_ctrl; 
     46        u8 addr4[6]; 
     47-} __packed; 
     48+} __packed __aligned(2); 
     49  
     50 struct ieee80211_hdr_3addr { 
     51        __le16 frame_control; 
     52@@ -194,7 +194,7 @@ struct ieee80211_hdr_3addr { 
     53        u8 addr2[6]; 
     54        u8 addr3[6]; 
     55        __le16 seq_ctrl; 
     56-} __packed; 
     57+} __packed __aligned(2); 
     58  
     59 struct ieee80211_qos_hdr { 
     60        __le16 frame_control; 
     61@@ -204,7 +204,7 @@ struct ieee80211_qos_hdr { 
     62        u8 addr3[6]; 
     63        __le16 seq_ctrl; 
     64        __le16 qos_ctrl; 
     65-} __packed; 
     66+} __packed __aligned(2); 
     67  
     68 /** 
     69  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set 
     70@@ -581,7 +581,7 @@ struct ieee80211s_hdr { 
     71        __le32 seqnum; 
     72        u8 eaddr1[6]; 
     73        u8 eaddr2[6]; 
     74-} __packed; 
     75+} __packed __aligned(2); 
     76  
     77 /* Mesh flags */ 
     78 #define MESH_FLAGS_AE_A4       0x1 
     79@@ -875,7 +875,7 @@ struct ieee80211_mgmt { 
     80                        } u; 
     81                } __packed action; 
     82        } u; 
     83-} __packed; 
     84+} __packed __aligned(2); 
     85  
     86 /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */ 
     87 #define BSS_MEMBERSHIP_SELECTOR_HT_PHY 127 
     88@@ -906,20 +906,20 @@ struct ieee80211_rts { 
     89        __le16 duration; 
     90        u8 ra[6]; 
     91        u8 ta[6]; 
     92-} __packed; 
     93+} __packed __aligned(2); 
     94  
     95 struct ieee80211_cts { 
     96        __le16 frame_control; 
     97        __le16 duration; 
     98        u8 ra[6]; 
     99-} __packed; 
     100+} __packed __aligned(2); 
     101  
     102 struct ieee80211_pspoll { 
     103        __le16 frame_control; 
     104        __le16 aid; 
     105        u8 bssid[6]; 
     106        u8 ta[6]; 
     107-} __packed; 
     108+} __packed __aligned(2); 
     109  
     110 /* TDLS */ 
     111  
    30112--- a/net/mac80211/agg-rx.c 
    31113+++ b/net/mac80211/agg-rx.c 
    32 @@ -203,6 +203,8 @@ static void ieee80211_send_addba_resp(st 
     114@@ -204,6 +204,8 @@ static void ieee80211_send_addba_resp(st 
    33115                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    34116        else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
     
    51133        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
    52134                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    53 @@ -460,6 +461,7 @@ int ieee80211_start_tx_ba_session(struct 
     135@@ -527,6 +528,7 @@ int ieee80211_start_tx_ba_session(struct 
    54136            sdata->vif.type != NL80211_IFTYPE_MESH_POINT && 
    55137            sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
     
    59141                return -EINVAL; 
    60142  
    61 @@ -869,7 +871,7 @@ void ieee80211_process_addba_resp(struct 
    62   
    63         } else { 
    64                 ___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR, 
    65 -                                               true); 
    66 +                                               false); 
    67         } 
    68   
    69   out: 
    70143--- a/net/mac80211/debugfs_sta.c 
    71144+++ b/net/mac80211/debugfs_sta.c 
    72 @@ -63,11 +63,11 @@ static ssize_t sta_flags_read(struct fil 
     145@@ -65,11 +65,11 @@ static ssize_t sta_flags_read(struct fil 
    73146        test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : "" 
    74147  
    75148        int res = scnprintf(buf, sizeof(buf), 
    76 -                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
    77 +                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
     149-                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
     150+                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
    78151                            TEST(AUTH), TEST(ASSOC), TEST(PS_STA), 
    79152                            TEST(PS_DRIVER), TEST(AUTHORIZED), 
     
    86159--- a/net/mac80211/iface.c 
    87160+++ b/net/mac80211/iface.c 
    88 @@ -420,7 +420,6 @@ int ieee80211_do_open(struct wireless_de 
     161@@ -78,7 +78,7 @@ void ieee80211_recalc_txpower(struct iee 
     162                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); 
     163 } 
     164  
     165-static u32 ieee80211_idle_off(struct ieee80211_local *local) 
     166+u32 ieee80211_idle_off(struct ieee80211_local *local) 
     167 { 
     168        if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE)) 
     169                return 0; 
     170@@ -107,7 +107,7 @@ void ieee80211_recalc_idle(struct ieee80 
     171  
     172        lockdep_assert_held(&local->mtx); 
     173  
     174-       active = !list_empty(&local->chanctx_list); 
     175+       active = !list_empty(&local->chanctx_list) || local->monitors; 
     176  
     177        if (!local->ops->remain_on_channel) { 
     178                list_for_each_entry(roc, &local->roc_list, list) { 
     179@@ -436,7 +436,6 @@ int ieee80211_do_open(struct wireless_de 
    89180        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 
    90181        struct net_device *dev = wdev->netdev; 
     
    94185        int res; 
    95186        u32 hw_reconf_flags = 0; 
    96 @@ -575,30 +574,8 @@ int ieee80211_do_open(struct wireless_de 
     187@@ -541,6 +540,9 @@ int ieee80211_do_open(struct wireless_de 
     188  
     189                ieee80211_adjust_monitor_flags(sdata, 1); 
     190                ieee80211_configure_filter(local); 
     191+               mutex_lock(&local->mtx); 
     192+               ieee80211_recalc_idle(local); 
     193+               mutex_unlock(&local->mtx); 
     194  
     195                netif_carrier_on(dev); 
     196                break; 
     197@@ -595,30 +597,8 @@ int ieee80211_do_open(struct wireless_de 
    97198  
    98199        set_bit(SDATA_STATE_RUNNING, &sdata->state); 
     
    126227        /* 
    127228         * set_multicast_list will be invoked by the networking core 
    128 @@ -849,7 +826,7 @@ static void ieee80211_do_stop(struct iee 
    129                         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    130                         if (info->control.vif == &sdata->vif) { 
    131                                 __skb_unlink(skb, &local->pending[i]); 
    132 -                               dev_kfree_skb_irq(skb); 
    133 +                               ieee80211_free_txskb(&local->hw, skb); 
    134                         } 
    135                 } 
    136         } 
    137 @@ -997,6 +974,72 @@ static void ieee80211_if_setup(struct ne 
     229@@ -817,6 +797,9 @@ static void ieee80211_do_stop(struct iee 
     230  
     231                ieee80211_adjust_monitor_flags(sdata, -1); 
     232                ieee80211_configure_filter(local); 
     233+               mutex_lock(&local->mtx); 
     234+               ieee80211_recalc_idle(local); 
     235+               mutex_unlock(&local->mtx); 
     236                break; 
     237        case NL80211_IFTYPE_P2P_DEVICE: 
     238                /* relies on synchronize_rcu() below */ 
     239@@ -1022,6 +1005,72 @@ static void ieee80211_if_setup(struct ne 
    138240        dev->destructor = free_netdev; 
    139241 } 
     
    189291+       if (elems.ht_cap_elem) 
    190292+               ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, 
    191 +                               elems.ht_cap_elem, &sta->sta.ht_cap); 
     293+                               elems.ht_cap_elem, sta); 
    192294+ 
    193295+       if (elems.wmm_param) 
     
    208310 { 
    209311        struct ieee80211_sub_if_data *sdata = 
    210 @@ -1101,6 +1144,9 @@ static void ieee80211_iface_work(struct  
     312@@ -1126,6 +1175,9 @@ static void ieee80211_iface_work(struct  
    211313                                break; 
    212314                        ieee80211_mesh_rx_queued_mgmt(sdata, skb); 
     
    220322--- a/net/mac80211/rx.c 
    221323+++ b/net/mac80211/rx.c 
    222 @@ -2279,6 +2279,7 @@ ieee80211_rx_h_action(struct ieee80211_r 
     324@@ -2365,6 +2365,7 @@ ieee80211_rx_h_action(struct ieee80211_r 
    223325                    sdata->vif.type != NL80211_IFTYPE_MESH_POINT && 
    224326                    sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
     
    228330                        break; 
    229331  
    230 @@ -2496,14 +2497,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
     332@@ -2692,14 +2693,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
    231333  
    232334        if (!ieee80211_vif_is_mesh(&sdata->vif) && 
     
    246348        case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): 
    247349        case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): 
    248 @@ -2827,10 +2829,16 @@ static int prepare_for_handlers(struct i 
     350@@ -3028,10 +3030,16 @@ static int prepare_for_handlers(struct i 
    249351                } 
    250352                break; 
     
    275377  *     IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next 
    276378  *     frame to this station is transmitted. 
    277 @@ -64,7 +63,6 @@ enum ieee80211_sta_info_flags { 
     379@@ -66,7 +65,6 @@ enum ieee80211_sta_info_flags { 
    278380        WLAN_STA_AUTHORIZED, 
    279381        WLAN_STA_SHORT_PREAMBLE, 
     
    283385        WLAN_STA_MFP, 
    284386        WLAN_STA_BLOCK_BA, 
    285 --- a/net/mac80211/status.c 
    286 +++ b/net/mac80211/status.c 
    287 @@ -34,7 +34,7 @@ void ieee80211_tx_status_irqsafe(struct  
    288                 skb_queue_len(&local->skb_queue_unreliable); 
    289         while (tmp > IEEE80211_IRQSAFE_QUEUE_LIMIT && 
    290                (skb = skb_dequeue(&local->skb_queue_unreliable))) { 
    291 -               dev_kfree_skb_irq(skb); 
    292 +               ieee80211_free_txskb(hw, skb); 
    293                 tmp--; 
    294                 I802_DEBUG_INC(local->tx_status_drop); 
     387--- a/net/mac80211/tx.c 
     388+++ b/net/mac80211/tx.c 
     389@@ -1231,34 +1231,40 @@ static bool ieee80211_tx_frags(struct ie 
     390                if (local->queue_stop_reasons[q] || 
     391                    (!txpending && !skb_queue_empty(&local->pending[q]))) { 
     392                        if (unlikely(info->flags & 
     393-                                       IEEE80211_TX_INTFL_OFFCHAN_TX_OK && 
     394-                                    local->queue_stop_reasons[q] & 
     395-                                       ~BIT(IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL))) { 
     396+                                    IEEE80211_TX_INTFL_OFFCHAN_TX_OK)) { 
     397+                               if (local->queue_stop_reasons[q] & 
     398+                                   ~BIT(IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL)) { 
     399+                                       /* 
     400+                                        * Drop off-channel frames if queues 
     401+                                        * are stopped for any reason other 
     402+                                        * than off-channel operation. Never 
     403+                                        * queue them. 
     404+                                        */ 
     405+                                       spin_unlock_irqrestore( 
     406+                                               &local->queue_stop_reason_lock, 
     407+                                               flags); 
     408+                                       ieee80211_purge_tx_queue(&local->hw, 
     409+                                                                skbs); 
     410+                                       return true; 
     411+                               } 
     412+                       } else { 
     413+ 
     414                                /* 
     415-                                * Drop off-channel frames if queues are stopped 
     416-                                * for any reason other than off-channel 
     417-                                * operation. Never queue them. 
     418+                                * Since queue is stopped, queue up frames for 
     419+                                * later transmission from the tx-pending 
     420+                                * tasklet when the queue is woken again. 
     421                                 */ 
     422-                               spin_unlock_irqrestore( 
     423-                                       &local->queue_stop_reason_lock, flags); 
     424-                               ieee80211_purge_tx_queue(&local->hw, skbs); 
     425-                               return true; 
     426+                               if (txpending) 
     427+                                       skb_queue_splice_init(skbs, 
     428+                                                             &local->pending[q]); 
     429+                               else 
     430+                                       skb_queue_splice_tail_init(skbs, 
     431+                                                                  &local->pending[q]); 
     432+ 
     433+                               spin_unlock_irqrestore(&local->queue_stop_reason_lock, 
     434+                                                      flags); 
     435+                               return false; 
     436                        } 
     437- 
     438-                       /* 
     439-                        * Since queue is stopped, queue up frames for later 
     440-                        * transmission from the tx-pending tasklet when the 
     441-                        * queue is woken again. 
     442-                        */ 
     443-                       if (txpending) 
     444-                               skb_queue_splice_init(skbs, &local->pending[q]); 
     445-                       else 
     446-                               skb_queue_splice_tail_init(skbs, 
     447-                                                          &local->pending[q]); 
     448- 
     449-                       spin_unlock_irqrestore(&local->queue_stop_reason_lock, 
     450-                                              flags); 
     451-                       return false; 
     452                } 
     453                spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 
     454  
     455@@ -1848,9 +1854,24 @@ netdev_tx_t ieee80211_subif_start_xmit(s 
     456                } 
     457  
     458                if (!is_multicast_ether_addr(skb->data)) { 
     459+                       struct sta_info *next_hop; 
     460+                       bool mpp_lookup = true; 
     461+ 
     462                        mpath = mesh_path_lookup(sdata, skb->data); 
     463-                       if (!mpath) 
     464+                       if (mpath) { 
     465+                               mpp_lookup = false; 
     466+                               next_hop = rcu_dereference(mpath->next_hop); 
     467+                               if (!next_hop || 
     468+                                   !(mpath->flags & (MESH_PATH_ACTIVE | 
     469+                                                     MESH_PATH_RESOLVING))) 
     470+                                       mpp_lookup = true; 
     471+                       } 
     472+ 
     473+                       if (mpp_lookup) 
     474                                mppath = mpp_path_lookup(sdata, skb->data); 
     475+ 
     476+                       if (mppath && mpath) 
     477+                               mesh_path_del(mpath->sdata, mpath->dst); 
     478                } 
     479  
     480                /* 
     481--- a/net/wireless/nl80211.c 
     482+++ b/net/wireless/nl80211.c 
     483@@ -554,16 +554,9 @@ static int nl80211_msg_put_channel(struc 
     484        if ((chan->flags & IEEE80211_CHAN_NO_IBSS) && 
     485            nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IBSS)) 
     486                goto nla_put_failure; 
     487-       if (chan->flags & IEEE80211_CHAN_RADAR) { 
     488-               u32 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 
     489-               if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 
     490-                       goto nla_put_failure; 
     491-               if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 
     492-                               chan->dfs_state)) 
     493-                       goto nla_put_failure; 
     494-               if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, time)) 
     495-                       goto nla_put_failure; 
     496-       } 
     497+       if ((chan->flags & IEEE80211_CHAN_RADAR) && 
     498+           nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 
     499+               goto nla_put_failure; 
     500        if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 
     501            nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 
     502                goto nla_put_failure; 
     503@@ -900,9 +893,6 @@ static int nl80211_put_iface_combination 
     504                    nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 
     505                                c->max_interfaces)) 
     506                        goto nla_put_failure; 
     507-               if (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 
     508-                               c->radar_detect_widths)) 
     509-                       goto nla_put_failure; 
     510  
     511                nla_nest_end(msg, nl_combi); 
    295512        } 
    296 @@ -159,7 +159,7 @@ static void ieee80211_handle_filtered_fr 
    297                            "dropped TX filtered frame, queue_len=%d PS=%d @%lu\n", 
    298                            skb_queue_len(&sta->tx_filtered[ac]), 
    299                            !!test_sta_flag(sta, WLAN_STA_PS_STA), jiffies); 
    300 -       dev_kfree_skb(skb); 
    301 +       ieee80211_free_txskb(&local->hw, skb); 
     513@@ -914,48 +904,6 @@ nla_put_failure: 
     514        return -ENOBUFS; 
    302515 } 
    303516  
    304  static void ieee80211_check_pending_bar(struct sta_info *sta, u8 *addr, u8 tid) 
    305 @@ -324,6 +324,75 @@ static void ieee80211_add_tx_radiotap_he 
    306   
    307  } 
    308   
    309 +static void ieee80211_report_used_skb(struct ieee80211_local *local, 
    310 +                                     struct sk_buff *skb, bool dropped) 
    311 +{ 
    312 +       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    313 +       struct ieee80211_hdr *hdr = (void *)skb->data; 
    314 +       bool acked = info->flags & IEEE80211_TX_STAT_ACK; 
    315 + 
    316 +       if (dropped) 
    317 +               acked = false; 
    318 + 
    319 +       if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) { 
    320 +               struct ieee80211_sub_if_data *sdata = NULL; 
    321 +               struct ieee80211_sub_if_data *iter_sdata; 
    322 +               u64 cookie = (unsigned long)skb; 
    323 + 
    324 +               rcu_read_lock(); 
    325 + 
    326 +               if (skb->dev) { 
    327 +                       list_for_each_entry_rcu(iter_sdata, &local->interfaces, 
    328 +                                               list) { 
    329 +                               if (!iter_sdata->dev) 
    330 +                                       continue; 
    331 + 
    332 +                               if (skb->dev == iter_sdata->dev) { 
    333 +                                       sdata = iter_sdata; 
    334 +                                       break; 
    335 +                               } 
    336 +                       } 
    337 +               } else { 
    338 +                       sdata = rcu_dereference(local->p2p_sdata); 
    339 +               } 
    340 + 
    341 +               if (!sdata) 
    342 +                       skb->dev = NULL; 
    343 +               else if (ieee80211_is_nullfunc(hdr->frame_control) || 
    344 +                        ieee80211_is_qos_nullfunc(hdr->frame_control)) { 
    345 +                       cfg80211_probe_status(sdata->dev, hdr->addr1, 
    346 +                                             cookie, acked, GFP_ATOMIC); 
    347 +               } else { 
    348 +                       cfg80211_mgmt_tx_status(&sdata->wdev, cookie, skb->data, 
    349 +                                               skb->len, acked, GFP_ATOMIC); 
    350 +               } 
    351 + 
    352 +               rcu_read_unlock(); 
    353 +       } 
    354 + 
    355 +       if (unlikely(info->ack_frame_id)) { 
    356 +               struct sk_buff *ack_skb; 
    357 +               unsigned long flags; 
    358 + 
    359 +               spin_lock_irqsave(&local->ack_status_lock, flags); 
    360 +               ack_skb = idr_find(&local->ack_status_frames, 
    361 +                                  info->ack_frame_id); 
    362 +               if (ack_skb) 
    363 +                       idr_remove(&local->ack_status_frames, 
    364 +                                  info->ack_frame_id); 
    365 +               spin_unlock_irqrestore(&local->ack_status_lock, flags); 
    366 + 
    367 +               if (ack_skb) { 
    368 +                       if (!dropped) { 
    369 +                               /* consumes ack_skb */ 
    370 +                               skb_complete_wifi_ack(ack_skb, acked); 
    371 +                       } else { 
    372 +                               dev_kfree_skb_any(ack_skb); 
    373 +                       } 
    374 +               } 
    375 +       } 
    376 +} 
    377 + 
    378  /* 
    379   * Use a static threshold for now, best value to be determined 
    380   * by testing ... 
    381 @@ -515,50 +584,7 @@ void ieee80211_tx_status(struct ieee8021 
    382                                         msecs_to_jiffies(10)); 
     517-#ifdef CONFIG_PM 
     518-static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 
     519-                                       struct sk_buff *msg) 
     520-{ 
     521-       const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan.tcp; 
     522-       struct nlattr *nl_tcp; 
     523- 
     524-       if (!tcp) 
     525-               return 0; 
     526- 
     527-       nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION); 
     528-       if (!nl_tcp) 
     529-               return -ENOBUFS; 
     530- 
     531-       if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 
     532-                       tcp->data_payload_max)) 
     533-               return -ENOBUFS; 
     534- 
     535-       if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 
     536-                       tcp->data_payload_max)) 
     537-               return -ENOBUFS; 
     538- 
     539-       if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 
     540-               return -ENOBUFS; 
     541- 
     542-       if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 
     543-                               sizeof(*tcp->tok), tcp->tok)) 
     544-               return -ENOBUFS; 
     545- 
     546-       if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 
     547-                       tcp->data_interval_max)) 
     548-               return -ENOBUFS; 
     549- 
     550-       if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 
     551-                       tcp->wake_payload_max)) 
     552-               return -ENOBUFS; 
     553- 
     554-       nla_nest_end(msg, nl_tcp); 
     555-       return 0; 
     556-} 
     557-#endif 
     558- 
     559 static int nl80211_send_wiphy(struct sk_buff *msg, u32 portid, u32 seq, int flags, 
     560                              struct cfg80211_registered_device *dev) 
     561 { 
     562@@ -1330,9 +1278,6 @@ static int nl80211_send_wiphy(struct sk_ 
     563                                goto nla_put_failure; 
     564                } 
     565  
     566-               if (nl80211_send_wowlan_tcp_caps(dev, msg)) 
     567-                       goto nla_put_failure; 
     568- 
     569                nla_nest_end(msg, nl_wowlan); 
    383570        } 
    384   
    385 -       if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) { 
    386 -               u64 cookie = (unsigned long)skb; 
    387 -               acked = info->flags & IEEE80211_TX_STAT_ACK; 
    388 - 
    389 -               if (ieee80211_is_nullfunc(hdr->frame_control) || 
    390 -                   ieee80211_is_qos_nullfunc(hdr->frame_control)) { 
    391 -                       cfg80211_probe_status(skb->dev, hdr->addr1, 
    392 -                                             cookie, acked, GFP_ATOMIC); 
    393 -               } else if (skb->dev) { 
    394 -                       cfg80211_mgmt_tx_status( 
    395 -                               skb->dev->ieee80211_ptr, cookie, skb->data, 
    396 -                               skb->len, acked, GFP_ATOMIC); 
    397 -               } else { 
    398 -                       struct ieee80211_sub_if_data *p2p_sdata; 
    399 - 
    400 -                       rcu_read_lock(); 
    401 - 
    402 -                       p2p_sdata = rcu_dereference(local->p2p_sdata); 
    403 -                       if (p2p_sdata) { 
    404 -                               cfg80211_mgmt_tx_status( 
    405 -                                       &p2p_sdata->wdev, cookie, skb->data, 
    406 -                                       skb->len, acked, GFP_ATOMIC); 
    407 -                       } 
    408 -                       rcu_read_unlock(); 
    409 -               } 
    410 -       } 
    411 - 
    412 -       if (unlikely(info->ack_frame_id)) { 
    413 -               struct sk_buff *ack_skb; 
    414 -               unsigned long flags; 
    415 - 
    416 -               spin_lock_irqsave(&local->ack_status_lock, flags); 
    417 -               ack_skb = idr_find(&local->ack_status_frames, 
    418 -                                  info->ack_frame_id); 
    419 -               if (ack_skb) 
    420 -                       idr_remove(&local->ack_status_frames, 
    421 -                                  info->ack_frame_id); 
    422 -               spin_unlock_irqrestore(&local->ack_status_lock, flags); 
    423 - 
    424 -               /* consumes ack_skb */ 
    425 -               if (ack_skb) 
    426 -                       skb_complete_wifi_ack(ack_skb, 
    427 -                               info->flags & IEEE80211_TX_STAT_ACK); 
    428 -       } 
    429 +       ieee80211_report_used_skb(local, skb, false); 
    430   
    431         /* this was a transmitted frame, but now we want to reuse it */ 
    432         skb_orphan(skb); 
    433 @@ -634,25 +660,17 @@ EXPORT_SYMBOL(ieee80211_report_low_ack); 
    434  void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb) 
    435  { 
    436         struct ieee80211_local *local = hw_to_local(hw); 
    437 -       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    438 - 
    439 -       if (unlikely(info->ack_frame_id)) { 
    440 -               struct sk_buff *ack_skb; 
    441 -               unsigned long flags; 
    442 - 
    443 -               spin_lock_irqsave(&local->ack_status_lock, flags); 
    444 -               ack_skb = idr_find(&local->ack_status_frames, 
    445 -                                  info->ack_frame_id); 
    446 -               if (ack_skb) 
    447 -                       idr_remove(&local->ack_status_frames, 
    448 -                                  info->ack_frame_id); 
    449 -               spin_unlock_irqrestore(&local->ack_status_lock, flags); 
    450 - 
    451 -               /* consumes ack_skb */ 
    452 -               if (ack_skb) 
    453 -                       dev_kfree_skb_any(ack_skb); 
    454 -       } 
    455   
    456 +       ieee80211_report_used_skb(local, skb, true); 
    457         dev_kfree_skb_any(skb); 
    458  } 
    459  EXPORT_SYMBOL(ieee80211_free_txskb); 
    460 + 
    461 +void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, 
    462 +                             struct sk_buff_head *skbs) 
    463 +{ 
    464 +       struct sk_buff *skb; 
    465 + 
    466 +       while ((skb = __skb_dequeue(skbs))) 
    467 +               ieee80211_free_txskb(hw, skb); 
    468 +} 
    469 --- a/drivers/net/wireless/p54/main.c 
    470 +++ b/drivers/net/wireless/p54/main.c 
    471 @@ -139,6 +139,7 @@ static int p54_beacon_format_ie_tim(stru 
    472  static int p54_beacon_update(struct p54_common *priv, 
    473                         struct ieee80211_vif *vif) 
    474  { 
    475 +       struct ieee80211_tx_control control = { }; 
    476         struct sk_buff *beacon; 
    477         int ret; 
    478   
    479 @@ -158,7 +159,7 @@ static int p54_beacon_update(struct p54_ 
    480          * to cancel the old beacon template by hand, instead the firmware 
    481          * will release the previous one through the feedback mechanism. 
    482          */ 
    483 -       p54_tx_80211(priv->hw, NULL, beacon); 
    484 +       p54_tx_80211(priv->hw, &control, beacon); 
    485         priv->tsf_high32 = 0; 
    486         priv->tsf_low32 = 0; 
    487   
    488 --- a/net/wireless/reg.c 
    489 +++ b/net/wireless/reg.c 
    490 @@ -352,6 +352,9 @@ static void reg_regdb_search(struct work 
    491         struct reg_regdb_search_request *request; 
    492         const struct ieee80211_regdomain *curdom, *regdom; 
    493         int i, r; 
    494 +       bool set_reg = false; 
    495 + 
    496 +       mutex_lock(&cfg80211_mutex); 
    497   
    498         mutex_lock(&reg_regdb_search_mutex); 
    499         while (!list_empty(&reg_regdb_search_list)) { 
    500 @@ -367,9 +370,7 @@ static void reg_regdb_search(struct work 
    501                                 r = reg_copy_regd(&regdom, curdom); 
    502                                 if (r) 
    503                                         break; 
    504 -                               mutex_lock(&cfg80211_mutex); 
    505 -                               set_regdom(regdom); 
    506 -                               mutex_unlock(&cfg80211_mutex); 
    507 +                               set_reg = true; 
    508                                 break; 
    509                         } 
    510                 } 
    511 @@ -377,6 +378,11 @@ static void reg_regdb_search(struct work 
    512                 kfree(request); 
    513         } 
    514         mutex_unlock(&reg_regdb_search_mutex); 
    515 + 
    516 +       if (set_reg) 
    517 +               set_regdom(regdom); 
    518 + 
    519 +       mutex_unlock(&cfg80211_mutex); 
    520  } 
    521   
    522  static DECLARE_WORK(reg_regdb_work, reg_regdb_search); 
    523 --- a/drivers/net/wireless/ath/ath9k/recv.c 
    524 +++ b/drivers/net/wireless/ath/ath9k/recv.c 
    525 @@ -254,8 +254,6 @@ rx_init_fail: 
    526   
    527  static void ath_edma_start_recv(struct ath_softc *sc) 
    528  { 
    529 -       spin_lock_bh(&sc->rx.rxbuflock); 
    530 - 
    531         ath9k_hw_rxena(sc->sc_ah); 
    532   
    533         ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_HP, 
    534 @@ -267,8 +265,6 @@ static void ath_edma_start_recv(struct a 
    535         ath_opmode_init(sc); 
    536   
    537         ath9k_hw_startpcureceive(sc->sc_ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)); 
    538 - 
    539 -       spin_unlock_bh(&sc->rx.rxbuflock); 
    540  } 
    541   
    542  static void ath_edma_stop_recv(struct ath_softc *sc) 
    543 @@ -285,8 +281,6 @@ int ath_rx_init(struct ath_softc *sc, in 
    544         int error = 0; 
    545   
    546         spin_lock_init(&sc->sc_pcu_lock); 
    547 -       spin_lock_init(&sc->rx.rxbuflock); 
    548 -       clear_bit(SC_OP_RXFLUSH, &sc->sc_flags); 
    549   
    550         common->rx_bufsize = IEEE80211_MAX_MPDU_LEN / 2 + 
    551                              sc->sc_ah->caps.rx_status_len; 
    552 @@ -424,8 +418,8 @@ u32 ath_calcrxfilter(struct ath_softc *s 
    553                 rfilt |= ATH9K_RX_FILTER_COMP_BAR; 
    554   
    555         if (sc->nvifs > 1 || (sc->rx.rxfilter & FIF_OTHER_BSS)) { 
    556 -               /* The following may also be needed for other older chips */ 
    557 -               if (sc->sc_ah->hw_version.macVersion == AR_SREV_VERSION_9160) 
    558 +               /* This is needed for older chips */ 
    559 +               if (sc->sc_ah->hw_version.macVersion <= AR_SREV_VERSION_9160) 
    560                         rfilt |= ATH9K_RX_FILTER_PROM; 
    561                 rfilt |= ATH9K_RX_FILTER_MCAST_BCAST_ALL; 
    562         } 
    563 @@ -447,7 +441,6 @@ int ath_startrecv(struct ath_softc *sc) 
    564                 return 0; 
    565         } 
    566   
    567 -       spin_lock_bh(&sc->rx.rxbuflock); 
    568         if (list_empty(&sc->rx.rxbuf)) 
    569                 goto start_recv; 
    570   
    571 @@ -468,26 +461,31 @@ start_recv: 
    572         ath_opmode_init(sc); 
    573         ath9k_hw_startpcureceive(ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)); 
    574   
    575 -       spin_unlock_bh(&sc->rx.rxbuflock); 
    576 - 
    577         return 0; 
    578  } 
    579   
    580 +static void ath_flushrecv(struct ath_softc *sc) 
    581 +{ 
    582 +       if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 
    583 +               ath_rx_tasklet(sc, 1, true); 
    584 +       ath_rx_tasklet(sc, 1, false); 
    585 +} 
    586 + 
    587  bool ath_stoprecv(struct ath_softc *sc) 
    588  { 
    589         struct ath_hw *ah = sc->sc_ah; 
    590         bool stopped, reset = false; 
    591   
    592 -       spin_lock_bh(&sc->rx.rxbuflock); 
    593         ath9k_hw_abortpcurecv(ah); 
    594         ath9k_hw_setrxfilter(ah, 0); 
    595         stopped = ath9k_hw_stopdmarecv(ah, &reset); 
    596   
    597 +       ath_flushrecv(sc); 
    598 + 
    599         if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 
    600                 ath_edma_stop_recv(sc); 
    601         else 
    602                 sc->rx.rxlink = NULL; 
    603 -       spin_unlock_bh(&sc->rx.rxbuflock); 
    604   
    605         if (!(ah->ah_flags & AH_UNPLUGGED) && 
    606             unlikely(!stopped)) { 
    607 @@ -499,15 +497,6 @@ bool ath_stoprecv(struct ath_softc *sc) 
    608         return stopped && !reset; 
    609  } 
    610   
    611 -void ath_flushrecv(struct ath_softc *sc) 
    612 -{ 
    613 -       set_bit(SC_OP_RXFLUSH, &sc->sc_flags); 
    614 -       if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 
    615 -               ath_rx_tasklet(sc, 1, true); 
    616 -       ath_rx_tasklet(sc, 1, false); 
    617 -       clear_bit(SC_OP_RXFLUSH, &sc->sc_flags); 
    618 -} 
    619 - 
    620  static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb) 
    621  { 
    622         /* Check whether the Beacon frame has DTIM indicating buffered bc/mc */ 
    623 @@ -744,6 +733,7 @@ static struct ath_buf *ath_get_next_rx_b 
    624                         return NULL; 
    625         } 
    626   
    627 +       list_del(&bf->list); 
    628         if (!bf->bf_mpdu) 
    629                 return bf; 
    630   
    631 @@ -1059,16 +1049,12 @@ int ath_rx_tasklet(struct ath_softc *sc, 
    632                 dma_type = DMA_FROM_DEVICE; 
    633   
    634         qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP; 
    635 -       spin_lock_bh(&sc->rx.rxbuflock); 
    636   
    637         tsf = ath9k_hw_gettsf64(ah); 
    638         tsf_lower = tsf & 0xffffffff; 
    639   
    640         do { 
    641                 bool decrypt_error = false; 
    642 -               /* If handling rx interrupt and flush is in progress => exit */ 
    643 -               if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags) && (flush == 0)) 
    644 -                       break; 
    645   
    646                 memset(&rs, 0, sizeof(rs)); 
    647                 if (edma) 
    648 @@ -1108,15 +1094,6 @@ int ath_rx_tasklet(struct ath_softc *sc, 
    649                 sc->rx.num_pkts++; 
    650                 ath_debug_stat_rx(sc, &rs); 
    651   
    652 -               /* 
    653 -                * If we're asked to flush receive queue, directly 
    654 -                * chain it back at the queue without processing it. 
    655 -                */ 
    656 -               if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags)) { 
    657 -                       RX_STAT_INC(rx_drop_rxflush); 
    658 -                       goto requeue_drop_frag; 
    659 -               } 
    660 - 
    661                 memset(rxs, 0, sizeof(struct ieee80211_rx_status)); 
    662   
    663                 rxs->mactime = (tsf & ~0xffffffffULL) | rs.rs_tstamp; 
    664 @@ -1251,19 +1228,18 @@ requeue_drop_frag: 
    665                         sc->rx.frag = NULL; 
    666                 } 
    667  requeue: 
    668 +               list_add_tail(&bf->list, &sc->rx.rxbuf); 
    669 +               if (flush) 
    670 +                       continue; 
    671 + 
    672                 if (edma) { 
    673 -                       list_add_tail(&bf->list, &sc->rx.rxbuf); 
    674                         ath_rx_edma_buf_link(sc, qtype); 
    675                 } else { 
    676 -                       list_move_tail(&bf->list, &sc->rx.rxbuf); 
    677                         ath_rx_buf_link(sc, bf); 
    678 -                       if (!flush) 
    679 -                               ath9k_hw_rxena(ah); 
    680 +                       ath9k_hw_rxena(ah); 
    681                 } 
    682         } while (1); 
    683   
    684 -       spin_unlock_bh(&sc->rx.rxbuflock); 
    685 - 
    686         if (!(ah->imask & ATH9K_INT_RXEOL)) { 
    687                 ah->imask |= (ATH9K_INT_RXEOL | ATH9K_INT_RXORN); 
    688                 ath9k_hw_set_interrupts(ah); 
    689 --- a/net/mac80211/mlme.c 
    690 +++ b/net/mac80211/mlme.c 
    691 @@ -818,23 +818,71 @@ void ieee80211_sta_process_chanswitch(st 
    692  } 
    693   
    694  static void ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, 
    695 -                                       u16 capab_info, u8 *pwr_constr_elem, 
    696 -                                       u8 pwr_constr_elem_len) 
    697 +                                       struct ieee80211_channel *channel, 
    698 +                                       const u8 *country_ie, u8 country_ie_len, 
    699 +                                       const u8 *pwr_constr_elem) 
    700  { 
    701 -       struct ieee80211_conf *conf = &sdata->local->hw.conf; 
    702 +       struct ieee80211_country_ie_triplet *triplet; 
    703 +       int chan = ieee80211_frequency_to_channel(channel->center_freq); 
    704 +       int i, chan_pwr, chan_increment, new_ap_level; 
    705 +       bool have_chan_pwr = false; 
    706   
    707 -       if (!(capab_info & WLAN_CAPABILITY_SPECTRUM_MGMT)) 
    708 +       /* Invalid IE */ 
    709 +       if (country_ie_len % 2 || country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN) 
    710                 return; 
    711   
    712 -       /* Power constraint IE length should be 1 octet */ 
    713 -       if (pwr_constr_elem_len != 1) 
    714 -               return; 
    715 +       triplet = (void *)(country_ie + 3); 
    716 +       country_ie_len -= 3; 
    717   
    718 -       if ((*pwr_constr_elem <= conf->channel->max_reg_power) && 
    719 -           (*pwr_constr_elem != sdata->local->power_constr_level)) { 
    720 -               sdata->local->power_constr_level = *pwr_constr_elem; 
    721 -               ieee80211_hw_config(sdata->local, 0); 
    722 +       switch (channel->band) { 
    723 +       default: 
    724 +               WARN_ON_ONCE(1); 
    725 +               /* fall through */ 
    726 +       case IEEE80211_BAND_2GHZ: 
    727 +       case IEEE80211_BAND_60GHZ: 
    728 +               chan_increment = 1; 
    729 +               break; 
    730 +       case IEEE80211_BAND_5GHZ: 
    731 +               chan_increment = 4; 
    732 +               break; 
    733         } 
    734 + 
    735 +       /* find channel */ 
    736 +       while (country_ie_len >= 3) { 
    737 +               u8 first_channel = triplet->chans.first_channel; 
    738 + 
    739 +               if (first_channel >= IEEE80211_COUNTRY_EXTENSION_ID) 
    740 +                       goto next; 
    741 + 
    742 +               for (i = 0; i < triplet->chans.num_channels; i++) { 
    743 +                       if (first_channel + i * chan_increment == chan) { 
    744 +                               have_chan_pwr = true; 
    745 +                               chan_pwr = triplet->chans.max_power; 
    746 +                               break; 
    747 +                       } 
    748 +               } 
    749 +               if (have_chan_pwr) 
    750 +                       break; 
    751 + 
    752 + next: 
    753 +               triplet++; 
    754 +               country_ie_len -= 3; 
    755 +       } 
    756 + 
    757 +       if (!have_chan_pwr) 
    758 +               return; 
    759 + 
    760 +       new_ap_level = max_t(int, 0, chan_pwr - *pwr_constr_elem); 
    761 + 
    762 +       if (sdata->local->ap_power_level == new_ap_level) 
    763 +               return; 
    764 + 
    765 +       sdata_info(sdata, 
    766 +                  "Limiting TX power to %d (%d - %d) dBm as advertised by %pM\n", 
    767 +                  new_ap_level, chan_pwr, *pwr_constr_elem, 
    768 +                  sdata->u.mgd.bssid); 
    769 +       sdata->local->ap_power_level = new_ap_level; 
    770 +       ieee80211_hw_config(sdata->local, 0); 
    771  } 
    772   
    773  void ieee80211_enable_dyn_ps(struct ieee80211_vif *vif) 
    774 @@ -1390,7 +1438,7 @@ static void ieee80211_set_disassoc(struc 
    775         sta = sta_info_get(sdata, ifmgd->bssid); 
    776         if (sta) { 
    777                 set_sta_flag(sta, WLAN_STA_BLOCK_BA); 
    778 -               ieee80211_sta_tear_down_BA_sessions(sta, tx); 
    779 +               ieee80211_sta_tear_down_BA_sessions(sta, false); 
    780         } 
    781         mutex_unlock(&local->sta_mtx); 
    782   
    783 @@ -1438,7 +1486,7 @@ static void ieee80211_set_disassoc(struc 
    784         memset(&ifmgd->ht_capa, 0, sizeof(ifmgd->ht_capa)); 
    785         memset(&ifmgd->ht_capa_mask, 0, sizeof(ifmgd->ht_capa_mask)); 
    786   
    787 -       local->power_constr_level = 0; 
    788 +       local->ap_power_level = 0; 
    789   
    790         del_timer_sync(&local->dynamic_ps_timer); 
    791         cancel_work_sync(&local->dynamic_ps_enable_work); 
    792 @@ -2530,15 +2578,13 @@ static void ieee80211_rx_mgmt_beacon(str 
    793                                                   bssid, true); 
    794         } 
    795   
    796 -       /* Note: country IE parsing is done for us by cfg80211 */ 
    797 -       if (elems.country_elem) { 
    798 -               /* TODO: IBSS also needs this */ 
    799 -               if (elems.pwr_constr_elem) 
    800 -                       ieee80211_handle_pwr_constr(sdata, 
    801 -                               le16_to_cpu(mgmt->u.probe_resp.capab_info), 
    802 -                               elems.pwr_constr_elem, 
    803 -                               elems.pwr_constr_elem_len); 
    804 -       } 
    805 +       if (elems.country_elem && elems.pwr_constr_elem && 
    806 +           mgmt->u.probe_resp.capab_info & 
    807 +                               cpu_to_le16(WLAN_CAPABILITY_SPECTRUM_MGMT)) 
    808 +               ieee80211_handle_pwr_constr(sdata, local->oper_channel, 
    809 +                                           elems.country_elem, 
    810 +                                           elems.country_elem_len, 
    811 +                                           elems.pwr_constr_elem); 
    812   
    813         ieee80211_bss_info_change_notify(sdata, changed); 
    814  } 
    815 @@ -3526,6 +3572,7 @@ int ieee80211_mgd_deauth(struct ieee8021 
    816  { 
    817         struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 
    818         u8 frame_buf[DEAUTH_DISASSOC_LEN]; 
    819 +       bool tx = !req->local_state_change; 
    820   
    821         mutex_lock(&ifmgd->mtx); 
    822   
    823 @@ -3542,12 +3589,12 @@ int ieee80211_mgd_deauth(struct ieee8021 
    824         if (ifmgd->associated && 
    825             ether_addr_equal(ifmgd->associated->bssid, req->bssid)) { 
    826                 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, 
    827 -                                      req->reason_code, true, frame_buf); 
    828 +                                      req->reason_code, tx, frame_buf); 
    829         } else { 
    830                 drv_mgd_prepare_tx(sdata->local, sdata); 
    831                 ieee80211_send_deauth_disassoc(sdata, req->bssid, 
    832                                                IEEE80211_STYPE_DEAUTH, 
    833 -                                              req->reason_code, true, 
    834 +                                              req->reason_code, tx, 
    835                                                frame_buf); 
    836         } 
    837   
    838 --- a/net/mac80211/sta_info.c 
    839 +++ b/net/mac80211/sta_info.c 
    840 @@ -585,7 +585,7 @@ static bool sta_info_cleanup_expire_buff 
    841                  */ 
    842                 if (!skb) 
    843                         break; 
    844 -               dev_kfree_skb(skb); 
    845 +               ieee80211_free_txskb(&local->hw, skb); 
    846         } 
    847   
    848         /* 
    849 @@ -614,7 +614,7 @@ static bool sta_info_cleanup_expire_buff 
    850                 local->total_ps_buffered--; 
    851                 ps_dbg(sta->sdata, "Buffered frame expired (STA %pM)\n", 
    852                        sta->sta.addr); 
    853 -               dev_kfree_skb(skb); 
    854 +               ieee80211_free_txskb(&local->hw, skb); 
    855         } 
    856   
    857         /* 
    858 @@ -674,7 +674,7 @@ int __must_check __sta_info_destroy(stru 
    859          * will be sufficient. 
    860          */ 
    861         set_sta_flag(sta, WLAN_STA_BLOCK_BA); 
    862 -       ieee80211_sta_tear_down_BA_sessions(sta, true); 
    863 +       ieee80211_sta_tear_down_BA_sessions(sta, false); 
    864   
    865         ret = sta_info_hash_del(local, sta); 
    866         if (ret) 
    867 @@ -730,8 +730,8 @@ int __must_check __sta_info_destroy(stru 
    868   
    869         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 
    870                 local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); 
    871 -               __skb_queue_purge(&sta->ps_tx_buf[ac]); 
    872 -               __skb_queue_purge(&sta->tx_filtered[ac]); 
    873 +               ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]); 
    874 +               ieee80211_purge_tx_queue(&local->hw, &sta->tx_filtered[ac]); 
    875         } 
    876   
    877  #ifdef CONFIG_MAC80211_MESH 
    878 @@ -765,7 +765,7 @@ int __must_check __sta_info_destroy(stru 
    879                 tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); 
    880                 if (!tid_tx) 
    881                         continue; 
    882 -               __skb_queue_purge(&tid_tx->pending); 
    883 +               ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending); 
    884                 kfree(tid_tx); 
    885         } 
    886   
    887 --- a/drivers/net/wireless/ath/ath5k/phy.c 
    888 +++ b/drivers/net/wireless/ath/ath5k/phy.c 
    889 @@ -1977,11 +1977,13 @@ ath5k_hw_set_spur_mitigation_filter(stru 
    890                         spur_delta_phase = (spur_offset << 18) / 25; 
    891                         spur_freq_sigma_delta = (spur_delta_phase >> 10); 
    892                         symbol_width = AR5K_SPUR_SYMBOL_WIDTH_BASE_100Hz / 2; 
    893 +                       break; 
    894                 case AR5K_BWMODE_5MHZ: 
    895                         /* Both sample_freq and chip_freq are 10MHz (?) */ 
    896                         spur_delta_phase = (spur_offset << 19) / 25; 
    897                         spur_freq_sigma_delta = (spur_delta_phase >> 10); 
    898                         symbol_width = AR5K_SPUR_SYMBOL_WIDTH_BASE_100Hz / 4; 
    899 +                       break; 
    900                 default: 
    901                         if (channel->band == IEEE80211_BAND_5GHZ) { 
    902                                 /* Both sample_freq and chip_freq are 40MHz */ 
    903 --- a/net/mac80211/ieee80211_i.h 
    904 +++ b/net/mac80211/ieee80211_i.h 
    905 @@ -1062,7 +1062,7 @@ struct ieee80211_local { 
    906         bool disable_dynamic_ps; 
    907   
    908         int user_power_level; /* in dBm */ 
    909 -       int power_constr_level; /* in dBm */ 
    910 +       int ap_power_level; /* in dBm */ 
    911   
    912         enum ieee80211_smps_mode smps_mode; 
    913   
    914 @@ -1170,7 +1170,6 @@ struct ieee802_11_elems { 
    915         u8 prep_len; 
    916         u8 perr_len; 
    917         u8 country_elem_len; 
    918 -       u8 pwr_constr_elem_len; 
    919         u8 quiet_elem_len; 
    920         u8 num_of_quiet_elem;   /* can be more the one */ 
    921         u8 timeout_int_len; 
    922 @@ -1318,6 +1317,8 @@ netdev_tx_t ieee80211_monitor_start_xmit 
    923                                          struct net_device *dev); 
    924  netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, 
    925                                        struct net_device *dev); 
    926 +void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, 
    927 +                             struct sk_buff_head *skbs); 
    928   
    929  /* HT */ 
    930  void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, 
    931 --- a/net/mac80211/util.c 
    932 +++ b/net/mac80211/util.c 
    933 @@ -406,7 +406,7 @@ void ieee80211_add_pending_skb(struct ie 
    934         int queue = info->hw_queue; 
    935   
    936         if (WARN_ON(!info->control.vif)) { 
    937 -               kfree_skb(skb); 
    938 +               ieee80211_free_txskb(&local->hw, skb); 
    939                 return; 
    940         } 
    941   
    942 @@ -431,7 +431,7 @@ void ieee80211_add_pending_skbs_fn(struc 
    943                 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    944   
    945                 if (WARN_ON(!info->control.vif)) { 
    946 -                       kfree_skb(skb); 
    947 +                       ieee80211_free_txskb(&local->hw, skb); 
    948                         continue; 
    949                 } 
    950   
    951 @@ -792,8 +792,11 @@ u32 ieee802_11_parse_elems_crc(u8 *start 
    952                         elems->country_elem_len = elen; 
    953                         break; 
    954                 case WLAN_EID_PWR_CONSTRAINT: 
    955 +                       if (elen != 1) { 
    956 +                               elem_parse_failed = true; 
    957 +                               break; 
    958 +                       } 
    959                         elems->pwr_constr_elem = pos; 
    960 -                       elems->pwr_constr_elem_len = elen; 
    961                         break; 
    962                 case WLAN_EID_TIMEOUT_INTERVAL: 
    963                         elems->timeout_int = pos; 
    964 --- a/net/mac80211/main.c 
    965 +++ b/net/mac80211/main.c 
    966 @@ -154,13 +154,11 @@ int ieee80211_hw_config(struct ieee80211 
    967   
    968         if (test_bit(SCAN_SW_SCANNING, &local->scanning) || 
    969             test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning) || 
    970 -           test_bit(SCAN_HW_SCANNING, &local->scanning)) 
    971 +           test_bit(SCAN_HW_SCANNING, &local->scanning) || 
    972 +           !local->ap_power_level) 
    973                 power = chan->max_power; 
    974         else 
    975 -               power = local->power_constr_level ? 
    976 -                       min(chan->max_power, 
    977 -                               (chan->max_reg_power  - local->power_constr_level)) : 
    978 -                       chan->max_power; 
    979 +               power = min(chan->max_power, local->ap_power_level); 
    980   
    981         if (local->user_power_level >= 0) 
    982                 power = min(power, local->user_power_level); 
    983 --- a/include/net/cfg80211.h 
    984 +++ b/include/net/cfg80211.h 
    985 @@ -1218,6 +1218,7 @@ struct cfg80211_deauth_request { 
    986         const u8 *ie; 
    987         size_t ie_len; 
    988         u16 reason_code; 
    989 +       bool local_state_change; 
    990  }; 
    991   
    992  /** 
    993 --- a/net/wireless/mlme.c 
    994 +++ b/net/wireless/mlme.c 
    995 @@ -457,20 +457,14 @@ int __cfg80211_mlme_deauth(struct cfg802 
    996                 .reason_code = reason, 
    997                 .ie = ie, 
    998                 .ie_len = ie_len, 
    999 +               .local_state_change = local_state_change, 
    1000         }; 
    1001   
    1002         ASSERT_WDEV_LOCK(wdev); 
    1003   
    1004 -       if (local_state_change) { 
    1005 -               if (wdev->current_bss && 
    1006 -                   ether_addr_equal(wdev->current_bss->pub.bssid, bssid)) { 
    1007 -                       cfg80211_unhold_bss(wdev->current_bss); 
    1008 -                       cfg80211_put_bss(&wdev->current_bss->pub); 
    1009 -                       wdev->current_bss = NULL; 
    1010 -               } 
    1011 - 
    1012 +       if (local_state_change && (!wdev->current_bss || 
    1013 +           !ether_addr_equal(wdev->current_bss->pub.bssid, bssid))) 
    1014                 return 0; 
    1015 -       } 
    1016   
    1017         return rdev->ops->deauth(&rdev->wiphy, dev, &req); 
    1018  } 
    1019 --- a/drivers/net/wireless/ath/ath9k/xmit.c 
    1020 +++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    1021 @@ -386,7 +386,7 @@ static void ath_tx_complete_aggr(struct  
    1022         u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0, seq_first; 
    1023         u32 ba[WME_BA_BMP_SIZE >> 5]; 
    1024         int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; 
    1025 -       bool rc_update = true; 
    1026 +       bool rc_update = true, isba; 
    1027         struct ieee80211_tx_rate rates[4]; 
    1028         struct ath_frame_info *fi; 
    1029         int nframes; 
    1030 @@ -430,13 +430,17 @@ static void ath_tx_complete_aggr(struct  
    1031         tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; 
    1032         tid = ATH_AN_2_TID(an, tidno); 
    1033         seq_first = tid->seq_start; 
    1034 +       isba = ts->ts_flags & ATH9K_TX_BA; 
    1035   
    1036         /* 
    1037          * The hardware occasionally sends a tx status for the wrong TID. 
    1038          * In this case, the BA status cannot be considered valid and all 
    1039          * subframes need to be retransmitted 
    1040 +        * 
    1041 +        * Only BlockAcks have a TID and therefore normal Acks cannot be 
    1042 +        * checked 
    1043          */ 
    1044 -       if (tidno != ts->tid) 
    1045 +       if (isba && tidno != ts->tid) 
    1046                 txok = false; 
    1047   
    1048         isaggr = bf_isaggr(bf); 
     571 #endif 
    1049572--- a/net/mac80211/cfg.c 
    1050573+++ b/net/mac80211/cfg.c 
    1051 @@ -2563,6 +2563,9 @@ static void ieee80211_mgmt_frame_registe 
    1052                 else 
    1053                         local->probe_req_reg--; 
    1054   
    1055 +               if (!local->open_count) 
    1056 +                       break; 
    1057 + 
    1058                 ieee80211_queue_work(&local->hw, &local->reconfig_filter); 
    1059                 break; 
    1060         default: 
    1061 --- a/net/mac80211/tx.c 
    1062 +++ b/net/mac80211/tx.c 
    1063 @@ -354,7 +354,7 @@ static void purge_old_ps_buffers(struct  
    1064                         total += skb_queue_len(&sta->ps_tx_buf[ac]); 
    1065                         if (skb) { 
    1066                                 purged++; 
    1067 -                               dev_kfree_skb(skb); 
    1068 +                               ieee80211_free_txskb(&local->hw, skb); 
    1069                                 break; 
    1070                         } 
    1071                 } 
    1072 @@ -466,7 +466,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee 
    1073                         ps_dbg(tx->sdata, 
    1074                                "STA %pM TX buffer for AC %d full - dropping oldest frame\n", 
    1075                                sta->sta.addr, ac); 
    1076 -                       dev_kfree_skb(old); 
    1077 +                       ieee80211_free_txskb(&local->hw, old); 
    1078                 } else 
    1079                         tx->local->total_ps_buffered++; 
    1080   
    1081 @@ -1103,7 +1103,7 @@ static bool ieee80211_tx_prep_agg(struct 
    1082                 spin_unlock(&tx->sta->lock); 
    1083   
    1084                 if (purge_skb) 
    1085 -                       dev_kfree_skb(purge_skb); 
    1086 +                       ieee80211_free_txskb(&tx->local->hw, purge_skb); 
     574@@ -3285,13 +3285,19 @@ static int ieee80211_cfg_get_channel(str 
     575                                     struct cfg80211_chan_def *chandef) 
     576 { 
     577        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 
     578+       struct ieee80211_local *local = wiphy_priv(wiphy); 
     579        struct ieee80211_chanctx_conf *chanctx_conf; 
     580        int ret = -ENODATA; 
     581  
     582        rcu_read_lock(); 
     583-       chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 
     584-       if (chanctx_conf) { 
     585-               *chandef = chanctx_conf->def; 
     586+       if (local->use_chanctx) { 
     587+               chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 
     588+               if (chanctx_conf) { 
     589+                       *chandef = chanctx_conf->def; 
     590+                       ret = 0; 
     591+               } 
     592+       } else if (local->open_count == local->monitors) { 
     593+               *chandef = local->monitor_chandef; 
     594                ret = 0; 
    1087595        } 
    1088   
    1089         /* reset session timer */ 
    1090 @@ -1214,7 +1214,7 @@ static bool ieee80211_tx_frags(struct ie 
    1091  #ifdef CONFIG_MAC80211_VERBOSE_DEBUG 
    1092                 if (WARN_ON_ONCE(q >= local->hw.queues)) { 
    1093                         __skb_unlink(skb, skbs); 
    1094 -                       dev_kfree_skb(skb); 
    1095 +                       ieee80211_free_txskb(&local->hw, skb); 
    1096                         continue; 
    1097                 } 
    1098  #endif 
    1099 @@ -1356,9 +1356,9 @@ static int invoke_tx_handlers(struct iee 
    1100         if (unlikely(res == TX_DROP)) { 
    1101                 I802_DEBUG_INC(tx->local->tx_handlers_drop); 
    1102                 if (tx->skb) 
    1103 -                       dev_kfree_skb(tx->skb); 
    1104 +                       ieee80211_free_txskb(&tx->local->hw, tx->skb); 
    1105                 else 
    1106 -                       __skb_queue_purge(&tx->skbs); 
    1107 +                       ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); 
    1108                 return -1; 
    1109         } else if (unlikely(res == TX_QUEUED)) { 
    1110                 I802_DEBUG_INC(tx->local->tx_handlers_queued); 
    1111 @@ -1393,7 +1393,7 @@ static bool ieee80211_tx(struct ieee8021 
    1112         res_prepare = ieee80211_tx_prepare(sdata, &tx, skb); 
    1113   
    1114         if (unlikely(res_prepare == TX_DROP)) { 
    1115 -               dev_kfree_skb(skb); 
    1116 +               ieee80211_free_txskb(&local->hw, skb); 
    1117                 goto out; 
    1118         } else if (unlikely(res_prepare == TX_QUEUED)) { 
    1119                 goto out; 
    1120 @@ -1465,7 +1465,7 @@ void ieee80211_xmit(struct ieee80211_sub 
    1121         headroom = max_t(int, 0, headroom); 
    1122   
    1123         if (ieee80211_skb_resize(sdata, skb, headroom, may_encrypt)) { 
    1124 -               dev_kfree_skb(skb); 
    1125 +               ieee80211_free_txskb(&local->hw, skb); 
    1126                 rcu_read_unlock(); 
    1127                 return; 
    1128         } 
    1129 @@ -2056,8 +2056,10 @@ netdev_tx_t ieee80211_subif_start_xmit(s 
    1130                 head_need += IEEE80211_ENCRYPT_HEADROOM; 
    1131                 head_need += local->tx_headroom; 
    1132                 head_need = max_t(int, 0, head_need); 
    1133 -               if (ieee80211_skb_resize(sdata, skb, head_need, true)) 
    1134 -                       goto fail; 
    1135 +               if (ieee80211_skb_resize(sdata, skb, head_need, true)) { 
    1136 +                       ieee80211_free_txskb(&local->hw, skb); 
    1137 +                       return NETDEV_TX_OK; 
    1138 +               } 
    1139         } 
    1140   
    1141         if (encaps_data) { 
    1142 @@ -2124,10 +2126,13 @@ netdev_tx_t ieee80211_subif_start_xmit(s 
    1143   */ 
    1144  void ieee80211_clear_tx_pending(struct ieee80211_local *local) 
    1145  { 
    1146 +       struct sk_buff *skb; 
    1147         int i; 
    1148   
    1149 -       for (i = 0; i < local->hw.queues; i++) 
    1150 -               skb_queue_purge(&local->pending[i]); 
    1151 +       for (i = 0; i < local->hw.queues; i++) { 
    1152 +               while ((skb = skb_dequeue(&local->pending[i])) != NULL) 
    1153 +                       ieee80211_free_txskb(&local->hw, skb); 
    1154 +       } 
    1155  } 
    1156   
    1157  /* 
    1158 @@ -2190,7 +2195,7 @@ void ieee80211_tx_pending(unsigned long  
    1159                         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    1160   
    1161                         if (WARN_ON(!info->control.vif)) { 
    1162 -                               kfree_skb(skb); 
    1163 +                               ieee80211_free_txskb(&local->hw, skb); 
    1164                                 continue; 
    1165                         } 
    1166   
    1167 --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    1168 +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    1169 @@ -65,7 +65,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct 
    1170         u16 qnum = skb_get_queue_mapping(skb); 
    1171   
    1172         if (WARN_ON(qnum >= ah->ah_capabilities.cap_queues.q_tx_num)) { 
    1173 -               dev_kfree_skb_any(skb); 
    1174 +               ieee80211_free_txskb(hw, skb); 
    1175                 return; 
    1176         } 
    1177   
     596        rcu_read_unlock(); 
    1178597--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1179598+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    1180 @@ -1467,7 +1467,9 @@ static bool ath9k_hw_chip_reset(struct a 
     599@@ -1463,7 +1463,9 @@ static bool ath9k_hw_chip_reset(struct a 
    1181600                        reset_type = ATH9K_RESET_POWER_ON; 
    1182601                else 
     
    1189608        if (!ath9k_hw_set_reset_reg(ah, reset_type)) 
    1190609                return false; 
    1191 @@ -2568,7 +2570,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    1192   
    1193         if (AR_SREV_9300_20_OR_LATER(ah)) { 
    1194                 ah->enabled_cals |= TX_IQ_CAL; 
    1195 -               if (AR_SREV_9485_OR_LATER(ah)) 
    1196 +               if (AR_SREV_9485_OR_LATER(ah) && !AR_SREV_9340(ah)) 
    1197                         ah->enabled_cals |= TX_IQ_ON_AGC_CAL; 
     610@@ -1876,13 +1878,12 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     611  
     612        ENABLE_REGWRITE_BUFFER(ah); 
     613  
     614-       REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr)); 
     615-       REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4) 
     616-                 | macStaId1 
     617+       REG_RMW(ah, AR_STA_ID1, macStaId1 
     618                  | AR_STA_ID1_RTS_USE_DEF 
     619                  | (ah->config. 
     620                     ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0) 
     621-                 | ah->sta_id1_defaults); 
     622+                 | ah->sta_id1_defaults, 
     623+                 ~AR_STA_ID1_SADH_MASK); 
     624        ath_hw_setbssidmask(common); 
     625        REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna); 
     626        ath9k_hw_write_associd(ah); 
     627--- a/drivers/net/wireless/rt2x00/rt2x00dev.c 
     628+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c 
     629@@ -1236,8 +1236,10 @@ static inline void rt2x00lib_set_if_comb 
     630         */ 
     631        if_limit = &rt2x00dev->if_limits_ap; 
     632        if_limit->max = rt2x00dev->ops->max_ap_intf; 
     633-       if_limit->types = BIT(NL80211_IFTYPE_AP) | 
     634-                       BIT(NL80211_IFTYPE_MESH_POINT); 
     635+       if_limit->types = BIT(NL80211_IFTYPE_AP); 
     636+#ifdef CONFIG_MAC80211_MESH 
     637+       if_limit->types |= BIT(NL80211_IFTYPE_MESH_POINT); 
     638+#endif 
     639  
     640        /* 
     641         * Build up AP interface combinations structure. 
     642@@ -1309,7 +1311,9 @@ int rt2x00lib_probe_dev(struct rt2x00_de 
     643                rt2x00dev->hw->wiphy->interface_modes |= 
     644                    BIT(NL80211_IFTYPE_ADHOC) | 
     645                    BIT(NL80211_IFTYPE_AP) | 
     646+#ifdef CONFIG_MAC80211_MESH 
     647                    BIT(NL80211_IFTYPE_MESH_POINT) | 
     648+#endif 
     649                    BIT(NL80211_IFTYPE_WDS); 
     650  
     651        rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 
     652--- a/net/mac80211/rc80211_minstrel_ht.c 
     653+++ b/net/mac80211/rc80211_minstrel_ht.c 
     654@@ -17,8 +17,6 @@ 
     655 #include "rc80211_minstrel_ht.h" 
     656  
     657 #define AVG_PKT_SIZE   1200 
     658-#define SAMPLE_COLUMNS 10 
     659-#define EWMA_LEVEL             75 
     660  
     661 /* Number of bits for an average sized packet */ 
     662 #define MCS_NBITS (AVG_PKT_SIZE << 3) 
     663@@ -26,11 +24,11 @@ 
     664 /* Number of symbols for a packet with (bps) bits per symbol */ 
     665 #define MCS_NSYMS(bps) ((MCS_NBITS + (bps) - 1) / (bps)) 
     666  
     667-/* Transmission time for a packet containing (syms) symbols */ 
     668+/* Transmission time (nanoseconds) for a packet containing (syms) symbols */ 
     669 #define MCS_SYMBOL_TIME(sgi, syms)                                     \ 
     670        (sgi ?                                                          \ 
     671-         ((syms) * 18 + 4) / 5 :       /* syms * 3.6 us */             \ 
     672-         (syms) << 2                   /* syms * 4 us */               \ 
     673+         ((syms) * 18000 + 4000) / 5 : /* syms * 3.6 us */             \ 
     674+         ((syms) * 1000) << 2          /* syms * 4 us */               \ 
     675        ) 
     676  
     677 /* Transmit duration for the raw data part of an average sized packet */ 
     678@@ -64,9 +62,9 @@ 
     679 } 
     680  
     681 #define CCK_DURATION(_bitrate, _short, _len)           \ 
     682-       (10 /* SIFS */ +                                \ 
     683+       (1000 * (10 /* SIFS */ +                        \ 
     684         (_short ? 72 + 24 : 144 + 48 ) +               \ 
     685-        (8 * (_len + 4) * 10) / (_bitrate)) 
     686+        (8 * (_len + 4) * 10) / (_bitrate))) 
     687  
     688 #define CCK_ACK_DURATION(_bitrate, _short)                     \ 
     689        (CCK_DURATION((_bitrate > 10 ? 20 : 10), false, 60) +   \ 
     690@@ -129,15 +127,6 @@ const struct mcs_group minstrel_mcs_grou 
     691 static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES]; 
     692  
     693 /* 
     694- * Perform EWMA (Exponentially Weighted Moving Average) calculation 
     695- */ 
     696-static int 
     697-minstrel_ewma(int old, int new, int weight) 
     698-{ 
     699-       return (new * (100 - weight) + old * weight) / 100; 
     700-} 
     701- 
     702-/* 
     703  * Look up an MCS group index based on mac80211 rate information 
     704  */ 
     705 static int 
     706@@ -211,20 +200,32 @@ static void 
     707 minstrel_ht_calc_tp(struct minstrel_ht_sta *mi, int group, int rate) 
     708 { 
     709        struct minstrel_rate_stats *mr; 
     710-       unsigned int usecs = 0; 
     711+       unsigned int nsecs = 0; 
     712+       unsigned int tp; 
     713+       unsigned int prob; 
     714  
     715        mr = &mi->groups[group].rates[rate]; 
     716+       prob = mr->probability; 
     717  
     718-       if (mr->probability < MINSTREL_FRAC(1, 10)) { 
     719+       if (prob < MINSTREL_FRAC(1, 10)) { 
     720                mr->cur_tp = 0; 
     721                return; 
    1198722        } 
    1199723  
    1200 --- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    1201 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    1202 @@ -313,7 +313,6 @@ struct ath_rx { 
    1203         u32 *rxlink; 
    1204         u32 num_pkts; 
    1205         unsigned int rxfilter; 
    1206 -       spinlock_t rxbuflock; 
    1207         struct list_head rxbuf; 
    1208         struct ath_descdma rxdma; 
    1209         struct ath_buf *rx_bufptr; 
    1210 @@ -324,7 +323,6 @@ struct ath_rx { 
    1211   
    1212  int ath_startrecv(struct ath_softc *sc); 
    1213  bool ath_stoprecv(struct ath_softc *sc); 
    1214 -void ath_flushrecv(struct ath_softc *sc); 
    1215  u32 ath_calcrxfilter(struct ath_softc *sc); 
    1216  int ath_rx_init(struct ath_softc *sc, int nbufs); 
    1217  void ath_rx_cleanup(struct ath_softc *sc); 
    1218 @@ -627,7 +625,6 @@ void ath_ant_comb_update(struct ath_soft 
    1219  enum sc_op_flags { 
    1220         SC_OP_INVALID, 
    1221         SC_OP_BEACONS, 
    1222 -       SC_OP_RXFLUSH, 
    1223         SC_OP_ANI_RUN, 
    1224         SC_OP_PRIM_STA_VIF, 
    1225         SC_OP_HW_RESET, 
    1226 --- a/drivers/net/wireless/ath/ath9k/beacon.c 
    1227 +++ b/drivers/net/wireless/ath/ath9k/beacon.c 
    1228 @@ -147,6 +147,7 @@ static struct ath_buf *ath9k_beacon_gene 
    1229                                  skb->len, DMA_TO_DEVICE); 
    1230                 dev_kfree_skb_any(skb); 
    1231                 bf->bf_buf_addr = 0; 
    1232 +               bf->bf_mpdu = NULL; 
     724+       /* 
     725+        * For the throughput calculation, limit the probability value to 90% to 
     726+        * account for collision related packet error rate fluctuation 
     727+        */ 
     728+       if (prob > MINSTREL_FRAC(9, 10)) 
     729+               prob = MINSTREL_FRAC(9, 10); 
     730+ 
     731        if (group != MINSTREL_CCK_GROUP) 
     732-               usecs = mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len); 
     733+               nsecs = 1000 * mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len); 
     734+ 
     735+       nsecs += minstrel_mcs_groups[group].duration[rate]; 
     736+       tp = 1000000 * ((mr->probability * 1000) / nsecs); 
     737  
     738-       usecs += minstrel_mcs_groups[group].duration[rate]; 
     739-       mr->cur_tp = MINSTREL_TRUNC((1000000 / usecs) * mr->probability); 
     740+       mr->cur_tp = MINSTREL_TRUNC(tp); 
     741 } 
     742  
     743 /* 
     744@@ -308,8 +309,8 @@ minstrel_ht_update_stats(struct minstrel 
     745                } 
    1233746        } 
    1234747  
    1235         skb = ieee80211_beacon_get(hw, vif); 
    1236 @@ -359,7 +360,6 @@ void ath9k_beacon_tasklet(unsigned long  
    1237                 return; 
    1238   
    1239         bf = ath9k_beacon_generate(sc->hw, vif); 
    1240 -       WARN_ON(!bf); 
    1241   
    1242         if (sc->beacon.bmisscnt != 0) { 
    1243                 ath_dbg(common, BSTUCK, "resume beacon xmit after %u misses\n", 
    1244 --- a/drivers/net/wireless/ath/ath9k/debug.c 
    1245 +++ b/drivers/net/wireless/ath/ath9k/debug.c 
    1246 @@ -919,7 +919,6 @@ static ssize_t read_file_recv(struct fil 
    1247         RXS_ERR("RX-LENGTH-ERR", rx_len_err); 
    1248         RXS_ERR("RX-OOM-ERR", rx_oom_err); 
    1249         RXS_ERR("RX-RATE-ERR", rx_rate_err); 
    1250 -       RXS_ERR("RX-DROP-RXFLUSH", rx_drop_rxflush); 
    1251         RXS_ERR("RX-TOO-MANY-FRAGS", rx_too_many_frags_err); 
    1252   
    1253         PHY_ERR("UNDERRUN ERR", ATH9K_PHYERR_UNDERRUN); 
    1254 --- a/drivers/net/wireless/ath/ath9k/debug.h 
    1255 +++ b/drivers/net/wireless/ath/ath9k/debug.h 
    1256 @@ -198,7 +198,6 @@ struct ath_tx_stats { 
    1257   * @rx_oom_err:  No. of frames dropped due to OOM issues. 
    1258   * @rx_rate_err:  No. of frames dropped due to rate errors. 
    1259   * @rx_too_many_frags_err:  Frames dropped due to too-many-frags received. 
    1260 - * @rx_drop_rxflush: No. of frames dropped due to RX-FLUSH. 
    1261   * @rx_beacons:  No. of beacons received. 
    1262   * @rx_frags:  No. of rx-fragements received. 
    1263   */ 
    1264 @@ -217,7 +216,6 @@ struct ath_rx_stats { 
    1265         u32 rx_oom_err; 
    1266         u32 rx_rate_err; 
    1267         u32 rx_too_many_frags_err; 
    1268 -       u32 rx_drop_rxflush; 
    1269         u32 rx_beacons; 
    1270         u32 rx_frags; 
    1271  }; 
    1272 --- a/drivers/net/wireless/ath/ath9k/main.c 
    1273 +++ b/drivers/net/wireless/ath/ath9k/main.c 
    1274 @@ -181,7 +181,7 @@ static void ath_restart_work(struct ath_ 
    1275         ath_start_ani(sc); 
     748-       /* try to sample up to half of the available rates during each interval */ 
     749-       mi->sample_count *= 4; 
     750+       /* try to sample all available rates during each interval */ 
     751+       mi->sample_count *= 8; 
     752  
     753        cur_prob = 0; 
     754        cur_prob_tp = 0; 
     755@@ -320,20 +321,13 @@ minstrel_ht_update_stats(struct minstrel 
     756                if (!mg->supported) 
     757                        continue; 
     758  
     759-               mr = minstrel_get_ratestats(mi, mg->max_prob_rate); 
     760-               if (cur_prob_tp < mr->cur_tp && 
     761-                   minstrel_mcs_groups[group].streams == 1) { 
     762-                       mi->max_prob_rate = mg->max_prob_rate; 
     763-                       cur_prob = mr->cur_prob; 
     764-                       cur_prob_tp = mr->cur_tp; 
     765-               } 
     766- 
     767                mr = minstrel_get_ratestats(mi, mg->max_tp_rate); 
     768                if (cur_tp < mr->cur_tp) { 
     769                        mi->max_tp_rate2 = mi->max_tp_rate; 
     770                        cur_tp2 = cur_tp; 
     771                        mi->max_tp_rate = mg->max_tp_rate; 
     772                        cur_tp = mr->cur_tp; 
     773+                       mi->max_prob_streams = minstrel_mcs_groups[group].streams - 1; 
     774                } 
     775  
     776                mr = minstrel_get_ratestats(mi, mg->max_tp_rate2); 
     777@@ -343,6 +337,23 @@ minstrel_ht_update_stats(struct minstrel 
     778                } 
     779        } 
     780  
     781+       if (mi->max_prob_streams < 1) 
     782+               mi->max_prob_streams = 1; 
     783+ 
     784+       for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { 
     785+               mg = &mi->groups[group]; 
     786+               if (!mg->supported) 
     787+                       continue; 
     788+               mr = minstrel_get_ratestats(mi, mg->max_prob_rate); 
     789+               if (cur_prob_tp < mr->cur_tp && 
     790+                   minstrel_mcs_groups[group].streams <= mi->max_prob_streams) { 
     791+                       mi->max_prob_rate = mg->max_prob_rate; 
     792+                       cur_prob = mr->cur_prob; 
     793+                       cur_prob_tp = mr->cur_tp; 
     794+               } 
     795+       } 
     796+ 
     797+ 
     798        mi->stats_update = jiffies; 
    1276799 } 
    1277800  
    1278 -static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush) 
    1279 +static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx) 
     801@@ -467,7 +478,7 @@ minstrel_ht_tx_status(void *priv, struct 
     802  
     803        if (!mi->sample_wait && !mi->sample_tries && mi->sample_count > 0) { 
     804                mi->sample_wait = 16 + 2 * MINSTREL_TRUNC(mi->avg_ampdu_len); 
     805-               mi->sample_tries = 2; 
     806+               mi->sample_tries = 1; 
     807                mi->sample_count--; 
     808        } 
     809  
     810@@ -536,7 +547,7 @@ minstrel_calc_retransmit(struct minstrel 
     811        mr->retry_updated = true; 
     812  
     813        group = &minstrel_mcs_groups[index / MCS_GROUP_RATES]; 
     814-       tx_time_data = group->duration[index % MCS_GROUP_RATES] * ampdu_len; 
     815+       tx_time_data = group->duration[index % MCS_GROUP_RATES] * ampdu_len / 1000; 
     816  
     817        /* Contention time for first 2 tries */ 
     818        ctime = (t_slot * cw) >> 1; 
     819@@ -616,6 +627,7 @@ minstrel_get_sample_rate(struct minstrel 
    1280820 { 
    1281         struct ath_hw *ah = sc->sc_ah; 
    1282         bool ret = true; 
    1283 @@ -201,14 +201,6 @@ static bool ath_prepare_reset(struct ath 
    1284         if (!ath_drain_all_txq(sc, retry_tx)) 
    1285                 ret = false; 
    1286   
    1287 -       if (!flush) { 
    1288 -               if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 
    1289 -                       ath_rx_tasklet(sc, 1, true); 
    1290 -               ath_rx_tasklet(sc, 1, false); 
    1291 -       } else { 
    1292 -               ath_flushrecv(sc); 
    1293 -       } 
    1294 - 
    1295         return ret; 
     821        struct minstrel_rate_stats *mr; 
     822        struct minstrel_mcs_group_data *mg; 
     823+       unsigned int sample_dur, sample_group; 
     824        int sample_idx = 0; 
     825  
     826        if (mi->sample_wait > 0) { 
     827@@ -626,39 +638,46 @@ minstrel_get_sample_rate(struct minstrel 
     828        if (!mi->sample_tries) 
     829                return -1; 
     830  
     831-       mi->sample_tries--; 
     832        mg = &mi->groups[mi->sample_group]; 
     833        sample_idx = sample_table[mg->column][mg->index]; 
     834        mr = &mg->rates[sample_idx]; 
     835-       sample_idx += mi->sample_group * MCS_GROUP_RATES; 
     836+       sample_group = mi->sample_group; 
     837+       sample_idx += sample_group * MCS_GROUP_RATES; 
     838        minstrel_next_sample_idx(mi); 
     839  
     840        /* 
     841         * Sampling might add some overhead (RTS, no aggregation) 
     842         * to the frame. Hence, don't use sampling for the currently 
     843-        * used max TP rate. 
     844+        * used rates. 
     845         */ 
     846-       if (sample_idx == mi->max_tp_rate) 
     847+       if (sample_idx == mi->max_tp_rate || 
     848+           sample_idx == mi->max_tp_rate2 || 
     849+           sample_idx == mi->max_prob_rate) 
     850                return -1; 
     851+ 
     852        /* 
     853-        * When not using MRR, do not sample if the probability is already 
     854-        * higher than 95% to avoid wasting airtime 
     855+        * Do not sample if the probability is already higher than 95% 
     856+        * to avoid wasting airtime. 
     857         */ 
     858-       if (!mp->has_mrr && (mr->probability > MINSTREL_FRAC(95, 100))) 
     859+       if (mr->probability > MINSTREL_FRAC(95, 100)) 
     860                return -1; 
     861  
     862        /* 
     863         * Make sure that lower rates get sampled only occasionally, 
     864         * if the link is working perfectly. 
     865         */ 
     866-       if (minstrel_get_duration(sample_idx) > 
     867-           minstrel_get_duration(mi->max_tp_rate)) { 
     868+       sample_dur = minstrel_get_duration(sample_idx); 
     869+       if (sample_dur >= minstrel_get_duration(mi->max_tp_rate2) && 
     870+           (mi->max_prob_streams < 
     871+            minstrel_mcs_groups[sample_group].streams || 
     872+            sample_dur >= minstrel_get_duration(mi->max_prob_rate))) { 
     873                if (mr->sample_skipped < 20) 
     874                        return -1; 
     875  
     876                if (mi->sample_slow++ > 2) 
     877                        return -1; 
     878        } 
     879+       mi->sample_tries--; 
     880  
     881        return sample_idx; 
    1296882 } 
    1297   
    1298 @@ -261,11 +253,11 @@ static int ath_reset_internal(struct ath 
    1299         struct ath_common *common = ath9k_hw_common(ah); 
    1300         struct ath9k_hw_cal_data *caldata = NULL; 
    1301         bool fastcc = true; 
    1302 -       bool flush = false; 
    1303         int r; 
    1304   
    1305         __ath_cancel_work(sc); 
    1306   
    1307 +       tasklet_disable(&sc->intr_tq); 
    1308         spin_lock_bh(&sc->sc_pcu_lock); 
    1309   
    1310         if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) { 
    1311 @@ -275,11 +267,10 @@ static int ath_reset_internal(struct ath 
    1312   
    1313         if (!hchan) { 
    1314                 fastcc = false; 
    1315 -               flush = true; 
    1316                 hchan = ah->curchan; 
    1317         } 
    1318   
    1319 -       if (!ath_prepare_reset(sc, retry_tx, flush)) 
    1320 +       if (!ath_prepare_reset(sc, retry_tx)) 
    1321                 fastcc = false; 
    1322   
    1323         ath_dbg(common, CONFIG, "Reset to %u MHz, HT40: %d fastcc: %d\n", 
    1324 @@ -297,6 +288,8 @@ static int ath_reset_internal(struct ath 
    1325   
    1326  out: 
    1327         spin_unlock_bh(&sc->sc_pcu_lock); 
    1328 +       tasklet_enable(&sc->intr_tq); 
    1329 + 
    1330         return r; 
    1331  } 
    1332   
    1333 @@ -821,7 +814,7 @@ static void ath9k_stop(struct ieee80211_ 
    1334                 ath9k_hw_cfg_gpio_input(ah, ah->led_pin); 
    1335         } 
    1336   
    1337 -       ath_prepare_reset(sc, false, true); 
    1338 +       ath_prepare_reset(sc, false); 
    1339   
    1340         if (sc->rx.frag) { 
    1341                 dev_kfree_skb_any(sc->rx.frag); 
     883--- a/net/mac80211/rc80211_minstrel_ht.h 
     884+++ b/net/mac80211/rc80211_minstrel_ht.h 
     885@@ -16,11 +16,6 @@ 
     886 #define MINSTREL_MAX_STREAMS   3 
     887 #define MINSTREL_STREAM_GROUPS 4 
     888  
     889-/* scaled fraction values */ 
     890-#define MINSTREL_SCALE 16 
     891-#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div) 
     892-#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE) 
     893- 
     894 #define MCS_GROUP_RATES        8 
     895  
     896 struct mcs_group { 
     897@@ -85,6 +80,7 @@ struct minstrel_ht_sta { 
     898  
     899        /* best probability rate */ 
     900        unsigned int max_prob_rate; 
     901+       unsigned int max_prob_streams; 
     902  
     903        /* time of last status update */ 
     904        unsigned long stats_update; 
    1342905--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c 
    1343906+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c 
    1344 @@ -893,7 +893,7 @@ static bool ar9003_hw_init_cal(struct at 
    1345         struct ath9k_hw_cal_data *caldata = ah->caldata; 
    1346         bool txiqcal_done = false, txclcal_done = false; 
    1347         bool is_reusable = true, status = true; 
    1348 -       bool run_rtt_cal = false, run_agc_cal; 
    1349 +       bool run_rtt_cal = false, run_agc_cal, sep_iq_cal = false; 
    1350         bool rtt = !!(ah->caps.hw_caps & ATH9K_HW_CAP_RTT); 
    1351         u32 agc_ctrl = 0, agc_supp_cals = AR_PHY_AGC_CONTROL_OFFSET_CAL | 
     907@@ -1023,6 +1023,7 @@ static bool ar9003_hw_init_cal(struct at 
    1352908                                          AR_PHY_AGC_CONTROL_FLTR_CAL   | 
    1353 @@ -939,7 +939,8 @@ static bool ar9003_hw_init_cal(struct at 
    1354                 } 
     909                                          AR_PHY_AGC_CONTROL_PKDET_CAL; 
     910  
     911+       /* Use chip chainmask only for calibration */ 
     912        ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask); 
     913  
     914        if (rtt) { 
     915@@ -1150,6 +1151,9 @@ skip_tx_iqcal: 
     916                ar9003_hw_rtt_disable(ah); 
    1355917        } 
    1356918  
    1357 -       if (!(ah->enabled_cals & TX_IQ_CAL)) 
    1358 +       if ((IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan)) || 
    1359 +           !(ah->enabled_cals & TX_IQ_CAL)) 
    1360                 goto skip_tx_iqcal; 
    1361   
    1362         /* Do Tx IQ Calibration */ 
    1363 @@ -959,21 +960,22 @@ static bool ar9003_hw_init_cal(struct at 
    1364                         REG_CLR_BIT(ah, AR_PHY_TX_IQCAL_CONTROL_0, 
    1365                                     AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL); 
    1366                 txiqcal_done = run_agc_cal = true; 
    1367 -               goto skip_tx_iqcal; 
    1368 -       } else if (caldata && !caldata->done_txiqcal_once) 
    1369 +       } else if (caldata && !caldata->done_txiqcal_once) { 
    1370                 run_agc_cal = true; 
    1371 +               sep_iq_cal = true; 
     919+       /* Revert chainmask to runtime parameters */ 
     920+       ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask); 
     921+ 
     922        /* Initialize list pointers */ 
     923        ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; 
     924  
     925--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c 
     926+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c 
     927@@ -3606,6 +3606,12 @@ static void ar9003_hw_ant_ctrl_apply(str 
     928        value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz); 
     929        REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value); 
     930  
     931+       if ((AR_SREV_9462(ah)) && (ah->rxchainmask == 0x2)) { 
     932+               value = ar9003_hw_ant_ctrl_chain_get(ah, 1, is2ghz); 
     933+               REG_RMW_FIELD(ah, switch_chain_reg[0], 
     934+                             AR_SWITCH_TABLE_ALL, value); 
    1372935+       } 
    1373   
    1374 +skip_tx_iqcal: 
    1375         if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal) 
    1376                 ar9003_mci_init_cal_req(ah, &is_reusable); 
    1377   
    1378 -       if (!(IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan))) { 
    1379 +       if (sep_iq_cal) { 
    1380                 txiqcal_done = ar9003_hw_tx_iq_cal_run(ah); 
    1381                 REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS); 
    1382                 udelay(5); 
    1383                 REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN); 
    1384         } 
    1385   
    1386 -skip_tx_iqcal: 
    1387         if (run_agc_cal || !(ah->ah_flags & AH_FASTCC)) { 
    1388                 /* Calibrate the AGC */ 
    1389                 REG_WRITE(ah, AR_PHY_AGC_CONTROL, 
    1390 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h 
    1391 +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h 
    1392 @@ -744,6 +744,186 @@ static const u32 ar9300Modes_high_ob_db_ 
    1393         {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    1394  }; 
    1395   
    1396 +static const u32 ar9300Modes_mixed_ob_db_tx_gain_table_2p2[][5] = { 
    1397 +       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ 
    1398 +       {0x0000a2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, 
    1399 +       {0x0000a2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, 
    1400 +       {0x0000a2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, 
    1401 +       {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    1402 +       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, 
    1403 +       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1404 +       {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, 
    1405 +       {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, 
    1406 +       {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, 
    1407 +       {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202}, 
    1408 +       {0x0000a514, 0x1c000223, 0x1c000223, 0x11000400, 0x11000400}, 
    1409 +       {0x0000a518, 0x21002220, 0x21002220, 0x15000402, 0x15000402}, 
    1410 +       {0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404}, 
    1411 +       {0x0000a520, 0x2b022220, 0x2b022220, 0x1b000603, 0x1b000603}, 
    1412 +       {0x0000a524, 0x2f022222, 0x2f022222, 0x1f000a02, 0x1f000a02}, 
    1413 +       {0x0000a528, 0x34022225, 0x34022225, 0x23000a04, 0x23000a04}, 
    1414 +       {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x26000a20, 0x26000a20}, 
    1415 +       {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2a000e20, 0x2a000e20}, 
    1416 +       {0x0000a534, 0x4202242a, 0x4202242a, 0x2e000e22, 0x2e000e22}, 
    1417 +       {0x0000a538, 0x4702244a, 0x4702244a, 0x31000e24, 0x31000e24}, 
    1418 +       {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x34001640, 0x34001640}, 
    1419 +       {0x0000a540, 0x4e02246c, 0x4e02246c, 0x38001660, 0x38001660}, 
    1420 +       {0x0000a544, 0x52022470, 0x52022470, 0x3b001861, 0x3b001861}, 
    1421 +       {0x0000a548, 0x55022490, 0x55022490, 0x3e001a81, 0x3e001a81}, 
    1422 +       {0x0000a54c, 0x59022492, 0x59022492, 0x42001a83, 0x42001a83}, 
    1423 +       {0x0000a550, 0x5d022692, 0x5d022692, 0x44001c84, 0x44001c84}, 
    1424 +       {0x0000a554, 0x61022892, 0x61022892, 0x48001ce3, 0x48001ce3}, 
    1425 +       {0x0000a558, 0x65024890, 0x65024890, 0x4c001ce5, 0x4c001ce5}, 
    1426 +       {0x0000a55c, 0x69024892, 0x69024892, 0x50001ce9, 0x50001ce9}, 
    1427 +       {0x0000a560, 0x6e024c92, 0x6e024c92, 0x54001ceb, 0x54001ceb}, 
    1428 +       {0x0000a564, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec}, 
    1429 +       {0x0000a568, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec}, 
    1430 +       {0x0000a56c, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec}, 
    1431 +       {0x0000a570, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec}, 
    1432 +       {0x0000a574, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec}, 
    1433 +       {0x0000a578, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec}, 
    1434 +       {0x0000a57c, 0x74026e92, 0x74026e92, 0x56001eec, 0x56001eec}, 
    1435 +       {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, 
    1436 +       {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002}, 
    1437 +       {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, 
    1438 +       {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, 
    1439 +       {0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202}, 
    1440 +       {0x0000a594, 0x1c800223, 0x1c800223, 0x11800400, 0x11800400}, 
    1441 +       {0x0000a598, 0x21802220, 0x21802220, 0x15800402, 0x15800402}, 
    1442 +       {0x0000a59c, 0x27802223, 0x27802223, 0x19800404, 0x19800404}, 
    1443 +       {0x0000a5a0, 0x2b822220, 0x2b822220, 0x1b800603, 0x1b800603}, 
    1444 +       {0x0000a5a4, 0x2f822222, 0x2f822222, 0x1f800a02, 0x1f800a02}, 
    1445 +       {0x0000a5a8, 0x34822225, 0x34822225, 0x23800a04, 0x23800a04}, 
    1446 +       {0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x26800a20, 0x26800a20}, 
    1447 +       {0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2a800e20, 0x2a800e20}, 
    1448 +       {0x0000a5b4, 0x4282242a, 0x4282242a, 0x2e800e22, 0x2e800e22}, 
    1449 +       {0x0000a5b8, 0x4782244a, 0x4782244a, 0x31800e24, 0x31800e24}, 
    1450 +       {0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x34801640, 0x34801640}, 
    1451 +       {0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x38801660, 0x38801660}, 
    1452 +       {0x0000a5c4, 0x52822470, 0x52822470, 0x3b801861, 0x3b801861}, 
    1453 +       {0x0000a5c8, 0x55822490, 0x55822490, 0x3e801a81, 0x3e801a81}, 
    1454 +       {0x0000a5cc, 0x59822492, 0x59822492, 0x42801a83, 0x42801a83}, 
    1455 +       {0x0000a5d0, 0x5d822692, 0x5d822692, 0x44801c84, 0x44801c84}, 
    1456 +       {0x0000a5d4, 0x61822892, 0x61822892, 0x48801ce3, 0x48801ce3}, 
    1457 +       {0x0000a5d8, 0x65824890, 0x65824890, 0x4c801ce5, 0x4c801ce5}, 
    1458 +       {0x0000a5dc, 0x69824892, 0x69824892, 0x50801ce9, 0x50801ce9}, 
    1459 +       {0x0000a5e0, 0x6e824c92, 0x6e824c92, 0x54801ceb, 0x54801ceb}, 
    1460 +       {0x0000a5e4, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec}, 
    1461 +       {0x0000a5e8, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec}, 
    1462 +       {0x0000a5ec, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec}, 
    1463 +       {0x0000a5f0, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec}, 
    1464 +       {0x0000a5f4, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec}, 
    1465 +       {0x0000a5f8, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec}, 
    1466 +       {0x0000a5fc, 0x74826e92, 0x74826e92, 0x56801eec, 0x56801eec}, 
    1467 +       {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1468 +       {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1469 +       {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1470 +       {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1471 +       {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1472 +       {0x0000a614, 0x02004000, 0x02004000, 0x01404000, 0x01404000}, 
    1473 +       {0x0000a618, 0x02004801, 0x02004801, 0x01404501, 0x01404501}, 
    1474 +       {0x0000a61c, 0x02808a02, 0x02808a02, 0x02008501, 0x02008501}, 
    1475 +       {0x0000a620, 0x0380ce03, 0x0380ce03, 0x0280ca03, 0x0280ca03}, 
    1476 +       {0x0000a624, 0x04411104, 0x04411104, 0x03010c04, 0x03010c04}, 
    1477 +       {0x0000a628, 0x04411104, 0x04411104, 0x04014c04, 0x04014c04}, 
    1478 +       {0x0000a62c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, 
    1479 +       {0x0000a630, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, 
    1480 +       {0x0000a634, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, 
    1481 +       {0x0000a638, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, 
    1482 +       {0x0000a63c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, 
    1483 +       {0x0000b2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, 
    1484 +       {0x0000b2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, 
    1485 +       {0x0000b2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, 
    1486 +       {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    1487 +       {0x0000c2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, 
    1488 +       {0x0000c2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, 
    1489 +       {0x0000c2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, 
    1490 +       {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    1491 +       {0x00016044, 0x012492d4, 0x012492d4, 0x056db2e4, 0x056db2e4}, 
    1492 +       {0x00016048, 0x66480001, 0x66480001, 0x8e480001, 0x8e480001}, 
    1493 +       {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    1494 +       {0x00016444, 0x012492d4, 0x012492d4, 0x056db2e4, 0x056db2e4}, 
    1495 +       {0x00016448, 0x66480001, 0x66480001, 0x8e480001, 0x8e480001}, 
    1496 +       {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    1497 +       {0x00016844, 0x012492d4, 0x012492d4, 0x056db2e4, 0x056db2e4}, 
    1498 +       {0x00016848, 0x66480001, 0x66480001, 0x8e480001, 0x8e480001}, 
    1499 +       {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    1500 +}; 
    1501 + 
    1502 +static const u32 ar9300Modes_type5_tx_gain_table_2p2[][5] = { 
    1503 +       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ 
    1504 +       {0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, 
    1505 +       {0x0000a2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, 
    1506 +       {0x0000a2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, 
    1507 +       {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    1508 +       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, 
    1509 +       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1510 +       {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, 
    1511 +       {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, 
    1512 +       {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, 
    1513 +       {0x0000a510, 0x15000028, 0x15000028, 0x0f000202, 0x0f000202}, 
    1514 +       {0x0000a514, 0x1b00002b, 0x1b00002b, 0x12000400, 0x12000400}, 
    1515 +       {0x0000a518, 0x1f020028, 0x1f020028, 0x16000402, 0x16000402}, 
    1516 +       {0x0000a51c, 0x2502002b, 0x2502002b, 0x19000404, 0x19000404}, 
    1517 +       {0x0000a520, 0x2a04002a, 0x2a04002a, 0x1c000603, 0x1c000603}, 
    1518 +       {0x0000a524, 0x2e06002a, 0x2e06002a, 0x21000a02, 0x21000a02}, 
    1519 +       {0x0000a528, 0x3302202d, 0x3302202d, 0x25000a04, 0x25000a04}, 
    1520 +       {0x0000a52c, 0x3804202c, 0x3804202c, 0x28000a20, 0x28000a20}, 
    1521 +       {0x0000a530, 0x3c06202c, 0x3c06202c, 0x2c000e20, 0x2c000e20}, 
    1522 +       {0x0000a534, 0x4108202d, 0x4108202d, 0x30000e22, 0x30000e22}, 
    1523 +       {0x0000a538, 0x4506402d, 0x4506402d, 0x34000e24, 0x34000e24}, 
    1524 +       {0x0000a53c, 0x4906222d, 0x4906222d, 0x38001640, 0x38001640}, 
    1525 +       {0x0000a540, 0x4d062231, 0x4d062231, 0x3c001660, 0x3c001660}, 
    1526 +       {0x0000a544, 0x50082231, 0x50082231, 0x3f001861, 0x3f001861}, 
    1527 +       {0x0000a548, 0x5608422e, 0x5608422e, 0x43001a81, 0x43001a81}, 
    1528 +       {0x0000a54c, 0x5e08442e, 0x5e08442e, 0x47001a83, 0x47001a83}, 
    1529 +       {0x0000a550, 0x620a4431, 0x620a4431, 0x4a001c84, 0x4a001c84}, 
    1530 +       {0x0000a554, 0x640a4432, 0x640a4432, 0x4e001ce3, 0x4e001ce3}, 
    1531 +       {0x0000a558, 0x680a4434, 0x680a4434, 0x52001ce5, 0x52001ce5}, 
    1532 +       {0x0000a55c, 0x6c0a6434, 0x6c0a6434, 0x56001ce9, 0x56001ce9}, 
    1533 +       {0x0000a560, 0x6f0a6633, 0x6f0a6633, 0x5a001ceb, 0x5a001ceb}, 
    1534 +       {0x0000a564, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1535 +       {0x0000a568, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1536 +       {0x0000a56c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1537 +       {0x0000a570, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1538 +       {0x0000a574, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1539 +       {0x0000a578, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1540 +       {0x0000a57c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1541 +       {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1542 +       {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1543 +       {0x0000a608, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, 
    1544 +       {0x0000a60c, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, 
    1545 +       {0x0000a610, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, 
    1546 +       {0x0000a614, 0x01804601, 0x01804601, 0x01404000, 0x01404000}, 
    1547 +       {0x0000a618, 0x01804601, 0x01804601, 0x01404501, 0x01404501}, 
    1548 +       {0x0000a61c, 0x01804601, 0x01804601, 0x02008501, 0x02008501}, 
    1549 +       {0x0000a620, 0x03408d02, 0x03408d02, 0x0280ca03, 0x0280ca03}, 
    1550 +       {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04}, 
    1551 +       {0x0000a628, 0x03410d04, 0x03410d04, 0x04014c04, 0x04014c04}, 
    1552 +       {0x0000a62c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1553 +       {0x0000a630, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1554 +       {0x0000a634, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1555 +       {0x0000a638, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1556 +       {0x0000a63c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1557 +       {0x0000b2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, 
    1558 +       {0x0000b2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, 
    1559 +       {0x0000b2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, 
    1560 +       {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    1561 +       {0x0000c2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, 
    1562 +       {0x0000c2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, 
    1563 +       {0x0000c2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, 
    1564 +       {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    1565 +       {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, 
    1566 +       {0x00016048, 0x65240001, 0x65240001, 0x66480001, 0x66480001}, 
    1567 +       {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    1568 +       {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, 
    1569 +       {0x00016448, 0x65240001, 0x65240001, 0x66480001, 0x66480001}, 
    1570 +       {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    1571 +       {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, 
    1572 +       {0x00016848, 0x65240001, 0x65240001, 0x66480001, 0x66480001}, 
    1573 +       {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    1574 +}; 
    1575 + 
    1576  static const u32 ar9300Common_rx_gain_table_2p2[][2] = { 
    1577         /* Addr      allmodes  */ 
    1578         {0x0000a000, 0x00010000}, 
    1579 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c 
    1580 +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c 
    1581 @@ -459,28 +459,59 @@ static void ar9003_tx_gain_table_mode4(s 
    1582         else if (AR_SREV_9580(ah)) 
    1583                 INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1584                         ar9580_1p0_mixed_ob_db_tx_gain_table); 
    1585 +       else 
    1586 +               INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1587 +                       ar9300Modes_mixed_ob_db_tx_gain_table_2p2); 
    1588 +} 
    1589 + 
    1590 +static void ar9003_tx_gain_table_mode5(struct ath_hw *ah) 
    1591 +{ 
    1592 +       if (AR_SREV_9485_11(ah)) 
    1593 +               INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1594 +                       ar9485Modes_green_ob_db_tx_gain_1_1); 
    1595 +       else if (AR_SREV_9340(ah)) 
    1596 +               INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1597 +                       ar9340Modes_ub124_tx_gain_table_1p0); 
    1598 +       else if (AR_SREV_9580(ah)) 
    1599 +               INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1600 +                       ar9580_1p0_type5_tx_gain_table); 
    1601 +       else if (AR_SREV_9300_22(ah)) 
    1602 +               INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1603 +                       ar9300Modes_type5_tx_gain_table_2p2); 
    1604 +} 
    1605 + 
    1606 +static void ar9003_tx_gain_table_mode6(struct ath_hw *ah) 
    1607 +{ 
    1608 +       if (AR_SREV_9340(ah)) 
    1609 +               INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1610 +                       ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0); 
    1611 +       else if (AR_SREV_9485_11(ah)) 
    1612 +               INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1613 +                       ar9485Modes_green_spur_ob_db_tx_gain_1_1); 
    1614 +       else if (AR_SREV_9580(ah)) 
    1615 +               INIT_INI_ARRAY(&ah->iniModesTxGain, 
    1616 +                       ar9580_1p0_type6_tx_gain_table); 
    1617  } 
    1618   
    1619 +typedef void (*ath_txgain_tab)(struct ath_hw *ah); 
    1620 + 
    1621  static void ar9003_tx_gain_table_apply(struct ath_hw *ah) 
    1622  { 
    1623 -       switch (ar9003_hw_get_tx_gain_idx(ah)) { 
    1624 -       case 0: 
    1625 -       default: 
    1626 -               ar9003_tx_gain_table_mode0(ah); 
    1627 -               break; 
    1628 -       case 1: 
    1629 -               ar9003_tx_gain_table_mode1(ah); 
    1630 -               break; 
    1631 -       case 2: 
    1632 -               ar9003_tx_gain_table_mode2(ah); 
    1633 -               break; 
    1634 -       case 3: 
    1635 -               ar9003_tx_gain_table_mode3(ah); 
    1636 -               break; 
    1637 -       case 4: 
    1638 -               ar9003_tx_gain_table_mode4(ah); 
    1639 -               break; 
    1640 -       } 
    1641 +       static const ath_txgain_tab modes[] = { 
    1642 +               ar9003_tx_gain_table_mode0, 
    1643 +               ar9003_tx_gain_table_mode1, 
    1644 +               ar9003_tx_gain_table_mode2, 
    1645 +               ar9003_tx_gain_table_mode3, 
    1646 +               ar9003_tx_gain_table_mode4, 
    1647 +               ar9003_tx_gain_table_mode5, 
    1648 +               ar9003_tx_gain_table_mode6, 
    1649 +       }; 
    1650 +       int idx = ar9003_hw_get_tx_gain_idx(ah); 
    1651 + 
    1652 +       if (idx >= ARRAY_SIZE(modes)) 
    1653 +               idx = 0; 
    1654 + 
    1655 +       modes[idx](ah); 
    1656  } 
    1657   
    1658  static void ar9003_rx_gain_table_mode0(struct ath_hw *ah) 
    1659 --- a/drivers/net/wireless/ath/ath9k/ar9340_initvals.h 
    1660 +++ b/drivers/net/wireless/ath/ath9k/ar9340_initvals.h 
    1661 @@ -1170,6 +1170,106 @@ static const u32 ar9340Modes_mixed_ob_db 
    1662         {0x00016448, 0x24925666, 0x24925666, 0x8e481266, 0x8e481266}, 
    1663  }; 
    1664   
    1665 +static const u32 ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0[][5] = { 
    1666 +       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ 
    1667 +       {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03eaac5a, 0x03eaac5a}, 
    1668 +       {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03f330ac, 0x03f330ac}, 
    1669 +       {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03fc3f00, 0x03fc3f00}, 
    1670 +       {0x0000a2e8, 0x00000000, 0x00000000, 0x03ffc000, 0x03ffc000}, 
    1671 +       {0x0000a394, 0x00000444, 0x00000444, 0x00000404, 0x00000404}, 
    1672 +       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, 
    1673 +       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1674 +       {0x0000a504, 0x06000003, 0x06000003, 0x02000001, 0x02000001}, 
    1675 +       {0x0000a508, 0x0a000020, 0x0a000020, 0x05000003, 0x05000003}, 
    1676 +       {0x0000a50c, 0x10000023, 0x10000023, 0x0a000005, 0x0a000005}, 
    1677 +       {0x0000a510, 0x16000220, 0x16000220, 0x0e000201, 0x0e000201}, 
    1678 +       {0x0000a514, 0x1c000223, 0x1c000223, 0x11000203, 0x11000203}, 
    1679 +       {0x0000a518, 0x21002220, 0x21002220, 0x14000401, 0x14000401}, 
    1680 +       {0x0000a51c, 0x27002223, 0x27002223, 0x18000403, 0x18000403}, 
    1681 +       {0x0000a520, 0x2b022220, 0x2b022220, 0x1b000602, 0x1b000602}, 
    1682 +       {0x0000a524, 0x2f022222, 0x2f022222, 0x1f000802, 0x1f000802}, 
    1683 +       {0x0000a528, 0x34022225, 0x34022225, 0x21000620, 0x21000620}, 
    1684 +       {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x25000820, 0x25000820}, 
    1685 +       {0x0000a530, 0x3e02222c, 0x3e02222c, 0x29000822, 0x29000822}, 
    1686 +       {0x0000a534, 0x4202242a, 0x4202242a, 0x2d000824, 0x2d000824}, 
    1687 +       {0x0000a538, 0x4702244a, 0x4702244a, 0x30000828, 0x30000828}, 
    1688 +       {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x3400082a, 0x3400082a}, 
    1689 +       {0x0000a540, 0x4e02246c, 0x4e02246c, 0x38000849, 0x38000849}, 
    1690 +       {0x0000a544, 0x5302266c, 0x5302266c, 0x3b000a2c, 0x3b000a2c}, 
    1691 +       {0x0000a548, 0x5702286c, 0x5702286c, 0x3e000e2b, 0x3e000e2b}, 
    1692 +       {0x0000a54c, 0x5c02486b, 0x5c02486b, 0x42000e2d, 0x42000e2d}, 
    1693 +       {0x0000a550, 0x61024a6c, 0x61024a6c, 0x4500124a, 0x4500124a}, 
    1694 +       {0x0000a554, 0x66026a6c, 0x66026a6c, 0x4900124c, 0x4900124c}, 
    1695 +       {0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x4c00126c, 0x4c00126c}, 
    1696 +       {0x0000a55c, 0x7002708c, 0x7002708c, 0x4f00128c, 0x4f00128c}, 
    1697 +       {0x0000a560, 0x7302b08a, 0x7302b08a, 0x52001290, 0x52001290}, 
    1698 +       {0x0000a564, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292}, 
    1699 +       {0x0000a568, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292}, 
    1700 +       {0x0000a56c, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292}, 
    1701 +       {0x0000a570, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292}, 
    1702 +       {0x0000a574, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292}, 
    1703 +       {0x0000a578, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292}, 
    1704 +       {0x0000a57c, 0x7702b08c, 0x7702b08c, 0x56001292, 0x56001292}, 
    1705 +       {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, 
    1706 +       {0x0000a584, 0x06800003, 0x06800003, 0x02800001, 0x02800001}, 
    1707 +       {0x0000a588, 0x0a800020, 0x0a800020, 0x05800003, 0x05800003}, 
    1708 +       {0x0000a58c, 0x10800023, 0x10800023, 0x0a800005, 0x0a800005}, 
    1709 +       {0x0000a590, 0x16800220, 0x16800220, 0x0e800201, 0x0e800201}, 
    1710 +       {0x0000a594, 0x1c800223, 0x1c800223, 0x11800203, 0x11800203}, 
    1711 +       {0x0000a598, 0x21820220, 0x21820220, 0x14800401, 0x14800401}, 
    1712 +       {0x0000a59c, 0x27820223, 0x27820223, 0x18800403, 0x18800403}, 
    1713 +       {0x0000a5a0, 0x2b822220, 0x2b822220, 0x1b800602, 0x1b800602}, 
    1714 +       {0x0000a5a4, 0x2f822222, 0x2f822222, 0x1f800802, 0x1f800802}, 
    1715 +       {0x0000a5a8, 0x34822225, 0x34822225, 0x21800620, 0x21800620}, 
    1716 +       {0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x25800820, 0x25800820}, 
    1717 +       {0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x29800822, 0x29800822}, 
    1718 +       {0x0000a5b4, 0x4282242a, 0x4282242a, 0x2d800824, 0x2d800824}, 
    1719 +       {0x0000a5b8, 0x4782244a, 0x4782244a, 0x30800828, 0x30800828}, 
    1720 +       {0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x3480082a, 0x3480082a}, 
    1721 +       {0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x38800849, 0x38800849}, 
    1722 +       {0x0000a5c4, 0x5382266c, 0x5382266c, 0x3b800a2c, 0x3b800a2c}, 
    1723 +       {0x0000a5c8, 0x5782286c, 0x5782286c, 0x3e800e2b, 0x3e800e2b}, 
    1724 +       {0x0000a5cc, 0x5c84286b, 0x5c84286b, 0x42800e2d, 0x42800e2d}, 
    1725 +       {0x0000a5d0, 0x61842a6c, 0x61842a6c, 0x4580124a, 0x4580124a}, 
    1726 +       {0x0000a5d4, 0x66862a6c, 0x66862a6c, 0x4980124c, 0x4980124c}, 
    1727 +       {0x0000a5d8, 0x6b862e6c, 0x6b862e6c, 0x4c80126c, 0x4c80126c}, 
    1728 +       {0x0000a5dc, 0x7086308c, 0x7086308c, 0x4f80128c, 0x4f80128c}, 
    1729 +       {0x0000a5e0, 0x738a308a, 0x738a308a, 0x52801290, 0x52801290}, 
    1730 +       {0x0000a5e4, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292}, 
    1731 +       {0x0000a5e8, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292}, 
    1732 +       {0x0000a5ec, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292}, 
    1733 +       {0x0000a5f0, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292}, 
    1734 +       {0x0000a5f4, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292}, 
    1735 +       {0x0000a5f8, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292}, 
    1736 +       {0x0000a5fc, 0x778a308c, 0x778a308c, 0x56801292, 0x56801292}, 
    1737 +       {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1738 +       {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1739 +       {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1740 +       {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1741 +       {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1742 +       {0x0000a614, 0x01404000, 0x01404000, 0x01404501, 0x01404501}, 
    1743 +       {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501}, 
    1744 +       {0x0000a61c, 0x02008802, 0x02008802, 0x01404501, 0x01404501}, 
    1745 +       {0x0000a620, 0x0300cc03, 0x0300cc03, 0x03c0cf02, 0x03c0cf02}, 
    1746 +       {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03c0cf03, 0x03c0cf03}, 
    1747 +       {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04011004, 0x04011004}, 
    1748 +       {0x0000a62c, 0x03810c03, 0x03810c03, 0x05419405, 0x05419405}, 
    1749 +       {0x0000a630, 0x03810e04, 0x03810e04, 0x05419506, 0x05419506}, 
    1750 +       {0x0000a634, 0x03810e04, 0x03810e04, 0x05419506, 0x05419506}, 
    1751 +       {0x0000a638, 0x03810e04, 0x03810e04, 0x05419506, 0x05419506}, 
    1752 +       {0x0000a63c, 0x03810e04, 0x03810e04, 0x05419506, 0x05419506}, 
    1753 +       {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03eaac5a, 0x03eaac5a}, 
    1754 +       {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03f330ac, 0x03f330ac}, 
    1755 +       {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03fc3f00, 0x03fc3f00}, 
    1756 +       {0x0000b2e8, 0x00000000, 0x00000000, 0x03ffc000, 0x03ffc000}, 
    1757 +       {0x00016044, 0x022492db, 0x022492db, 0x022492db, 0x022492db}, 
    1758 +       {0x00016048, 0x24925666, 0x24925666, 0x24925266, 0x24925266}, 
    1759 +       {0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015}, 
    1760 +       {0x00016288, 0xf0318000, 0xf0318000, 0xf0318000, 0xf0318000}, 
    1761 +       {0x00016444, 0x022492db, 0x022492db, 0x022492db, 0x022492db}, 
    1762 +       {0x00016448, 0x24925666, 0x24925666, 0x24925266, 0x24925266}, 
    1763 +}; 
    1764 + 
    1765  static const u32 ar9340_1p0_mac_core[][2] = { 
    1766         /* Addr      allmodes  */ 
    1767         {0x00000008, 0x00000000}, 
    1768 --- a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h 
    1769 +++ b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h 
    1770 @@ -234,12 +234,158 @@ static const u32 ar9485Modes_high_power_ 
    1771         {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260}, 
    1772  }; 
    1773   
    1774 +static const u32 ar9485Modes_green_ob_db_tx_gain_1_1[][5] = { 
    1775 +       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ 
    1776 +       {0x000098bc, 0x00000003, 0x00000003, 0x00000003, 0x00000003}, 
    1777 +       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8}, 
    1778 +       {0x0000a458, 0x80000000, 0x80000000, 0x80000000, 0x80000000}, 
    1779 +       {0x0000a500, 0x00022200, 0x00022200, 0x00000006, 0x00000006}, 
    1780 +       {0x0000a504, 0x05062002, 0x05062002, 0x03000201, 0x03000201}, 
    1781 +       {0x0000a508, 0x0c002e00, 0x0c002e00, 0x06000203, 0x06000203}, 
    1782 +       {0x0000a50c, 0x11062202, 0x11062202, 0x0a000401, 0x0a000401}, 
    1783 +       {0x0000a510, 0x17022e00, 0x17022e00, 0x0e000403, 0x0e000403}, 
    1784 +       {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x12000405, 0x12000405}, 
    1785 +       {0x0000a518, 0x25020ec0, 0x25020ec0, 0x15000604, 0x15000604}, 
    1786 +       {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x18000605, 0x18000605}, 
    1787 +       {0x0000a520, 0x2f001f04, 0x2f001f04, 0x1c000a04, 0x1c000a04}, 
    1788 +       {0x0000a524, 0x35001fc4, 0x35001fc4, 0x21000a06, 0x21000a06}, 
    1789 +       {0x0000a528, 0x3c022f04, 0x3c022f04, 0x29000a24, 0x29000a24}, 
    1790 +       {0x0000a52c, 0x41023e85, 0x41023e85, 0x2f000e21, 0x2f000e21}, 
    1791 +       {0x0000a530, 0x48023ec6, 0x48023ec6, 0x31000e20, 0x31000e20}, 
    1792 +       {0x0000a534, 0x4d023f01, 0x4d023f01, 0x33000e20, 0x33000e20}, 
    1793 +       {0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62}, 
    1794 +       {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63}, 
    1795 +       {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65}, 
    1796 +       {0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66}, 
    1797 +       {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645}, 
    1798 +       {0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865}, 
    1799 +       {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86}, 
    1800 +       {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9}, 
    1801 +       {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb}, 
    1802 +       {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb}, 
    1803 +       {0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb}, 
    1804 +       {0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb}, 
    1805 +       {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, 
    1806 +       {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, 
    1807 +       {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, 
    1808 +       {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, 
    1809 +       {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, 
    1810 +       {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb}, 
    1811 +       {0x0000b500, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1812 +       {0x0000b504, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1813 +       {0x0000b508, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1814 +       {0x0000b50c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1815 +       {0x0000b510, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1816 +       {0x0000b514, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1817 +       {0x0000b518, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1818 +       {0x0000b51c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1819 +       {0x0000b520, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1820 +       {0x0000b524, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1821 +       {0x0000b528, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1822 +       {0x0000b52c, 0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a}, 
    1823 +       {0x0000b530, 0x0000003a, 0x0000003a, 0x0000003a, 0x0000003a}, 
    1824 +       {0x0000b534, 0x0000004a, 0x0000004a, 0x0000004a, 0x0000004a}, 
    1825 +       {0x0000b538, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1826 +       {0x0000b53c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1827 +       {0x0000b540, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1828 +       {0x0000b544, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1829 +       {0x0000b548, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1830 +       {0x0000b54c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1831 +       {0x0000b550, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1832 +       {0x0000b554, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1833 +       {0x0000b558, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1834 +       {0x0000b55c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1835 +       {0x0000b560, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1836 +       {0x0000b564, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1837 +       {0x0000b568, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1838 +       {0x0000b56c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1839 +       {0x0000b570, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1840 +       {0x0000b574, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1841 +       {0x0000b578, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1842 +       {0x0000b57c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1843 +       {0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db}, 
    1844 +       {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260}, 
    1845 +}; 
    1846 + 
    1847  #define ar9485Modes_high_ob_db_tx_gain_1_1 ar9485Modes_high_power_tx_gain_1_1 
    1848   
    1849  #define ar9485Modes_low_ob_db_tx_gain_1_1 ar9485Modes_high_ob_db_tx_gain_1_1 
    1850   
    1851  #define ar9485_modes_lowest_ob_db_tx_gain_1_1 ar9485Modes_low_ob_db_tx_gain_1_1 
    1852   
    1853 +static const u32 ar9485Modes_green_spur_ob_db_tx_gain_1_1[][5] = { 
    1854 +       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ 
    1855 +       {0x000098bc, 0x00000003, 0x00000003, 0x00000003, 0x00000003}, 
    1856 +       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8}, 
    1857 +       {0x0000a458, 0x80000000, 0x80000000, 0x80000000, 0x80000000}, 
    1858 +       {0x0000a500, 0x00022200, 0x00022200, 0x00000006, 0x00000006}, 
    1859 +       {0x0000a504, 0x05062002, 0x05062002, 0x03000201, 0x03000201}, 
    1860 +       {0x0000a508, 0x0c002e00, 0x0c002e00, 0x07000203, 0x07000203}, 
    1861 +       {0x0000a50c, 0x11062202, 0x11062202, 0x0a000401, 0x0a000401}, 
    1862 +       {0x0000a510, 0x17022e00, 0x17022e00, 0x0e000403, 0x0e000403}, 
    1863 +       {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x12000405, 0x12000405}, 
    1864 +       {0x0000a518, 0x25020ec0, 0x25020ec0, 0x14000406, 0x14000406}, 
    1865 +       {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1800040a, 0x1800040a}, 
    1866 +       {0x0000a520, 0x2f001f04, 0x2f001f04, 0x1c000460, 0x1c000460}, 
    1867 +       {0x0000a524, 0x35001fc4, 0x35001fc4, 0x22000463, 0x22000463}, 
    1868 +       {0x0000a528, 0x3c022f04, 0x3c022f04, 0x26000465, 0x26000465}, 
    1869 +       {0x0000a52c, 0x41023e85, 0x41023e85, 0x2e0006e0, 0x2e0006e0}, 
    1870 +       {0x0000a530, 0x48023ec6, 0x48023ec6, 0x310006e0, 0x310006e0}, 
    1871 +       {0x0000a534, 0x4d023f01, 0x4d023f01, 0x330006e0, 0x330006e0}, 
    1872 +       {0x0000a538, 0x53023f4b, 0x53023f4b, 0x3e0008e3, 0x3e0008e3}, 
    1873 +       {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x410008e5, 0x410008e5}, 
    1874 +       {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x430008e6, 0x430008e6}, 
    1875 +       {0x0000a544, 0x6502feca, 0x6502feca, 0x4a0008ec, 0x4a0008ec}, 
    1876 +       {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4e0008f1, 0x4e0008f1}, 
    1877 +       {0x0000a54c, 0x7203feca, 0x7203feca, 0x520008f3, 0x520008f3}, 
    1878 +       {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x54000eed, 0x54000eed}, 
    1879 +       {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x58000ef1, 0x58000ef1}, 
    1880 +       {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5c000ef3, 0x5c000ef3}, 
    1881 +       {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x60000ef5, 0x60000ef5}, 
    1882 +       {0x0000a560, 0x900fff0b, 0x900fff0b, 0x62000ef6, 0x62000ef6}, 
    1883 +       {0x0000a564, 0x960fffcb, 0x960fffcb, 0x62000ef6, 0x62000ef6}, 
    1884 +       {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6}, 
    1885 +       {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6}, 
    1886 +       {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6}, 
    1887 +       {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6}, 
    1888 +       {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6}, 
    1889 +       {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x62000ef6, 0x62000ef6}, 
    1890 +       {0x0000b500, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1891 +       {0x0000b504, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1892 +       {0x0000b508, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1893 +       {0x0000b50c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1894 +       {0x0000b510, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1895 +       {0x0000b514, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1896 +       {0x0000b518, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1897 +       {0x0000b51c, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1898 +       {0x0000b520, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1899 +       {0x0000b524, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1900 +       {0x0000b528, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a}, 
    1901 +       {0x0000b52c, 0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a}, 
    1902 +       {0x0000b530, 0x0000003a, 0x0000003a, 0x0000003a, 0x0000003a}, 
    1903 +       {0x0000b534, 0x0000004a, 0x0000004a, 0x0000004a, 0x0000004a}, 
    1904 +       {0x0000b538, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1905 +       {0x0000b53c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1906 +       {0x0000b540, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1907 +       {0x0000b544, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1908 +       {0x0000b548, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1909 +       {0x0000b54c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1910 +       {0x0000b550, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1911 +       {0x0000b554, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1912 +       {0x0000b558, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1913 +       {0x0000b55c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1914 +       {0x0000b560, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1915 +       {0x0000b564, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1916 +       {0x0000b568, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1917 +       {0x0000b56c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1918 +       {0x0000b570, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1919 +       {0x0000b574, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1920 +       {0x0000b578, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1921 +       {0x0000b57c, 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b}, 
    1922 +       {0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db}, 
    1923 +       {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260}, 
    1924 +}; 
    1925 + 
    1926  static const u32 ar9485_1_1[][2] = { 
    1927         /* Addr      allmodes  */ 
    1928         {0x0000a580, 0x00000000}, 
    1929 --- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h 
    1930 +++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h 
    1931 @@ -685,6 +685,82 @@ static const u32 ar9580_1p0_mixed_ob_db_ 
    1932   
    1933  #define ar9580_1p0_high_ob_db_tx_gain_table ar9300Modes_high_ob_db_tx_gain_table_2p2 
    1934   
    1935 +#define ar9580_1p0_type5_tx_gain_table ar9300Modes_type5_tx_gain_table_2p2 
    1936 + 
    1937 +static const u32 ar9580_1p0_type6_tx_gain_table[][5] = { 
    1938 +       /* Addr      5G_HT20     5G_HT40     2G_HT40     2G_HT20   */ 
    1939 +       {0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, 
    1940 +       {0x0000a2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, 
    1941 +       {0x0000a2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, 
    1942 +       {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    1943 +       {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, 
    1944 +       {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1945 +       {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, 
    1946 +       {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, 
    1947 +       {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, 
    1948 +       {0x0000a510, 0x15000028, 0x15000028, 0x0f000202, 0x0f000202}, 
    1949 +       {0x0000a514, 0x1b00002b, 0x1b00002b, 0x12000400, 0x12000400}, 
    1950 +       {0x0000a518, 0x1f020028, 0x1f020028, 0x16000402, 0x16000402}, 
    1951 +       {0x0000a51c, 0x2502002b, 0x2502002b, 0x19000404, 0x19000404}, 
    1952 +       {0x0000a520, 0x2a04002a, 0x2a04002a, 0x1c000603, 0x1c000603}, 
    1953 +       {0x0000a524, 0x2e06002a, 0x2e06002a, 0x21000a02, 0x21000a02}, 
    1954 +       {0x0000a528, 0x3302202d, 0x3302202d, 0x25000a04, 0x25000a04}, 
    1955 +       {0x0000a52c, 0x3804202c, 0x3804202c, 0x28000a20, 0x28000a20}, 
    1956 +       {0x0000a530, 0x3c06202c, 0x3c06202c, 0x2c000e20, 0x2c000e20}, 
    1957 +       {0x0000a534, 0x4108202d, 0x4108202d, 0x30000e22, 0x30000e22}, 
    1958 +       {0x0000a538, 0x4506402d, 0x4506402d, 0x34000e24, 0x34000e24}, 
    1959 +       {0x0000a53c, 0x4906222d, 0x4906222d, 0x38001640, 0x38001640}, 
    1960 +       {0x0000a540, 0x4d062231, 0x4d062231, 0x3c001660, 0x3c001660}, 
    1961 +       {0x0000a544, 0x50082231, 0x50082231, 0x3f001861, 0x3f001861}, 
    1962 +       {0x0000a548, 0x5608422e, 0x5608422e, 0x43001a81, 0x43001a81}, 
    1963 +       {0x0000a54c, 0x5e08442e, 0x5e08442e, 0x47001a83, 0x47001a83}, 
    1964 +       {0x0000a550, 0x620a4431, 0x620a4431, 0x4a001c84, 0x4a001c84}, 
    1965 +       {0x0000a554, 0x640a4432, 0x640a4432, 0x4e001ce3, 0x4e001ce3}, 
    1966 +       {0x0000a558, 0x680a4434, 0x680a4434, 0x52001ce5, 0x52001ce5}, 
    1967 +       {0x0000a55c, 0x6c0a6434, 0x6c0a6434, 0x56001ce9, 0x56001ce9}, 
    1968 +       {0x0000a560, 0x6f0a6633, 0x6f0a6633, 0x5a001ceb, 0x5a001ceb}, 
    1969 +       {0x0000a564, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1970 +       {0x0000a568, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1971 +       {0x0000a56c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1972 +       {0x0000a570, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1973 +       {0x0000a574, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1974 +       {0x0000a578, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1975 +       {0x0000a57c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec}, 
    1976 +       {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1977 +       {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1978 +       {0x0000a608, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, 
    1979 +       {0x0000a60c, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, 
    1980 +       {0x0000a610, 0x01804601, 0x01804601, 0x00000000, 0x00000000}, 
    1981 +       {0x0000a614, 0x01804601, 0x01804601, 0x01404000, 0x01404000}, 
    1982 +       {0x0000a618, 0x01804601, 0x01804601, 0x01404501, 0x01404501}, 
    1983 +       {0x0000a61c, 0x01804601, 0x01804601, 0x02008501, 0x02008501}, 
    1984 +       {0x0000a620, 0x03408d02, 0x03408d02, 0x0280ca03, 0x0280ca03}, 
    1985 +       {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04}, 
    1986 +       {0x0000a628, 0x03410d04, 0x03410d04, 0x04014c04, 0x04014c04}, 
    1987 +       {0x0000a62c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1988 +       {0x0000a630, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1989 +       {0x0000a634, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1990 +       {0x0000a638, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1991 +       {0x0000a63c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005}, 
    1992 +       {0x0000b2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, 
    1993 +       {0x0000b2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, 
    1994 +       {0x0000b2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, 
    1995 +       {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    1996 +       {0x0000c2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352}, 
    1997 +       {0x0000c2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584}, 
    1998 +       {0x0000c2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800}, 
    1999 +       {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, 
    2000 +       {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, 
    2001 +       {0x00016048, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, 
    2002 +       {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    2003 +       {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, 
    2004 +       {0x00016448, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, 
    2005 +       {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    2006 +       {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, 
    2007 +       {0x00016848, 0x61200001, 0x61200001, 0x66480001, 0x66480001}, 
    2008 +       {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, 
    2009 +}; 
    2010 + 
    2011  static const u32 ar9580_1p0_soc_preamble[][2] = { 
    2012         /* Addr      allmodes  */ 
    2013         {0x000040a4, 0x00a0c1c9}, 
    2014 --- a/drivers/net/wireless/ath/ath9k/reg.h 
    2015 +++ b/drivers/net/wireless/ath/ath9k/reg.h 
    2016 @@ -789,6 +789,7 @@ 
    2017  #define AR_SREV_REVISION_9271_11       1 
    2018  #define AR_SREV_VERSION_9300           0x1c0 
    2019  #define AR_SREV_REVISION_9300_20       2 /* 2.0 and 2.1 */ 
    2020 +#define AR_SREV_REVISION_9300_22       3 
    2021  #define AR_SREV_VERSION_9330           0x200 
    2022  #define AR_SREV_REVISION_9330_10       0 
    2023  #define AR_SREV_REVISION_9330_11       1 
    2024 @@ -867,6 +868,9 @@ 
    2025         (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9300)) 
    2026  #define AR_SREV_9300_20_OR_LATER(_ah) \ 
    2027         ((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9300) 
    2028 +#define AR_SREV_9300_22(_ah) \ 
    2029 +       (AR_SREV_9300(ah) && \ 
    2030 +        ((_ah)->hw_version.macRev == AR_SREV_REVISION_9300_22)) 
    2031   
    2032  #define AR_SREV_9330(_ah) \ 
    2033         (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9330)) 
    2034 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
    2035 +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
    2036 @@ -1067,15 +1067,19 @@ static bool ath9k_rx_prepare(struct ath9 
    2037   
    2038         last_rssi = priv->rx.last_rssi; 
    2039   
    2040 -       if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER)) 
    2041 -               rxbuf->rxstatus.rs_rssi = ATH_EP_RND(last_rssi, 
    2042 -                                                    ATH_RSSI_EP_MULTIPLIER); 
    2043 +       if (ieee80211_is_beacon(hdr->frame_control) && 
    2044 +           !is_zero_ether_addr(common->curbssid) && 
    2045 +           ether_addr_equal(hdr->addr3, common->curbssid)) { 
    2046 +               s8 rssi = rxbuf->rxstatus.rs_rssi; 
    2047   
    2048 -       if (rxbuf->rxstatus.rs_rssi < 0) 
    2049 -               rxbuf->rxstatus.rs_rssi = 0; 
    2050 +               if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER)) 
    2051 +                       rssi = ATH_EP_RND(last_rssi, ATH_RSSI_EP_MULTIPLIER); 
    2052   
    2053 -       if (ieee80211_is_beacon(fc)) 
    2054 -               priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi; 
    2055 +               if (rssi < 0) 
    2056 +                       rssi = 0; 
    2057 + 
    2058 +               priv->ah->stats.avgbrssi = rssi; 
     936+ 
     937        for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { 
     938                if ((ah->rxchainmask & BIT(chain)) || 
     939                    (ah->txchainmask & BIT(chain))) { 
     940@@ -3772,6 +3778,17 @@ static void ar9003_hw_atten_apply(struct 
     941                                          AR_PHY_EXT_ATTEN_CTL_2, 
     942                                         }; 
     943  
     944+       if ((AR_SREV_9462(ah)) && (ah->rxchainmask == 0x2)) { 
     945+               value = ar9003_hw_atten_chain_get(ah, 1, chan); 
     946+               REG_RMW_FIELD(ah, ext_atten_reg[0], 
     947+                             AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value); 
     948+ 
     949+               value = ar9003_hw_atten_chain_get_margin(ah, 1, chan); 
     950+               REG_RMW_FIELD(ah, ext_atten_reg[0], 
     951+                             AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN, 
     952+                             value); 
    2059953+       } 
    2060   
    2061         rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp); 
    2062         rx_status->band = hw->conf.channel->band; 
    2063 --- a/drivers/net/wireless/ath/ath9k/common.h 
    2064 +++ b/drivers/net/wireless/ath/ath9k/common.h 
    2065 @@ -35,7 +35,7 @@ 
    2066  #define WME_AC_BK   3 
    2067  #define WME_NUM_AC  4 
    2068   
    2069 -#define ATH_RSSI_DUMMY_MARKER   0x127 
    2070 +#define ATH_RSSI_DUMMY_MARKER   127 
    2071  #define ATH_RSSI_LPF_LEN               10 
    2072  #define RSSI_LPF_THRESHOLD             -20 
    2073  #define ATH_RSSI_EP_MULTIPLIER     (1<<7) 
     954+ 
     955        /* Test value. if 0 then attenuation is unused. Don't load anything. */ 
     956        for (i = 0; i < 3; i++) { 
     957                if (ah->txchainmask & BIT(i)) { 
    2074958--- a/drivers/net/wireless/ath/ath9k/link.c 
    2075959+++ b/drivers/net/wireless/ath/ath9k/link.c 
    2076 @@ -31,21 +31,21 @@ void ath_tx_complete_poll_work(struct wo 
    2077         sc->tx_complete_poll_work_seen++; 
    2078  #endif 
     960@@ -28,21 +28,21 @@ void ath_tx_complete_poll_work(struct wo 
     961        int i; 
     962        bool needreset = false; 
    2079963  
    2080964-       for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) 
     
    2109993        if (needreset) { 
    2110994                ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, 
     995--- a/net/mac80211/sta_info.c 
     996+++ b/net/mac80211/sta_info.c 
     997@@ -766,6 +766,7 @@ int __must_check __sta_info_destroy(stru 
     998        struct ieee80211_local *local; 
     999        struct ieee80211_sub_if_data *sdata; 
     1000        int ret, i; 
     1001+       bool have_key = false; 
     1002  
     1003        might_sleep(); 
     1004  
     1005@@ -793,12 +794,19 @@ int __must_check __sta_info_destroy(stru 
     1006        list_del_rcu(&sta->list); 
     1007  
     1008        mutex_lock(&local->key_mtx); 
     1009-       for (i = 0; i < NUM_DEFAULT_KEYS; i++) 
     1010+       for (i = 0; i < NUM_DEFAULT_KEYS; i++) { 
     1011                __ieee80211_key_free(key_mtx_dereference(local, sta->gtk[i])); 
     1012-       if (sta->ptk) 
     1013+               have_key = true; 
     1014+       } 
     1015+       if (sta->ptk) { 
     1016                __ieee80211_key_free(key_mtx_dereference(local, sta->ptk)); 
     1017+               have_key = true; 
     1018+       } 
     1019        mutex_unlock(&local->key_mtx); 
     1020  
     1021+       if (!have_key) 
     1022+               synchronize_net(); 
     1023+ 
     1024        sta->dead = true; 
     1025  
     1026        local->num_sta--; 
     1027--- a/net/mac80211/chan.c 
     1028+++ b/net/mac80211/chan.c 
     1029@@ -63,6 +63,7 @@ ieee80211_new_chanctx(struct ieee80211_l 
     1030                      enum ieee80211_chanctx_mode mode) 
     1031 { 
     1032        struct ieee80211_chanctx *ctx; 
     1033+       u32 changed; 
     1034        int err; 
     1035  
     1036        lockdep_assert_held(&local->chanctx_mtx); 
     1037@@ -76,6 +77,13 @@ ieee80211_new_chanctx(struct ieee80211_l 
     1038        ctx->conf.rx_chains_dynamic = 1; 
     1039        ctx->mode = mode; 
     1040  
     1041+       /* acquire mutex to prevent idle from changing */ 
     1042+       mutex_lock(&local->mtx); 
     1043+       /* turn idle off *before* setting channel -- some drivers need that */ 
     1044+       changed = ieee80211_idle_off(local); 
     1045+       if (changed) 
     1046+               ieee80211_hw_config(local, changed); 
     1047+ 
     1048        if (!local->use_chanctx) { 
     1049                local->_oper_channel_type = 
     1050                        cfg80211_get_chandef_type(chandef); 
     1051@@ -85,14 +93,17 @@ ieee80211_new_chanctx(struct ieee80211_l 
     1052                err = drv_add_chanctx(local, ctx); 
     1053                if (err) { 
     1054                        kfree(ctx); 
     1055-                       return ERR_PTR(err); 
     1056+                       ctx = ERR_PTR(err); 
     1057+ 
     1058+                       ieee80211_recalc_idle(local); 
     1059+                       goto out; 
     1060                } 
     1061        } 
     1062  
     1063+       /* and keep the mutex held until the new chanctx is on the list */ 
     1064        list_add_rcu(&ctx->list, &local->chanctx_list); 
     1065  
     1066-       mutex_lock(&local->mtx); 
     1067-       ieee80211_recalc_idle(local); 
     1068+ out: 
     1069        mutex_unlock(&local->mtx); 
     1070  
     1071        return ctx; 
     1072--- a/net/mac80211/ieee80211_i.h 
     1073+++ b/net/mac80211/ieee80211_i.h 
     1074@@ -1366,6 +1366,7 @@ int ieee80211_if_change_type(struct ieee 
     1075                             enum nl80211_iftype type); 
     1076 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata); 
     1077 void ieee80211_remove_interfaces(struct ieee80211_local *local); 
     1078+u32 ieee80211_idle_off(struct ieee80211_local *local); 
     1079 void ieee80211_recalc_idle(struct ieee80211_local *local); 
     1080 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, 
     1081                                    const int offset); 
     1082--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c 
     1083+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c 
     1084@@ -799,7 +799,7 @@ static int ath9k_init_firmware_version(s 
     1085         * required version. 
     1086         */ 
     1087        if (priv->fw_version_major != MAJOR_VERSION_REQ || 
     1088-           priv->fw_version_minor != MINOR_VERSION_REQ) { 
     1089+           priv->fw_version_minor < MINOR_VERSION_REQ) { 
     1090                dev_err(priv->dev, "ath9k_htc: Please upgrade to FW version %d.%d\n", 
     1091                        MAJOR_VERSION_REQ, MINOR_VERSION_REQ); 
     1092                return -EINVAL; 
     1093--- a/drivers/net/wireless/ath/ath9k/xmit.c 
     1094+++ b/drivers/net/wireless/ath/ath9k/xmit.c 
     1095@@ -516,8 +516,7 @@ static void ath_tx_complete_aggr(struct  
     1096                 * not a holding desc. 
     1097                 */ 
     1098                INIT_LIST_HEAD(&bf_head); 
     1099-               if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) || 
     1100-                   bf_next != NULL || !bf_last->bf_stale) 
     1101+               if (bf_next != NULL || !bf_last->bf_stale) 
     1102                        list_move_tail(&bf->list, &bf_head); 
     1103  
     1104                if (!txpending || (tid->state & AGGR_CLEANUP)) { 
     1105@@ -537,8 +536,7 @@ static void ath_tx_complete_aggr(struct  
     1106                                !txfail); 
     1107                } else { 
     1108                        /* retry the un-acked ones */ 
     1109-                       if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) && 
     1110-                           bf->bf_next == NULL && bf_last->bf_stale) { 
     1111+                       if (bf->bf_next == NULL && bf_last->bf_stale) { 
     1112                                struct ath_buf *tbf; 
     1113  
     1114                                tbf = ath_clone_txbuf(sc, bf_last); 
     1115@@ -2264,6 +2262,7 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1116        struct ath_txq *txq; 
     1117        struct ath_buf *bf, *lastbf; 
     1118        struct list_head bf_head; 
     1119+       struct list_head *fifo_list; 
     1120        int status; 
     1121  
     1122        for (;;) { 
     1123@@ -2291,20 +2290,24 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1124  
     1125                TX_STAT_INC(txq->axq_qnum, txprocdesc); 
     1126  
     1127-               if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) { 
     1128+               fifo_list = &txq->txq_fifo[txq->txq_tailidx]; 
     1129+               if (list_empty(fifo_list)) { 
     1130                        ath_txq_unlock(sc, txq); 
     1131                        return; 
     1132                } 
     1133  
     1134-               bf = list_first_entry(&txq->txq_fifo[txq->txq_tailidx], 
     1135-                                     struct ath_buf, list); 
     1136+               bf = list_first_entry(fifo_list, struct ath_buf, list); 
     1137+               if (bf->bf_stale) { 
     1138+                       list_del(&bf->list); 
     1139+                       ath_tx_return_buffer(sc, bf); 
     1140+                       bf = list_first_entry(fifo_list, struct ath_buf, list); 
     1141+               } 
     1142+ 
     1143                lastbf = bf->bf_lastbf; 
     1144  
     1145                INIT_LIST_HEAD(&bf_head); 
     1146-               list_cut_position(&bf_head, &txq->txq_fifo[txq->txq_tailidx], 
     1147-                                 &lastbf->list); 
     1148- 
     1149-               if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) { 
     1150+               if (list_is_last(&lastbf->list, fifo_list)) { 
     1151+                       list_splice_tail_init(fifo_list, &bf_head); 
     1152                        INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH); 
     1153  
     1154                        if (!list_empty(&txq->axq_q)) { 
     1155@@ -2315,6 +2318,11 @@ void ath_tx_edma_tasklet(struct ath_soft 
     1156                                list_splice_tail_init(&txq->axq_q, &bf_q); 
     1157                                ath_tx_txqaddbuf(sc, txq, &bf_q, true); 
     1158                        } 
     1159+               } else { 
     1160+                       lastbf->bf_stale = true; 
     1161+                       if (bf != lastbf) 
     1162+                               list_cut_position(&bf_head, fifo_list, 
     1163+                                                 lastbf->list.prev); 
     1164                } 
     1165  
     1166                ath_tx_process_buffer(sc, txq, &ts, bf, &bf_head); 
     1167--- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h 
     1168+++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h 
     1169@@ -519,7 +519,7 @@ static const u32 ar9580_1p0_mac_core[][2 
     1170        {0x00008258, 0x00000000}, 
     1171        {0x0000825c, 0x40000000}, 
     1172        {0x00008260, 0x00080922}, 
     1173-       {0x00008264, 0x9bc00010}, 
     1174+       {0x00008264, 0x9d400010}, 
     1175        {0x00008268, 0xffffffff}, 
     1176        {0x0000826c, 0x0000ffff}, 
     1177        {0x00008270, 0x00000000}, 
     1178--- a/net/mac80211/mlme.c 
     1179+++ b/net/mac80211/mlme.c 
     1180@@ -3955,8 +3955,16 @@ int ieee80211_mgd_auth(struct ieee80211_ 
     1181        /* prep auth_data so we don't go into idle on disassoc */ 
     1182        ifmgd->auth_data = auth_data; 
     1183  
     1184-       if (ifmgd->associated) 
     1185-               ieee80211_set_disassoc(sdata, 0, 0, false, NULL); 
     1186+       if (ifmgd->associated) { 
     1187+               u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; 
     1188+ 
     1189+               ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, 
     1190+                                      WLAN_REASON_UNSPECIFIED, 
     1191+                                      false, frame_buf); 
     1192+ 
     1193+               __cfg80211_send_deauth(sdata->dev, frame_buf, 
     1194+                                      sizeof(frame_buf)); 
     1195+       } 
     1196  
     1197        sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); 
     1198  
     1199@@ -4016,8 +4024,16 @@ int ieee80211_mgd_assoc(struct ieee80211 
     1200  
     1201        mutex_lock(&ifmgd->mtx); 
     1202  
     1203-       if (ifmgd->associated) 
     1204-               ieee80211_set_disassoc(sdata, 0, 0, false, NULL); 
     1205+       if (ifmgd->associated) { 
     1206+               u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; 
     1207+ 
     1208+               ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, 
     1209+                                      WLAN_REASON_UNSPECIFIED, 
     1210+                                      false, frame_buf); 
     1211+ 
     1212+               __cfg80211_send_deauth(sdata->dev, frame_buf, 
     1213+                                      sizeof(frame_buf)); 
     1214+       } 
     1215  
     1216        if (ifmgd->auth_data && !ifmgd->auth_data->done) { 
     1217                err = -EBUSY; 
     1218--- a/net/mac80211/rc80211_minstrel.c 
     1219+++ b/net/mac80211/rc80211_minstrel.c 
     1220@@ -55,7 +55,6 @@ 
     1221 #include "rate.h" 
     1222 #include "rc80211_minstrel.h" 
     1223  
     1224-#define SAMPLE_COLUMNS 10 
     1225 #define SAMPLE_TBL(_mi, _idx, _col) \ 
     1226                _mi->sample_table[(_idx * SAMPLE_COLUMNS) + _col] 
     1227  
     1228@@ -70,16 +69,31 @@ rix_to_ndx(struct minstrel_sta_info *mi, 
     1229        return i; 
     1230 } 
     1231  
     1232+/* find & sort topmost throughput rates */ 
     1233+static inline void 
     1234+minstrel_sort_best_tp_rates(struct minstrel_sta_info *mi, int i, u8 *tp_list) 
     1235+{ 
     1236+       int j = MAX_THR_RATES; 
     1237+ 
     1238+       while (j > 0 && mi->r[i].cur_tp > mi->r[tp_list[j - 1]].cur_tp) 
     1239+               j--; 
     1240+       if (j < MAX_THR_RATES - 1) 
     1241+               memmove(&tp_list[j + 1], &tp_list[j], MAX_THR_RATES - (j + 1)); 
     1242+       if (j < MAX_THR_RATES) 
     1243+               tp_list[j] = i; 
     1244+} 
     1245+ 
     1246 static void 
     1247 minstrel_update_stats(struct minstrel_priv *mp, struct minstrel_sta_info *mi) 
     1248 { 
     1249-       u32 max_tp = 0, index_max_tp = 0, index_max_tp2 = 0; 
     1250-       u32 max_prob = 0, index_max_prob = 0; 
     1251+       u8 tmp_tp_rate[MAX_THR_RATES]; 
     1252+       u8 tmp_prob_rate = 0; 
     1253        u32 usecs; 
     1254-       u32 p; 
     1255        int i; 
     1256  
     1257-       mi->stats_update = jiffies; 
     1258+       for (i=0; i < MAX_THR_RATES; i++) 
     1259+           tmp_tp_rate[i] = 0; 
     1260+ 
     1261        for (i = 0; i < mi->n_rates; i++) { 
     1262                struct minstrel_rate *mr = &mi->r[i]; 
     1263  
     1264@@ -87,27 +101,32 @@ minstrel_update_stats(struct minstrel_pr 
     1265                if (!usecs) 
     1266                        usecs = 1000000; 
     1267  
     1268-               /* To avoid rounding issues, probabilities scale from 0 (0%) 
     1269-                * to 18000 (100%) */ 
     1270-               if (mr->attempts) { 
     1271-                       p = (mr->success * 18000) / mr->attempts; 
     1272+               if (unlikely(mr->attempts > 0)) { 
     1273+                       mr->sample_skipped = 0; 
     1274+                       mr->cur_prob = MINSTREL_FRAC(mr->success, mr->attempts); 
     1275                        mr->succ_hist += mr->success; 
     1276                        mr->att_hist += mr->attempts; 
     1277-                       mr->cur_prob = p; 
     1278-                       p = ((p * (100 - mp->ewma_level)) + (mr->probability * 
     1279-                               mp->ewma_level)) / 100; 
     1280-                       mr->probability = p; 
     1281-                       mr->cur_tp = p * (1000000 / usecs); 
     1282-               } 
     1283+                       mr->probability = minstrel_ewma(mr->probability, 
     1284+                                                       mr->cur_prob, 
     1285+                                                       EWMA_LEVEL); 
     1286+               } else 
     1287+                       mr->sample_skipped++; 
     1288  
     1289                mr->last_success = mr->success; 
     1290                mr->last_attempts = mr->attempts; 
     1291                mr->success = 0; 
     1292                mr->attempts = 0; 
     1293  
     1294+               /* Update throughput per rate, reset thr. below 10% success */ 
     1295+               if (mr->probability < MINSTREL_FRAC(10, 100)) 
     1296+                       mr->cur_tp = 0; 
     1297+               else 
     1298+                       mr->cur_tp = mr->probability * (1000000 / usecs); 
     1299+ 
     1300                /* Sample less often below the 10% chance of success. 
     1301                 * Sample less often above the 95% chance of success. */ 
     1302-               if ((mr->probability > 17100) || (mr->probability < 1800)) { 
     1303+               if (mr->probability > MINSTREL_FRAC(95, 100) || 
     1304+                   mr->probability < MINSTREL_FRAC(10, 100)) { 
     1305                        mr->adjusted_retry_count = mr->retry_count >> 1; 
     1306                        if (mr->adjusted_retry_count > 2) 
     1307                                mr->adjusted_retry_count = 2; 
     1308@@ -118,35 +137,30 @@ minstrel_update_stats(struct minstrel_pr 
     1309                } 
     1310                if (!mr->adjusted_retry_count) 
     1311                        mr->adjusted_retry_count = 2; 
     1312-       } 
     1313  
     1314-       for (i = 0; i < mi->n_rates; i++) { 
     1315-               struct minstrel_rate *mr = &mi->r[i]; 
     1316-               if (max_tp < mr->cur_tp) { 
     1317-                       index_max_tp = i; 
     1318-                       max_tp = mr->cur_tp; 
     1319-               } 
     1320-               if (max_prob < mr->probability) { 
     1321-                       index_max_prob = i; 
     1322-                       max_prob = mr->probability; 
     1323+               minstrel_sort_best_tp_rates(mi, i, tmp_tp_rate); 
     1324+ 
     1325+               /* To determine the most robust rate (max_prob_rate) used at 
     1326+                * 3rd mmr stage we distinct between two cases: 
     1327+                * (1) if any success probabilitiy >= 95%, out of those rates 
     1328+                * choose the maximum throughput rate as max_prob_rate 
     1329+                * (2) if all success probabilities < 95%, the rate with 
     1330+                * highest success probability is choosen as max_prob_rate */ 
     1331+               if (mr->probability >= MINSTREL_FRAC(95,100)) { 
     1332+                       if (mr->cur_tp >= mi->r[tmp_prob_rate].cur_tp) 
     1333+                               tmp_prob_rate = i; 
     1334+               } else { 
     1335+                       if (mr->probability >= mi->r[tmp_prob_rate].probability) 
     1336+                               tmp_prob_rate = i; 
     1337                } 
     1338        } 
     1339  
     1340-       max_tp = 0; 
     1341-       for (i = 0; i < mi->n_rates; i++) { 
     1342-               struct minstrel_rate *mr = &mi->r[i]; 
     1343- 
     1344-               if (i == index_max_tp) 
     1345-                       continue; 
     1346+       /* Assign the new rate set */ 
     1347+       memcpy(mi->max_tp_rate, tmp_tp_rate, sizeof(mi->max_tp_rate)); 
     1348+       mi->max_prob_rate = tmp_prob_rate; 
     1349  
     1350-               if (max_tp < mr->cur_tp) { 
     1351-                       index_max_tp2 = i; 
     1352-                       max_tp = mr->cur_tp; 
     1353-               } 
     1354-       } 
     1355-       mi->max_tp_rate = index_max_tp; 
     1356-       mi->max_tp_rate2 = index_max_tp2; 
     1357-       mi->max_prob_rate = index_max_prob; 
     1358+       /* Reset update timer */ 
     1359+       mi->stats_update = jiffies; 
     1360 } 
     1361  
     1362 static void 
     1363@@ -207,10 +221,10 @@ static int 
     1364 minstrel_get_next_sample(struct minstrel_sta_info *mi) 
     1365 { 
     1366        unsigned int sample_ndx; 
     1367-       sample_ndx = SAMPLE_TBL(mi, mi->sample_idx, mi->sample_column); 
     1368-       mi->sample_idx++; 
     1369-       if ((int) mi->sample_idx > (mi->n_rates - 2)) { 
     1370-               mi->sample_idx = 0; 
     1371+       sample_ndx = SAMPLE_TBL(mi, mi->sample_row, mi->sample_column); 
     1372+       mi->sample_row++; 
     1373+       if ((int) mi->sample_row >= mi->n_rates) { 
     1374+               mi->sample_row = 0; 
     1375                mi->sample_column++; 
     1376                if (mi->sample_column >= SAMPLE_COLUMNS) 
     1377                        mi->sample_column = 0; 
     1378@@ -228,31 +242,37 @@ minstrel_get_rate(void *priv, struct iee 
     1379        struct minstrel_priv *mp = priv; 
     1380        struct ieee80211_tx_rate *ar = info->control.rates; 
     1381        unsigned int ndx, sample_ndx = 0; 
     1382-       bool mrr; 
     1383-       bool sample_slower = false; 
     1384-       bool sample = false; 
     1385+       bool mrr_capable; 
     1386+       bool indirect_rate_sampling = false; 
     1387+       bool rate_sampling = false; 
     1388        int i, delta; 
     1389        int mrr_ndx[3]; 
     1390-       int sample_rate; 
     1391+       int sampling_ratio; 
     1392  
     1393+       /* management/no-ack frames do not use rate control */ 
     1394        if (rate_control_send_low(sta, priv_sta, txrc)) 
     1395                return; 
     1396  
     1397-       mrr = mp->has_mrr && !txrc->rts && !txrc->bss_conf->use_cts_prot; 
     1398- 
     1399-       ndx = mi->max_tp_rate; 
     1400- 
     1401-       if (mrr) 
     1402-               sample_rate = mp->lookaround_rate_mrr; 
     1403+       /* check multi-rate-retry capabilities & adjust lookaround_rate */ 
     1404+       mrr_capable = mp->has_mrr && 
     1405+                     !txrc->rts && 
     1406+                     !txrc->bss_conf->use_cts_prot; 
     1407+       if (mrr_capable) 
     1408+               sampling_ratio = mp->lookaround_rate_mrr; 
     1409        else 
     1410-               sample_rate = mp->lookaround_rate; 
     1411+               sampling_ratio = mp->lookaround_rate; 
     1412+ 
     1413+       /* init rateindex [ndx] with max throughput rate */ 
     1414+       ndx = mi->max_tp_rate[0]; 
     1415  
     1416+       /* increase sum packet counter */ 
     1417        mi->packet_count++; 
     1418-       delta = (mi->packet_count * sample_rate / 100) - 
     1419+ 
     1420+       delta = (mi->packet_count * sampling_ratio / 100) - 
     1421                        (mi->sample_count + mi->sample_deferred / 2); 
     1422  
     1423        /* delta > 0: sampling required */ 
     1424-       if ((delta > 0) && (mrr || !mi->prev_sample)) { 
     1425+       if ((delta > 0) && (mrr_capable || !mi->prev_sample)) { 
     1426                struct minstrel_rate *msr; 
     1427                if (mi->packet_count >= 10000) { 
     1428                        mi->sample_deferred = 0; 
     1429@@ -271,21 +291,28 @@ minstrel_get_rate(void *priv, struct iee 
     1430                        mi->sample_count += (delta - mi->n_rates * 2); 
     1431                } 
     1432  
     1433+               /* get next random rate sample */ 
     1434                sample_ndx = minstrel_get_next_sample(mi); 
     1435                msr = &mi->r[sample_ndx]; 
     1436-               sample = true; 
     1437-               sample_slower = mrr && (msr->perfect_tx_time > 
     1438-                       mi->r[ndx].perfect_tx_time); 
     1439+               rate_sampling = true; 
     1440  
     1441-               if (!sample_slower) { 
     1442+               /* Decide if direct ( 1st mrr stage) or indirect (2nd mrr stage) 
     1443+                * rate sampling method should be used. 
     1444+                * Respect such rates that are not sampled for 20 interations. 
     1445+                */ 
     1446+               if (mrr_capable && 
     1447+                   msr->perfect_tx_time > mi->r[ndx].perfect_tx_time && 
     1448+                   msr->sample_skipped < 20) 
     1449+                               indirect_rate_sampling = true; 
     1450+ 
     1451+               if (!indirect_rate_sampling) { 
     1452                        if (msr->sample_limit != 0) { 
     1453                                ndx = sample_ndx; 
     1454                                mi->sample_count++; 
     1455                                if (msr->sample_limit > 0) 
     1456                                        msr->sample_limit--; 
     1457-                       } else { 
     1458-                               sample = false; 
     1459-                       } 
     1460+                       } else 
     1461+                               rate_sampling = false; 
     1462                } else { 
     1463                        /* Only use IEEE80211_TX_CTL_RATE_CTRL_PROBE to mark 
     1464                         * packets that have the sampling rate deferred to the 
     1465@@ -297,34 +324,39 @@ minstrel_get_rate(void *priv, struct iee 
     1466                        mi->sample_deferred++; 
     1467                } 
     1468        } 
     1469-       mi->prev_sample = sample; 
     1470+       mi->prev_sample = rate_sampling; 
     1471  
     1472        /* If we're not using MRR and the sampling rate already 
     1473         * has a probability of >95%, we shouldn't be attempting 
     1474         * to use it, as this only wastes precious airtime */ 
     1475-       if (!mrr && sample && (mi->r[ndx].probability > 17100)) 
     1476-               ndx = mi->max_tp_rate; 
     1477+       if (!mrr_capable && rate_sampling && 
     1478+          (mi->r[ndx].probability > MINSTREL_FRAC(95, 100))) 
     1479+               ndx = mi->max_tp_rate[0]; 
     1480  
     1481+       /* mrr setup for 1st stage */ 
     1482        ar[0].idx = mi->r[ndx].rix; 
     1483        ar[0].count = minstrel_get_retry_count(&mi->r[ndx], info); 
     1484  
     1485-       if (!mrr) { 
     1486-               if (!sample) 
     1487+       /* non mrr setup for 2nd stage */ 
     1488+       if (!mrr_capable) { 
     1489+               if (!rate_sampling) 
     1490                        ar[0].count = mp->max_retry; 
     1491                ar[1].idx = mi->lowest_rix; 
     1492                ar[1].count = mp->max_retry; 
     1493                return; 
     1494        } 
     1495  
     1496-       /* MRR setup */ 
     1497-       if (sample) { 
     1498-               if (sample_slower) 
     1499+       /* mrr setup for 2nd stage */ 
     1500+       if (rate_sampling) { 
     1501+               if (indirect_rate_sampling) 
     1502                        mrr_ndx[0] = sample_ndx; 
     1503                else 
     1504-                       mrr_ndx[0] = mi->max_tp_rate; 
     1505+                       mrr_ndx[0] = mi->max_tp_rate[0]; 
     1506        } else { 
     1507-               mrr_ndx[0] = mi->max_tp_rate2; 
     1508+               mrr_ndx[0] = mi->max_tp_rate[1]; 
     1509        } 
     1510+ 
     1511+       /* mrr setup for 3rd & 4th stage */ 
     1512        mrr_ndx[1] = mi->max_prob_rate; 
     1513        mrr_ndx[2] = 0; 
     1514        for (i = 1; i < 4; i++) { 
     1515@@ -351,26 +383,21 @@ static void 
     1516 init_sample_table(struct minstrel_sta_info *mi) 
     1517 { 
     1518        unsigned int i, col, new_idx; 
     1519-       unsigned int n_srates = mi->n_rates - 1; 
     1520        u8 rnd[8]; 
     1521  
     1522        mi->sample_column = 0; 
     1523-       mi->sample_idx = 0; 
     1524-       memset(mi->sample_table, 0, SAMPLE_COLUMNS * mi->n_rates); 
     1525+       mi->sample_row = 0; 
     1526+       memset(mi->sample_table, 0xff, SAMPLE_COLUMNS * mi->n_rates); 
     1527  
     1528        for (col = 0; col < SAMPLE_COLUMNS; col++) { 
     1529-               for (i = 0; i < n_srates; i++) { 
     1530+               for (i = 0; i < mi->n_rates; i++) { 
     1531                        get_random_bytes(rnd, sizeof(rnd)); 
     1532-                       new_idx = (i + rnd[i & 7]) % n_srates; 
     1533+                       new_idx = (i + rnd[i & 7]) % mi->n_rates; 
     1534  
     1535-                       while (SAMPLE_TBL(mi, new_idx, col) != 0) 
     1536-                               new_idx = (new_idx + 1) % n_srates; 
     1537+                       while (SAMPLE_TBL(mi, new_idx, col) != 0xff) 
     1538+                               new_idx = (new_idx + 1) % mi->n_rates; 
     1539  
     1540-                       /* Don't sample the slowest rate (i.e. slowest base 
     1541-                        * rate). We must presume that the slowest rate works 
     1542-                        * fine, or else other management frames will also be 
     1543-                        * failing and the link will break */ 
     1544-                       SAMPLE_TBL(mi, new_idx, col) = i + 1; 
     1545+                       SAMPLE_TBL(mi, new_idx, col) = i; 
     1546                } 
     1547        } 
     1548 } 
     1549@@ -542,9 +569,6 @@ minstrel_alloc(struct ieee80211_hw *hw,  
     1550        mp->lookaround_rate = 5; 
     1551        mp->lookaround_rate_mrr = 10; 
     1552  
     1553-       /* moving average weight for EWMA */ 
     1554-       mp->ewma_level = 75; 
     1555- 
     1556        /* maximum time that the hw is allowed to stay in one MRR segment */ 
     1557        mp->segment_size = 6000; 
     1558  
     1559--- a/net/mac80211/rc80211_minstrel.h 
     1560+++ b/net/mac80211/rc80211_minstrel.h 
     1561@@ -9,6 +9,28 @@ 
     1562 #ifndef __RC_MINSTREL_H 
     1563 #define __RC_MINSTREL_H 
     1564  
     1565+#define EWMA_LEVEL     75      /* ewma weighting factor [%] */ 
     1566+#define SAMPLE_COLUMNS 10      /* number of columns in sample table */ 
     1567+ 
     1568+ 
     1569+/* scaled fraction values */ 
     1570+#define MINSTREL_SCALE  16 
     1571+#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div) 
     1572+#define MINSTREL_TRUNC(val) ((val) >> MINSTREL_SCALE) 
     1573+ 
     1574+/* number of highest throughput rates to consider*/ 
     1575+#define MAX_THR_RATES 4 
     1576+ 
     1577+/* 
     1578+ * Perform EWMA (Exponentially Weighted Moving Average) calculation 
     1579+  */ 
     1580+static inline int 
     1581+minstrel_ewma(int old, int new, int weight) 
     1582+{ 
     1583+       return (new * (100 - weight) + old * weight) / 100; 
     1584+} 
     1585+ 
     1586+ 
     1587 struct minstrel_rate { 
     1588        int bitrate; 
     1589        int rix; 
     1590@@ -26,6 +48,7 @@ struct minstrel_rate { 
     1591        u32 attempts; 
     1592        u32 last_attempts; 
     1593        u32 last_success; 
     1594+       u8 sample_skipped; 
     1595  
     1596        /* parts per thousand */ 
     1597        u32 cur_prob; 
     1598@@ -45,14 +68,13 @@ struct minstrel_sta_info { 
     1599  
     1600        unsigned int lowest_rix; 
     1601  
     1602-       unsigned int max_tp_rate; 
     1603-       unsigned int max_tp_rate2; 
     1604-       unsigned int max_prob_rate; 
     1605+       u8 max_tp_rate[MAX_THR_RATES]; 
     1606+       u8 max_prob_rate; 
     1607        unsigned int packet_count; 
     1608        unsigned int sample_count; 
     1609        int sample_deferred; 
     1610  
     1611-       unsigned int sample_idx; 
     1612+       unsigned int sample_row; 
     1613        unsigned int sample_column; 
     1614  
     1615        int n_rates; 
     1616@@ -73,7 +95,6 @@ struct minstrel_priv { 
     1617        unsigned int cw_min; 
     1618        unsigned int cw_max; 
     1619        unsigned int max_retry; 
     1620-       unsigned int ewma_level; 
     1621        unsigned int segment_size; 
     1622        unsigned int update_interval; 
     1623        unsigned int lookaround_rate; 
     1624--- a/net/mac80211/rc80211_minstrel_debugfs.c 
     1625+++ b/net/mac80211/rc80211_minstrel_debugfs.c 
     1626@@ -73,15 +73,17 @@ minstrel_stats_open(struct inode *inode, 
     1627        for (i = 0; i < mi->n_rates; i++) { 
     1628                struct minstrel_rate *mr = &mi->r[i]; 
     1629  
     1630-               *(p++) = (i == mi->max_tp_rate) ? 'T' : ' '; 
     1631-               *(p++) = (i == mi->max_tp_rate2) ? 't' : ' '; 
     1632+               *(p++) = (i == mi->max_tp_rate[0]) ? 'A' : ' '; 
     1633+               *(p++) = (i == mi->max_tp_rate[1]) ? 'B' : ' '; 
     1634+               *(p++) = (i == mi->max_tp_rate[2]) ? 'C' : ' '; 
     1635+               *(p++) = (i == mi->max_tp_rate[3]) ? 'D' : ' '; 
     1636                *(p++) = (i == mi->max_prob_rate) ? 'P' : ' '; 
     1637                p += sprintf(p, "%3u%s", mr->bitrate / 2, 
     1638                                (mr->bitrate & 1 ? ".5" : "  ")); 
     1639  
     1640-               tp = mr->cur_tp / ((18000 << 10) / 96); 
     1641-               prob = mr->cur_prob / 18; 
     1642-               eprob = mr->probability / 18; 
     1643+               tp = MINSTREL_TRUNC(mr->cur_tp / 10); 
     1644+               prob = MINSTREL_TRUNC(mr->cur_prob * 1000); 
     1645+               eprob = MINSTREL_TRUNC(mr->probability * 1000); 
     1646  
     1647                p += sprintf(p, "  %6u.%1u   %6u.%1u   %6u.%1u        " 
     1648                                "%3u(%3u)   %8llu    %8llu\n", 
     1649--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
     1650+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
     1651@@ -657,11 +657,10 @@ enum sc_op_flags { 
     1652 struct ath_rate_table; 
     1653  
     1654 struct ath9k_vif_iter_data { 
     1655-       const u8 *hw_macaddr; /* phy's hardware address, set 
     1656-                              * before starting iteration for 
     1657-                              * valid bssid mask. 
     1658-                              */ 
     1659+       u8 hw_macaddr[ETH_ALEN]; /* address of the first vif */ 
     1660        u8 mask[ETH_ALEN]; /* bssid mask */ 
     1661+       bool has_hw_macaddr; 
     1662+ 
     1663        int naps;      /* number of AP vifs */ 
     1664        int nmeshes;   /* number of mesh vifs */ 
     1665        int nstations; /* number of station vifs */ 
     1666--- a/drivers/net/wireless/ath/ath9k/main.c 
     1667+++ b/drivers/net/wireless/ath/ath9k/main.c 
     1668@@ -835,10 +835,14 @@ static void ath9k_vif_iter(void *data, u 
     1669        struct ath9k_vif_iter_data *iter_data = data; 
     1670        int i; 
     1671  
     1672-       if (iter_data->hw_macaddr) 
     1673+       if (iter_data->has_hw_macaddr) { 
     1674                for (i = 0; i < ETH_ALEN; i++) 
     1675                        iter_data->mask[i] &= 
     1676                                ~(iter_data->hw_macaddr[i] ^ mac[i]); 
     1677+       } else { 
     1678+               memcpy(iter_data->hw_macaddr, mac, ETH_ALEN); 
     1679+               iter_data->has_hw_macaddr = true; 
     1680+       } 
     1681  
     1682        switch (vif->type) { 
     1683        case NL80211_IFTYPE_AP: 
     1684@@ -887,7 +891,6 @@ void ath9k_calculate_iter_data(struct ie 
     1685         * together with the BSSID mask when matching addresses. 
     1686         */ 
     1687        memset(iter_data, 0, sizeof(*iter_data)); 
     1688-       iter_data->hw_macaddr = common->macaddr; 
     1689        memset(&iter_data->mask, 0xff, ETH_ALEN); 
     1690  
     1691        if (vif) 
     1692@@ -897,6 +900,8 @@ void ath9k_calculate_iter_data(struct ie 
     1693        ieee80211_iterate_active_interfaces_atomic( 
     1694                sc->hw, IEEE80211_IFACE_ITER_RESUME_ALL, 
     1695                ath9k_vif_iter, iter_data); 
     1696+ 
     1697+       memcpy(common->macaddr, iter_data->hw_macaddr, ETH_ALEN); 
     1698 } 
     1699  
     1700 /* Called with sc->mutex held. */ 
     1701@@ -1304,6 +1309,7 @@ static int ath9k_sta_add(struct ieee8021 
     1702        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     1703        struct ath_node *an = (struct ath_node *) sta->drv_priv; 
     1704        struct ieee80211_key_conf ps_key = { }; 
     1705+       int key; 
     1706  
     1707        ath_node_attach(sc, sta, vif); 
     1708  
     1709@@ -1311,7 +1317,9 @@ static int ath9k_sta_add(struct ieee8021 
     1710            vif->type != NL80211_IFTYPE_AP_VLAN) 
     1711                return 0; 
     1712  
     1713-       an->ps_key = ath_key_config(common, vif, sta, &ps_key); 
     1714+       key = ath_key_config(common, vif, sta, &ps_key); 
     1715+       if (key > 0) 
     1716+               an->ps_key = key; 
     1717  
     1718        return 0; 
     1719 } 
     1720@@ -1328,6 +1336,7 @@ static void ath9k_del_ps_key(struct ath_ 
     1721            return; 
     1722  
     1723        ath_key_delete(common, &ps_key); 
     1724+       an->ps_key = 0; 
     1725 } 
     1726  
     1727 static int ath9k_sta_remove(struct ieee80211_hw *hw, 
     1728--- a/drivers/net/wireless/ath/ath9k/reg.h 
     1729+++ b/drivers/net/wireless/ath/ath9k/reg.h 
     1730@@ -1493,9 +1493,6 @@ enum { 
     1731 #define AR9271_RADIO_RF_RST                    0x20 
     1732 #define AR9271_GATE_MAC_CTL                    0x4000 
     1733  
     1734-#define AR_STA_ID0                 0x8000 
     1735-#define AR_STA_ID1                 0x8004 
     1736-#define AR_STA_ID1_SADH_MASK       0x0000FFFF 
     1737 #define AR_STA_ID1_STA_AP          0x00010000 
     1738 #define AR_STA_ID1_ADHOC           0x00020000 
     1739 #define AR_STA_ID1_PWR_SAV         0x00040000 
     1740--- a/drivers/net/wireless/ath/hw.c 
     1741+++ b/drivers/net/wireless/ath/hw.c 
     1742@@ -118,6 +118,12 @@ 
     1743 void ath_hw_setbssidmask(struct ath_common *common) 
     1744 { 
     1745        void *ah = common->ah; 
     1746+       u32 id1; 
     1747+ 
     1748+       REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr)); 
     1749+       id1 = REG_READ(ah, AR_STA_ID1) & ~AR_STA_ID1_SADH_MASK; 
     1750+       id1 |= get_unaligned_le16(common->macaddr + 4); 
     1751+       REG_WRITE(ah, AR_STA_ID1, id1); 
     1752  
     1753        REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(common->bssidmask)); 
     1754        REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(common->bssidmask + 4)); 
     1755--- a/drivers/net/wireless/ath/reg.h 
     1756+++ b/drivers/net/wireless/ath/reg.h 
     1757@@ -23,6 +23,10 @@ 
     1758 #define AR_MIBC_CMC            0x00000004 
     1759 #define AR_MIBC_MCS            0x00000008 
     1760  
     1761+#define AR_STA_ID0             0x8000 
     1762+#define AR_STA_ID1             0x8004 
     1763+#define AR_STA_ID1_SADH_MASK   0x0000ffff 
     1764+ 
     1765 /* 
     1766  * BSSID mask registers. See ath_hw_set_bssid_mask() 
     1767  * for detailed documentation about these registers. 
  • branches/attitude_adjustment/package/mac80211/patches/310-ap_scan.patch

    r33613 r36470  
    11--- a/net/mac80211/cfg.c 
    22+++ b/net/mac80211/cfg.c 
    3 @@ -1796,8 +1796,6 @@ static int ieee80211_scan(struct wiphy * 
    4                  * beaconing hasn't been configured yet 
     3@@ -2009,7 +2009,7 @@ static int ieee80211_scan(struct wiphy * 
     4                 * the  frames sent while scanning on other channel will be 
     5                 * lost) 
    56                 */ 
    6         case NL80211_IFTYPE_AP: 
    7 -               if (sdata->u.ap.beacon) 
    8 -                       return -EOPNOTSUPP; 
    9                 break; 
    10         default: 
    11                 return -EOPNOTSUPP; 
     7-               if (sdata->u.ap.beacon && 
     8+               if (0 && sdata->u.ap.beacon && 
     9                    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) || 
     10                     !(req->flags & NL80211_SCAN_FLAG_AP))) 
     11                        return -EOPNOTSUPP; 
  • branches/attitude_adjustment/package/mac80211/patches/400-ath_move_debug_code.patch

    r32760 r36470  
    11--- a/drivers/net/wireless/ath/Makefile 
    22+++ b/drivers/net/wireless/ath/Makefile 
    3 @@ -8,7 +8,7 @@ obj-$(CONFIG_ATH_COMMON)        += ath.o 
     3@@ -10,7 +10,7 @@ obj-$(CONFIG_ATH_COMMON)      += ath.o 
    44 ath-objs :=    main.o \ 
    55                regd.o \ 
     
    1313--- a/drivers/net/wireless/ath/ath.h 
    1414+++ b/drivers/net/wireless/ath/ath.h 
    15 @@ -280,13 +280,6 @@ void _ath_dbg(struct ath_common *common, 
     15@@ -281,13 +281,6 @@ void _ath_dbg(struct ath_common *common, 
    1616 #endif /* CONFIG_ATH_DEBUG */ 
    1717  
  • branches/attitude_adjustment/package/mac80211/patches/401-ath9k_blink_default.patch

    r32002 r36470  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -40,7 +40,7 @@ int ath9k_modparam_nohwcrypt; 
     3@@ -46,7 +46,7 @@ int ath9k_modparam_nohwcrypt; 
    44 module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444); 
    55 MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption"); 
  • branches/attitude_adjustment/package/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch

    r33583 r36470  
    99  
    1010 #include "hw.h" 
    11 @@ -523,8 +524,16 @@ static int ath9k_hw_init_macaddr(struct  
     11@@ -519,8 +520,16 @@ static int ath9k_hw_init_macaddr(struct  
    1212                common->macaddr[2 * i] = eeval >> 8; 
    1313                common->macaddr[2 * i + 1] = eeval & 0xff; 
  • branches/attitude_adjustment/package/mac80211/patches/403-ath_regd_optional.patch

    r32002 r36470  
    11--- a/drivers/net/wireless/ath/regd.c 
    22+++ b/drivers/net/wireless/ath/regd.c 
    3 @@ -200,6 +200,10 @@ ath_reg_apply_beaconing_flags(struct wip 
    4         u32 bandwidth = 0; 
    5         int r; 
     3@@ -198,6 +198,10 @@ ath_reg_apply_beaconing_flags(struct wip 
     4        struct ieee80211_channel *ch; 
     5        unsigned int i; 
    66  
    77+#ifdef ATH_USER_REGD 
     
    1212  
    1313                if (!wiphy->bands[band]) 
    14 @@ -259,6 +263,10 @@ ath_reg_apply_active_scan_flags(struct w 
    15         u32 bandwidth = 0; 
    16         int r; 
     14@@ -252,6 +256,10 @@ ath_reg_apply_active_scan_flags(struct w 
     15        struct ieee80211_channel *ch; 
     16        const struct ieee80211_reg_rule *reg_rule; 
    1717  
    1818+#ifdef ATH_USER_REGD 
     
    2323        if (!sband) 
    2424                return; 
    25 @@ -308,6 +316,10 @@ static void ath_reg_apply_radar_flags(st 
     25@@ -301,6 +309,10 @@ static void ath_reg_apply_radar_flags(st 
    2626        struct ieee80211_channel *ch; 
    2727        unsigned int i; 
     
    3434                return; 
    3535  
    36 @@ -514,6 +526,10 @@ ath_regd_init_wiphy(struct ath_regulator 
     36@@ -505,6 +517,10 @@ ath_regd_init_wiphy(struct ath_regulator 
    3737 { 
    3838        const struct ieee80211_regdomain *regd; 
  • branches/attitude_adjustment/package/mac80211/patches/405-regd_no_assoc_hints.patch

    r33398 r36470  
    11--- a/net/wireless/reg.c 
    22+++ b/net/wireless/reg.c 
    3 @@ -1796,6 +1796,8 @@ void regulatory_hint_11d(struct wiphy *w 
     3@@ -1730,6 +1730,8 @@ void regulatory_hint_11d(struct wiphy *w 
    44        enum environment_cap env = ENVIRON_ANY; 
    5         struct regulatory_request *request; 
     5        struct regulatory_request *request, *lr; 
    66  
    77+       return; 
    88+ 
    99        mutex_lock(&reg_mutex); 
     10        lr = get_last_request(); 
    1011  
    11         if (unlikely(!last_request)) 
    12 @@ -2030,6 +2032,8 @@ static void restore_regulatory_settings( 
     12@@ -1926,6 +1928,7 @@ static void restore_regulatory_settings( 
    1313  
    1414 void regulatory_hint_disconnect(void) 
    1515 { 
    1616+       return; 
    17 + 
    18         REG_DBG_PRINT("All devices are disconnected, going to " 
    19                       "restore regulatory settings\n"); 
     17        REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n"); 
    2018        restore_regulatory_settings(false); 
     19 } 
  • branches/attitude_adjustment/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

    r32760 r36470  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -667,6 +667,7 @@ static const struct ieee80211_iface_limi 
    4  #ifdef CONFIG_MAC80211_MESH 
    5                                  BIT(NL80211_IFTYPE_MESH_POINT) | 
     3@@ -727,6 +727,7 @@ static const struct ieee80211_iface_limi 
    64 #endif 
    7 +                                BIT(NL80211_IFTYPE_ADHOC) | 
    85                                 BIT(NL80211_IFTYPE_AP) | 
    96                                 BIT(NL80211_IFTYPE_P2P_GO) }, 
     7+       { .max = 1,     .types = BIT(NL80211_IFTYPE_ADHOC) }, 
    108 }; 
     9  
     10 static const struct ieee80211_iface_combination if_comb = { 
  • branches/attitude_adjustment/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch

    r33583 r36470  
    1919--- a/drivers/net/wireless/ath/ath5k/base.c 
    2020+++ b/drivers/net/wireless/ath/ath5k/base.c 
    21 @@ -1878,7 +1878,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
     21@@ -1868,7 +1868,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
    2222        } 
    2323  
     
    2828                u64 tsf = ath5k_hw_get_tsf64(ah); 
    2929                u32 tsftu = TSF_TO_TU(tsf); 
    30 @@ -1964,7 +1964,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
     30@@ -1954,7 +1954,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
    3131  
    3232        intval = ah->bintval & AR5K_BEACON_PERIOD; 
     
    3737                if (intval < 15) 
    3838                        ATH5K_WARN(ah, "intval %u is too low, min 15\n", 
    39 @@ -2427,6 +2427,7 @@ static const struct ieee80211_iface_limi 
    40  #ifdef CONFIG_MAC80211_MESH 
     39@@ -2418,6 +2418,7 @@ static const struct ieee80211_iface_limi 
    4140                                 BIT(NL80211_IFTYPE_MESH_POINT) | 
    4241 #endif 
    43 +                                BIT(NL80211_IFTYPE_ADHOC) | 
    4442                                 BIT(NL80211_IFTYPE_AP) }, 
     43+       { .max = 1,     .types = BIT(NL80211_IFTYPE_ADHOC) }, 
    4544 }; 
    4645  
     46 static const struct ieee80211_iface_combination if_comb = { 
  • branches/attitude_adjustment/package/mac80211/patches/420-ath5k_disable_fast_cc.patch

    r32002 r36470  
    11--- a/drivers/net/wireless/ath/ath5k/reset.c 
    22+++ b/drivers/net/wireless/ath/ath5k/reset.c 
    3 @@ -1156,6 +1156,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum 
     3@@ -1158,6 +1158,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum 
    44        tsf_lo = 0; 
    55        mode = 0; 
     
    99         * Sanity check for fast flag 
    1010         * Fast channel change only available 
    11 @@ -1163,6 +1164,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum 
     11@@ -1165,6 +1166,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum 
    1212         */ 
    1313        if (fast && (ah->ah_radio != AR5K_RF2413) && 
  • branches/attitude_adjustment/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch

    r35064 r36470  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1531,6 +1531,53 @@ static const struct file_operations fops 
    4   
    5  #endif 
     3@@ -2003,6 +2003,53 @@ void ath9k_get_et_stats(struct ieee80211 
     4        WARN_ON(i != ATH9K_SSTATS_LEN); 
     5 } 
    66  
    77+static ssize_t read_file_eeprom(struct file *file, char __user *user_buf, 
     
    5555 { 
    5656        struct ath_common *common = ath9k_hw_common(ah); 
    57 @@ -1602,5 +1649,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    58         debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR, 
    59                            sc->debug.debugfs_phy, &sc->sc_ah->gpio_val); 
     57@@ -2020,6 +2067,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     58  
     59        ath9k_dfs_init_debug(sc); 
    6060  
    6161+       debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
    6262+                           &fops_eeprom); 
    63 + 
    64         return 0; 
    65  } 
     63        debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc, 
     64                            &fops_dma); 
     65        debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc, 
  • branches/attitude_adjustment/package/mac80211/patches/501-ath9k-eeprom_endianess.patch

    r33331 r36470  
    11--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c 
    22+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c 
    3 @@ -266,7 +266,7 @@ static int ath9k_hw_def_check_eeprom(str 
     3@@ -262,7 +262,7 @@ static int ath9k_hw_def_check_eeprom(str 
    44 { 
    55        struct ar5416_eeprom_def *eep = &ah->eeprom.def; 
     
    1010        bool need_swap = false; 
    1111        int i, addr, size; 
    12 @@ -276,27 +276,16 @@ static int ath9k_hw_def_check_eeprom(str 
     12@@ -272,27 +272,16 @@ static int ath9k_hw_def_check_eeprom(str 
    1313                return false; 
    1414        } 
     
    5050--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c 
    5151+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c 
    52 @@ -195,7 +195,7 @@ static int ath9k_hw_4k_check_eeprom(stru 
    53         int i, addr; 
    54   
    55   
    56 -       if (!ath9k_hw_use_flash(ah)) { 
    57 +       if (!(ah->ah_flags & AH_NO_EEP_SWAP)) { 
    58                 if (!ath9k_hw_nvram_read(common, AR5416_EEPROM_MAGIC_OFFSET, 
    59                                          &magic)) { 
    60                         ath_err(common, "Reading Magic # failed\n"); 
    61 --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c 
    62 +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c 
    63 @@ -189,7 +189,7 @@ static int ath9k_hw_ar9287_check_eeprom( 
    64         struct ar9287_eeprom *eep = &ah->eeprom.map9287; 
     52@@ -57,7 +57,7 @@ static bool ath9k_hw_4k_fill_eeprom(stru 
     53 { 
    6554        struct ath_common *common = ath9k_hw_common(ah); 
    6655  
    6756-       if (!ath9k_hw_use_flash(ah)) { 
    6857+       if (!(ah->ah_flags & AH_NO_EEP_SWAP)) { 
    69                 if (!ath9k_hw_nvram_read(common, AR5416_EEPROM_MAGIC_OFFSET, 
    70                                          &magic)) { 
    71                         ath_err(common, "Reading Magic # failed\n"); 
     58                ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\n"); 
     59        } 
     60  
     61--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c 
     62+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c 
     63@@ -60,7 +60,7 @@ static bool ath9k_hw_ar9287_fill_eeprom( 
     64 { 
     65        struct ath_common *common = ath9k_hw_common(ah); 
     66  
     67-       if (!ath9k_hw_use_flash(ah)) { 
     68+       if (!(ah->ah_flags & AH_NO_EEP_SWAP)) { 
     69                ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\n"); 
     70        } 
     71  
    7272--- a/drivers/net/wireless/ath/ath9k/hw.h 
    7373+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    74 @@ -705,6 +705,7 @@ enum ath_cal_list { 
     74@@ -740,6 +740,7 @@ enum ath_cal_list { 
    7575 #define AH_USE_EEPROM   0x1 
    7676 #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */ 
     
    8282--- a/drivers/net/wireless/ath/ath9k/init.c 
    8383+++ b/drivers/net/wireless/ath/ath9k/init.c 
    84 @@ -537,6 +537,8 @@ static int ath9k_init_softc(u16 devid, s 
     84@@ -587,6 +587,8 @@ static int ath9k_init_softc(u16 devid, s 
    8585                ah->is_clk_25mhz = pdata->is_clk_25mhz; 
    8686                ah->get_mac_revision = pdata->get_mac_revision; 
  • branches/attitude_adjustment/package/mac80211/patches/502-ath9k_ahb_init.patch

    r32760 r36470  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -926,23 +926,23 @@ static int __init ath9k_init(void) 
     3@@ -965,23 +965,23 @@ static int __init ath9k_init(void) 
    44                goto err_out; 
    55        } 
  • branches/attitude_adjustment/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

    r35786 r36470  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -1951,8 +1951,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     3@@ -1946,8 +1946,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    44                REG_WRITE(ah, AR_OBS, 8); 
    55  
  • branches/attitude_adjustment/package/mac80211/patches/511-ath9k_reduce_rxbuf.patch

    r31322 r36470  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -122,7 +122,7 @@ void ath_descdma_cleanup(struct ath_soft 
     3@@ -119,7 +119,7 @@ int ath_descdma_setup(struct ath_softc * 
    44 /* RX / TX */ 
    55 /***********/ 
  • branches/attitude_adjustment/package/mac80211/patches/512-ath9k_channelbw_debugfs.patch

    r35153 r36470  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -656,6 +656,7 @@ struct ath_softc { 
     3@@ -689,6 +689,7 @@ struct ath_softc { 
    44        struct ieee80211_hw *hw; 
    55        struct device *dev; 
     
    99        struct survey_info survey[ATH9K_NUM_CHANNELS]; 
    1010  
    11 @@ -731,6 +732,7 @@ struct ath_softc { 
    12  #endif 
    13  }; 
     11@@ -893,6 +894,7 @@ struct fft_sample_ht20 { 
     12        u8 data[SPECTRAL_HT20_NUM_BINS]; 
     13 } __packed; 
    1414  
    1515+int ath9k_config(struct ieee80211_hw *hw, u32 changed); 
     
    1919--- a/drivers/net/wireless/ath/ath9k/debug.c 
    2020+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    21 @@ -1578,6 +1578,50 @@ static const struct file_operations fops 
     21@@ -2050,6 +2050,50 @@ static const struct file_operations fops 
    2222        .owner = THIS_MODULE 
    2323 }; 
     
    7070 { 
    7171        struct ath_common *common = ath9k_hw_common(ah); 
    72 @@ -1652,5 +1696,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     72@@ -2069,6 +2113,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     73  
    7374        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
    7475                            &fops_eeprom); 
    75   
    7676+       debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 
    7777+                           sc, &fops_chanbw); 
    78 + 
    79         return 0; 
    80  } 
     78        debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc, 
     79                            &fops_dma); 
     80        debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc, 
    8181--- a/drivers/net/wireless/ath/ath9k/main.c 
    8282+++ b/drivers/net/wireless/ath/ath9k/main.c 
    83 @@ -1120,7 +1120,7 @@ static void ath9k_disable_ps(struct ath_ 
    84         ath_dbg(common, PS, "PowerSave disabled\n"); 
     83@@ -1136,7 +1136,7 @@ int ath9k_spectral_scan_config(struct ie 
     84        return 0; 
    8585 } 
    8686  
     
    9090        struct ath_softc *sc = hw->priv; 
    9191        struct ath_hw *ah = sc->sc_ah; 
    92 @@ -1174,9 +1174,11 @@ static int ath9k_config(struct ieee80211 
     92@@ -1190,9 +1190,11 @@ static int ath9k_config(struct ieee80211 
    9393  
    9494        if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) { 
     
    102102                if (ah->curchan) 
    103103                        old_pos = ah->curchan - &ah->channels[0]; 
    104 @@ -1219,7 +1221,23 @@ static int ath9k_config(struct ieee80211 
     104@@ -1235,7 +1237,23 @@ static int ath9k_config(struct ieee80211 
    105105                        memset(&sc->survey[pos], 0, sizeof(struct survey_info)); 
    106106                } 
  • branches/attitude_adjustment/package/mac80211/patches/520-mac80211_cur_txpower.patch

    r33613 r36470  
    11--- a/include/net/mac80211.h 
    22+++ b/include/net/mac80211.h 
    3 @@ -1372,6 +1372,7 @@ struct ieee80211_hw { 
     3@@ -1554,6 +1554,7 @@ struct ieee80211_hw { 
    44        u8 max_tx_aggregation_subframes; 
    55        u8 offchannel_tx_hw_queue; 
    66        u8 radiotap_mcs_details; 
    77+       s8 cur_power_level; 
     8        u16 radiotap_vht_details; 
    89        netdev_features_t netdev_features; 
    910 }; 
    10   
    1111--- a/net/mac80211/cfg.c 
    1212+++ b/net/mac80211/cfg.c 
    13 @@ -1967,7 +1967,7 @@ static int ieee80211_get_tx_power(struct 
    14  { 
     13@@ -2190,7 +2190,9 @@ static int ieee80211_get_tx_power(struct 
    1514        struct ieee80211_local *local = wiphy_priv(wiphy); 
     15        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 
    1616  
    17 -       *dbm = local->hw.conf.power_level; 
    18 +       *dbm = local->hw.cur_power_level; 
    19   
    20         return 0; 
    21  } 
     17-       if (!local->use_chanctx) 
     18+       if (local->hw.cur_power_level) 
     19+               *dbm = local->hw.cur_power_level; 
     20+       else if (!local->use_chanctx) 
     21                *dbm = local->hw.conf.power_level; 
     22        else