Changeset 30346


Ignore:
Timestamp:
2012-02-07T12:28:11+01:00 (6 years ago)
Author:
nbd
Message:

mac80211: update to wireless-testing 2012-02-06

Location:
trunk/package/mac80211
Files:
13 deleted
45 edited
7 moved

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/Makefile

    r29906 r30346  
    1111PKG_NAME:=mac80211 
    1212 
    13 PKG_VERSION:=2011-12-01 
    14 PKG_RELEASE:=2 
     13PKG_VERSION:=2012-02-06 
     14PKG_RELEASE:=1 
    1515PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources 
    16 PKG_MD5SUM:=8d1fe2fd6bbabc4fbbf31dfbf015c62c 
     16PKG_MD5SUM:=fae71c35ee3f3de6329f2db7aed6d265 
    1717 
    1818PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 
     
    11011101        $(if $(CONFIG_PACKAGE_B43_PHY_HT),-DCONFIG_B43_PHY_HT) \ 
    11021102        $(if $(CONFIG_PACKAGE_B43_PHY_LCN),-DCONFIG_B43_PHY_LCN) \ 
    1103         -DCONFIG_B43_BCMA \ 
     1103        -DCONFIG_B43_BCMA -DCONFIG_B43_BCMA_EXTRA \ 
    11041104        -DCONFIG_B43_SSB \ 
    11051105        $(if $(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS),-DCONFIG_RT2X00_LIB_DEBUGFS) \ 
     
    12501250        CONFIG_BRCMSMAC= \ 
    12511251        KLIB_BUILD="$(LINUX_DIR)" \ 
    1252         MODPROBE=: \ 
     1252        MODPROBE=true \ 
    12531253        KLIB=$(TARGET_MODULES_DIR) \ 
    12541254        KERNEL_SUBLEVEL=$(lastword $(subst ., ,$(KERNEL_PATCHVER))) \ 
  • trunk/package/mac80211/patches/000-disable_ethernet.patch

    r28093 r30346  
    11--- a/Makefile 
    22+++ b/Makefile 
    3 @@ -29,9 +29,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
     3@@ -32,9 +32,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
    44  
    55 obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/ 
  • trunk/package/mac80211/patches/001-disable_b44.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -378,8 +378,8 @@ CONFIG_B43_BCMA_PIO=y 
     3@@ -380,8 +380,8 @@ CONFIG_B43_BCMA_EXTRA=y 
    44  
    55 CONFIG_P54_PCI=m 
  • trunk/package/mac80211/patches/002-disable_rfkill.patch

    r29436 r30346  
    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 @@ -671,10 +671,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27 
     12@@ -684,10 +684,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. 
  • trunk/package/mac80211/patches/005-disable_ssb_build.patch

    r29436 r30346  
    11--- a/Makefile 
    22+++ b/Makefile 
    3 @@ -29,7 +29,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
     3@@ -32,7 +32,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
    44  
    55 obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/ 
     
    1919 include $(KLIB_BUILD)/.config 
    2020 endif 
    21 @@ -354,7 +353,8 @@ CONFIG_IPW2200_QOS=y 
     21@@ -356,7 +355,8 @@ CONFIG_IPW2200_QOS=y 
    2222 # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface 
    2323 endif #CONFIG_WIRELESS_EXT 
     
    2929 CONFIG_SSB_SPROM=y 
    3030  
    31 @@ -367,7 +367,7 @@ endif #CONFIG_PCMCIA 
     31@@ -369,7 +369,7 @@ endif #CONFIG_PCMCIA 
    3232 # CONFIG_SSB_DEBUG=y 
    3333 CONFIG_SSB_DRIVER_PCICORE=y 
     
    3838 CONFIG_BCMA=m 
    3939 CONFIG_BCMA_BLOCKIO=y 
    40 @@ -574,7 +574,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
     40@@ -578,7 +578,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
    4141  
    4242 ifdef CONFIG_MMC 
  • trunk/package/mac80211/patches/006-disable_bcma_build.patch

    r29436 r30346  
    11--- a/Makefile 
    22+++ b/Makefile 
    3 @@ -29,7 +29,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
     3@@ -32,7 +32,6 @@ obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += 
    44  
    55 obj-$(CONFIG_COMPAT_NET_USB_MODULES) += drivers/net/usb/ 
     
    1111--- a/config.mk 
    1212+++ b/config.mk 
    13 @@ -369,12 +369,12 @@ CONFIG_SSB_DRIVER_PCICORE=y 
     13@@ -371,12 +371,12 @@ CONFIG_SSB_DRIVER_PCICORE=y 
    1414 CONFIG_B43_SSB=y 
    1515 endif #__CONFIG_SSB 
     
    2323 # CONFIG_BCMA_DEBUG=y 
    2424-CONFIG_B43_BCMA=y 
    25 -CONFIG_B43_BCMA_PIO=y 
     25-CONFIG_B43_BCMA_EXTRA=y 
    2626+# CONFIG_B43_BCMA=y 
    27 +# CONFIG_B43_BCMA_PIO=y 
     27+# CONFIG_B43_BCMA_EXTRA=y 
    2828  
    2929 CONFIG_P54_PCI=m 
  • trunk/package/mac80211/patches/007-remove_misc_drivers.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -252,7 +252,7 @@ $(warning "WARNING: CONFIG_CFG80211_WEXT 
     3@@ -254,7 +254,7 @@ $(warning "WARNING: CONFIG_CFG80211_WEXT 
    44 endif #CONFIG_WIRELESS_EXT 
    55  
     
    1010  
    1111 # mac80211 test driver 
    12 @@ -406,13 +406,13 @@ endif #CONFIG_CRC_ITU_T 
     12@@ -408,13 +408,13 @@ endif #CONFIG_CRC_ITU_T 
    1313 CONFIG_MWL8K=m 
    1414  
     
    2929  
    3030 ifdef CONFIG_WIRELESS_EXT 
    31 @@ -471,21 +471,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
     31@@ -475,21 +475,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 
  • trunk/package/mac80211/patches/008-disable_mesh.patch

    r29506 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -188,7 +188,7 @@ CONFIG_MAC80211_LEDS=y 
     3@@ -192,7 +192,7 @@ CONFIG_MAC80211_LEDS=y 
    44 endif #CONFIG_LEDS_TRIGGERS 
    55  
  • trunk/package/mac80211/patches/010-no_pcmcia.patch

    r29436 r30346  
    1010 include $(KLIB_BUILD)/.config 
    1111 endif 
    12 @@ -286,7 +286,7 @@ CONFIG_B43=m 
     12@@ -289,7 +289,7 @@ CONFIG_B43=m 
    1313 CONFIG_B43_HWRNG=y 
    1414 CONFIG_B43_PCI_AUTOSELECT=y 
  • trunk/package/mac80211/patches/011-no_sdio.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -557,7 +557,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
     3@@ -561,7 +561,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
    44  
    55 ifdef CONFIG_MMC 
  • trunk/package/mac80211/patches/013-disable_b43_nphy.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -292,8 +292,8 @@ ifdef CONFIG_MAC80211_LEDS 
     3@@ -295,8 +295,8 @@ ifdef CONFIG_MAC80211_LEDS 
    44 CONFIG_B43_LEDS=y 
    55 endif #CONFIG_MAC80211_LEDS 
     
    1010+# CONFIG_B43_PHY_HT=y 
    1111 # CONFIG_B43_PHY_LCN=y 
    12  # CONFIG_B43_FORCE_PIO=y 
    1312 # CONFIG_B43_DEBUG=y 
     13  
  • trunk/package/mac80211/patches/015-remove-rt2x00-options.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -368,7 +368,7 @@ CONFIG_RTL8180=m 
     3@@ -370,7 +370,7 @@ CONFIG_RTL8180=m 
    44  
    55 CONFIG_ADM8211=m 
     
    1010 CONFIG_RT2500PCI=m 
    1111 ifdef CONFIG_CRC_CCITT 
    12 @@ -506,7 +506,7 @@ CONFIG_RT2800USB_RT35XX=y 
    13  # CONFIG_RT2800USB_RT53XX=y 
     12@@ -510,7 +510,7 @@ CONFIG_RT2800USB_RT35XX=y 
     13 CONFIG_RT2800USB_RT53XX=y 
    1414 CONFIG_RT2800USB_UNKNOWN=y 
    1515 endif #CONFIG_CRC_CCITT 
  • trunk/package/mac80211/patches/016-remove_pid_algo.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -163,7 +163,7 @@ CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y 
     3@@ -167,7 +167,7 @@ CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y 
    44 # This is the one used by our compat-wireless net/mac80211/rate.c 
    55 # in case you have and old kernel which is overriding this to pid. 
  • trunk/package/mac80211/patches/017-remove_ath9k_rc.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -259,7 +259,7 @@ CONFIG_ATH9K_COMMON=m 
     3@@ -261,7 +261,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 
     
    88+# CONFIG_ATH9K_RATE_CONTROL=y 
    99  
    10  # PCI Drivers 
    11  ifdef CONFIG_PCI 
     10 CONFIG_ATH9K_BTCOEX_SUPPORT=y 
     11  
  • trunk/package/mac80211/patches/018-revert_printk_va_format.patch

    r28245 r30346  
    11--- a/drivers/net/wireless/b43/main.c 
    22+++ b/drivers/net/wireless/b43/main.c 
    3 @@ -339,83 +339,59 @@ static int b43_ratelimit(struct b43_wl * 
     3@@ -341,83 +341,59 @@ static int b43_ratelimit(struct b43_wl * 
    44  
    55 void b43info(struct b43_wl *wl, const char *fmt, ...) 
  • trunk/package/mac80211/patches/019-remove_ath5k_pci_option.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -264,7 +264,7 @@ CONFIG_ATH9K_COMMON=m 
     3@@ -268,7 +268,7 @@ CONFIG_ATH9K_BTCOEX_SUPPORT=y 
    44 # PCI Drivers 
    55 ifdef CONFIG_PCI 
  • trunk/package/mac80211/patches/060-fix_compat_security.patch

    r29436 r30346  
    11--- a/include/linux/compat-3.1.h 
    22+++ b/include/linux/compat-3.1.h 
    3 @@ -5,6 +5,8 @@ 
     3@@ -7,6 +7,8 @@ 
    44  
    5  #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0)) 
     5 #include <linux/security.h> 
    66  
    77+#include <linux/security.h> 
  • trunk/package/mac80211/patches/110-disable_usb_compat.patch

    r29436 r30346  
    3434--- a/config.mk 
    3535+++ b/config.mk 
    36 @@ -492,7 +492,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
     36@@ -496,7 +496,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
    3737 # This activates a threading fix for usb urb. 
    3838 # this is mainline commit: b3e670443b7fb8a2d29831b62b44a039c283e351 
  • trunk/package/mac80211/patches/120-pr_fmt_warnings.patch

    r29436 r30346  
    7171--- a/net/wireless/reg.c 
    7272+++ b/net/wireless/reg.c 
    73 @@ -33,6 +33,7 @@ 
     73@@ -42,6 +42,7 @@ 
    7474  * 
    7575  */ 
  • trunk/package/mac80211/patches/140-mesh_pathtbl_backport.patch

    r29436 r30346  
    11--- a/net/mac80211/mesh_pathtbl.c 
    22+++ b/net/mac80211/mesh_pathtbl.c 
    3 @@ -826,7 +826,6 @@ static void table_flush_by_iface(struct  
     3@@ -828,7 +828,6 @@ static void table_flush_by_iface(struct  
    44        struct hlist_node *p; 
    55        int i; 
  • trunk/package/mac80211/patches/300-pending_work.patch

    r29684 r30346  
    1 --- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c 
    2 +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c 
    3 @@ -203,7 +203,7 @@ static void ar9002_hw_iqcalibrate(struct 
    4                         i); 
    5   
    6                 ath_dbg(common, ATH_DBG_CALIBRATE, 
    7 -                       "Orignal: Chn %diq_corr_meas = 0x%08x\n", 
    8 +                       "Original: Chn %d iq_corr_meas = 0x%08x\n", 
    9                         i, ah->totalIqCorrMeas[i]); 
    10   
    11                 iqCorrNeg = 0; 
    12 --- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c 
    13 +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c 
    14 @@ -226,7 +226,7 @@ static void ar9003_hw_iqcalibrate(struct 
    15                         i); 
    16   
    17                 ath_dbg(common, ATH_DBG_CALIBRATE, 
    18 -                       "Orignal: Chn %diq_corr_meas = 0x%08x\n", 
    19 +                       "Original: Chn %d iq_corr_meas = 0x%08x\n", 
    20                         i, ah->totalIqCorrMeas[i]); 
    21   
    22                 iqCorrNeg = 0; 
    23 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c 
    24 +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c 
    25 @@ -808,7 +808,8 @@ void ath9k_htc_ani_work(struct work_stru 
    26         } 
    27   
    28         /* Verify whether we must check ANI */ 
    29 -       if ((timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) { 
    30 +       if (ah->config.enable_ani && 
    31 +           (timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) { 
    32                 aniflag = true; 
    33                 common->ani.checkani_timer = timestamp; 
    34         } 
    35 --- a/drivers/net/wireless/ath/ath9k/hw.c 
    36 +++ b/drivers/net/wireless/ath/ath9k/hw.c 
    37 @@ -504,7 +504,7 @@ static int ath9k_hw_post_init(struct ath 
    38                 return ecode; 
    39         } 
    40   
    41 -       if (!AR_SREV_9100(ah) && !AR_SREV_9340(ah)) { 
    42 +       if (ah->config.enable_ani) { 
    43                 ath9k_hw_ani_setup(ah); 
    44                 ath9k_hw_ani_init(ah); 
    45         } 
    46 @@ -610,6 +610,10 @@ static int __ath9k_hw_init(struct ath_hw 
    47         if (!AR_SREV_9300_20_OR_LATER(ah)) 
    48                 ah->ani_function &= ~ATH9K_ANI_MRC_CCK; 
    49   
    50 +       /* disable ANI for 9340 */ 
    51 +       if (AR_SREV_9340(ah)) 
    52 +               ah->config.enable_ani = false; 
    53 + 
    54         ath9k_hw_init_mode_regs(ah); 
    55   
    56         if (!ah->is_pciexpress) 
    57 --- a/drivers/net/wireless/ath/ath9k/main.c 
    58 +++ b/drivers/net/wireless/ath/ath9k/main.c 
    59 @@ -118,7 +118,7 @@ void ath9k_ps_restore(struct ath_softc * 
    60         if (--sc->ps_usecount != 0) 
    61                 goto unlock; 
    62   
    63 -       if (sc->ps_idle) 
    64 +       if (sc->ps_idle && (sc->ps_flags & PS_WAIT_FOR_TX_ACK)) 
    65                 mode = ATH9K_PM_FULL_SLEEP; 
    66         else if (sc->ps_enabled && 
    67                  !(sc->ps_flags & (PS_WAIT_FOR_BEACON | 
    68 @@ -286,7 +286,7 @@ static bool ath_complete_reset(struct at 
    69                         ath_start_ani(common); 
    70         } 
    71   
    72 -       if (ath9k_hw_ops(ah)->antdiv_comb_conf_get && sc->ant_rx != 3) { 
    73 +       if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3) { 
    74                 struct ath_hw_antcomb_conf div_ant_conf; 
    75                 u8 lna_conf; 
    76   
    77 @@ -332,7 +332,8 @@ static int ath_reset_internal(struct ath 
    78                 hchan = ah->curchan; 
    79         } 
    80   
    81 -       if (fastcc && !ath9k_hw_check_alive(ah)) 
    82 +       if (fastcc && (ah->chip_fullsleep || 
    83 +           !ath9k_hw_check_alive(ah))) 
    84                 fastcc = false; 
    85   
    86         if (!ath_prepare_reset(sc, retry_tx, flush)) 
    87 @@ -561,7 +562,6 @@ void ath_ani_calibrate(unsigned long dat 
    88         /* Long calibration runs independently of short calibration. */ 
    89         if ((timestamp - common->ani.longcal_timer) >= long_cal_interval) { 
    90                 longcal = true; 
    91 -               ath_dbg(common, ATH_DBG_ANI, "longcal @%lu\n", jiffies); 
    92                 common->ani.longcal_timer = timestamp; 
    93         } 
    94   
    95 @@ -569,8 +569,6 @@ void ath_ani_calibrate(unsigned long dat 
    96         if (!common->ani.caldone) { 
    97                 if ((timestamp - common->ani.shortcal_timer) >= short_cal_interval) { 
    98                         shortcal = true; 
    99 -                       ath_dbg(common, ATH_DBG_ANI, 
    100 -                               "shortcal @%lu\n", jiffies); 
    101                         common->ani.shortcal_timer = timestamp; 
    102                         common->ani.resetcal_timer = timestamp; 
    103                 } 
    104 @@ -584,8 +582,9 @@ void ath_ani_calibrate(unsigned long dat 
    105         } 
    106   
    107         /* Verify whether we must check ANI */ 
    108 -       if ((timestamp - common->ani.checkani_timer) >= 
    109 -            ah->config.ani_poll_interval) { 
    110 +       if (sc->sc_ah->config.enable_ani 
    111 +           && (timestamp - common->ani.checkani_timer) >= 
    112 +           ah->config.ani_poll_interval) { 
    113                 aniflag = true; 
    114                 common->ani.checkani_timer = timestamp; 
    115         } 
    116 @@ -605,6 +604,11 @@ void ath_ani_calibrate(unsigned long dat 
    117                                                 ah->rxchainmask, longcal); 
    118         } 
    119   
    120 +       ath_dbg(common, ATH_DBG_ANI, 
    121 +               "Calibration @%lu finished: %s %s %s, caldone: %s\n", jiffies, 
    122 +               longcal ? "long" : "", shortcal ? "short" : "", 
    123 +               aniflag ? "ani" : "", common->ani.caldone ? "true" : "false"); 
    124 + 
    125         ath9k_ps_restore(sc); 
    126   
    127  set_timer: 
    128 @@ -886,82 +890,6 @@ chip_reset: 
    129  #undef SCHED_INTR 
    130  } 
    131   
    132 -static void ath_radio_enable(struct ath_softc *sc, struct ieee80211_hw *hw) 
    133 -{ 
    134 -       struct ath_hw *ah = sc->sc_ah; 
    135 -       struct ath_common *common = ath9k_hw_common(ah); 
    136 -       struct ieee80211_channel *channel = hw->conf.channel; 
    137 -       int r; 
    138 - 
    139 -       ath9k_ps_wakeup(sc); 
    140 -       spin_lock_bh(&sc->sc_pcu_lock); 
    141 -       atomic_set(&ah->intr_ref_cnt, -1); 
    142 - 
    143 -       ath9k_hw_configpcipowersave(ah, false); 
    144 - 
    145 -       if (!ah->curchan) 
    146 -               ah->curchan = ath9k_cmn_get_curchannel(sc->hw, ah); 
    147 - 
    148 -       r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); 
    149 -       if (r) { 
    150 -               ath_err(common, 
    151 -                       "Unable to reset channel (%u MHz), reset status %d\n", 
    152 -                       channel->center_freq, r); 
    153 -       } 
    154 - 
    155 -       ath_complete_reset(sc, true); 
    156 - 
    157 -       /* Enable LED */ 
    158 -       ath9k_hw_cfg_output(ah, ah->led_pin, 
    159 -                           AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
    160 -       ath9k_hw_set_gpio(ah, ah->led_pin, 0); 
    161 - 
    162 -       spin_unlock_bh(&sc->sc_pcu_lock); 
    163 - 
    164 -       ath9k_ps_restore(sc); 
    165 -} 
    166 - 
    167 -void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw) 
    168 -{ 
    169 -       struct ath_hw *ah = sc->sc_ah; 
    170 -       struct ieee80211_channel *channel = hw->conf.channel; 
    171 -       int r; 
    172 - 
    173 -       ath9k_ps_wakeup(sc); 
    174 - 
    175 -       ath_cancel_work(sc); 
    176 - 
    177 -       spin_lock_bh(&sc->sc_pcu_lock); 
    178 - 
    179 -       /* 
    180 -        * Keep the LED on when the radio is disabled 
    181 -        * during idle unassociated state. 
    182 -        */ 
    183 -       if (!sc->ps_idle) { 
    184 -               ath9k_hw_set_gpio(ah, ah->led_pin, 1); 
    185 -               ath9k_hw_cfg_gpio_input(ah, ah->led_pin); 
    186 -       } 
    187 - 
    188 -       ath_prepare_reset(sc, false, true); 
    189 - 
    190 -       if (!ah->curchan) 
    191 -               ah->curchan = ath9k_cmn_get_curchannel(hw, ah); 
    192 - 
    193 -       r = ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); 
    194 -       if (r) { 
    195 -               ath_err(ath9k_hw_common(sc->sc_ah), 
    196 -                       "Unable to reset channel (%u MHz), reset status %d\n", 
    197 -                       channel->center_freq, r); 
    198 -       } 
    199 - 
    200 -       ath9k_hw_phy_disable(ah); 
    201 - 
    202 -       ath9k_hw_configpcipowersave(ah, true); 
    203 - 
    204 -       spin_unlock_bh(&sc->sc_pcu_lock); 
    205 -       ath9k_ps_restore(sc); 
    206 -} 
    207 - 
    208  static int ath_reset(struct ath_softc *sc, bool retry_tx) 
    209  { 
    210         int r; 
    211 @@ -1097,6 +1025,9 @@ static int ath9k_start(struct ieee80211_ 
    212          * and then setup of the interrupt mask. 
    213          */ 
    214         spin_lock_bh(&sc->sc_pcu_lock); 
    215 + 
    216 +       atomic_set(&ah->intr_ref_cnt, -1); 
    217 + 
    218         r = ath9k_hw_reset(ah, init_channel, ah->caldata, false); 
    219         if (r) { 
    220                 ath_err(common, 
    221 @@ -1138,6 +1069,18 @@ static int ath9k_start(struct ieee80211_ 
    222                 goto mutex_unlock; 
    223         } 
    224   
    225 +       if (ah->led_pin >= 0) { 
    226 +               ath9k_hw_cfg_output(ah, ah->led_pin, 
    227 +                                   AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
    228 +               ath9k_hw_set_gpio(ah, ah->led_pin, 0); 
    229 +       } 
    230 + 
    231 +       /* 
    232 +        * Reset key cache to sane defaults (all entries cleared) instead of 
    233 +        * semi-random values after suspend/resume. 
    234 +        */ 
    235 +       ath9k_cmn_init_crypto(sc->sc_ah); 
    236 + 
    237         spin_unlock_bh(&sc->sc_pcu_lock); 
    238   
    239         if ((ah->btcoex_hw.scheme != ATH_BTCOEX_CFG_NONE) && 
    240 @@ -1183,6 +1126,13 @@ static void ath9k_tx(struct ieee80211_hw 
    241                 } 
    242         } 
    243   
    244 +       /* 
    245 +        * Cannot tx while the hardware is in full sleep, it first needs a full 
    246 +        * chip reset to recover from that 
    247 +        */ 
    248 +       if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_FULL_SLEEP)) 
    249 +               goto exit; 
    250 + 
    251         if (unlikely(sc->sc_ah->power_mode != ATH9K_PM_AWAKE)) { 
    252                 /* 
    253                  * We are using PS-Poll and mac80211 can request TX while in 
    254 @@ -1229,6 +1179,7 @@ static void ath9k_stop(struct ieee80211_ 
    255         struct ath_softc *sc = hw->priv; 
    256         struct ath_hw *ah = sc->sc_ah; 
    257         struct ath_common *common = ath9k_hw_common(ah); 
    258 +       bool prev_idle; 
    259   
    260         mutex_lock(&sc->mutex); 
    261   
    262 @@ -1259,35 +1210,45 @@ static void ath9k_stop(struct ieee80211_ 
    263          * before setting the invalid flag. */ 
    264         ath9k_hw_disable_interrupts(ah); 
    265   
    266 -       if (!(sc->sc_flags & SC_OP_INVALID)) { 
    267 -               ath_drain_all_txq(sc, false); 
    268 -               ath_stoprecv(sc); 
    269 -               ath9k_hw_phy_disable(ah); 
    270 -       } else 
    271 -               sc->rx.rxlink = NULL; 
    272 +       spin_unlock_bh(&sc->sc_pcu_lock); 
    273 + 
    274 +       /* we can now sync irq and kill any running tasklets, since we already 
    275 +        * disabled interrupts and not holding a spin lock */ 
    276 +       synchronize_irq(sc->irq); 
    277 +       tasklet_kill(&sc->intr_tq); 
    278 +       tasklet_kill(&sc->bcon_tasklet); 
    279 + 
    280 +       prev_idle = sc->ps_idle; 
    281 +       sc->ps_idle = true; 
    282 + 
    283 +       spin_lock_bh(&sc->sc_pcu_lock); 
    284 + 
    285 +       if (ah->led_pin >= 0) { 
    286 +               ath9k_hw_set_gpio(ah, ah->led_pin, 1); 
    287 +               ath9k_hw_cfg_gpio_input(ah, ah->led_pin); 
    288 +       } 
    289 + 
    290 +       ath_prepare_reset(sc, false, true); 
    291   
    292         if (sc->rx.frag) { 
    293                 dev_kfree_skb_any(sc->rx.frag); 
    294                 sc->rx.frag = NULL; 
    295         } 
    296   
    297 -       /* disable HAL and put h/w to sleep */ 
    298 -       ath9k_hw_disable(ah); 
    299 +       if (!ah->curchan) 
    300 +               ah->curchan = ath9k_cmn_get_curchannel(hw, ah); 
    301   
    302 -       spin_unlock_bh(&sc->sc_pcu_lock); 
    303 +       ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); 
    304 +       ath9k_hw_phy_disable(ah); 
    305   
    306 -       /* we can now sync irq and kill any running tasklets, since we already 
    307 -        * disabled interrupts and not holding a spin lock */ 
    308 -       synchronize_irq(sc->irq); 
    309 -       tasklet_kill(&sc->intr_tq); 
    310 -       tasklet_kill(&sc->bcon_tasklet); 
    311 +       ath9k_hw_configpcipowersave(ah, true); 
    312   
    313 -       ath9k_ps_restore(sc); 
    314 +       spin_unlock_bh(&sc->sc_pcu_lock); 
    315   
    316 -       sc->ps_idle = true; 
    317 -       ath_radio_disable(sc, hw); 
    318 +       ath9k_ps_restore(sc); 
    319   
    320         sc->sc_flags |= SC_OP_INVALID; 
    321 +       sc->ps_idle = prev_idle; 
    322   
    323         mutex_unlock(&sc->mutex); 
    324   
    325 @@ -1627,8 +1588,8 @@ static int ath9k_config(struct ieee80211 
    326         struct ath_hw *ah = sc->sc_ah; 
    327         struct ath_common *common = ath9k_hw_common(ah); 
    328         struct ieee80211_conf *conf = &hw->conf; 
    329 -       bool disable_radio = false; 
    330   
    331 +       ath9k_ps_wakeup(sc); 
    332         mutex_lock(&sc->mutex); 
    333   
    334         /* 
    335 @@ -1639,13 +1600,8 @@ static int ath9k_config(struct ieee80211 
    336          */ 
    337         if (changed & IEEE80211_CONF_CHANGE_IDLE) { 
    338                 sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE); 
    339 -               if (!sc->ps_idle) { 
    340 -                       ath_radio_enable(sc, hw); 
    341 -                       ath_dbg(common, ATH_DBG_CONFIG, 
    342 -                               "not-idle: enabling radio\n"); 
    343 -               } else { 
    344 -                       disable_radio = true; 
    345 -               } 
    346 +               if (sc->ps_idle) 
    347 +                       ath_cancel_work(sc); 
    348         } 
    349   
    350         /* 
    351 @@ -1678,7 +1634,6 @@ static int ath9k_config(struct ieee80211 
    352   
    353         if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 
    354                 struct ieee80211_channel *curchan = hw->conf.channel; 
    355 -               struct ath9k_channel old_chan; 
    356                 int pos = curchan->hw_value; 
    357                 int old_pos = -1; 
    358                 unsigned long flags; 
    359 @@ -1704,11 +1659,8 @@ static int ath9k_config(struct ieee80211 
    360                  * Preserve the current channel values, before updating 
    361                  * the same channel 
    362                  */ 
    363 -               if (old_pos == pos) { 
    364 -                       memcpy(&old_chan, &sc->sc_ah->channels[pos], 
    365 -                               sizeof(struct ath9k_channel)); 
    366 -                       ah->curchan = &old_chan; 
    367 -               } 
    368 +               if (ah->curchan && (old_pos == pos)) 
    369 +                       ath9k_hw_getnf(ah, ah->curchan); 
    370   
    371                 ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos], 
    372                                           curchan, conf->channel_type); 
    373 @@ -1752,18 +1704,12 @@ static int ath9k_config(struct ieee80211 
    374                 ath_dbg(common, ATH_DBG_CONFIG, 
    375                         "Set power: %d\n", conf->power_level); 
    376                 sc->config.txpowlimit = 2 * conf->power_level; 
    377 -               ath9k_ps_wakeup(sc); 
    378                 ath9k_cmn_update_txpow(ah, sc->curtxpow, 
    379                                        sc->config.txpowlimit, &sc->curtxpow); 
    380 -               ath9k_ps_restore(sc); 
    381 -       } 
    382 - 
    383 -       if (disable_radio) { 
    384 -               ath_dbg(common, ATH_DBG_CONFIG, "idle: disabling radio\n"); 
    385 -               ath_radio_disable(sc, hw); 
    386         } 
    387   
    388         mutex_unlock(&sc->mutex); 
    389 +       ath9k_ps_restore(sc); 
    390   
    391         return 0; 
    392  } 
    393 @@ -2331,9 +2277,6 @@ static void ath9k_flush(struct ieee80211 
    394                 return; 
    395         } 
    396   
    397 -       if (drop) 
    398 -               timeout = 1; 
    399 - 
    400         for (j = 0; j < timeout; j++) { 
    401                 bool npend = false; 
    402   
    403 @@ -2351,21 +2294,22 @@ static void ath9k_flush(struct ieee80211 
    404                 } 
    405   
    406                 if (!npend) 
    407 -                   goto out; 
    408 +                   break; 
    409         } 
    410   
    411 -       ath9k_ps_wakeup(sc); 
    412 -       spin_lock_bh(&sc->sc_pcu_lock); 
    413 -       drain_txq = ath_drain_all_txq(sc, false); 
    414 -       spin_unlock_bh(&sc->sc_pcu_lock); 
    415 +       if (drop) { 
    416 +               ath9k_ps_wakeup(sc); 
    417 +               spin_lock_bh(&sc->sc_pcu_lock); 
    418 +               drain_txq = ath_drain_all_txq(sc, false); 
    419 +               spin_unlock_bh(&sc->sc_pcu_lock); 
    420   
    421 -       if (!drain_txq) 
    422 -               ath_reset(sc, false); 
    423 +               if (!drain_txq) 
    424 +                       ath_reset(sc, false); 
    425   
    426 -       ath9k_ps_restore(sc); 
    427 -       ieee80211_wake_queues(hw); 
    428 +               ath9k_ps_restore(sc); 
    429 +               ieee80211_wake_queues(hw); 
    430 +       } 
    431   
    432 -out: 
    433         ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); 
    434         mutex_unlock(&sc->mutex); 
    435  } 
    436 --- a/drivers/net/wireless/ath/ath9k/pci.c 
    437 +++ b/drivers/net/wireless/ath/ath9k/pci.c 
    438 @@ -307,12 +307,11 @@ static int ath_pci_suspend(struct device 
    439         struct ieee80211_hw *hw = pci_get_drvdata(pdev); 
    440         struct ath_softc *sc = hw->priv; 
    441   
    442 -       ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); 
    443 - 
    444         /* The device has to be moved to FULLSLEEP forcibly. 
    445          * Otherwise the chip never moved to full sleep, 
    446          * when no interface is up. 
    447          */ 
    448 +       ath9k_hw_disable(sc->sc_ah); 
    449         ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); 
    450   
    451         return 0; 
    452 @@ -334,22 +333,6 @@ static int ath_pci_resume(struct device  
    453         if ((val & 0x0000ff00) != 0) 
    454                 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); 
    455   
    456 -       ath9k_ps_wakeup(sc); 
    457 -       /* Enable LED */ 
    458 -       ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin, 
    459 -                           AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
    460 -       ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); 
    461 - 
    462 -         /* 
    463 -          * Reset key cache to sane defaults (all entries cleared) instead of 
    464 -          * semi-random values after suspend/resume. 
    465 -          */ 
    466 -       ath9k_cmn_init_crypto(sc->sc_ah); 
    467 -       ath9k_ps_restore(sc); 
    468 - 
    469 -       sc->ps_idle = true; 
    470 -       ath_radio_disable(sc, hw); 
    471 - 
    472         return 0; 
    473  } 
    474   
    475 --- a/drivers/net/wireless/ath/ath9k/xmit.c 
    476 +++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    477 @@ -1954,7 +1954,7 @@ static void ath_tx_complete(struct ath_s 
    478                 skb_pull(skb, padsize); 
    479         } 
    480   
    481 -       if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) { 
    482 +       if ((sc->ps_flags & PS_WAIT_FOR_TX_ACK) && !txq->axq_depth) { 
    483                 sc->ps_flags &= ~PS_WAIT_FOR_TX_ACK; 
    484                 ath_dbg(common, ATH_DBG_PS, 
    485                         "Going back to sleep after having received TX status (0x%lx)\n", 
    486 --- a/include/linux/nl80211.h 
    487 +++ b/include/linux/nl80211.h 
    488 @@ -2785,9 +2785,11 @@ enum nl80211_ap_sme_features { 
    489   * @NL80211_FEATURE_SK_TX_STATUS: This driver supports reflecting back 
    490   *     TX status to the socket error queue when requested with the 
    491   *     socket option. 
    492 + * @NL80211_FEATURE_HT_IBSS: This driver supports IBSS with HT datarates. 
    493   */ 
    494  enum nl80211_feature_flags { 
    495         NL80211_FEATURE_SK_TX_STATUS    = 1 << 0, 
    496 +       NL80211_FEATURE_HT_IBSS         = 1 << 1, 
    497  }; 
    498   
    499  /** 
    500 --- a/include/net/cfg80211.h 
    501 +++ b/include/net/cfg80211.h 
    502 @@ -1149,6 +1149,7 @@ struct cfg80211_ibss_params { 
    503         u8 *ssid; 
    504         u8 *bssid; 
    505         struct ieee80211_channel *channel; 
    506 +       enum nl80211_channel_type channel_type; 
    507         u8 *ie; 
    508         u8 ssid_len, ie_len; 
    509         u16 beacon_interval; 
    510 @@ -3270,6 +3271,16 @@ void cfg80211_report_obss_beacon(struct  
    511                                  const u8 *frame, size_t len, 
    512                                  int freq, gfp_t gfp); 
    513   
    514 +/* 
    515 + * cfg80211_can_beacon_sec_chan - test if ht40 on extension channel can be used 
    516 + * @wiphy: the wiphy 
    517 + * @chan: main channel 
    518 + * @channel_type: HT mode 
    519 + */ 
    520 +int cfg80211_can_beacon_sec_chan(struct wiphy *wiphy, 
    521 +                                struct ieee80211_channel *chan, 
    522 +                                enum nl80211_channel_type channel_type); 
    523 + 
    524  /* Logging, debugging and troubleshooting/diagnostic helpers. */ 
    525   
    526  /* wiphy_printk helpers, similar to dev_printk */ 
    5271--- a/net/mac80211/agg-rx.c 
    5282+++ b/net/mac80211/agg-rx.c 
    529 @@ -185,6 +185,10 @@ static void ieee80211_send_addba_resp(st 
    530                 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 
    531         else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
     3@@ -187,6 +187,8 @@ static void ieee80211_send_addba_resp(st 
    5324                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    533 +       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
    534 +               memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
     5        else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
     6                memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
    5357+       else if (sdata->vif.type == NL80211_IFTYPE_WDS) 
    5368+               memcpy(mgmt->bssid, da, ETH_ALEN); 
     
    54012--- a/net/mac80211/agg-tx.c 
    54113+++ b/net/mac80211/agg-tx.c 
    542 @@ -55,6 +55,8 @@ 
    543   * @ampdu_action function will be called with the action 
    544   * %IEEE80211_AMPDU_TX_STOP. In this case, the call must not fail, 
    545   * and the driver must later call ieee80211_stop_tx_ba_cb_irqsafe(). 
    546 + * Note that the sta can get destroyed before the BA tear down is 
    547 + * complete. 
    548   */ 
    549   
    550  static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata, 
    551 @@ -79,10 +81,13 @@ static void ieee80211_send_addba_request 
     14@@ -81,7 +81,8 @@ static void ieee80211_send_addba_request 
    55215        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 
    55316        if (sdata->vif.type == NL80211_IFTYPE_AP || 
     
    55922        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
    56023                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    561 +       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
    562 +               memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
    563   
    564         mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
    565                                           IEEE80211_STYPE_ACTION); 
    566 @@ -319,6 +324,38 @@ ieee80211_wake_queue_agg(struct ieee8021 
    567         __release(agg_queue); 
    568  } 
    569   
    570 +/* 
    571 + * splice packets from the STA's pending to the local pending, 
    572 + * requires a call to ieee80211_agg_splice_finish later 
    573 + */ 
    574 +static void __acquires(agg_queue) 
    575 +ieee80211_agg_splice_packets(struct ieee80211_local *local, 
    576 +                            struct tid_ampdu_tx *tid_tx, u16 tid) 
    577 +{ 
    578 +       int queue = ieee80211_ac_from_tid(tid); 
    579 +       unsigned long flags; 
    580 + 
    581 +       ieee80211_stop_queue_agg(local, tid); 
    582 + 
    583 +       if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates" 
    584 +                         " from the pending queue\n", tid)) 
    585 +               return; 
    586 + 
    587 +       if (!skb_queue_empty(&tid_tx->pending)) { 
    588 +               spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 
    589 +               /* copy over remaining packets */ 
    590 +               skb_queue_splice_tail_init(&tid_tx->pending, 
    591 +                                          &local->pending[queue]); 
    592 +               spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 
    593 +       } 
    594 +} 
    595 + 
    596 +static void __releases(agg_queue) 
    597 +ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) 
    598 +{ 
    599 +       ieee80211_wake_queue_agg(local, tid); 
    600 +} 
    601 + 
    602  void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) 
    603  { 
    604         struct tid_ampdu_tx *tid_tx; 
    605 @@ -330,19 +367,17 @@ void ieee80211_tx_ba_session_handle_star 
    606         tid_tx = rcu_dereference_protected_tid_tx(sta, tid); 
    607   
    608         /* 
    609 -        * While we're asking the driver about the aggregation, 
    610 -        * stop the AC queue so that we don't have to worry 
    611 -        * about frames that came in while we were doing that, 
    612 -        * which would require us to put them to the AC pending 
    613 -        * afterwards which just makes the code more complex. 
    614 +        * Start queuing up packets for this aggregation session. 
    615 +        * We're going to release them once the driver is OK with 
    616 +        * that. 
    617          */ 
    618 -       ieee80211_stop_queue_agg(local, tid); 
    619 - 
    620         clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); 
    621   
    622         /* 
    623 -        * make sure no packets are being processed to get 
    624 -        * valid starting sequence number 
    625 +        * Make sure no packets are being processed. This ensures that 
    626 +        * we have a valid starting sequence number and that in-flight 
    627 +        * packets have been flushed out and no packets for this TID 
    628 +        * will go into the driver during the ampdu_action call. 
    629          */ 
    630         synchronize_net(); 
    631   
    632 @@ -356,10 +391,11 @@ void ieee80211_tx_ba_session_handle_star 
    633                                         " tid %d\n", tid); 
    634  #endif 
    635                 spin_lock_bh(&sta->lock); 
    636 +               ieee80211_agg_splice_packets(local, tid_tx, tid); 
    637                 ieee80211_assign_tid_tx(sta, tid, NULL); 
    638 +               ieee80211_agg_splice_finish(local, tid); 
    639                 spin_unlock_bh(&sta->lock); 
    640   
    641 -               ieee80211_wake_queue_agg(local, tid); 
    642  #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,40)) 
    643                 kfree_rcu(tid_tx, rcu_head); 
    644  #else 
    645 @@ -368,9 +404,6 @@ void ieee80211_tx_ba_session_handle_star 
    646                 return; 
    647         } 
    648   
    649 -       /* we can take packets again now */ 
    650 -       ieee80211_wake_queue_agg(local, tid); 
    651 - 
    652         /* activate the timer for the recipient's addBA response */ 
    653         mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL); 
    654  #ifdef CONFIG_MAC80211_HT_DEBUG 
    655 @@ -437,7 +470,9 @@ int ieee80211_start_tx_ba_session(struct 
    656         if (sdata->vif.type != NL80211_IFTYPE_STATION && 
     24@@ -471,6 +472,7 @@ int ieee80211_start_tx_ba_session(struct 
    65725            sdata->vif.type != NL80211_IFTYPE_MESH_POINT && 
    65826            sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
    659 -           sdata->vif.type != NL80211_IFTYPE_AP) 
    660 +           sdata->vif.type != NL80211_IFTYPE_AP && 
     27            sdata->vif.type != NL80211_IFTYPE_AP && 
    66128+           sdata->vif.type != NL80211_IFTYPE_WDS && 
    662 +           sdata->vif.type != NL80211_IFTYPE_ADHOC) 
     29            sdata->vif.type != NL80211_IFTYPE_ADHOC) 
    66330                return -EINVAL; 
    66431  
    665         if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) { 
    666 @@ -448,6 +483,27 @@ int ieee80211_start_tx_ba_session(struct 
    667                 return -EINVAL; 
    668         } 
    669   
    670 +       /* 
    671 +        * 802.11n-2009 11.5.1.1: If the initiating STA is an HT STA, is a 
    672 +        * member of an IBSS, and has no other existing Block Ack agreement 
    673 +        * with the recipient STA, then the initiating STA shall transmit a 
    674 +        * Probe Request frame to the recipient STA and shall not transmit an 
    675 +        * ADDBA Request frame unless it receives a Probe Response frame 
    676 +        * from the recipient within dot11ADDBAFailureTimeout. 
    677 +        * 
    678 +        * The probe request mechanism for ADDBA is currently not implemented, 
    679 +        * but we only build up Block Ack session with HT STAs. This information 
    680 +        * is set when we receive a bss info from a probe response or a beacon. 
    681 +        */ 
    682 +       if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC && 
    683 +           !sta->sta.ht_cap.ht_supported) { 
    684 +#ifdef CONFIG_MAC80211_HT_DEBUG 
    685 +               printk(KERN_DEBUG "BA request denied - IBSS STA %pM" 
    686 +                      "does not advertise HT support\n", pubsta->addr); 
    687 +#endif /* CONFIG_MAC80211_HT_DEBUG */ 
    688 +               return -EINVAL; 
    689 +       } 
    690 + 
    691         spin_lock_bh(&sta->lock); 
    692   
    693         /* we have tried too many times, receiver does not want A-MPDU */ 
    694 @@ -508,38 +564,6 @@ int ieee80211_start_tx_ba_session(struct 
    695  } 
    696  EXPORT_SYMBOL(ieee80211_start_tx_ba_session); 
    697   
    698 -/* 
    699 - * splice packets from the STA's pending to the local pending, 
    700 - * requires a call to ieee80211_agg_splice_finish later 
    701 - */ 
    702 -static void __acquires(agg_queue) 
    703 -ieee80211_agg_splice_packets(struct ieee80211_local *local, 
    704 -                            struct tid_ampdu_tx *tid_tx, u16 tid) 
    705 -{ 
    706 -       int queue = ieee80211_ac_from_tid(tid); 
    707 -       unsigned long flags; 
    708 - 
    709 -       ieee80211_stop_queue_agg(local, tid); 
    710 - 
    711 -       if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates" 
    712 -                         " from the pending queue\n", tid)) 
    713 -               return; 
    714 - 
    715 -       if (!skb_queue_empty(&tid_tx->pending)) { 
    716 -               spin_lock_irqsave(&local->queue_stop_reason_lock, flags); 
    717 -               /* copy over remaining packets */ 
    718 -               skb_queue_splice_tail_init(&tid_tx->pending, 
    719 -                                          &local->pending[queue]); 
    720 -               spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 
    721 -       } 
    722 -} 
    723 - 
    724 -static void __releases(agg_queue) 
    725 -ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) 
    726 -{ 
    727 -       ieee80211_wake_queue_agg(local, tid); 
    728 -} 
    729 - 
    730  static void ieee80211_agg_tx_operational(struct ieee80211_local *local, 
    731                                          struct sta_info *sta, u16 tid) 
    732  { 
    73332--- a/net/mac80211/debugfs_sta.c 
    73433+++ b/net/mac80211/debugfs_sta.c 
     
    73736  
    73837        int res = scnprintf(buf, sizeof(buf), 
    739 -                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
    740 +                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
     38-                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
     39+                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
    74140                            TEST(AUTH), TEST(ASSOC), TEST(PS_STA), 
    74241                            TEST(PS_DRIVER), TEST(AUTHORIZED), 
     
    74645                            TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL), 
    74746                            TEST(UAPSD), TEST(SP), TEST(TDLS_PEER), 
    748                             TEST(TDLS_PEER_AUTH)); 
    749 --- a/net/mac80211/ht.c 
    750 +++ b/net/mac80211/ht.c 
    751 @@ -47,7 +47,9 @@ void ieee80211_apply_htcap_overrides(str 
    752         int i; 
    753   
    754         if (sdata->vif.type != NL80211_IFTYPE_STATION) { 
    755 -               WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION); 
    756 +               /* AP interfaces call this code when adding new stations, 
    757 +                * so just silently ignore non station interfaces. 
    758 +                */ 
    759                 return; 
    760         } 
    761   
    762 @@ -282,6 +284,8 @@ void ieee80211_send_delba(struct ieee802 
    763                 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 
    764         else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
    765                 memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    766 +       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
    767 +               memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
    768   
    769         mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
    770                                           IEEE80211_STYPE_ACTION); 
    771 --- a/net/mac80211/ibss.c 
    772 +++ b/net/mac80211/ibss.c 
    773 @@ -77,6 +77,7 @@ static void __ieee80211_sta_join_ibss(st 
    774         struct cfg80211_bss *bss; 
    775         u32 bss_change; 
    776         u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; 
    777 +       enum nl80211_channel_type channel_type; 
    778   
    779         lockdep_assert_held(&ifibss->mtx); 
    780   
    781 @@ -105,8 +106,16 @@ static void __ieee80211_sta_join_ibss(st 
    782   
    783         sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; 
    784   
    785 -       local->oper_channel = chan; 
    786 -       WARN_ON(!ieee80211_set_channel_type(local, sdata, NL80211_CHAN_NO_HT)); 
    787 +       channel_type = ifibss->channel_type; 
    788 +       if (channel_type > NL80211_CHAN_HT20 && 
    789 +           !cfg80211_can_beacon_sec_chan(local->hw.wiphy, chan, channel_type)) 
    790 +               channel_type = NL80211_CHAN_HT20; 
    791 +       if (!ieee80211_set_channel_type(local, sdata, channel_type)) { 
    792 +               /* can only fail due to HT40+/- mismatch */ 
    793 +               channel_type = NL80211_CHAN_HT20; 
    794 +               WARN_ON(!ieee80211_set_channel_type(local, sdata, 
    795 +                                                   NL80211_CHAN_HT20)); 
    796 +       } 
    797         ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); 
    798   
    799         sband = local->hw.wiphy->bands[chan->band]; 
    800 @@ -172,6 +181,19 @@ static void __ieee80211_sta_join_ibss(st 
    801                 memcpy(skb_put(skb, ifibss->ie_len), 
    802                        ifibss->ie, ifibss->ie_len); 
    803   
    804 +       /* add HT capability and information IEs */ 
    805 +       if (channel_type && sband->ht_cap.ht_supported) { 
    806 +               pos = skb_put(skb, 4 + 
    807 +                                  sizeof(struct ieee80211_ht_cap) + 
    808 +                                  sizeof(struct ieee80211_ht_info)); 
    809 +               pos = ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, 
    810 +                                               sband->ht_cap.cap); 
    811 +               pos = ieee80211_ie_build_ht_info(pos, 
    812 +                                                &sband->ht_cap, 
    813 +                                                chan, 
    814 +                                                channel_type); 
    815 +       } 
    816 + 
    817         if (local->hw.queues >= 4) { 
    818                 pos = skb_put(skb, 9); 
    819                 *pos++ = WLAN_EID_VENDOR_SPECIFIC; 
    820 @@ -195,6 +217,7 @@ static void __ieee80211_sta_join_ibss(st 
    821         bss_change |= BSS_CHANGED_BEACON; 
    822         bss_change |= BSS_CHANGED_BEACON_ENABLED; 
    823         bss_change |= BSS_CHANGED_BASIC_RATES; 
    824 +       bss_change |= BSS_CHANGED_HT; 
    825         bss_change |= BSS_CHANGED_IBSS; 
    826         sdata->vif.bss_conf.ibss_joined = true; 
    827         ieee80211_bss_info_change_notify(sdata, bss_change); 
    828 @@ -268,6 +291,8 @@ static void ieee80211_rx_bss_info(struct 
    829         u64 beacon_timestamp, rx_timestamp; 
    830         u32 supp_rates = 0; 
    831         enum ieee80211_band band = rx_status->band; 
    832 +       struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band]; 
    833 +       bool rates_updated = false; 
    834   
    835         if (elems->ds_params && elems->ds_params_len == 1) 
    836                 freq = ieee80211_channel_to_frequency(elems->ds_params[0], 
    837 @@ -307,7 +332,7 @@ static void ieee80211_rx_bss_info(struct 
    838                                                 prev_rates, 
    839                                                 sta->sta.supp_rates[band]); 
    840  #endif 
    841 -                                       rate_control_rate_init(sta); 
    842 +                                       rates_updated = true; 
    843                                 } 
    844                         } else 
    845                                 sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid, 
    846 @@ -318,6 +343,39 @@ static void ieee80211_rx_bss_info(struct 
    847                 if (sta && elems->wmm_info) 
    848                         set_sta_flag(sta, WLAN_STA_WME); 
    849   
    850 +               if (sta && elems->ht_info_elem && elems->ht_cap_elem && 
    851 +                   sdata->u.ibss.channel_type != NL80211_CHAN_NO_HT) { 
    852 +                       /* we both use HT */ 
    853 +                       struct ieee80211_sta_ht_cap sta_ht_cap_new; 
    854 +                       enum nl80211_channel_type channel_type = 
    855 +                               ieee80211_ht_info_to_channel_type( 
    856 +                                                       elems->ht_info_elem); 
    857 + 
    858 +                       ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, 
    859 +                                                         elems->ht_cap_elem, 
    860 +                                                         &sta_ht_cap_new); 
    861 + 
    862 +                       /* 
    863 +                        * fall back to HT20 if we don't use or use 
    864 +                        * the other extension channel 
    865 +                        */ 
    866 +                       if ((channel_type == NL80211_CHAN_HT40MINUS || 
    867 +                            channel_type == NL80211_CHAN_HT40PLUS) && 
    868 +                           channel_type != sdata->u.ibss.channel_type) 
    869 +                               sta_ht_cap_new.cap &= 
    870 +                                       ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; 
    871 + 
    872 +                       if (memcmp(&sta->sta.ht_cap, &sta_ht_cap_new, 
    873 +                                  sizeof(sta_ht_cap_new))) { 
    874 +                               memcpy(&sta->sta.ht_cap, &sta_ht_cap_new, 
    875 +                                      sizeof(sta_ht_cap_new)); 
    876 +                               rates_updated = true; 
    877 +                       } 
    878 +               } 
    879 + 
    880 +               if (sta && rates_updated) 
    881 +                       rate_control_rate_init(sta); 
    882 + 
    883                 rcu_read_unlock(); 
    884         } 
    885   
    886 @@ -896,12 +954,18 @@ int ieee80211_ibss_join(struct ieee80211 
    887                         struct cfg80211_ibss_params *params) 
    888  { 
    889         struct sk_buff *skb; 
    890 +       u32 changed = 0; 
    891   
    892         skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + 
    893 -                           36 /* bitrates */ + 
    894 -                           34 /* SSID */ + 
    895 -                           3  /* DS params */ + 
    896 -                           4  /* IBSS params */ + 
    897 +                           sizeof(struct ieee80211_hdr_3addr) + 
    898 +                           12 /* struct ieee80211_mgmt.u.beacon */ + 
    899 +                           2 + IEEE80211_MAX_SSID_LEN /* max SSID */ + 
    900 +                           2 + 8 /* max Supported Rates */ + 
    901 +                           3 /* max DS params */ + 
    902 +                           4 /* IBSS params */ + 
    903 +                           2 + (IEEE80211_MAX_SUPP_RATES - 8) + 
    904 +                           2 + sizeof(struct ieee80211_ht_cap) + 
    905 +                           2 + sizeof(struct ieee80211_ht_info) + 
    906                             params->ie_len); 
    907         if (!skb) 
    908                 return -ENOMEM; 
    909 @@ -922,13 +986,15 @@ int ieee80211_ibss_join(struct ieee80211 
    910         sdata->vif.bss_conf.beacon_int = params->beacon_interval; 
    911   
    912         sdata->u.ibss.channel = params->channel; 
    913 +       sdata->u.ibss.channel_type = params->channel_type; 
    914         sdata->u.ibss.fixed_channel = params->channel_fixed; 
    915   
    916         /* fix ourselves to that channel now already */ 
    917         if (params->channel_fixed) { 
    918                 sdata->local->oper_channel = params->channel; 
    919 -               WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata, 
    920 -                                                   NL80211_CHAN_NO_HT)); 
    921 +               if (!ieee80211_set_channel_type(sdata->local, sdata, 
    922 +                                              params->channel_type)) 
    923 +                       return -EINVAL; 
    924         } 
    925   
    926         if (params->ie) { 
    927 @@ -951,6 +1017,23 @@ int ieee80211_ibss_join(struct ieee80211 
    928         ieee80211_recalc_idle(sdata->local); 
    929         mutex_unlock(&sdata->local->mtx); 
    930   
    931 +       /* 
    932 +        * 802.11n-2009 9.13.3.1: In an IBSS, the HT Protection field is 
    933 +        * reserved, but an HT STA shall protect HT transmissions as though 
    934 +        * the HT Protection field were set to non-HT mixed mode. 
    935 +        * 
    936 +        * In an IBSS, the RIFS Mode field of the HT Operation element is 
    937 +        * also reserved, but an HT STA shall operate as though this field 
    938 +        * were set to 1. 
    939 +        */ 
    940 + 
    941 +       sdata->vif.bss_conf.ht_operation_mode |= 
    942 +                 IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED 
    943 +               | IEEE80211_HT_PARAM_RIFS_MODE; 
    944 + 
    945 +       changed |= BSS_CHANGED_HT; 
    946 +       ieee80211_bss_info_change_notify(sdata, changed); 
    947 + 
    948         ieee80211_queue_work(&sdata->local->hw, &sdata->work); 
    949   
    950         return 0; 
    951 --- a/net/mac80211/ieee80211_i.h 
    952 +++ b/net/mac80211/ieee80211_i.h 
    953 @@ -474,6 +474,7 @@ struct ieee80211_if_ibss { 
    954         u8 ssid_len, ie_len; 
    955         u8 *ie; 
    956         struct ieee80211_channel *channel; 
    957 +       enum nl80211_channel_type channel_type; 
    958   
    959         unsigned long ibss_join_req; 
    960         /* probe response/beacon for IBSS */ 
     47                            TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT), 
    96148--- a/net/mac80211/iface.c 
    96249+++ b/net/mac80211/iface.c 
     
    96956        int res; 
    97057        u32 hw_reconf_flags = 0; 
    971 @@ -309,27 +308,6 @@ static int ieee80211_do_open(struct net_ 
     58@@ -309,28 +308,6 @@ static int ieee80211_do_open(struct net_ 
    97259  
    97360        set_bit(SDATA_STATE_RUNNING, &sdata->state); 
     
    98269-               } 
    98370- 
    984 -               /* no atomic bitop required since STA is not live yet */ 
    985 -               set_sta_flag(sta, WLAN_STA_AUTHORIZED); 
     71-               sta_info_pre_move_state(sta, IEEE80211_STA_AUTH); 
     72-               sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC); 
     73-               sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED); 
    98674- 
    98775-               res = sta_info_insert(sta); 
     
    99785         * set_multicast_list will be invoked by the networking core 
    99886         * which will check whether any increments here were done in 
    999 @@ -356,8 +334,7 @@ static int ieee80211_do_open(struct net_ 
     87@@ -357,8 +334,7 @@ static int ieee80211_do_open(struct net_ 
    100088        netif_tx_start_all_queues(dev); 
    100189  
     
    100795        if (!local->open_count) 
    100896                drv_stop(local); 
    1009 @@ -719,6 +696,70 @@ static void ieee80211_if_setup(struct ne 
     97@@ -720,6 +696,70 @@ static void ieee80211_if_setup(struct ne 
    101098        dev->destructor = free_netdev; 
    101199 } 
     
    1078166 { 
    1079167        struct ieee80211_sub_if_data *sdata = 
    1080 @@ -823,6 +864,9 @@ static void ieee80211_iface_work(struct  
     168@@ -824,6 +864,9 @@ static void ieee80211_iface_work(struct  
    1081169                                break; 
    1082170                        ieee80211_mesh_rx_queued_mgmt(sdata, skb); 
     
    1088176                        WARN(1, "frame for unexpected interface type"); 
    1089177                        break; 
    1090 --- a/net/mac80211/main.c 
    1091 +++ b/net/mac80211/main.c 
    1092 @@ -574,7 +574,8 @@ struct ieee80211_hw *ieee80211_alloc_hw( 
    1093                         WIPHY_FLAG_OFFCHAN_TX | 
    1094                         WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 
    1095   
    1096 -       wiphy->features = NL80211_FEATURE_SK_TX_STATUS; 
    1097 +       wiphy->features = NL80211_FEATURE_SK_TX_STATUS | 
    1098 +                         NL80211_FEATURE_HT_IBSS; 
    1099   
    1100         if (!ops->set_key) 
    1101                 wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 
    1102178--- a/net/mac80211/rx.c 
    1103179+++ b/net/mac80211/rx.c 
    1104 @@ -2237,7 +2237,9 @@ ieee80211_rx_h_action(struct ieee80211_r 
    1105                 if (sdata->vif.type != NL80211_IFTYPE_STATION && 
     180@@ -2281,6 +2281,7 @@ ieee80211_rx_h_action(struct ieee80211_r 
    1106181                    sdata->vif.type != NL80211_IFTYPE_MESH_POINT && 
    1107182                    sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
    1108 -                   sdata->vif.type != NL80211_IFTYPE_AP) 
    1109 +                   sdata->vif.type != NL80211_IFTYPE_AP && 
     183                    sdata->vif.type != NL80211_IFTYPE_AP && 
    1110184+                   sdata->vif.type != NL80211_IFTYPE_WDS && 
    1111 +                   sdata->vif.type != NL80211_IFTYPE_ADHOC) 
     185                    sdata->vif.type != NL80211_IFTYPE_ADHOC) 
    1112186                        break; 
    1113187  
    1114                 /* verify action_code is present */ 
    1115 @@ -2452,13 +2454,14 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
     188@@ -2491,14 +2492,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
    1116189  
    1117190        if (!ieee80211_vif_is_mesh(&sdata->vif) && 
     
    1123196  
    1124197        switch (stype) { 
     198        case cpu_to_le16(IEEE80211_STYPE_AUTH): 
    1125199        case cpu_to_le16(IEEE80211_STYPE_BEACON): 
    1126200        case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP): 
     
    1128202+               /* process for all: mesh, mlme, ibss, wds */ 
    1129203                break; 
    1130         case cpu_to_le16(IEEE80211_STYPE_DEAUTH): 
    1131         case cpu_to_le16(IEEE80211_STYPE_DISASSOC): 
    1132 @@ -2796,19 +2799,32 @@ static int prepare_for_handlers(struct i 
    1133                                 return 0; 
    1134                 } else if (!ieee80211_bssid_match(bssid, 
    1135                                         sdata->vif.addr)) { 
    1136 +                       /* 
    1137 +                        * Accept public action frames even when the 
    1138 +                        * BSSID doesn't match, this is used for P2P 
    1139 +                        * and location updates. Note that mac80211 
    1140 +                        * itself never looks at these frames. 
    1141 +                        */ 
    1142                         if (!(status->rx_flags & IEEE80211_RX_IN_SCAN) && 
    1143 -                           !ieee80211_is_beacon(hdr->frame_control) && 
    1144 -                           !(ieee80211_is_action(hdr->frame_control) && 
    1145 -                             sdata->vif.p2p)) 
    1146 +                           ieee80211_is_public_action(hdr, skb->len)) 
    1147 +                               return 1; 
    1148 +                       if (!(status->rx_flags & IEEE80211_RX_IN_SCAN) && 
    1149 +                           !ieee80211_is_beacon(hdr->frame_control)) 
    1150                                 return 0; 
    1151                         status->rx_flags &= ~IEEE80211_RX_RA_MATCH; 
     204        case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): 
     205        case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): 
     206@@ -2852,10 +2854,16 @@ static int prepare_for_handlers(struct i 
    1152207                } 
    1153208                break; 
     
    1168223        default: 
    1169224                /* should never get here */ 
     225--- a/net/mac80211/sta_info.c 
     226+++ b/net/mac80211/sta_info.c 
     227@@ -1379,8 +1379,10 @@ int sta_info_move_state(struct sta_info  
     228                return -EINVAL; 
     229        } 
     230  
     231+#ifdef CONFIG_MAC80211_VERBOSE_DEBUG 
     232        printk(KERN_DEBUG "%s: moving STA %pM to state %d\n", 
     233                sta->sdata->name, sta->sta.addr, new_state); 
     234+#endif 
     235  
     236        /* 
     237         * notify the driver before the actual changes so it can 
    1170238--- a/net/mac80211/sta_info.h 
    1171239+++ b/net/mac80211/sta_info.h 
     
    1178246  *     IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next 
    1179247  *     frame to this station is transmitted. 
    1180 @@ -60,7 +59,6 @@ enum ieee80211_sta_info_flags { 
     248@@ -62,7 +61,6 @@ enum ieee80211_sta_info_flags { 
    1181249        WLAN_STA_AUTHORIZED, 
    1182250        WLAN_STA_SHORT_PREAMBLE, 
     
    1186254        WLAN_STA_MFP, 
    1187255        WLAN_STA_BLOCK_BA, 
    1188 --- a/net/mac80211/util.c 
    1189 +++ b/net/mac80211/util.c 
    1190 @@ -1612,6 +1612,11 @@ u8 *ieee80211_ie_build_ht_info(u8 *pos, 
    1191         } 
    1192         if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) 
    1193                 ht_info->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; 
    1194 + 
    1195 +       /* 
    1196 +        * Note: According to 802.11n-2009 9.13.3.1, HT Protection field and 
    1197 +        * RIFS Mode are reserved in IBSS mode, therefore keep them at 0 
    1198 +        */ 
    1199         ht_info->operation_mode = 0x0000; 
    1200         ht_info->stbc_param = 0x0000; 
    1201   
    1202 --- a/net/wireless/chan.c 
    1203 +++ b/net/wireless/chan.c 
    1204 @@ -6,6 +6,7 @@ 
    1205   * Copyright 2009      Johannes Berg <johannes@sipsolutions.net> 
    1206   */ 
    1207   
    1208 +#include <linux/export.h> 
    1209  #include <net/cfg80211.h> 
    1210  #include "core.h" 
    1211   
    1212 @@ -44,9 +45,9 @@ rdev_freq_to_chan(struct cfg80211_regist 
    1213         return chan; 
    1214  } 
    1215   
    1216 -static bool can_beacon_sec_chan(struct wiphy *wiphy, 
    1217 -                               struct ieee80211_channel *chan, 
    1218 -                               enum nl80211_channel_type channel_type) 
    1219 +int cfg80211_can_beacon_sec_chan(struct wiphy *wiphy, 
    1220 +                                 struct ieee80211_channel *chan, 
    1221 +                                 enum nl80211_channel_type channel_type) 
    1222  { 
    1223         struct ieee80211_channel *sec_chan; 
    1224         int diff; 
    1225 @@ -75,6 +76,7 @@ static bool can_beacon_sec_chan(struct w 
    1226   
    1227         return true; 
    1228  } 
    1229 +EXPORT_SYMBOL(cfg80211_can_beacon_sec_chan); 
    1230   
    1231  int cfg80211_set_freq(struct cfg80211_registered_device *rdev, 
    1232                       struct wireless_dev *wdev, int freq, 
    1233 @@ -109,8 +111,8 @@ int cfg80211_set_freq(struct cfg80211_re 
    1234                 switch (channel_type) { 
    1235                 case NL80211_CHAN_HT40PLUS: 
    1236                 case NL80211_CHAN_HT40MINUS: 
    1237 -                       if (!can_beacon_sec_chan(&rdev->wiphy, chan, 
    1238 -                                                channel_type)) { 
    1239 +                       if (!cfg80211_can_beacon_sec_chan(&rdev->wiphy, chan, 
    1240 +                                                         channel_type)) { 
    1241                                 printk(KERN_DEBUG 
    1242                                        "cfg80211: Secondary channel not " 
    1243                                        "allowed to initiate communication\n"); 
    1244 --- a/net/wireless/nl80211.c 
    1245 +++ b/net/wireless/nl80211.c 
    1246 @@ -4684,13 +4684,41 @@ static int nl80211_join_ibss(struct sk_b 
    1247                 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 
    1248         } 
    1249   
    1250 -       ibss.channel = ieee80211_get_channel(wiphy, 
    1251 -               nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 
    1252 +       if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 
    1253 +               enum nl80211_channel_type channel_type; 
    1254 + 
    1255 +               channel_type = nla_get_u32( 
    1256 +                               info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 
    1257 +               if (channel_type != NL80211_CHAN_NO_HT && 
    1258 +                   channel_type != NL80211_CHAN_HT20 && 
    1259 +                   channel_type != NL80211_CHAN_HT40MINUS && 
    1260 +                   channel_type != NL80211_CHAN_HT40PLUS) 
    1261 +                       return -EINVAL; 
    1262 + 
    1263 +               if (channel_type != NL80211_CHAN_NO_HT && 
    1264 +                   !(wiphy->features & NL80211_FEATURE_HT_IBSS)) 
    1265 +                       return -EINVAL; 
    1266 + 
    1267 +               ibss.channel_type = channel_type; 
    1268 +       } else { 
    1269 +               ibss.channel_type = NL80211_CHAN_NO_HT; 
    1270 +       } 
    1271 + 
    1272 +       ibss.channel = rdev_freq_to_chan(rdev, 
    1273 +               nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]), 
    1274 +               ibss.channel_type); 
    1275         if (!ibss.channel || 
    1276             ibss.channel->flags & IEEE80211_CHAN_NO_IBSS || 
    1277             ibss.channel->flags & IEEE80211_CHAN_DISABLED) 
    1278                 return -EINVAL; 
    1279   
    1280 +       /* Both channels should be able to initiate communication */ 
    1281 +       if ((ibss.channel_type == NL80211_CHAN_HT40PLUS || 
    1282 +            ibss.channel_type == NL80211_CHAN_HT40MINUS) && 
    1283 +           !cfg80211_can_beacon_sec_chan(&rdev->wiphy, ibss.channel, 
    1284 +                                         ibss.channel_type)) 
    1285 +               return -EINVAL; 
    1286 + 
    1287         ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 
    1288         ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 
    1289   
    1290 --- a/include/linux/ieee80211.h 
    1291 +++ b/include/linux/ieee80211.h 
    1292 @@ -1695,6 +1695,23 @@ static inline bool ieee80211_is_robust_m 
    1293  } 
    1294   
    1295  /** 
    1296 + * ieee80211_is_public_action - check if frame is a public action frame 
    1297 + * @hdr: the frame 
    1298 + * @len: length of the frame 
    1299 + */ 
    1300 +static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr, 
    1301 +                                             size_t len) 
    1302 +{ 
    1303 +       struct ieee80211_mgmt *mgmt = (void *)hdr; 
    1304 + 
    1305 +       if (len < 25) 
    1306 +               return false; 
    1307 +       if (!ieee80211_is_action(hdr->frame_control)) 
    1308 +               return false; 
    1309 +       return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC; 
    1310 +} 
    1311 + 
    1312 +/** 
    1313   * ieee80211_fhss_chan_to_freq - get channel frequency 
    1314   * @channel: the FHSS channel 
    1315   * 
    1316 --- a/net/mac80211/tx.c 
    1317 +++ b/net/mac80211/tx.c 
    1318 @@ -1332,8 +1332,11 @@ static int invoke_tx_handlers(struct iee 
    1319         if (!(tx->local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)) 
    1320                 CALL_TXH(ieee80211_tx_h_rate_ctrl); 
    1321   
    1322 -       if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) 
    1323 +       if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { 
    1324 +               __skb_queue_tail(&tx->skbs, tx->skb); 
    1325 +               tx->skb = NULL; 
    1326                 goto txh_done; 
    1327 +       } 
    1328   
    1329         CALL_TXH(ieee80211_tx_h_michael_mic_add); 
    1330         CALL_TXH(ieee80211_tx_h_sequence); 
    1331 --- a/net/mac80211/sta_info.c 
    1332 +++ b/net/mac80211/sta_info.c 
    1333 @@ -851,6 +851,7 @@ static int __must_check __sta_info_destr 
    1334         struct ieee80211_sub_if_data *sdata; 
    1335         unsigned long flags; 
    1336         int ret, i, ac; 
    1337 +       struct tid_ampdu_tx *tid_tx; 
    1338   
    1339         might_sleep(); 
    1340   
    1341 @@ -949,6 +950,30 @@ static int __must_check __sta_info_destr 
    1342         } 
    1343  #endif 
    1344   
    1345 +       /* There could be some memory leaks because of ampdu tx pending queue 
    1346 +        * not being freed before destroying the station info. 
    1347 +        * 
    1348 +        * Make sure that such queues are purged before freeing the station 
    1349 +        * info. 
    1350 +        * TODO: We have to somehow postpone the full destruction 
    1351 +        * until the aggregation stop completes. Refer 
    1352 +        * http://thread.gmane.org/gmane.linux.kernel.wireless.general/81936 
    1353 +        */ 
    1354 +       for (i = 0; i < STA_TID_NUM; i++) { 
    1355 +               if (!sta->ampdu_mlme.tid_tx[i]) 
    1356 +                       continue; 
    1357 +               tid_tx = sta->ampdu_mlme.tid_tx[i]; 
    1358 +               if (skb_queue_len(&tid_tx->pending)) { 
    1359 +#ifdef CONFIG_MAC80211_HT_DEBUG 
    1360 +                       wiphy_debug(local->hw.wiphy, "TX A-MPDU  purging %d " 
    1361 +                               "packets for tid=%d\n", 
    1362 +                               skb_queue_len(&tid_tx->pending), i); 
    1363 +#endif /* CONFIG_MAC80211_HT_DEBUG */ 
    1364 +                       __skb_queue_purge(&tid_tx->pending); 
    1365 +               } 
    1366 +               kfree_rcu(tid_tx, rcu_head); 
    1367 +       } 
    1368 + 
    1369         __sta_info_free(local, sta); 
    1370   
    1371         return 0; 
    1372 --- a/drivers/net/wireless/ath/ath9k/calib.c 
    1373 +++ b/drivers/net/wireless/ath/ath9k/calib.c 
    1374 @@ -402,6 +402,7 @@ bool ath9k_hw_getnf(struct ath_hw *ah, s 
    1375         ah->noise = ath9k_hw_getchan_noise(ah, chan); 
    1376         return true; 
    1377  } 
    1378 +EXPORT_SYMBOL(ath9k_hw_getnf); 
    1379   
    1380  void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, 
    1381                                   struct ath9k_channel *chan) 
  • trunk/package/mac80211/patches/400-ath_move_debug_code.patch

    r28392 r30346  
    11--- a/drivers/net/wireless/ath/Makefile 
    22+++ b/drivers/net/wireless/ath/Makefile 
    3 @@ -8,6 +8,5 @@ obj-$(CONFIG_ATH_COMMON)        += ath.o 
     3@@ -8,7 +8,7 @@ obj-$(CONFIG_ATH_COMMON)        += ath.o 
    44 ath-objs :=    main.o \ 
    55                regd.o \ 
    66                hw.o \ 
    77-               key.o 
    8 - 
    9 -ath-$(CONFIG_ATH_DEBUG) += debug.o 
    108+               key.o \ 
    119+               debug.o 
     10  
     11-ath-$(CONFIG_ATH_DEBUG) += debug.o 
     12 ccflags-y += -D__CHECK_ENDIAN__ 
    1213--- a/drivers/net/wireless/ath/ath.h 
    1314+++ b/drivers/net/wireless/ath/ath.h 
    14 @@ -272,13 +272,6 @@ void ath_dbg(struct ath_common *common,  
     15@@ -281,13 +281,6 @@ void _ath_dbg(struct ath_common *common, 
    1516 #endif /* CONFIG_ATH_DEBUG */ 
    1617  
  • trunk/package/mac80211/patches/404-ath_regd_optional.patch

    r29240 r30346  
    11--- a/drivers/net/wireless/ath/regd.c 
    22+++ b/drivers/net/wireless/ath/regd.c 
    3 @@ -194,6 +194,10 @@ ath_reg_apply_beaconing_flags(struct wip 
     3@@ -196,6 +196,10 @@ ath_reg_apply_beaconing_flags(struct wip 
    44        u32 bandwidth = 0; 
    55        int r; 
     
    1212  
    1313                if (!wiphy->bands[band]) 
    14 @@ -253,6 +257,10 @@ ath_reg_apply_active_scan_flags(struct w 
     14@@ -255,6 +259,10 @@ ath_reg_apply_active_scan_flags(struct w 
    1515        u32 bandwidth = 0; 
    1616        int r; 
     
    2323        if (!sband) 
    2424                return; 
    25 @@ -302,6 +310,10 @@ static void ath_reg_apply_radar_flags(st 
     25@@ -304,6 +312,10 @@ static void ath_reg_apply_radar_flags(st 
    2626        struct ieee80211_channel *ch; 
    2727        unsigned int i; 
     
    3434                return; 
    3535  
    36 @@ -469,6 +481,10 @@ ath_regd_init_wiphy(struct ath_regulator 
     36@@ -510,6 +522,10 @@ ath_regd_init_wiphy(struct ath_regulator 
    3737 { 
    3838        const struct ieee80211_regdomain *regd; 
  • trunk/package/mac80211/patches/405-world_regd_fixup.patch

    r29240 r30346  
    11--- a/drivers/net/wireless/ath/regd.c 
    22+++ b/drivers/net/wireless/ath/regd.c 
    3 @@ -38,7 +38,8 @@ 
     3@@ -40,7 +40,8 @@ static int __ath_regd_init(struct ath_re 
    44                                NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM) 
    55  
     
    1111 #define ATH9K_5GHZ_5470_5850   REG_RULE(5470-10, 5850+10, 40, 0, 30,\ 
    1212                                NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS) 
    13 @@ -56,57 +57,56 @@ 
     13@@ -58,57 +59,56 @@ static int __ath_regd_init(struct ath_re 
    1414 #define ATH9K_5GHZ_NO_MIDBAND  ATH9K_5GHZ_5150_5350, \ 
    1515                                ATH9K_5GHZ_5725_5850 
  • trunk/package/mac80211/patches/406-regd_no_assoc_hints.patch

    r29436 r30346  
    11--- a/net/wireless/reg.c 
    22+++ b/net/wireless/reg.c 
    3 @@ -1672,6 +1672,8 @@ void regulatory_hint_11d(struct wiphy *w 
     3@@ -1690,6 +1690,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 @@ -1878,6 +1880,8 @@ static void restore_regulatory_settings( 
     12@@ -1925,6 +1927,8 @@ static void restore_regulatory_settings( 
    1313  
    1414 void regulatory_hint_disconnect(void) 
  • trunk/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

    r29436 r30346  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -1458,15 +1458,6 @@ static int ath9k_add_interface(struct ie 
     3@@ -1454,15 +1454,6 @@ static int ath9k_add_interface(struct ie 
    44                } 
    55        } 
     
    1414-       } 
    1515- 
    16         ath_dbg(common, ATH_DBG_CONFIG, 
    17                 "Attach a VIF of type: %d\n", vif->type); 
     16        ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type); 
    1817  
    19 @@ -1492,15 +1483,6 @@ static int ath9k_change_interface(struct 
     18        sc->nvifs++; 
     19@@ -1487,15 +1478,6 @@ static int ath9k_change_interface(struct 
    2020        mutex_lock(&sc->mutex); 
    2121        ath9k_ps_wakeup(sc); 
  • trunk/package/mac80211/patches/430-ath5k_disable_fast_cc.patch

    r29436 r30346  
    1414        (ah->ah_radio != AR5K_RF5413)) 
    1515+#endif 
    16                 fast = 0; 
     16                fast = false; 
    1717  
    1818        /* Disable sleep clock operation 
  • trunk/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch

    r29240 r30346  
    5555 { 
    5656        struct ath_common *common = ath9k_hw_common(ah); 
    57 @@ -1674,6 +1721,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
     57@@ -1677,6 +1724,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); 
  • trunk/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

    r29436 r30346  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -1795,8 +1795,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     3@@ -1794,8 +1794,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    44        REG_WRITE(ah, AR_OBS, 8); 
    55  
  • trunk/package/mac80211/patches/511-ath9k_increase_bcbuf.patch

    r29240 r30346  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -366,7 +366,7 @@ struct ath_vif { 
     3@@ -370,7 +370,7 @@ struct ath_vif { 
    44  * number of beacon intervals, the game's up. 
    55  */ 
  • trunk/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch

    r29684 r30346  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -591,6 +591,7 @@ struct ath_softc { 
     3@@ -595,6 +595,7 @@ struct ath_softc { 
    44        struct ieee80211_hw *hw; 
    55        struct device *dev; 
     
    99        int chan_is_ht; 
    1010        struct survey_info *cur_survey; 
    11 @@ -655,6 +656,7 @@ struct ath_softc { 
     11@@ -659,6 +660,7 @@ struct ath_softc { 
    1212        u8 ant_tx, ant_rx; 
    1313 }; 
     
    7070 { 
    7171        struct ath_common *common = ath9k_hw_common(ah); 
    72 @@ -1724,6 +1768,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
     72@@ -1727,6 +1771,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
    7373        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
    7474                            &fops_eeprom); 
     
    8282--- a/drivers/net/wireless/ath/ath9k/main.c 
    8383+++ b/drivers/net/wireless/ath/ath9k/main.c 
    84 @@ -1564,7 +1564,7 @@ static void ath9k_disable_ps(struct ath_ 
     84@@ -1559,7 +1559,7 @@ static void ath9k_disable_ps(struct ath_ 
    8585  
    8686 } 
     
    9191        struct ath_softc *sc = hw->priv; 
    9292        struct ath_hw *ah = sc->sc_ah; 
    93 @@ -1616,9 +1616,11 @@ static int ath9k_config(struct ieee80211 
     93@@ -1609,9 +1609,11 @@ static int ath9k_config(struct ieee80211 
    9494  
    9595        if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 
     
    103103                if (ah->curchan) 
    104104                        old_pos = ah->curchan - &ah->channels[0]; 
    105 @@ -1667,7 +1669,23 @@ static int ath9k_config(struct ieee80211 
     105@@ -1659,7 +1661,23 @@ static int ath9k_config(struct ieee80211 
    106106                        memset(&sc->survey[pos], 0, sizeof(struct survey_info)); 
    107107                } 
     
    130130--- a/drivers/net/wireless/ath/ath9k/hw.c 
    131131+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    132 @@ -1609,6 +1609,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     132@@ -1608,6 +1608,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    133133            caldata->rtt_hist.num_readings) 
    134134                allow_fbs = true; 
  • trunk/package/mac80211/patches/520-mac80211_ht_change_rate_update.patch

    r29436 r30346  
    11--- a/net/mac80211/main.c 
    22+++ b/net/mac80211/main.c 
    3 @@ -196,7 +196,9 @@ void ieee80211_bss_info_change_notify(st 
     3@@ -197,7 +197,9 @@ void ieee80211_bss_info_change_notify(st 
    44                                      u32 changed) 
    55 { 
     
    1111        if (!changed) 
    1212                return; 
    13 @@ -226,6 +228,22 @@ void ieee80211_bss_info_change_notify(st 
     13@@ -219,6 +221,22 @@ void ieee80211_bss_info_change_notify(st 
    1414  
    1515        switch (sdata->vif.type) { 
  • trunk/package/mac80211/patches/530-mac80211_cur_txpower.patch

    r29436 r30346  
    1212--- a/net/mac80211/cfg.c 
    1313+++ b/net/mac80211/cfg.c 
    14 @@ -1696,7 +1696,7 @@ static int ieee80211_get_tx_power(struct 
     14@@ -1739,7 +1739,7 @@ static int ieee80211_get_tx_power(struct 
    1515 { 
    1616        struct ieee80211_local *local = wiphy_priv(wiphy); 
     
    2323--- a/net/mac80211/main.c 
    2424+++ b/net/mac80211/main.c 
    25 @@ -167,6 +167,7 @@ int ieee80211_hw_config(struct ieee80211 
     25@@ -168,6 +168,7 @@ int ieee80211_hw_config(struct ieee80211 
    2626  
    2727        if (local->hw.conf.power_level != power) { 
  • trunk/package/mac80211/patches/531-ath9k_cur_txpower.patch

    r29684 r30346  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -1691,6 +1691,8 @@ int ath9k_config(struct ieee80211_hw *hw 
     3@@ -1683,6 +1683,8 @@ int ath9k_config(struct ieee80211_hw *hw 
    44                        return -EINVAL; 
    55                } 
     
    1010                 * The most recent snapshot of channel->noisefloor for the old 
    1111                 * channel is only available after the hardware reset. Copy it to 
    12 @@ -1706,6 +1708,7 @@ int ath9k_config(struct ieee80211_hw *hw 
     12@@ -1697,6 +1699,7 @@ int ath9k_config(struct ieee80211_hw *hw 
    1313                sc->config.txpowlimit = 2 * conf->power_level; 
    1414                ath9k_cmn_update_txpow(ah, sc->curtxpow, 
  • trunk/package/mac80211/patches/540-ath9k_limit_qlen.patch

    r29273 r30346  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -238,6 +238,7 @@ struct ath_atx_tid { 
     3@@ -242,6 +242,7 @@ struct ath_atx_tid { 
    44        struct ath_node *an; 
    55        struct ath_atx_ac *ac; 
    66        unsigned long tx_buf[BITS_TO_LONGS(ATH_TID_MAX_BUFS)]; 
    77+       int buf_pending; 
     8        int bar_index; 
    89        u16 seq_start; 
    910        u16 seq_next; 
    10         u16 baw_size; 
    11 @@ -284,6 +285,9 @@ struct ath_tx_control { 
     11@@ -288,6 +289,9 @@ struct ath_tx_control { 
    1212  *  (axq_qnum). 
    1313  */ 
     
    2121--- a/drivers/net/wireless/ath/ath9k/debug.c 
    2222+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    23 @@ -1729,6 +1729,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
     23@@ -1732,6 +1732,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
    2424                            sc, &fops_wiphy); 
    2525        debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, 
     
    3434--- a/drivers/net/wireless/ath/ath9k/xmit.c 
    3535+++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    36 @@ -355,6 +355,14 @@ static void ath_tx_count_frames(struct a 
     36@@ -392,6 +392,14 @@ static void ath_tx_count_frames(struct a 
    3737        } 
    3838 } 
     
    4949 static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, 
    5050                                 struct ath_buf *bf, struct list_head *bf_q, 
    51 @@ -443,6 +451,8 @@ static void ath_tx_complete_aggr(struct  
     51@@ -486,6 +494,8 @@ static void ath_tx_complete_aggr(struct  
    5252        __skb_queue_head_init(&bf_pending); 
    5353  
     
    5858                u16 seqno = bf->bf_state.seqno; 
    5959  
    60 @@ -823,6 +833,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
     60@@ -885,6 +895,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_ 
    6161                        ath_tx_addto_baw(sc, tid, seqno); 
    6262                bf->bf_state.ndelim = ndelim; 
     
    6666                list_add_tail(&bf->list, bf_q); 
    6767                if (bf_prev) 
    68 @@ -1682,6 +1693,8 @@ static void ath_tx_send_ampdu(struct ath 
     68@@ -1740,6 +1751,8 @@ static void ath_tx_send_ampdu(struct ath 
    6969        /* Add sub-frame to BAW */ 
    7070        ath_tx_addto_baw(sc, tid, bf->bf_state.seqno); 
     
    7575        TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw); 
    7676        bf->bf_lastbf = bf; 
    77 @@ -1810,23 +1823,13 @@ error: 
     77@@ -1864,22 +1877,11 @@ error: 
    7878  
    7979 /* FIXME: tx power */ 
     
    8888        struct ath_buf *bf; 
    8989-       u8 tidno; 
    90   
    91         spin_lock_bh(&txctl->txq->axq_lock); 
     90- 
    9291-       if ((sc->sc_flags & SC_OP_TXAGGR) && txctl->an && 
    9392-               ieee80211_is_data_qos(hdr->frame_control)) { 
     
    101100        if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { 
    102101                /* 
    103 @@ -1861,6 +1864,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
     102@@ -1911,6 +1913,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
    104103        struct ieee80211_vif *vif = info->control.vif; 
    105104        struct ath_softc *sc = hw->priv; 
     
    109108        int frmlen = skb->len + FCS_LEN; 
    110109        int q; 
    111 @@ -1903,6 +1907,24 @@ int ath_tx_start(struct ieee80211_hw *hw 
     110@@ -1953,6 +1956,24 @@ int ath_tx_start(struct ieee80211_hw *hw 
    112111  
    113112        setup_frame_info(hw, skb, frmlen); 
     
    134133         * At this point, the vif, hw_key and sta pointers in the tx control 
    135134         * info are no longer valid (overwritten by the ath_frame_info data. 
    136 @@ -1917,7 +1939,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
     135@@ -1967,7 +1988,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
     136                txq->stopped = true; 
    137137        } 
    138         spin_unlock_bh(&txq->axq_lock); 
    139138  
    140139-       ath_tx_start_dma(sc, skb, txctl); 
    141140+       ath_tx_start_dma(sc, skb, txctl, tid); 
    142         return 0; 
    143  } 
    144141  
     142        ath_txq_unlock(sc, txq); 
     143  
  • trunk/package/mac80211/patches/542-ath9k_fix_half_quarter_rx_latency.patch

    r30345 r30346  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -1006,16 +1006,26 @@ void ath9k_hw_init_global_settings(struc 
     3@@ -1005,16 +1005,26 @@ void ath9k_hw_init_global_settings(struc 
    44  
    55        if (IS_CHAN_HALF_RATE(chan)) { 
  • trunk/package/mac80211/patches/543-ath9k_fix_half_quarter_sifs.patch

    r30345 r30346  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -1007,31 +1007,35 @@ void ath9k_hw_init_global_settings(struc 
     3@@ -1006,31 +1006,35 @@ void ath9k_hw_init_global_settings(struc 
    44        if (IS_CHAN_HALF_RATE(chan)) { 
    55                eifs = 175; 
  • trunk/package/mac80211/patches/550-ath9k_debug_remove_packet_rssi.patch

    r29240 r30346  
    5555--- a/drivers/net/wireless/ath/ath9k/debug.h 
    5656+++ b/drivers/net/wireless/ath/ath9k/debug.h 
    57 @@ -164,13 +164,6 @@ struct ath_rx_stats { 
     57@@ -165,13 +165,6 @@ struct ath_rx_stats { 
    5858        u32 post_delim_crc_err; 
    5959        u32 decrypt_busy_err; 
  • trunk/package/mac80211/patches/551-ath9k_per_chain_signal_strength.patch

    r29436 r30346  
    2424--- a/net/mac80211/sta_info.h 
    2525+++ b/net/mac80211/sta_info.h 
    26 @@ -302,6 +302,11 @@ struct sta_info { 
     26@@ -312,6 +312,11 @@ struct sta_info { 
    2727        unsigned long rx_dropped; 
    2828        int last_signal; 
     
    3838--- a/net/mac80211/rx.c 
    3939+++ b/net/mac80211/rx.c 
    40 @@ -1267,6 +1267,7 @@ ieee80211_rx_h_sta_process(struct ieee80 
     40@@ -1269,6 +1269,7 @@ ieee80211_rx_h_sta_process(struct ieee80 
    4141        struct sk_buff *skb = rx->skb; 
    4242        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 
     
    4646        if (!sta) 
    4747                return RX_CONTINUE; 
    48 @@ -1309,6 +1310,19 @@ ieee80211_rx_h_sta_process(struct ieee80 
     48@@ -1311,6 +1312,19 @@ ieee80211_rx_h_sta_process(struct ieee80 
    4949        sta->last_signal = status->signal; 
    5050        ewma_add(&sta->avg_signal, -status->signal); 
     
    6868--- a/net/mac80211/sta_info.c 
    6969+++ b/net/mac80211/sta_info.c 
    70 @@ -304,6 +304,8 @@ struct sta_info *sta_info_alloc(struct i 
     70@@ -255,6 +255,8 @@ struct sta_info *sta_info_alloc(struct i 
    7171        do_posix_clock_monotonic_gettime(&uptime); 
    7272        sta->last_connected = uptime.tv_sec; 
     
    7979--- a/include/net/cfg80211.h 
    8080+++ b/include/net/cfg80211.h 
    81 @@ -505,6 +505,8 @@ struct station_parameters { 
    82   * @STATION_INFO_CONNECTED_TIME: @connected_time filled 
     81@@ -508,6 +508,8 @@ struct station_parameters { 
    8382  * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled 
    8483  * @STATION_INFO_STA_FLAGS: @sta_flags filled 
     84  * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled 
    8585+ * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled 
    8686+ * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled 
     
    8888 enum station_info_flags { 
    8989        STATION_INFO_INACTIVE_TIME      = 1<<0, 
    90 @@ -525,7 +527,9 @@ enum station_info_flags { 
    91         STATION_INFO_BSS_PARAM          = 1<<15, 
     90@@ -529,7 +531,9 @@ enum station_info_flags { 
    9291        STATION_INFO_CONNECTED_TIME     = 1<<16, 
    9392        STATION_INFO_ASSOC_REQ_IES      = 1<<17, 
    94 -       STATION_INFO_STA_FLAGS          = 1<<18 
    95 +       STATION_INFO_STA_FLAGS          = 1<<18, 
    96 +       STATION_INFO_CHAIN_SIGNAL       = 1<<19, 
    97 +       STATION_INFO_CHAIN_SIGNAL_AVG   = 1<<20, 
     93        STATION_INFO_STA_FLAGS          = 1<<18, 
     94-       STATION_INFO_BEACON_LOSS_COUNT  = 1<<19 
     95+       STATION_INFO_BEACON_LOSS_COUNT  = 1<<19, 
     96+       STATION_INFO_CHAIN_SIGNAL       = 1<<20, 
     97+       STATION_INFO_CHAIN_SIGNAL_AVG   = 1<<21, 
    9898 }; 
    9999  
    100100 /** 
    101 @@ -605,6 +609,9 @@ struct sta_bss_parameters { 
     101@@ -609,6 +613,9 @@ struct sta_bss_parameters { 
    102102  * @plink_state: mesh peer link state 
    103103  * @signal: signal strength of last received packet in dBm 
     
    109109  * @rxrate: current unicast bitrate to this station 
    110110  * @rx_packets: packets received from this station 
    111 @@ -635,6 +642,11 @@ struct station_info { 
     111@@ -640,6 +647,11 @@ struct station_info { 
    112112        u8 plink_state; 
    113113        s8 signal; 
     
    140140--- a/drivers/net/wireless/ath/ath9k/recv.c 
    141141+++ b/drivers/net/wireless/ath/ath9k/recv.c 
    142 @@ -980,6 +980,7 @@ static int ath9k_rx_skb_preprocess(struc 
     142@@ -987,6 +987,7 @@ static int ath9k_rx_skb_preprocess(struc 
    143143                                   bool *decrypt_error) 
    144144 { 
     
    148148        memset(rx_status, 0, sizeof(struct ieee80211_rx_status)); 
    149149  
    150 @@ -1005,6 +1006,20 @@ static int ath9k_rx_skb_preprocess(struc 
     150@@ -1012,6 +1013,20 @@ static int ath9k_rx_skb_preprocess(struc 
    151151        rx_status->antenna = rx_stats->rs_antenna; 
    152152        rx_status->flag |= RX_FLAG_MACTIME_MPDU; 
     
    169169 } 
    170170  
    171 @@ -1535,14 +1550,14 @@ static void ath_ant_comb_scan(struct ath 
     171@@ -1542,14 +1557,14 @@ static void ath_ant_comb_scan(struct ath 
    172172        struct ath_ant_comb *antcomb = &sc->ant_comb; 
    173173        int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; 
     
    190190--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    191191+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    192 @@ -484,12 +484,12 @@ int ath9k_hw_process_rxdesc_edma(struct  
     192@@ -483,12 +483,12 @@ int ath9k_hw_process_rxdesc_edma(struct  
    193193  
    194194        /* XXX: Keycache */ 
     
    211211--- a/drivers/net/wireless/ath/ath9k/mac.c 
    212212+++ b/drivers/net/wireless/ath/ath9k/mac.c 
    213 @@ -559,25 +559,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a 
     213@@ -556,25 +556,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a 
    214214  
    215215        if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) { 
     
    272272--- a/include/linux/nl80211.h 
    273273+++ b/include/linux/nl80211.h 
    274 @@ -1651,6 +1651,8 @@ enum nl80211_sta_bss_param { 
    275   *     containing info as possible, see &enum nl80211_sta_bss_param 
     274@@ -1657,6 +1657,8 @@ enum nl80211_sta_bss_param { 
    276275  * @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected 
    277276  * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update. 
     277  * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32) 
    278278+ * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU 
    279279+ * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average 
     
    281281  * @NL80211_STA_INFO_MAX: highest possible station info attribute 
    282282  */ 
    283 @@ -1673,6 +1675,8 @@ enum nl80211_sta_info { 
    284         NL80211_STA_INFO_BSS_PARAM, 
     283@@ -1680,6 +1682,8 @@ enum nl80211_sta_info { 
    285284        NL80211_STA_INFO_CONNECTED_TIME, 
    286285        NL80211_STA_INFO_STA_FLAGS, 
     286        NL80211_STA_INFO_BEACON_LOSS, 
    287287+       NL80211_STA_INFO_CHAIN_SIGNAL, 
    288288+       NL80211_STA_INFO_CHAIN_SIGNAL_AVG, 
     
    292292--- a/net/wireless/nl80211.c 
    293293+++ b/net/wireless/nl80211.c 
    294 @@ -2322,6 +2322,33 @@ nla_put_failure: 
     294@@ -2347,6 +2347,33 @@ nla_put_failure: 
    295295        return false; 
    296296 } 
     
    326326                                int flags, struct net_device *dev, 
    327327                                const u8 *mac_addr, struct station_info *sinfo) 
    328 @@ -2368,6 +2395,18 @@ static int nl80211_send_station(struct s 
     328@@ -2393,6 +2420,18 @@ static int nl80211_send_station(struct s 
    329329        if (sinfo->filled & STATION_INFO_SIGNAL_AVG) 
    330330                NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG, 
     
    355355        sinfo->generation = sdata->local->sta_generation; 
    356356  
    357 @@ -375,6 +376,17 @@ static void sta_set_sinfo(struct sta_inf 
     357@@ -377,6 +378,17 @@ static void sta_set_sinfo(struct sta_inf 
    358358                sinfo->signal = (s8)sta->last_signal; 
    359359                sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal); 
  • trunk/package/mac80211/patches/560-ath9k_extra_leds.patch

    r30345 r30346  
    172172--- a/drivers/net/wireless/ath/ath9k/init.c 
    173173+++ b/drivers/net/wireless/ath/ath9k/init.c 
    174 @@ -803,7 +803,7 @@ int ath9k_init_device(u16 devid, struct  
     174@@ -817,7 +817,7 @@ int ath9k_init_device(u16 devid, struct  
    175175  
    176176 #ifdef CONFIG_MAC80211_LEDS 
     
    245245 { 
    246246 #define ATH_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].c) 
    247 @@ -1725,6 +1780,11 @@ int ath9k_init_debug(struct ath_hw *ah) 
     247@@ -1728,6 +1783,11 @@ int ath9k_init_debug(struct ath_hw *ah) 
    248248        debugfs_create_file("samples", S_IRUSR, sc->debug.debugfs_phy, sc, 
    249249                            &fops_samps); 
  • trunk/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch

    r29240 r30346  
    230230  */ 
    231231 static bool rt2800pci_get_entry_state(struct queue_entry *entry) 
    232 @@ -1052,6 +1056,7 @@ static const struct rt2x00lib_ops rt2800 
     232@@ -1040,6 +1044,7 @@ static const struct rt2x00lib_ops rt2800 
    233233        .get_firmware_name      = rt2800pci_get_firmware_name, 
    234234        .check_firmware         = rt2800_check_firmware, 
  • trunk/package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch

    r29436 r30346  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -606,6 +606,7 @@ CONFIG_RT2X00=y 
     3@@ -611,6 +611,7 @@ CONFIG_RT2X00=y 
    44 CONFIG_RT2X00_LIB=m 
    55 CONFIG_RT2800_LIB=m 
  • trunk/package/mac80211/patches/605-rt2x00-pci-eeprom.patch

    r29240 r30346  
    1010        memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE); 
    1111 } 
    12 @@ -938,8 +938,9 @@ static int rt2800pci_validate_eeprom(str 
     12@@ -926,8 +926,9 @@ static int rt2800pci_validate_eeprom(str 
    1313        /* 
    1414         * Read EEPROM into buffer 
  • trunk/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch

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

    r28392 r30346  
    11--- a/drivers/net/wireless/b43/b43.h 
    22+++ b/drivers/net/wireless/b43/b43.h 
    3 @@ -791,6 +791,7 @@ struct b43_wldev { 
     3@@ -803,6 +803,7 @@ struct b43_wldev { 
    44        bool qos_enabled;               /* TRUE, if QoS is used. */ 
    55        bool hwcrypto_enabled;          /* TRUE, if HW crypto acceleration is enabled. */ 
     
    2323 module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); 
    2424 MODULE_PARM_DESC(bad_frames_preempt, 
    25 @@ -2686,10 +2691,10 @@ static int b43_gpio_init(struct b43_wlde 
    26                     & ~B43_MACCTL_GPOUTSMSK); 
     25@@ -2674,10 +2679,10 @@ static int b43_gpio_init(struct b43_wlde 
     26        u32 mask, set; 
    2727  
    28         b43_write16(dev, B43_MMIO_GPIO_MASK, b43_read16(dev, B43_MMIO_GPIO_MASK) 
    29 -                   | 0x000F); 
    30 +                   | modparam_gpiomask); 
     28        b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0); 
     29-       b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xF); 
     30+       b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, modparam_gpiomask); 
    3131  
    3232        mask = 0x0000001F; 
  • trunk/package/mac80211/patches/810-b43_no_pio.patch

    r28392 r30346  
    1212--- a/drivers/net/wireless/b43/main.c 
    1313+++ b/drivers/net/wireless/b43/main.c 
    14 @@ -1893,9 +1893,11 @@ static void b43_do_interrupt_thread(stru 
     14@@ -1885,10 +1885,12 @@ static void b43_do_interrupt_thread(stru 
     15                               dma_reason[0], dma_reason[1], 
     16                               dma_reason[2], dma_reason[3], 
    1517                               dma_reason[4], dma_reason[5]); 
     18+#ifdef CONFIG_B43_PIO 
    1619                        b43err(dev->wl, "This device does not support DMA " 
    1720                               "on your system. It will now be switched to PIO.\n"); 
    18 +#ifdef CONFIG_B43_PIO 
    1921                        /* Fall back to PIO transfers if we get fatal DMA errors! */ 
    20                         dev->use_pio = 1; 
     22                        dev->use_pio = true; 
     23+#endif 
    2124                        b43_controller_restart(dev, "DMA error"); 
    22 +#endif 
    2325                        return; 
    2426                } 
    25                 if (merged_dma_reason & B43_DMAIRQ_NONFATALMASK) { 
    2627--- a/drivers/net/wireless/b43/pio.h 
    2728+++ b/drivers/net/wireless/b43/pio.h 
  • trunk/package/mac80211/patches/820-b43-add-antenna-control.patch

    r28940 r30346  
    11--- a/drivers/net/wireless/b43/main.c 
    22+++ b/drivers/net/wireless/b43/main.c 
    3 @@ -1535,7 +1535,7 @@ static void b43_write_beacon_template(st 
     3@@ -1529,7 +1529,7 @@ static void b43_write_beacon_template(st 
    44                                  len, ram_offset, shm_size_offset, rate); 
    55  
     
    1010        ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL); 
    1111        /* We can't send beacons with short preamble. Would get PHY errors. */ 
    12 @@ -3052,8 +3052,8 @@ static int b43_chip_init(struct b43_wlde 
     12@@ -3031,8 +3031,8 @@ static int b43_chip_init(struct b43_wlde 
    1313  
    1414        /* Select the antennae */ 
     
    2121        if (phy->type == B43_PHYTYPE_B) { 
    2222                value16 = b43_read16(dev, 0x005E); 
    23 @@ -3782,7 +3782,6 @@ static int b43_op_config(struct ieee8021 
     23@@ -3775,7 +3775,6 @@ static int b43_op_config(struct ieee8021 
    2424        struct b43_wldev *dev; 
    2525        struct b43_phy *phy; 
     
    2929        bool reload_bss = false; 
    3030  
    31 @@ -3836,11 +3835,9 @@ static int b43_op_config(struct ieee8021 
     31@@ -3829,11 +3828,9 @@ static int b43_op_config(struct ieee8021 
    3232        } 
    3333  
     
    4343        if (wl->radio_enabled != phy->radio_on) { 
    4444                if (wl->radio_enabled) { 
    45 @@ -4910,6 +4907,47 @@ static int b43_op_get_survey(struct ieee 
     45@@ -4905,6 +4902,47 @@ static int b43_op_get_survey(struct ieee 
    4646        return 0; 
    4747 } 
     
    9191        .tx                     = b43_op_tx, 
    9292        .conf_tx                = b43_op_conf_tx, 
    93 @@ -4931,6 +4969,8 @@ static const struct ieee80211_ops b43_hw 
     93@@ -4926,6 +4964,8 @@ static const struct ieee80211_ops b43_hw 
    9494        .sw_scan_complete       = b43_op_sw_scan_complete_notifier, 
    9595        .get_survey             = b43_op_get_survey, 
     
    100100  
    101101 /* Hard-reset the chip. Do not call this directly. 
    102 @@ -5177,6 +5217,8 @@ static int b43_one_core_attach(struct b4 
     102@@ -5172,6 +5212,8 @@ static int b43_one_core_attach(struct b4 
    103103        if (!wldev) 
    104104                goto out; 
     
    109109        wldev->dev = dev; 
    110110        wldev->wl = wl; 
    111 @@ -5264,6 +5306,9 @@ static struct b43_wl *b43_wireless_init( 
     111@@ -5260,6 +5302,9 @@ static struct b43_wl *b43_wireless_init( 
    112112                BIT(NL80211_IFTYPE_WDS) | 
    113113                BIT(NL80211_IFTYPE_ADHOC); 
     
    116116+       hw->wiphy->available_antennas_tx = 0x3; 
    117117+ 
    118         hw->queues = modparam_qos ? 4 : 1; 
     118        hw->queues = modparam_qos ? B43_QOS_QUEUE_NUM : 1; 
    119119        wl->mac80211_initially_registered_queues = hw->queues; 
    120120        hw->max_rates = 2; 
    121121--- a/drivers/net/wireless/b43/b43.h 
    122122+++ b/drivers/net/wireless/b43/b43.h 
    123 @@ -792,6 +792,8 @@ struct b43_wldev { 
     123@@ -804,6 +804,8 @@ struct b43_wldev { 
    124124        bool hwcrypto_enabled;          /* TRUE, if HW crypto acceleration is enabled. */ 
    125125        bool use_pio;                   /* TRUE if next init should use PIO */ 
  • trunk/package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch

    r29922 r30346  
    2020--- a/drivers/net/wireless/b43/b43.h 
    2121+++ b/drivers/net/wireless/b43/b43.h 
    22 @@ -1016,6 +1016,32 @@ static inline bool b43_using_pio_transfe 
     22@@ -1044,6 +1044,32 @@ static inline bool b43_using_pio_transfe 
    2323        return dev->__using_pio_transfers; 
    2424 } 
     
    8989--- a/drivers/net/wireless/b43/phy_n.c 
    9090+++ b/drivers/net/wireless/b43/phy_n.c 
    91 @@ -4104,14 +4104,14 @@ static inline void check_phyreg(struct b 
     91@@ -4837,14 +4837,14 @@ static inline void check_phyreg(struct b 
    9292 static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg) 
    9393 { 
     
    106106 } 
    107107  
    108 @@ -4119,7 +4119,7 @@ static void b43_nphy_op_maskset(struct b 
     108@@ -4852,7 +4852,7 @@ static void b43_nphy_op_maskset(struct b 
    109109                                 u16 set) 
    110110 { 
     
    112112-       b43_write16(dev, B43_MMIO_PHY_CONTROL, reg); 
    113113+       b43_wflush16(dev, B43_MMIO_PHY_CONTROL, reg); 
    114         b43_write16(dev, B43_MMIO_PHY_DATA, 
    115                     (b43_read16(dev, B43_MMIO_PHY_DATA) & mask) | set); 
     114        b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set); 
    116115 } 
    117 @@ -4131,7 +4131,7 @@ static u16 b43_nphy_op_radio_read(struct 
     116  
     117@@ -4863,7 +4863,7 @@ static u16 b43_nphy_op_radio_read(struct 
    118118        /* N-PHY needs 0x100 for read access */ 
    119119        reg |= 0x100; 
     
    124124 } 
    125125  
    126 @@ -4140,7 +4140,7 @@ static void b43_nphy_op_radio_write(stru 
     126@@ -4872,7 +4872,7 @@ static void b43_nphy_op_radio_write(stru 
    127127        /* Register 1 is a 32-bit register. */ 
    128128        B43_WARN_ON(reg == 1); 
Note: See TracChangeset for help on using the changeset viewer.