Changeset 28138 for branches/backfire


Ignore:
Timestamp:
2011-08-31T11:44:02+02:00 (5 years ago)
Author:
nbd
Message:

mac80211: backport latest version from trunk (as of r28137)

Location:
branches/backfire/package
Files:
22 added
17 deleted
38 edited
2 moved

Legend:

Unmodified
Added
Removed
  • branches/backfire/package/hostapd/files/hostapd.sh

    r27031 r28138  
    193193} 
    194194 
     195hostapd_set_log_options() { 
     196        local var="$1" 
     197        local cfg="$2" 
     198        local log_level log_80211 log_8021x log_radius log_wpa log_driver log_iapp log_mlme 
     199 
     200        config_get log_level "$cfg" log_level 2 
     201 
     202        config_get_bool log_80211  "$cfg" log_80211  1 
     203        config_get_bool log_8021x  "$cfg" log_8021x  1 
     204        config_get_bool log_radius "$cfg" log_radius 1 
     205        config_get_bool log_wpa    "$cfg" log_wpa    1 
     206        config_get_bool log_driver "$cfg" log_driver 1 
     207        config_get_bool log_iapp   "$cfg" log_iapp   1 
     208        config_get_bool log_mlme   "$cfg" log_mlme   1 
     209 
     210        local log_mask=$((       \ 
     211                ($log_80211  << 0) | \ 
     212                ($log_8021x  << 1) | \ 
     213                ($log_radius << 2) | \ 
     214                ($log_wpa    << 3) | \ 
     215                ($log_driver << 4) | \ 
     216                ($log_iapp   << 5) | \ 
     217                ($log_mlme   << 6)   \ 
     218        )) 
     219 
     220        append "$var" "logger_syslog=$log_mask" "$N" 
     221        append "$var" "logger_syslog_level=$log_level" "$N" 
     222        append "$var" "logger_stdout=$log_mask" "$N" 
     223        append "$var" "logger_stdout_level=$log_level" "$N" 
     224} 
     225 
    195226hostapd_setup_vif() { 
    196227        local vif="$1" 
    197228        local driver="$2" 
     229        local ifname device channel hwmode 
     230 
    198231        hostapd_cfg= 
    199232 
    200         hostapd_set_bss_options hostapd_cfg "$vif" 
    201233        config_get ifname "$vif" ifname 
    202234        config_get device "$vif" device 
    203235        config_get channel "$device" channel 
    204236        config_get hwmode "$device" hwmode 
     237 
     238        hostapd_set_log_options hostapd_cfg "$device" 
     239        hostapd_set_bss_options hostapd_cfg "$vif" 
     240 
    205241        case "$hwmode" in 
    206242                *bg|*gdt|*gst|*fh) hwmode=g;; 
  • branches/backfire/package/mac80211/Makefile

    r27865 r28138  
    11# 
    2 # Copyright (C) 2007-2010 OpenWrt.org 
     2# Copyright (C) 2007-2011 OpenWrt.org 
    33# 
    44# This is free software, licensed under the GNU General Public License v2. 
     
    1111PKG_NAME:=mac80211 
    1212 
    13 PKG_VERSION:=2011-06-22 
    14 PKG_RELEASE:=2 
     13PKG_VERSION:=2011-08-26 
     14PKG_RELEASE:=1 
    1515PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources 
    16 PKG_MD5SUM:=3ffdd5cecedcf4236f599bdbc55ba10d 
     16PKG_MD5SUM:=37218b56e8a30b351662087d68948825 
    1717 
    1818PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 
     
    857857        choice 
    858858                prompt "b43 firmware version" 
    859                 default B43_FW_4_150 
     859                default B43_FW_5_10 
    860860                help 
    861861                  This option allows you to select the version of the b43 firmware. 
     
    915915                string "Core revisions to include" 
    916916                depends on B43_FW_SQUASH 
    917                 default "5,6,7,8,9,10,11,13,14,15,16" if PACKAGE_B43_PHY_N 
    918                 default "5,6,7,8,9,10,13,14,15" if !PACKAGE_B43_PHY_N 
     917                default "5,6,7,8,9,10,13,14,15" 
    919918                help 
    920919                  This is a comma seperated list of core revision numbers. 
     
    929928                string "PHY types to include" 
    930929                depends on B43_FW_SQUASH 
    931                 default "G,LP,N" if PACKAGE_B43_PHY_N 
    932                 default "G,LP" if !PACKAGE_B43_PHY_N 
     930                default "G,LP" 
    933931                help 
    934932                  This is a comma seperated list of PHY types: 
     
    10411039        $(if $(CONFIG_PACKAGE_B43_PIO),-DCONFIG_B43_PIO) \ 
    10421040        $(if $(CONFIG_PACKAGE_B43_PHY_N),-DCONFIG_B43_PHY_N) \ 
     1041        -DCONFIG_B43_SSB \ 
    10431042        $(if $(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS),-DCONFIG_RT2X00_LIB_DEBUGFS) \ 
    10441043        $(if $(CONFIG_PACKAGE_RT2X00_DEBUG),-DCONFIG_RT2X00_DEBUG) \ 
     
    10771076        CONFIG_B43_PIO=$(if $(CONFIG_PACKAGE_B43_PIO),y) \ 
    10781077        CONFIG_B43_PHY_N=$(if $(CONFIG_PACKAGE_B43_PHY_N),y) \ 
     1078        CONFIG_B43_SSB=y \ 
    10791079        CONFIG_ATH_COMMON=$(if $(CONFIG_PACKAGE_kmod-ath),m) \ 
    10801080        CONFIG_ATH_DEBUG=$(if $(CONFIG_PACKAGE_ATH_DEBUG),y) \ 
     
    11291129        CONFIG_LIBERTAS_CS= \ 
    11301130        CONFIG_LIBERTAS_SPI= \ 
    1131         CONFIG_LIBERTAS_SDIO=$(if $(CONFIG_PACKAGE_kmod-libertas-sd),m) \ 
     1131        CONFIG_COMPAT_LIBERTAS_SDIO=$(if $(CONFIG_PACKAGE_kmod-libertas-sd),m) \ 
    11321132        CONFIG_LIBERTAS_THINFIRM= \ 
    11331133        CONFIG_LIBERTAS_USB=$(if $(CONFIG_PACKAGE_kmod-libertas-usb),m) \ 
     
    12281228 
    12291229define KernelPackage/libertas-sd/install 
    1230         $(INSTALL_DIR) $(1)/lib/firmware 
     1230        $(INSTALL_DIR) $(1)/lib/firmware/libertas 
    12311231        $(INSTALL_DATA) \ 
    12321232                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8385_helper.bin \ 
     
    12381238                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8688_helper.bin \ 
    12391239                $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/libertas/sd8688.bin \ 
    1240                 $(1)/lib/firmware/ 
     1240                $(1)/lib/firmware/libertas 
    12411241endef 
    12421242 
     
    13591359define Build/b43-common 
    13601360        tar xjf "$(DL_DIR)/$(PKG_B43_FWCUTTER_SOURCE)" -C "$(PKG_BUILD_DIR)" 
     1361        patch -p1 -d  "$(PKG_BUILD_DIR)/$(PKG_B43_FWCUTTER_OBJECT)" < ./files/b43-fwcutter-fw-dirname.patch 
    13611362        $(MAKE) -C "$(PKG_BUILD_DIR)/$(PKG_B43_FWCUTTER_OBJECT)" \ 
    13621363                CFLAGS="-I$(STAGING_DIR_HOST)/include -include endian.h" \ 
  • branches/backfire/package/mac80211/files/lib/wifi/mac80211.sh

    r27978 r28138  
    1717        config_get basic_rate_list "$device" basic_rate 
    1818        config_get_bool noscan "$device" noscan 
     19 
     20        hostapd_set_log_options base_cfg "$device" 
     21 
    1922        [ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device" 
    2023 
     
    281284        local hostapd_ctrl="" 
    282285 
     286        config_get ath9k_chanbw "$device" ath9k_chanbw 
     287        [ -n "$ath9k_chanbw" -a -d /sys/kernel/debug/ieee80211/$phy/ath9k ] && echo "$ath9k_chanbw" > /sys/kernel/debug/ieee80211/$phy/ath9k/chanbw 
     288 
    283289        [ -n "$country" ] && iw reg set "$country" 
    284290        [ "$channel" = "auto" -o "$channel" = "0" ] || { 
  • branches/backfire/package/mac80211/patches/001-disable_b44.patch

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

    r27431 r28138  
    1010 ifeq ($(CONFIG_MAC80211),y) 
    1111 $(error "ERROR: you have MAC80211 compiled into the kernel, CONFIG_MAC80211=y, as such you cannot replace its mac80211 driver. You need this set to CONFIG_MAC80211=m. If you are using Fedora upgrade your kernel as later version should this set as modular. For further information on Fedora see https://bugzilla.redhat.com/show_bug.cgi?id=470143. If you are using your own kernel recompile it and make mac80211 modular") 
    12 @@ -646,10 +646,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27 
     12@@ -642,10 +642,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27 
    1313 # We need the backported rfkill module on kernel < 2.6.31. 
    1414 # In more recent kernel versions use the in kernel rfkill module. 
  • branches/backfire/package/mac80211/patches/005-disable_ssb_build.patch

    r27431 r28138  
    11--- a/Makefile 
    22+++ b/Makefile 
    3 @@ -30,7 +30,7 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
     3@@ -29,7 +29,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
     4  
    45 obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/ 
    56  
    6  obj-$(CONFIG_COMPAT_NETWORK_MODULES) += drivers/net/ 
    7 -obj-$(CONFIG_COMPAT_VAR_MODULES) +=  drivers/ssb/ drivers/bcma/ drivers/misc/eeprom/ 
    8 +obj-$(CONFIG_COMPAT_VAR_MODULES) +=  drivers/bcma/ drivers/misc/eeprom/ 
     7-obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/ssb/ 
     8 obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/bcma/ 
     9 obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/misc/eeprom/ 
    910  
    10  ifeq ($(CONFIG_STAGING_EXCLUDE_BUILD),) 
    11  obj-$(CONFIG_COMPAT_STAGING) += drivers/staging/ath6kl/ 
    1211--- a/config.mk 
    1312+++ b/config.mk 
     
    2019 include $(KLIB_BUILD)/.config 
    2120 endif 
    22 @@ -314,7 +313,8 @@ CONFIG_IPW2200_QOS=y 
     21@@ -316,7 +315,8 @@ CONFIG_IPW2200_QOS=y 
    2322 # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface 
    2423 endif #CONFIG_WIRELESS_EXT 
     
    3029 CONFIG_SSB_SPROM=y 
    3130  
    32 @@ -327,7 +327,7 @@ endif #CONFIG_PCMCIA 
     31@@ -329,7 +329,7 @@ endif #CONFIG_PCMCIA 
    3332 # CONFIG_SSB_DEBUG=y 
    3433 CONFIG_SSB_DRIVER_PCICORE=y 
     
    3938 CONFIG_BCMA=m 
    4039 CONFIG_BCMA_BLOCKIO=y 
    41 @@ -534,7 +534,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
     40@@ -538,7 +538,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
    4241  
    4342 ifdef CONFIG_MMC 
  • branches/backfire/package/mac80211/patches/006-disable_bcma_build.patch

    r27431 r28138  
     1--- a/Makefile 
     2+++ b/Makefile 
     3@@ -29,7 +29,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
     4  
     5 obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/ 
     6  
     7-obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/bcma/ 
     8 obj-$(CONFIG_COMPAT_VAR_MODULES) += drivers/misc/eeprom/ 
     9  
     10 ifeq ($(CONFIG_STAGING_EXCLUDE_BUILD),) 
    111--- a/config.mk 
    212+++ b/config.mk 
    3 @@ -329,9 +329,9 @@ CONFIG_SSB_DRIVER_PCICORE=y 
     13@@ -331,12 +331,12 @@ CONFIG_SSB_DRIVER_PCICORE=y 
    414 CONFIG_B43_SSB=y 
    515 endif #__CONFIG_SSB 
     
    1222+# CONFIG_BCMA_HOST_PCI=y 
    1323 # CONFIG_BCMA_DEBUG=y 
    14  # CONFIG_B43_BCMA=y 
     24-CONFIG_B43_BCMA=y 
     25-CONFIG_B43_BCMA_PIO=y 
     26+# CONFIG_B43_BCMA=y 
     27+# CONFIG_B43_BCMA_PIO=y 
    1528  
     29 CONFIG_P54_PCI=m 
     30  
  • branches/backfire/package/mac80211/patches/007-remove_misc_drivers.patch

    r27431 r28138  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -212,7 +212,7 @@ $(warning "WARNING: CONFIG_CFG80211_WEXT 
     3@@ -213,7 +213,7 @@ $(warning "WARNING: CONFIG_CFG80211_WEXT 
    44 endif #CONFIG_WIRELESS_EXT 
    55  
     
    1010  
    1111 # mac80211 test driver 
    12 @@ -365,13 +365,13 @@ endif #CONFIG_CRC_ITU_T 
     12@@ -368,13 +368,13 @@ endif #CONFIG_CRC_ITU_T 
    1313 CONFIG_MWL8K=m 
    1414  
     
    2929  
    3030 ifdef CONFIG_WIRELESS_EXT 
    31 @@ -431,21 +431,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
     31@@ -435,21 +435,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
    3232 # Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER 
    3333 # it also requires new RNDIS_HOST and CDC_ETHER modules which we add 
  • branches/backfire/package/mac80211/patches/010-no_pcmcia.patch

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

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

    r27431 r28138  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -253,7 +253,7 @@ ifdef CONFIG_MAC80211_LEDS 
     3@@ -254,7 +254,7 @@ ifdef CONFIG_MAC80211_LEDS 
    44 CONFIG_B43_LEDS=y 
    55 endif #CONFIG_MAC80211_LEDS 
     
    88+# CONFIG_B43_PHY_N=y 
    99 # CONFIG_B43_PHY_HT=y 
     10 # CONFIG_B43_PHY_LCN=y 
    1011 # CONFIG_B43_FORCE_PIO=y 
    11  # CONFIG_B43_DEBUG=y 
  • branches/backfire/package/mac80211/patches/015-remove-rt2x00-options.patch

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

    r27431 r28138  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -219,7 +219,7 @@ CONFIG_ATH9K_COMMON=m 
     3@@ -220,7 +220,7 @@ CONFIG_ATH9K_COMMON=m 
    44 # as default once we get minstrel properly tested and blessed by 
    55 # our systems engineering team. CCK rates also need to be used 
  • branches/backfire/package/mac80211/patches/018-revert_printk_va_format.patch

    r27431 r28138  
    11--- a/drivers/net/wireless/b43/main.c 
    22+++ b/drivers/net/wireless/b43/main.c 
    3 @@ -334,83 +334,59 @@ static int b43_ratelimit(struct b43_wl * 
     3@@ -337,83 +337,59 @@ static int b43_ratelimit(struct b43_wl * 
    44  
    55 void b43info(struct b43_wl *wl, const char *fmt, ...) 
     
    9999--- a/drivers/net/wireless/b43legacy/main.c 
    100100+++ b/drivers/net/wireless/b43legacy/main.c 
    101 @@ -181,75 +181,52 @@ static int b43legacy_ratelimit(struct b4 
     101@@ -179,75 +179,52 @@ static int b43legacy_ratelimit(struct b4 
    102102  
    103103 void b43legacyinfo(struct b43legacy_wl *wl, const char *fmt, ...) 
  • branches/backfire/package/mac80211/patches/019-remove_ath5k_pci_option.patch

    r27431 r28138  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -224,7 +224,7 @@ CONFIG_ATH9K_COMMON=m 
     3@@ -225,7 +225,7 @@ CONFIG_ATH9K_COMMON=m 
    44 # PCI Drivers 
    55 ifdef CONFIG_PCI 
  • branches/backfire/package/mac80211/patches/022-atomic64_backport.patch

    r27606 r28138  
    11--- a/compat/Makefile 
    22+++ b/compat/Makefile 
    3 @@ -34,3 +34,8 @@ compat-$(CONFIG_COMPAT_KERNEL_2_6_39) += 
    4         compat-2.6.39.o \ 
    5         kstrtox.o 
     3@@ -38,3 +38,8 @@ compat-$(CONFIG_COMPAT_KERNEL_3_1) += \ 
     4        cordic.o \ 
     5        crc8.o 
    66  
    77+ifndef CONFIG_64BIT 
     
    1212--- a/include/linux/compat-2.6.31.h 
    1313+++ b/include/linux/compat-2.6.31.h 
    14 @@ -199,6 +199,20 @@ void compat_synchronize_threaded_irq(str 
    15  #define list_entry_rcu(ptr, type, member) \ 
    16         container_of(rcu_dereference(ptr), type, member) 
     14@@ -202,6 +202,20 @@ void compat_synchronize_threaded_irq(str 
     15 #define skb_walk_frags(skb, iter)      \ 
     16        for (iter = skb_shinfo(skb)->frag_list; iter; iter = iter->next) 
    1717  
    1818+#ifndef CONFIG_64BIT 
     
    7171--- a/include/linux/compat-3.1.h 
    7272+++ b/include/linux/compat-3.1.h 
    73 @@ -24,6 +24,18 @@ 
    74   
    75  #define genl_dump_check_consistent(...) do {} while(0) 
     73@@ -19,6 +19,18 @@ 
     74        .prod_id = { NULL, NULL, (v3), NULL }, \ 
     75        .prod_id_hash = { 0, 0, (vh3), 0 }, } 
    7676  
    7777+/* 
  • branches/backfire/package/mac80211/patches/110-disable_usb_compat.patch

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

    r27431 r28138  
    1 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c 
    2 +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c 
    3 @@ -27,6 +27,7 @@ 
    4   * 
    5   *****************************************************************************/ 
    6   
    7 +#undef pr_fmt 
    8  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 
    9   
    10  #include <linux/kernel.h> 
    111--- a/drivers/net/wireless/iwlegacy/iwl3945-base.c 
    122+++ b/drivers/net/wireless/iwlegacy/iwl3945-base.c 
     
    2818 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 
    2919  
    30  #include <linux/slab.h> 
     20 #include <linux/hardirq.h> 
    3121--- a/drivers/net/wireless/libertas_tf/if_usb.c 
    3222+++ b/drivers/net/wireless/libertas_tf/if_usb.c 
     
    4838 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 
    4939  
    50  #include <linux/slab.h> 
     40 #include <linux/hardirq.h> 
    5141--- a/net/wireless/core.c 
    5242+++ b/net/wireless/core.c 
     
    10898 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 
    10999  
    110  #include <linux/sched.h> 
     100 #include <linux/hardirq.h> 
    111101--- a/drivers/net/wireless/libertas/if_cs.c 
    112102+++ b/drivers/net/wireless/libertas/if_cs.c 
     
    138128 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 
    139129  
    140  #include <linux/moduleparam.h> 
     130 #include <linux/hardirq.h> 
    141131--- a/drivers/net/wireless/libertas/if_usb.c 
    142132+++ b/drivers/net/wireless/libertas/if_usb.c 
  • branches/backfire/package/mac80211/patches/201-ath5k-WAR-for-AR71xx-PCI-bug.patch

    r25198 r28138  
    11--- a/drivers/net/wireless/ath/ath5k/initvals.c 
    22+++ b/drivers/net/wireless/ath/ath5k/initvals.c 
    3 @@ -58,8 +58,14 @@ static const struct ath5k_ini ar5210_ini 
     3@@ -57,8 +57,14 @@ static const struct ath5k_ini ar5210_ini 
    44        { AR5K_IMR,             0 }, 
    55        { AR5K_IER,             AR5K_IER_DISABLE }, 
     
    1818--- a/drivers/net/wireless/ath/ath5k/dma.c 
    1919+++ b/drivers/net/wireless/ath/ath5k/dma.c 
    20 @@ -787,10 +787,18 @@ void ath5k_hw_dma_init(struct ath5k_hw * 
     20@@ -786,10 +786,18 @@ void ath5k_hw_dma_init(struct ath5k_hw * 
    2121         * guess we can tweak it and see how it goes ;-) 
    2222         */ 
  • branches/backfire/package/mac80211/patches/300-pending_work.patch

    r27865 r28138  
    11--- a/net/mac80211/agg-rx.c 
    22+++ b/net/mac80211/agg-rx.c 
    3 @@ -176,6 +176,8 @@ static void ieee80211_send_addba_resp(st 
     3@@ -184,6 +184,8 @@ static void ieee80211_send_addba_resp(st 
    44                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 
    55        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
     
    1010        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
    1111                                          IEEE80211_STYPE_ACTION); 
    12 @@ -262,7 +264,11 @@ void ieee80211_process_addba_request(str 
    13                                 "%pM on tid %u\n", 
    14                                 mgmt->sa, tid); 
    15  #endif /* CONFIG_MAC80211_HT_DEBUG */ 
    16 -               goto end; 
    17 + 
    18 +               /* delete existing Rx BA session on the same tid */ 
    19 +               ___ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_RECIPIENT, 
    20 +                                               WLAN_STATUS_UNSPECIFIED_QOS, 
    21 +                                               false); 
    22         } 
    23   
    24         /* prepare A-MPDU MLME for Rx aggregation */ 
    2512--- a/net/mac80211/agg-tx.c 
    2613+++ b/net/mac80211/agg-tx.c 
     
    4532  
    4633        if (test_sta_flags(sta, WLAN_STA_BLOCK_BA)) { 
    47 @@ -809,7 +811,7 @@ void ieee80211_process_addba_resp(struct 
    48                  * of at least 1. 
    49                  */ 
    50                 if (!buf_size) 
    51 -                       goto out; 
    52 +                       buf_size = 1; 
    53   
    54                 if (test_and_set_bit(HT_AGG_STATE_RESPONSE_RECEIVED, 
    55                                      &tid_tx->state)) { 
    5634--- a/net/mac80211/debugfs_sta.c 
    5735+++ b/net/mac80211/debugfs_sta.c 
     
    204182--- a/net/mac80211/rx.c 
    205183+++ b/net/mac80211/rx.c 
    206 @@ -2137,7 +2137,8 @@ ieee80211_rx_h_action(struct ieee80211_r 
     184@@ -2160,7 +2160,8 @@ ieee80211_rx_h_action(struct ieee80211_r 
    207185                 */ 
    208186                if (sdata->vif.type != NL80211_IFTYPE_STATION && 
     
    214192  
    215193                /* verify action_code is present */ 
    216 @@ -2335,13 +2336,14 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
     194@@ -2375,13 +2376,14 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
    217195  
    218196        if (!ieee80211_vif_is_mesh(&sdata->vif) && 
     
    231209        case cpu_to_le16(IEEE80211_STYPE_DEAUTH): 
    232210        case cpu_to_le16(IEEE80211_STYPE_DISASSOC): 
    233 @@ -2680,10 +2682,16 @@ static int prepare_for_handlers(struct i 
     211@@ -2724,10 +2726,16 @@ static int prepare_for_handlers(struct i 
    234212                } 
    235213                break; 
     
    268246        WLAN_STA_MFP            = 1<<10, 
    269247        WLAN_STA_BLOCK_BA       = 1<<11, 
    270 --- a/drivers/net/wireless/ath/ath9k/beacon.c 
    271 +++ b/drivers/net/wireless/ath/ath9k/beacon.c 
    272 @@ -360,6 +360,7 @@ void ath_beacon_tasklet(unsigned long da 
    273         struct ath_common *common = ath9k_hw_common(ah); 
    274         struct ath_buf *bf = NULL; 
    275         struct ieee80211_vif *vif; 
    276 +       struct ath_tx_status ts; 
    277         int slot; 
    278         u32 bfaddr, bc = 0; 
    279   
    280 @@ -384,7 +385,9 @@ void ath_beacon_tasklet(unsigned long da 
    281                         ath_dbg(common, ATH_DBG_BSTUCK, 
    282                                 "beacon is officially stuck\n"); 
    283                         sc->sc_flags |= SC_OP_TSF_RESET; 
    284 +                       spin_lock(&sc->sc_pcu_lock); 
    285                         ath_reset(sc, true); 
    286 +                       spin_unlock(&sc->sc_pcu_lock); 
    287                 } 
    288   
    289                 return; 
    290 @@ -464,6 +467,11 @@ void ath_beacon_tasklet(unsigned long da 
    291                 ath9k_hw_txstart(ah, sc->beacon.beaconq); 
    292   
    293                 sc->beacon.ast_be_xmit += bc;     /* XXX per-vif? */ 
    294 +               if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 
    295 +                       spin_lock_bh(&sc->sc_pcu_lock); 
    296 +                       ath9k_hw_txprocdesc(ah, bf->bf_desc, (void *)&ts); 
    297 +                       spin_unlock_bh(&sc->sc_pcu_lock); 
    298 +               } 
    299         } 
    300  } 
    301   
    302 --- a/drivers/net/wireless/ath/ath9k/main.c 
    303 +++ b/drivers/net/wireless/ath/ath9k/main.c 
    304 @@ -617,8 +617,11 @@ void ath_hw_check(struct work_struct *wo 
    305         ath_dbg(common, ATH_DBG_RESET, "Possible baseband hang, " 
    306                 "busy=%d (try %d)\n", busy, sc->hw_busy_count + 1); 
    307         if (busy >= 99) { 
    308 -               if (++sc->hw_busy_count >= 3) 
    309 +               if (++sc->hw_busy_count >= 3) { 
    310 +                       spin_lock_bh(&sc->sc_pcu_lock); 
    311                         ath_reset(sc, true); 
    312 +                       spin_unlock_bh(&sc->sc_pcu_lock); 
    313 +               } 
    314         } else if (busy >= 0) 
    315                 sc->hw_busy_count = 0; 
    316   
    317 @@ -637,7 +640,9 @@ static void ath_hw_pll_rx_hang_check(str 
    318                         /* Rx is hung for more than 500ms. Reset it */ 
    319                         ath_dbg(common, ATH_DBG_RESET, 
    320                                 "Possible RX hang, resetting"); 
    321 +                       spin_lock_bh(&sc->sc_pcu_lock); 
    322                         ath_reset(sc, true); 
    323 +                       spin_unlock_bh(&sc->sc_pcu_lock); 
    324                         count = 0; 
    325                 } 
    326         } else 
    327 @@ -674,7 +679,9 @@ void ath9k_tasklet(unsigned long data) 
    328   
    329         if ((status & ATH9K_INT_FATAL) || 
    330             (status & ATH9K_INT_BB_WATCHDOG)) { 
    331 +               spin_lock(&sc->sc_pcu_lock); 
    332                 ath_reset(sc, true); 
    333 +               spin_unlock(&sc->sc_pcu_lock); 
    334                 return; 
    335         } 
    336   
    337 @@ -980,7 +987,6 @@ int ath_reset(struct ath_softc *sc, bool 
    338         del_timer_sync(&common->ani.timer); 
    339   
    340         ath9k_ps_wakeup(sc); 
    341 -       spin_lock_bh(&sc->sc_pcu_lock); 
    342   
    343         ieee80211_stop_queues(hw); 
    344   
    345 @@ -1023,7 +1029,6 @@ int ath_reset(struct ath_softc *sc, bool 
    346         } 
    347   
    348         ieee80211_wake_queues(hw); 
    349 -       spin_unlock_bh(&sc->sc_pcu_lock); 
    350   
    351         /* Start ANI */ 
    352         if (!common->disable_ani) 
    353 @@ -2326,9 +2331,9 @@ static void ath9k_flush(struct ieee80211 
    354         ath9k_ps_wakeup(sc); 
    355         spin_lock_bh(&sc->sc_pcu_lock); 
    356         drain_txq = ath_drain_all_txq(sc, false); 
    357 -       spin_unlock_bh(&sc->sc_pcu_lock); 
    358         if (!drain_txq) 
    359                 ath_reset(sc, false); 
    360 +       spin_unlock_bh(&sc->sc_pcu_lock); 
    361         ath9k_ps_restore(sc); 
    362         ieee80211_wake_queues(hw); 
    363   
    364 --- a/drivers/net/wireless/ath/ath9k/xmit.c 
    365 +++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    366 @@ -565,11 +565,8 @@ static void ath_tx_complete_aggr(struct  
    367   
    368         rcu_read_unlock(); 
    369   
    370 -       if (needreset) { 
    371 -               spin_unlock_bh(&sc->sc_pcu_lock); 
    372 +       if (needreset) 
    373                 ath_reset(sc, false); 
    374 -               spin_lock_bh(&sc->sc_pcu_lock); 
    375 -       } 
    376  } 
    377   
    378  static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf, 
    379 @@ -664,7 +661,8 @@ static int ath_compute_num_delims(struct 
    380          * TODO - this could be improved to be dependent on the rate. 
    381          *      The hardware can keep up at lower rates, but not higher rates 
    382          */ 
    383 -       if (fi->keyix != ATH9K_TXKEYIX_INVALID) 
    384 +       if ((fi->keyix != ATH9K_TXKEYIX_INVALID) && 
    385 +           !(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) 
    386                 ndelim += ATH_AGGR_ENCRYPTDELIM; 
    387   
    388         /* 
    389 @@ -2169,7 +2167,9 @@ static void ath_tx_complete_poll_work(st 
    390         if (needreset) { 
    391                 ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET, 
    392                         "tx hung, resetting the chip\n"); 
    393 +               spin_lock_bh(&sc->sc_pcu_lock); 
    394                 ath_reset(sc, true); 
    395 +               spin_unlock_bh(&sc->sc_pcu_lock); 
    396         } 
    397   
    398         ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 
    399 --- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c 
    400 +++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c 
    401 @@ -236,7 +236,7 @@ static void ar9003_paprd_get_gain_table( 
    402         memset(entry, 0, sizeof(ah->paprd_gain_table_entries)); 
    403         memset(index, 0, sizeof(ah->paprd_gain_table_index)); 
    404   
    405 -       for (i = 0; i < 32; i++) { 
    406 +       for (i = 0; i < PAPRD_GAIN_TABLE_ENTRIES; i++) { 
    407                 entry[i] = REG_READ(ah, reg); 
    408                 index[i] = (entry[i] >> 24) & 0xff; 
    409                 reg += 4; 
    410 @@ -246,13 +246,13 @@ static void ar9003_paprd_get_gain_table( 
    411  static unsigned int ar9003_get_desired_gain(struct ath_hw *ah, int chain, 
    412                                             int target_power) 
    413  { 
    414 -       int olpc_gain_delta = 0; 
    415 +       int olpc_gain_delta = 0, cl_gain_mod; 
    416         int alpha_therm, alpha_volt; 
    417         int therm_cal_value, volt_cal_value; 
    418         int therm_value, volt_value; 
    419         int thermal_gain_corr, voltage_gain_corr; 
    420         int desired_scale, desired_gain = 0; 
    421 -       u32 reg; 
    422 +       u32 reg_olpc  = 0, reg_cl_gain  = 0; 
    423   
    424         REG_CLR_BIT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 
    425                     AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE); 
    426 @@ -271,15 +271,29 @@ static unsigned int ar9003_get_desired_g 
    427         volt_value = REG_READ_FIELD(ah, AR_PHY_BB_THERM_ADC_4, 
    428                                     AR_PHY_BB_THERM_ADC_4_LATEST_VOLT_VALUE); 
    429   
    430 -       if (chain == 0) 
    431 -               reg = AR_PHY_TPC_11_B0; 
    432 -       else if (chain == 1) 
    433 -               reg = AR_PHY_TPC_11_B1; 
    434 -       else 
    435 -               reg = AR_PHY_TPC_11_B2; 
    436 +       switch (chain) { 
    437 +       case 0: 
    438 +               reg_olpc = AR_PHY_TPC_11_B0; 
    439 +               reg_cl_gain = AR_PHY_CL_TAB_0; 
    440 +               break; 
    441 +       case 1: 
    442 +               reg_olpc = AR_PHY_TPC_11_B1; 
    443 +               reg_cl_gain = AR_PHY_CL_TAB_1; 
    444 +               break; 
    445 +       case 2: 
    446 +               reg_olpc = AR_PHY_TPC_11_B2; 
    447 +               reg_cl_gain = AR_PHY_CL_TAB_2; 
    448 +               break; 
    449 +       default: 
    450 +               ath_dbg(ath9k_hw_common(ah), ATH_DBG_CALIBRATE, 
    451 +               "Invalid chainmask: %d\n", chain); 
    452 +               break; 
    453 +       } 
    454   
    455 -       olpc_gain_delta = REG_READ_FIELD(ah, reg, 
    456 +       olpc_gain_delta = REG_READ_FIELD(ah, reg_olpc, 
    457                                          AR_PHY_TPC_11_OLPC_GAIN_DELTA); 
    458 +       cl_gain_mod = REG_READ_FIELD(ah, reg_cl_gain, 
    459 +                                        AR_PHY_CL_TAB_CL_GAIN_MOD); 
    460   
    461         if (olpc_gain_delta >= 128) 
    462                 olpc_gain_delta = olpc_gain_delta - 256; 
    463 @@ -289,7 +303,7 @@ static unsigned int ar9003_get_desired_g 
    464         voltage_gain_corr = (alpha_volt * (volt_value - volt_cal_value) + 
    465                              (128 / 2)) / 128; 
    466         desired_gain = target_power - olpc_gain_delta - thermal_gain_corr - 
    467 -           voltage_gain_corr + desired_scale; 
    468 +           voltage_gain_corr + desired_scale + cl_gain_mod; 
    469   
    470         return desired_gain; 
    471  } 
    472 @@ -727,7 +741,7 @@ int ar9003_paprd_setup_gain_table(struct 
    473         desired_gain = ar9003_get_desired_gain(ah, chain, train_power); 
    474   
    475         gain_index = 0; 
    476 -       for (i = 0; i < 32; i++) { 
    477 +       for (i = 0; i < PAPRD_GAIN_TABLE_ENTRIES; i++) { 
    478                 if (ah->paprd_gain_table_index[i] >= desired_gain) 
    479                         break; 
    480                 gain_index++; 
    481 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h 
    482 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h 
    483 @@ -1121,6 +1121,9 @@ 
    484  #define AR_PHY_POWERTX_RATE8_POWERTXHT40_5     0x3F00 
    485  #define AR_PHY_POWERTX_RATE8_POWERTXHT40_5_S   8 
    486   
    487 +#define AR_PHY_CL_TAB_CL_GAIN_MOD              0x1f 
    488 +#define AR_PHY_CL_TAB_CL_GAIN_MOD_S            0 
    489 + 
    490  void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx); 
    491   
    492  #endif  /* AR9003_PHY_H */ 
    493 --- a/drivers/net/wireless/ath/ath5k/eeprom.c 
    494 +++ b/drivers/net/wireless/ath/ath5k/eeprom.c 
    495 @@ -691,14 +691,12 @@ ath5k_eeprom_free_pcal_info(struct ath5k 
    496                 if (!chinfo[pier].pd_curves) 
    497                         continue; 
    498   
    499 -               for (pdg = 0; pdg < ee->ee_pd_gains[mode]; pdg++) { 
    500 +               for (pdg = 0; pdg < AR5K_EEPROM_N_PD_CURVES; pdg++) { 
    501                         struct ath5k_pdgain_info *pd = 
    502                                         &chinfo[pier].pd_curves[pdg]; 
    503   
    504 -                       if (pd != NULL) { 
    505 -                               kfree(pd->pd_step); 
    506 -                               kfree(pd->pd_pwr); 
    507 -                       } 
    508 +                       kfree(pd->pd_step); 
    509 +                       kfree(pd->pd_pwr); 
    510                 } 
    511   
    512                 kfree(chinfo[pier].pd_curves); 
    513 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    514 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    515 @@ -229,6 +229,7 @@ static void ar9003_hw_fill_txdesc(struct 
    516  static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, 
    517                                  struct ath_tx_status *ts) 
    518  { 
    519 +       struct ar9003_txc *txc = (struct ar9003_txc *) ds; 
    520         struct ar9003_txs *ads; 
    521         u32 status; 
    522   
    523 @@ -238,7 +239,11 @@ static int ar9003_hw_proc_txdesc(struct  
    524         if ((status & AR_TxDone) == 0) 
    525                 return -EINPROGRESS; 
    526   
    527 -       ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size; 
    528 +       ts->qid = MS(ads->ds_info, AR_TxQcuNum); 
    529 +       if (!txc || (MS(txc->info, AR_TxQcuNum) == ts->qid)) 
    530 +               ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size; 
    531 +       else 
    532 +               return -ENOENT; 
    533   
    534         if ((MS(ads->ds_info, AR_DescId) != ATHEROS_VENDOR_ID) || 
    535             (MS(ads->ds_info, AR_TxRxDesc) != 1)) { 
    536 @@ -254,7 +259,6 @@ static int ar9003_hw_proc_txdesc(struct  
    537         ts->ts_seqnum = MS(status, AR_SeqNum); 
    538         ts->tid = MS(status, AR_TxTid); 
    539   
    540 -       ts->qid = MS(ads->ds_info, AR_TxQcuNum); 
    541         ts->desc_id = MS(ads->status1, AR_TxDescId); 
    542         ts->ts_tstamp = ads->status4; 
    543         ts->ts_status = 0; 
    544 --- a/net/mac80211/wpa.c 
    545 +++ b/net/mac80211/wpa.c 
    546 @@ -15,6 +15,7 @@ 
    547  #include <linux/gfp.h> 
    548  #include <asm/unaligned.h> 
    549  #include <net/mac80211.h> 
    550 +#include <crypto/aes.h> 
    551   
    552  #include "ieee80211_i.h" 
    553  #include "michael.h" 
    554 @@ -86,6 +87,11 @@ ieee80211_rx_h_michael_mic_verify(struct 
    555         struct sk_buff *skb = rx->skb; 
    556         struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 
    557         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    558 +       int queue = rx->queue; 
    559 + 
    560 +       /* otherwise, TKIP is vulnerable to TID 0 vs. non-QoS replays */ 
    561 +       if (rx->queue == NUM_RX_DATA_QUEUES - 1) 
    562 +               queue = 0; 
    563   
    564         /* 
    565          * it makes no sense to check for MIC errors on anything other 
    566 @@ -148,8 +154,8 @@ ieee80211_rx_h_michael_mic_verify(struct 
    567   
    568  update_iv: 
    569         /* update IV in key information to be able to detect replays */ 
    570 -       rx->key->u.tkip.rx[rx->queue].iv32 = rx->tkip_iv32; 
    571 -       rx->key->u.tkip.rx[rx->queue].iv16 = rx->tkip_iv16; 
    572 +       rx->key->u.tkip.rx[queue].iv32 = rx->tkip_iv32; 
    573 +       rx->key->u.tkip.rx[queue].iv16 = rx->tkip_iv16; 
    574   
    575         return RX_CONTINUE; 
    576   
    577 @@ -165,6 +171,7 @@ static int tkip_encrypt_skb(struct ieee8 
    578         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; 
    579         struct ieee80211_key *key = tx->key; 
    580         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    581 +       unsigned long flags; 
    582         unsigned int hdrlen; 
    583         int len, tail; 
    584         u8 *pos; 
    585 @@ -192,11 +199,12 @@ static int tkip_encrypt_skb(struct ieee8 
    586         pos += hdrlen; 
    587   
    588         /* Increase IV for the frame */ 
    589 +       spin_lock_irqsave(&key->u.tkip.txlock, flags); 
    590         key->u.tkip.tx.iv16++; 
    591         if (key->u.tkip.tx.iv16 == 0) 
    592                 key->u.tkip.tx.iv32++; 
    593 - 
    594 -       pos = ieee80211_tkip_add_iv(pos, key, key->u.tkip.tx.iv16); 
    595 +       pos = ieee80211_tkip_add_iv(pos, key); 
    596 +       spin_unlock_irqrestore(&key->u.tkip.txlock, flags); 
    597   
    598         /* hwaccel - with software IV */ 
    599         if (info->control.hw_key) 
    600 @@ -205,9 +213,8 @@ static int tkip_encrypt_skb(struct ieee8 
    601         /* Add room for ICV */ 
    602         skb_put(skb, TKIP_ICV_LEN); 
    603   
    604 -       hdr = (struct ieee80211_hdr *) skb->data; 
    605         return ieee80211_tkip_encrypt_data(tx->local->wep_tx_tfm, 
    606 -                                          key, pos, len, hdr->addr2); 
    607 +                                          key, skb, pos, len); 
    608  } 
    609   
    610   
    611 @@ -235,6 +242,11 @@ ieee80211_crypto_tkip_decrypt(struct iee 
    612         struct ieee80211_key *key = rx->key; 
    613         struct sk_buff *skb = rx->skb; 
    614         struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 
    615 +       int queue = rx->queue; 
    616 + 
    617 +       /* otherwise, TKIP is vulnerable to TID 0 vs. non-QoS replays */ 
    618 +       if (rx->queue == NUM_RX_DATA_QUEUES - 1) 
    619 +               queue = 0; 
    620   
    621         hdrlen = ieee80211_hdrlen(hdr->frame_control); 
    622   
    623 @@ -255,7 +267,7 @@ ieee80211_crypto_tkip_decrypt(struct iee 
    624         res = ieee80211_tkip_decrypt_data(rx->local->wep_rx_tfm, 
    625                                           key, skb->data + hdrlen, 
    626                                           skb->len - hdrlen, rx->sta->sta.addr, 
    627 -                                         hdr->addr1, hwaccel, rx->queue, 
    628 +                                         hdr->addr1, hwaccel, queue, 
    629                                           &rx->tkip_iv32, 
    630                                           &rx->tkip_iv16); 
    631         if (res != TKIP_DECRYPT_OK) 
    632 @@ -283,6 +295,8 @@ static void ccmp_special_blocks(struct s 
    633         unsigned int hdrlen; 
    634         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    635   
    636 +       memset(scratch, 0, 6 * AES_BLOCK_LEN); 
    637 + 
    638         b_0 = scratch + 3 * AES_BLOCK_LEN; 
    639         aad = scratch + 4 * AES_BLOCK_LEN; 
    640   
    641 @@ -373,8 +387,10 @@ static int ccmp_encrypt_skb(struct ieee8 
    642         struct ieee80211_key *key = tx->key; 
    643         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    644         int hdrlen, len, tail; 
    645 -       u8 *pos, *pn; 
    646 -       int i; 
    647 +       u8 *pos; 
    648 +       u8 pn[6]; 
    649 +       u64 pn64; 
    650 +       u8 scratch[6 * AES_BLOCK_LEN]; 
    651   
    652         if (info->control.hw_key && 
    653             !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { 
    654 @@ -402,14 +418,14 @@ static int ccmp_encrypt_skb(struct ieee8 
    655         hdr = (struct ieee80211_hdr *) pos; 
    656         pos += hdrlen; 
    657   
    658 -       /* PN = PN + 1 */ 
    659 -       pn = key->u.ccmp.tx_pn; 
    660 +       pn64 = atomic64_inc_return(&key->u.ccmp.tx_pn); 
    661   
    662 -       for (i = CCMP_PN_LEN - 1; i >= 0; i--) { 
    663 -               pn[i]++; 
    664 -               if (pn[i]) 
    665 -                       break; 
    666 -       } 
    667 +       pn[5] = pn64; 
    668 +       pn[4] = pn64 >> 8; 
    669 +       pn[3] = pn64 >> 16; 
    670 +       pn[2] = pn64 >> 24; 
    671 +       pn[1] = pn64 >> 32; 
    672 +       pn[0] = pn64 >> 40; 
    673   
    674         ccmp_pn2hdr(pos, pn, key->conf.keyidx); 
    675   
    676 @@ -418,8 +434,8 @@ static int ccmp_encrypt_skb(struct ieee8 
    677                 return 0; 
    678   
    679         pos += CCMP_HDR_LEN; 
    680 -       ccmp_special_blocks(skb, pn, key->u.ccmp.tx_crypto_buf, 0); 
    681 -       ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, key->u.ccmp.tx_crypto_buf, pos, len, 
    682 +       ccmp_special_blocks(skb, pn, scratch, 0); 
    683 +       ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len, 
    684                                   pos, skb_put(skb, CCMP_MIC_LEN)); 
    685   
    686         return 0; 
    687 @@ -475,11 +491,12 @@ ieee80211_crypto_ccmp_decrypt(struct iee 
    688         } 
    689   
    690         if (!(status->flag & RX_FLAG_DECRYPTED)) { 
    691 +               u8 scratch[6 * AES_BLOCK_LEN]; 
    692                 /* hardware didn't decrypt/verify MIC */ 
    693 -               ccmp_special_blocks(skb, pn, key->u.ccmp.rx_crypto_buf, 1); 
    694 +               ccmp_special_blocks(skb, pn, scratch, 1); 
    695   
    696                 if (ieee80211_aes_ccm_decrypt( 
    697 -                           key->u.ccmp.tfm, key->u.ccmp.rx_crypto_buf, 
    698 +                           key->u.ccmp.tfm, scratch, 
    699                             skb->data + hdrlen + CCMP_HDR_LEN, data_len, 
    700                             skb->data + skb->len - CCMP_MIC_LEN, 
    701                             skb->data + hdrlen + CCMP_HDR_LEN)) 
    702 --- a/drivers/net/wireless/b43/xmit.c 
    703 +++ b/drivers/net/wireless/b43/xmit.c 
    704 @@ -323,8 +323,7 @@ int b43_generate_txhdr(struct b43_wldev  
    705                         /* we give the phase1key and iv16 here, the key is stored in 
    706                          * shm. With that the hardware can do phase 2 and encryption. 
    707                          */ 
    708 -                       ieee80211_get_tkip_key(info->control.hw_key, skb_frag, 
    709 -                                       IEEE80211_TKIP_P1_KEY, (u8*)phase1key); 
    710 +                       ieee80211_get_tkip_p1k(info->control.hw_key, skb_frag, phase1key); 
    711                         /* phase1key is in host endian. Copy to little-endian txhdr->iv. */ 
    712                         for (i = 0; i < 5; i++) { 
    713                                 txhdr->iv[i * 2 + 0] = phase1key[i]; 
    714 --- a/drivers/net/wireless/iwlegacy/iwl-4965-tx.c 
    715 +++ b/drivers/net/wireless/iwlegacy/iwl-4965-tx.c 
    716 @@ -240,8 +240,7 @@ static void iwl4965_tx_cmd_build_hwcrypt 
    717   
    718         case WLAN_CIPHER_SUITE_TKIP: 
    719                 tx_cmd->sec_ctl = TX_CMD_SEC_TKIP; 
    720 -               ieee80211_get_tkip_key(keyconf, skb_frag, 
    721 -                       IEEE80211_TKIP_P2_KEY, tx_cmd->key); 
    722 +               ieee80211_get_tkip_p2k(keyconf, skb_frag, tx_cmd->key); 
    723                 IWL_DEBUG_TX(priv, "tx_cmd with tkip hwcrypto\n"); 
    724                 break; 
    725   
    726 --- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c 
    727 +++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c 
    728 @@ -497,8 +497,7 @@ static void iwlagn_tx_cmd_build_hwcrypto 
    729   
    730         case WLAN_CIPHER_SUITE_TKIP: 
    731                 tx_cmd->sec_ctl = TX_CMD_SEC_TKIP; 
    732 -               ieee80211_get_tkip_key(keyconf, skb_frag, 
    733 -                       IEEE80211_TKIP_P2_KEY, tx_cmd->key); 
    734 +               ieee80211_get_tkip_p2k(keyconf, skb_frag, tx_cmd->key); 
    735                 IWL_DEBUG_TX(priv, "tx_cmd with tkip hwcrypto\n"); 
    736                 break; 
    737   
    738 --- a/include/net/mac80211.h 
    739 +++ b/include/net/mac80211.h 
    740 @@ -960,21 +960,6 @@ enum sta_notify_cmd { 
    741  }; 
    742   
    743  /** 
    744 - * enum ieee80211_tkip_key_type - get tkip key 
    745 - * 
    746 - * Used by drivers which need to get a tkip key for skb. Some drivers need a 
    747 - * phase 1 key, others need a phase 2 key. A single function allows the driver 
    748 - * to get the key, this enum indicates what type of key is required. 
    749 - * 
    750 - * @IEEE80211_TKIP_P1_KEY: the driver needs a phase 1 key 
    751 - * @IEEE80211_TKIP_P2_KEY: the driver needs a phase 2 key 
    752 - */ 
    753 -enum ieee80211_tkip_key_type { 
    754 -       IEEE80211_TKIP_P1_KEY, 
    755 -       IEEE80211_TKIP_P2_KEY, 
    756 -}; 
    757 - 
    758 -/** 
    759   * enum ieee80211_hw_flags - hardware flags 
    760   * 
    761   * These flags are used to indicate hardware capabilities to 
    762 @@ -2568,21 +2553,33 @@ struct sk_buff * 
    763  ieee80211_get_buffered_bc(struct ieee80211_hw *hw, struct ieee80211_vif *vif); 
    764   
    765  /** 
    766 - * ieee80211_get_tkip_key - get a TKIP rc4 for skb 
    767 + * ieee80211_get_tkip_p1k - get a TKIP phase 1 key 
    768 + * 
    769 + * This function returns the TKIP phase 1 key for the IV32 taken 
    770 + * from the given packet. 
    771 + * 
    772 + * @keyconf: the parameter passed with the set key 
    773 + * @skb: the packet to take the IV32 value from that will be encrypted 
    774 + *     with this P1K 
    775 + * @p1k: a buffer to which the key will be written, as 5 u16 values 
    776 + */ 
    777 +void ieee80211_get_tkip_p1k(struct ieee80211_key_conf *keyconf, 
    778 +                           struct sk_buff *skb, u16 *p1k); 
    779 + 
    780 +/** 
    781 + * ieee80211_get_tkip_p2k - get a TKIP phase 2 key 
    782   * 
    783 - * This function computes a TKIP rc4 key for an skb. It computes 
    784 - * a phase 1 key if needed (iv16 wraps around). This function is to 
    785 - * be used by drivers which can do HW encryption but need to compute 
    786 - * to phase 1/2 key in SW. 
    787 + * This function computes the TKIP RC4 key for the IV values 
    788 + * in the packet. 
    789   * 
    790   * @keyconf: the parameter passed with the set key 
    791 - * @skb: the skb for which the key is needed 
    792 - * @type: TBD 
    793 - * @key: a buffer to which the key will be written 
    794 - */ 
    795 -void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf, 
    796 -                               struct sk_buff *skb, 
    797 -                               enum ieee80211_tkip_key_type type, u8 *key); 
    798 + * @skb: the packet to take the IV32/IV16 values from that will be 
    799 + *     encrypted with this key 
    800 + * @p2k: a buffer to which the key will be written, 16 bytes 
    801 + */ 
    802 +void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf, 
    803 +                           struct sk_buff *skb, u8 *p2k); 
    804 + 
    805  /** 
    806   * ieee80211_wake_queue - wake specific queue 
    807   * @hw: pointer as obtained from ieee80211_alloc_hw(). 
    808 --- a/net/mac80211/key.c 
    809 +++ b/net/mac80211/key.c 
    810 @@ -333,6 +333,7 @@ struct ieee80211_key *ieee80211_key_allo 
    811                                         get_unaligned_le16(seq); 
    812                         } 
    813                 } 
    814 +               spin_lock_init(&key->u.tkip.txlock); 
    815                 break; 
    816         case WLAN_CIPHER_SUITE_CCMP: 
    817                 key->conf.iv_len = CCMP_HDR_LEN; 
    818 --- a/net/mac80211/key.h 
    819 +++ b/net/mac80211/key.h 
    820 @@ -52,9 +52,10 @@ enum ieee80211_internal_tkip_state { 
    821  }; 
    822   
    823  struct tkip_ctx { 
    824 -       u32 iv32; 
    825 -       u16 iv16; 
    826 -       u16 p1k[5]; 
    827 +       u32 iv32;       /* current iv32 */ 
    828 +       u16 iv16;       /* current iv16 */ 
    829 +       u16 p1k[5];     /* p1k cache */ 
    830 +       u32 p1k_iv32;   /* iv32 for which p1k computed */ 
    831         enum ieee80211_internal_tkip_state state; 
    832  }; 
    833   
    834 @@ -71,6 +72,9 @@ struct ieee80211_key { 
    835   
    836         union { 
    837                 struct { 
    838 +                       /* protects tx context */ 
    839 +                       spinlock_t txlock; 
    840 + 
    841                         /* last used TSC */ 
    842                         struct tkip_ctx tx; 
    843   
    844 @@ -78,7 +82,7 @@ struct ieee80211_key { 
    845                         struct tkip_ctx rx[NUM_RX_DATA_QUEUES]; 
    846                 } tkip; 
    847                 struct { 
    848 -                       u8 tx_pn[6]; 
    849 +                       atomic64_t tx_pn; 
    850                         /* 
    851                          * Last received packet number. The first 
    852                          * NUM_RX_DATA_QUEUES counters are used with Data 
    853 @@ -88,12 +92,9 @@ struct ieee80211_key { 
    854                         u8 rx_pn[NUM_RX_DATA_QUEUES + 1][6]; 
    855                         struct crypto_cipher *tfm; 
    856                         u32 replays; /* dot11RSNAStatsCCMPReplays */ 
    857 -                       /* scratch buffers for virt_to_page() (crypto API) */ 
    858  #ifndef AES_BLOCK_LEN 
    859  #define AES_BLOCK_LEN 16 
    860  #endif 
    861 -                       u8 tx_crypto_buf[6 * AES_BLOCK_LEN]; 
    862 -                       u8 rx_crypto_buf[6 * AES_BLOCK_LEN]; 
    863                 } ccmp; 
    864                 struct { 
    865                         u8 tx_pn[6]; 
    866 --- a/net/mac80211/tkip.c 
    867 +++ b/net/mac80211/tkip.c 
    868 @@ -101,6 +101,7 @@ static void tkip_mixing_phase1(const u8  
    869                 p1k[4] += tkipS(p1k[3] ^ get_unaligned_le16(tk + 0 + j)) + i; 
    870         } 
    871         ctx->state = TKIP_STATE_PHASE1_DONE; 
    872 +       ctx->p1k_iv32 = tsc_IV32; 
    873  } 
    874   
    875  static void tkip_mixing_phase2(const u8 *tk, struct tkip_ctx *ctx, 
    876 @@ -140,60 +141,72 @@ static void tkip_mixing_phase2(const u8  
    877  /* Add TKIP IV and Ext. IV at @pos. @iv0, @iv1, and @iv2 are the first octets 
    878   * of the IV. Returns pointer to the octet following IVs (i.e., beginning of 
    879   * the packet payload). */ 
    880 -u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16) 
    881 +u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key) 
    882  { 
    883 -       pos = write_tkip_iv(pos, iv16); 
    884 +       lockdep_assert_held(&key->u.tkip.txlock); 
    885 + 
    886 +       pos = write_tkip_iv(pos, key->u.tkip.tx.iv16); 
    887         *pos++ = (key->conf.keyidx << 6) | (1 << 5) /* Ext IV */; 
    888         put_unaligned_le32(key->u.tkip.tx.iv32, pos); 
    889         return pos + 4; 
    890  } 
    891   
    892 -void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf, 
    893 -                       struct sk_buff *skb, enum ieee80211_tkip_key_type type, 
    894 -                       u8 *outkey) 
    895 +static void ieee80211_compute_tkip_p1k(struct ieee80211_key *key, u32 iv32) 
    896  { 
    897 -       struct ieee80211_key *key = (struct ieee80211_key *) 
    898 -                       container_of(keyconf, struct ieee80211_key, conf); 
    899 -       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    900 -       u8 *data; 
    901 -       const u8 *tk; 
    902 -       struct tkip_ctx *ctx; 
    903 -       u16 iv16; 
    904 -       u32 iv32; 
    905 - 
    906 -       data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control); 
    907 -       iv16 = data[2] | (data[0] << 8); 
    908 -       iv32 = get_unaligned_le32(&data[4]); 
    909 - 
    910 -       tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; 
    911 -       ctx = &key->u.tkip.tx; 
    912 - 
    913 -#ifdef CONFIG_MAC80211_TKIP_DEBUG 
    914 -       printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n", 
    915 -                       iv16, iv32); 
    916 +       struct ieee80211_sub_if_data *sdata = key->sdata; 
    917 +       struct tkip_ctx *ctx = &key->u.tkip.tx; 
    918 +       const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; 
    919   
    920 -       if (iv32 != ctx->iv32) { 
    921 -               printk(KERN_DEBUG "skb: iv32 = 0x%08x key: iv32 = 0x%08x\n", 
    922 -                       iv32, ctx->iv32); 
    923 -               printk(KERN_DEBUG "Wrap around of iv16 in the middle of a " 
    924 -                       "fragmented packet\n"); 
    925 -       } 
    926 -#endif 
    927 +       lockdep_assert_held(&key->u.tkip.txlock); 
    928   
    929 -       /* Update the p1k only when the iv16 in the packet wraps around, this 
    930 -        * might occur after the wrap around of iv16 in the key in case of 
    931 -        * fragmented packets. */ 
    932 -       if (iv16 == 0 || ctx->state == TKIP_STATE_NOT_INIT) 
    933 -               tkip_mixing_phase1(tk, ctx, hdr->addr2, iv32); 
    934 +       /* 
    935 +        * Update the P1K when the IV32 is different from the value it 
    936 +        * had when we last computed it (or when not initialised yet). 
    937 +        * This might flip-flop back and forth if packets are processed 
    938 +        * out-of-order due to the different ACs, but then we have to 
    939 +        * just compute the P1K more often. 
    940 +        */ 
    941 +       if (ctx->p1k_iv32 != iv32 || ctx->state == TKIP_STATE_NOT_INIT) 
    942 +               tkip_mixing_phase1(tk, ctx, sdata->vif.addr, iv32); 
    943 +} 
    944   
    945 -       if (type == IEEE80211_TKIP_P1_KEY) { 
    946 -               memcpy(outkey, ctx->p1k, sizeof(u16) * 5); 
    947 -               return; 
    948 -       } 
    949 +void ieee80211_get_tkip_p1k(struct ieee80211_key_conf *keyconf, 
    950 +                           struct sk_buff *skb, u16 *p1k) 
    951 +{ 
    952 +       struct ieee80211_key *key = (struct ieee80211_key *) 
    953 +                       container_of(keyconf, struct ieee80211_key, conf); 
    954 +       struct tkip_ctx *ctx = &key->u.tkip.tx; 
    955 +       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    956 +       const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control); 
    957 +       u32 iv32 = get_unaligned_le32(&data[4]); 
    958 +       unsigned long flags; 
    959 + 
    960 +       spin_lock_irqsave(&key->u.tkip.txlock, flags); 
    961 +       ieee80211_compute_tkip_p1k(key, iv32); 
    962 +       memcpy(p1k, ctx->p1k, sizeof(ctx->p1k)); 
    963 +       spin_unlock_irqrestore(&key->u.tkip.txlock, flags); 
    964 +} 
    965 +EXPORT_SYMBOL(ieee80211_get_tkip_p1k); 
    966   
    967 -       tkip_mixing_phase2(tk, ctx, iv16, outkey); 
    968 +void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf, 
    969 +                           struct sk_buff *skb, u8 *p2k) 
    970 +{ 
    971 +       struct ieee80211_key *key = (struct ieee80211_key *) 
    972 +                       container_of(keyconf, struct ieee80211_key, conf); 
    973 +       const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; 
    974 +       struct tkip_ctx *ctx = &key->u.tkip.tx; 
    975 +       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    976 +       const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control); 
    977 +       u32 iv32 = get_unaligned_le32(&data[4]); 
    978 +       u16 iv16 = data[2] | (data[0] << 8); 
    979 +       unsigned long flags; 
    980 + 
    981 +       spin_lock_irqsave(&key->u.tkip.txlock, flags); 
    982 +       ieee80211_compute_tkip_p1k(key, iv32); 
    983 +       tkip_mixing_phase2(tk, ctx, iv16, p2k); 
    984 +       spin_unlock_irqrestore(&key->u.tkip.txlock, flags); 
    985  } 
    986 -EXPORT_SYMBOL(ieee80211_get_tkip_key); 
    987 +EXPORT_SYMBOL(ieee80211_get_tkip_p2k); 
    988   
    989  /* 
    990   * Encrypt packet payload with TKIP using @key. @pos is a pointer to the 
    991 @@ -204,19 +217,15 @@ EXPORT_SYMBOL(ieee80211_get_tkip_key); 
    992   */ 
    993  int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm, 
    994                                 struct ieee80211_key *key, 
    995 -                               u8 *pos, size_t payload_len, u8 *ta) 
    996 +                               struct sk_buff *skb, 
    997 +                               u8 *payload, size_t payload_len) 
    998  { 
    999         u8 rc4key[16]; 
    1000 -       struct tkip_ctx *ctx = &key->u.tkip.tx; 
    1001 -       const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; 
    1002 - 
    1003 -       /* Calculate per-packet key */ 
    1004 -       if (ctx->iv16 == 0 || ctx->state == TKIP_STATE_NOT_INIT) 
    1005 -               tkip_mixing_phase1(tk, ctx, ta, ctx->iv32); 
    1006   
    1007 -       tkip_mixing_phase2(tk, ctx, ctx->iv16, rc4key); 
    1008 +       ieee80211_get_tkip_p2k(&key->conf, skb, rc4key); 
    1009   
    1010 -       return ieee80211_wep_encrypt_data(tfm, rc4key, 16, pos, payload_len); 
    1011 +       return ieee80211_wep_encrypt_data(tfm, rc4key, 16, 
    1012 +                                         payload, payload_len); 
    1013  } 
    1014   
    1015  /* Decrypt packet payload with TKIP using @key. @pos is a pointer to the 
    1016 --- a/net/mac80211/tkip.h 
    1017 +++ b/net/mac80211/tkip.h 
    1018 @@ -13,11 +13,13 @@ 
    1019  #include <linux/crypto.h> 
    1020  #include "key.h" 
    1021   
    1022 -u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key, u16 iv16); 
    1023 +u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key); 
    1024   
    1025  int ieee80211_tkip_encrypt_data(struct crypto_cipher *tfm, 
    1026 -                                struct ieee80211_key *key, 
    1027 -                                u8 *pos, size_t payload_len, u8 *ta); 
    1028 +                               struct ieee80211_key *key, 
    1029 +                               struct sk_buff *skb, 
    1030 +                               u8 *payload, size_t payload_len); 
    1031 + 
    1032  enum { 
    1033         TKIP_DECRYPT_OK = 0, 
    1034         TKIP_DECRYPT_NO_EXT_IV = -1, 
    1035 --- a/net/mac80211/cfg.c 
    1036 +++ b/net/mac80211/cfg.c 
    1037 @@ -209,6 +209,7 @@ static int ieee80211_get_key(struct wiph 
    1038         u8 seq[6] = {0}; 
    1039         struct key_params params; 
    1040         struct ieee80211_key *key = NULL; 
    1041 +       u64 pn64; 
    1042         u32 iv32; 
    1043         u16 iv16; 
    1044         int err = -ENOENT; 
    1045 @@ -256,12 +257,13 @@ static int ieee80211_get_key(struct wiph 
    1046                 params.seq_len = 6; 
    1047                 break; 
    1048         case WLAN_CIPHER_SUITE_CCMP: 
    1049 -               seq[0] = key->u.ccmp.tx_pn[5]; 
    1050 -               seq[1] = key->u.ccmp.tx_pn[4]; 
    1051 -               seq[2] = key->u.ccmp.tx_pn[3]; 
    1052 -               seq[3] = key->u.ccmp.tx_pn[2]; 
    1053 -               seq[4] = key->u.ccmp.tx_pn[1]; 
    1054 -               seq[5] = key->u.ccmp.tx_pn[0]; 
    1055 +               pn64 = atomic64_read(&key->u.ccmp.tx_pn); 
    1056 +               seq[0] = pn64; 
    1057 +               seq[1] = pn64 >> 8; 
    1058 +               seq[2] = pn64 >> 16; 
    1059 +               seq[3] = pn64 >> 24; 
    1060 +               seq[4] = pn64 >> 32; 
    1061 +               seq[5] = pn64 >> 40; 
    1062                 params.seq = seq; 
    1063                 params.seq_len = 6; 
    1064                 break; 
    1065 --- a/net/mac80211/debugfs_key.c 
    1066 +++ b/net/mac80211/debugfs_key.c 
    1067 @@ -79,6 +79,7 @@ static ssize_t key_tx_spec_read(struct f 
    1068                                 size_t count, loff_t *ppos) 
    1069  { 
    1070         const u8 *tpn; 
    1071 +       u64 pn; 
    1072         char buf[20]; 
    1073         int len; 
    1074         struct ieee80211_key *key = file->private_data; 
    1075 @@ -94,9 +95,10 @@ static ssize_t key_tx_spec_read(struct f 
    1076                                 key->u.tkip.tx.iv16); 
    1077                 break; 
    1078         case WLAN_CIPHER_SUITE_CCMP: 
    1079 -               tpn = key->u.ccmp.tx_pn; 
    1080 +               pn = atomic64_read(&key->u.ccmp.tx_pn); 
    1081                 len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n", 
    1082 -                               tpn[0], tpn[1], tpn[2], tpn[3], tpn[4], tpn[5]); 
    1083 +                               (u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24), 
    1084 +                               (u8)(pn >> 16), (u8)(pn >> 8), (u8)pn); 
    1085                 break; 
    1086         case WLAN_CIPHER_SUITE_AES_CMAC: 
    1087                 tpn = key->u.aes_cmac.tx_pn; 
    1088 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h 
    1089 +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h 
    1090 @@ -653,8 +653,8 @@ static const u32 ar9300_2p2_baseband_pos 
    1091         {0x0000a288, 0x00000110, 0x00000110, 0x00000110, 0x00000110}, 
    1092         {0x0000a28c, 0x00022222, 0x00022222, 0x00022222, 0x00022222}, 
    1093         {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18}, 
    1094 -       {0x0000a2d0, 0x00071981, 0x00071981, 0x00071981, 0x00071982}, 
    1095 -       {0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a}, 
    1096 +       {0x0000a2d0, 0x00041981, 0x00041981, 0x00041981, 0x00041982}, 
    1097 +       {0x0000a2d8, 0x7999a83b, 0x7999a83b, 0x7999a83b, 0x7999a83b}, 
    1098         {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, 
    1099         {0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, 
    1100         {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x001c0000}, 
    1101 @@ -761,7 +761,7 @@ static const u32 ar9300_2p2_baseband_cor 
    1102         {0x0000a3ec, 0x20202020}, 
    1103         {0x0000a3f0, 0x00000000}, 
    1104         {0x0000a3f4, 0x00000246}, 
    1105 -       {0x0000a3f8, 0x0cdbd380}, 
    1106 +       {0x0000a3f8, 0x0c9bd380}, 
    1107         {0x0000a3fc, 0x000f0f01}, 
    1108         {0x0000a400, 0x8fa91f01}, 
    1109         {0x0000a404, 0x00000000}, 
    1110 @@ -780,7 +780,7 @@ static const u32 ar9300_2p2_baseband_cor 
    1111         {0x0000a43c, 0x00100000}, 
    1112         {0x0000a440, 0x00000000}, 
    1113         {0x0000a444, 0x00000000}, 
    1114 -       {0x0000a448, 0x06000080}, 
    1115 +       {0x0000a448, 0x05000080}, 
    1116         {0x0000a44c, 0x00000001}, 
    1117         {0x0000a450, 0x00010000}, 
    1118         {0x0000a458, 0x00000000}, 
    1119 @@ -1500,8 +1500,6 @@ static const u32 ar9300_2p2_mac_core[][2 
    1120         {0x0000816c, 0x00000000}, 
    1121         {0x000081c0, 0x00000000}, 
    1122         {0x000081c4, 0x33332210}, 
    1123 -       {0x000081c8, 0x00000000}, 
    1124 -       {0x000081cc, 0x00000000}, 
    1125         {0x000081ec, 0x00000000}, 
    1126         {0x000081f0, 0x00000000}, 
    1127         {0x000081f4, 0x00000000}, 
    1128 --- a/net/mac80211/work.c 
    1129 +++ b/net/mac80211/work.c 
    1130 @@ -1075,14 +1075,13 @@ static void ieee80211_work_work(struct w 
    1131                         continue; 
    1132                 if (wk->chan != local->tmp_channel) 
    1133                         continue; 
    1134 -               if (ieee80211_work_ct_coexists(wk->chan_type, 
    1135 -                                              local->tmp_channel_type)) 
    1136 +               if (!ieee80211_work_ct_coexists(wk->chan_type, 
    1137 +                                               local->tmp_channel_type)) 
    1138                         continue; 
    1139                 remain_off_channel = true; 
    1140         } 
    1141   
    1142         if (!remain_off_channel && local->tmp_channel) { 
    1143 -               bool on_oper_chan = ieee80211_cfg_on_oper_channel(local); 
    1144                 local->tmp_channel = NULL; 
    1145                 /* If tmp_channel wasn't operating channel, then 
    1146                  * we need to go back on-channel. 
    1147 @@ -1092,7 +1091,7 @@ static void ieee80211_work_work(struct w 
    1148                  * we still need to do a hardware config.  Currently, 
    1149                  * we cannot be here while scanning, however. 
    1150                  */ 
    1151 -               if (ieee80211_cfg_on_oper_channel(local) && !on_oper_chan) 
    1152 +               if (!ieee80211_cfg_on_oper_channel(local)) 
    1153                         ieee80211_hw_config(local, 0); 
    1154   
    1155                 /* At the least, we need to disable offchannel_ps, 
    1156 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    1157 +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    1158 @@ -627,6 +627,11 @@ static void ar5008_hw_init_bb(struct ath 
    1159         else 
    1160                 synthDelay /= 10; 
    1161   
    1162 +       if (IS_CHAN_HALF_RATE(chan)) 
    1163 +               synthDelay *= 2; 
    1164 +       else if (IS_CHAN_QUARTER_RATE(chan)) 
    1165 +               synthDelay *= 4; 
    1166 + 
    1167         REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN); 
    1168   
    1169         udelay(synthDelay + BASE_ACTIVATE_DELAY); 
    1170 --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c 
    1171 +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c 
    1172 @@ -499,45 +499,6 @@ void ar9002_hw_enable_async_fifo(struct  
    1173         } 
    1174  } 
    1175   
    1176 -/* 
    1177 - * If Async FIFO is enabled, the following counters change as MAC now runs 
    1178 - * at 117 Mhz instead of 88/44MHz when async FIFO is disabled. 
    1179 - * 
    1180 - * The values below tested for ht40 2 chain. 
    1181 - * Overwrite the delay/timeouts initialized in process ini. 
    1182 - */ 
    1183 -void ar9002_hw_update_async_fifo(struct ath_hw *ah) 
    1184 -{ 
    1185 -       if (AR_SREV_9287_13_OR_LATER(ah)) { 
    1186 -               REG_WRITE(ah, AR_D_GBL_IFS_SIFS, 
    1187 -                         AR_D_GBL_IFS_SIFS_ASYNC_FIFO_DUR); 
    1188 -               REG_WRITE(ah, AR_D_GBL_IFS_SLOT, 
    1189 -                         AR_D_GBL_IFS_SLOT_ASYNC_FIFO_DUR); 
    1190 -               REG_WRITE(ah, AR_D_GBL_IFS_EIFS, 
    1191 -                         AR_D_GBL_IFS_EIFS_ASYNC_FIFO_DUR); 
    1192 - 
    1193 -               REG_WRITE(ah, AR_TIME_OUT, AR_TIME_OUT_ACK_CTS_ASYNC_FIFO_DUR); 
    1194 -               REG_WRITE(ah, AR_USEC, AR_USEC_ASYNC_FIFO_DUR); 
    1195 - 
    1196 -               REG_SET_BIT(ah, AR_MAC_PCU_LOGIC_ANALYZER, 
    1197 -                           AR_MAC_PCU_LOGIC_ANALYZER_DISBUG20768); 
    1198 -               REG_RMW_FIELD(ah, AR_AHB_MODE, AR_AHB_CUSTOM_BURST_EN, 
    1199 -                             AR_AHB_CUSTOM_BURST_ASYNC_FIFO_VAL); 
    1200 -       } 
    1201 -} 
    1202 - 
    1203 -/* 
    1204 - * We don't enable WEP aggregation on mac80211 but we keep this 
    1205 - * around for HAL unification purposes. 
    1206 - */ 
    1207 -void ar9002_hw_enable_wep_aggregation(struct ath_hw *ah) 
    1208 -{ 
    1209 -       if (AR_SREV_9287_13_OR_LATER(ah)) { 
    1210 -               REG_SET_BIT(ah, AR_PCU_MISC_MODE2, 
    1211 -                           AR_PCU_MISC_MODE2_ENABLE_AGGWEP); 
    1212 -       } 
    1213 -} 
    1214 - 
    1215  /* Sets up the AR5008/AR9001/AR9002 hardware familiy callbacks */ 
    1216  void ar9002_hw_attach_ops(struct ath_hw *ah) 
    1217  { 
    1218 --- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c 
    1219 +++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c 
    1220 @@ -111,7 +111,9 @@ static int ar9002_hw_set_channel(struct  
    1221   
    1222                 switch (ah->eep_ops->get_eeprom(ah, EEP_FRAC_N_5G)) { 
    1223                 case 0: 
    1224 -                       if ((freq % 20) == 0) 
    1225 +                       if (IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan)) 
    1226 +                               aModeRefSel = 0; 
    1227 +                       else if ((freq % 20) == 0) 
    1228                                 aModeRefSel = 3; 
    1229                         else if ((freq % 10) == 0) 
    1230                                 aModeRefSel = 2; 
    1231 @@ -129,8 +131,9 @@ static int ar9002_hw_set_channel(struct  
    1232                         channelSel = CHANSEL_5G(freq); 
    1233   
    1234                         /* RefDivA setting */ 
    1235 -                       REG_RMW_FIELD(ah, AR_AN_SYNTH9, 
    1236 -                                     AR_AN_SYNTH9_REFDIVA, refDivA); 
    1237 +                       ath9k_hw_analog_shift_rmw(ah, AR_AN_SYNTH9, 
    1238 +                                     AR_AN_SYNTH9_REFDIVA, 
    1239 +                                     AR_AN_SYNTH9_REFDIVA_S, refDivA); 
    1240   
    1241                 } 
    1242   
    1243 @@ -447,26 +450,27 @@ static void ar9002_olc_init(struct ath_h 
    1244  static u32 ar9002_hw_compute_pll_control(struct ath_hw *ah, 
    1245                                          struct ath9k_channel *chan) 
    1246  { 
    1247 +       int ref_div = 5; 
    1248 +       int pll_div = 0x2c; 
    1249         u32 pll; 
    1250   
    1251 -       pll = SM(0x5, AR_RTC_9160_PLL_REFDIV); 
    1252 +       if (chan && IS_CHAN_5GHZ(chan) && !IS_CHAN_A_FAST_CLOCK(ah, chan)) { 
    1253 +               if (AR_SREV_9280_20(ah)) { 
    1254 +                       ref_div = 10; 
    1255 +                       pll_div = 0x50; 
    1256 +               } else { 
    1257 +                       pll_div = 0x28; 
    1258 +               } 
    1259 +       } 
    1260 + 
    1261 +       pll = SM(ref_div, AR_RTC_9160_PLL_REFDIV); 
    1262 +       pll |= SM(pll_div, AR_RTC_9160_PLL_DIV); 
    1263   
    1264         if (chan && IS_CHAN_HALF_RATE(chan)) 
    1265                 pll |= SM(0x1, AR_RTC_9160_PLL_CLKSEL); 
    1266         else if (chan && IS_CHAN_QUARTER_RATE(chan)) 
    1267                 pll |= SM(0x2, AR_RTC_9160_PLL_CLKSEL); 
    1268   
    1269 -       if (chan && IS_CHAN_5GHZ(chan)) { 
    1270 -               if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
    1271 -                       pll = 0x142c; 
    1272 -               else if (AR_SREV_9280_20(ah)) 
    1273 -                       pll = 0x2850; 
    1274 -               else 
    1275 -                       pll |= SM(0x28, AR_RTC_9160_PLL_DIV); 
    1276 -       } else { 
    1277 -               pll |= SM(0x2c, AR_RTC_9160_PLL_DIV); 
    1278 -       } 
    1279 - 
    1280         return pll; 
    1281  } 
    1282   
     248--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
     249+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
     250@@ -671,7 +671,7 @@ static int ar9003_hw_process_ini(struct  
     251                REG_WRITE_ARRAY(&ah->iniModesAdditional, 
     252                                modesIndex, regWrites); 
     253  
     254-       if (AR_SREV_9300(ah)) 
     255+       if (AR_SREV_9330(ah)) 
     256                REG_WRITE_ARRAY(&ah->iniModesAdditional, 1, regWrites); 
     257  
     258        if (AR_SREV_9340(ah) && !ah->is_clk_25mhz) 
    1283259--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1284260+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    1285 @@ -87,7 +87,10 @@ static void ath9k_hw_set_clockrate(struc 
    1286         struct ath_common *common = ath9k_hw_common(ah); 
    1287         unsigned int clockrate; 
    1288   
    1289 -       if (!ah->curchan) /* should really check for CCK instead */ 
    1290 +       /* AR9287 v1.3+ uses async FIFO and runs the MAC at 117 MHz */ 
    1291 +       if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah)) 
    1292 +               clockrate = 117; 
    1293 +       else if (!ah->curchan) /* should really check for CCK instead */ 
    1294                 clockrate = ATH9K_CLOCK_RATE_CCK; 
    1295         else if (conf->channel->band == IEEE80211_BAND_2GHZ) 
    1296                 clockrate = ATH9K_CLOCK_RATE_2GHZ_OFDM; 
    1297 @@ -99,6 +102,13 @@ static void ath9k_hw_set_clockrate(struc 
    1298         if (conf_is_ht40(conf)) 
    1299                 clockrate *= 2; 
    1300   
    1301 +       if (ah->curchan) { 
    1302 +               if (IS_CHAN_HALF_RATE(ah->curchan)) 
    1303 +                       clockrate /= 2; 
    1304 +               if (IS_CHAN_QUARTER_RATE(ah->curchan)) 
    1305 +                       clockrate /= 4; 
    1306 +       } 
    1307 + 
    1308         common->clockrate = clockrate; 
    1309  } 
    1310   
    1311 @@ -895,6 +905,13 @@ static void ath9k_hw_init_interrupt_mask 
    1312         } 
    1313  } 
    1314   
    1315 +static void ath9k_hw_set_sifs_time(struct ath_hw *ah, u32 us) 
    1316 +{ 
    1317 +       u32 val = ath9k_hw_mac_to_clks(ah, us - 2); 
    1318 +       val = min(val, (u32) 0xFFFF); 
    1319 +       REG_WRITE(ah, AR_D_GBL_IFS_SIFS, val); 
    1320 +} 
    1321 + 
    1322  static void ath9k_hw_setslottime(struct ath_hw *ah, u32 us) 
    1323  { 
    1324         u32 val = ath9k_hw_mac_to_clks(ah, us); 
    1325 @@ -932,25 +949,60 @@ static bool ath9k_hw_set_global_txtimeou 
    1326   
    1327  void ath9k_hw_init_global_settings(struct ath_hw *ah) 
    1328  { 
    1329 -       struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; 
    1330 +       struct ath_common *common = ath9k_hw_common(ah); 
    1331 +       struct ieee80211_conf *conf = &common->hw->conf; 
    1332 +       const struct ath9k_channel *chan = ah->curchan; 
    1333         int acktimeout; 
    1334         int slottime; 
    1335         int sifstime; 
    1336 +       int rx_lat = 0, tx_lat = 0, eifs = 0; 
    1337 +       u32 reg; 
    1338   
    1339         ath_dbg(ath9k_hw_common(ah), ATH_DBG_RESET, "ah->misc_mode 0x%x\n", 
    1340                 ah->misc_mode); 
    1341   
    1342 +       if (!chan) 
    1343 +               return; 
    1344 + 
     261@@ -975,7 +975,10 @@ void ath9k_hw_init_global_settings(struc 
    1345262        if (ah->misc_mode != 0) 
    1346263                REG_SET_BIT(ah, AR_PCU_MISC, ah->misc_mode); 
    1347264  
    1348 -       if (conf->channel && conf->channel->band == IEEE80211_BAND_5GHZ) 
    1349 -               sifstime = 16; 
    1350 -       else 
    1351 -               sifstime = 10; 
    1352 +       rx_lat = 37; 
    1353 +       tx_lat = 54; 
    1354 + 
    1355 +       if (IS_CHAN_HALF_RATE(chan)) { 
    1356 +               eifs = 175; 
    1357 +               rx_lat *= 2; 
    1358 +               tx_lat *= 2; 
    1359 +               if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
    1360 +                   tx_lat += 11; 
    1361 + 
    1362 +               slottime = 13; 
    1363 +               sifstime = 32; 
    1364 +       } else if (IS_CHAN_QUARTER_RATE(chan)) { 
    1365 +               eifs = 340; 
    1366 +               rx_lat *= 4; 
    1367 +               tx_lat *= 4; 
    1368 +               if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
    1369 +                   tx_lat += 22; 
    1370 + 
    1371 +               slottime = 21; 
    1372 +               sifstime = 64; 
    1373 +       } else { 
    1374 +               eifs = REG_READ(ah, AR_D_GBL_IFS_EIFS); 
    1375 +               reg = REG_READ(ah, AR_USEC); 
    1376 +               rx_lat = MS(reg, AR_USEC_RX_LAT); 
    1377 +               tx_lat = MS(reg, AR_USEC_TX_LAT); 
    1378 + 
    1379 +               slottime = ah->slottime; 
    1380 +               if (IS_CHAN_5GHZ(chan)) 
    1381 +                       sifstime = 16; 
    1382 +               else 
    1383 +                       sifstime = 10; 
    1384 +       } 
    1385   
    1386         /* As defined by IEEE 802.11-2007 17.3.8.6 */ 
    1387 -       slottime = ah->slottime + 3 * ah->coverage_class; 
    1388 -       acktimeout = slottime + sifstime; 
    1389 +       acktimeout = slottime + sifstime + 3 * ah->coverage_class; 
    1390   
    1391         /* 
    1392          * Workaround for early ACK timeouts, add an offset to match the 
    1393 @@ -962,11 +1014,20 @@ void ath9k_hw_init_global_settings(struc 
    1394         if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) 
    1395                 acktimeout += 64 - sifstime - ah->slottime; 
    1396   
    1397 -       ath9k_hw_setslottime(ah, ah->slottime); 
    1398 +       ath9k_hw_set_sifs_time(ah, sifstime); 
    1399 +       ath9k_hw_setslottime(ah, slottime); 
    1400         ath9k_hw_set_ack_timeout(ah, acktimeout); 
    1401         ath9k_hw_set_cts_timeout(ah, acktimeout); 
    1402         if (ah->globaltxtimeout != (u32) -1) 
    1403                 ath9k_hw_set_global_txtimeout(ah, ah->globaltxtimeout); 
    1404 + 
    1405 +       REG_WRITE(ah, AR_D_GBL_IFS_EIFS, ath9k_hw_mac_to_clks(ah, eifs)); 
    1406 +       REG_RMW(ah, AR_USEC, 
    1407 +               (common->clockrate - 1) | 
    1408 +               SM(rx_lat, AR_USEC_RX_LAT) | 
    1409 +               SM(tx_lat, AR_USEC_TX_LAT), 
    1410 +               AR_USEC_TX_LAT | AR_USEC_RX_LAT | AR_USEC_USEC); 
    1411 + 
    1412  } 
    1413  EXPORT_SYMBOL(ath9k_hw_init_global_settings); 
    1414   
    1415 @@ -1570,9 +1631,13 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    1416   
    1417         ath9k_hw_init_global_settings(ah); 
    1418   
    1419 -       if (!AR_SREV_9300_20_OR_LATER(ah)) { 
    1420 -               ar9002_hw_update_async_fifo(ah); 
    1421 -               ar9002_hw_enable_wep_aggregation(ah); 
    1422 +       if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah)) { 
    1423 +               REG_SET_BIT(ah, AR_MAC_PCU_LOGIC_ANALYZER, 
    1424 +                           AR_MAC_PCU_LOGIC_ANALYZER_DISBUG20768); 
    1425 +               REG_RMW_FIELD(ah, AR_AHB_MODE, AR_AHB_CUSTOM_BURST_EN, 
    1426 +                             AR_AHB_CUSTOM_BURST_ASYNC_FIFO_VAL); 
    1427 +               REG_SET_BIT(ah, AR_PCU_MISC_MODE2, 
    1428 +                           AR_PCU_MISC_MODE2_ENABLE_AGGWEP); 
    1429         } 
    1430   
    1431         REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM); 
    1432 @@ -1932,12 +1997,22 @@ EXPORT_SYMBOL(ath9k_hw_set_sta_beacon_ti 
    1433  /* HW Capabilities */ 
    1434  /*******************/ 
    1435   
    1436 +static u8 fixup_chainmask(u8 chip_chainmask, u8 eeprom_chainmask) 
    1437 +{ 
    1438 +       eeprom_chainmask &= chip_chainmask; 
    1439 +       if (eeprom_chainmask) 
    1440 +               return eeprom_chainmask; 
     265-       rx_lat = 37; 
     266+       if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
     267+               rx_lat = 41; 
    1441268+       else 
    1442 +               return chip_chainmask; 
    1443 +} 
    1444 + 
    1445  int ath9k_hw_fill_cap_info(struct ath_hw *ah) 
    1446  { 
    1447         struct ath9k_hw_capabilities *pCap = &ah->caps; 
    1448         struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); 
    1449         struct ath_common *common = ath9k_hw_common(ah); 
    1450         struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw; 
    1451 +       unsigned int chip_chainmask; 
    1452   
    1453         u16 eeval; 
    1454         u8 ant_div_ctl1, tx_chainmask, rx_chainmask; 
    1455 @@ -1974,6 +2049,15 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    1456         if (eeval & AR5416_OPFLAGS_11G) 
    1457                 pCap->hw_caps |= ATH9K_HW_CAP_2GHZ; 
    1458   
    1459 +       if (AR_SREV_9485(ah) || AR_SREV_9285(ah) || AR_SREV_9330(ah)) 
    1460 +               chip_chainmask = 1; 
    1461 +       else if (!AR_SREV_9280_20_OR_LATER(ah)) 
    1462 +               chip_chainmask = 7; 
    1463 +       else if (!AR_SREV_9300_20_OR_LATER(ah) || AR_SREV_9340(ah)) 
    1464 +               chip_chainmask = 3; 
    1465 +       else 
    1466 +               chip_chainmask = 7; 
    1467 + 
    1468         pCap->tx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_TX_MASK); 
    1469         /* 
    1470          * For AR9271 we will temporarilly uses the rx chainmax as read from 
    1471 @@ -1990,6 +2074,9 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    1472                 /* Use rx_chainmask from EEPROM. */ 
    1473                 pCap->rx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_RX_MASK); 
    1474   
    1475 +       pCap->tx_chainmask = fixup_chainmask(chip_chainmask, pCap->tx_chainmask); 
    1476 +       pCap->rx_chainmask = fixup_chainmask(chip_chainmask, pCap->rx_chainmask); 
    1477 + 
    1478         ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA; 
    1479   
    1480         /* enable key search for every frame in an aggregate */ 
    1481 @@ -2079,10 +2166,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    1482                         pCap->hw_caps |= ATH9K_HW_CAP_PAPRD; 
     269+               rx_lat = 37; 
     270        tx_lat = 54; 
     271  
     272        if (IS_CHAN_HALF_RATE(chan)) { 
     273@@ -989,7 +992,7 @@ void ath9k_hw_init_global_settings(struc 
     274                sifstime = 32; 
     275        } else if (IS_CHAN_QUARTER_RATE(chan)) { 
     276                eifs = 340; 
     277-               rx_lat *= 4; 
     278+               rx_lat = (rx_lat * 4) - 1; 
     279                tx_lat *= 4; 
     280                if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
     281                    tx_lat += 22; 
     282@@ -997,8 +1000,14 @@ void ath9k_hw_init_global_settings(struc 
     283                slottime = 21; 
     284                sifstime = 64; 
    1483285        } else { 
    1484                 pCap->tx_desc_len = sizeof(struct ath_desc); 
    1485 -               if (AR_SREV_9280_20(ah) && 
    1486 -                   ((ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) <= 
    1487 -                     AR5416_EEP_MINOR_VER_16) || 
    1488 -                    ah->eep_ops->get_eeprom(ah, EEP_FSTCLK_5G))) 
    1489 +               if (AR_SREV_9280_20(ah)) 
    1490                         pCap->hw_caps |= ATH9K_HW_CAP_FASTCLOCK; 
    1491         } 
    1492   
    1493 --- a/drivers/net/wireless/ath/ath9k/hw.h 
    1494 +++ b/drivers/net/wireless/ath/ath9k/hw.h 
    1495 @@ -983,8 +983,6 @@ void ath9k_hw_get_delta_slope_vals(struc 
    1496  void ar9002_hw_cck_chan14_spread(struct ath_hw *ah); 
    1497  int ar9002_hw_rf_claim(struct ath_hw *ah); 
    1498  void ar9002_hw_enable_async_fifo(struct ath_hw *ah); 
    1499 -void ar9002_hw_update_async_fifo(struct ath_hw *ah); 
    1500 -void ar9002_hw_enable_wep_aggregation(struct ath_hw *ah); 
    1501   
    1502  /* 
    1503   * Code specific to AR9003, we stuff these here to avoid callbacks 
    1504 --- a/drivers/net/wireless/ath/ath9k/recv.c 
    1505 +++ b/drivers/net/wireless/ath/ath9k/recv.c 
    1506 @@ -814,16 +814,19 @@ static bool ath9k_rx_accept(struct ath_c 
    1507                             struct ath_rx_status *rx_stats, 
    1508                             bool *decrypt_error) 
    1509  { 
    1510 -#define is_mc_or_valid_tkip_keyix ((is_mc ||                   \ 
    1511 -               (rx_stats->rs_keyix != ATH9K_RXKEYIX_INVALID && \ 
    1512 -               test_bit(rx_stats->rs_keyix, common->tkip_keymap)))) 
    1513 - 
    1514 +       bool is_mc, is_valid_tkip, strip_mic, mic_error = false; 
    1515         struct ath_hw *ah = common->ah; 
    1516         __le16 fc; 
    1517         u8 rx_status_len = ah->caps.rx_status_len; 
    1518   
    1519         fc = hdr->frame_control; 
    1520   
    1521 +       is_mc = !!is_multicast_ether_addr(hdr->addr1); 
    1522 +       is_valid_tkip = rx_stats->rs_keyix != ATH9K_RXKEYIX_INVALID && 
    1523 +               test_bit(rx_stats->rs_keyix, common->tkip_keymap); 
    1524 +       strip_mic = is_valid_tkip && !(rx_stats->rs_status & 
    1525 +               (ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC)); 
    1526 + 
    1527         if (!rx_stats->rs_datalen) 
    1528                 return false; 
    1529          /* 
    1530 @@ -838,6 +841,11 @@ static bool ath9k_rx_accept(struct ath_c 
    1531         if (rx_stats->rs_more) 
    1532                 return true; 
    1533   
    1534 +       mic_error = is_valid_tkip && !ieee80211_is_ctl(fc) && 
    1535 +               !ieee80211_has_morefrags(fc) && 
    1536 +               !(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) && 
    1537 +               (rx_stats->rs_status & ATH9K_RXERR_MIC); 
    1538 + 
    1539         /* 
    1540          * The rx_stats->rs_status will not be set until the end of the 
    1541          * chained descriptors so it can be ignored if rs_more is set. The 
    1542 @@ -845,30 +853,18 @@ static bool ath9k_rx_accept(struct ath_c 
    1543          * descriptors. 
    1544          */ 
    1545         if (rx_stats->rs_status != 0) { 
    1546 -               if (rx_stats->rs_status & ATH9K_RXERR_CRC) 
    1547 +               if (rx_stats->rs_status & ATH9K_RXERR_CRC) { 
    1548                         rxs->flag |= RX_FLAG_FAILED_FCS_CRC; 
    1549 +                       mic_error = false; 
     286-               eifs = REG_READ(ah, AR_D_GBL_IFS_EIFS)/common->clockrate; 
     287-               reg = REG_READ(ah, AR_USEC); 
     288+               if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah)) { 
     289+                       eifs = AR_D_GBL_IFS_EIFS_ASYNC_FIFO; 
     290+                       reg = AR_USEC_ASYNC_FIFO; 
     291+               } else { 
     292+                       eifs = REG_READ(ah, AR_D_GBL_IFS_EIFS)/ 
     293+                               common->clockrate; 
     294+                       reg = REG_READ(ah, AR_USEC); 
    1550295+               } 
    1551                 if (rx_stats->rs_status & ATH9K_RXERR_PHY) 
    1552                         return false; 
    1553   
    1554                 if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) { 
    1555                         *decrypt_error = true; 
    1556 -               } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) { 
    1557 -                       bool is_mc; 
    1558 -                       /* 
    1559 -                        * The MIC error bit is only valid if the frame 
    1560 -                        * is not a control frame or fragment, and it was 
    1561 -                        * decrypted using a valid TKIP key. 
    1562 -                        */ 
    1563 -                       is_mc = !!is_multicast_ether_addr(hdr->addr1); 
    1564 - 
    1565 -                       if (!ieee80211_is_ctl(fc) && 
    1566 -                           !ieee80211_has_morefrags(fc) && 
    1567 -                           !(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) && 
    1568 -                           is_mc_or_valid_tkip_keyix) 
    1569 -                               rxs->flag |= RX_FLAG_MMIC_ERROR; 
    1570 -                       else 
    1571 -                               rx_stats->rs_status &= ~ATH9K_RXERR_MIC; 
    1572 +                       mic_error = false; 
    1573                 } 
    1574 + 
    1575                 /* 
    1576                  * Reject error frames with the exception of 
    1577                  * decryption and MIC failures. For monitor mode, 
    1578 @@ -886,6 +882,18 @@ static bool ath9k_rx_accept(struct ath_c 
    1579                         } 
    1580                 } 
    1581         } 
    1582 + 
    1583 +       /* 
    1584 +        * For unicast frames the MIC error bit can have false positives, 
    1585 +        * so all MIC error reports need to be validated in software. 
    1586 +        * False negatives are not common, so skip software verification 
    1587 +        * if the hardware considers the MIC valid. 
    1588 +        */ 
    1589 +       if (strip_mic) 
    1590 +               rxs->flag |= RX_FLAG_MMIC_STRIPPED; 
    1591 +       else if (is_mc && mic_error) 
    1592 +               rxs->flag |= RX_FLAG_MMIC_ERROR; 
    1593 + 
    1594         return true; 
    1595  } 
    1596   
    1597 @@ -1938,6 +1946,9 @@ int ath_rx_tasklet(struct ath_softc *sc, 
    1598                         sc->rx.rxotherant = 0; 
    1599                 } 
    1600   
    1601 +               if (rxs->flag & RX_FLAG_MMIC_STRIPPED) 
    1602 +                       skb_trim(skb, skb->len - 8); 
    1603 + 
    1604                 spin_lock_irqsave(&sc->sc_pm_lock, flags); 
    1605   
    1606                 if ((sc->ps_flags & (PS_WAIT_FOR_BEACON | 
     296                rx_lat = MS(reg, AR_USEC_RX_LAT); 
     297                tx_lat = MS(reg, AR_USEC_TX_LAT); 
     298  
    1607299--- a/drivers/net/wireless/ath/ath9k/reg.h 
    1608300+++ b/drivers/net/wireless/ath/ath9k/reg.h 
    1609 @@ -600,7 +600,6 @@ 
    1610   
    1611  #define AR_D_GBL_IFS_SIFS         0x1030 
    1612  #define AR_D_GBL_IFS_SIFS_M       0x0000FFFF 
    1613 -#define AR_D_GBL_IFS_SIFS_ASYNC_FIFO_DUR 0x000003AB 
    1614  #define AR_D_GBL_IFS_SIFS_RESV0   0xFFFFFFFF 
    1615   
    1616  #define AR_D_TXBLK_BASE            0x1038 
    1617 @@ -616,12 +615,10 @@ 
    1618  #define AR_D_GBL_IFS_SLOT         0x1070 
    1619  #define AR_D_GBL_IFS_SLOT_M       0x0000FFFF 
    1620  #define AR_D_GBL_IFS_SLOT_RESV0   0xFFFF0000 
    1621 -#define AR_D_GBL_IFS_SLOT_ASYNC_FIFO_DUR   0x00000420 
    1622   
     301@@ -619,6 +619,7 @@ 
    1623302 #define AR_D_GBL_IFS_EIFS         0x10b0 
    1624303 #define AR_D_GBL_IFS_EIFS_M       0x0000FFFF 
    1625304 #define AR_D_GBL_IFS_EIFS_RESV0   0xFFFF0000 
    1626 -#define AR_D_GBL_IFS_EIFS_ASYNC_FIFO_DUR   0x0000A5EB 
     305+#define AR_D_GBL_IFS_EIFS_ASYNC_FIFO 363 
    1627306  
    1628307 #define AR_D_GBL_IFS_MISC        0x10f0 
    1629308 #define AR_D_GBL_IFS_MISC_LFSR_SLICE_SEL        0x00000007 
    1630 @@ -1477,7 +1474,6 @@ enum { 
    1631  #define AR_TIME_OUT_ACK_S    0 
    1632  #define AR_TIME_OUT_CTS      0x3FFF0000 
    1633  #define AR_TIME_OUT_CTS_S    16 
    1634 -#define AR_TIME_OUT_ACK_CTS_ASYNC_FIFO_DUR    0x16001D56 
    1635   
    1636  #define AR_RSSI_THR          0x8018 
    1637  #define AR_RSSI_THR_MASK     0x000000FF 
    1638 @@ -1493,7 +1489,6 @@ enum { 
     309@@ -1503,6 +1504,7 @@ enum { 
    1639310 #define AR_USEC_TX_LAT_S     14 
    1640311 #define AR_USEC_RX_LAT       0x1F800000 
    1641312 #define AR_USEC_RX_LAT_S     23 
    1642 -#define AR_USEC_ASYNC_FIFO_DUR    0x12e00074 
     313+#define AR_USEC_ASYNC_FIFO   0x12E00074 
    1643314  
    1644315 #define AR_RESET_TSF        0x8020 
    1645316 #define AR_RESET_TSF_ONCE   0x01000000 
     317--- a/drivers/net/wireless/ath/ath9k/xmit.c 
     318+++ b/drivers/net/wireless/ath/ath9k/xmit.c 
     319@@ -582,7 +582,10 @@ static bool ath_lookup_legacy(struct ath 
     320        tx_info = IEEE80211_SKB_CB(skb); 
     321        rates = tx_info->control.rates; 
     322  
     323-       for (i = 3; i >= 0; i--) { 
     324+       for (i = 0; i < 4; i++) { 
     325+               if (!rates[i].count || rates[i].idx < 0) 
     326+                       break; 
     327+ 
     328                if (!(rates[i].flags & IEEE80211_TX_RC_MCS)) 
     329                        return true; 
     330        } 
  • branches/backfire/package/mac80211/patches/310-ibss_ht.patch

    r27431 r28138  
    11--- a/include/net/cfg80211.h 
    22+++ b/include/net/cfg80211.h 
    3 @@ -1038,6 +1038,7 @@ struct cfg80211_ibss_params { 
     3@@ -1085,6 +1085,7 @@ struct cfg80211_ibss_params { 
    44        u8 *ssid; 
    55        u8 *bssid; 
     
    99        u8 ssid_len, ie_len; 
    1010        u16 beacon_interval; 
    11 @@ -2539,6 +2540,12 @@ struct cfg80211_bss *cfg80211_get_bss(st 
     11@@ -2584,6 +2585,12 @@ struct cfg80211_bss *cfg80211_get_bss(st 
    1212                                      const u8 *bssid, 
    1313                                      const u8 *ssid, size_t ssid_len, 
     
    2222 cfg80211_get_ibss(struct wiphy *wiphy, 
    2323                  struct ieee80211_channel *channel, 
     24--- a/net/wireless/nl80211.c 
     25+++ b/net/wireless/nl80211.c 
     26@@ -4470,13 +4470,41 @@ static int nl80211_join_ibss(struct sk_b 
     27                ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 
     28        } 
     29  
     30-       ibss.channel = ieee80211_get_channel(wiphy, 
     31-               nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 
     32+       if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 
     33+               enum nl80211_channel_type channel_type; 
     34+ 
     35+               channel_type = nla_get_u32( 
     36+                       info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 
     37+               if (channel_type != NL80211_CHAN_NO_HT && 
     38+                   channel_type != NL80211_CHAN_HT20 && 
     39+                   channel_type != NL80211_CHAN_HT40PLUS && 
     40+                   channel_type != NL80211_CHAN_HT40MINUS) 
     41+                       return -EINVAL; 
     42+               ibss.channel_type = channel_type; 
     43+       } else { 
     44+               ibss.channel_type = NL80211_CHAN_NO_HT; 
     45+       } 
     46+ 
     47+       ibss.channel = rdev_freq_to_chan(rdev, 
     48+               nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]), 
     49+               ibss.channel_type); 
     50        if (!ibss.channel || 
     51+           ibss.channel->flags & IEEE80211_CHAN_PASSIVE_SCAN || 
     52            ibss.channel->flags & IEEE80211_CHAN_NO_IBSS || 
     53-           ibss.channel->flags & IEEE80211_CHAN_DISABLED) 
     54+           ibss.channel->flags & IEEE80211_CHAN_RADAR) 
     55                return -EINVAL; 
     56  
     57+       /* Both channels should be able to initiate communication */ 
     58+       if ((ibss.channel_type == NL80211_CHAN_HT40PLUS || 
     59+            ibss.channel_type == NL80211_CHAN_HT40MINUS) && 
     60+           !can_beacon_sec_chan(&rdev->wiphy, ibss.channel, 
     61+                                ibss.channel_type)) { 
     62+               printk(KERN_DEBUG 
     63+                      "cfg80211: Secondary channel not " 
     64+                      "allowed to initiate communication\n"); 
     65+               return -EINVAL; 
     66+       } 
     67+ 
     68        ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 
     69        ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 
     70  
     71--- a/net/wireless/chan.c 
     72+++ b/net/wireless/chan.c 
     73@@ -44,7 +44,7 @@ rdev_freq_to_chan(struct cfg80211_regist 
     74        return chan; 
     75 } 
     76  
     77-static bool can_beacon_sec_chan(struct wiphy *wiphy, 
     78+bool can_beacon_sec_chan(struct wiphy *wiphy, 
     79                                struct ieee80211_channel *chan, 
     80                                enum nl80211_channel_type channel_type) 
     81 { 
     82@@ -75,6 +75,7 @@ static bool can_beacon_sec_chan(struct w 
     83  
     84        return true; 
     85 } 
     86+EXPORT_SYMBOL(can_beacon_sec_chan); 
     87  
     88 int cfg80211_set_freq(struct cfg80211_registered_device *rdev, 
     89                      struct wireless_dev *wdev, int freq, 
     90--- a/net/wireless/core.h 
     91+++ b/net/wireless/core.h 
     92@@ -441,6 +441,9 @@ cfg80211_can_add_interface(struct cfg802 
     93 struct ieee80211_channel * 
     94 rdev_freq_to_chan(struct cfg80211_registered_device *rdev, 
     95                  int freq, enum nl80211_channel_type channel_type); 
     96+bool can_beacon_sec_chan(struct wiphy *wiphy, 
     97+                               struct ieee80211_channel *chan, 
     98+                               enum nl80211_channel_type channel_type); 
     99 int cfg80211_set_freq(struct cfg80211_registered_device *rdev, 
     100                      struct wireless_dev *wdev, int freq, 
     101                      enum nl80211_channel_type channel_type); 
     102--- a/net/wireless/scan.c 
     103+++ b/net/wireless/scan.c 
     104@@ -365,6 +365,19 @@ struct cfg80211_bss *cfg80211_get_bss(st 
     105                                      const u8 *ssid, size_t ssid_len, 
     106                                      u16 capa_mask, u16 capa_val) 
     107 { 
     108+       /* call HT version with no HT requirements */ 
     109+       return cfg80211_get_bss_ht(wiphy, channel, bssid, ssid, ssid_len, 
     110+                                  capa_mask, capa_val, NL80211_CHAN_NO_HT); 
     111+} 
     112+EXPORT_SYMBOL(cfg80211_get_bss); 
     113+ 
     114+struct cfg80211_bss *cfg80211_get_bss_ht(struct wiphy *wiphy, 
     115+                                     struct ieee80211_channel *channel, 
     116+                                     const u8 *bssid, 
     117+                                     const u8 *ssid, size_t ssid_len, 
     118+                                     u16 capa_mask, u16 capa_val, 
     119+                                     enum nl80211_channel_type require_ht) 
     120+{ 
     121        struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy); 
     122        struct cfg80211_internal_bss *bss, *res = NULL; 
     123        unsigned long now = jiffies; 
     124@@ -374,8 +387,26 @@ struct cfg80211_bss *cfg80211_get_bss(st 
     125        list_for_each_entry(bss, &dev->bss_list, list) { 
     126                if ((bss->pub.capability & capa_mask) != capa_val) 
     127                        continue; 
     128-               if (channel && bss->pub.channel != channel) 
     129-                       continue; 
     130+               if (channel) { 
     131+                       if (bss->pub.channel != channel) 
     132+                               continue; 
     133+                       if (require_ht != NL80211_CHAN_NO_HT) { 
     134+                               struct ieee80211_ht_info *ht_info; 
     135+                               ht_info = (struct ieee80211_ht_info *) 
     136+                                       ieee80211_bss_get_ie(&bss->pub, 
     137+                                                      WLAN_EID_HT_INFORMATION); 
     138+                               if (!ht_info) 
     139+                                       continue; 
     140+                               if (require_ht == NL80211_CHAN_HT40MINUS && 
     141+                                             !(ht_info->ht_param & 
     142+                                             IEEE80211_HT_PARAM_CHA_SEC_BELOW)) 
     143+                                       continue; 
     144+                               if (require_ht == NL80211_CHAN_HT40PLUS && 
     145+                                             !(ht_info->ht_param & 
     146+                                             IEEE80211_HT_PARAM_CHA_SEC_ABOVE)) 
     147+                                       continue; 
     148+                       } 
     149+               } 
     150                /* Don't get expired BSS structs */ 
     151                if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) && 
     152                    !atomic_read(&bss->hold)) 
     153@@ -392,7 +423,7 @@ struct cfg80211_bss *cfg80211_get_bss(st 
     154                return NULL; 
     155        return &res->pub; 
     156 } 
     157-EXPORT_SYMBOL(cfg80211_get_bss); 
     158+EXPORT_SYMBOL(cfg80211_get_bss_ht); 
     159  
     160 struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy, 
     161                                       struct ieee80211_channel *channel, 
    24162--- a/net/mac80211/ieee80211_i.h 
    25163+++ b/net/mac80211/ieee80211_i.h 
    26 @@ -439,6 +439,7 @@ struct ieee80211_if_ibss { 
     164@@ -464,6 +464,7 @@ struct ieee80211_if_ibss { 
    27165        u8 ssid_len, ie_len; 
    28166        u8 *ie; 
     
    32170        unsigned long ibss_join_req; 
    33171        /* probe response/beacon for IBSS */ 
    34 @@ -1121,6 +1122,7 @@ void ieee80211_ibss_notify_scan_complete 
     172@@ -1089,6 +1090,7 @@ void ieee80211_ibss_notify_scan_complete 
    35173 void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata); 
    36174 struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, 
     
    40178 int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, 
    41179                        struct cfg80211_ibss_params *params); 
    42 @@ -1373,6 +1375,12 @@ void ieee80211_recalc_smps(struct ieee80 
     180@@ -1343,6 +1345,12 @@ void ieee80211_recalc_smps(struct ieee80 
    43181 size_t ieee80211_ie_split(const u8 *ies, size_t ielen, 
    44182                          const u8 *ids, int n_ids, size_t offset); 
     
    53191 /* internal work items */ 
    54192 void ieee80211_work_init(struct ieee80211_local *local); 
    55 @@ -1401,6 +1409,8 @@ ieee80211_get_channel_mode(struct ieee80 
     193@@ -1371,6 +1379,8 @@ ieee80211_get_channel_mode(struct ieee80 
    56194 bool ieee80211_set_channel_type(struct ieee80211_local *local, 
    57195                                struct ieee80211_sub_if_data *sdata, 
     
    64202--- a/net/mac80211/util.c 
    65203+++ b/net/mac80211/util.c 
    66 @@ -1007,23 +1007,8 @@ int ieee80211_build_preq_ies(struct ieee 
     204@@ -841,23 +841,8 @@ int ieee80211_build_preq_ies(struct ieee 
    67205                offset = noffset; 
    68206        } 
     
    90228        /* 
    91229         * If adding more here, adjust code in main.c 
    92 @@ -1464,3 +1449,100 @@ size_t ieee80211_ie_split_vendor(const u 
    93   
    94         return pos; 
     230@@ -1381,3 +1366,100 @@ void ieee80211_disable_rssi_reports(stru 
     231        _ieee80211_enable_rssi_reports(sdata, 0, 0); 
    95232 } 
     233 EXPORT_SYMBOL(ieee80211_disable_rssi_reports); 
    96234+ 
    97235+u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband, 
     
    193331--- a/net/mac80211/work.c 
    194332+++ b/net/mac80211/work.c 
    195 @@ -117,7 +117,6 @@ static void ieee80211_add_ht_ie(struct s 
     333@@ -118,7 +118,6 @@ static void ieee80211_add_ht_ie(struct s 
    196334        u8 *pos; 
    197335        u32 flags = channel->flags; 
     
    201339        if (!sband->ht_cap.ht_supported) 
    202340                return; 
    203 @@ -168,34 +167,8 @@ static void ieee80211_add_ht_ie(struct s 
     341@@ -169,34 +168,8 @@ static void ieee80211_add_ht_ie(struct s 
    204342        } 
    205343  
     
    237375  
    238376 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata, 
    239 --- a/net/wireless/scan.c 
    240 +++ b/net/wireless/scan.c 
    241 @@ -365,6 +365,18 @@ struct cfg80211_bss *cfg80211_get_bss(st 
    242                                       const u8 *ssid, size_t ssid_len, 
    243                                       u16 capa_mask, u16 capa_val) 
    244  { 
    245 +       return cfg80211_get_bss_ht(wiphy, channel, bssid, ssid, ssid_len, 
    246 +                                  capa_mask, capa_val, NL80211_CHAN_NO_HT); 
    247 +} 
    248 +EXPORT_SYMBOL(cfg80211_get_bss); 
    249 + 
    250 +struct cfg80211_bss *cfg80211_get_bss_ht(struct wiphy *wiphy, 
    251 +                                     struct ieee80211_channel *channel, 
    252 +                                     const u8 *bssid, 
    253 +                                     const u8 *ssid, size_t ssid_len, 
    254 +                                     u16 capa_mask, u16 capa_val, 
    255 +                                     enum nl80211_channel_type channel_type) 
    256 +{ 
    257         struct cfg80211_registered_device *dev = wiphy_to_dev(wiphy); 
    258         struct cfg80211_internal_bss *bss, *res = NULL; 
    259         unsigned long now = jiffies; 
    260 @@ -374,8 +386,27 @@ struct cfg80211_bss *cfg80211_get_bss(st 
    261         list_for_each_entry(bss, &dev->bss_list, list) { 
    262                 if ((bss->pub.capability & capa_mask) != capa_val) 
    263                         continue; 
    264 -               if (channel && bss->pub.channel != channel) 
    265 -                       continue; 
    266 +               if (channel) { 
    267 +                       if (bss->pub.channel != channel) 
    268 +                               continue; 
    269 +                       if (channel_type == NL80211_CHAN_HT40MINUS || 
    270 +                           channel_type == NL80211_CHAN_HT40PLUS) { 
    271 +                               struct ieee80211_ht_info *ht_info; 
    272 +                               ht_info = (struct ieee80211_ht_info *) 
    273 +                                       ieee80211_bss_get_ie(&bss->pub, 
    274 +                                                      WLAN_EID_HT_INFORMATION); 
    275 +                               if (!ht_info) 
    276 +                                       continue; 
    277 +                               if (channel_type == NL80211_CHAN_HT40MINUS && 
    278 +                                             !(ht_info->ht_param & 
    279 +                                             IEEE80211_HT_PARAM_CHA_SEC_BELOW)) 
    280 +                                       continue; 
    281 +                               if (channel_type == NL80211_CHAN_HT40PLUS && 
    282 +                                             !(ht_info->ht_param & 
    283 +                                             IEEE80211_HT_PARAM_CHA_SEC_ABOVE)) 
    284 +                                       continue; 
    285 +                       } 
    286 +               } 
    287                 /* Don't get expired BSS structs */ 
    288                 if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) && 
    289                     !atomic_read(&bss->hold)) 
    290 @@ -392,7 +423,7 @@ struct cfg80211_bss *cfg80211_get_bss(st 
    291                 return NULL; 
    292         return &res->pub; 
    293  } 
    294 -EXPORT_SYMBOL(cfg80211_get_bss); 
    295 +EXPORT_SYMBOL(cfg80211_get_bss_ht); 
    296   
    297  struct cfg80211_bss *cfg80211_get_mesh(struct wiphy *wiphy, 
    298                                        struct ieee80211_channel *channel, 
    299 --- a/net/wireless/nl80211.c 
    300 +++ b/net/wireless/nl80211.c 
    301 @@ -4282,13 +4282,42 @@ static int nl80211_join_ibss(struct sk_b 
    302                 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 
    303         } 
    304   
    305 -       ibss.channel = ieee80211_get_channel(wiphy, 
    306 -               nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 
    307 +       if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 
    308 +               enum nl80211_channel_type channel_type; 
    309 + 
    310 +               channel_type = nla_get_u32( 
    311 +                       info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 
    312 +               if (channel_type != NL80211_CHAN_NO_HT && 
    313 +                   channel_type != NL80211_CHAN_HT20 && 
    314 +                   channel_type != NL80211_CHAN_HT40PLUS && 
    315 +                   channel_type != NL80211_CHAN_HT40MINUS) 
    316 +                       return -EINVAL; 
    317 +               ibss.channel_type = channel_type; 
    318 +       } else { 
    319 +               ibss.channel_type = NL80211_CHAN_NO_HT; 
    320 +       } 
    321 + 
    322 +       ibss.channel = rdev_freq_to_chan(rdev, 
    323 +               nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]), 
    324 +               ibss.channel_type); 
    325 + 
    326         if (!ibss.channel || 
    327 +           ibss.channel->flags & IEEE80211_CHAN_PASSIVE_SCAN || 
    328             ibss.channel->flags & IEEE80211_CHAN_NO_IBSS || 
    329             ibss.channel->flags & IEEE80211_CHAN_DISABLED) 
    330                 return -EINVAL; 
    331   
    332 +#if 0 
    333 +       if ((ibss.channel_type == NL80211_CHAN_HT40PLUS || 
    334 +            ibss.channel_type == NL80211_CHAN_HT40MINUS) && 
    335 +           !can_beacon_sec_chan(&rdev->wiphy, ibss.chan, ibss.channel_type)) { 
    336 +               printk(KERN_DEBUG 
    337 +                      "cfg80211: Secondary channel not " 
    338 +                      "allowed to initiate communication\n"); 
    339 +               return -EINVAL; 
    340 +       } 
    341 +#endif 
    342 + 
    343         ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 
    344         ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 
    345   
    346 --- a/net/mac80211/agg-rx.c 
    347 +++ b/net/mac80211/agg-rx.c 
    348 @@ -178,6 +178,8 @@ static void ieee80211_send_addba_resp(st 
    349                 memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    350         else if (sdata->vif.type == NL80211_IFTYPE_WDS) 
    351                 memcpy(mgmt->bssid, da, ETH_ALEN); 
    352 +       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
    353 +               memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
    354   
    355         mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
    356                                           IEEE80211_STYPE_ACTION); 
    357377--- a/net/mac80211/agg-tx.c 
    358378+++ b/net/mac80211/agg-tx.c 
     
    389409--- a/net/mac80211/ibss.c 
    390410+++ b/net/mac80211/ibss.c 
    391 @@ -64,6 +64,7 @@ static void ieee80211_rx_mgmt_auth_ibss( 
     411@@ -35,6 +35,76 @@ 
     412  
     413 #define IEEE80211_IBSS_MAX_STA_ENTRIES 128 
     414  
     415+static bool ieee80211_can_use_ext_chan(struct ieee80211_sub_if_data *sdata, 
     416+                                      struct ieee80211_channel *channel, 
     417+                                      enum nl80211_channel_type channel_type) 
     418+{ 
     419+       /* check if we are legally allowed to use HT extension channel */ 
     420+       if ((channel_type == NL80211_CHAN_HT40PLUS) || 
     421+                       (channel_type == NL80211_CHAN_HT40MINUS)) { 
     422+               int sec_freq = channel->center_freq + 
     423+                            (channel_type == NL80211_CHAN_HT40PLUS ? 20 : -20); 
     424+               struct ieee80211_channel *sec_chan = 
     425+                            ieee80211_get_channel(sdata->wdev.wiphy, sec_freq); 
     426+               if (!sec_chan || sec_chan->flags & (IEEE80211_CHAN_DISABLED | 
     427+                                          IEEE80211_CHAN_PASSIVE_SCAN | 
     428+                                          IEEE80211_CHAN_NO_IBSS | 
     429+                                          IEEE80211_CHAN_RADAR)) { 
     430+                       return false; 
     431+               } 
     432+       } 
     433+       return true; 
     434+} 
     435+ 
     436+static void ieee80211_update_ht_elems(struct ieee80211_sub_if_data *sdata, 
     437+                                     struct ieee80211_mgmt *mgmt, 
     438+                                     struct ieee80211_ht_info *ht_info) 
     439+{ 
     440+       struct ieee80211_local *local = sdata->local; 
     441+       struct ieee80211_supported_band *sband = 
     442+                       local->hw.wiphy->bands[local->oper_channel->band]; 
     443+       enum nl80211_channel_type channel_type = 
     444+                       ieee80211_ht_info_to_channel_type(ht_info); 
     445+ 
     446+       if (!ieee80211_can_use_ext_chan(sdata, local->oper_channel, channel_type)) 
     447+               channel_type = NL80211_CHAN_HT20; 
     448+ 
     449+       if (channel_type != local->_oper_channel_type) { 
     450+               struct sk_buff *skb = rcu_dereference_protected( 
     451+                               sdata->u.ibss.presp, 
     452+                               lockdep_is_held(&ifibss->mtx)); 
     453+               struct sk_buff *nskb; 
     454+               u8 *ht_ie; 
     455+ 
     456+               /* update HT IE. If not yet existing, create one */ 
     457+               nskb = skb_copy(skb, GFP_ATOMIC); 
     458+               ht_ie = (u8 *)cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, 
     459+                                              (const u8 *)(nskb->data + 24 + 
     460+                                                       sizeof(mgmt->u.beacon)), 
     461+                                              nskb->len - 24 - 
     462+                                                       sizeof(mgmt->u.beacon)); 
     463+               if (!ht_ie) 
     464+                       ht_ie = skb_put(nskb, 4 + 
     465+                                             sizeof(struct ieee80211_ht_cap) + 
     466+                                             sizeof(struct ieee80211_ht_info)); 
     467+ 
     468+               ht_ie = ieee80211_ie_build_ht_cap(ht_ie, sband, 
     469+                                                 sband->ht_cap.cap); 
     470+               ht_ie = ieee80211_ie_build_ht_info(ht_ie, &sband->ht_cap, 
     471+                                            local->oper_channel, channel_type); 
     472+               rcu_assign_pointer(sdata->u.ibss.presp, nskb); 
     473+               kfree_skb(skb); 
     474+ 
     475+               if(!ieee80211_set_channel_type(local, sdata, channel_type)) { 
     476+                       channel_type = NL80211_CHAN_HT20; 
     477+                       WARN_ON(!ieee80211_set_channel_type(local, sdata, 
     478+                                                           channel_type)); 
     479+               } 
     480+ 
     481+               ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); 
     482+       } 
     483+ 
     484+} 
     485  
     486 static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata, 
     487                                        struct ieee80211_mgmt *mgmt, 
     488@@ -64,6 +134,7 @@ static void ieee80211_rx_mgmt_auth_ibss( 
    392489 static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, 
    393490                                      const u8 *bssid, const int beacon_int, 
     
    397494                                      const u16 capability, u64 tsf) 
    398495 { 
    399 @@ -104,8 +105,12 @@ static void __ieee80211_sta_join_ibss(st 
     496@@ -104,8 +175,17 @@ static void __ieee80211_sta_join_ibss(st 
    400497  
    401498        sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; 
     
    404501+       if (channel_type == NL80211_CHAN_NO_HT) 
    405502+               channel_type = ifibss->channel_type; 
    406 + 
    407503        local->oper_channel = chan; 
    408504-       WARN_ON(!ieee80211_set_channel_type(local, sdata, NL80211_CHAN_NO_HT)); 
    409 +       WARN_ON(!ieee80211_set_channel_type(local, sdata, channel_type)); 
     505+ 
     506+       /* if phy is on a different extension channel, setting ht40 will fail */ 
     507+       if (!ieee80211_set_channel_type(local, sdata, channel_type)) { 
     508+               channel_type = NL80211_CHAN_HT20; 
     509+               WARN_ON(!ieee80211_set_channel_type(local, sdata, 
     510+                                                                channel_type)); 
     511+       } 
    410512        ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); 
    411513  
    412514        sband = local->hw.wiphy->bands[chan->band]; 
    413 @@ -171,6 +176,17 @@ static void __ieee80211_sta_join_ibss(st 
     515@@ -171,6 +251,18 @@ static void __ieee80211_sta_join_ibss(st 
    414516                memcpy(skb_put(skb, ifibss->ie_len), 
    415517                       ifibss->ie, ifibss->ie_len); 
    416518  
     519+       /* add HT capability and information IEs */ 
    417520+       if (channel_type != NL80211_CHAN_NO_HT && sband->ht_cap.ht_supported) { 
    418521+               pos = skb_put(skb, 4 + 
     
    429532                pos = skb_put(skb, 9); 
    430533                *pos++ = WLAN_EID_VENDOR_SPECIFIC; 
    431 @@ -219,6 +235,8 @@ static void ieee80211_sta_join_ibss(stru 
     534@@ -219,6 +311,8 @@ static void ieee80211_sta_join_ibss(stru 
    432535        u32 basic_rates; 
    433536        int i, j; 
     
    438541        lockdep_assert_held(&sdata->u.ibss.mtx); 
    439542  
    440 @@ -242,9 +260,15 @@ static void ieee80211_sta_join_ibss(stru 
     543@@ -242,9 +336,23 @@ static void ieee80211_sta_join_ibss(stru 
    441544                } 
    442545        } 
     
    446549+               channel_type = ieee80211_ht_info_to_channel_type( 
    447550+                       (struct ieee80211_ht_info *) (ht_info_ie + 2)); 
     551+ 
     552+       if (!ieee80211_can_use_ext_chan(sdata, cbss->channel, channel_type)) { 
     553+               channel_type = NL80211_CHAN_HT20; 
     554+#ifdef CONFIG_MAC80211_IBSS_DEBUG 
     555+               printk(KERN_DEBUG "%s: IBSS not allowed on secondary channel\n", 
     556+                      sdata->name); 
     557+#endif 
     558+       } 
    448559+ 
    449560        __ieee80211_sta_join_ibss(sdata, cbss->bssid, 
     
    454565                                  cbss->capability, 
    455566                                  cbss->tsf); 
    456 @@ -310,11 +334,65 @@ static void ieee80211_rx_bss_info(struct 
     567@@ -310,11 +418,24 @@ static void ieee80211_rx_bss_info(struct 
    457568                        } else 
    458569                                sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid, 
     
    468579+                               set_sta_flags(sta, WLAN_STA_WME); 
    469580+ 
     581+                       /* remote station uses ht */ 
    470582+                       if (elems->ht_info_elem) { 
    471 +                               struct ieee80211_supported_band *sband = 
    472 +                                       local->hw.wiphy->bands[channel->band]; 
    473 +                               enum nl80211_channel_type channel_type; 
    474 + 
    475 +                               channel_type = 
    476 +                                       ieee80211_ht_info_to_channel_type( 
    477 +                                               elems->ht_info_elem); 
    478 +                               if (channel_type != local->_oper_channel_type) { 
    479 +                                       struct sk_buff *skb = 
    480 +                                                       sdata->u.ibss.presp; 
    481 +                                       struct sk_buff *nskb; 
    482 +                                       u8 *ht_ie; 
    483 + 
    484 +                                       nskb = skb_copy(skb, GFP_ATOMIC); 
    485 +                                       ht_ie = (u8 *) cfg80211_find_ie( 
    486 +                                               WLAN_EID_HT_CAPABILITY, 
    487 +                                               nskb->data + 24 + 
    488 +                                                       sizeof(mgmt->u.beacon), 
    489 +                                               nskb->len - 24 - 
    490 +                                                       sizeof(mgmt->u.beacon)); 
    491 + 
    492 +                                       if (!ht_ie) 
    493 +                                               ht_ie = skb_put(nskb, 4 + 
    494 +                                             sizeof(struct ieee80211_ht_cap) + 
    495 +                                             sizeof(struct ieee80211_ht_info)); 
    496 +                                       ht_ie = ieee80211_ie_build_ht_cap(ht_ie, 
    497 +                                                            sband, 
    498 +                                                            sband->ht_cap.cap); 
    499 +                                       ht_ie = ieee80211_ie_build_ht_info( 
    500 +                                                                ht_ie, 
    501 +                                                                &sband->ht_cap, 
    502 +                                                                channel, 
    503 +                                                                channel_type); 
    504 +                                       sdata->u.ibss.presp = nskb; 
    505 +                                       kfree_skb(skb); 
    506 + 
    507 +                                       local->_oper_channel_type = 
    508 +                                                               channel_type; 
    509 +                                       WARN_ON(!ieee80211_set_channel_type( 
    510 +                                                               local, 
    511 +                                                               sdata, 
    512 +                                                               channel_type)); 
    513 +                                       ieee80211_hw_config(local, 
    514 +                                               IEEE80211_CONF_CHANGE_CHANNEL); 
    515 +                               } 
    516 +                               ieee80211_ht_cap_ie_to_sta_ht_cap(sband, 
    517 +                                                       elems->ht_cap_elem, 
    518 +                                                       &sta->sta.ht_cap); 
    519 + 
     583+                               ieee80211_update_ht_elems(sdata, mgmt, 
     584+                                                         elems->ht_info_elem); 
     585+                               ieee80211_ht_cap_ie_to_sta_ht_cap( 
     586+                                               local->hw.wiphy->bands[ 
     587+                                                    local->oper_channel->band], 
     588+                                               elems->ht_cap_elem, 
     589+                                               &sta->sta.ht_cap); 
    520590+                       } 
    521591+               } 
     
    523593                rcu_read_unlock(); 
    524594        } 
    525 @@ -404,7 +482,7 @@ static void ieee80211_rx_bss_info(struct 
     595@@ -404,7 +525,7 @@ static void ieee80211_rx_bss_info(struct 
    526596                ieee80211_sta_join_ibss(sdata, bss); 
    527597                supp_rates = ieee80211_sta_get_rates(local, elems, band); 
     
    532602  
    533603  put_bss: 
    534 @@ -417,7 +495,8 @@ static void ieee80211_rx_bss_info(struct 
     604@@ -417,7 +538,8 @@ static void ieee80211_rx_bss_info(struct 
    535605  * must be callable in atomic context. 
    536606  */ 
     
    542612 { 
    543613        struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 
    544 @@ -458,6 +537,11 @@ struct sta_info *ieee80211_ibss_add_sta( 
     614@@ -458,6 +580,11 @@ struct sta_info *ieee80211_ibss_add_sta( 
    545615        sta->sta.supp_rates[band] = supp_rates | 
    546616                        ieee80211_mandatory_rates(local, band); 
     
    554624  
    555625        /* If it fails, maybe we raced another insertion? */ 
    556 @@ -556,8 +640,8 @@ static void ieee80211_sta_create_ibss(st 
     626@@ -556,8 +683,8 @@ static void ieee80211_sta_create_ibss(st 
    557627                sdata->drop_unencrypted = 0; 
    558628  
     
    565635  
    566636 /* 
    567 @@ -594,10 +678,10 @@ static void ieee80211_sta_find_ibss(stru 
     637@@ -594,10 +721,10 @@ static void ieee80211_sta_find_ibss(stru 
    568638                chan = ifibss->channel; 
    569639        if (!is_zero_ether_addr(ifibss->bssid)) 
     
    578648        if (cbss) { 
    579649                struct ieee80211_bss *bss; 
    580 @@ -896,10 +980,15 @@ int ieee80211_ibss_join(struct ieee80211 
     650@@ -896,10 +1023,15 @@ int ieee80211_ibss_join(struct ieee80211 
    581651        struct sk_buff *skb; 
    582652  
     
    598668        if (!skb) 
    599669                return -ENOMEM; 
    600 @@ -920,13 +1009,14 @@ int ieee80211_ibss_join(struct ieee80211 
     670@@ -920,13 +1052,15 @@ int ieee80211_ibss_join(struct ieee80211 
    601671        sdata->vif.bss_conf.beacon_int = params->beacon_interval; 
    602672  
     
    608678        if (params->channel_fixed) { 
    609679                sdata->local->oper_channel = params->channel; 
    610                 WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata, 
     680-               WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata, 
    611681-                                                   NL80211_CHAN_NO_HT)); 
    612 +                                                   params->channel_type)); 
     682+               if(!ieee80211_set_channel_type(sdata->local, sdata, 
     683+                                              params->channel_type)) 
     684+                       return -EINVAL; 
    613685        } 
    614686  
     
    616688--- a/net/mac80211/rx.c 
    617689+++ b/net/mac80211/rx.c 
    618 @@ -2138,7 +2138,8 @@ ieee80211_rx_h_action(struct ieee80211_r 
     690@@ -2161,7 +2161,8 @@ ieee80211_rx_h_action(struct ieee80211_r 
    619691                if (sdata->vif.type != NL80211_IFTYPE_STATION && 
    620692                    sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
     
    626698  
    627699                /* verify action_code is present */ 
    628 @@ -2654,7 +2655,8 @@ static int prepare_for_handlers(struct i 
     700@@ -2696,7 +2697,8 @@ static int prepare_for_handlers(struct i 
    629701                        else 
    630702                                rate_idx = status->rate_idx; 
     
    636708                break; 
    637709        case NL80211_IFTYPE_MESH_POINT: 
     710--- a/net/mac80211/agg-rx.c 
     711+++ b/net/mac80211/agg-rx.c 
     712@@ -186,6 +186,8 @@ static void ieee80211_send_addba_resp(st 
     713                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
     714        else if (sdata->vif.type == NL80211_IFTYPE_WDS) 
     715                memcpy(mgmt->bssid, da, ETH_ALEN); 
     716+       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
     717+               memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
     718  
     719        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
     720                                          IEEE80211_STYPE_ACTION); 
  • branches/backfire/package/mac80211/patches/402-ath9k_blink_default.patch

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

    r27865 r28138  
    99  
    1010 #include "hw.h" 
    11 @@ -453,8 +454,16 @@ static int ath9k_hw_init_macaddr(struct  
     11@@ -460,8 +461,16 @@ static int ath9k_hw_init_macaddr(struct  
    1212                common->macaddr[2 * i] = eeval >> 8; 
    1313                common->macaddr[2 * i + 1] = eeval & 0xff; 
  • branches/backfire/package/mac80211/patches/406-regd_no_assoc_hints.patch

    r27431 r28138  
    11--- a/net/wireless/reg.c 
    22+++ b/net/wireless/reg.c 
    3 @@ -1643,6 +1643,8 @@ void regulatory_hint_11d(struct wiphy *w 
     3@@ -1642,6 +1642,8 @@ void regulatory_hint_11d(struct wiphy *w 
    44        enum environment_cap env = ENVIRON_ANY; 
    55        struct regulatory_request *request; 
     
    1010  
    1111        if (unlikely(!last_request)) 
    12 @@ -1849,6 +1851,8 @@ static void restore_regulatory_settings( 
     12@@ -1848,6 +1850,8 @@ static void restore_regulatory_settings( 
    1313  
    1414 void regulatory_hint_disconnect(void) 
  • branches/backfire/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

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

    r27431 r28138  
    11--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    22+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    3 @@ -95,13 +95,8 @@ ath5k_add_interface(struct ieee80211_hw  
     3@@ -83,13 +83,8 @@ ath5k_add_interface(struct ieee80211_hw  
    44                goto end; 
    55        } 
     
    1010-        * for the IBSS, but this breaks with additional AP or STA interfaces 
    1111-        * at the moment. */ 
    12 -       if (sc->num_adhoc_vifs || 
    13 -           (sc->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) { 
     12-       if (ah->num_adhoc_vifs || 
     13-           (ah->nvifs && vif->type == NL80211_IFTYPE_ADHOC)) { 
    1414+       /* Don't allow more than one ad-hoc interface */ 
    15 +       if (sc->num_adhoc_vifs && vif->type == NL80211_IFTYPE_ADHOC) { 
    16                 ATH5K_ERR(sc, "Only one single ad-hoc interface is allowed.\n"); 
     15+       if (ah->num_adhoc_vifs && vif->type == NL80211_IFTYPE_ADHOC) { 
     16                ATH5K_ERR(ah, "Only one single ad-hoc interface is allowed.\n"); 
    1717                ret = -ELNRNG; 
    1818                goto end; 
    1919--- a/drivers/net/wireless/ath/ath5k/base.c 
    2020+++ b/drivers/net/wireless/ath/ath5k/base.c 
    21 @@ -1883,7 +1883,7 @@ ath5k_beacon_send(struct ath5k_softc *sc 
    22                 sc->bmisscount = 0; 
     21@@ -1866,7 +1866,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
     22                ah->bmisscount = 0; 
    2323        } 
    2424  
    25 -       if ((sc->opmode == NL80211_IFTYPE_AP && sc->num_ap_vifs > 1) || 
    26 +       if ((sc->opmode == NL80211_IFTYPE_AP && sc->num_ap_vifs + sc->num_adhoc_vifs > 1) || 
    27                         sc->opmode == NL80211_IFTYPE_MESH_POINT) { 
     25-       if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs > 1) || 
     26+       if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs + ah->num_adhoc_vifs > 1) || 
     27                        ah->opmode == NL80211_IFTYPE_MESH_POINT) { 
    2828                u64 tsf = ath5k_hw_get_tsf64(ah); 
    2929                u32 tsftu = TSF_TO_TU(tsf); 
    30 @@ -1961,7 +1961,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
     30@@ -1951,7 +1951,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
    3131        u64 hw_tsf; 
    3232  
    33         intval = sc->bintval & AR5K_BEACON_PERIOD; 
    34 -       if (sc->opmode == NL80211_IFTYPE_AP && sc->num_ap_vifs > 1) { 
    35 +       if (sc->opmode == NL80211_IFTYPE_AP && sc->num_ap_vifs + sc->num_adhoc_vifs > 1) { 
     33        intval = ah->bintval & AR5K_BEACON_PERIOD; 
     34-       if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs > 1) { 
     35+       if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs + ah->num_adhoc_vifs > 1) { 
    3636                intval /= ATH_BCBUF;    /* staggered multi-bss beacons */ 
    3737                if (intval < 15) 
    38                         ATH5K_WARN(sc, "intval %u is too low, min 15\n", 
     38                        ATH5K_WARN(ah, "intval %u is too low, min 15\n", 
  • branches/backfire/package/mac80211/patches/430-ath5k_disable_fast_cc.patch

    r27431 r28138  
    11--- a/drivers/net/wireless/ath/ath5k/reset.c 
    22+++ b/drivers/net/wireless/ath/ath5k/reset.c 
    3 @@ -1035,6 +1035,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah,  
     3@@ -1040,6 +1040,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah,  
    44        tsf_lo = 0; 
    55        mode = 0; 
     
    99         * Sanity check for fast flag 
    1010         * Fast channel change only available 
    11 @@ -1042,6 +1043,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah,  
     11@@ -1047,6 +1048,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah,  
    1212         */ 
    1313        if (fast && (ah->ah_radio != AR5K_RF2413) && 
  • branches/backfire/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch

    r27431 r28138  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1181,6 +1181,53 @@ static const struct file_operations fops 
    4         .llseek = default_llseek,/* read accesses f_pos */ 
     3@@ -1272,6 +1272,53 @@ static const struct file_operations fops 
     4        .llseek = default_llseek, 
    55 }; 
    66  
     
    5555 { 
    5656        struct ath_common *common = ath9k_hw_common(ah); 
    57 @@ -1231,6 +1278,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
     57@@ -1328,6 +1375,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5858        debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR, 
    5959                           sc->debug.debugfs_phy, &sc->sc_ah->gpio_val); 
  • branches/backfire/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

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

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

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

    r27865 r28138  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -586,6 +586,7 @@ struct ath_softc { 
     3@@ -587,6 +587,7 @@ struct ath_softc { 
    44        struct ieee80211_hw *hw; 
    55        struct device *dev; 
     
    1111--- a/drivers/net/wireless/ath/ath9k/debug.c 
    1212+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    13 @@ -1281,6 +1281,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
     13@@ -1378,6 +1378,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
    1414        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
    1515                            &fops_eeprom); 
     
    2323--- a/drivers/net/wireless/ath/ath9k/main.c 
    2424+++ b/drivers/net/wireless/ath/ath9k/main.c 
    25 @@ -226,6 +226,7 @@ static int ath_set_channel(struct ath_so 
    26         bool fastcc = true, stopped; 
    27         struct ieee80211_channel *channel = hw->conf.channel; 
    28         struct ath9k_hw_cal_data *caldata = NULL; 
    29 +       u32 oldflags; 
    30         int r; 
     25@@ -1654,9 +1654,10 @@ static int ath9k_config(struct ieee80211 
    3126  
    32         if (sc->sc_flags & SC_OP_INVALID) 
    33 @@ -268,6 +269,24 @@ static int ath_set_channel(struct ath_so 
    34         if (!stopped || !(sc->sc_flags & SC_OP_OFFCHANNEL)) 
    35                 fastcc = false; 
     27        if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 
     28                struct ieee80211_channel *curchan = hw->conf.channel; 
     29-               struct ath9k_channel old_chan; 
     30+               struct ath9k_channel old_chan, *hchan; 
     31                int pos = curchan->hw_value; 
     32                int old_pos = -1; 
     33+               u32 oldflags; 
     34                unsigned long flags; 
    3635  
    37 +       oldflags = hchan->channelFlags; 
    38 +       switch (sc->chan_bw) { 
    39 +       case 5: 
    40 +               hchan->channelFlags &= ~CHANNEL_HALF; 
    41 +               hchan->channelFlags |= CHANNEL_QUARTER; 
    42 +               break; 
    43 +       case 10: 
    44 +               hchan->channelFlags &= ~CHANNEL_QUARTER; 
    45 +               hchan->channelFlags |= CHANNEL_HALF; 
    46 +               break; 
    47 +       default: 
    48 +               hchan->channelFlags &= ~(CHANNEL_HALF | CHANNEL_QUARTER); 
    49 +               break; 
    50 +       } 
     36                if (ah->curchan) 
     37@@ -1709,7 +1710,23 @@ static int ath9k_config(struct ieee80211 
     38                        memset(&sc->survey[pos], 0, sizeof(struct survey_info)); 
     39                } 
     40  
     41-               if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) { 
     42+               hchan = &sc->sc_ah->channels[pos]; 
     43+               oldflags = hchan->channelFlags; 
     44+               switch (sc->chan_bw) { 
     45+               case 5: 
     46+                       hchan->channelFlags &= ~CHANNEL_HALF; 
     47+                       hchan->channelFlags |= CHANNEL_QUARTER; 
     48+                       break; 
     49+               case 10: 
     50+                       hchan->channelFlags &= ~CHANNEL_QUARTER; 
     51+                       hchan->channelFlags |= CHANNEL_HALF; 
     52+                       break; 
     53+               default: 
     54+                       hchan->channelFlags &= ~(CHANNEL_HALF | CHANNEL_QUARTER); 
     55+                       break; 
     56+               } 
    5157+ 
    52 +       if (oldflags != hchan->channelFlags) 
    53 +               fastcc = false; 
     58+               if (ath_set_channel(sc, hw, hchan) < 0) { 
     59                        ath_err(common, "Unable to set channel\n"); 
     60                        mutex_unlock(&sc->mutex); 
     61                        return -EINVAL; 
     62--- a/drivers/net/wireless/ath/ath9k/hw.c 
     63+++ b/drivers/net/wireless/ath/ath9k/hw.c 
     64@@ -1507,6 +1507,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     65        } 
     66        ah->noise = ath9k_hw_getchan_noise(ah, chan); 
     67  
     68+       if (!ah->curchan || ((ah->curchan->channelFlags ^ chan->channelFlags) & 
     69+           (CHANNEL_HALF | CHANNEL_QUARTER))) 
     70+               bChannelChange = false; 
    5471+ 
    55         if (!(sc->sc_flags & SC_OP_OFFCHANNEL)) 
    56                 caldata = &sc->caldata; 
    57   
     72        if (bChannelChange && 
     73            (ah->chip_fullsleep != true) && 
     74            (ah->curchan != NULL) && 
  • branches/backfire/package/mac80211/patches/530-mac80211_cur_txpower.patch

    r28136 r28138  
    11--- a/include/net/mac80211.h 
    22+++ b/include/net/mac80211.h 
    3 @@ -779,7 +779,7 @@ enum ieee80211_smps_mode { 
     3@@ -790,7 +790,7 @@ enum ieee80211_smps_mode { 
    44  */ 
    55 struct ieee80211_conf { 
     
    1212--- a/net/mac80211/cfg.c 
    1313+++ b/net/mac80211/cfg.c 
    14 @@ -1524,7 +1524,7 @@ static int ieee80211_get_tx_power(struct 
     14@@ -1551,7 +1551,7 @@ static int ieee80211_get_tx_power(struct 
    1515 { 
    1616        struct ieee80211_local *local = wiphy_priv(wiphy); 
  • branches/backfire/package/mac80211/patches/531-ath9k_cur_txpower.patch

    r28136 r28138  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -1727,6 +1727,8 @@ static int ath9k_config(struct ieee80211 
     3@@ -1732,6 +1732,8 @@ static int ath9k_config(struct ieee80211 
    44                        return -EINVAL; 
    55                } 
     
    1010                 * The most recent snapshot of channel->noisefloor for the old 
    1111                 * channel is only available after the hardware reset. Copy it to 
    12 @@ -1744,6 +1746,7 @@ static int ath9k_config(struct ieee80211 
     12@@ -1749,6 +1751,7 @@ static int ath9k_config(struct ieee80211 
    1313                ath9k_cmn_update_txpow(ah, sc->curtxpow, 
    1414                                       sc->config.txpowlimit, &sc->curtxpow); 
  • branches/backfire/package/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch

    r27431 r28138  
    2323--- a/drivers/net/wireless/rt2x00/rt2x00.h 
    2424+++ b/drivers/net/wireless/rt2x00/rt2x00.h 
    25 @@ -38,6 +38,7 @@ 
     25@@ -39,6 +39,7 @@ 
    2626 #include <linux/input-polldev.h> 
    2727 #include <linux/kfifo.h> 
  • branches/backfire/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch

    r27431 r28138  
    102102--- a/drivers/net/wireless/rt2x00/rt2x00.h 
    103103+++ b/drivers/net/wireless/rt2x00/rt2x00.h 
    104 @@ -538,6 +538,7 @@ struct rt2x00lib_ops { 
     104@@ -539,6 +539,7 @@ struct rt2x00lib_ops { 
    105105                               const u8 *data, const size_t len); 
    106106        int (*load_firmware) (struct rt2x00_dev *rt2x00dev, 
     
    110110        /* 
    111111         * Device initialization/deinitialization handlers. 
    112 @@ -684,6 +685,7 @@ enum rt2x00_capability_flags { 
     112@@ -685,6 +686,7 @@ enum rt2x00_capability_flags { 
    113113        REQUIRE_SW_SEQNO, 
    114114        REQUIRE_HT_TX_DESC, 
     
    118118        /* 
    119119         * Capabilities 
    120 @@ -939,6 +941,11 @@ struct rt2x00_dev { 
     120@@ -940,6 +942,11 @@ struct rt2x00_dev { 
    121121        const struct firmware *fw; 
    122122  
     
    209209 #ifdef CONFIG_PCI 
    210210 static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom) 
    211 @@ -315,6 +305,20 @@ static int rt2800pci_write_firmware(stru 
     211@@ -311,6 +301,20 @@ static int rt2800pci_write_firmware(stru 
    212212 } 
    213213  
     
    230230  */ 
    231231 static bool rt2800pci_get_entry_state(struct queue_entry *entry) 
    232 @@ -1057,6 +1061,7 @@ static const struct rt2x00lib_ops rt2800 
     232@@ -1050,6 +1054,7 @@ static const struct rt2x00lib_ops rt2800 
    233233        .get_firmware_name      = rt2800pci_get_firmware_name, 
    234234        .check_firmware         = rt2800_check_firmware, 
     
    240240--- a/drivers/net/wireless/rt2x00/rt2x00dev.c 
    241241+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c 
    242 @@ -1122,6 +1122,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de 
     242@@ -1121,6 +1121,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de 
    243243        INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); 
    244244        INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); 
     
    251251         * Let the driver probe the device to detect the capabilities. 
    252252         */ 
    253 @@ -1223,6 +1227,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ 
     253@@ -1222,6 +1226,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ 
    254254         * Free queue structures. 
    255255         */ 
  • branches/backfire/package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch

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

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

    r27431 r28138  
    11--- a/drivers/net/wireless/b43/b43.h 
    22+++ b/drivers/net/wireless/b43/b43.h 
    3 @@ -740,6 +740,7 @@ struct b43_wldev { 
     3@@ -751,6 +751,7 @@ struct b43_wldev { 
    44        bool qos_enabled;               /* TRUE, if QoS is used. */ 
    55        bool hwcrypto_enabled;          /* TRUE, if HW crypto acceleration is enabled. */ 
     
    1111--- a/drivers/net/wireless/b43/main.c 
    1212+++ b/drivers/net/wireless/b43/main.c 
    13 @@ -76,6 +76,11 @@ MODULE_FIRMWARE("b43/ucode16_mimo.fw"); 
     13@@ -74,6 +74,11 @@ MODULE_FIRMWARE("b43/ucode16_mimo.fw"); 
    1414 MODULE_FIRMWARE("b43/ucode5.fw"); 
    1515 MODULE_FIRMWARE("b43/ucode9.fw"); 
     
    2323 module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); 
    2424 MODULE_PARM_DESC(bad_frames_preempt, 
    25 @@ -2575,10 +2580,10 @@ static int b43_gpio_init(struct b43_wlde 
     25@@ -2676,10 +2681,10 @@ static int b43_gpio_init(struct b43_wlde 
    2626                    & ~B43_MACCTL_GPOUTSMSK); 
    2727  
     
    3636                mask |= 0x0060; 
    3737                set |= 0x0060; 
    38 @@ -5137,10 +5142,10 @@ static void b43_print_driverinfo(void) 
    39         feat_sdio = "S"; 
    40  #endif 
    41         printk(KERN_INFO "Broadcom 43xx driver loaded " 
    42 -              "[ Features: %s%s%s%s%s, Firmware-ID: " 
    43 +              "[ Features: %s%s%s%s%s, GPIO LED Mask: 0x%04x, Firmware-ID: " 
    44                B43_SUPPORTED_FIRMWARE_ID " ]\n", 
    45                feat_pci, feat_pcmcia, feat_nphy, 
    46 -              feat_leds, feat_sdio); 
    47 +              feat_leds, feat_sdio, modparam_gpiomask); 
    48  } 
    49   
    50  static int __init b43_init(void) 
  • branches/backfire/package/mac80211/patches/810-b43_no_pio.patch

    r27431 r28138  
    11--- a/drivers/net/wireless/b43/Makefile 
    22+++ b/drivers/net/wireless/b43/Makefile 
    3 @@ -17,7 +17,7 @@ b43-y                         += xmit.o 
     3@@ -19,7 +19,7 @@ b43-y                         += xmit.o 
    44 b43-y                          += lo.o 
    55 b43-y                          += wa.o 
     
    1212--- a/drivers/net/wireless/b43/main.c 
    1313+++ b/drivers/net/wireless/b43/main.c 
    14 @@ -1834,9 +1834,11 @@ static void b43_do_interrupt_thread(stru 
     14@@ -1883,9 +1883,11 @@ static void b43_do_interrupt_thread(stru 
    1515                               dma_reason[4], dma_reason[5]); 
    1616                        b43err(dev->wl, "This device does not support DMA " 
Note: See TracChangeset for help on using the changeset viewer.