Changeset 42683


Ignore:
Timestamp:
2014-09-27T22:51:43+02:00 (3 years ago)
Author:
nbd
Message:

mac80211: update to wireless-testing 2014-09-26

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

Location:
trunk/package/kernel/mac80211
Files:
10 deleted
79 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/kernel/mac80211/Makefile

    r42431 r42683  
    1111PKG_NAME:=mac80211 
    1212 
    13 PKG_VERSION:=2014-05-22 
     13PKG_VERSION:=2014-09-26 
    1414PKG_RELEASE:=1 
    1515PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources 
    1616PKG_BACKPORT_VERSION:= 
    17 PKG_MD5SUM:=367937d4f8c05cb36ca989ee26abc3df 
     17PKG_MD5SUM:=b66f5fbd10e335fc660182ce6114d41f 
    1818 
    1919PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2 
  • trunk/package/kernel/mac80211/patches/000-fix_kconfig.patch

    r37007 r42683  
    88  
    99 conf: conf.o zconf.tab.o 
    10 -mconf: LDFLAGS = -Wl,--no-as-needed $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC)) 
     10-mconf: LDFLAGS = -Wl,--add-needed $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC)) 
    1111-mconf: CFLAGS += -DCURSES_LOC="<ncurses.h>" -DLOCALE 
    1212+mconf: LDFLAGS = $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC)) 
  • trunk/package/kernel/mac80211/patches/008-fix_netdev_unregister.patch

    r42329 r42683  
    11--- a/net/mac80211/iface.c 
    22+++ b/net/mac80211/iface.c 
    3 @@ -1796,7 +1796,11 @@ void ieee80211_remove_interfaces(struct  
     3@@ -1825,6 +1825,11 @@ void ieee80211_remove_interfaces(struct  
    44        } 
    55        mutex_unlock(&local->iflist_mtx); 
     
    88+       LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)) && \ 
    99+     (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))) 
    10         list_del(&unreg_list); 
     10+       list_del(&unreg_list); 
    1111+#endif 
    1212  
  • trunk/package/kernel/mac80211/patches/050-lib80211_option.patch

    r40800 r42683  
    11--- a/net/wireless/Kconfig 
    22+++ b/net/wireless/Kconfig 
    3 @@ -160,7 +160,7 @@ config CFG80211_WEXT 
     3@@ -166,7 +166,7 @@ config CFG80211_WEXT 
    44          extensions with cfg80211-based drivers. 
    55  
     
    1010        default n 
    1111        help 
    12 @@ -170,15 +170,15 @@ config LIB80211 
     12@@ -176,15 +176,15 @@ config LIB80211 
    1313          Drivers should select this themselves if needed. 
    1414  
  • trunk/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch

    r40834 r42683  
    11--- a/.local-symbols 
    22+++ b/.local-symbols 
    3 @@ -403,42 +403,6 @@ USB_CDC_PHONET= 
     3@@ -414,42 +414,6 @@ USB_CDC_PHONET= 
    44 USB_IPHETH= 
    55 USB_SIERRA_NET= 
     
    5555 source net/nfc/Kconfig 
    5656  
    57  source drivers/regulator/Kconfig 
     57 source drivers/media/Kconfig 
    5858--- a/Makefile.kernel 
    5959+++ b/Makefile.kernel 
     
    6969--- a/drivers/net/wireless/b43/main.c 
    7070+++ b/drivers/net/wireless/b43/main.c 
    71 @@ -2733,7 +2733,7 @@ static struct ssb_device *b43_ssb_gpio_d 
     71@@ -2828,7 +2828,7 @@ static struct ssb_device *b43_ssb_gpio_d 
    7272 { 
    7373        struct ssb_bus *bus = dev->dev->sdev->bus; 
     
    7878 #else 
    7979        return bus->chipco.dev; 
    80 @@ -4698,7 +4698,7 @@ static int b43_wireless_core_init(struct 
     80@@ -4858,7 +4858,7 @@ static int b43_wireless_core_init(struct 
    8181        } 
    8282        if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW) 
  • trunk/package/kernel/mac80211/patches/100-revert_aes_ccm_port.patch

    r40800 r42683  
    247247--- a/net/mac80211/wpa.c 
    248248+++ b/net/mac80211/wpa.c 
    249 @@ -301,15 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee 
     249@@ -304,15 +304,22 @@ ieee80211_crypto_tkip_decrypt(struct iee 
    250250 } 
    251251  
     
    272272         * Mask FC: zero subtype b4 b5 b6 (if not mgmt) 
    273273         * Retry, PwrMgt, MoreData; set Protected 
    274 @@ -331,21 +338,20 @@ static void ccmp_special_blocks(struct s 
     274@@ -334,21 +341,20 @@ static void ccmp_special_blocks(struct s 
    275275        else 
    276276                qos_tid = 0; 
     
    301301        /* AAD (extra authenticate-only data) / masked 802.11 header 
    302302         * FC | A1 | A2 | A3 | SC | [A4] | [QC] */ 
    303 @@ -401,8 +407,7 @@ static int ccmp_encrypt_skb(struct ieee8 
     303@@ -404,8 +410,7 @@ static int ccmp_encrypt_skb(struct ieee8 
    304304        u8 *pos; 
    305305        u8 pn[6]; 
     
    311311        if (info->control.hw_key && 
    312312            !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) && 
    313 @@ -458,9 +463,9 @@ static int ccmp_encrypt_skb(struct ieee8 
     313@@ -461,9 +466,9 @@ static int ccmp_encrypt_skb(struct ieee8 
    314314                return 0; 
    315315  
     
    324324        return 0; 
    325325 } 
    326 @@ -523,16 +528,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee 
     326@@ -526,16 +531,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee 
    327327        } 
    328328  
  • trunk/package/kernel/mac80211/patches/150-disable_addr_notifier.patch

    r40834 r42683  
    11--- a/net/mac80211/main.c 
    22+++ b/net/mac80211/main.c 
    3 @@ -285,7 +285,7 @@ void ieee80211_restart_hw(struct ieee802 
     3@@ -287,7 +287,7 @@ void ieee80211_restart_hw(struct ieee802 
    44 } 
    55 EXPORT_SYMBOL(ieee80211_restart_hw); 
     
    1010                                 unsigned long data, void *arg) 
    1111 { 
    12 @@ -344,7 +344,7 @@ static int ieee80211_ifa_changed(struct  
     12@@ -346,7 +346,7 @@ static int ieee80211_ifa_changed(struct  
    1313 } 
    1414 #endif 
     
    1919                                  unsigned long data, void *arg) 
    2020 { 
    21 @@ -1036,14 +1036,14 @@ int ieee80211_register_hw(struct ieee802 
     21@@ -1038,14 +1038,14 @@ int ieee80211_register_hw(struct ieee802 
    2222                goto fail_pm_qos; 
    2323        } 
     
    3636        result = register_inet6addr_notifier(&local->ifa6_notifier); 
    3737        if (result) 
    38 @@ -1052,13 +1052,13 @@ int ieee80211_register_hw(struct ieee802 
     38@@ -1054,13 +1054,13 @@ int ieee80211_register_hw(struct ieee802 
    3939  
    4040        return 0; 
     
    5353        pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY, 
    5454                               &local->network_latency_notifier); 
    55 @@ -1103,10 +1103,10 @@ void ieee80211_unregister_hw(struct ieee 
     55@@ -1105,10 +1105,10 @@ void ieee80211_unregister_hw(struct ieee 
    5656  
    5757        pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY, 
  • trunk/package/kernel/mac80211/patches/300-pending_work.patch

    r42530 r42683  
    1 commit fb77a822cc68745186b38db7d105ad97e0622152 
    2 Author: Johannes Stezenbach <js@sig21.net> 
    3 Date:   Fri Sep 12 22:36:51 2014 +0200 
    4  
    5     ath9k_htc: fix random decryption failure 
     1commit c11113bc25df22898fb995d3205bdc4f27c98073 
     2Author: Felix Fietkau <nbd@openwrt.org> 
     3Date:   Sat Sep 27 18:04:58 2014 +0200 
     4 
     5    ath5k: add missing include for debug code 
    66     
    7     In v3.15 the driver stopped to accept network packets after successful 
    8     authentification, which could be worked around by passing the 
    9     nohwcrypt=1 module parameter.  This was not reproducible by 
    10     everyone, and showed random behaviour in some tests. 
    11     It was caused by an uninitialized variable introduced 
    12     in 4ed1a8d4a257 ("ath9k_htc: use ath9k_cmn_rx_accept") and 
    13     used in 341b29b9cd2f ("ath9k_htc: use ath9k_cmn_rx_skb_postprocess"). 
    14      
    15     Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=78581 
    16     Fixes: 341b29b9cd2f ("ath9k_htc: use ath9k_cmn_rx_skb_postprocess") 
    17     Signed-off-by: Johannes Stezenbach <js@sig21.net> 
    18  
    19 commit 11f17631d9bf2a9e910dac7d09ba4581f5693831 
    20 Author: Felix Fietkau <nbd@openwrt.org> 
    21 Date:   Tue Sep 9 09:48:30 2014 +0200 
    22  
    23     ath9k_hw: fix PLL clock initialization for newer SoC 
    24      
    25     On AR934x and newer SoC devices, the layout of the AR_RTC_PLL_CONTROL 
    26     register changed. This currently breaks at least 5/10 MHz operation. 
    27     AR933x uses the old layout. 
    28      
    29     It might also have been causing other stability issues because of the 
    30     different location of the PLL_BYPASS bit which needs to be set during 
    31     PLL clock initialization. 
    32      
    33     This patch also removes more instances of hardcoded register values in 
    34     favor of properly computed ones with the PLL_BYPASS bit added. 
    35      
    36     Reported-by: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com> 
    37     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    38  
    39 commit 0fecedddd4a0945873db1bd230ec6a168b3cc4fe 
    40 Author: Felix Fietkau <nbd@openwrt.org> 
    41 Date:   Mon Sep 8 18:35:08 2014 +0200 
    42  
    43     ath9k_hw: reduce ANI spur immunity setting on HT40 extension channel 
    44      
    45     The cycpwr_thr1 value needs to be lower on the extension channel than on 
    46     the control channel, similar to how the register settings are programmed 
    47     in the initvals. 
    48      
    49     Also drop the unnecessary check for HT40 - this register can always be 
    50     written. This patch has been reported to improve HT40 stability and 
    51     throughput in some environments. 
     7    Needed for calling vmalloc()/vfree() 
    528     
    539    Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    5410 
    55 commit 30d7434ccb853b96de698a040888fa4dacd0cc19 
     11commit 83f76a9f9a42773c7eef90bb86b4b2c16b0b3755 
    5612Author: Felix Fietkau <nbd@openwrt.org> 
    57 Date:   Mon Sep 8 18:31:26 2014 +0200 
    58  
    59     Revert "ath9k_hw: reduce ANI firstep range for older chips" 
    60      
    61     This reverts commit 09efc56345be4146ab9fc87a55c837ed5d6ea1ab 
    62      
    63     I've received reports that this change is decreasing throughput in some 
    64     rare conditions on an AR9280 based device 
    65      
    66     Cc: stable@vger.kernel.org 
    67     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    68  
    69 commit 15ed54948f508ad1baad79c30050e2d29a21696d 
    70 Author: Felix Fietkau <nbd@openwrt.org> 
    71 Date:   Fri Jul 25 16:18:03 2014 +0200 
    72  
    73     mac80211: fix smps mode check for AP_VLAN 
    74      
    75     In ieee80211_sta_ps_deliver_wakeup, sdata->smps_mode is checked. This is 
    76     initialized only for the base AP interface, not the individual VLANs. 
     13Date:   Sat Sep 27 15:58:51 2014 +0200 
     14 
     15    ath5k: fix AHB kconfig dependency 
    7716     
    7817    Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    7918 
    80 commit bc74ad816bba291359ae46301173ea744bdda9d2 
     19commit ddd67f2a5cfd73fad4b78190025402d419b9f0a9 
    8120Author: Felix Fietkau <nbd@openwrt.org> 
    82 Date:   Fri Jul 25 16:15:44 2014 +0200 
    83  
    84     mac80211: ignore AP_VLAN in ieee80211_recalc_chanctx_chantype 
     21Date:   Sat Sep 27 15:57:09 2014 +0200 
     22 
     23    Revert "ath5k: Remove AHB bus support" 
    8524     
    86     When bringing down the AP, a WARN_ON is hit because the bss config chandef 
    87     is empty here. 
    88     Since AP_VLAN channel settings do not matter for anything chanctx related 
    89     (always inherits the settings from the AP interface), let's just ignore 
    90     it here. 
    91      
    92     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    93  
    94 commit ff354dbdd743e5fe186df8cd17982db19f78231a 
    95 Author: Felix Fietkau <nbd@openwrt.org> 
    96 Date:   Wed Jul 23 15:33:26 2014 +0200 
    97  
    98     ath9k: fix aggregation session lockup 
    99      
    100     If an aggregation session fails, frames still end up in the driver queue 
    101     with IEEE80211_TX_CTL_AMPDU set. 
    102     This causes tx for the affected station/tid to stall, since 
    103     ath_tx_get_tid_subframe returning packets to send. 
    104      
    105     Fix this by clearing IEEE80211_TX_CTL_AMPDU as long as no aggregation 
    106     session is running. 
    107      
    108     Cc: stable@vger.kernel.org 
    109     Reported-by: Antonio Quartulli <antonio@open-mesh.com> 
    110     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    111  
    112 commit 38695a6e5a940e6a524523b88a33916b016fb2a1 
    113 Author: Felix Fietkau <nbd@openwrt.org> 
    114 Date:   Fri Jul 11 12:06:18 2014 +0200 
    115  
    116     mac80211: fix crash on getting sta info with uninitialized rate control 
    117      
    118     If the expected throughput is queried before rate control has been 
    119     initialized, the minstrel op for it will crash while trying to access 
    120     the rate table. 
    121     Check for WLAN_STA_RATE_CONTROL before attempting to use the rate 
    122     control op. 
    123      
    124     Reported-by: Jean-Pierre Tosoni <jp.tosoni@acksys.fr> 
    125     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    126  
    127 commit c0ee7fa4c0da824ccccc172bf175fb1f86540921 
    128 Author: Felix Fietkau <nbd@openwrt.org> 
    129 Date:   Wed Jul 16 18:00:31 2014 +0200 
    130  
    131     ath9k: fix pending tx frames accounting 
    132      
    133     Packets originally buffered for the regular hardware tx queues can end 
    134     up being transmitted through the U-APSD queue (via PS-Poll or U-APSD). 
    135     When packets are dropped due to retransmit failures, the pending frames 
    136     counter is not always updated properly. 
    137     Fix this by keeping track of the queue that a frame was accounted for in 
    138     the ath_frame_info struct, and using that on completion to decide 
    139     whether the counter should be updated. 
    140     This fixes some spurious transmit queue hangs. 
    141      
    142     Cc: stable@vger.kernel.org 
    143     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    144  
    145 commit edcdf0989410a05a6a4b8438df4010447eaa7d9a 
    146 Author: Felix Fietkau <nbd@openwrt.org> 
    147 Date:   Sun Jun 22 13:36:20 2014 +0200 
    148  
    149     Revert "cfg80211: Use 5MHz bandwidth by default when checking usable channels" 
    150      
    151     It enables channels that are not supposed to be enabled according to the 
    152     regulatory rules. 
    153      
    154     This reverts commit 8eca1fb692cc9557f386eddce75c300a3855d11a. 
    155  
    156 commit 6e7341074823d2a45b81f2742cbf75f1da790031 
    157 Author: Rafał Miłecki <zajec5@gmail.com> 
    158 Date:   Sat May 31 19:40:45 2014 +0200 
    159  
    160     b43: disable 5 GHz on G-PHY 
    161      
    162     This fixes regression introduced by adding some G-PHY devices to the 
    163     list of dual band devices. There is simply no support for 5 GHz on 
    164     G-PHY devices in b43. It results in: 
    165     WARNING: CPU: 0 PID: 79 at drivers/net/wireless/b43/phy_g.c:75 b43_gphy_channel_switch+0x125/0x130 [b43]() 
    166     b43-phy1 ERROR: PHY init: Channel switch to default failed 
    167      
    168     Regression was introduced by the following commit: 
    169      
    170     commit 773cfc508f4d64c14547ff8751b5cbd473124364 
    171     Author: Rafał Miłecki <zajec5@gmail.com> 
    172     Date:   Mon May 19 23:18:55 2014 +0200 
    173      
    174         b43: add more devices to the bands database 
    175      
    176     Signed-off-by: Rafał Miłecki <zajec5@gmail.com> 
    177     Signed-off-by: John W. Linville <linville@tuxdriver.com> 
    178  
    179 commit 1186edbef91f15722e5bdf56326ce0abc2935ce7 
    180 Author: Stanislaw Gruszka <sgruszka@redhat.com> 
    181 Date:   Tue Jun 10 12:51:06 2014 +0200 
    182  
    183     rt2x00: disable TKIP on USB 
    184      
    185     On USB we can not get atomically TKIP key. We have to disable support 
    186     for TKIP acceleration on USB hardware to avoid bug as showed bellow. 
    187      
    188     [  860.827243] BUG: scheduling while atomic: hostapd/3397/0x00000002 
    189     <snip> 
    190     [  860.827280] Call Trace: 
    191     [  860.827282]  [<ffffffff81682ea6>] dump_stack+0x4d/0x66 
    192     [  860.827284]  [<ffffffff8167eb9b>] __schedule_bug+0x47/0x55 
    193     [  860.827285]  [<ffffffff81685bb3>] __schedule+0x733/0x7b0 
    194     [  860.827287]  [<ffffffff81685c59>] schedule+0x29/0x70 
    195     [  860.827289]  [<ffffffff81684f8a>] schedule_timeout+0x15a/0x2b0 
    196     [  860.827291]  [<ffffffff8105ac50>] ? ftrace_raw_event_tick_stop+0xc0/0xc0 
    197     [  860.827294]  [<ffffffff810c13c2>] ? __module_text_address+0x12/0x70 
    198     [  860.827296]  [<ffffffff81686823>] wait_for_completion_timeout+0xb3/0x140 
    199     [  860.827298]  [<ffffffff81080fc0>] ? wake_up_state+0x20/0x20 
    200     [  860.827301]  [<ffffffff814d5b3d>] usb_start_wait_urb+0x7d/0x150 
    201     [  860.827303]  [<ffffffff814d5cd5>] usb_control_msg+0xc5/0x110 
    202     [  860.827305]  [<ffffffffa02fb0c6>] rt2x00usb_vendor_request+0xc6/0x160  [rt2x00usb] 
    203     [  860.827307]  [<ffffffffa02fb215>] rt2x00usb_vendor_req_buff_lock+0x75/0x150 [rt2x00usb] 
    204     [  860.827309]  [<ffffffffa02fb393>] rt2x00usb_vendor_request_buff+0xa3/0xe0 [rt2x00usb] 
    205     [  860.827311]  [<ffffffffa023d1a3>] rt2x00usb_register_multiread+0x33/0x40 [rt2800usb] 
    206     [  860.827314]  [<ffffffffa05805f9>] rt2800_get_tkip_seq+0x39/0x50  [rt2800lib] 
    207     [  860.827321]  [<ffffffffa0480f88>] ieee80211_get_key+0x218/0x2a0  [mac80211] 
    208     [  860.827322]  [<ffffffff815cc68c>] ? __nlmsg_put+0x6c/0x80 
    209     [  860.827329]  [<ffffffffa051b02e>] nl80211_get_key+0x22e/0x360 [cfg80211] 
    210      
    211     Cc: stable@vger.kernel.org 
    212     Reported-and-tested-by: Peter Wu <lekensteyn@gmail.com> 
    213     Reported-and-tested-by: Pontus Fuchs <pontus.fuchs@gmail.com> 
    214     Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> 
    215     Signed-off-by: John W. Linville <linville@tuxdriver.com> 
    216  
    217 commit 5f313a15da92dda80ac4c9a137bc42d7d0b49adf 
    218 Author: Rafał Miłecki <zajec5@gmail.com> 
    219 Date:   Thu Jun 12 09:28:38 2014 +0200 
    220  
    221     b43: fix frequency reported on G-PHY with /new/ firmware 
    222  
    223 commit d3a58df87a2e4c2301ac843604202d290a48440b 
    224 Author: Avraham Stern <avraham.stern@intel.com> 
    225 Date:   Thu May 22 12:17:47 2014 +0300 
    226  
    227     mac80211: set new interfaces as idle upon init 
    228      
    229     Mark new interfaces as idle to allow operations that require that 
    230     interfaces are idle to take place. Interface types that are always 
    231     not idle (like AP interfaces) will be set as not idle when they are 
    232     assigned a channel context. 
    233      
    234     Signed-off-by: Avraham Stern <avraham.stern@intel.com> 
    235     Signed-off-by: Emmanuel Grumbach<emmanuel.grumbach@intel.com> 
    236     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    237  
    238 commit 923eaf367206e01f22c97aee22300e332d071916 
    239 Author: Arik Nemtsov <arik@wizery.com> 
    240 Date:   Mon May 26 14:40:51 2014 +0300 
    241  
    242     mac80211: don't check netdev state for debugfs read/write 
    243      
    244     Doing so will lead to an oops for a p2p-dev interface, since it has 
    245     no netdev. 
    246      
    247     Cc: stable@vger.kernel.org 
    248     Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com> 
    249     Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> 
    250     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    251  
    252 commit a9fb54169b197f31aff24c8d6270dd1e56cde395 
    253 Author: chaitanya.mgit@gmail.com <chaitanya.mgit@gmail.com> 
    254 Date:   Mon May 26 18:01:44 2014 +0530 
    255  
    256     regdb: Generalize the mW to dBm power conversion 
    257      
    258     Generalize the power conversion from mW to dBm 
    259     using log. This should fix the below compilation 
    260     error for country NO which adds a new power value 
    261     2000mW which is not handled earlier. 
    262      
    263      CC [M]  net/wireless/wext-sme.o 
    264      CC [M]  net/wireless/regdb.o 
    265     net/wireless/regdb.c:1130:1: error: Unknown undeclared here (not in 
    266     a function) 
    267     net/wireless/regdb.c:1130:9: error: expected } before power 
    268     make[2]: *** [net/wireless/regdb.o] Error 1 
    269     make[1]: *** [net/wireless] Error 2 
    270     make: *** [net] Error 2 
    271      
    272     Reported-By:  John Walker <john@x109.net> 
    273     Signed-off-by: Chaitanya T K <chaitanya.mgit@gmail.com> 
    274     Acked-by: John W. Linville <linville@tuxdriver.com> 
    275     [remove unneeded parentheses, fix rounding by using %.0f] 
    276     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    277  
    278 commit c7d37a66e345df2fdf1aa7b2c9a6d3d53846ca5b 
    279 Author: Krzysztof Hałasa <khalasa@piap.pl> 
    280 Date:   Mon May 26 14:14:46 2014 +0200 
    281  
    282     mac80211: fix IBSS join by initializing last_scan_completed 
    283      
    284     Without this fix, freshly rebooted Linux creates a new IBSS 
    285     instead of joining an existing one. Only when jiffies counter 
    286     overflows after 5 minutes the IBSS can be successfully joined. 
    287      
    288     Signed-off-by: Krzysztof Hałasa <khalasa@piap.pl> 
    289     [edit commit message slightly] 
    290     Cc: stable@vger.kernel.org 
    291     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    292  
    293 commit 34171dc0d623be2c1032416bf7d3819f388ed70d 
    294 Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com> 
    295 Date:   Sun May 25 15:35:41 2014 +0300 
    296  
    297     mac80211: fix virtual monitor interface addition 
    298      
    299     Since the commit below, cfg80211_chandef_dfs_required() 
    300     will warn if it gets a an NL80211_IFTYPE_UNSPECIFIED iftype 
    301     as explicitely written in the commit log. 
    302     When an virtual monitor interface is added, its type is set 
    303     in ieee80211_sub_if_data.vif.type, but not in 
    304     ieee80211_sub_if_data.wdev.iftype which is passed to 
    305     cfg80211_chandef_dfs_required() hence resulting in the 
    306     following warning: 
    307      
    308     WARNING: CPU: 1 PID: 21265 at net/wireless/chan.c:376 cfg80211_chandef_dfs_required+0xbc/0x130 [cfg80211]() 
    309     Modules linked in: [...] 
    310     CPU: 1 PID: 21265 Comm: ifconfig Tainted: G        W  O 3.13.11+ #12 
    311     Hardware name: Dell Inc. Latitude E6410/0667CC, BIOS A01 03/05/2010 
    312      0000000000000009 ffff88008f5fdb08 ffffffff817d4219 ffff88008f5fdb50 
    313      ffff88008f5fdb40 ffffffff8106f57d 0000000000000000 0000000000000000 
    314      ffff880081062fb8 ffff8800810604e0 0000000000000001 ffff88008f5fdba0 
    315     Call Trace: 
    316      [<ffffffff817d4219>] dump_stack+0x4d/0x66 
    317      [<ffffffff8106f57d>] warn_slowpath_common+0x7d/0xa0 
    318      [<ffffffff8106f5ec>] warn_slowpath_fmt+0x4c/0x50 
    319      [<ffffffffa04ea4ec>] cfg80211_chandef_dfs_required+0xbc/0x130 [cfg80211] 
    320      [<ffffffffa06b1024>] ieee80211_vif_use_channel+0x94/0x500 [mac80211] 
    321      [<ffffffffa0684e6b>] ieee80211_add_virtual_monitor+0x1ab/0x5c0 [mac80211] 
    322      [<ffffffffa0686ae5>] ieee80211_do_open+0xe75/0x1580 [mac80211] 
    323      [<ffffffffa0687259>] ieee80211_open+0x69/0x70 [mac80211] 
    324     [snip] 
    325      
    326     Fixes: 00ec75fc5a64 ("cfg80211: pass the actual iftype when calling cfg80211_chandef_dfs_required()") 
    327     Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> 
    328     Acked-by: Luciano Coelho <luciano.coelho@intel.com> 
    329     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    330  
    331 commit d93cc72b37b4e2c314e1c499e80e8801907c2fea 
    332 Author: Michal Kazior <michal.kazior@tieto.com> 
    333 Date:   Thu Jun 5 14:21:37 2014 +0200 
    334  
    335     mac80211: use csa counter offsets instead of csa_active 
    336      
    337     vif->csa_active is protected by mutexes only. This 
    338     means it is unreliable to depend on it on codeflow 
    339     in non-sleepable beacon and CSA code. There was no 
    340     guarantee to have vif->csa_active update be 
    341     visible before beacons are updated on SMP systems. 
    342      
    343     Using csa counter offsets which are embedded in 
    344     beacon struct (and thus are protected with single 
    345     RCU assignment) is much safer. 
    346      
    347     Signed-off-by: Michal Kazior <michal.kazior@tieto.com> 
    348     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    349  
    350 commit d2746694fcdef24e0a7a1947d8c70082cde81a26 
    351 Author: Michal Kazior <michal.kazior@tieto.com> 
    352 Date:   Thu Jun 5 14:21:36 2014 +0200 
    353  
    354     mac80211: move csa counters from sdata to beacon/presp 
    355      
    356     Having csa counters part of beacon and probe_resp 
    357     structures makes it easier to get rid of possible 
    358     races between setting a beacon and updating 
    359     counters on SMP systems by guaranteeing counters 
    360     are always consistent against given beacon struct. 
    361      
    362     While at it relax WARN_ON into WARN_ON_ONCE to 
    363     prevent spamming logs and racing. 
    364      
    365     Signed-off-by: Michal Kazior <michal.kazior@tieto.com> 
    366     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    367  
    368 commit 5dcb54f3a1a8cd7e0331e773487574f9743615db 
    369 Author: Janusz Dziedzic <janusz.dziedzic@tieto.com> 
    370 Date:   Thu Jun 5 08:12:57 2014 +0200 
    371  
    372     mac80211: allow tx via monitor iface when DFS 
    373      
    374     Allow send frames using monitor interface 
    375     when DFS chandef and we pass CAC (beaconing 
    376     allowed). 
    377      
    378     This fix problem when old kernel and new backports used, 
    379     in such case hostapd create/use also monitor interface. 
    380     Before this patch all frames hostapd send using monitor 
    381     iface were dropped when AP was configured on DFS channel. 
    382      
    383     Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com> 
    384     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    385  
    386 commit 6f09a1beb0d2007572248c986780562219bd206f 
    387 Author: Johannes Berg <johannes.berg@intel.com> 
    388 Date:   Wed Jun 4 17:31:56 2014 +0200 
    389  
    390     cfg80211: make ethtool the driver's responsibility 
    391      
    392     Currently, cfg80211 tries to implement ethtool, but that doesn't 
    393     really scale well, with all the different operations. Make the 
    394     lower-level driver responsible for it, which currently only has 
    395     an effect on mac80211. It will similarly not scale well at that 
    396     level though, since mac80211 also has many drivers. 
    397      
    398     To cleanly implement this in mac80211, introduce a new file and 
    399     move some code to appropriate places. 
    400      
    401     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    402  
    403 commit 6b0c6f133de8f90caeb1c4a902e6140567c5bf96 
    404 Author: Johannes Berg <johannes.berg@intel.com> 
    405 Date:   Wed Jun 4 17:06:23 2014 +0200 
    406  
    407     mac80211: remove weak WEP IV accounting 
    408      
    409     Since WEP is practically dead, there seems very little 
    410     point in keeping WEP weak IV accounting. 
    411      
    412     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    413  
    414 commit aecdc89fb4664c76baa4bbd46008f220532309ff 
    415 Author: Luciano Coelho <luciano.coelho@intel.com> 
    416 Date:   Fri May 23 11:04:50 2014 +0300 
    417  
    418     ath9k/ath10k: remove unnecessary channel_switch_beacon callbacks 
    419      
    420     The channel_switch_beacon callback is optional, so it doesn't have to 
    421     be defined if it's not going to do anything useful with it.  Both 
    422     ath9k and ath10k define the callback and just returns.  This commit 
    423     removes them. 
    424      
    425     Cc: Michal Kazior <michal.kazior@tieto.com> 
    426     Signed-off-by: Luciano Coelho <luciano.coelho@intel.com> 
    427     Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> 
    428  
    429 commit 60ccc107c9b9fb732fdee1f76bb2dad44f0e1798 
    430 Author: Rajkumar Manoharan <rmanohar@qti.qualcomm.com> 
    431 Date:   Tue May 27 16:58:02 2014 +0530 
    432  
    433     ath9k: Fix deadlock while updating p2p beacon timer 
    434      
    435     pm_lock is taken twice while syncing HW TSF of p2p vif. 
    436     Fix this by taking the lock at caller side. 
    437      
    438     Cc: Felix Fietkau <nbd@openwrt.org> 
    439     Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com> 
    440     Signed-off-by: John W. Linville <linville@tuxdriver.com> 
    441  
    442 commit f3831a4e3903dbc1a57d5df56deb6a143fd001bc 
    443 Author: Stanislaw Gruszka <sgruszka@redhat.com> 
    444 Date:   Thu Jun 5 13:52:27 2014 +0200 
    445  
    446     rt2x00: do not initialize BCN_OFFSET registers 
    447      
    448     We setup BCN_OFFSET{0,1} registers dynamically, don't have to 
    449     initialize them. 
    450      
    451     Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> 
    452  
    453 commit e5c58ca7a48d4c82f282749a978052c47fd95998 
    454 Author: Stanislaw Gruszka <sgruszka@redhat.com> 
    455 Date:   Thu Jun 5 13:52:26 2014 +0200 
    456  
    457     rt2x00: change order when stop beaconing 
    458      
    459     When no beaconing is needed, first stop beacon queue (disable beaconing 
    460     globally) to avoid possible sending of not prepared beacon on short 
    461     period after clearing beacon and before stop of BCN queue. 
    462      
    463     Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> 
    464  
    465 commit 382c1b9e03f52d0cd741ef1d942cad0f649f0744 
    466 Author: Stanislaw Gruszka <sgruszka@redhat.com> 
    467 Date:   Thu Jun 5 13:52:25 2014 +0200 
    468  
    469     rt2x00: change default MAC_BSSID_DW1_BSS_BCN_NUM 
    470      
    471     We setup MAC_BSSID_DW1_BSS_BCN_NUM dynamically when numbers of active 
    472     beacons increase. Change default to 0 to tell hardware that we want to 
    473     send only one beacon as default. 
    474      
    475     Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> 
    476  
    477 commit 3b400571dd033e46fa7e76c5bb92a3ce8198afa9 
    478 Author: Stanislaw Gruszka <sgruszka@redhat.com> 
    479 Date:   Thu Jun 5 13:52:24 2014 +0200 
    480  
    481     rt2x00: change beaconing setup on RT2800 
    482      
    483     As reported by Matthias, on 5572 chip, even if we clear up TXWI 
    484     of corresponding beacon, hardware still try to send it or do other 
    485     action that increase power consumption peak up to 1A. 
    486      
    487     To avoid the issue, setup beaconing dynamically by configuring offsets 
    488     of currently active beacons and MAC_BSSID_DW1_BSS_BCN_NUM variable, 
    489     which limit number of beacons that hardware will try to send. 
    490      
    491     Reported-by: Matthias Fend <Matthias.Fend@wolfvision.net> 
    492     Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> 
    493  
    494 commit 916e591b2cc41f7e572992175ca56d866d7bc958 
    495 Author: Stanislaw Gruszka <sgruszka@redhat.com> 
    496 Date:   Thu Jun 5 13:52:23 2014 +0200 
    497  
    498     rt2x00: change beaconing locking 
    499      
    500     This patch is needed for further changes to keep global variables 
    501     consistent when changing beaconing on diffrent vif's. 
    502      
    503     Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> 
    504  
    505 commit 930b0dffd1731f3f418f9132faea720a23b7af61 
    506 Author: Johannes Berg <johannes.berg@intel.com> 
    507 Date:   Tue Jun 3 11:18:47 2014 +0200 
    508  
    509     mac80211: fix station/driver powersave race 
    510      
    511     It is currently possible to have a race due to the station PS 
    512     unblock work like this: 
    513      * station goes to sleep with frames buffered in the driver 
    514      * driver blocks wakeup 
    515      * station wakes up again 
    516      * driver flushes/returns frames, and unblocks, which schedules 
    517        the unblock work 
    518      * unblock work starts to run, and checks that the station is 
    519        awake (i.e. that the WLAN_STA_PS_STA flag isn't set) 
    520      * we process a received frame with PM=1, setting the flag again 
    521      * ieee80211_sta_ps_deliver_wakeup() runs, delivering all frames 
    522        to the driver, and then clearing the WLAN_STA_PS_DRIVER and 
    523        WLAN_STA_PS_STA flags 
    524      
    525     In this scenario, mac80211 will think that the station is awake, 
    526     while it really is asleep, and any TX'ed frames should be filtered 
    527     by the device (it will know that the station is sleeping) but then 
    528     passed to mac80211 again, which will not buffer it either as it 
    529     thinks the station is awake, and eventually the packets will be 
    530     dropped. 
    531      
    532     Fix this by moving the clearing of the flags to exactly where we 
    533     learn about the situation. This creates a problem of reordering, 
    534     so introduce another flag indicating that delivery is being done, 
    535     this new flag also queues frames and is cleared only while the 
    536     spinlock is held (which the queuing code also holds) so that any 
    537     concurrent delivery/TX is handled correctly. 
    538      
    539     Reported-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> 
    540     Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
    541  
    542 commit 6df35206bc6c1c6aad1d8077df5786b4a7f77873 
    543 Author: Felix Fietkau <nbd@openwrt.org> 
    544 Date:   Fri May 23 19:58:14 2014 +0200 
    545  
    546     mac80211: reduce packet loss notifications under load 
    547      
    548     During strong signal fluctuations under high throughput, few consecutive 
    549     failed A-MPDU transmissions can easily trigger packet loss notification, 
    550     and thus (in AP mode) client disconnection. 
    551      
    552     Reduce the number of false positives by checking the A-MPDU status flag 
    553     and treating a failed A-MPDU as a single packet. 
    554      
    555     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    556  
    557 commit 7b7843a36fbcc568834404c7430ff895d8502131 
    558 Author: Felix Fietkau <nbd@openwrt.org> 
    559 Date:   Fri May 23 19:26:32 2014 +0200 
    560  
    561     mac80211: fix a memory leak on sta rate selection table 
    562      
    563     Cc: stable@vger.kernel.org 
    564     Reported-by: Christophe Prévotaux <cprevotaux@nltinc.com> 
    565     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    566  
    567 commit 96892d6aa0a153423070addf3070bc79578b3897 
    568 Author: Felix Fietkau <nbd@openwrt.org> 
    569 Date:   Mon May 19 21:20:49 2014 +0200 
    570  
    571     ath9k: avoid passing buffers to the hardware during flush 
    572      
    573     The commit "ath9k: fix possible hang on flush" changed the receive code 
    574     to always link rx descriptors of processed frames, even when flushing. 
    575     In some cases, this leads to flushed rx buffers being passed to the 
    576     hardware while rx is already stopped. 
    577      
    578     Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
    579  
    580 --- a/drivers/net/wireless/ath/ath9k/recv.c 
    581 +++ b/drivers/net/wireless/ath/ath9k/recv.c 
    582 @@ -34,7 +34,8 @@ static inline bool ath9k_check_auto_slee 
    583   * buffer (or rx fifo). This can incorrectly acknowledge packets 
    584   * to a sender if last desc is self-linked. 
    585   */ 
    586 -static void ath_rx_buf_link(struct ath_softc *sc, struct ath_rxbuf *bf) 
    587 +static void ath_rx_buf_link(struct ath_softc *sc, struct ath_rxbuf *bf, 
    588 +                           bool flush) 
     25    This reverts commit 093ec3c5337434f40d77c1af06c139da3e5ba6dc. 
     26 
     27--- a/drivers/net/wireless/ath/ath5k/Kconfig 
     28+++ b/drivers/net/wireless/ath/ath5k/Kconfig 
     29@@ -2,12 +2,14 @@ config ATH5K 
     30        tristate "Atheros 5xxx wireless cards support" 
     31        depends on m 
     32        depends on PCI && MAC80211 
     33+       depends on (PCI || ATHEROS_AR231X) && MAC80211 
     34        select ATH_COMMON 
     35        select MAC80211_LEDS 
     36        select BACKPORT_LEDS_CLASS 
     37        select BACKPORT_NEW_LEDS 
     38        select BACKPORT_AVERAGE 
     39-       select ATH5K_PCI 
     40+       select ATH5K_AHB if ATHEROS_AR231X 
     41+       select ATH5K_PCI if !ATHEROS_AR231X 
     42        ---help--- 
     43          This module adds support for wireless adapters based on 
     44          Atheros 5xxx chipset. 
     45@@ -52,9 +54,16 @@ config ATH5K_TRACER 
     46  
     47          If unsure, say N. 
     48  
     49+config ATH5K_AHB 
     50+       bool "Atheros 5xxx AHB bus support" 
     51+       depends on ATHEROS_AR231X 
     52+       ---help--- 
     53+         This adds support for WiSoC type chipsets of the 5xxx Atheros 
     54+         family. 
     55+ 
     56 config ATH5K_PCI 
     57        bool "Atheros 5xxx PCI bus support" 
     58-       depends on PCI 
     59+       depends on !ATHEROS_AR231X 
     60        ---help--- 
     61          This adds support for PCI type chipsets of the 5xxx Atheros 
     62          family. 
     63--- /dev/null 
     64+++ b/drivers/net/wireless/ath/ath5k/ahb.c 
     65@@ -0,0 +1,234 @@ 
     66+/* 
     67+ * Copyright (c) 2008-2009 Atheros Communications Inc. 
     68+ * Copyright (c) 2009 Gabor Juhos <juhosg@openwrt.org> 
     69+ * Copyright (c) 2009 Imre Kaloz <kaloz@openwrt.org> 
     70+ * 
     71+ * Permission to use, copy, modify, and/or distribute this software for any 
     72+ * purpose with or without fee is hereby granted, provided that the above 
     73+ * copyright notice and this permission notice appear in all copies. 
     74+ * 
     75+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 
     76+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
     77+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 
     78+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
     79+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
     80+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
     81+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
     82+ */ 
     83+ 
     84+#include <linux/nl80211.h> 
     85+#include <linux/platform_device.h> 
     86+#include <linux/etherdevice.h> 
     87+#include <linux/export.h> 
     88+#include <ar231x_platform.h> 
     89+#include "ath5k.h" 
     90+#include "debug.h" 
     91+#include "base.h" 
     92+#include "reg.h" 
     93+ 
     94+/* return bus cachesize in 4B word units */ 
     95+static void ath5k_ahb_read_cachesize(struct ath_common *common, int *csz) 
     96+{ 
     97+       *csz = L1_CACHE_BYTES >> 2; 
     98+} 
     99+ 
     100+static bool 
     101+ath5k_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data) 
     102+{ 
     103+       struct ath5k_hw *ah = common->priv; 
     104+       struct platform_device *pdev = to_platform_device(ah->dev); 
     105+       struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev); 
     106+       u16 *eeprom, *eeprom_end; 
     107+ 
     108+       eeprom = (u16 *) bcfg->radio; 
     109+       eeprom_end = ((void *) bcfg->config) + BOARD_CONFIG_BUFSZ; 
     110+ 
     111+       eeprom += off; 
     112+       if (eeprom > eeprom_end) 
     113+               return false; 
     114+ 
     115+       *data = *eeprom; 
     116+       return true; 
     117+} 
     118+ 
     119+int ath5k_hw_read_srev(struct ath5k_hw *ah) 
     120+{ 
     121+       struct platform_device *pdev = to_platform_device(ah->dev); 
     122+       struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev); 
     123+       ah->ah_mac_srev = bcfg->devid; 
     124+       return 0; 
     125+} 
     126+ 
     127+static int ath5k_ahb_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac) 
     128+{ 
     129+       struct platform_device *pdev = to_platform_device(ah->dev); 
     130+       struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev); 
     131+       u8 *cfg_mac; 
     132+ 
     133+       if (to_platform_device(ah->dev)->id == 0) 
     134+               cfg_mac = bcfg->config->wlan0_mac; 
     135+       else 
     136+               cfg_mac = bcfg->config->wlan1_mac; 
     137+ 
     138+       memcpy(mac, cfg_mac, ETH_ALEN); 
     139+       return 0; 
     140+} 
     141+ 
     142+static const struct ath_bus_ops ath_ahb_bus_ops = { 
     143+       .ath_bus_type = ATH_AHB, 
     144+       .read_cachesize = ath5k_ahb_read_cachesize, 
     145+       .eeprom_read = ath5k_ahb_eeprom_read, 
     146+       .eeprom_read_mac = ath5k_ahb_eeprom_read_mac, 
     147+}; 
     148+ 
     149+/*Initialization*/ 
     150+static int ath_ahb_probe(struct platform_device *pdev) 
     151+{ 
     152+       struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev); 
     153+       struct ath5k_hw *ah; 
     154+       struct ieee80211_hw *hw; 
     155+       struct resource *res; 
     156+       void __iomem *mem; 
     157+       int irq; 
     158+       int ret = 0; 
     159+       u32 reg; 
     160+ 
     161+       if (!dev_get_platdata(&pdev->dev)) { 
     162+               dev_err(&pdev->dev, "no platform data specified\n"); 
     163+               ret = -EINVAL; 
     164+               goto err_out; 
     165+       } 
     166+ 
     167+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
     168+       if (res == NULL) { 
     169+               dev_err(&pdev->dev, "no memory resource found\n"); 
     170+               ret = -ENXIO; 
     171+               goto err_out; 
     172+       } 
     173+ 
     174+       mem = ioremap_nocache(res->start, resource_size(res)); 
     175+       if (mem == NULL) { 
     176+               dev_err(&pdev->dev, "ioremap failed\n"); 
     177+               ret = -ENOMEM; 
     178+               goto err_out; 
     179+       } 
     180+ 
     181+       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 
     182+       if (res == NULL) { 
     183+               dev_err(&pdev->dev, "no IRQ resource found\n"); 
     184+               ret = -ENXIO; 
     185+               goto err_iounmap; 
     186+       } 
     187+ 
     188+       irq = res->start; 
     189+ 
     190+       hw = ieee80211_alloc_hw(sizeof(struct ath5k_hw), &ath5k_hw_ops); 
     191+       if (hw == NULL) { 
     192+               dev_err(&pdev->dev, "no memory for ieee80211_hw\n"); 
     193+               ret = -ENOMEM; 
     194+               goto err_iounmap; 
     195+       } 
     196+ 
     197+       ah = hw->priv; 
     198+       ah->hw = hw; 
     199+       ah->dev = &pdev->dev; 
     200+       ah->iobase = mem; 
     201+       ah->irq = irq; 
     202+       ah->devid = bcfg->devid; 
     203+ 
     204+       if (bcfg->devid >= AR5K_SREV_AR2315_R6) { 
     205+               /* Enable WMAC AHB arbitration */ 
     206+               reg = ioread32((void __iomem *) AR5K_AR2315_AHB_ARB_CTL); 
     207+               reg |= AR5K_AR2315_AHB_ARB_CTL_WLAN; 
     208+               iowrite32(reg, (void __iomem *) AR5K_AR2315_AHB_ARB_CTL); 
     209+ 
     210+               /* Enable global WMAC swapping */ 
     211+               reg = ioread32((void __iomem *) AR5K_AR2315_BYTESWAP); 
     212+               reg |= AR5K_AR2315_BYTESWAP_WMAC; 
     213+               iowrite32(reg, (void __iomem *) AR5K_AR2315_BYTESWAP); 
     214+       } else { 
     215+               /* Enable WMAC DMA access (assuming 5312 or 231x*/ 
     216+               /* TODO: check other platforms */ 
     217+               reg = ioread32((void __iomem *) AR5K_AR5312_ENABLE); 
     218+               if (to_platform_device(ah->dev)->id == 0) 
     219+                       reg |= AR5K_AR5312_ENABLE_WLAN0; 
     220+               else 
     221+                       reg |= AR5K_AR5312_ENABLE_WLAN1; 
     222+               iowrite32(reg, (void __iomem *) AR5K_AR5312_ENABLE); 
     223+ 
     224+               /* 
     225+                * On a dual-band AR5312, the multiband radio is only 
     226+                * used as pass-through. Disable 2 GHz support in the 
     227+                * driver for it 
     228+                */ 
     229+               if (to_platform_device(ah->dev)->id == 0 && 
     230+                   (bcfg->config->flags & (BD_WLAN0 | BD_WLAN1)) == 
     231+                    (BD_WLAN1 | BD_WLAN0)) 
     232+                       ah->ah_capabilities.cap_needs_2GHz_ovr = true; 
     233+               else 
     234+                       ah->ah_capabilities.cap_needs_2GHz_ovr = false; 
     235+       } 
     236+ 
     237+       ret = ath5k_init_ah(ah, &ath_ahb_bus_ops); 
     238+       if (ret != 0) { 
     239+               dev_err(&pdev->dev, "failed to attach device, err=%d\n", ret); 
     240+               ret = -ENODEV; 
     241+               goto err_free_hw; 
     242+       } 
     243+ 
     244+       platform_set_drvdata(pdev, hw); 
     245+ 
     246+       return 0; 
     247+ 
     248+ err_free_hw: 
     249+       ieee80211_free_hw(hw); 
     250+ err_iounmap: 
     251+        iounmap(mem); 
     252+ err_out: 
     253+       return ret; 
     254+} 
     255+ 
     256+static int ath_ahb_remove(struct platform_device *pdev) 
     257+{ 
     258+       struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev); 
     259+       struct ieee80211_hw *hw = platform_get_drvdata(pdev); 
     260+       struct ath5k_hw *ah; 
     261+       u32 reg; 
     262+ 
     263+       if (!hw) 
     264+               return 0; 
     265+ 
     266+       ah = hw->priv; 
     267+ 
     268+       if (bcfg->devid >= AR5K_SREV_AR2315_R6) { 
     269+               /* Disable WMAC AHB arbitration */ 
     270+               reg = ioread32((void __iomem *) AR5K_AR2315_AHB_ARB_CTL); 
     271+               reg &= ~AR5K_AR2315_AHB_ARB_CTL_WLAN; 
     272+               iowrite32(reg, (void __iomem *) AR5K_AR2315_AHB_ARB_CTL); 
     273+       } else { 
     274+               /*Stop DMA access */ 
     275+               reg = ioread32((void __iomem *) AR5K_AR5312_ENABLE); 
     276+               if (to_platform_device(ah->dev)->id == 0) 
     277+                       reg &= ~AR5K_AR5312_ENABLE_WLAN0; 
     278+               else 
     279+                       reg &= ~AR5K_AR5312_ENABLE_WLAN1; 
     280+               iowrite32(reg, (void __iomem *) AR5K_AR5312_ENABLE); 
     281+       } 
     282+ 
     283+       ath5k_deinit_ah(ah); 
     284+       iounmap(ah->iobase); 
     285+       ieee80211_free_hw(hw); 
     286+ 
     287+       return 0; 
     288+} 
     289+ 
     290+static struct platform_driver ath_ahb_driver = { 
     291+       .probe      = ath_ahb_probe, 
     292+       .remove     = ath_ahb_remove, 
     293+       .driver         = { 
     294+               .name   = "ar231x-wmac", 
     295+               .owner  = THIS_MODULE, 
     296+       }, 
     297+}; 
     298+ 
     299+module_platform_driver(ath_ahb_driver); 
     300--- a/drivers/net/wireless/ath/ath5k/ath5k.h 
     301+++ b/drivers/net/wireless/ath/ath5k/ath5k.h 
     302@@ -1647,6 +1647,32 @@ static inline struct ath_regulatory *ath 
     303        return &(ath5k_hw_common(ah)->regulatory); 
     304 } 
     305  
     306+#ifdef CONFIG_ATHEROS_AR231X 
     307+#define AR5K_AR2315_PCI_BASE   ((void __iomem *)0xb0100000) 
     308+ 
     309+static inline void __iomem *ath5k_ahb_reg(struct ath5k_hw *ah, u16 reg) 
     310+{ 
     311+       /* On AR2315 and AR2317 the PCI clock domain registers 
     312+        * are outside of the WMAC register space */ 
     313+       if (unlikely((reg >= 0x4000) && (reg < 0x5000) && 
     314+           (ah->ah_mac_srev >= AR5K_SREV_AR2315_R6))) 
     315+               return AR5K_AR2315_PCI_BASE + reg; 
     316+ 
     317+       return ah->iobase + reg; 
     318+} 
     319+ 
     320+static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg) 
     321+{ 
     322+       return ioread32(ath5k_ahb_reg(ah, reg)); 
     323+} 
     324+ 
     325+static inline void ath5k_hw_reg_write(struct ath5k_hw *ah, u32 val, u16 reg) 
     326+{ 
     327+       iowrite32(val, ath5k_ahb_reg(ah, reg)); 
     328+} 
     329+ 
     330+#else 
     331+ 
     332 static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg) 
    589333 { 
    590         struct ath_hw *ah = sc->sc_ah; 
    591         struct ath_common *common = ath9k_hw_common(ah); 
    592 @@ -59,18 +60,19 @@ static void ath_rx_buf_link(struct ath_s 
    593                              common->rx_bufsize, 
    594                              0); 
    595   
    596 -       if (sc->rx.rxlink == NULL) 
    597 -               ath9k_hw_putrxbuf(ah, bf->bf_daddr); 
    598 -       else 
    599 +       if (sc->rx.rxlink) 
    600                 *sc->rx.rxlink = bf->bf_daddr; 
    601 +       else if (!flush) 
    602 +               ath9k_hw_putrxbuf(ah, bf->bf_daddr); 
    603   
    604         sc->rx.rxlink = &ds->ds_link; 
     334        return ioread32(ah->iobase + reg); 
     335@@ -1657,6 +1683,8 @@ static inline void ath5k_hw_reg_write(st 
     336        iowrite32(val, ah->iobase + reg); 
    605337 } 
    606338  
    607 -static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_rxbuf *bf) 
    608 +static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_rxbuf *bf, 
    609 +                             bool flush) 
     339+#endif 
     340+ 
     341 static inline enum ath_bus_type ath5k_get_bus_type(struct ath5k_hw *ah) 
    610342 { 
    611         if (sc->rx.buf_hold) 
    612 -               ath_rx_buf_link(sc, sc->rx.buf_hold); 
    613 +               ath_rx_buf_link(sc, sc->rx.buf_hold, flush); 
    614   
    615         sc->rx.buf_hold = bf; 
    616  } 
    617 @@ -442,7 +444,7 @@ int ath_startrecv(struct ath_softc *sc) 
    618         sc->rx.buf_hold = NULL; 
    619         sc->rx.rxlink = NULL; 
    620         list_for_each_entry_safe(bf, tbf, &sc->rx.rxbuf, list) { 
    621 -               ath_rx_buf_link(sc, bf); 
    622 +               ath_rx_buf_link(sc, bf, false); 
    623         } 
    624   
    625         /* We could have deleted elements so the list may be empty now */ 
    626 @@ -1118,12 +1120,12 @@ requeue_drop_frag: 
    627  requeue: 
    628                 list_add_tail(&bf->list, &sc->rx.rxbuf); 
    629   
    630 -               if (edma) { 
    631 -                       ath_rx_edma_buf_link(sc, qtype); 
    632 -               } else { 
    633 -                       ath_rx_buf_relink(sc, bf); 
    634 +               if (!edma) { 
    635 +                       ath_rx_buf_relink(sc, bf, flush); 
    636                         if (!flush) 
    637                                 ath9k_hw_rxena(ah); 
    638 +               } else if (!flush) { 
    639 +                       ath_rx_edma_buf_link(sc, qtype); 
    640                 } 
    641   
    642                 if (!budget--) 
    643 --- a/net/mac80211/sta_info.c 
    644 +++ b/net/mac80211/sta_info.c 
    645 @@ -100,7 +100,8 @@ static void __cleanup_single_sta(struct  
    646         struct ps_data *ps; 
    647   
    648         if (test_sta_flag(sta, WLAN_STA_PS_STA) || 
    649 -           test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { 
    650 +           test_sta_flag(sta, WLAN_STA_PS_DRIVER) || 
    651 +           test_sta_flag(sta, WLAN_STA_PS_DELIVER)) { 
    652                 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || 
    653                     sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 
    654                         ps = &sdata->bss->ps; 
    655 @@ -111,6 +112,7 @@ static void __cleanup_single_sta(struct  
    656   
    657                 clear_sta_flag(sta, WLAN_STA_PS_STA); 
    658                 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    659 +               clear_sta_flag(sta, WLAN_STA_PS_DELIVER); 
    660   
    661                 atomic_dec(&ps->num_sta_ps); 
    662                 sta_info_recalc_tim(sta); 
    663 @@ -125,7 +127,7 @@ static void __cleanup_single_sta(struct  
    664         if (ieee80211_vif_is_mesh(&sdata->vif)) 
    665                 mesh_sta_cleanup(sta); 
    666   
    667 -       cancel_work_sync(&sta->drv_unblock_wk); 
    668 +       cancel_work_sync(&sta->drv_deliver_wk); 
    669   
    670         /* 
    671          * Destroy aggregation state here. It would be nice to wait for the 
    672 @@ -227,6 +229,7 @@ struct sta_info *sta_info_get_by_idx(str 
    673   */ 
    674  void sta_info_free(struct ieee80211_local *local, struct sta_info *sta) 
     343        return ath5k_hw_common(ah)->bus_ops->ath_bus_type; 
     344--- a/drivers/net/wireless/ath/ath5k/base.c 
     345+++ b/drivers/net/wireless/ath/ath5k/base.c 
     346@@ -99,6 +99,15 @@ static int ath5k_reset(struct ath5k_hw * 
     347  
     348 /* Known SREVs */ 
     349 static const struct ath5k_srev_name srev_names[] = { 
     350+#ifdef CONFIG_ATHEROS_AR231X 
     351+       { "5312",       AR5K_VERSION_MAC,       AR5K_SREV_AR5312_R2 }, 
     352+       { "5312",       AR5K_VERSION_MAC,       AR5K_SREV_AR5312_R7 }, 
     353+       { "2313",       AR5K_VERSION_MAC,       AR5K_SREV_AR2313_R8 }, 
     354+       { "2315",       AR5K_VERSION_MAC,       AR5K_SREV_AR2315_R6 }, 
     355+       { "2315",       AR5K_VERSION_MAC,       AR5K_SREV_AR2315_R7 }, 
     356+       { "2317",       AR5K_VERSION_MAC,       AR5K_SREV_AR2317_R1 }, 
     357+       { "2317",       AR5K_VERSION_MAC,       AR5K_SREV_AR2317_R2 }, 
     358+#else 
     359        { "5210",       AR5K_VERSION_MAC,       AR5K_SREV_AR5210 }, 
     360        { "5311",       AR5K_VERSION_MAC,       AR5K_SREV_AR5311 }, 
     361        { "5311A",      AR5K_VERSION_MAC,       AR5K_SREV_AR5311A }, 
     362@@ -117,6 +126,7 @@ static const struct ath5k_srev_name srev 
     363        { "5418",       AR5K_VERSION_MAC,       AR5K_SREV_AR5418 }, 
     364        { "2425",       AR5K_VERSION_MAC,       AR5K_SREV_AR2425 }, 
     365        { "2417",       AR5K_VERSION_MAC,       AR5K_SREV_AR2417 }, 
     366+#endif 
     367        { "xxxxx",      AR5K_VERSION_MAC,       AR5K_SREV_UNKNOWN }, 
     368        { "5110",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5110 }, 
     369        { "5111",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5111 }, 
     370@@ -132,6 +142,10 @@ static const struct ath5k_srev_name srev 
     371        { "5413",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5413 }, 
     372        { "5424",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5424 }, 
     373        { "5133",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_5133 }, 
     374+#ifdef CONFIG_ATHEROS_AR231X 
     375+       { "2316",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_2316 }, 
     376+       { "2317",       AR5K_VERSION_RAD,       AR5K_SREV_RAD_2317 }, 
     377+#endif 
     378        { "xxxxx",      AR5K_VERSION_RAD,       AR5K_SREV_UNKNOWN }, 
     379 }; 
     380  
     381--- a/drivers/net/wireless/ath/ath5k/led.c 
     382+++ b/drivers/net/wireless/ath/ath5k/led.c 
     383@@ -163,14 +163,20 @@ int ath5k_init_leds(struct ath5k_hw *ah) 
    675384 { 
    676 +       struct ieee80211_sta_rates *rates; 
    677         int i; 
    678   
    679         if (sta->rate_ctrl) 
    680 @@ -238,6 +241,10 @@ void sta_info_free(struct ieee80211_loca 
    681                 kfree(sta->tx_lat); 
    682         } 
    683   
    684 +       rates = rcu_dereference_protected(sta->sta.rates, true); 
    685 +       if (rates) 
    686 +               kfree(rates); 
    687 + 
    688         sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr); 
    689   
    690         kfree(sta); 
    691 @@ -252,33 +259,23 @@ static void sta_info_hash_add(struct iee 
    692         rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)], sta); 
    693  } 
    694   
    695 -static void sta_unblock(struct work_struct *wk) 
    696 +static void sta_deliver_ps_frames(struct work_struct *wk) 
    697  { 
    698         struct sta_info *sta; 
    699   
    700 -       sta = container_of(wk, struct sta_info, drv_unblock_wk); 
    701 +       sta = container_of(wk, struct sta_info, drv_deliver_wk); 
    702   
    703         if (sta->dead) 
    704                 return; 
    705   
    706 -       if (!test_sta_flag(sta, WLAN_STA_PS_STA)) { 
    707 -               local_bh_disable(); 
    708 +       local_bh_disable(); 
    709 +       if (!test_sta_flag(sta, WLAN_STA_PS_STA)) 
    710                 ieee80211_sta_ps_deliver_wakeup(sta); 
    711 -               local_bh_enable(); 
    712 -       } else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL)) { 
    713 -               clear_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    714 - 
    715 -               local_bh_disable(); 
    716 +       else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL)) 
    717                 ieee80211_sta_ps_deliver_poll_response(sta); 
    718 -               local_bh_enable(); 
    719 -       } else if (test_and_clear_sta_flag(sta, WLAN_STA_UAPSD)) { 
    720 -               clear_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    721 - 
    722 -               local_bh_disable(); 
    723 +       else if (test_and_clear_sta_flag(sta, WLAN_STA_UAPSD)) 
    724                 ieee80211_sta_ps_deliver_uapsd(sta); 
    725 -               local_bh_enable(); 
    726 -       } else 
    727 -               clear_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    728 +       local_bh_enable(); 
    729  } 
    730   
    731  static int sta_prepare_rate_control(struct ieee80211_local *local, 
    732 @@ -340,7 +337,7 @@ struct sta_info *sta_info_alloc(struct i 
    733   
    734         spin_lock_init(&sta->lock); 
    735         spin_lock_init(&sta->ps_lock); 
    736 -       INIT_WORK(&sta->drv_unblock_wk, sta_unblock); 
    737 +       INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames); 
    738         INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); 
    739         mutex_init(&sta->ampdu_mlme.mtx); 
    740  #ifdef CPTCFG_MAC80211_MESH 
    741 @@ -1101,8 +1098,11 @@ void ieee80211_sta_ps_deliver_wakeup(str 
    742         unsigned long flags; 
    743         struct ps_data *ps; 
    744   
    745 -       if (sdata->vif.type == NL80211_IFTYPE_AP || 
    746 -           sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 
    747 +       if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 
    748 +               sdata = container_of(sdata->bss, struct ieee80211_sub_if_data, 
    749 +                                    u.ap); 
    750 + 
    751 +       if (sdata->vif.type == NL80211_IFTYPE_AP) 
    752                 ps = &sdata->bss->ps; 
    753         else if (ieee80211_vif_is_mesh(&sdata->vif)) 
    754                 ps = &sdata->u.mesh.ps; 
    755 @@ -1140,8 +1140,15 @@ void ieee80211_sta_ps_deliver_wakeup(str 
    756         } 
    757   
    758         ieee80211_add_pending_skbs(local, &pending); 
    759 -       clear_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    760 -       clear_sta_flag(sta, WLAN_STA_PS_STA); 
    761 + 
    762 +       /* now we're no longer in the deliver code */ 
    763 +       clear_sta_flag(sta, WLAN_STA_PS_DELIVER); 
    764 + 
    765 +       /* The station might have polled and then woken up before we responded, 
    766 +        * so clear these flags now to avoid them sticking around. 
    767 +        */ 
    768 +       clear_sta_flag(sta, WLAN_STA_PSPOLL); 
    769 +       clear_sta_flag(sta, WLAN_STA_UAPSD); 
    770         spin_unlock(&sta->ps_lock); 
    771   
    772         atomic_dec(&ps->num_sta_ps); 
    773 @@ -1542,10 +1549,26 @@ void ieee80211_sta_block_awake(struct ie 
    774   
    775         trace_api_sta_block_awake(sta->local, pubsta, block); 
    776   
    777 -       if (block) 
    778 +       if (block) { 
    779                 set_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    780 -       else if (test_sta_flag(sta, WLAN_STA_PS_DRIVER)) 
    781 -               ieee80211_queue_work(hw, &sta->drv_unblock_wk); 
    782 +               return; 
    783 +       } 
    784 + 
    785 +       if (!test_sta_flag(sta, WLAN_STA_PS_DRIVER)) 
    786 +               return; 
    787 + 
    788 +       if (!test_sta_flag(sta, WLAN_STA_PS_STA)) { 
    789 +               set_sta_flag(sta, WLAN_STA_PS_DELIVER); 
    790 +               clear_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    791 +               ieee80211_queue_work(hw, &sta->drv_deliver_wk); 
    792 +       } else if (test_sta_flag(sta, WLAN_STA_PSPOLL) || 
    793 +                  test_sta_flag(sta, WLAN_STA_UAPSD)) { 
    794 +               /* must be asleep in this case */ 
    795 +               clear_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    796 +               ieee80211_queue_work(hw, &sta->drv_deliver_wk); 
    797 +       } else { 
    798 +               clear_sta_flag(sta, WLAN_STA_PS_DRIVER); 
    799 +       } 
    800  } 
    801  EXPORT_SYMBOL(ieee80211_sta_block_awake); 
    802   
    803 @@ -1703,3 +1726,140 @@ u8 sta_info_tx_streams(struct sta_info * 
    804         return ((ht_cap->mcs.tx_params & IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK) 
    805                         >> IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT) + 1; 
    806  } 
    807 + 
    808 +void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) 
    809 +{ 
    810 +       struct ieee80211_sub_if_data *sdata = sta->sdata; 
    811 +       struct ieee80211_local *local = sdata->local; 
    812 +       struct rate_control_ref *ref = NULL; 
    813 +       struct timespec uptime; 
    814 +       u64 packets = 0; 
    815 +       u32 thr = 0; 
    816 +       int i, ac; 
    817 + 
    818 +       if (test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) 
    819 +               ref = local->rate_ctrl; 
    820 + 
    821 +       sinfo->generation = sdata->local->sta_generation; 
    822 + 
    823 +       sinfo->filled = STATION_INFO_INACTIVE_TIME | 
    824 +                       STATION_INFO_RX_BYTES64 | 
    825 +                       STATION_INFO_TX_BYTES64 | 
    826 +                       STATION_INFO_RX_PACKETS | 
    827 +                       STATION_INFO_TX_PACKETS | 
    828 +                       STATION_INFO_TX_RETRIES | 
    829 +                       STATION_INFO_TX_FAILED | 
    830 +                       STATION_INFO_TX_BITRATE | 
    831 +                       STATION_INFO_RX_BITRATE | 
    832 +                       STATION_INFO_RX_DROP_MISC | 
    833 +                       STATION_INFO_BSS_PARAM | 
    834 +                       STATION_INFO_CONNECTED_TIME | 
    835 +                       STATION_INFO_STA_FLAGS | 
    836 +                       STATION_INFO_BEACON_LOSS_COUNT; 
    837 + 
    838 +       do_posix_clock_monotonic_gettime(&uptime); 
    839 +       sinfo->connected_time = uptime.tv_sec - sta->last_connected; 
    840 + 
    841 +       sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx); 
    842 +       sinfo->tx_bytes = 0; 
    843 +       for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 
    844 +               sinfo->tx_bytes += sta->tx_bytes[ac]; 
    845 +               packets += sta->tx_packets[ac]; 
    846 +       } 
    847 +       sinfo->tx_packets = packets; 
    848 +       sinfo->rx_bytes = sta->rx_bytes; 
    849 +       sinfo->rx_packets = sta->rx_packets; 
    850 +       sinfo->tx_retries = sta->tx_retry_count; 
    851 +       sinfo->tx_failed = sta->tx_retry_failed; 
    852 +       sinfo->rx_dropped_misc = sta->rx_dropped; 
    853 +       sinfo->beacon_loss_count = sta->beacon_loss_count; 
    854 + 
    855 +       if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) || 
    856 +           (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) { 
    857 +               sinfo->filled |= STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG; 
    858 +               if (!local->ops->get_rssi || 
    859 +                   drv_get_rssi(local, sdata, &sta->sta, &sinfo->signal)) 
    860 +                       sinfo->signal = (s8)sta->last_signal; 
    861 +               sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal); 
    862 +       } 
    863 +       if (sta->chains) { 
    864 +               sinfo->filled |= STATION_INFO_CHAIN_SIGNAL | 
    865 +                                STATION_INFO_CHAIN_SIGNAL_AVG; 
    866 + 
    867 +               sinfo->chains = sta->chains; 
    868 +               for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { 
    869 +                       sinfo->chain_signal[i] = sta->chain_signal_last[i]; 
    870 +                       sinfo->chain_signal_avg[i] = 
    871 +                               (s8) -ewma_read(&sta->chain_signal_avg[i]); 
    872 +               } 
    873 +       } 
    874 + 
    875 +       sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate); 
    876 +       sta_set_rate_info_rx(sta, &sinfo->rxrate); 
    877 + 
    878 +       if (ieee80211_vif_is_mesh(&sdata->vif)) { 
    879 +#ifdef CPTCFG_MAC80211_MESH 
    880 +               sinfo->filled |= STATION_INFO_LLID | 
    881 +                                STATION_INFO_PLID | 
    882 +                                STATION_INFO_PLINK_STATE | 
    883 +                                STATION_INFO_LOCAL_PM | 
    884 +                                STATION_INFO_PEER_PM | 
    885 +                                STATION_INFO_NONPEER_PM; 
    886 + 
    887 +               sinfo->llid = sta->llid; 
    888 +               sinfo->plid = sta->plid; 
    889 +               sinfo->plink_state = sta->plink_state; 
    890 +               if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) { 
    891 +                       sinfo->filled |= STATION_INFO_T_OFFSET; 
    892 +                       sinfo->t_offset = sta->t_offset; 
    893 +               } 
    894 +               sinfo->local_pm = sta->local_pm; 
    895 +               sinfo->peer_pm = sta->peer_pm; 
    896 +               sinfo->nonpeer_pm = sta->nonpeer_pm; 
     385        int ret = 0; 
     386        struct ieee80211_hw *hw = ah->hw; 
     387+#ifndef CONFIG_ATHEROS_AR231X 
     388        struct pci_dev *pdev = ah->pdev; 
    897389+#endif 
    898 +       } 
    899 + 
    900 +       sinfo->bss_param.flags = 0; 
    901 +       if (sdata->vif.bss_conf.use_cts_prot) 
    902 +               sinfo->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT; 
    903 +       if (sdata->vif.bss_conf.use_short_preamble) 
    904 +               sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE; 
    905 +       if (sdata->vif.bss_conf.use_short_slot) 
    906 +               sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME; 
    907 +       sinfo->bss_param.dtim_period = sdata->local->hw.conf.ps_dtim_period; 
    908 +       sinfo->bss_param.beacon_interval = sdata->vif.bss_conf.beacon_int; 
    909 + 
    910 +       sinfo->sta_flags.set = 0; 
    911 +       sinfo->sta_flags.mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 
    912 +                               BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 
    913 +                               BIT(NL80211_STA_FLAG_WME) | 
    914 +                               BIT(NL80211_STA_FLAG_MFP) | 
    915 +                               BIT(NL80211_STA_FLAG_AUTHENTICATED) | 
    916 +                               BIT(NL80211_STA_FLAG_ASSOCIATED) | 
    917 +                               BIT(NL80211_STA_FLAG_TDLS_PEER); 
    918 +       if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) 
    919 +               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHORIZED); 
    920 +       if (test_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE)) 
    921 +               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_SHORT_PREAMBLE); 
    922 +       if (test_sta_flag(sta, WLAN_STA_WME)) 
    923 +               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_WME); 
    924 +       if (test_sta_flag(sta, WLAN_STA_MFP)) 
    925 +               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_MFP); 
    926 +       if (test_sta_flag(sta, WLAN_STA_AUTH)) 
    927 +               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHENTICATED); 
    928 +       if (test_sta_flag(sta, WLAN_STA_ASSOC)) 
    929 +               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_ASSOCIATED); 
    930 +       if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) 
    931 +               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER); 
    932 + 
    933 +       /* check if the driver has a SW RC implementation */ 
    934 +       if (ref && ref->ops->get_expected_throughput) 
    935 +               thr = ref->ops->get_expected_throughput(sta->rate_ctrl_priv); 
    936 +       else 
    937 +               thr = drv_get_expected_throughput(local, &sta->sta); 
    938 + 
    939 +       if (thr != 0) { 
    940 +               sinfo->filled |= STATION_INFO_EXPECTED_THROUGHPUT; 
    941 +               sinfo->expected_throughput = thr; 
    942 +       } 
    943 +} 
    944 --- a/net/mac80211/status.c 
    945 +++ b/net/mac80211/status.c 
    946 @@ -541,6 +541,23 @@ static void ieee80211_tx_latency_end_msr 
    947   */ 
    948  #define STA_LOST_PKT_THRESHOLD 50 
    949   
    950 +static void ieee80211_lost_packet(struct sta_info *sta, struct sk_buff *skb) 
    951 +{ 
    952 +       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    953 + 
    954 +       /* This packet was aggregated but doesn't carry status info */ 
    955 +       if ((info->flags & IEEE80211_TX_CTL_AMPDU) && 
    956 +           !(info->flags & IEEE80211_TX_STAT_AMPDU)) 
    957 +               return; 
    958 + 
    959 +       if (++sta->lost_packets < STA_LOST_PKT_THRESHOLD) 
    960 +               return; 
    961 + 
    962 +       cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr, 
    963 +                                   sta->lost_packets, GFP_ATOMIC); 
    964 +       sta->lost_packets = 0; 
    965 +} 
    966 + 
    967  void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) 
    968  { 
    969         struct sk_buff *skb2; 
    970 @@ -680,12 +697,8 @@ void ieee80211_tx_status(struct ieee8021 
    971                         if (info->flags & IEEE80211_TX_STAT_ACK) { 
    972                                 if (sta->lost_packets) 
    973                                         sta->lost_packets = 0; 
    974 -                       } else if (++sta->lost_packets >= STA_LOST_PKT_THRESHOLD) { 
    975 -                               cfg80211_cqm_pktloss_notify(sta->sdata->dev, 
    976 -                                                           sta->sta.addr, 
    977 -                                                           sta->lost_packets, 
    978 -                                                           GFP_ATOMIC); 
    979 -                               sta->lost_packets = 0; 
    980 +                       } else { 
    981 +                               ieee80211_lost_packet(sta, skb); 
    982                         } 
    983                 } 
    984   
    985 --- a/net/mac80211/rx.c 
    986 +++ b/net/mac80211/rx.c 
    987 @@ -1107,6 +1107,8 @@ static void sta_ps_end(struct sta_info * 
    988                 return; 
    989         } 
    990   
    991 +       set_sta_flag(sta, WLAN_STA_PS_DELIVER); 
    992 +       clear_sta_flag(sta, WLAN_STA_PS_STA); 
    993         ieee80211_sta_ps_deliver_wakeup(sta); 
    994  } 
    995   
    996 --- a/net/mac80211/sta_info.h 
    997 +++ b/net/mac80211/sta_info.h 
    998 @@ -82,6 +82,7 @@ enum ieee80211_sta_info_flags { 
    999         WLAN_STA_TOFFSET_KNOWN, 
    1000         WLAN_STA_MPSP_OWNER, 
    1001         WLAN_STA_MPSP_RECIPIENT, 
    1002 +       WLAN_STA_PS_DELIVER, 
    1003  }; 
    1004   
    1005  #define ADDBA_RESP_INTERVAL HZ 
    1006 @@ -265,7 +266,7 @@ struct ieee80211_tx_latency_stat { 
    1007   * @last_rx_rate_vht_nss: rx status nss of last data packet 
    1008   * @lock: used for locking all fields that require locking, see comments 
    1009   *     in the header file. 
    1010 - * @drv_unblock_wk: used for driver PS unblocking 
    1011 + * @drv_deliver_wk: used for delivering frames after driver PS unblocking 
    1012   * @listen_interval: listen interval of this station, when we're acting as AP 
    1013   * @_flags: STA flags, see &enum ieee80211_sta_info_flags, do not use directly 
    1014   * @ps_lock: used for powersave (when mac80211 is the AP) related locking 
    1015 @@ -278,7 +279,6 @@ struct ieee80211_tx_latency_stat { 
    1016   * @driver_buffered_tids: bitmap of TIDs the driver has data buffered on 
    1017   * @rx_packets: Number of MSDUs received from this STA 
    1018   * @rx_bytes: Number of bytes received from this STA 
    1019 - * @wep_weak_iv_count: number of weak WEP IVs received from this station 
    1020   * @last_rx: time (in jiffies) when last frame was received from this STA 
    1021   * @last_connected: time (in seconds) when a station got connected 
    1022   * @num_duplicates: number of duplicate frames received from this STA 
    1023 @@ -345,7 +345,7 @@ struct sta_info { 
    1024         void *rate_ctrl_priv; 
    1025         spinlock_t lock; 
    1026   
    1027 -       struct work_struct drv_unblock_wk; 
    1028 +       struct work_struct drv_deliver_wk; 
    1029   
    1030         u16 listen_interval; 
    1031   
    1032 @@ -367,7 +367,6 @@ struct sta_info { 
    1033         /* Updated from RX path only, no locking requirements */ 
    1034         unsigned long rx_packets; 
    1035         u64 rx_bytes; 
    1036 -       unsigned long wep_weak_iv_count; 
    1037         unsigned long last_rx; 
    1038         long last_connected; 
    1039         unsigned long num_duplicates; 
    1040 @@ -628,6 +627,8 @@ void sta_set_rate_info_tx(struct sta_inf 
    1041                           struct rate_info *rinfo); 
    1042  void sta_set_rate_info_rx(struct sta_info *sta, 
    1043                           struct rate_info *rinfo); 
    1044 +void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo); 
    1045 + 
    1046  void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata, 
    1047                           unsigned long exp_time); 
    1048  u8 sta_info_tx_streams(struct sta_info *sta); 
    1049 --- a/net/mac80211/tx.c 
    1050 +++ b/net/mac80211/tx.c 
    1051 @@ -469,7 +469,8 @@ ieee80211_tx_h_unicast_ps_buf(struct iee 
    1052                 return TX_CONTINUE; 
    1053   
    1054         if (unlikely((test_sta_flag(sta, WLAN_STA_PS_STA) || 
    1055 -                     test_sta_flag(sta, WLAN_STA_PS_DRIVER)) && 
    1056 +                     test_sta_flag(sta, WLAN_STA_PS_DRIVER) || 
    1057 +                     test_sta_flag(sta, WLAN_STA_PS_DELIVER)) && 
    1058                      !(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) { 
    1059                 int ac = skb_get_queue_mapping(tx->skb); 
    1060   
    1061 @@ -486,7 +487,8 @@ ieee80211_tx_h_unicast_ps_buf(struct iee 
    1062                  * ahead and Tx the packet. 
    1063                  */ 
    1064                 if (!test_sta_flag(sta, WLAN_STA_PS_STA) && 
    1065 -                   !test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { 
    1066 +                   !test_sta_flag(sta, WLAN_STA_PS_DRIVER) && 
    1067 +                   !test_sta_flag(sta, WLAN_STA_PS_DELIVER)) { 
    1068                         spin_unlock(&sta->ps_lock); 
    1069                         return TX_CONTINUE; 
    1070                 } 
    1071 @@ -1618,12 +1620,12 @@ netdev_tx_t ieee80211_monitor_start_xmit 
    1072  { 
    1073         struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 
    1074         struct ieee80211_chanctx_conf *chanctx_conf; 
    1075 -       struct ieee80211_channel *chan; 
    1076         struct ieee80211_radiotap_header *prthdr = 
    1077                 (struct ieee80211_radiotap_header *)skb->data; 
    1078         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    1079         struct ieee80211_hdr *hdr; 
    1080         struct ieee80211_sub_if_data *tmp_sdata, *sdata; 
    1081 +       struct cfg80211_chan_def *chandef; 
    1082         u16 len_rthdr; 
    1083         int hdrlen; 
    1084   
    1085 @@ -1721,9 +1723,9 @@ netdev_tx_t ieee80211_monitor_start_xmit 
    1086         } 
    1087   
    1088         if (chanctx_conf) 
    1089 -               chan = chanctx_conf->def.chan; 
    1090 +               chandef = &chanctx_conf->def; 
    1091         else if (!local->use_chanctx) 
    1092 -               chan = local->_oper_chandef.chan; 
    1093 +               chandef = &local->_oper_chandef; 
    1094         else 
    1095                 goto fail_rcu; 
    1096   
    1097 @@ -1743,10 +1745,11 @@ netdev_tx_t ieee80211_monitor_start_xmit 
    1098          * radar detection by itself. We can do that later by adding a 
    1099          * monitor flag interfaces used for AP support. 
    1100          */ 
    1101 -       if ((chan->flags & (IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_RADAR))) 
    1102 +       if (!cfg80211_reg_can_beacon(local->hw.wiphy, chandef, 
    1103 +                                    sdata->vif.type)) 
    1104                 goto fail_rcu; 
    1105   
    1106 -       ieee80211_xmit(sdata, skb, chan->band); 
    1107 +       ieee80211_xmit(sdata, skb, chandef->chan->band); 
    1108         rcu_read_unlock(); 
    1109   
    1110         return NETDEV_TX_OK; 
    1111 @@ -2425,7 +2428,7 @@ static void ieee80211_set_csa(struct iee 
    1112         u8 *beacon_data; 
    1113         size_t beacon_data_len; 
    1114         int i; 
    1115 -       u8 count = sdata->csa_current_counter; 
    1116 +       u8 count = beacon->csa_current_counter; 
    1117   
    1118         switch (sdata->vif.type) { 
    1119         case NL80211_IFTYPE_AP: 
    1120 @@ -2444,46 +2447,54 @@ static void ieee80211_set_csa(struct iee 
    1121                 return; 
    1122         } 
    1123   
    1124 +       rcu_read_lock(); 
    1125         for (i = 0; i < IEEE80211_MAX_CSA_COUNTERS_NUM; ++i) { 
    1126 -               u16 counter_offset_beacon = 
    1127 -                       sdata->csa_counter_offset_beacon[i]; 
    1128 -               u16 counter_offset_presp = sdata->csa_counter_offset_presp[i]; 
    1129 - 
    1130 -               if (counter_offset_beacon) { 
    1131 -                       if (WARN_ON(counter_offset_beacon >= beacon_data_len)) 
    1132 -                               return; 
    1133 - 
    1134 -                       beacon_data[counter_offset_beacon] = count; 
    1135 -               } 
    1136 - 
    1137 -               if (sdata->vif.type == NL80211_IFTYPE_AP && 
    1138 -                   counter_offset_presp) { 
    1139 -                       rcu_read_lock(); 
    1140 -                       resp = rcu_dereference(sdata->u.ap.probe_resp); 
    1141 +               resp = rcu_dereference(sdata->u.ap.probe_resp); 
    1142   
    1143 -                       /* If nl80211 accepted the offset, this should 
    1144 -                        * not happen. 
    1145 -                        */ 
    1146 -                       if (WARN_ON(!resp)) { 
    1147 +               if (beacon->csa_counter_offsets[i]) { 
    1148 +                       if (WARN_ON_ONCE(beacon->csa_counter_offsets[i] >= 
    1149 +                                        beacon_data_len)) { 
    1150                                 rcu_read_unlock(); 
    1151                                 return; 
    1152                         } 
    1153 -                       resp->data[counter_offset_presp] = count; 
    1154 -                       rcu_read_unlock(); 
    1155 + 
    1156 +                       beacon_data[beacon->csa_counter_offsets[i]] = count; 
    1157                 } 
    1158 + 
    1159 +               if (sdata->vif.type == NL80211_IFTYPE_AP && resp && 
    1160 +                   resp->csa_counter_offsets) 
    1161 +                       resp->data[resp->csa_counter_offsets[i]] = count; 
    1162         } 
    1163 +       rcu_read_unlock(); 
    1164  } 
    1165   
    1166  u8 ieee80211_csa_update_counter(struct ieee80211_vif *vif) 
    1167  { 
    1168         struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); 
    1169 +       struct beacon_data *beacon = NULL; 
    1170 +       u8 count = 0; 
    1171 + 
    1172 +       rcu_read_lock(); 
    1173 + 
    1174 +       if (sdata->vif.type == NL80211_IFTYPE_AP) 
    1175 +               beacon = rcu_dereference(sdata->u.ap.beacon); 
    1176 +       else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
    1177 +               beacon = rcu_dereference(sdata->u.ibss.presp); 
    1178 +       else if (ieee80211_vif_is_mesh(&sdata->vif)) 
    1179 +               beacon = rcu_dereference(sdata->u.mesh.beacon); 
    1180 + 
    1181 +       if (!beacon) 
    1182 +               goto unlock; 
    1183   
    1184 -       sdata->csa_current_counter--; 
    1185 +       beacon->csa_current_counter--; 
    1186   
    1187         /* the counter should never reach 0 */ 
    1188 -       WARN_ON(!sdata->csa_current_counter); 
    1189 +       WARN_ON_ONCE(!beacon->csa_current_counter); 
    1190 +       count = beacon->csa_current_counter; 
    1191   
    1192 -       return sdata->csa_current_counter; 
    1193 +unlock: 
    1194 +       rcu_read_unlock(); 
    1195 +       return count; 
    1196  } 
    1197  EXPORT_SYMBOL(ieee80211_csa_update_counter); 
    1198   
    1199 @@ -2493,7 +2504,6 @@ bool ieee80211_csa_is_complete(struct ie 
    1200         struct beacon_data *beacon = NULL; 
    1201         u8 *beacon_data; 
    1202         size_t beacon_data_len; 
    1203 -       int counter_beacon = sdata->csa_counter_offset_beacon[0]; 
    1204         int ret = false; 
    1205   
    1206         if (!ieee80211_sdata_running(sdata)) 
    1207 @@ -2531,10 +2541,13 @@ bool ieee80211_csa_is_complete(struct ie 
    1208                 goto out; 
    1209         } 
    1210   
    1211 -       if (WARN_ON(counter_beacon > beacon_data_len)) 
    1212 +       if (!beacon->csa_counter_offsets[0]) 
    1213 +               goto out; 
    1214 + 
    1215 +       if (WARN_ON_ONCE(beacon->csa_counter_offsets[0] > beacon_data_len)) 
    1216                 goto out; 
    1217   
    1218 -       if (beacon_data[counter_beacon] == 1) 
    1219 +       if (beacon_data[beacon->csa_counter_offsets[0]] == 1) 
    1220                 ret = true; 
    1221   out: 
    1222         rcu_read_unlock(); 
    1223 @@ -2550,6 +2563,7 @@ __ieee80211_beacon_get(struct ieee80211_ 
    1224                        bool is_template) 
    1225  { 
    1226         struct ieee80211_local *local = hw_to_local(hw); 
    1227 +       struct beacon_data *beacon = NULL; 
    1228         struct sk_buff *skb = NULL; 
    1229         struct ieee80211_tx_info *info; 
    1230         struct ieee80211_sub_if_data *sdata = NULL; 
    1231 @@ -2571,10 +2585,10 @@ __ieee80211_beacon_get(struct ieee80211_ 
    1232   
    1233         if (sdata->vif.type == NL80211_IFTYPE_AP) { 
    1234                 struct ieee80211_if_ap *ap = &sdata->u.ap; 
    1235 -               struct beacon_data *beacon = rcu_dereference(ap->beacon); 
    1236   
    1237 +               beacon = rcu_dereference(ap->beacon); 
    1238                 if (beacon) { 
    1239 -                       if (sdata->vif.csa_active) { 
    1240 +                       if (beacon->csa_counter_offsets[0]) { 
    1241                                 if (!is_template) 
    1242                                         ieee80211_csa_update_counter(vif); 
    1243   
    1244 @@ -2615,37 +2629,37 @@ __ieee80211_beacon_get(struct ieee80211_ 
    1245         } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { 
    1246                 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 
    1247                 struct ieee80211_hdr *hdr; 
    1248 -               struct beacon_data *presp = rcu_dereference(ifibss->presp); 
    1249   
    1250 -               if (!presp) 
    1251 +               beacon = rcu_dereference(ifibss->presp); 
    1252 +               if (!beacon) 
    1253                         goto out; 
    1254   
    1255 -               if (sdata->vif.csa_active) { 
    1256 +               if (beacon->csa_counter_offsets[0]) { 
    1257                         if (!is_template) 
    1258                                 ieee80211_csa_update_counter(vif); 
    1259   
    1260 -                       ieee80211_set_csa(sdata, presp); 
    1261 +                       ieee80211_set_csa(sdata, beacon); 
    1262                 } 
    1263   
    1264 -               skb = dev_alloc_skb(local->tx_headroom + presp->head_len + 
    1265 +               skb = dev_alloc_skb(local->tx_headroom + beacon->head_len + 
    1266                                     local->hw.extra_beacon_tailroom); 
    1267                 if (!skb) 
    1268                         goto out; 
    1269                 skb_reserve(skb, local->tx_headroom); 
    1270 -               memcpy(skb_put(skb, presp->head_len), presp->head, 
    1271 -                      presp->head_len); 
    1272 +               memcpy(skb_put(skb, beacon->head_len), beacon->head, 
    1273 +                      beacon->head_len); 
    1274   
    1275                 hdr = (struct ieee80211_hdr *) skb->data; 
    1276                 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
    1277                                                  IEEE80211_STYPE_BEACON); 
    1278         } else if (ieee80211_vif_is_mesh(&sdata->vif)) { 
    1279                 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 
    1280 -               struct beacon_data *bcn = rcu_dereference(ifmsh->beacon); 
    1281   
    1282 -               if (!bcn) 
    1283 +               beacon = rcu_dereference(ifmsh->beacon); 
    1284 +               if (!beacon) 
    1285                         goto out; 
    1286   
    1287 -               if (sdata->vif.csa_active) { 
    1288 +               if (beacon->csa_counter_offsets[0]) { 
    1289                         if (!is_template) 
    1290                                 /* TODO: For mesh csa_counter is in TU, so 
    1291                                  * decrementing it by one isn't correct, but 
    1292 @@ -2654,40 +2668,42 @@ __ieee80211_beacon_get(struct ieee80211_ 
    1293                                  */ 
    1294                                 ieee80211_csa_update_counter(vif); 
    1295   
    1296 -                       ieee80211_set_csa(sdata, bcn); 
    1297 +                       ieee80211_set_csa(sdata, beacon); 
    1298                 } 
    1299   
    1300                 if (ifmsh->sync_ops) 
    1301 -                       ifmsh->sync_ops->adjust_tbtt(sdata, bcn); 
    1302 +                       ifmsh->sync_ops->adjust_tbtt(sdata, beacon); 
    1303   
    1304                 skb = dev_alloc_skb(local->tx_headroom + 
    1305 -                                   bcn->head_len + 
    1306 +                                   beacon->head_len + 
    1307                                     256 + /* TIM IE */ 
    1308 -                                   bcn->tail_len + 
    1309 +                                   beacon->tail_len + 
    1310                                     local->hw.extra_beacon_tailroom); 
    1311                 if (!skb) 
    1312                         goto out; 
    1313                 skb_reserve(skb, local->tx_headroom); 
    1314 -               memcpy(skb_put(skb, bcn->head_len), bcn->head, bcn->head_len); 
    1315 +               memcpy(skb_put(skb, beacon->head_len), beacon->head, 
    1316 +                      beacon->head_len); 
    1317                 ieee80211_beacon_add_tim(sdata, &ifmsh->ps, skb, is_template); 
    1318   
    1319                 if (offs) { 
    1320 -                       offs->tim_offset = bcn->head_len; 
    1321 -                       offs->tim_length = skb->len - bcn->head_len; 
    1322 +                       offs->tim_offset = beacon->head_len; 
    1323 +                       offs->tim_length = skb->len - beacon->head_len; 
    1324                 } 
    1325   
    1326 -               memcpy(skb_put(skb, bcn->tail_len), bcn->tail, bcn->tail_len); 
    1327 +               memcpy(skb_put(skb, beacon->tail_len), beacon->tail, 
    1328 +                      beacon->tail_len); 
    1329         } else { 
    1330                 WARN_ON(1); 
    1331                 goto out; 
    1332         } 
    1333   
    1334         /* CSA offsets */ 
    1335 -       if (offs) { 
    1336 +       if (offs && beacon) { 
    1337                 int i; 
    1338   
    1339                 for (i = 0; i < IEEE80211_MAX_CSA_COUNTERS_NUM; i++) { 
    1340 -                       u16 csa_off = sdata->csa_counter_offset_beacon[i]; 
    1341 +                       u16 csa_off = beacon->csa_counter_offsets[i]; 
    1342   
    1343                         if (!csa_off) 
    1344                                 continue; 
    1345 --- a/drivers/net/wireless/rt2x00/rt2800lib.c 
    1346 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c 
    1347 @@ -947,6 +947,40 @@ static inline u8 rt2800_get_beacon_offse 
    1348         return BEACON_BASE_TO_OFFSET(rt2800_hw_beacon_base(rt2x00dev, index)); 
    1349  } 
    1350   
    1351 +static void rt2800_update_beacons_setup(struct rt2x00_dev *rt2x00dev) 
    1352 +{ 
    1353 +       struct data_queue *queue = rt2x00dev->bcn; 
    1354 +       struct queue_entry *entry; 
    1355 +       int i, bcn_num = 0; 
    1356 +       u64 off, reg = 0; 
    1357 +       u32 bssid_dw1; 
    1358 + 
    1359 +       /* 
    1360 +        * Setup offsets of all active beacons in BCN_OFFSET{0,1} registers. 
    1361 +        */ 
    1362 +       for (i = 0; i < queue->limit; i++) { 
    1363 +               entry = &queue->entries[i]; 
    1364 +               if (!test_bit(ENTRY_BCN_ENABLED, &entry->flags)) 
    1365 +                       continue; 
    1366 +               off = rt2800_get_beacon_offset(rt2x00dev, entry->entry_idx); 
    1367 +               reg |= off << (8 * bcn_num); 
    1368 +               bcn_num++; 
    1369 +       } 
    1370 + 
    1371 +       WARN_ON_ONCE(bcn_num != rt2x00dev->intf_beaconing); 
    1372 + 
    1373 +       rt2800_register_write(rt2x00dev, BCN_OFFSET0, (u32) reg); 
    1374 +       rt2800_register_write(rt2x00dev, BCN_OFFSET1, (u32) (reg >> 32)); 
    1375 + 
    1376 +       /* 
    1377 +        * H/W sends up to MAC_BSSID_DW1_BSS_BCN_NUM + 1 consecutive beacons. 
    1378 +        */ 
    1379 +       rt2800_register_read(rt2x00dev, MAC_BSSID_DW1, &bssid_dw1); 
    1380 +       rt2x00_set_field32(&bssid_dw1, MAC_BSSID_DW1_BSS_BCN_NUM, 
    1381 +                          bcn_num > 0 ? bcn_num - 1 : 0); 
    1382 +       rt2800_register_write(rt2x00dev, MAC_BSSID_DW1, bssid_dw1); 
    1383 +} 
    1384 + 
    1385  void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc) 
    1386  { 
    1387         struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 
    1388 @@ -1003,6 +1037,12 @@ void rt2800_write_beacon(struct queue_en 
    1389   
    1390         rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data, 
    1391                                    entry->skb->len + padding_len); 
    1392 +       __set_bit(ENTRY_BCN_ENABLED, &entry->flags); 
    1393 + 
    1394 +       /* 
    1395 +        * Change global beacons settings. 
    1396 +        */ 
    1397 +       rt2800_update_beacons_setup(rt2x00dev); 
    1398   
    1399         /* 
    1400          * Restore beaconing state. 
    1401 @@ -1053,8 +1093,13 @@ void rt2800_clear_beacon(struct queue_en 
    1402          * Clear beacon. 
    1403          */ 
    1404         rt2800_clear_beacon_register(rt2x00dev, entry->entry_idx); 
    1405 +       __clear_bit(ENTRY_BCN_ENABLED, &entry->flags); 
    1406   
    1407         /* 
    1408 +        * Change global beacons settings. 
    1409 +        */ 
    1410 +       rt2800_update_beacons_setup(rt2x00dev); 
    1411 +       /* 
    1412          * Restore beaconing state. 
    1413          */ 
    1414         rt2800_register_write(rt2x00dev, BCN_TIME_CFG, orig_reg); 
    1415 @@ -1556,7 +1601,7 @@ void rt2800_config_intf(struct rt2x00_de 
    1416                 if (!is_zero_ether_addr((const u8 *)conf->bssid)) { 
    1417                         reg = le32_to_cpu(conf->bssid[1]); 
    1418                         rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 3); 
    1419 -                       rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_BCN_NUM, 7); 
    1420 +                       rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_BCN_NUM, 0); 
    1421                         conf->bssid[1] = cpu_to_le32(reg); 
    1422                 } 
    1423   
    1424 @@ -4517,28 +4562,6 @@ static int rt2800_init_registers(struct  
    1425         if (ret) 
    1426                 return ret; 
    1427   
    1428 -       rt2800_register_read(rt2x00dev, BCN_OFFSET0, &reg); 
    1429 -       rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0, 
    1430 -                          rt2800_get_beacon_offset(rt2x00dev, 0)); 
    1431 -       rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1, 
    1432 -                          rt2800_get_beacon_offset(rt2x00dev, 1)); 
    1433 -       rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2, 
    1434 -                          rt2800_get_beacon_offset(rt2x00dev, 2)); 
    1435 -       rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3, 
    1436 -                          rt2800_get_beacon_offset(rt2x00dev, 3)); 
    1437 -       rt2800_register_write(rt2x00dev, BCN_OFFSET0, reg); 
    1438 - 
    1439 -       rt2800_register_read(rt2x00dev, BCN_OFFSET1, &reg); 
    1440 -       rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4, 
    1441 -                          rt2800_get_beacon_offset(rt2x00dev, 4)); 
    1442 -       rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5, 
    1443 -                          rt2800_get_beacon_offset(rt2x00dev, 5)); 
    1444 -       rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6, 
    1445 -                          rt2800_get_beacon_offset(rt2x00dev, 6)); 
    1446 -       rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7, 
    1447 -                          rt2800_get_beacon_offset(rt2x00dev, 7)); 
    1448 -       rt2800_register_write(rt2x00dev, BCN_OFFSET1, reg); 
    1449 - 
    1450         rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f); 
    1451         rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003); 
    1452   
    1453 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c 
    1454 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c 
    1455 @@ -141,8 +141,11 @@ static void rt2x00lib_intf_scheduled_ite 
    1456         if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) 
    1457                 return; 
    1458   
    1459 -       if (test_and_clear_bit(DELAYED_UPDATE_BEACON, &intf->delayed_flags)) 
    1460 +       if (test_and_clear_bit(DELAYED_UPDATE_BEACON, &intf->delayed_flags)) { 
    1461 +               mutex_lock(&intf->beacon_skb_mutex); 
    1462                 rt2x00queue_update_beacon(rt2x00dev, vif); 
    1463 +               mutex_unlock(&intf->beacon_skb_mutex); 
    1464 +       } 
    1465  } 
    1466   
    1467  static void rt2x00lib_intf_scheduled(struct work_struct *work) 
    1468 @@ -216,7 +219,7 @@ static void rt2x00lib_beaconupdate_iter( 
    1469          * never be called for USB devices. 
    1470          */ 
    1471         WARN_ON(rt2x00_is_usb(rt2x00dev)); 
    1472 -       rt2x00queue_update_beacon_locked(rt2x00dev, vif); 
    1473 +       rt2x00queue_update_beacon(rt2x00dev, vif); 
    1474  } 
    1475   
    1476  void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev) 
    1477 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c 
    1478 +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c 
    1479 @@ -487,6 +487,8 @@ int rt2x00mac_set_key(struct ieee80211_h 
    1480         crypto.cipher = rt2x00crypto_key_to_cipher(key); 
    1481         if (crypto.cipher == CIPHER_NONE) 
    1482                 return -EOPNOTSUPP; 
    1483 +       if (crypto.cipher == CIPHER_TKIP && rt2x00_is_usb(rt2x00dev)) 
    1484 +               return -EOPNOTSUPP; 
    1485   
    1486         crypto.cmd = cmd; 
    1487   
    1488 @@ -624,25 +626,24 @@ void rt2x00mac_bss_info_changed(struct i 
    1489          * Start/stop beaconing. 
    1490          */ 
    1491         if (changes & BSS_CHANGED_BEACON_ENABLED) { 
    1492 +               mutex_lock(&intf->beacon_skb_mutex); 
    1493                 if (!bss_conf->enable_beacon && intf->enable_beacon) { 
    1494                         rt2x00dev->intf_beaconing--; 
    1495                         intf->enable_beacon = false; 
    1496 -                       /* 
    1497 -                        * Clear beacon in the H/W for this vif. This is needed 
    1498 -                        * to disable beaconing on this particular interface 
    1499 -                        * and keep it running on other interfaces. 
    1500 -                        */ 
    1501 -                       rt2x00queue_clear_beacon(rt2x00dev, vif); 
    1502   
    1503                         if (rt2x00dev->intf_beaconing == 0) { 
    1504                                 /* 
    1505                                  * Last beaconing interface disabled 
    1506                                  * -> stop beacon queue. 
    1507                                  */ 
    1508 -                               mutex_lock(&intf->beacon_skb_mutex); 
    1509                                 rt2x00queue_stop_queue(rt2x00dev->bcn); 
    1510 -                               mutex_unlock(&intf->beacon_skb_mutex); 
    1511                         } 
    1512 +                       /* 
    1513 +                        * Clear beacon in the H/W for this vif. This is needed 
    1514 +                        * to disable beaconing on this particular interface 
    1515 +                        * and keep it running on other interfaces. 
    1516 +                        */ 
    1517 +                       rt2x00queue_clear_beacon(rt2x00dev, vif); 
    1518                 } else if (bss_conf->enable_beacon && !intf->enable_beacon) { 
    1519                         rt2x00dev->intf_beaconing++; 
    1520                         intf->enable_beacon = true; 
    1521 @@ -658,11 +659,10 @@ void rt2x00mac_bss_info_changed(struct i 
    1522                                  * First beaconing interface enabled 
    1523                                  * -> start beacon queue. 
    1524                                  */ 
    1525 -                               mutex_lock(&intf->beacon_skb_mutex); 
    1526                                 rt2x00queue_start_queue(rt2x00dev->bcn); 
    1527 -                               mutex_unlock(&intf->beacon_skb_mutex); 
    1528                         } 
    1529                 } 
    1530 +               mutex_unlock(&intf->beacon_skb_mutex); 
    1531         } 
    1532   
    1533         /* 
    1534 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c 
    1535 +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c 
    1536 @@ -754,8 +754,6 @@ int rt2x00queue_clear_beacon(struct rt2x 
    1537         if (unlikely(!intf->beacon)) 
    1538                 return -ENOBUFS; 
    1539   
    1540 -       mutex_lock(&intf->beacon_skb_mutex); 
    1541 - 
    1542         /* 
    1543          * Clean up the beacon skb. 
    1544          */ 
    1545 @@ -768,13 +766,11 @@ int rt2x00queue_clear_beacon(struct rt2x 
    1546         if (rt2x00dev->ops->lib->clear_beacon) 
    1547                 rt2x00dev->ops->lib->clear_beacon(intf->beacon); 
    1548   
    1549 -       mutex_unlock(&intf->beacon_skb_mutex); 
    1550 - 
    1551         return 0; 
    1552  } 
    1553   
    1554 -int rt2x00queue_update_beacon_locked(struct rt2x00_dev *rt2x00dev, 
    1555 -                                    struct ieee80211_vif *vif) 
    1556 +int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, 
    1557 +                             struct ieee80211_vif *vif) 
    1558  { 
    1559         struct rt2x00_intf *intf = vif_to_intf(vif); 
    1560         struct skb_frame_desc *skbdesc; 
    1561 @@ -815,19 +811,6 @@ int rt2x00queue_update_beacon_locked(str 
    1562   
    1563  } 
    1564   
    1565 -int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, 
    1566 -                             struct ieee80211_vif *vif) 
    1567 -{ 
    1568 -       struct rt2x00_intf *intf = vif_to_intf(vif); 
    1569 -       int ret; 
    1570 - 
    1571 -       mutex_lock(&intf->beacon_skb_mutex); 
    1572 -       ret = rt2x00queue_update_beacon_locked(rt2x00dev, vif); 
    1573 -       mutex_unlock(&intf->beacon_skb_mutex); 
    1574 - 
    1575 -       return ret; 
    1576 -} 
    1577 - 
    1578  bool rt2x00queue_for_each_entry(struct data_queue *queue, 
    1579                                 enum queue_index start, 
    1580                                 enum queue_index end, 
    1581 --- a/drivers/net/wireless/rt2x00/rt2x00queue.h 
    1582 +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h 
    1583 @@ -353,6 +353,7 @@ struct txentry_desc { 
    1584   */ 
    1585  enum queue_entry_flags { 
    1586         ENTRY_BCN_ASSIGNED, 
    1587 +       ENTRY_BCN_ENABLED, 
    1588         ENTRY_OWNER_DEVICE_DATA, 
    1589         ENTRY_DATA_PENDING, 
    1590         ENTRY_DATA_IO_FAILED, 
    1591 --- a/drivers/net/wireless/ath/ath9k/main.c 
    1592 +++ b/drivers/net/wireless/ath/ath9k/main.c 
    1593 @@ -1757,7 +1757,6 @@ out: 
    1594  void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif) 
    1595  { 
    1596         struct ath_vif *avp = (void *)vif->drv_priv; 
    1597 -       unsigned long flags; 
    1598         u32 tsf; 
    1599   
    1600         if (!sc->p2p_ps_timer) 
    1601 @@ -1767,14 +1766,9 @@ void ath9k_update_p2p_ps(struct ath_soft 
    1602                 return; 
    1603   
    1604         sc->p2p_ps_vif = avp; 
    1605 - 
    1606 -       spin_lock_irqsave(&sc->sc_pm_lock, flags); 
    1607 -       if (!(sc->ps_flags & PS_BEACON_SYNC)) { 
    1608 -               tsf = ath9k_hw_gettsf32(sc->sc_ah); 
    1609 -               ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf); 
    1610 -               ath9k_update_p2p_ps_timer(sc, avp); 
    1611 -       } 
    1612 -       spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 
    1613 +       tsf = ath9k_hw_gettsf32(sc->sc_ah); 
    1614 +       ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf); 
    1615 +       ath9k_update_p2p_ps_timer(sc, avp); 
    1616  } 
    1617   
    1618  static void ath9k_bss_info_changed(struct ieee80211_hw *hw, 
    1619 @@ -1791,6 +1785,7 @@ static void ath9k_bss_info_changed(struc 
    1620         struct ath_hw *ah = sc->sc_ah; 
    1621         struct ath_common *common = ath9k_hw_common(ah); 
    1622         struct ath_vif *avp = (void *)vif->drv_priv; 
    1623 +       unsigned long flags; 
    1624         int slottime; 
    1625   
    1626         ath9k_ps_wakeup(sc); 
    1627 @@ -1853,7 +1848,10 @@ static void ath9k_bss_info_changed(struc 
    1628   
    1629         if (changed & BSS_CHANGED_P2P_PS) { 
    1630                 spin_lock_bh(&sc->sc_pcu_lock); 
    1631 -               ath9k_update_p2p_ps(sc, vif); 
    1632 +               spin_lock_irqsave(&sc->sc_pm_lock, flags); 
    1633 +               if (!(sc->ps_flags & PS_BEACON_SYNC)) 
    1634 +                       ath9k_update_p2p_ps(sc, vif); 
    1635 +               spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 
    1636                 spin_unlock_bh(&sc->sc_pcu_lock); 
    1637         } 
    1638   
    1639 @@ -2232,14 +2230,6 @@ static void ath9k_sw_scan_complete(struc 
    1640         clear_bit(ATH_OP_SCANNING, &common->op_flags); 
    1641  } 
    1642   
    1643 -static void ath9k_channel_switch_beacon(struct ieee80211_hw *hw, 
    1644 -                                       struct ieee80211_vif *vif, 
    1645 -                                       struct cfg80211_chan_def *chandef) 
    1646 -{ 
    1647 -       /* depend on vif->csa_active only */ 
    1648 -       return; 
    1649 -} 
    1650 - 
    1651  struct ieee80211_ops ath9k_ops = { 
    1652         .tx                 = ath9k_tx, 
    1653         .start              = ath9k_start, 
    1654 @@ -2287,5 +2277,4 @@ struct ieee80211_ops ath9k_ops = { 
    1655  #endif 
    1656         .sw_scan_start      = ath9k_sw_scan_start, 
    1657         .sw_scan_complete   = ath9k_sw_scan_complete, 
    1658 -       .channel_switch_beacon     = ath9k_channel_switch_beacon, 
    1659  }; 
    1660 --- a/drivers/net/wireless/ath/ath10k/mac.c 
    1661 +++ b/drivers/net/wireless/ath/ath10k/mac.c 
    1662 @@ -4142,14 +4142,6 @@ static int ath10k_set_bitrate_mask(struc 
    1663                                            fixed_nss, force_sgi); 
    1664  } 
    1665   
    1666 -static void ath10k_channel_switch_beacon(struct ieee80211_hw *hw, 
    1667 -                                        struct ieee80211_vif *vif, 
    1668 -                                        struct cfg80211_chan_def *chandef) 
    1669 -{ 
    1670 -       /* there's no need to do anything here. vif->csa_active is enough */ 
    1671 -       return; 
    1672 -} 
    1673 - 
    1674  static void ath10k_sta_rc_update(struct ieee80211_hw *hw, 
    1675                                  struct ieee80211_vif *vif, 
    1676                                  struct ieee80211_sta *sta, 
    1677 @@ -4256,7 +4248,6 @@ static const struct ieee80211_ops ath10k 
    1678         .restart_complete               = ath10k_restart_complete, 
    1679         .get_survey                     = ath10k_get_survey, 
    1680         .set_bitrate_mask               = ath10k_set_bitrate_mask, 
    1681 -       .channel_switch_beacon          = ath10k_channel_switch_beacon, 
    1682         .sta_rc_update                  = ath10k_sta_rc_update, 
    1683         .get_tsf                        = ath10k_get_tsf, 
    1684  #ifdef CONFIG_PM 
    1685 --- a/net/mac80211/cfg.c 
    1686 +++ b/net/mac80211/cfg.c 
    1687 @@ -468,327 +468,6 @@ void sta_set_rate_info_rx(struct sta_inf 
    1688                 rinfo->flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH; 
    1689  } 
    1690   
    1691 -static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) 
    1692 -{ 
    1693 -       struct ieee80211_sub_if_data *sdata = sta->sdata; 
    1694 -       struct ieee80211_local *local = sdata->local; 
    1695 -       struct rate_control_ref *ref = local->rate_ctrl; 
    1696 -       struct timespec uptime; 
    1697 -       u64 packets = 0; 
    1698 -       u32 thr = 0; 
    1699 -       int i, ac; 
    1700 - 
    1701 -       sinfo->generation = sdata->local->sta_generation; 
    1702 - 
    1703 -       sinfo->filled = STATION_INFO_INACTIVE_TIME | 
    1704 -                       STATION_INFO_RX_BYTES64 | 
    1705 -                       STATION_INFO_TX_BYTES64 | 
    1706 -                       STATION_INFO_RX_PACKETS | 
    1707 -                       STATION_INFO_TX_PACKETS | 
    1708 -                       STATION_INFO_TX_RETRIES | 
    1709 -                       STATION_INFO_TX_FAILED | 
    1710 -                       STATION_INFO_TX_BITRATE | 
    1711 -                       STATION_INFO_RX_BITRATE | 
    1712 -                       STATION_INFO_RX_DROP_MISC | 
    1713 -                       STATION_INFO_BSS_PARAM | 
    1714 -                       STATION_INFO_CONNECTED_TIME | 
    1715 -                       STATION_INFO_STA_FLAGS | 
    1716 -                       STATION_INFO_BEACON_LOSS_COUNT; 
    1717 - 
    1718 -       do_posix_clock_monotonic_gettime(&uptime); 
    1719 -       sinfo->connected_time = uptime.tv_sec - sta->last_connected; 
    1720 - 
    1721 -       sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx); 
    1722 -       sinfo->tx_bytes = 0; 
    1723 -       for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 
    1724 -               sinfo->tx_bytes += sta->tx_bytes[ac]; 
    1725 -               packets += sta->tx_packets[ac]; 
    1726 -       } 
    1727 -       sinfo->tx_packets = packets; 
    1728 -       sinfo->rx_bytes = sta->rx_bytes; 
    1729 -       sinfo->rx_packets = sta->rx_packets; 
    1730 -       sinfo->tx_retries = sta->tx_retry_count; 
    1731 -       sinfo->tx_failed = sta->tx_retry_failed; 
    1732 -       sinfo->rx_dropped_misc = sta->rx_dropped; 
    1733 -       sinfo->beacon_loss_count = sta->beacon_loss_count; 
    1734 - 
    1735 -       if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) || 
    1736 -           (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) { 
    1737 -               sinfo->filled |= STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG; 
    1738 -               if (!local->ops->get_rssi || 
    1739 -                   drv_get_rssi(local, sdata, &sta->sta, &sinfo->signal)) 
    1740 -                       sinfo->signal = (s8)sta->last_signal; 
    1741 -               sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal); 
    1742 -       } 
    1743 -       if (sta->chains) { 
    1744 -               sinfo->filled |= STATION_INFO_CHAIN_SIGNAL | 
    1745 -                                STATION_INFO_CHAIN_SIGNAL_AVG; 
    1746 - 
    1747 -               sinfo->chains = sta->chains; 
    1748 -               for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { 
    1749 -                       sinfo->chain_signal[i] = sta->chain_signal_last[i]; 
    1750 -                       sinfo->chain_signal_avg[i] = 
    1751 -                               (s8) -ewma_read(&sta->chain_signal_avg[i]); 
    1752 -               } 
    1753 -       } 
    1754 - 
    1755 -       sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate); 
    1756 -       sta_set_rate_info_rx(sta, &sinfo->rxrate); 
    1757 - 
    1758 -       if (ieee80211_vif_is_mesh(&sdata->vif)) { 
    1759 -#ifdef CPTCFG_MAC80211_MESH 
    1760 -               sinfo->filled |= STATION_INFO_LLID | 
    1761 -                                STATION_INFO_PLID | 
    1762 -                                STATION_INFO_PLINK_STATE | 
    1763 -                                STATION_INFO_LOCAL_PM | 
    1764 -                                STATION_INFO_PEER_PM | 
    1765 -                                STATION_INFO_NONPEER_PM; 
    1766 - 
    1767 -               sinfo->llid = sta->llid; 
    1768 -               sinfo->plid = sta->plid; 
    1769 -               sinfo->plink_state = sta->plink_state; 
    1770 -               if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) { 
    1771 -                       sinfo->filled |= STATION_INFO_T_OFFSET; 
    1772 -                       sinfo->t_offset = sta->t_offset; 
    1773 -               } 
    1774 -               sinfo->local_pm = sta->local_pm; 
    1775 -               sinfo->peer_pm = sta->peer_pm; 
    1776 -               sinfo->nonpeer_pm = sta->nonpeer_pm; 
    1777 -#endif 
    1778 -       } 
    1779 - 
    1780 -       sinfo->bss_param.flags = 0; 
    1781 -       if (sdata->vif.bss_conf.use_cts_prot) 
    1782 -               sinfo->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT; 
    1783 -       if (sdata->vif.bss_conf.use_short_preamble) 
    1784 -               sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE; 
    1785 -       if (sdata->vif.bss_conf.use_short_slot) 
    1786 -               sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME; 
    1787 -       sinfo->bss_param.dtim_period = sdata->local->hw.conf.ps_dtim_period; 
    1788 -       sinfo->bss_param.beacon_interval = sdata->vif.bss_conf.beacon_int; 
    1789 - 
    1790 -       sinfo->sta_flags.set = 0; 
    1791 -       sinfo->sta_flags.mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 
    1792 -                               BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 
    1793 -                               BIT(NL80211_STA_FLAG_WME) | 
    1794 -                               BIT(NL80211_STA_FLAG_MFP) | 
    1795 -                               BIT(NL80211_STA_FLAG_AUTHENTICATED) | 
    1796 -                               BIT(NL80211_STA_FLAG_ASSOCIATED) | 
    1797 -                               BIT(NL80211_STA_FLAG_TDLS_PEER); 
    1798 -       if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) 
    1799 -               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHORIZED); 
    1800 -       if (test_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE)) 
    1801 -               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_SHORT_PREAMBLE); 
    1802 -       if (test_sta_flag(sta, WLAN_STA_WME)) 
    1803 -               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_WME); 
    1804 -       if (test_sta_flag(sta, WLAN_STA_MFP)) 
    1805 -               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_MFP); 
    1806 -       if (test_sta_flag(sta, WLAN_STA_AUTH)) 
    1807 -               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHENTICATED); 
    1808 -       if (test_sta_flag(sta, WLAN_STA_ASSOC)) 
    1809 -               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_ASSOCIATED); 
    1810 -       if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) 
    1811 -               sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER); 
    1812 - 
    1813 -       /* check if the driver has a SW RC implementation */ 
    1814 -       if (ref && ref->ops->get_expected_throughput) 
    1815 -               thr = ref->ops->get_expected_throughput(sta->rate_ctrl_priv); 
    1816 -       else 
    1817 -               thr = drv_get_expected_throughput(local, &sta->sta); 
    1818 - 
    1819 -       if (thr != 0) { 
    1820 -               sinfo->filled |= STATION_INFO_EXPECTED_THROUGHPUT; 
    1821 -               sinfo->expected_throughput = thr; 
    1822 -       } 
    1823 -} 
    1824 - 
    1825 -static const char ieee80211_gstrings_sta_stats[][ETH_GSTRING_LEN] = { 
    1826 -       "rx_packets", "rx_bytes", "wep_weak_iv_count", 
    1827 -       "rx_duplicates", "rx_fragments", "rx_dropped", 
    1828 -       "tx_packets", "tx_bytes", "tx_fragments", 
    1829 -       "tx_filtered", "tx_retry_failed", "tx_retries", 
    1830 -       "beacon_loss", "sta_state", "txrate", "rxrate", "signal", 
    1831 -       "channel", "noise", "ch_time", "ch_time_busy", 
    1832 -       "ch_time_ext_busy", "ch_time_rx", "ch_time_tx" 
    1833 -}; 
    1834 -#define STA_STATS_LEN  ARRAY_SIZE(ieee80211_gstrings_sta_stats) 
    1835 - 
    1836 -static int ieee80211_get_et_sset_count(struct wiphy *wiphy, 
    1837 -                                      struct net_device *dev, 
    1838 -                                      int sset) 
    1839 -{ 
    1840 -       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 
    1841 -       int rv = 0; 
    1842 - 
    1843 -       if (sset == ETH_SS_STATS) 
    1844 -               rv += STA_STATS_LEN; 
    1845 - 
    1846 -       rv += drv_get_et_sset_count(sdata, sset); 
    1847 - 
    1848 -       if (rv == 0) 
    1849 -               return -EOPNOTSUPP; 
    1850 -       return rv; 
    1851 -} 
    1852 - 
    1853 -static void ieee80211_get_et_stats(struct wiphy *wiphy, 
    1854 -                                  struct net_device *dev, 
    1855 -                                  struct ethtool_stats *stats, 
    1856 -                                  u64 *data) 
    1857 -{ 
    1858 -       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 
    1859 -       struct ieee80211_chanctx_conf *chanctx_conf; 
    1860 -       struct ieee80211_channel *channel; 
    1861 -       struct sta_info *sta; 
    1862 -       struct ieee80211_local *local = sdata->local; 
    1863 -       struct station_info sinfo; 
    1864 -       struct survey_info survey; 
    1865 -       int i, q; 
    1866 -#define STA_STATS_SURVEY_LEN 7 
    1867 - 
    1868 -       memset(data, 0, sizeof(u64) * STA_STATS_LEN); 
    1869 - 
    1870 -#define ADD_STA_STATS(sta)                             \ 
    1871 -       do {                                            \ 
    1872 -               data[i++] += sta->rx_packets;           \ 
    1873 -               data[i++] += sta->rx_bytes;             \ 
    1874 -               data[i++] += sta->wep_weak_iv_count;    \ 
    1875 -               data[i++] += sta->num_duplicates;       \ 
    1876 -               data[i++] += sta->rx_fragments;         \ 
    1877 -               data[i++] += sta->rx_dropped;           \ 
    1878 -                                                       \ 
    1879 -               data[i++] += sinfo.tx_packets;          \ 
    1880 -               data[i++] += sinfo.tx_bytes;            \ 
    1881 -               data[i++] += sta->tx_fragments;         \ 
    1882 -               data[i++] += sta->tx_filtered_count;    \ 
    1883 -               data[i++] += sta->tx_retry_failed;      \ 
    1884 -               data[i++] += sta->tx_retry_count;       \ 
    1885 -               data[i++] += sta->beacon_loss_count;    \ 
    1886 -       } while (0) 
    1887 - 
    1888 -       /* For Managed stations, find the single station based on BSSID 
    1889 -        * and use that.  For interface types, iterate through all available 
    1890 -        * stations and add stats for any station that is assigned to this 
    1891 -        * network device. 
    1892 -        */ 
    1893 - 
    1894 -       mutex_lock(&local->sta_mtx); 
    1895 - 
    1896 -       if (sdata->vif.type == NL80211_IFTYPE_STATION) { 
    1897 -               sta = sta_info_get_bss(sdata, sdata->u.mgd.bssid); 
    1898 - 
    1899 -               if (!(sta && !WARN_ON(sta->sdata->dev != dev))) 
    1900 -                       goto do_survey; 
    1901 - 
    1902 -               sinfo.filled = 0; 
    1903 -               sta_set_sinfo(sta, &sinfo); 
    1904 - 
    1905 -               i = 0; 
    1906 -               ADD_STA_STATS(sta); 
    1907 - 
    1908 -               data[i++] = sta->sta_state; 
    1909 - 
    1910 - 
    1911 -               if (sinfo.filled & STATION_INFO_TX_BITRATE) 
    1912 -                       data[i] = 100000 * 
    1913 -                               cfg80211_calculate_bitrate(&sinfo.txrate); 
    1914 -               i++; 
    1915 -               if (sinfo.filled & STATION_INFO_RX_BITRATE) 
    1916 -                       data[i] = 100000 * 
    1917 -                               cfg80211_calculate_bitrate(&sinfo.rxrate); 
    1918 -               i++; 
    1919 - 
    1920 -               if (sinfo.filled & STATION_INFO_SIGNAL_AVG) 
    1921 -                       data[i] = (u8)sinfo.signal_avg; 
    1922 -               i++; 
    1923 -       } else { 
    1924 -               list_for_each_entry(sta, &local->sta_list, list) { 
    1925 -                       /* Make sure this station belongs to the proper dev */ 
    1926 -                       if (sta->sdata->dev != dev) 
    1927 -                               continue; 
    1928 - 
    1929 -                       sinfo.filled = 0; 
    1930 -                       sta_set_sinfo(sta, &sinfo); 
    1931 -                       i = 0; 
    1932 -                       ADD_STA_STATS(sta); 
    1933 -               } 
    1934 -       } 
    1935 - 
    1936 -do_survey: 
    1937 -       i = STA_STATS_LEN - STA_STATS_SURVEY_LEN; 
    1938 -       /* Get survey stats for current channel */ 
    1939 -       survey.filled = 0; 
    1940 - 
    1941 -       rcu_read_lock(); 
    1942 -       chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 
    1943 -       if (chanctx_conf) 
    1944 -               channel = chanctx_conf->def.chan; 
    1945 -       else 
    1946 -               channel = NULL; 
    1947 -       rcu_read_unlock(); 
    1948 - 
    1949 -       if (channel) { 
    1950 -               q = 0; 
    1951 -               do { 
    1952 -                       survey.filled = 0; 
    1953 -                       if (drv_get_survey(local, q, &survey) != 0) { 
    1954 -                               survey.filled = 0; 
    1955 -                               break; 
    1956 -                       } 
    1957 -                       q++; 
    1958 -               } while (channel != survey.channel); 
    1959 -       } 
    1960 - 
    1961 -       if (survey.filled) 
    1962 -               data[i++] = survey.channel->center_freq; 
    1963 -       else 
    1964 -               data[i++] = 0; 
    1965 -       if (survey.filled & SURVEY_INFO_NOISE_DBM) 
    1966 -               data[i++] = (u8)survey.noise; 
    1967 -       else 
    1968 -               data[i++] = -1LL; 
    1969 -       if (survey.filled & SURVEY_INFO_CHANNEL_TIME) 
    1970 -               data[i++] = survey.channel_time; 
    1971 -       else 
    1972 -               data[i++] = -1LL; 
    1973 -       if (survey.filled & SURVEY_INFO_CHANNEL_TIME_BUSY) 
    1974 -               data[i++] = survey.channel_time_busy; 
    1975 -       else 
    1976 -               data[i++] = -1LL; 
    1977 -       if (survey.filled & SURVEY_INFO_CHANNEL_TIME_EXT_BUSY) 
    1978 -               data[i++] = survey.channel_time_ext_busy; 
    1979 -       else 
    1980 -               data[i++] = -1LL; 
    1981 -       if (survey.filled & SURVEY_INFO_CHANNEL_TIME_RX) 
    1982 -               data[i++] = survey.channel_time_rx; 
    1983 -       else 
    1984 -               data[i++] = -1LL; 
    1985 -       if (survey.filled & SURVEY_INFO_CHANNEL_TIME_TX) 
    1986 -               data[i++] = survey.channel_time_tx; 
    1987 -       else 
    1988 -               data[i++] = -1LL; 
    1989 - 
    1990 -       mutex_unlock(&local->sta_mtx); 
    1991 - 
    1992 -       if (WARN_ON(i != STA_STATS_LEN)) 
    1993 -               return; 
    1994 - 
    1995 -       drv_get_et_stats(sdata, stats, &(data[STA_STATS_LEN])); 
    1996 -} 
    1997 - 
    1998 -static void ieee80211_get_et_strings(struct wiphy *wiphy, 
    1999 -                                    struct net_device *dev, 
    2000 -                                    u32 sset, u8 *data) 
    2001 -{ 
    2002 -       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 
    2003 -       int sz_sta_stats = 0; 
    2004 - 
    2005 -       if (sset == ETH_SS_STATS) { 
    2006 -               sz_sta_stats = sizeof(ieee80211_gstrings_sta_stats); 
    2007 -               memcpy(data, ieee80211_gstrings_sta_stats, sz_sta_stats); 
    2008 -       } 
    2009 -       drv_get_et_strings(sdata, sset, &(data[sz_sta_stats])); 
    2010 -} 
    2011 - 
    2012  static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev, 
    2013                                   int idx, u8 *mac, struct station_info *sinfo) 
    2014  { 
    2015 @@ -875,7 +554,8 @@ static int ieee80211_set_monitor_channel 
    2016  } 
    2017   
    2018  static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata, 
    2019 -                                   const u8 *resp, size_t resp_len) 
    2020 +                                   const u8 *resp, size_t resp_len, 
    2021 +                                   const struct ieee80211_csa_settings *csa) 
    2022  { 
    2023         struct probe_resp *new, *old; 
    2024   
    2025 @@ -891,6 +571,11 @@ static int ieee80211_set_probe_resp(stru 
    2026         new->len = resp_len; 
    2027         memcpy(new->data, resp, resp_len); 
    2028   
    2029 +       if (csa) 
    2030 +               memcpy(new->csa_counter_offsets, csa->counter_offsets_presp, 
    2031 +                      csa->n_counter_offsets_presp * 
    2032 +                      sizeof(new->csa_counter_offsets[0])); 
    2033 + 
    2034         rcu_assign_pointer(sdata->u.ap.probe_resp, new); 
    2035         if (old) 
    2036                 kfree_rcu(old, rcu_head); 
    2037 @@ -899,7 +584,8 @@ static int ieee80211_set_probe_resp(stru 
    2038  } 
    2039   
    2040  static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, 
    2041 -                                  struct cfg80211_beacon_data *params) 
    2042 +                                  struct cfg80211_beacon_data *params, 
    2043 +                                  const struct ieee80211_csa_settings *csa) 
    2044  { 
    2045         struct beacon_data *new, *old; 
    2046         int new_head_len, new_tail_len; 
    2047 @@ -943,6 +629,13 @@ static int ieee80211_assign_beacon(struc 
    2048         new->head_len = new_head_len; 
    2049         new->tail_len = new_tail_len; 
    2050   
    2051 +       if (csa) { 
    2052 +               new->csa_current_counter = csa->count; 
    2053 +               memcpy(new->csa_counter_offsets, csa->counter_offsets_beacon, 
    2054 +                      csa->n_counter_offsets_beacon * 
    2055 +                      sizeof(new->csa_counter_offsets[0])); 
    2056 +       } 
    2057 + 
    2058         /* copy in head */ 
    2059         if (params->head) 
    2060                 memcpy(new->head, params->head, new_head_len); 
    2061 @@ -957,7 +650,7 @@ static int ieee80211_assign_beacon(struc 
    2062                         memcpy(new->tail, old->tail, new_tail_len); 
    2063   
    2064         err = ieee80211_set_probe_resp(sdata, params->probe_resp, 
    2065 -                                      params->probe_resp_len); 
    2066 +                                      params->probe_resp_len, csa); 
    2067         if (err < 0) 
    2068                 return err; 
    2069         if (err == 0) 
    2070 @@ -1042,7 +735,7 @@ static int ieee80211_start_ap(struct wip 
    2071                 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= 
    2072                                         IEEE80211_P2P_OPPPS_ENABLE_BIT; 
    2073   
    2074 -       err = ieee80211_assign_beacon(sdata, &params->beacon); 
    2075 +       err = ieee80211_assign_beacon(sdata, &params->beacon, NULL); 
    2076         if (err < 0) { 
    2077                 ieee80211_vif_release_channel(sdata); 
    2078                 return err; 
    2079 @@ -1090,7 +783,7 @@ static int ieee80211_change_beacon(struc 
    2080         if (!old) 
    2081                 return -ENOENT; 
    2082   
    2083 -       err = ieee80211_assign_beacon(sdata, params); 
    2084 +       err = ieee80211_assign_beacon(sdata, params, NULL); 
    2085         if (err < 0) 
    2086                 return err; 
    2087         ieee80211_bss_info_change_notify(sdata, err); 
    2088 @@ -3073,7 +2766,8 @@ static int ieee80211_set_after_csa_beaco 
    2089   
    2090         switch (sdata->vif.type) { 
    2091         case NL80211_IFTYPE_AP: 
    2092 -               err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon); 
    2093 +               err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, 
    2094 +                                             NULL); 
    2095                 kfree(sdata->u.ap.next_beacon); 
    2096                 sdata->u.ap.next_beacon = NULL; 
    2097   
    2098 @@ -3176,6 +2870,7 @@ static int ieee80211_set_csa_beacon(stru 
    2099                                     struct cfg80211_csa_settings *params, 
    2100                                     u32 *changed) 
    2101  { 
    2102 +       struct ieee80211_csa_settings csa = {}; 
    2103         int err; 
    2104   
    2105         switch (sdata->vif.type) { 
    2106 @@ -3210,20 +2905,13 @@ static int ieee80211_set_csa_beacon(stru 
    2107                      IEEE80211_MAX_CSA_COUNTERS_NUM)) 
    2108                         return -EINVAL; 
    2109   
    2110 -               /* make sure we don't have garbage in other counters */ 
    2111 -               memset(sdata->csa_counter_offset_beacon, 0, 
    2112 -                      sizeof(sdata->csa_counter_offset_beacon)); 
    2113 -               memset(sdata->csa_counter_offset_presp, 0, 
    2114 -                      sizeof(sdata->csa_counter_offset_presp)); 
    2115 - 
    2116 -               memcpy(sdata->csa_counter_offset_beacon, 
    2117 -                      params->counter_offsets_beacon, 
    2118 -                      params->n_counter_offsets_beacon * sizeof(u16)); 
    2119 -               memcpy(sdata->csa_counter_offset_presp, 
    2120 -                      params->counter_offsets_presp, 
    2121 -                      params->n_counter_offsets_presp * sizeof(u16)); 
    2122 +               csa.counter_offsets_beacon = params->counter_offsets_beacon; 
    2123 +               csa.counter_offsets_presp = params->counter_offsets_presp; 
    2124 +               csa.n_counter_offsets_beacon = params->n_counter_offsets_beacon; 
    2125 +               csa.n_counter_offsets_presp = params->n_counter_offsets_presp; 
    2126 +               csa.count = params->count; 
    2127   
    2128 -               err = ieee80211_assign_beacon(sdata, &params->beacon_csa); 
    2129 +               err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa); 
    2130                 if (err < 0) { 
    2131                         kfree(sdata->u.ap.next_beacon); 
    2132                         return err; 
    2133 @@ -3367,7 +3055,6 @@ __ieee80211_channel_switch(struct wiphy  
    2134         sdata->csa_radar_required = params->radar_required; 
    2135         sdata->csa_chandef = params->chandef; 
    2136         sdata->csa_block_tx = params->block_tx; 
    2137 -       sdata->csa_current_counter = params->count; 
    2138         sdata->vif.csa_active = true; 
    2139   
    2140         if (sdata->csa_block_tx) 
    2141 @@ -3515,10 +3202,23 @@ static int ieee80211_mgmt_tx(struct wiph 
    2142              sdata->vif.type == NL80211_IFTYPE_ADHOC) && 
    2143             params->n_csa_offsets) { 
    2144                 int i; 
    2145 -               u8 c = sdata->csa_current_counter; 
    2146 +               struct beacon_data *beacon = NULL; 
    2147 + 
    2148 +               rcu_read_lock(); 
    2149   
    2150 -               for (i = 0; i < params->n_csa_offsets; i++) 
    2151 -                       data[params->csa_offsets[i]] = c; 
    2152 +               if (sdata->vif.type == NL80211_IFTYPE_AP) 
    2153 +                       beacon = rcu_dereference(sdata->u.ap.beacon); 
    2154 +               else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
    2155 +                       beacon = rcu_dereference(sdata->u.ibss.presp); 
    2156 +               else if (ieee80211_vif_is_mesh(&sdata->vif)) 
    2157 +                       beacon = rcu_dereference(sdata->u.mesh.beacon); 
    2158 + 
    2159 +               if (beacon) 
    2160 +                       for (i = 0; i < params->n_csa_offsets; i++) 
    2161 +                               data[params->csa_offsets[i]] = 
    2162 +                                       beacon->csa_current_counter; 
    2163 + 
    2164 +               rcu_read_unlock(); 
    2165         } 
    2166   
    2167         IEEE80211_SKB_CB(skb)->flags = flags; 
    2168 @@ -3598,21 +3298,6 @@ static int ieee80211_get_antenna(struct  
    2169         return drv_get_antenna(local, tx_ant, rx_ant); 
    2170  } 
    2171   
    2172 -static int ieee80211_set_ringparam(struct wiphy *wiphy, u32 tx, u32 rx) 
    2173 -{ 
    2174 -       struct ieee80211_local *local = wiphy_priv(wiphy); 
    2175 - 
    2176 -       return drv_set_ringparam(local, tx, rx); 
    2177 -} 
    2178 - 
    2179 -static void ieee80211_get_ringparam(struct wiphy *wiphy, 
    2180 -                                   u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max) 
    2181 -{ 
    2182 -       struct ieee80211_local *local = wiphy_priv(wiphy); 
    2183 - 
    2184 -       drv_get_ringparam(local, tx, tx_max, rx, rx_max); 
    2185 -} 
    2186 - 
    2187  static int ieee80211_set_rekey_data(struct wiphy *wiphy, 
    2188                                     struct net_device *dev, 
    2189                                     struct cfg80211_gtk_rekey_data *data) 
    2190 @@ -3844,8 +3529,6 @@ const struct cfg80211_ops mac80211_confi 
    2191         .mgmt_frame_register = ieee80211_mgmt_frame_register, 
    2192         .set_antenna = ieee80211_set_antenna, 
    2193         .get_antenna = ieee80211_get_antenna, 
    2194 -       .set_ringparam = ieee80211_set_ringparam, 
    2195 -       .get_ringparam = ieee80211_get_ringparam, 
    2196         .set_rekey_data = ieee80211_set_rekey_data, 
    2197         .tdls_oper = ieee80211_tdls_oper, 
    2198         .tdls_mgmt = ieee80211_tdls_mgmt, 
    2199 @@ -3854,9 +3537,6 @@ const struct cfg80211_ops mac80211_confi 
    2200  #ifdef CONFIG_PM 
    2201         .set_wakeup = ieee80211_set_wakeup, 
    2202  #endif 
    2203 -       .get_et_sset_count = ieee80211_get_et_sset_count, 
    2204 -       .get_et_stats = ieee80211_get_et_stats, 
    2205 -       .get_et_strings = ieee80211_get_et_strings, 
    2206         .get_channel = ieee80211_cfg_get_channel, 
    2207         .start_radar_detection = ieee80211_start_radar_detection, 
    2208         .channel_switch = ieee80211_channel_switch, 
    2209 --- a/net/mac80211/debugfs_sta.c 
    2210 +++ b/net/mac80211/debugfs_sta.c 
    2211 @@ -587,7 +587,6 @@ void ieee80211_sta_debugfs_add(struct st 
    2212         DEBUGFS_ADD_COUNTER(tx_filtered, tx_filtered_count); 
    2213         DEBUGFS_ADD_COUNTER(tx_retry_failed, tx_retry_failed); 
    2214         DEBUGFS_ADD_COUNTER(tx_retry_count, tx_retry_count); 
    2215 -       DEBUGFS_ADD_COUNTER(wep_weak_iv_count, wep_weak_iv_count); 
    2216   
    2217         if (sizeof(sta->driver_buffered_tids) == sizeof(u32)) 
    2218                 debugfs_create_x32("driver_buffered_tids", 0400, 
    2219 --- a/net/mac80211/wep.c 
    2220 +++ b/net/mac80211/wep.c 
    2221 @@ -271,22 +271,6 @@ static int ieee80211_wep_decrypt(struct  
    2222         return ret; 
    2223  } 
    2224   
    2225 - 
    2226 -static bool ieee80211_wep_is_weak_iv(struct sk_buff *skb, 
    2227 -                                    struct ieee80211_key *key) 
    2228 -{ 
    2229 -       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    2230 -       unsigned int hdrlen; 
    2231 -       u8 *ivpos; 
    2232 -       u32 iv; 
    2233 - 
    2234 -       hdrlen = ieee80211_hdrlen(hdr->frame_control); 
    2235 -       ivpos = skb->data + hdrlen; 
    2236 -       iv = (ivpos[0] << 16) | (ivpos[1] << 8) | ivpos[2]; 
    2237 - 
    2238 -       return ieee80211_wep_weak_iv(iv, key->conf.keylen); 
    2239 -} 
    2240 - 
    2241  ieee80211_rx_result 
    2242  ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx) 
    2243  { 
    2244 @@ -301,16 +285,12 @@ ieee80211_crypto_wep_decrypt(struct ieee 
    2245         if (!(status->flag & RX_FLAG_DECRYPTED)) { 
    2246                 if (skb_linearize(rx->skb)) 
    2247                         return RX_DROP_UNUSABLE; 
    2248 -               if (rx->sta && ieee80211_wep_is_weak_iv(rx->skb, rx->key)) 
    2249 -                       rx->sta->wep_weak_iv_count++; 
    2250                 if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) 
    2251                         return RX_DROP_UNUSABLE; 
    2252         } else if (!(status->flag & RX_FLAG_IV_STRIPPED)) { 
    2253                 if (!pskb_may_pull(rx->skb, ieee80211_hdrlen(fc) + 
    2254                                             IEEE80211_WEP_IV_LEN)) 
    2255                         return RX_DROP_UNUSABLE; 
    2256 -               if (rx->sta && ieee80211_wep_is_weak_iv(rx->skb, rx->key)) 
    2257 -                       rx->sta->wep_weak_iv_count++; 
    2258                 ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key); 
    2259                 /* remove ICV */ 
    2260                 if (pskb_trim(rx->skb, rx->skb->len - IEEE80211_WEP_ICV_LEN)) 
    2261 --- a/include/net/cfg80211.h 
    2262 +++ b/include/net/cfg80211.h 
    2263 @@ -2278,16 +2278,6 @@ struct cfg80211_qos_map { 
    2264   * 
    2265   * @set_noack_map: Set the NoAck Map for the TIDs. 
    2266   * 
    2267 - * @get_et_sset_count:  Ethtool API to get string-set count. 
    2268 - *     See @ethtool_ops.get_sset_count 
    2269 - * 
    2270 - * @get_et_stats:  Ethtool API to get a set of u64 stats. 
    2271 - *     See @ethtool_ops.get_ethtool_stats 
    2272 - * 
    2273 - * @get_et_strings:  Ethtool API to get a set of strings to describe stats 
    2274 - *     and perhaps other supported types of ethtool data-sets. 
    2275 - *     See @ethtool_ops.get_strings 
    2276 - * 
    2277   * @get_channel: Get the current operating channel for the virtual interface. 
    2278   *     For monitor interfaces, it should return %NULL unless there's a single 
    2279   *     current monitoring channel. 
    2280 @@ -2529,13 +2519,6 @@ struct cfg80211_ops { 
    2281                                   struct net_device *dev, 
    2282                                   u16 noack_map); 
    2283   
    2284 -       int     (*get_et_sset_count)(struct wiphy *wiphy, 
    2285 -                                    struct net_device *dev, int sset); 
    2286 -       void    (*get_et_stats)(struct wiphy *wiphy, struct net_device *dev, 
    2287 -                               struct ethtool_stats *stats, u64 *data); 
    2288 -       void    (*get_et_strings)(struct wiphy *wiphy, struct net_device *dev, 
    2289 -                                 u32 sset, u8 *data); 
    2290 - 
    2291         int     (*get_channel)(struct wiphy *wiphy, 
    2292                                struct wireless_dev *wdev, 
    2293                                struct cfg80211_chan_def *chandef); 
    2294 @@ -4846,6 +4829,10 @@ void cfg80211_stop_iface(struct wiphy *w 
    2295   */ 
    2296  void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy); 
    2297   
    2298 + 
    2299 +/* ethtool helper */ 
    2300 +void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info); 
    2301 + 
    2302  /* Logging, debugging and troubleshooting/diagnostic helpers. */ 
    2303   
    2304  /* wiphy_printk helpers, similar to dev_printk */ 
    2305 --- a/net/mac80211/Makefile 
    2306 +++ b/net/mac80211/Makefile 
    2307 @@ -17,6 +17,7 @@ mac80211-y := \ 
    2308         aes_ccm.o \ 
    2309         aes_cmac.o \ 
    2310         cfg.o \ 
    2311 +       ethtool.o \ 
    2312         rx.o \ 
    2313         spectmgmt.o \ 
    2314         tx.o \ 
    2315 --- a/net/mac80211/ieee80211_i.h 
    2316 +++ b/net/mac80211/ieee80211_i.h 
    2317 @@ -229,16 +229,29 @@ struct ieee80211_rx_data { 
    2318         u16 tkip_iv16; 
    2319  }; 
    2320   
    2321 +struct ieee80211_csa_settings { 
    2322 +       const u16 *counter_offsets_beacon; 
    2323 +       const u16 *counter_offsets_presp; 
    2324 + 
    2325 +       int n_counter_offsets_beacon; 
    2326 +       int n_counter_offsets_presp; 
    2327 + 
    2328 +       u8 count; 
    2329 +}; 
    2330 + 
    2331  struct beacon_data { 
    2332         u8 *head, *tail; 
    2333         int head_len, tail_len; 
    2334         struct ieee80211_meshconf_ie *meshconf; 
    2335 +       u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM]; 
    2336 +       u8 csa_current_counter; 
    2337         struct rcu_head rcu_head; 
    2338  }; 
    2339   
    2340  struct probe_resp { 
    2341         struct rcu_head rcu_head; 
    2342         int len; 
    2343 +       u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM]; 
    2344         u8 data[0]; 
    2345  }; 
    2346   
    2347 @@ -754,8 +767,6 @@ struct ieee80211_sub_if_data { 
    2348         struct mac80211_qos_map __rcu *qos_map; 
    2349   
    2350         struct work_struct csa_finalize_work; 
    2351 -       u16 csa_counter_offset_beacon[IEEE80211_MAX_CSA_COUNTERS_NUM]; 
    2352 -       u16 csa_counter_offset_presp[IEEE80211_MAX_CSA_COUNTERS_NUM]; 
    2353         bool csa_radar_required; 
    2354         bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */ 
    2355         struct cfg80211_chan_def csa_chandef; 
    2356 @@ -767,7 +778,6 @@ struct ieee80211_sub_if_data { 
    2357         struct ieee80211_chanctx *reserved_chanctx; 
    2358         struct cfg80211_chan_def reserved_chandef; 
    2359         bool reserved_radar_required; 
    2360 -       u8 csa_current_counter; 
    2361   
    2362         /* used to reconfigure hardware SM PS */ 
    2363         struct work_struct recalc_smps; 
    2364 @@ -1850,6 +1860,8 @@ int ieee80211_tdls_oper(struct wiphy *wi 
    2365                         const u8 *peer, enum nl80211_tdls_operation oper); 
    2366   
    2367   
    2368 +extern const struct ethtool_ops ieee80211_ethtool_ops; 
    2369 + 
    2370  #ifdef CPTCFG_MAC80211_NOINLINE 
    2371  #define debug_noinline noinline 
    2372  #else 
    2373 --- a/net/mac80211/iface.c 
    2374 +++ b/net/mac80211/iface.c 
    2375 @@ -399,6 +399,7 @@ int ieee80211_add_virtual_monitor(struct 
    2376         sdata->vif.type = NL80211_IFTYPE_MONITOR; 
    2377         snprintf(sdata->name, IFNAMSIZ, "%s-monitor", 
    2378                  wiphy_name(local->hw.wiphy)); 
    2379 +       sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; 
    2380   
    2381         sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; 
    2382   
    2383 @@ -1303,6 +1304,7 @@ static void ieee80211_setup_sdata(struct 
    2384         sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); 
    2385         sdata->control_port_no_encrypt = false; 
    2386         sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; 
    2387 +       sdata->vif.bss_conf.idle = true; 
    2388   
    2389         sdata->noack_map = 0; 
    2390   
    2391 @@ -1721,6 +1723,8 @@ int ieee80211_if_add(struct ieee80211_lo 
    2392   
    2393                 ndev->features |= local->hw.netdev_features; 
    2394   
    2395 +               netdev_set_default_ethtool_ops(ndev, &ieee80211_ethtool_ops); 
    2396 + 
    2397                 ret = register_netdevice(ndev); 
    2398                 if (ret) { 
    2399                         free_netdev(ndev); 
    2400 --- a/net/wireless/core.c 
    2401 +++ b/net/wireless/core.c 
    2402 @@ -25,7 +25,6 @@ 
    2403  #include "sysfs.h" 
    2404  #include "debugfs.h" 
    2405  #include "wext-compat.h" 
    2406 -#include "ethtool.h" 
    2407  #include "rdev-ops.h" 
    2408   
    2409  /* name for sysfs, %d is appended */ 
    2410 @@ -940,8 +939,6 @@ static int cfg80211_netdev_notifier_call 
    2411                 /* allow mac80211 to determine the timeout */ 
    2412                 wdev->ps_timeout = -1; 
    2413   
    2414 -               netdev_set_default_ethtool_ops(dev, &cfg80211_ethtool_ops); 
    2415 - 
    2416                 if ((wdev->iftype == NL80211_IFTYPE_STATION || 
    2417                      wdev->iftype == NL80211_IFTYPE_P2P_CLIENT || 
    2418                      wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr) 
    2419 --- a/net/wireless/ethtool.c 
    2420 +++ b/net/wireless/ethtool.c 
    2421 @@ -1,11 +1,9 @@ 
    2422  #include <linux/utsname.h> 
    2423  #include <net/cfg80211.h> 
    2424  #include "core.h" 
    2425 -#include "ethtool.h" 
    2426  #include "rdev-ops.h" 
    2427   
    2428 -static void cfg80211_get_drvinfo(struct net_device *dev, 
    2429 -                                       struct ethtool_drvinfo *info) 
    2430 +void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) 
    2431  { 
    2432         struct wireless_dev *wdev = dev->ieee80211_ptr; 
    2433   
    2434 @@ -23,84 +21,4 @@ static void cfg80211_get_drvinfo(struct  
    2435         strlcpy(info->bus_info, dev_name(wiphy_dev(wdev->wiphy)), 
    2436                 sizeof(info->bus_info)); 
    2437  } 
    2438 - 
    2439 -static int cfg80211_get_regs_len(struct net_device *dev) 
    2440 -{ 
    2441 -       /* For now, return 0... */ 
    2442 -       return 0; 
    2443 -} 
    2444 - 
    2445 -static void cfg80211_get_regs(struct net_device *dev, struct ethtool_regs *regs, 
    2446 -                       void *data) 
    2447 -{ 
    2448 -       struct wireless_dev *wdev = dev->ieee80211_ptr; 
    2449 - 
    2450 -       regs->version = wdev->wiphy->hw_version; 
    2451 -       regs->len = 0; 
    2452 -} 
    2453 - 
    2454 -static void cfg80211_get_ringparam(struct net_device *dev, 
    2455 -                                  struct ethtool_ringparam *rp) 
    2456 -{ 
    2457 -       struct wireless_dev *wdev = dev->ieee80211_ptr; 
    2458 -       struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 
    2459 - 
    2460 -       memset(rp, 0, sizeof(*rp)); 
    2461 - 
    2462 -       if (rdev->ops->get_ringparam) 
    2463 -               rdev_get_ringparam(rdev, &rp->tx_pending, &rp->tx_max_pending, 
    2464 -                                  &rp->rx_pending, &rp->rx_max_pending); 
    2465 -} 
    2466 - 
    2467 -static int cfg80211_set_ringparam(struct net_device *dev, 
    2468 -                                 struct ethtool_ringparam *rp) 
    2469 -{ 
    2470 -       struct wireless_dev *wdev = dev->ieee80211_ptr; 
    2471 -       struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 
    2472 - 
    2473 -       if (rp->rx_mini_pending != 0 || rp->rx_jumbo_pending != 0) 
    2474 -               return -EINVAL; 
    2475 - 
    2476 -       if (rdev->ops->set_ringparam) 
    2477 -               return rdev_set_ringparam(rdev, rp->tx_pending, rp->rx_pending); 
    2478 - 
    2479 -       return -ENOTSUPP; 
    2480 -} 
    2481 - 
    2482 -static int cfg80211_get_sset_count(struct net_device *dev, int sset) 
    2483 -{ 
    2484 -       struct wireless_dev *wdev = dev->ieee80211_ptr; 
    2485 -       struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 
    2486 -       if (rdev->ops->get_et_sset_count) 
    2487 -               return rdev_get_et_sset_count(rdev, dev, sset); 
    2488 -       return -EOPNOTSUPP; 
    2489 -} 
    2490 - 
    2491 -static void cfg80211_get_stats(struct net_device *dev, 
    2492 -                              struct ethtool_stats *stats, u64 *data) 
    2493 -{ 
    2494 -       struct wireless_dev *wdev = dev->ieee80211_ptr; 
    2495 -       struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 
    2496 -       if (rdev->ops->get_et_stats) 
    2497 -               rdev_get_et_stats(rdev, dev, stats, data); 
    2498 -} 
    2499 - 
    2500 -static void cfg80211_get_strings(struct net_device *dev, u32 sset, u8 *data) 
    2501 -{ 
    2502 -       struct wireless_dev *wdev = dev->ieee80211_ptr; 
    2503 -       struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 
    2504 -       if (rdev->ops->get_et_strings) 
    2505 -               rdev_get_et_strings(rdev, dev, sset, data); 
    2506 -} 
    2507 - 
    2508 -const struct ethtool_ops cfg80211_ethtool_ops = { 
    2509 -       .get_drvinfo = cfg80211_get_drvinfo, 
    2510 -       .get_regs_len = cfg80211_get_regs_len, 
    2511 -       .get_regs = cfg80211_get_regs, 
    2512 -       .get_link = ethtool_op_get_link, 
    2513 -       .get_ringparam = cfg80211_get_ringparam, 
    2514 -       .set_ringparam = cfg80211_set_ringparam, 
    2515 -       .get_strings = cfg80211_get_strings, 
    2516 -       .get_ethtool_stats = cfg80211_get_stats, 
    2517 -       .get_sset_count = cfg80211_get_sset_count, 
    2518 -}; 
    2519 +EXPORT_SYMBOL(cfg80211_get_drvinfo); 
    2520 --- a/net/wireless/ethtool.h 
    2521 +++ /dev/null 
    2522 @@ -1,6 +0,0 @@ 
    2523 -#ifndef __CFG80211_ETHTOOL__ 
    2524 -#define __CFG80211_ETHTOOL__ 
    2525 - 
    2526 -extern const struct ethtool_ops cfg80211_ethtool_ops; 
    2527 - 
    2528 -#endif /* __CFG80211_ETHTOOL__ */ 
    2529 --- a/net/wireless/rdev-ops.h 
    2530 +++ b/net/wireless/rdev-ops.h 
    2531 @@ -714,25 +714,6 @@ static inline int rdev_get_antenna(struc 
    2532         return ret; 
    2533  } 
    2534   
    2535 -static inline int rdev_set_ringparam(struct cfg80211_registered_device *rdev, 
    2536 -                                    u32 tx, u32 rx) 
    2537 -{ 
    2538 -       int ret; 
    2539 -       trace_rdev_set_ringparam(&rdev->wiphy, tx, rx); 
    2540 -       ret = rdev->ops->set_ringparam(&rdev->wiphy, tx, rx); 
    2541 -       trace_rdev_return_int(&rdev->wiphy, ret); 
    2542 -       return ret; 
    2543 -} 
    2544 - 
    2545 -static inline void rdev_get_ringparam(struct cfg80211_registered_device *rdev, 
    2546 -                                     u32 *tx, u32 *tx_max, u32 *rx, 
    2547 -                                     u32 *rx_max) 
    2548 -{ 
    2549 -       trace_rdev_get_ringparam(&rdev->wiphy); 
    2550 -       rdev->ops->get_ringparam(&rdev->wiphy, tx, tx_max, rx, rx_max); 
    2551 -       trace_rdev_return_void_tx_rx(&rdev->wiphy, *tx, *tx_max, *rx, *rx_max); 
    2552 -} 
    2553 - 
    2554  static inline int 
    2555  rdev_sched_scan_start(struct cfg80211_registered_device *rdev, 
    2556                       struct net_device *dev, 
    2557 @@ -816,35 +797,6 @@ static inline int rdev_set_noack_map(str 
    2558  } 
    2559   
    2560  static inline int 
    2561 -rdev_get_et_sset_count(struct cfg80211_registered_device *rdev, 
    2562 -                      struct net_device *dev, int sset) 
    2563 -{ 
    2564 -       int ret; 
    2565 -       trace_rdev_get_et_sset_count(&rdev->wiphy, dev, sset); 
    2566 -       ret = rdev->ops->get_et_sset_count(&rdev->wiphy, dev, sset); 
    2567 -       trace_rdev_return_int(&rdev->wiphy, ret); 
    2568 -       return ret; 
    2569 -} 
    2570 - 
    2571 -static inline void rdev_get_et_stats(struct cfg80211_registered_device *rdev, 
    2572 -                                    struct net_device *dev, 
    2573 -                                    struct ethtool_stats *stats, u64 *data) 
    2574 -{ 
    2575 -       trace_rdev_get_et_stats(&rdev->wiphy, dev); 
    2576 -       rdev->ops->get_et_stats(&rdev->wiphy, dev, stats, data); 
    2577 -       trace_rdev_return_void(&rdev->wiphy); 
    2578 -} 
    2579 - 
    2580 -static inline void rdev_get_et_strings(struct cfg80211_registered_device *rdev, 
    2581 -                                      struct net_device *dev, u32 sset, 
    2582 -                                      u8 *data) 
    2583 -{ 
    2584 -       trace_rdev_get_et_strings(&rdev->wiphy, dev, sset); 
    2585 -       rdev->ops->get_et_strings(&rdev->wiphy, dev, sset, data); 
    2586 -       trace_rdev_return_void(&rdev->wiphy); 
    2587 -} 
    2588 - 
    2589 -static inline int 
    2590  rdev_get_channel(struct cfg80211_registered_device *rdev, 
    2591                  struct wireless_dev *wdev, 
    2592                  struct cfg80211_chan_def *chandef) 
    2593 --- a/net/wireless/trace.h 
    2594 +++ b/net/wireless/trace.h 
    2595 @@ -298,11 +298,6 @@ DEFINE_EVENT(wiphy_only_evt, rdev_return 
    2596         TP_ARGS(wiphy) 
    2597  ); 
    2598   
    2599 -DEFINE_EVENT(wiphy_only_evt, rdev_get_ringparam, 
    2600 -       TP_PROTO(struct wiphy *wiphy), 
    2601 -       TP_ARGS(wiphy) 
    2602 -); 
    2603 - 
    2604  DEFINE_EVENT(wiphy_only_evt, rdev_get_antenna, 
    2605         TP_PROTO(struct wiphy *wiphy), 
    2606         TP_ARGS(wiphy) 
    2607 @@ -580,11 +575,6 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_stop 
    2608         TP_ARGS(wiphy, netdev) 
    2609  ); 
    2610   
    2611 -DEFINE_EVENT(wiphy_netdev_evt, rdev_get_et_stats, 
    2612 -       TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), 
    2613 -       TP_ARGS(wiphy, netdev) 
    2614 -); 
    2615 - 
    2616  DEFINE_EVENT(wiphy_netdev_evt, rdev_sched_scan_stop, 
    2617         TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), 
    2618         TP_ARGS(wiphy, netdev) 
    2619 @@ -1439,11 +1429,6 @@ DECLARE_EVENT_CLASS(tx_rx_evt, 
    2620                   WIPHY_PR_ARG, __entry->tx, __entry->rx) 
    2621  ); 
    2622   
    2623 -DEFINE_EVENT(tx_rx_evt, rdev_set_ringparam, 
    2624 -       TP_PROTO(struct wiphy *wiphy, u32 tx, u32 rx), 
    2625 -       TP_ARGS(wiphy, rx, tx) 
    2626 -); 
    2627 - 
    2628  DEFINE_EVENT(tx_rx_evt, rdev_set_antenna, 
    2629         TP_PROTO(struct wiphy *wiphy, u32 tx, u32 rx), 
    2630         TP_ARGS(wiphy, rx, tx) 
    2631 @@ -1725,40 +1710,6 @@ TRACE_EVENT(rdev_set_noack_map, 
    2632                   WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->noack_map) 
    2633  ); 
    2634   
    2635 -TRACE_EVENT(rdev_get_et_sset_count, 
    2636 -       TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int sset), 
    2637 -       TP_ARGS(wiphy, netdev, sset), 
    2638 -       TP_STRUCT__entry( 
    2639 -               WIPHY_ENTRY 
    2640 -               NETDEV_ENTRY 
    2641 -               __field(int, sset) 
    2642 -       ), 
    2643 -       TP_fast_assign( 
    2644 -               WIPHY_ASSIGN; 
    2645 -               NETDEV_ASSIGN; 
    2646 -               __entry->sset = sset; 
    2647 -       ), 
    2648 -       TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", sset: %d", 
    2649 -                 WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->sset) 
    2650 -); 
    2651 - 
    2652 -TRACE_EVENT(rdev_get_et_strings, 
    2653 -       TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u32 sset), 
    2654 -       TP_ARGS(wiphy, netdev, sset), 
    2655 -       TP_STRUCT__entry( 
    2656 -               WIPHY_ENTRY 
    2657 -               NETDEV_ENTRY 
    2658 -               __field(u32, sset) 
    2659 -       ), 
    2660 -       TP_fast_assign( 
    2661 -               WIPHY_ASSIGN; 
    2662 -               NETDEV_ASSIGN; 
    2663 -               __entry->sset = sset; 
    2664 -       ), 
    2665 -       TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", sset: %u", 
    2666 -                 WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->sset) 
    2667 -); 
    2668 - 
    2669  DEFINE_EVENT(wiphy_wdev_evt, rdev_get_channel, 
    2670         TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev), 
    2671         TP_ARGS(wiphy, wdev) 
    2672 --- /dev/null 
    2673 +++ b/net/mac80211/ethtool.c 
    2674 @@ -0,0 +1,244 @@ 
    2675 +/* 
    2676 + * mac80211 ethtool hooks for cfg80211 
    2677 + * 
    2678 + * Copied from cfg.c - originally 
    2679 + * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> 
    2680 + * Copyright 2014      Intel Corporation (Author: Johannes Berg) 
    2681 + * 
    2682 + * This file is GPLv2 as found in COPYING. 
    2683 + */ 
    2684 +#include <linux/types.h> 
    2685 +#include <net/cfg80211.h> 
    2686 +#include "ieee80211_i.h" 
    2687 +#include "sta_info.h" 
    2688 +#include "driver-ops.h" 
    2689 + 
    2690 +static int ieee80211_set_ringparam(struct net_device *dev, 
    2691 +                                  struct ethtool_ringparam *rp) 
    2692 +{ 
    2693 +       struct ieee80211_local *local = wiphy_priv(dev->ieee80211_ptr->wiphy); 
    2694 + 
    2695 +       if (rp->rx_mini_pending != 0 || rp->rx_jumbo_pending != 0) 
    2696 +               return -EINVAL; 
    2697 + 
    2698 +       return drv_set_ringparam(local, rp->tx_pending, rp->rx_pending); 
    2699 +} 
    2700 + 
    2701 +static void ieee80211_get_ringparam(struct net_device *dev, 
    2702 +                                   struct ethtool_ringparam *rp) 
    2703 +{ 
    2704 +       struct ieee80211_local *local = wiphy_priv(dev->ieee80211_ptr->wiphy); 
    2705 + 
    2706 +       memset(rp, 0, sizeof(*rp)); 
    2707 + 
    2708 +       drv_get_ringparam(local, &rp->tx_pending, &rp->tx_max_pending, 
    2709 +                         &rp->rx_pending, &rp->rx_max_pending); 
    2710 +} 
    2711 + 
    2712 +static const char ieee80211_gstrings_sta_stats[][ETH_GSTRING_LEN] = { 
    2713 +       "rx_packets", "rx_bytes", 
    2714 +       "rx_duplicates", "rx_fragments", "rx_dropped", 
    2715 +       "tx_packets", "tx_bytes", "tx_fragments", 
    2716 +       "tx_filtered", "tx_retry_failed", "tx_retries", 
    2717 +       "beacon_loss", "sta_state", "txrate", "rxrate", "signal", 
    2718 +       "channel", "noise", "ch_time", "ch_time_busy", 
    2719 +       "ch_time_ext_busy", "ch_time_rx", "ch_time_tx" 
    2720 +}; 
    2721 +#define STA_STATS_LEN  ARRAY_SIZE(ieee80211_gstrings_sta_stats) 
    2722 + 
    2723 +static int ieee80211_get_sset_count(struct net_device *dev, int sset) 
    2724 +{ 
    2725 +       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 
    2726 +       int rv = 0; 
    2727 + 
    2728 +       if (sset == ETH_SS_STATS) 
    2729 +               rv += STA_STATS_LEN; 
    2730 + 
    2731 +       rv += drv_get_et_sset_count(sdata, sset); 
    2732 + 
    2733 +       if (rv == 0) 
    2734 +               return -EOPNOTSUPP; 
    2735 +       return rv; 
    2736 +} 
    2737 + 
    2738 +static void ieee80211_get_stats(struct net_device *dev, 
    2739 +                               struct ethtool_stats *stats, 
    2740 +                               u64 *data) 
    2741 +{ 
    2742 +       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 
    2743 +       struct ieee80211_chanctx_conf *chanctx_conf; 
    2744 +       struct ieee80211_channel *channel; 
    2745 +       struct sta_info *sta; 
    2746 +       struct ieee80211_local *local = sdata->local; 
    2747 +       struct station_info sinfo; 
    2748 +       struct survey_info survey; 
    2749 +       int i, q; 
    2750 +#define STA_STATS_SURVEY_LEN 7 
    2751 + 
    2752 +       memset(data, 0, sizeof(u64) * STA_STATS_LEN); 
    2753 + 
    2754 +#define ADD_STA_STATS(sta)                             \ 
    2755 +       do {                                            \ 
    2756 +               data[i++] += sta->rx_packets;           \ 
    2757 +               data[i++] += sta->rx_bytes;             \ 
    2758 +               data[i++] += sta->num_duplicates;       \ 
    2759 +               data[i++] += sta->rx_fragments;         \ 
    2760 +               data[i++] += sta->rx_dropped;           \ 
    2761 +                                                       \ 
    2762 +               data[i++] += sinfo.tx_packets;          \ 
    2763 +               data[i++] += sinfo.tx_bytes;            \ 
    2764 +               data[i++] += sta->tx_fragments;         \ 
    2765 +               data[i++] += sta->tx_filtered_count;    \ 
    2766 +               data[i++] += sta->tx_retry_failed;      \ 
    2767 +               data[i++] += sta->tx_retry_count;       \ 
    2768 +               data[i++] += sta->beacon_loss_count;    \ 
    2769 +       } while (0) 
    2770 + 
    2771 +       /* For Managed stations, find the single station based on BSSID 
    2772 +        * and use that.  For interface types, iterate through all available 
    2773 +        * stations and add stats for any station that is assigned to this 
    2774 +        * network device. 
    2775 +        */ 
    2776 + 
    2777 +       mutex_lock(&local->sta_mtx); 
    2778 + 
    2779 +       if (sdata->vif.type == NL80211_IFTYPE_STATION) { 
    2780 +               sta = sta_info_get_bss(sdata, sdata->u.mgd.bssid); 
    2781 + 
    2782 +               if (!(sta && !WARN_ON(sta->sdata->dev != dev))) 
    2783 +                       goto do_survey; 
    2784 + 
    2785 +               sinfo.filled = 0; 
    2786 +               sta_set_sinfo(sta, &sinfo); 
    2787 + 
    2788 +               i = 0; 
    2789 +               ADD_STA_STATS(sta); 
    2790 + 
    2791 +               data[i++] = sta->sta_state; 
    2792 + 
    2793 + 
    2794 +               if (sinfo.filled & STATION_INFO_TX_BITRATE) 
    2795 +                       data[i] = 100000 * 
    2796 +                               cfg80211_calculate_bitrate(&sinfo.txrate); 
    2797 +               i++; 
    2798 +               if (sinfo.filled & STATION_INFO_RX_BITRATE) 
    2799 +                       data[i] = 100000 * 
    2800 +                               cfg80211_calculate_bitrate(&sinfo.rxrate); 
    2801 +               i++; 
    2802 + 
    2803 +               if (sinfo.filled & STATION_INFO_SIGNAL_AVG) 
    2804 +                       data[i] = (u8)sinfo.signal_avg; 
    2805 +               i++; 
    2806 +       } else { 
    2807 +               list_for_each_entry(sta, &local->sta_list, list) { 
    2808 +                       /* Make sure this station belongs to the proper dev */ 
    2809 +                       if (sta->sdata->dev != dev) 
    2810 +                               continue; 
    2811 + 
    2812 +                       sinfo.filled = 0; 
    2813 +                       sta_set_sinfo(sta, &sinfo); 
    2814 +                       i = 0; 
    2815 +                       ADD_STA_STATS(sta); 
    2816 +               } 
    2817 +       } 
    2818 + 
    2819 +do_survey: 
    2820 +       i = STA_STATS_LEN - STA_STATS_SURVEY_LEN; 
    2821 +       /* Get survey stats for current channel */ 
    2822 +       survey.filled = 0; 
    2823 + 
    2824 +       rcu_read_lock(); 
    2825 +       chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 
    2826 +       if (chanctx_conf) 
    2827 +               channel = chanctx_conf->def.chan; 
    2828 +       else 
    2829 +               channel = NULL; 
    2830 +       rcu_read_unlock(); 
    2831 + 
    2832 +       if (channel) { 
    2833 +               q = 0; 
    2834 +               do { 
    2835 +                       survey.filled = 0; 
    2836 +                       if (drv_get_survey(local, q, &survey) != 0) { 
    2837 +                               survey.filled = 0; 
    2838 +                               break; 
    2839 +                       } 
    2840 +                       q++; 
    2841 +               } while (channel != survey.channel); 
    2842 +       } 
    2843 + 
    2844 +       if (survey.filled) 
    2845 +               data[i++] = survey.channel->center_freq; 
    2846 +       else 
    2847 +               data[i++] = 0; 
    2848 +       if (survey.filled & SURVEY_INFO_NOISE_DBM) 
    2849 +               data[i++] = (u8)survey.noise; 
    2850 +       else 
    2851 +               data[i++] = -1LL; 
    2852 +       if (survey.filled & SURVEY_INFO_CHANNEL_TIME) 
    2853 +               data[i++] = survey.channel_time; 
    2854 +       else 
    2855 +               data[i++] = -1LL; 
    2856 +       if (survey.filled & SURVEY_INFO_CHANNEL_TIME_BUSY) 
    2857 +               data[i++] = survey.channel_time_busy; 
    2858 +       else 
    2859 +               data[i++] = -1LL; 
    2860 +       if (survey.filled & SURVEY_INFO_CHANNEL_TIME_EXT_BUSY) 
    2861 +               data[i++] = survey.channel_time_ext_busy; 
    2862 +       else 
    2863 +               data[i++] = -1LL; 
    2864 +       if (survey.filled & SURVEY_INFO_CHANNEL_TIME_RX) 
    2865 +               data[i++] = survey.channel_time_rx; 
    2866 +       else 
    2867 +               data[i++] = -1LL; 
    2868 +       if (survey.filled & SURVEY_INFO_CHANNEL_TIME_TX) 
    2869 +               data[i++] = survey.channel_time_tx; 
    2870 +       else 
    2871 +               data[i++] = -1LL; 
    2872 + 
    2873 +       mutex_unlock(&local->sta_mtx); 
    2874 + 
    2875 +       if (WARN_ON(i != STA_STATS_LEN)) 
    2876 +               return; 
    2877 + 
    2878 +       drv_get_et_stats(sdata, stats, &(data[STA_STATS_LEN])); 
    2879 +} 
    2880 + 
    2881 +static void ieee80211_get_strings(struct net_device *dev, u32 sset, u8 *data) 
    2882 +{ 
    2883 +       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 
    2884 +       int sz_sta_stats = 0; 
    2885 + 
    2886 +       if (sset == ETH_SS_STATS) { 
    2887 +               sz_sta_stats = sizeof(ieee80211_gstrings_sta_stats); 
    2888 +               memcpy(data, ieee80211_gstrings_sta_stats, sz_sta_stats); 
    2889 +       } 
    2890 +       drv_get_et_strings(sdata, sset, &(data[sz_sta_stats])); 
    2891 +} 
    2892 + 
    2893 +static int ieee80211_get_regs_len(struct net_device *dev) 
    2894 +{ 
    2895 +       return 0; 
    2896 +} 
    2897 + 
    2898 +static void ieee80211_get_regs(struct net_device *dev, 
    2899 +                              struct ethtool_regs *regs, 
    2900 +                              void *data) 
    2901 +{ 
    2902 +       struct wireless_dev *wdev = dev->ieee80211_ptr; 
    2903 + 
    2904 +       regs->version = wdev->wiphy->hw_version; 
    2905 +       regs->len = 0; 
    2906 +} 
    2907 + 
    2908 +const struct ethtool_ops ieee80211_ethtool_ops = { 
    2909 +       .get_drvinfo = cfg80211_get_drvinfo, 
    2910 +       .get_regs_len = ieee80211_get_regs_len, 
    2911 +       .get_regs = ieee80211_get_regs, 
    2912 +       .get_link = ethtool_op_get_link, 
    2913 +       .get_ringparam = ieee80211_get_ringparam, 
    2914 +       .set_ringparam = ieee80211_set_ringparam, 
    2915 +       .get_strings = ieee80211_get_strings, 
    2916 +       .get_ethtool_stats = ieee80211_get_stats, 
    2917 +       .get_sset_count = ieee80211_get_sset_count, 
    2918 +}; 
    2919 --- a/net/mac80211/ibss.c 
    2920 +++ b/net/mac80211/ibss.c 
    2921 @@ -143,7 +143,7 @@ ieee80211_ibss_build_presp(struct ieee80 
    2922                 *pos++ = csa_settings->block_tx ? 1 : 0; 
    2923                 *pos++ = ieee80211_frequency_to_channel( 
    2924                                 csa_settings->chandef.chan->center_freq); 
    2925 -               sdata->csa_counter_offset_beacon[0] = (pos - presp->head); 
    2926 +               presp->csa_counter_offsets[0] = (pos - presp->head); 
    2927                 *pos++ = csa_settings->count; 
    2928         } 
    2929   
    2930 @@ -1677,6 +1677,7 @@ int ieee80211_ibss_join(struct ieee80211 
    2931         sdata->u.ibss.control_port = params->control_port; 
    2932         sdata->u.ibss.userspace_handles_dfs = params->userspace_handles_dfs; 
    2933         sdata->u.ibss.basic_rates = params->basic_rates; 
    2934 +       sdata->u.ibss.last_scan_completed = jiffies; 
    2935   
    2936         /* fix basic_rates if channel does not support these rates */ 
    2937         rate_flags = ieee80211_chandef_rate_flags(&params->chandef); 
    2938 --- a/net/mac80211/mesh.c 
    2939 +++ b/net/mac80211/mesh.c 
    2940 @@ -679,7 +679,7 @@ ieee80211_mesh_build_beacon(struct ieee8 
    2941                 *pos++ = 0x0; 
    2942                 *pos++ = ieee80211_frequency_to_channel( 
    2943                                 csa->settings.chandef.chan->center_freq); 
    2944 -               sdata->csa_counter_offset_beacon[0] = hdr_len + 6; 
    2945 +               bcn->csa_counter_offsets[0] = hdr_len + 6; 
    2946                 *pos++ = csa->settings.count; 
    2947                 *pos++ = WLAN_EID_CHAN_SWITCH_PARAM; 
    2948                 *pos++ = 6; 
    2949 --- a/net/wireless/genregdb.awk 
    2950 +++ b/net/wireless/genregdb.awk 
    2951 @@ -65,17 +65,7 @@ function parse_reg_rule() 
    2952         sub(/,/, "", units) 
    2953         dfs_cac = $9 
    2954         if (units == "mW") { 
    2955 -               if (power == 100) { 
    2956 -                       power = 20 
    2957 -               } else if (power == 200) { 
    2958 -                       power = 23 
    2959 -               } else if (power == 500) { 
    2960 -                       power = 27 
    2961 -               } else if (power == 1000) { 
    2962 -                       power = 30 
    2963 -               } else { 
    2964 -                       print "Unknown power value in database!" 
    2965 -               } 
    2966 +               power = 10 * log(power)/log(10) 
    2967         } else { 
    2968                 dfs_cac = $8 
    2969         } 
    2970 @@ -114,7 +104,7 @@ function parse_reg_rule() 
    2971   
    2972         } 
    2973         flags = flags "0" 
    2974 -       printf "\t\tREG_RULE_EXT(%d, %d, %d, %d, %d, %d, %s),\n", start, end, bw, gain, power, dfs_cac, flags 
    2975 +       printf "\t\tREG_RULE_EXT(%d, %d, %d, %d, %.0f, %d, %s),\n", start, end, bw, gain, power, dfs_cac, flags 
    2976         rules++ 
    2977  } 
    2978   
    2979 --- a/net/mac80211/debugfs_netdev.c 
    2980 +++ b/net/mac80211/debugfs_netdev.c 
    2981 @@ -34,8 +34,7 @@ static ssize_t ieee80211_if_read( 
    2982         ssize_t ret = -EINVAL; 
    2983   
    2984         read_lock(&dev_base_lock); 
    2985 -       if (sdata->dev->reg_state == NETREG_REGISTERED) 
    2986 -               ret = (*format)(sdata, buf, sizeof(buf)); 
    2987 +       ret = (*format)(sdata, buf, sizeof(buf)); 
    2988         read_unlock(&dev_base_lock); 
    2989   
    2990         if (ret >= 0) 
    2991 @@ -62,8 +61,7 @@ static ssize_t ieee80211_if_write( 
    2992   
    2993         ret = -ENODEV; 
    2994         rtnl_lock(); 
    2995 -       if (sdata->dev->reg_state == NETREG_REGISTERED) 
    2996 -               ret = (*write)(sdata, buf, count); 
    2997 +       ret = (*write)(sdata, buf, count); 
    2998         rtnl_unlock(); 
    2999   
    3000         return ret; 
    3001 --- a/drivers/net/wireless/b43/xmit.c 
    3002 +++ b/drivers/net/wireless/b43/xmit.c 
    3003 @@ -811,9 +811,13 @@ void b43_rx(struct b43_wldev *dev, struc 
    3004                 break; 
    3005         case B43_PHYTYPE_G: 
    3006                 status.band = IEEE80211_BAND_2GHZ; 
    3007 -               /* chanid is the radio channel cookie value as used 
    3008 -                * to tune the radio. */ 
    3009 -               status.freq = chanid + 2400; 
    3010 +               /* Somewhere between 478.104 and 508.1084 firmware for G-PHY 
    3011 +                * has been modified to be compatible with N-PHY and others. 
    3012 +                */ 
    3013 +               if (dev->fw.rev >= 508) 
    3014 +                       status.freq = ieee80211_channel_to_frequency(chanid, status.band); 
    3015 +               else 
    3016 +                       status.freq = chanid + 2400; 
    3017                 break; 
    3018         case B43_PHYTYPE_N: 
    3019         case B43_PHYTYPE_LP: 
    3020 --- a/drivers/net/wireless/b43/main.c 
    3021 +++ b/drivers/net/wireless/b43/main.c 
    3022 @@ -5216,6 +5216,7 @@ static int b43_wireless_core_attach(stru 
    3023         /* We don't support 5 GHz on some PHYs yet */ 
    3024         switch (dev->phy.type) { 
    3025         case B43_PHYTYPE_A: 
    3026 +       case B43_PHYTYPE_G: 
    3027         case B43_PHYTYPE_N: 
    3028         case B43_PHYTYPE_LP: 
    3029         case B43_PHYTYPE_HT: 
    3030 --- a/net/wireless/reg.c 
    3031 +++ b/net/wireless/reg.c 
    3032 @@ -935,7 +935,7 @@ freq_reg_info_regd(struct wiphy *wiphy,  
    3033                 if (!band_rule_found) 
    3034                         band_rule_found = freq_in_rule_band(fr, center_freq); 
    3035   
    3036 -               bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(5)); 
    3037 +               bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(20)); 
    3038   
    3039                 if (band_rule_found && bw_fits) 
    3040                         return rr; 
    3041 @@ -1019,10 +1019,10 @@ static void chan_reg_rule_print_dbg(cons 
    3042  } 
    3043  #endif 
    3044   
    3045 -/* Find an ieee80211_reg_rule such that a 5MHz channel with frequency 
    3046 - * chan->center_freq fits there. 
    3047 - * If there is no such reg_rule, disable the channel, otherwise set the 
    3048 - * flags corresponding to the bandwidths allowed in the particular reg_rule 
    3049 +/* 
    3050 + * Note that right now we assume the desired channel bandwidth 
    3051 + * is always 20 MHz for each individual channel (HT40 uses 20 MHz 
    3052 + * per channel, the primary and the extension channel). 
    3053   */ 
    3054  static void handle_channel(struct wiphy *wiphy, 
    3055                            enum nl80211_reg_initiator initiator, 
    3056 @@ -1083,12 +1083,8 @@ static void handle_channel(struct wiphy  
    3057         if (reg_rule->flags & NL80211_RRF_AUTO_BW) 
    3058                 max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule); 
    3059   
    3060 -       if (max_bandwidth_khz < MHZ_TO_KHZ(10)) 
    3061 -               bw_flags = IEEE80211_CHAN_NO_10MHZ; 
    3062 -       if (max_bandwidth_khz < MHZ_TO_KHZ(20)) 
    3063 -               bw_flags |= IEEE80211_CHAN_NO_20MHZ; 
    3064         if (max_bandwidth_khz < MHZ_TO_KHZ(40)) 
    3065 -               bw_flags |= IEEE80211_CHAN_NO_HT40; 
    3066 +               bw_flags = IEEE80211_CHAN_NO_HT40; 
    3067         if (max_bandwidth_khz < MHZ_TO_KHZ(80)) 
    3068                 bw_flags |= IEEE80211_CHAN_NO_80MHZ; 
    3069         if (max_bandwidth_khz < MHZ_TO_KHZ(160)) 
    3070 @@ -1522,12 +1518,8 @@ static void handle_channel_custom(struct 
    3071         if (reg_rule->flags & NL80211_RRF_AUTO_BW) 
    3072                 max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule); 
    3073   
    3074 -       if (max_bandwidth_khz < MHZ_TO_KHZ(10)) 
    3075 -               bw_flags = IEEE80211_CHAN_NO_10MHZ; 
    3076 -       if (max_bandwidth_khz < MHZ_TO_KHZ(20)) 
    3077 -               bw_flags |= IEEE80211_CHAN_NO_20MHZ; 
    3078         if (max_bandwidth_khz < MHZ_TO_KHZ(40)) 
    3079 -               bw_flags |= IEEE80211_CHAN_NO_HT40; 
    3080 +               bw_flags = IEEE80211_CHAN_NO_HT40; 
    3081         if (max_bandwidth_khz < MHZ_TO_KHZ(80)) 
    3082                 bw_flags |= IEEE80211_CHAN_NO_80MHZ; 
    3083         if (max_bandwidth_khz < MHZ_TO_KHZ(160)) 
    3084 --- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    3085 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3086 @@ -185,7 +185,8 @@ struct ath_atx_ac { 
    3087   
    3088  struct ath_frame_info { 
    3089         struct ath_buf *bf; 
    3090 -       int framelen; 
    3091 +       u16 framelen; 
    3092 +       s8 txq; 
    3093         enum ath9k_key_type keytype; 
    3094         u8 keyix; 
    3095         u8 rtscts_rate; 
    3096 --- a/drivers/net/wireless/ath/ath9k/xmit.c 
    3097 +++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    3098 @@ -147,15 +147,13 @@ static void ath_set_rates(struct ieee802 
    3099  static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, 
    3100                              struct sk_buff *skb) 
    3101  { 
    3102 -       int q; 
    3103 - 
    3104 -       q = skb_get_queue_mapping(skb); 
    3105 -       if (txq == sc->tx.uapsdq) 
    3106 -               txq = sc->tx.txq_map[q]; 
    3107 +       struct ath_frame_info *fi = get_frame_info(skb); 
    3108 +       int q = fi->txq; 
    3109   
    3110 -       if (txq != sc->tx.txq_map[q]) 
    3111 +       if (q < 0) 
    3112                 return; 
    3113   
    3114 +       txq = sc->tx.txq_map[q]; 
    3115         if (WARN_ON(--txq->pending_frames < 0)) 
    3116                 txq->pending_frames = 0; 
    3117   
    3118 @@ -887,6 +885,15 @@ ath_tx_get_tid_subframe(struct ath_softc 
    3119   
    3120                 tx_info = IEEE80211_SKB_CB(skb); 
    3121                 tx_info->flags &= ~IEEE80211_TX_CTL_CLEAR_PS_FILT; 
    3122 + 
    3123 +               /* 
    3124 +                * No aggregation session is running, but there may be frames 
    3125 +                * from a previous session or a failed attempt in the queue. 
    3126 +                * Send them out as normal data frames 
    3127 +                */ 
    3128 +               if (!tid->active) 
    3129 +                       tx_info->flags &= ~IEEE80211_TX_CTL_AMPDU; 
    3130 + 
    3131                 if (!(tx_info->flags & IEEE80211_TX_CTL_AMPDU)) { 
    3132                         bf->bf_state.bf_type = 0; 
    3133                         return bf; 
    3134 @@ -1999,6 +2006,7 @@ static void setup_frame_info(struct ieee 
    3135                 an = (struct ath_node *) sta->drv_priv; 
    3136   
    3137         memset(fi, 0, sizeof(*fi)); 
    3138 +       fi->txq = -1; 
    3139         if (hw_key) 
    3140                 fi->keyix = hw_key->hw_key_idx; 
    3141         else if (an && ieee80211_is_data(hdr->frame_control) && an->ps_key > 0) 
    3142 @@ -2150,6 +2158,7 @@ int ath_tx_start(struct ieee80211_hw *hw 
    3143         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
    3144         struct ieee80211_sta *sta = txctl->sta; 
    3145         struct ieee80211_vif *vif = info->control.vif; 
    3146 +       struct ath_frame_info *fi = get_frame_info(skb); 
    3147         struct ath_softc *sc = hw->priv; 
    3148         struct ath_txq *txq = txctl->txq; 
    3149         struct ath_atx_tid *tid = NULL; 
    3150 @@ -2170,11 +2179,13 @@ int ath_tx_start(struct ieee80211_hw *hw 
    3151         q = skb_get_queue_mapping(skb); 
    3152   
    3153         ath_txq_lock(sc, txq); 
    3154 -       if (txq == sc->tx.txq_map[q] && 
    3155 -           ++txq->pending_frames > sc->tx.txq_max_pending[q] && 
    3156 -           !txq->stopped) { 
    3157 -               ieee80211_stop_queue(sc->hw, q); 
    3158 -               txq->stopped = true; 
    3159 +       if (txq == sc->tx.txq_map[q]) { 
    3160 +               fi->txq = q; 
    3161 +               if (++txq->pending_frames > sc->tx.txq_max_pending[q] && 
    3162 +                   !txq->stopped) { 
    3163 +                       ieee80211_stop_queue(sc->hw, q); 
    3164 +                       txq->stopped = true; 
    3165 +               } 
    3166         } 
    3167   
    3168         if (txctl->an && ieee80211_is_data_present(hdr->frame_control)) 
    3169 --- a/net/mac80211/chan.c 
    3170 +++ b/net/mac80211/chan.c 
    3171 @@ -521,6 +521,8 @@ static void ieee80211_recalc_chanctx_cha 
    3172                         continue; 
    3173                 if (rcu_access_pointer(sdata->vif.chanctx_conf) != conf) 
    3174                         continue; 
    3175 +               if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 
    3176 +                       continue; 
    3177   
    3178                 if (!compat) 
    3179                         compat = &sdata->vif.bss_conf.chandef; 
    3180 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    3181 +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    3182 @@ -1004,9 +1004,11 @@ static bool ar5008_hw_ani_control_new(st 
    3183         case ATH9K_ANI_FIRSTEP_LEVEL:{ 
    3184                 u32 level = param; 
    3185   
    3186 -               value = level; 
    3187 +               value = level * 2; 
    3188                 REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, 
    3189                               AR_PHY_FIND_SIG_FIRSTEP, value); 
    3190 +               REG_RMW_FIELD(ah, AR_PHY_FIND_SIG_LOW, 
    3191 +                             AR_PHY_FIND_SIG_FIRSTEP_LOW, value); 
    3192   
    3193                 if (level != aniState->firstepLevel) { 
    3194                         ath_dbg(common, ANI, 
    3195 @@ -1040,9 +1042,8 @@ static bool ar5008_hw_ani_control_new(st 
    3196                 REG_RMW_FIELD(ah, AR_PHY_TIMING5, 
    3197                               AR_PHY_TIMING5_CYCPWR_THR1, value); 
    3198   
    3199 -               if (IS_CHAN_HT40(ah->curchan)) 
    3200 -                       REG_RMW_FIELD(ah, AR_PHY_EXT_CCA, 
    3201 -                                     AR_PHY_EXT_TIMING5_CYCPWR_THR1, value); 
    3202 +               REG_RMW_FIELD(ah, AR_PHY_EXT_CCA, 
    3203 +                                 AR_PHY_EXT_TIMING5_CYCPWR_THR1, value - 1); 
    3204   
    3205                 if (level != aniState->spurImmunityLevel) { 
    3206                         ath_dbg(common, ANI, 
    3207 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
    3208 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
    3209 @@ -517,6 +517,23 @@ static void ar9003_hw_spur_mitigate(stru 
    3210         ar9003_hw_spur_mitigate_ofdm(ah, chan); 
    3211  } 
    3212   
    3213 +static u32 ar9003_hw_compute_pll_control_soc(struct ath_hw *ah, 
    3214 +                                            struct ath9k_channel *chan) 
    3215 +{ 
    3216 +       u32 pll; 
    3217 + 
    3218 +       pll = SM(0x5, AR_RTC_9300_SOC_PLL_REFDIV); 
    3219 + 
    3220 +       if (chan && IS_CHAN_HALF_RATE(chan)) 
    3221 +               pll |= SM(0x1, AR_RTC_9300_SOC_PLL_CLKSEL); 
    3222 +       else if (chan && IS_CHAN_QUARTER_RATE(chan)) 
    3223 +               pll |= SM(0x2, AR_RTC_9300_SOC_PLL_CLKSEL); 
    3224 + 
    3225 +       pll |= SM(0x2c, AR_RTC_9300_SOC_PLL_DIV_INT); 
    3226 + 
    3227 +       return pll; 
    3228 +} 
    3229 + 
    3230  static u32 ar9003_hw_compute_pll_control(struct ath_hw *ah, 
    3231                                          struct ath9k_channel *chan) 
    3232  { 
    3233 @@ -1779,7 +1796,12 @@ void ar9003_hw_attach_phy_ops(struct ath 
    3234   
    3235         priv_ops->rf_set_freq = ar9003_hw_set_channel; 
    3236         priv_ops->spur_mitigate_freq = ar9003_hw_spur_mitigate; 
    3237 -       priv_ops->compute_pll_control = ar9003_hw_compute_pll_control; 
    3238 + 
    3239 +       if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah)) 
    3240 +               priv_ops->compute_pll_control = ar9003_hw_compute_pll_control_soc; 
    3241 +       else 
    3242 +               priv_ops->compute_pll_control = ar9003_hw_compute_pll_control; 
    3243 + 
    3244         priv_ops->set_channel_regs = ar9003_hw_set_channel_regs; 
    3245         priv_ops->init_bb = ar9003_hw_init_bb; 
    3246         priv_ops->process_ini = ar9003_hw_process_ini; 
    3247 --- a/drivers/net/wireless/ath/ath9k/hw.c 
    3248 +++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3249 @@ -702,6 +702,8 @@ static void ath9k_hw_init_pll(struct ath 
    3250  { 
    3251         u32 pll; 
    3252   
    3253 +       pll = ath9k_hw_compute_pll_control(ah, chan); 
    3254 + 
    3255         if (AR_SREV_9485(ah) || AR_SREV_9565(ah)) { 
    3256                 /* program BB PLL ki and kd value, ki=0x4, kd=0x40 */ 
    3257                 REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2, 
    3258 @@ -752,7 +754,8 @@ static void ath9k_hw_init_pll(struct ath 
    3259                 REG_RMW_FIELD(ah, AR_CH0_DDR_DPLL3, 
    3260                               AR_CH0_DPLL3_PHASE_SHIFT, 0x1); 
    3261   
    3262 -               REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c); 
    3263 +               REG_WRITE(ah, AR_RTC_PLL_CONTROL, 
    3264 +                         pll | AR_RTC_9300_PLL_BYPASS); 
    3265                 udelay(1000); 
    3266   
    3267                 /* program refdiv, nint, frac to RTC register */ 
    3268 @@ -768,7 +771,8 @@ static void ath9k_hw_init_pll(struct ath 
    3269         } else if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah)) { 
    3270                 u32 regval, pll2_divint, pll2_divfrac, refdiv; 
    3271   
    3272 -               REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c); 
    3273 +               REG_WRITE(ah, AR_RTC_PLL_CONTROL, 
    3274 +                         pll | AR_RTC_9300_SOC_PLL_BYPASS); 
    3275                 udelay(1000); 
    3276   
    3277                 REG_SET_BIT(ah, AR_PHY_PLL_MODE, 0x1 << 16); 
    3278 @@ -840,7 +844,6 @@ static void ath9k_hw_init_pll(struct ath 
    3279                 udelay(1000); 
    3280         } 
    3281   
    3282 -       pll = ath9k_hw_compute_pll_control(ah, chan); 
    3283         if (AR_SREV_9565(ah)) 
    3284                 pll |= 0x40000; 
    3285         REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); 
    3286 --- a/drivers/net/wireless/ath/ath9k/reg.h 
    3287 +++ b/drivers/net/wireless/ath/ath9k/reg.h 
    3288 @@ -1236,12 +1236,23 @@ enum { 
    3289  #define AR_CH0_DPLL3_PHASE_SHIFT_S   23 
    3290  #define AR_PHY_CCA_NOM_VAL_2GHZ      -118 
    3291   
    3292 +#define AR_RTC_9300_SOC_PLL_DIV_INT          0x0000003f 
    3293 +#define AR_RTC_9300_SOC_PLL_DIV_INT_S        0 
    3294 +#define AR_RTC_9300_SOC_PLL_DIV_FRAC         0x000fffc0 
    3295 +#define AR_RTC_9300_SOC_PLL_DIV_FRAC_S       6 
    3296 +#define AR_RTC_9300_SOC_PLL_REFDIV           0x01f00000 
    3297 +#define AR_RTC_9300_SOC_PLL_REFDIV_S         20 
    3298 +#define AR_RTC_9300_SOC_PLL_CLKSEL           0x06000000 
    3299 +#define AR_RTC_9300_SOC_PLL_CLKSEL_S         25 
    3300 +#define AR_RTC_9300_SOC_PLL_BYPASS           0x08000000 
    3301 + 
    3302  #define AR_RTC_9300_PLL_DIV          0x000003ff 
    3303  #define AR_RTC_9300_PLL_DIV_S        0 
    3304  #define AR_RTC_9300_PLL_REFDIV       0x00003C00 
    3305  #define AR_RTC_9300_PLL_REFDIV_S     10 
    3306  #define AR_RTC_9300_PLL_CLKSEL       0x0000C000 
    3307  #define AR_RTC_9300_PLL_CLKSEL_S     14 
    3308 +#define AR_RTC_9300_PLL_BYPASS       0x00010000 
    3309   
    3310  #define AR_RTC_9160_PLL_DIV    0x000003ff 
    3311  #define AR_RTC_9160_PLL_DIV_S   0 
    3312 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
    3313 +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
    3314 @@ -978,7 +978,7 @@ static bool ath9k_rx_prepare(struct ath9 
    3315         struct ath_hw *ah = common->ah; 
    3316         struct ath_htc_rx_status *rxstatus; 
    3317         struct ath_rx_status rx_stats; 
    3318 -       bool decrypt_error; 
    3319 +       bool decrypt_error = false; 
    3320   
    3321         if (skb->len < HTC_RX_FRAME_HEADER_SIZE) { 
    3322                 ath_err(common, "Corrupted RX frame, dropping (len: %d)\n", 
     390        char name[ATH5K_LED_MAX_NAME_LEN + 1]; 
     391        const struct pci_device_id *match; 
     392  
     393        if (!ah->pdev) 
     394                return 0; 
     395  
     396+#ifdef CONFIG_ATHEROS_AR231X 
     397+       match = NULL; 
     398+#else 
     399        match = pci_match_id(&ath5k_led_devices[0], pdev); 
     400+#endif 
     401        if (match) { 
     402                __set_bit(ATH_STAT_LEDSOFT, ah->status); 
     403                ah->led_pin = ATH_PIN(match->driver_data); 
     404--- a/drivers/net/wireless/ath/ath5k/debug.c 
     405+++ b/drivers/net/wireless/ath/ath5k/debug.c 
     406@@ -65,6 +65,7 @@ 
     407  
     408 #include <linux/seq_file.h> 
     409 #include <linux/list.h> 
     410+#include <linux/vmalloc.h> 
     411 #include "debug.h" 
     412 #include "ath5k.h" 
     413 #include "reg.h" 
  • trunk/package/kernel/mac80211/patches/310-ap_scan.patch

    r41018 r42683  
    11--- a/net/mac80211/cfg.c 
    22+++ b/net/mac80211/cfg.c 
    3 @@ -1903,7 +1903,7 @@ static int ieee80211_scan(struct wiphy * 
     3@@ -1895,7 +1895,7 @@ static int ieee80211_scan(struct wiphy * 
    44                 * the  frames sent while scanning on other channel will be 
    55                 * lost) 
  • trunk/package/kernel/mac80211/patches/400-ath_move_debug_code.patch

    r40393 r42683  
    1313--- a/drivers/net/wireless/ath/ath.h 
    1414+++ b/drivers/net/wireless/ath/ath.h 
    15 @@ -295,13 +295,6 @@ void _ath_dbg(struct ath_common *common, 
     15@@ -299,13 +299,6 @@ void _ath_dbg(struct ath_common *common, 
    1616 #endif /* CPTCFG_ATH_DEBUG */ 
    1717  
  • trunk/package/kernel/mac80211/patches/403-ath_regd_optional.patch

    r40800 r42683  
    5959--- a/.local-symbols 
    6060+++ b/.local-symbols 
    61 @@ -116,6 +116,7 @@ RTL8187_LEDS= 
     61@@ -112,6 +112,7 @@ RTL8187_LEDS= 
    6262 ATH_COMMON= 
    6363 ATH_CARDS= 
  • trunk/package/kernel/mac80211/patches/405-regd_no_assoc_hints.patch

    r41298 r42683  
    11--- a/net/wireless/reg.c 
    22+++ b/net/wireless/reg.c 
    3 @@ -2072,6 +2072,8 @@ void regulatory_hint_country_ie(struct w 
     3@@ -2112,6 +2112,8 @@ void regulatory_hint_country_ie(struct w 
    44        enum environment_cap env = ENVIRON_ANY; 
    55        struct regulatory_request *request = NULL, *lr; 
     
    1010        if (country_ie_len & 0x01) 
    1111                return; 
    12 @@ -2268,6 +2270,7 @@ static void restore_regulatory_settings( 
     12@@ -2308,6 +2310,7 @@ static void restore_regulatory_settings( 
    1313  
    1414 void regulatory_hint_disconnect(void) 
  • trunk/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

    r40800 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -655,6 +655,7 @@ static const struct ieee80211_iface_limi 
     3@@ -670,6 +670,7 @@ static const struct ieee80211_iface_limi 
    44                                 BIT(NL80211_IFTYPE_AP) }, 
    55        { .max = 1,     .types = BIT(NL80211_IFTYPE_P2P_CLIENT) | 
     
    88 }; 
    99  
    10  static const struct ieee80211_iface_limit if_dfs_limits[] = { 
     10 static const struct ieee80211_iface_limit wds_limits[] = { 
  • trunk/package/kernel/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch

    r40393 r42683  
    1919--- a/drivers/net/wireless/ath/ath5k/base.c 
    2020+++ b/drivers/net/wireless/ath/ath5k/base.c 
    21 @@ -1937,7 +1937,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
     21@@ -1962,7 +1962,7 @@ ath5k_beacon_send(struct ath5k_hw *ah) 
    2222        } 
    2323  
     
    2828                u64 tsf = ath5k_hw_get_tsf64(ah); 
    2929                u32 tsftu = TSF_TO_TU(tsf); 
    30 @@ -2023,7 +2023,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
     30@@ -2048,7 +2048,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
    3131  
    3232        intval = ah->bintval & AR5K_BEACON_PERIOD; 
     
    3737                if (intval < 15) 
    3838                        ATH5K_WARN(ah, "intval %u is too low, min 15\n", 
    39 @@ -2490,6 +2490,7 @@ static const struct ieee80211_iface_limi 
     39@@ -2515,6 +2515,7 @@ static const struct ieee80211_iface_limi 
    4040                                 BIT(NL80211_IFTYPE_MESH_POINT) | 
    4141 #endif 
  • trunk/package/kernel/mac80211/patches/432-ath5k_add_pciids.patch

    r37007 r42683  
    11--- a/drivers/net/wireless/ath/ath5k/pci.c 
    22+++ b/drivers/net/wireless/ath/ath5k/pci.c 
    3 @@ -48,6 +48,8 @@ static DEFINE_PCI_DEVICE_TABLE(ath5k_pci 
     3@@ -48,6 +48,8 @@ static const struct pci_device_id ath5k_ 
    44        { PCI_VDEVICE(ATHEROS, 0x001b) }, /* 5413 Eagle */ 
    55        { PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */ 
  • trunk/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch

    r39758 r42683  
    1212--- a/drivers/net/wireless/ath/ath5k/debug.c 
    1313+++ b/drivers/net/wireless/ath/ath5k/debug.c 
    14 @@ -821,6 +821,97 @@ static const struct file_operations fops 
     14@@ -822,6 +822,97 @@ static const struct file_operations fops 
    1515        .llseek = default_llseek, 
    1616 }; 
     
    110110 /* debugfs: queues etc */ 
    111111  
    112 @@ -914,6 +1005,9 @@ ath5k_debug_init_device(struct ath5k_hw  
     112@@ -1009,6 +1100,9 @@ ath5k_debug_init_device(struct ath5k_hw  
    113113        debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah, 
    114114                            &fops_beacon); 
     
    122122--- a/drivers/net/wireless/ath/ath5k/ath5k.h 
    123123+++ b/drivers/net/wireless/ath/ath5k/ath5k.h 
    124 @@ -1369,6 +1369,7 @@ struct ath5k_hw { 
     124@@ -1370,6 +1370,7 @@ struct ath5k_hw { 
    125125        u8                      ah_coverage_class; 
    126126        bool                    ah_ack_bitrate_high; 
  • trunk/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch

    r40800 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1289,6 +1289,53 @@ void ath9k_deinit_debug(struct ath_softc 
     3@@ -1318,6 +1318,53 @@ void ath9k_deinit_debug(struct ath_softc 
    44        ath9k_spectral_deinit_debug(sc); 
    55 } 
     
    5555 { 
    5656        struct ath_common *common = ath9k_hw_common(ah); 
    57 @@ -1308,6 +1355,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     57@@ -1337,6 +1384,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5858        ath9k_tx99_init_debug(sc); 
    5959        ath9k_spectral_init_debug(sc); 
  • trunk/package/kernel/mac80211/patches/501-ath9k-eeprom_endianess.patch

    r40393 r42683  
    7272--- a/drivers/net/wireless/ath/ath9k/hw.h 
    7373+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    74 @@ -724,6 +724,7 @@ enum ath_cal_list { 
     74@@ -725,6 +725,7 @@ enum ath_cal_list { 
    7575 #define AH_USE_EEPROM   0x1 
    7676 #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */ 
     
    8282--- a/drivers/net/wireless/ath/ath9k/init.c 
    8383+++ b/drivers/net/wireless/ath/ath9k/init.c 
    84 @@ -518,6 +518,8 @@ static int ath9k_init_softc(u16 devid, s 
     84@@ -528,6 +528,8 @@ static int ath9k_init_softc(u16 devid, s 
    8585                ah->is_clk_25mhz = pdata->is_clk_25mhz; 
    8686                ah->get_mac_revision = pdata->get_mac_revision; 
  • trunk/package/kernel/mac80211/patches/502-ath9k_ahb_init.patch

    r40800 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/init.c 
    22+++ b/drivers/net/wireless/ath/ath9k/init.c 
    3 @@ -904,23 +904,23 @@ static int __init ath9k_init(void) 
     3@@ -976,23 +976,23 @@ static int __init ath9k_init(void) 
    44 { 
    55        int error; 
  • trunk/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch

    r40393 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -89,7 +89,7 @@ int ath_descdma_setup(struct ath_softc * 
     3@@ -88,7 +88,7 @@ int ath_descdma_setup(struct ath_softc * 
    44                (_l) &= ((_sz) - 1);            \ 
    55        } while (0) 
  • trunk/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch

    r40800 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1336,6 +1336,52 @@ static const struct file_operations fops 
     3@@ -1365,6 +1365,52 @@ static const struct file_operations fops 
    44        .owner = THIS_MODULE 
    55 }; 
     
    5454 { 
    5555        struct ath_common *common = ath9k_hw_common(ah); 
    56 @@ -1357,6 +1403,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     56@@ -1386,6 +1432,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5757  
    5858        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, 
     
    6565--- a/drivers/net/wireless/ath/ath.h 
    6666+++ b/drivers/net/wireless/ath/ath.h 
    67 @@ -140,6 +140,7 @@ struct ath_common { 
     67@@ -141,6 +141,7 @@ struct ath_common { 
    6868        int debug_mask; 
    6969        enum ath_device_state state; 
  • trunk/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch

    r40800 r42683  
    1111--- a/drivers/net/wireless/ath/ath9k/hw.h 
    1212+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    13 @@ -34,6 +34,7 @@ 
     13@@ -35,6 +35,7 @@ 
    1414  
    1515 #define ATHEROS_VENDOR_ID      0x168c 
     
    2121--- a/drivers/net/wireless/ath/ath9k/pci.c 
    2222+++ b/drivers/net/wireless/ath/ath9k/pci.c 
    23 @@ -658,6 +658,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i 
     23@@ -658,6 +658,7 @@ static const struct pci_device_id ath_pc 
    2424        { PCI_VDEVICE(ATHEROS, 0x0036), 
    2525          .driver_data = ATH9K_PCI_BT_ANT_DIV }, 
  • trunk/package/kernel/mac80211/patches/520-mac80211_cur_txpower.patch

    r41018 r42683  
    11--- a/include/net/mac80211.h 
    22+++ b/include/net/mac80211.h 
    3 @@ -1718,6 +1718,7 @@ struct ieee80211_hw { 
     3@@ -1754,6 +1754,7 @@ struct ieee80211_hw { 
    44        u8 max_tx_aggregation_subframes; 
    55        u8 offchannel_tx_hw_queue; 
     
    1111--- a/net/mac80211/cfg.c 
    1212+++ b/net/mac80211/cfg.c 
    13 @@ -2084,7 +2084,9 @@ static int ieee80211_get_tx_power(struct 
     13@@ -2081,7 +2081,9 @@ static int ieee80211_get_tx_power(struct 
    1414        struct ieee80211_local *local = wiphy_priv(wiphy); 
    1515        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 
     
    2424--- a/net/mac80211/main.c 
    2525+++ b/net/mac80211/main.c 
    26 @@ -156,6 +156,7 @@ static u32 ieee80211_hw_conf_chan(struct 
     26@@ -157,6 +157,7 @@ static u32 ieee80211_hw_conf_chan(struct 
    2727  
    2828        if (local->hw.conf.power_level != power) { 
  • trunk/package/kernel/mac80211/patches/521-ath9k_cur_txpower.patch

    r40834 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -310,8 +310,12 @@ static int ath_reset_internal(struct ath 
    4             (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) 
     3@@ -323,8 +323,12 @@ int ath_reset_internal(struct ath_softc  
     4            sc->cur_chan->offchannel) 
    55                ath9k_mci_set_txpower(sc, true, false); 
    66  
     
    1515 out: 
    1616        spin_unlock_bh(&sc->sc_pcu_lock); 
    17 @@ -1405,6 +1409,7 @@ static int ath9k_config(struct ieee80211 
    18                 sc->config.txpowlimit = 2 * conf->power_level; 
     17@@ -1453,6 +1457,7 @@ static int ath9k_config(struct ieee80211 
     18                sc->cur_chan->txpower = 2 * conf->power_level; 
    1919                ath9k_cmn_update_txpow(ah, sc->curtxpow, 
    20                                        sc->config.txpowlimit, &sc->curtxpow); 
     20                                       sc->cur_chan->txpower, &sc->curtxpow); 
    2121+               hw->cur_power_level = sc->curtxpow / 2; 
    2222        } 
  • trunk/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch

    r41018 r42683  
    11--- a/include/net/cfg80211.h 
    22+++ b/include/net/cfg80211.h 
    3 @@ -2207,6 +2207,7 @@ struct cfg80211_qos_map { 
     3@@ -2214,6 +2214,7 @@ struct cfg80211_qos_map { 
    44  *     (as advertised by the nl80211 feature flag.) 
    55  * @get_tx_power: store the current TX power into the dbm variable; 
     
    99  * @set_wds_peer: set the WDS peer for a WDS interface 
    1010  * 
    11 @@ -2431,6 +2432,7 @@ struct cfg80211_ops { 
     11@@ -2450,6 +2451,7 @@ struct cfg80211_ops { 
    1212                                enum nl80211_tx_power_setting type, int mbm); 
    1313        int     (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, 
     
    1919--- a/include/net/mac80211.h 
    2020+++ b/include/net/mac80211.h 
    21 @@ -1032,6 +1032,7 @@ enum ieee80211_smps_mode { 
     21@@ -1075,6 +1075,7 @@ enum ieee80211_smps_mode { 
    2222  * 
    2323  * @power_level: requested transmit power (in dBm), backward compatibility 
     
    2727  * @chandef: the channel definition to tune to 
    2828  * @radar_enabled: whether radar detection is enabled 
    29 @@ -1053,6 +1054,7 @@ struct ieee80211_conf { 
     29@@ -1096,6 +1097,7 @@ struct ieee80211_conf { 
    3030        u32 flags; 
    3131        int power_level, dynamic_ps_timeout; 
     
    3737--- a/include/uapi/linux/nl80211.h 
    3838+++ b/include/uapi/linux/nl80211.h 
    39 @@ -1591,6 +1591,9 @@ enum nl80211_commands { 
    40   *     creation then the new interface will be owned by the netlink socket 
    41   *     that created it and will be destroyed when the socket is closed 
     39@@ -1638,6 +1638,9 @@ enum nl80211_commands { 
     40  * @NL80211_ATTR_SMPS_MODE: SMPS mode to use (ap mode). see 
     41  *     &enum nl80211_smps_mode. 
    4242  * 
    4343+ * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce 
     
    4747  * @__NL80211_ATTR_AFTER_LAST: internal use 
    4848  */ 
    49 @@ -1931,6 +1934,8 @@ enum nl80211_attrs { 
    50         NL80211_ATTR_CSA_C_OFFSETS_TX, 
    51         NL80211_ATTR_MAX_CSA_COUNTERS, 
     49@@ -1990,6 +1993,8 @@ enum nl80211_attrs { 
     50  
     51        NL80211_ATTR_SMPS_MODE, 
    5252  
    5353+       NL80211_ATTR_WIPHY_ANTENNA_GAIN, 
     
    5858--- a/net/mac80211/cfg.c 
    5959+++ b/net/mac80211/cfg.c 
    60 @@ -2094,6 +2094,19 @@ static int ieee80211_get_tx_power(struct 
     60@@ -2091,6 +2091,19 @@ static int ieee80211_get_tx_power(struct 
    6161        return 0; 
    6262 } 
     
    7878                                  const u8 *addr) 
    7979 { 
    80 @@ -3517,6 +3530,7 @@ const struct cfg80211_ops mac80211_confi 
     80@@ -3572,6 +3585,7 @@ const struct cfg80211_ops mac80211_confi 
    8181        .set_wiphy_params = ieee80211_set_wiphy_params, 
    8282        .set_tx_power = ieee80211_set_tx_power, 
     
    8888--- a/net/mac80211/ieee80211_i.h 
    8989+++ b/net/mac80211/ieee80211_i.h 
    90 @@ -1243,6 +1243,7 @@ struct ieee80211_local { 
     90@@ -1280,6 +1280,7 @@ struct ieee80211_local { 
    9191        int dynamic_ps_forced_timeout; 
    9292  
     
    9898--- a/net/mac80211/main.c 
    9999+++ b/net/mac80211/main.c 
    100 @@ -97,7 +97,7 @@ static u32 ieee80211_hw_conf_chan(struct 
     100@@ -98,7 +98,7 @@ static u32 ieee80211_hw_conf_chan(struct 
    101101        struct ieee80211_sub_if_data *sdata; 
    102102        struct cfg80211_chan_def chandef = {}; 
     
    107107  
    108108        offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; 
    109 @@ -154,6 +154,12 @@ static u32 ieee80211_hw_conf_chan(struct 
     109@@ -155,6 +155,12 @@ static u32 ieee80211_hw_conf_chan(struct 
    110110        } 
    111111        rcu_read_unlock(); 
     
    120120                changed |= IEEE80211_CONF_CHANGE_POWER; 
    121121                local->hw.cur_power_level = power; 
    122 @@ -584,6 +590,7 @@ struct ieee80211_hw *ieee80211_alloc_hw( 
     122@@ -586,6 +592,7 @@ struct ieee80211_hw *ieee80211_alloc_hw( 
    123123                                         IEEE80211_RADIOTAP_MCS_HAVE_BW; 
    124124        local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | 
     
    130130--- a/net/wireless/nl80211.c 
    131131+++ b/net/wireless/nl80211.c 
    132 @@ -387,6 +387,7 @@ static const struct nla_policy nl80211_p 
    133         [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 }, 
    134         [NL80211_ATTR_IFACE_SOCKET_OWNER] = { .type = NLA_FLAG }, 
    135         [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY }, 
     132@@ -395,6 +395,7 @@ static const struct nla_policy nl80211_p 
     133        [NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 }, 
     134        [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, 
     135        [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, 
    136136+       [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, 
    137137 }; 
    138138  
    139139 /* policy for the key attributes */ 
    140 @@ -2162,6 +2163,20 @@ static int nl80211_set_wiphy(struct sk_b 
     140@@ -2179,6 +2180,20 @@ static int nl80211_set_wiphy(struct sk_b 
    141141                        return result; 
    142142        } 
  • trunk/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch

    r41673 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -565,6 +565,9 @@ static inline int ath9k_dump_btcoex(stru 
     3@@ -799,6 +799,9 @@ static inline int ath9k_dump_btcoex(stru 
    44 void ath_init_leds(struct ath_softc *sc); 
    55 void ath_deinit_leds(struct ath_softc *sc); 
     
    1111 static inline void ath_init_leds(struct ath_softc *sc) 
    1212 { 
    13 @@ -703,6 +706,13 @@ void ath_ant_comb_scan(struct ath_softc  
    14  #define PS_BEACON_SYNC            BIT(4) 
    15  #define PS_WAIT_FOR_ANI           BIT(5) 
     13@@ -939,6 +942,13 @@ void ath_ant_comb_scan(struct ath_softc  
     14  
     15 #define ATH9K_NUM_CHANCTX  2 /* supports 2 operating channels */ 
    1616  
    1717+struct ath_led { 
     
    2525        struct ieee80211_hw *hw; 
    2626        struct device *dev; 
    27 @@ -745,9 +755,8 @@ struct ath_softc { 
    28         struct ath_beacon beacon; 
     27@@ -990,9 +1000,8 @@ struct ath_softc { 
     28        spinlock_t chan_lock; 
    2929  
    3030 #ifdef CPTCFG_MAC80211_LEDS 
     
    3636 #endif 
    3737  
    38         struct ath9k_hw_cal_data caldata; 
     38 #ifdef CPTCFG_ATH9K_DEBUGFS 
    3939--- a/drivers/net/wireless/ath/ath9k/gpio.c 
    4040+++ b/drivers/net/wireless/ath/ath9k/gpio.c 
     
    163163--- a/drivers/net/wireless/ath/ath9k/init.c 
    164164+++ b/drivers/net/wireless/ath/ath9k/init.c 
    165 @@ -815,7 +815,7 @@ int ath9k_init_device(u16 devid, struct  
     165@@ -889,7 +889,7 @@ int ath9k_init_device(u16 devid, struct  
    166166  
    167167 #ifdef CPTCFG_MAC80211_LEDS 
     
    174174--- a/drivers/net/wireless/ath/ath9k/debug.c 
    175175+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    176 @@ -1381,6 +1381,61 @@ static const struct file_operations fops 
     176@@ -1410,6 +1410,61 @@ static const struct file_operations fops 
    177177        .llseek = default_llseek, 
    178178 }; 
     
    236236 int ath9k_init_debug(struct ath_hw *ah) 
    237237 { 
    238 @@ -1405,6 +1460,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
     238@@ -1434,6 +1489,10 @@ int ath9k_init_debug(struct ath_hw *ah) 
    239239                            &fops_eeprom); 
    240240        debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, 
  • trunk/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch

    r42453 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1437,6 +1437,50 @@ static const struct file_operations fops 
     3@@ -1466,6 +1466,50 @@ static const struct file_operations fops 
    44 #endif 
    55  
     
    5252 { 
    5353        struct ath_common *common = ath9k_hw_common(ah); 
    54 @@ -1464,6 +1508,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
     54@@ -1493,6 +1537,8 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5555        debugfs_create_file("gpio_led", S_IWUSR, 
    5656                           sc->debug.debugfs_phy, sc, &fops_gpio_led); 
     
    6363--- a/drivers/net/wireless/ath/ath9k/hw.h 
    6464+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    65 @@ -482,6 +482,12 @@ enum { 
     65@@ -483,6 +483,12 @@ enum { 
    6666        ATH9K_RESET_COLD, 
    6767 }; 
     
    7676        u32 magic; 
    7777        u16 devid; 
    78 @@ -762,6 +768,8 @@ struct ath_hw { 
     78@@ -763,6 +769,8 @@ struct ath_hw { 
    7979        u32 rfkill_polarity; 
    8080        u32 ah_flags; 
     
    8585        bool htc_reset_init; 
    8686  
    87 @@ -1013,6 +1021,7 @@ void ath9k_hw_check_nav(struct ath_hw *a 
     87@@ -1017,6 +1025,7 @@ void ath9k_hw_check_nav(struct ath_hw *a 
    8888 bool ath9k_hw_check_alive(struct ath_hw *ah); 
    8989  
     
    9595--- a/drivers/net/wireless/ath/ath9k/hw.c 
    9696+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    97 @@ -1738,6 +1738,20 @@ fail: 
    98         return -EINVAL; 
     97@@ -1763,6 +1763,20 @@ u32 ath9k_hw_get_tsf_offset(struct times 
    9998 } 
     99 EXPORT_SYMBOL(ath9k_hw_get_tsf_offset); 
    100100  
    101101+void ath9k_hw_update_diag(struct ath_hw *ah) 
     
    116116                   struct ath9k_hw_cal_data *caldata, bool fastcc) 
    117117 { 
    118 @@ -1943,6 +1957,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     118@@ -1965,6 +1979,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    119119                ar9003_hw_disable_phy_restart(ah); 
    120120  
     
    126126--- a/drivers/net/wireless/ath/ath9k/main.c 
    127127+++ b/drivers/net/wireless/ath/ath9k/main.c 
    128 @@ -606,6 +606,11 @@ irqreturn_t ath_isr(int irq, void *dev) 
     128@@ -531,6 +531,11 @@ irqreturn_t ath_isr(int irq, void *dev) 
    129129        ath9k_debug_sync_cause(sc, sync_cause); 
    130130        status &= ah->imask;    /* discard unasked-for bits */ 
  • trunk/package/kernel/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch

    r42453 r42683  
    1212--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1313+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    14 @@ -2331,17 +2331,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
     14@@ -2359,17 +2359,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw 
    1515        } 
    1616  
     
    4848--- a/drivers/net/wireless/ath/ath9k/hw.h 
    4949+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    50 @@ -932,6 +932,8 @@ struct ath_hw { 
     50@@ -933,6 +933,8 @@ struct ath_hw { 
    5151        bool is_clk_25mhz; 
    5252        int (*get_mac_revision)(void); 
     
    5656  
    5757        const struct firmware *eeprom_blob; 
    58  }; 
     58  
    5959--- a/drivers/net/wireless/ath/ath9k/init.c 
    6060+++ b/drivers/net/wireless/ath/ath9k/init.c 
    61 @@ -518,6 +518,8 @@ static int ath9k_init_softc(u16 devid, s 
     61@@ -528,6 +528,8 @@ static int ath9k_init_softc(u16 devid, s 
    6262                ah->is_clk_25mhz = pdata->is_clk_25mhz; 
    6363                ah->get_mac_revision = pdata->get_mac_revision; 
  • trunk/package/kernel/mac80211/patches/550-ath9k_entropy_from_adc.patch

    r42453 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/hw.h 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    3 @@ -678,6 +678,7 @@ struct ath_spec_scan { 
     3@@ -679,6 +679,7 @@ struct ath_spec_scan { 
    44  * @config_pci_powersave: 
    55  * @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC 
     
    99  * @spectral_scan_trigger: trigger a spectral scan run 
    1010  * @spectral_scan_wait: wait for a spectral scan run to finish 
    11 @@ -701,6 +702,7 @@ struct ath_hw_ops { 
     11@@ -702,6 +703,7 @@ struct ath_hw_ops { 
    1212                        struct ath_hw_antcomb_conf *antconf); 
    1313        void (*antdiv_comb_conf_set)(struct ath_hw *ah, 
     
    1919--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
    2020+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
    21 @@ -1781,6 +1781,26 @@ static void ar9003_hw_tx99_set_txpower(s 
     21@@ -1766,6 +1766,26 @@ static void ar9003_hw_tx99_set_txpower(s 
    2222                  ATH9K_POW_SM(p_pwr_array[ALL_TARGET_HT40_14],  0)); 
    2323 } 
     
    4646 { 
    4747        struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); 
    48 @@ -1816,6 +1836,7 @@ void ar9003_hw_attach_phy_ops(struct ath 
     48@@ -1796,6 +1816,7 @@ void ar9003_hw_attach_phy_ops(struct ath 
    4949        priv_ops->set_radar_params = ar9003_hw_set_radar_params; 
    5050        priv_ops->fast_chan_change = ar9003_hw_fast_chan_change; 
     
    5656--- a/drivers/net/wireless/ath/ath9k/init.c 
    5757+++ b/drivers/net/wireless/ath/ath9k/init.c 
    58 @@ -646,7 +646,8 @@ static void ath9k_init_txpower_limits(st 
     58@@ -662,7 +662,8 @@ static void ath9k_init_txpower_limits(st 
    5959        if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) 
    6060                ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ); 
     
    6666  
    6767 static const struct ieee80211_iface_limit if_limits[] = { 
    68 @@ -774,6 +775,18 @@ static void ath9k_set_hw_capab(struct at 
     68@@ -848,6 +849,18 @@ static void ath9k_set_hw_capab(struct at 
    6969        SET_IEEE80211_PERM_ADDR(hw, common->macaddr); 
    7070 } 
     
    8585                    const struct ath_bus_ops *bus_ops) 
    8686 { 
    87 @@ -822,6 +835,8 @@ int ath9k_init_device(u16 devid, struct  
     87@@ -896,6 +909,8 @@ int ath9k_init_device(u16 devid, struct  
    8888                ARRAY_SIZE(ath9k_tpt_blink)); 
    8989 #endif 
     
    111111--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    112112+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    113 @@ -1232,9 +1232,30 @@ static void ar5008_hw_set_radar_conf(str 
     113@@ -1231,9 +1231,30 @@ static void ar5008_hw_set_radar_conf(str 
    114114        conf->radar_inband = 8; 
    115115 } 
     
    142142                AR_PHY_CCA, 
    143143                AR_PHY_CH1_CCA, 
    144 @@ -1249,6 +1270,8 @@ int ar5008_hw_attach_phy_ops(struct ath_ 
     144@@ -1248,6 +1269,8 @@ int ar5008_hw_attach_phy_ops(struct ath_ 
    145145        if (ret) 
    146146            return ret; 
  • trunk/package/kernel/mac80211/patches/551-ath9k-ar933x-usb-hang-workaround.patch

    r42453 r42683  
    2121 /* Chip Revisions */ 
    2222 /******************/ 
    23 @@ -1340,6 +1353,9 @@ static bool ath9k_hw_set_reset(struct at 
     23@@ -1348,6 +1361,9 @@ static bool ath9k_hw_set_reset(struct at 
    2424        if (AR_SREV_9100(ah)) 
    2525                udelay(50); 
     
    3131 } 
    3232  
    33 @@ -1439,6 +1455,9 @@ static bool ath9k_hw_chip_reset(struct a 
     33@@ -1447,6 +1463,9 @@ static bool ath9k_hw_chip_reset(struct a 
    3434                ar9003_hw_internal_regulator_apply(ah); 
    3535        ath9k_hw_init_pll(ah, chan); 
     
    4141 } 
    4242  
    43 @@ -1733,8 +1752,14 @@ static int ath9k_hw_do_fastcc(struct ath 
     43@@ -1741,8 +1760,14 @@ static int ath9k_hw_do_fastcc(struct ath 
    4444        if (AR_SREV_9271(ah)) 
    4545                ar9002_hw_load_ani_reg(ah, chan); 
     
    5656 } 
    5757  
    58 @@ -1962,6 +1987,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    59         if (AR_SREV_9565(ah) && common->bt_ant_diversity) 
    60                 REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON); 
     58@@ -1990,6 +2015,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     59                ath9k_hw_set_radar_params(ah); 
     60        } 
    6161  
    6262+       if (AR_SREV_9330(ah) || AR_SREV_9340(ah)) 
  • trunk/package/kernel/mac80211/patches/560-ath9k_pcoem_optional.patch

    r41021 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/Kconfig 
    22+++ b/drivers/net/wireless/ath/ath9k/Kconfig 
    3 @@ -133,6 +133,11 @@ config ATH9K_RFKILL 
    4           seconds. Turn off to save power, but enable it if you have 
    5           a platform that can toggle the RF-Kill GPIO. 
     3@@ -151,6 +151,11 @@ config ATH9K_CHANNEL_CONTEXT 
     4         for multi-channel concurrency. Enable this if P2P PowerSave support 
     5         is required. 
    66  
    77+config ATH9K_PCOEM 
     
    1515--- a/drivers/net/wireless/ath/ath9k/Makefile 
    1616+++ b/drivers/net/wireless/ath/ath9k/Makefile 
    17 @@ -31,7 +31,6 @@ ath9k_hw-y:=  \ 
     17@@ -32,7 +32,6 @@ ath9k_hw-y:=  \ 
    1818                ar5008_phy.o \ 
    1919                ar9002_calib.o \ 
     
    2323                eeprom.o \ 
    2424                eeprom_def.o \ 
    25 @@ -48,6 +47,8 @@ ath9k_hw-$(CPTCFG_ATH9K_WOW) += ar9003_w 
    26   
     25@@ -50,6 +49,8 @@ ath9k_hw-$(CPTCFG_ATH9K_WOW) += ar9003_w 
    2726 ath9k_hw-$(CPTCFG_ATH9K_BTCOEX_SUPPORT) += btcoex.o \ 
    2827                                           ar9003_mci.o 
     28  
    2929+ath9k_hw-$(CPTCFG_ATH9K_PCOEM) += ar9003_rtt.o 
    3030+ 
     31 ath9k_hw-$(CPTCFG_ATH9K_DYNACK) += dynack.o 
     32  
    3133 obj-$(CPTCFG_ATH9K_HW) += ath9k_hw.o 
    32   
    33  obj-$(CPTCFG_ATH9K_COMMON) += ath9k_common.o 
    3434--- a/drivers/net/wireless/ath/ath9k/ar9003_rtt.h 
    3535+++ b/drivers/net/wireless/ath/ath9k/ar9003_rtt.h 
     
    8585--- a/drivers/net/wireless/ath/ath9k/hw.h 
    8686+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    87 @@ -244,13 +244,20 @@ enum ath9k_hw_caps { 
     87@@ -245,13 +245,20 @@ enum ath9k_hw_caps { 
    8888        ATH9K_HW_CAP_2GHZ                       = BIT(11), 
    8989        ATH9K_HW_CAP_5GHZ                       = BIT(12), 
     
    113113--- a/drivers/net/wireless/ath/ath9k/init.c 
    114114+++ b/drivers/net/wireless/ath/ath9k/init.c 
    115 @@ -355,6 +355,9 @@ static void ath9k_init_pcoem_platform(st 
     115@@ -362,6 +362,9 @@ static void ath9k_init_pcoem_platform(st 
    116116        struct ath9k_hw_capabilities *pCap = &ah->caps; 
    117117        struct ath_common *common = ath9k_hw_common(ah); 
     
    125125--- a/drivers/net/wireless/ath/ath9k/pci.c 
    126126+++ b/drivers/net/wireless/ath/ath9k/pci.c 
    127 @@ -30,6 +30,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i 
     127@@ -30,6 +30,7 @@ static const struct pci_device_id ath_pc 
    128128        { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI   */ 
    129129        { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */ 
     
    133133                         0x002A, 
    134134                         PCI_VENDOR_ID_AZWAVE, 
    135 @@ -82,6 +83,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i 
     135@@ -82,6 +83,7 @@ static const struct pci_device_id ath_pc 
    136136                         PCI_VENDOR_ID_AZWAVE, 
    137137                         0x2C37), 
     
    141141        { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */ 
    142142        { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */ 
    143 @@ -102,6 +104,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i 
     143@@ -102,6 +104,7 @@ static const struct pci_device_id ath_pc 
    144144  
    145145        { PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E  AR9300 */ 
     
    149149        { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 
    150150                         0x0032, 
    151 @@ -294,10 +297,12 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i 
     151@@ -294,10 +297,12 @@ static const struct pci_device_id ath_pc 
    152152                         PCI_VENDOR_ID_ASUSTEK, 
    153153                         0x850D), 
     
    162162        { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, 
    163163                         0x0034, 
    164 @@ -657,6 +662,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i 
     164@@ -657,6 +662,7 @@ static const struct pci_device_id ath_pc 
    165165        /* PCI-E AR9565 (WB335) */ 
    166166        { PCI_VDEVICE(ATHEROS, 0x0036), 
     
    172172--- a/drivers/net/wireless/ath/ath9k/reg.h 
    173173+++ b/drivers/net/wireless/ath/ath9k/reg.h 
    174 @@ -891,10 +891,21 @@ 
     174@@ -892,10 +892,21 @@ 
    175175        (AR_SREV_9330((_ah)) && \ 
    176176         ((_ah)->hw_version.macRev == AR_SREV_REVISION_9330_12)) 
     
    195195 #define AR_SREV_9485_OR_LATER(_ah) \ 
    196196        (((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9485)) 
    197 @@ -910,34 +921,30 @@ 
     197@@ -911,34 +922,30 @@ 
    198198     (AR_SREV_9285_12_OR_LATER(_ah) && \ 
    199199      ((REG_READ(_ah, AR_AN_SYNTH9) & 0x7) == 0x1)) 
     
    240240--- a/.local-symbols 
    241241+++ b/.local-symbols 
    242 @@ -129,6 +129,7 @@ ATH9K_HW= 
     242@@ -124,6 +124,7 @@ ATH9K_HW= 
    243243 ATH9K_COMMON= 
    244244 ATH9K_DFS_DEBUGFS= 
  • trunk/package/kernel/mac80211/patches/561-ath9k_remove_gain_tables.patch

    r40859 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c 
    3 @@ -663,9 +663,6 @@ static void ar9003_tx_gain_table_mode5(s 
     3@@ -670,9 +670,6 @@ static void ar9003_tx_gain_table_mode5(s 
    44        if (AR_SREV_9485_11_OR_LATER(ah)) 
    55                INIT_INI_ARRAY(&ah->iniModesTxGain, 
  • trunk/package/kernel/mac80211/patches/562-ath9k_ani_ws_detect.patch

    r42453 r42683  
    8080  * ar9003_hw_set_channel - set channel on single-chip device 
    8181  * @ah: atheros hardware structure 
    82 @@ -971,11 +957,6 @@ static bool ar9003_hw_ani_control(struct 
     82@@ -954,11 +940,6 @@ static bool ar9003_hw_ani_control(struct 
    8383        struct ath_common *common = ath9k_hw_common(ah); 
    8484        struct ath9k_channel *chan = ah->curchan; 
     
    9292  
    9393        switch (cmd & ah->ani_function) { 
    94 @@ -989,61 +970,6 @@ static bool ar9003_hw_ani_control(struct 
     94@@ -972,61 +953,6 @@ static bool ar9003_hw_ani_control(struct 
    9595                 */ 
    9696                u32 on = param ? 1 : 0; 
  • trunk/package/kernel/mac80211/patches/563-ath9k_rxorn_intr_fix.patch

    r41029 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -628,8 +628,7 @@ irqreturn_t ath_isr(int irq, void *dev) 
     3@@ -553,8 +553,7 @@ irqreturn_t ath_isr(int irq, void *dev) 
    44         * If a FATAL or RXORN interrupt is received, we have to reset the 
    55         * chip immediately. 
  • trunk/package/kernel/mac80211/patches/564-ath9k_cleanup_reset_debug.patch

    r41113 r42683  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -846,36 +846,30 @@ static ssize_t read_file_reset(struct fi 
     3@@ -852,36 +852,30 @@ static ssize_t read_file_reset(struct fi 
    44                               size_t count, loff_t *ppos) 
    55 { 
  • trunk/package/kernel/mac80211/patches/565-ath9k_restart_after_nfcal_failure.patch

    r42453 r42683  
    118118--- a/drivers/net/wireless/ath/ath9k/hw.h 
    119119+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    120 @@ -695,10 +695,8 @@ struct ath_hw_ops { 
     120@@ -696,10 +696,8 @@ struct ath_hw_ops { 
    121121                                     bool power_off); 
    122122        void (*rx_enable)(struct ath_hw *ah); 
     
    143143--- a/drivers/net/wireless/ath/ath9k/debug.c 
    144144+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    145 @@ -857,6 +857,7 @@ static ssize_t read_file_reset(struct fi 
     145@@ -863,6 +863,7 @@ static ssize_t read_file_reset(struct fi 
    146146                [RESET_TYPE_MAC_HANG] = "MAC Hang", 
    147147                [RESET_TYPE_BEACON_STUCK] = "Stuck Beacon", 
  • trunk/package/kernel/mac80211/patches/567-ath9k_fix_init_nfcal.patch

    r42453 r42683  
    1111--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1212+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    13 @@ -1972,8 +1972,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     13@@ -1994,8 +1994,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    1414        if (ath9k_hw_mci_is_enabled(ah)) 
    1515                ar9003_mci_check_bt(ah); 
  • trunk/package/kernel/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch

    r40558 r42683  
    2323--- a/drivers/net/wireless/rt2x00/rt2800.h 
    2424+++ b/drivers/net/wireless/rt2x00/rt2800.h 
    25 @@ -2958,17 +2958,4 @@ enum rt2800_eeprom_word { 
     25@@ -2960,17 +2960,4 @@ enum rt2800_eeprom_word { 
    2626  */ 
    2727 #define BCN_TBTT_OFFSET 64 
  • trunk/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch

    r41016 r42683  
    2525--- a/drivers/net/wireless/rt2x00/rt2800lib.c 
    2626+++ b/drivers/net/wireless/rt2x00/rt2800lib.c 
    27 @@ -7734,6 +7734,7 @@ static int rt2800_probe_rt(struct rt2x00 
     27@@ -7740,6 +7740,7 @@ static int rt2800_probe_rt(struct rt2x00 
    2828  
    2929 int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev) 
     
    3333        u32 reg; 
    3434  
    35 @@ -7741,6 +7742,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r 
     35@@ -7747,6 +7748,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r 
    3636        if (retval) 
    3737                return retval; 
  • trunk/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch

    r41016 r42683  
    188188  
    189189        /* 
    190 @@ -4898,14 +4931,19 @@ static int rt2800_init_registers(struct  
     190@@ -4901,14 +4934,19 @@ static int rt2800_init_registers(struct  
    191191        /* 
    192192         * ASIC will keep garbage value after boot, clear encryption keys. 
     
    208208  
    209209        /* 
    210 @@ -5031,8 +5069,10 @@ static int rt2800_wait_bbp_ready(struct  
     210@@ -5034,8 +5072,10 @@ static int rt2800_wait_bbp_ready(struct  
    211211         * BBP was enabled after firmware was loaded, 
    212212         * but we need to reactivate it now. 
     
    219219  
    220220        for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 
    221 @@ -6728,11 +6768,19 @@ int rt2800_enable_radio(struct rt2x00_de 
     221@@ -6731,11 +6771,19 @@ int rt2800_enable_radio(struct rt2x00_de 
    222222        /* 
    223223         * Send signal during boot time to initialize firmware. 
     
    240240  
    241241        /* 
    242 @@ -7738,6 +7786,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r 
     242@@ -7744,6 +7792,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r 
    243243        int retval; 
    244244        u32 reg; 
     
    249249        if (retval) 
    250250                return retval; 
    251 @@ -7817,8 +7867,11 @@ void rt2800_get_tkip_seq(struct ieee8021 
     251@@ -7823,8 +7873,11 @@ void rt2800_get_tkip_seq(struct ieee8021 
    252252        u32 offset; 
    253253  
     
    487487  * Queue handlers. 
    488488  */ 
    489 @@ -260,8 +281,10 @@ static int rt2800usb_write_firmware(stru 
    490         rt2x00usb_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE, 
    491                                       data + offset, length); 
     489@@ -294,8 +315,10 @@ static int rt2800usb_write_firmware(stru 
     490                                              data + offset, length); 
     491        } 
    492492  
    493493+       rt2800_shared_mem_lock(rt2x00dev); 
     
    498498        /* 
    499499         * Send firmware request to device to load firmware, 
    500 @@ -276,7 +299,10 @@ static int rt2800usb_write_firmware(stru 
     500@@ -310,7 +333,10 @@ static int rt2800usb_write_firmware(stru 
    501501        } 
    502502  
     
    509509        return 0; 
    510510 } 
    511 @@ -294,8 +320,10 @@ static int rt2800usb_init_registers(stru 
     511@@ -328,8 +354,10 @@ static int rt2800usb_init_registers(stru 
    512512        if (rt2800_wait_csr_ready(rt2x00dev)) 
    513513                return -EBUSY; 
     
    520520        reg = 0; 
    521521        rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1); 
    522 @@ -810,6 +838,9 @@ static const struct rt2800_ops rt2800usb 
     522@@ -859,6 +887,9 @@ static const struct rt2800_ops rt2800usb 
    523523        .drv_write_firmware     = rt2800usb_write_firmware, 
    524524        .drv_init_registers     = rt2800usb_init_registers, 
  • trunk/package/kernel/mac80211/patches/600-0004-rt2x00-rt2800lib-fix-beacon-generation-on-RT3593.patch

    r41016 r42683  
    3030--- a/drivers/net/wireless/rt2x00/rt2800.h 
    3131+++ b/drivers/net/wireless/rt2x00/rt2800.h 
    32 @@ -572,6 +572,7 @@ 
     32@@ -574,6 +574,7 @@ 
    3333 #define PBF_SYS_CTRL                   0x0400 
    3434 #define PBF_SYS_CTRL_READY             FIELD32(0x00000080) 
     
    3838 /* 
    3939  * HOST-MCU shared memory 
    40 @@ -2024,6 +2025,8 @@ struct mac_iveiv_entry { 
     40@@ -2026,6 +2027,8 @@ struct mac_iveiv_entry { 
    4141          (((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \ 
    4242          (HW_BEACON_BASE6 - ((__index - 6) * 0x0200)))) 
  • trunk/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch

    r41016 r42683  
    2525--- a/drivers/net/wireless/rt2x00/rt2800lib.c 
    2626+++ b/drivers/net/wireless/rt2x00/rt2800lib.c 
    27 @@ -4628,6 +4628,7 @@ EXPORT_SYMBOL_GPL(rt2800_link_tuner); 
     27@@ -4631,6 +4631,7 @@ EXPORT_SYMBOL_GPL(rt2800_link_tuner); 
    2828  */ 
    2929 static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) 
     
    3333        u16 eeprom; 
    3434        unsigned int i; 
    35 @@ -4993,7 +4994,7 @@ static int rt2800_init_registers(struct  
     35@@ -4996,7 +4997,7 @@ static int rt2800_init_registers(struct  
    3636        /* 
    3737         * Clear all beacons 
     
    4242  
    4343        if (rt2x00_is_usb(rt2x00dev)) { 
    44 @@ -7839,6 +7840,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r 
     44@@ -7845,6 +7846,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r 
    4545        if (rt2x00_rt(rt2x00dev, RT3593)) 
    4646                __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); 
  • trunk/package/kernel/mac80211/patches/600-0006-rt2x00-rt2800lib-init-additional-beacon-offset-regis.patch

    r41016 r42683  
    1212--- a/drivers/net/wireless/rt2x00/rt2800.h 
    1313+++ b/drivers/net/wireless/rt2x00/rt2800.h 
    14 @@ -627,6 +627,20 @@ 
     14@@ -629,6 +629,20 @@ 
    1515  */ 
    1616 #define PBF_DBG                                0x043c 
     
    3535--- a/drivers/net/wireless/rt2x00/rt2800lib.c 
    3636+++ b/drivers/net/wireless/rt2x00/rt2800lib.c 
    37 @@ -4640,6 +4640,30 @@ static int rt2800_init_registers(struct  
     37@@ -4643,6 +4643,30 @@ static int rt2800_init_registers(struct  
    3838        if (ret) 
    3939                return ret; 
  • trunk/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch

    r41016 r42683  
    1111--- a/drivers/net/wireless/rt2x00/rt2800lib.c 
    1212+++ b/drivers/net/wireless/rt2x00/rt2800lib.c 
    13 @@ -7864,7 +7864,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r 
     13@@ -7870,7 +7870,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r 
    1414        if (rt2x00_rt(rt2x00dev, RT3593)) 
    1515                __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); 
  • trunk/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch

    r41016 r42683  
    1111--- a/drivers/net/wireless/rt2x00/rt2800lib.c 
    1212+++ b/drivers/net/wireless/rt2x00/rt2800lib.c 
    13 @@ -7834,6 +7834,7 @@ static int rt2800_probe_rt(struct rt2x00 
     13@@ -7840,6 +7840,7 @@ static int rt2800_probe_rt(struct rt2x00 
    1414        case RT3390: 
    1515        case RT3572: 
  • trunk/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch

    r41016 r42683  
    2222  * RF3070 2.4G 1T1R 
    2323  * RF5360 2.4G 1T1R 
    24 @@ -71,6 +72,7 @@ 
     24@@ -72,6 +73,7 @@ 
    2525 #define RF5592                         0x000f 
    2626 #define RF3070                         0x3070 
     
    2828+#define RF3853                         0x3853 
    2929 #define RF5360                         0x5360 
     30 #define RF5362                         0x5362 
    3031 #define RF5370                         0x5370 
    31  #define RF5372                         0x5372 
    3232--- a/drivers/net/wireless/rt2x00/rt2800lib.c 
    3333+++ b/drivers/net/wireless/rt2x00/rt2800lib.c 
    34 @@ -7454,6 +7454,66 @@ static const struct rf_channel rf_vals_3 
     34@@ -7458,6 +7458,66 @@ static const struct rf_channel rf_vals_3 
    3535        {173, 0x61, 0, 9}, 
    3636 }; 
     
    9999        /* Channel, N, K, mod, R */ 
    100100        {1, 482, 4, 10, 3}, 
    101 @@ -7682,6 +7742,11 @@ static int rt2800_probe_hw_mode(struct r 
     101@@ -7687,6 +7747,11 @@ static int rt2800_probe_hw_mode(struct r 
    102102                spec->channels = rf_vals_3x; 
    103103                break; 
  • trunk/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch

    <
    r41016 r42683  
    1111--- a/drivers/net/wireless/rt2x00/rt2800lib.c 
    1212+++ b/drivers/net/wireless/rt2x00/rt2800lib.c 
    13 @@ -4393,6 +4393,7 @@ void rt2800_vco_calibration(struct rt2x0 
     13@@ -4395,6 +4395,7 @@ void rt2800_vco_calibration(struct rt2x0 
    1414        case RF3053: 
    1515        case RF3070: 
     
    1717+       case RF3853: 
    1818        case RF5360: 
     19        case RF5362: 
    1920        case RF5370: 
    20         case RF5372: 
    21 @@ -7861,6 +7862,7 @@ static int rt2800_probe_hw_mode(struct r 
     21@@ -7866,6 +7867,7 @@ static int rt2800_probe_hw_mode(struct r 
    2222        case RF3053: 
    2323        case RF3070: 
     
    2525+       case RF3853: 
    2626        case RF5360: 
     27        case RF5362: