diff --git a/patches/openwrt/0019-Backport-hostapd-and-mac80211-from-Barrier-Breaker.patch b/patches/openwrt/0016-Backport-hostapd-and-mac80211-from-Barrier-Breaker.patch
similarity index 97%
rename from patches/openwrt/0019-Backport-hostapd-and-mac80211-from-Barrier-Breaker.patch
rename to patches/openwrt/0016-Backport-hostapd-and-mac80211-from-Barrier-Breaker.patch
index 206afcde366008331cafb8066db22edc2221495c..f06281ac2b8c7e37413d63045062bb8f076ee2b3 100644
--- a/patches/openwrt/0019-Backport-hostapd-and-mac80211-from-Barrier-Breaker.patch
+++ b/patches/openwrt/0016-Backport-hostapd-and-mac80211-from-Barrier-Breaker.patch
@@ -3881,10 +3881,10 @@ index 7b50154..3f749e9 100644
   	pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
   			       &local->network_latency_notifier);
 diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
-index a1af6c2..1405cc3 100644
+index a1af6c2..892f51e 100644
 --- a/package/mac80211/patches/300-pending_work.patch
 +++ b/package/mac80211/patches/300-pending_work.patch
-@@ -1,4153 +1,378 @@
+@@ -1,4153 +1,543 @@
 -commit 93f310a38a1d81a4bc8fcd9bf29628bd721cf2ef
 -Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Sun Apr 6 23:35:28 2014 +0200
@@ -3921,37 +3921,23 @@ index a1af6c2..1405cc3 100644
 -commit 3a0f984b1cdcd6a9f8c441635ef3b05d58547f4e
 -Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Tue Mar 11 14:03:32 2014 +0100
-+commit 8c7ae357cc5b6bd037ad2d666e9f3789cf882925
-+Author: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
-+Date:   Wed Apr 23 15:07:57 2014 +0530
- 
+-
 -    ath9k_hw: set ANI firstep as absolute values instead of relative
 -    
 -    On older chips, the INI value differ in similar ways as cycpwr_thr1, so
 -    convert it to absolute values as well.
-+    ath9k: fix race in setting ATH_OP_INVALID
-     
+-    
 -    Since the ANI algorithm is different here compared to the old
 -    implementation (fewer steps, controlled at a different point in time),
 -    it makes sense to use values similar to what would be applied for newer
 -    chips, just without relying on INI defaults.
-+    The commit "ath9k: move sc_flags to ath_common" moved setting
-+    ATH_OP_INVALID flag below ieee80211_register_hw. This is causing
-+    the flag never being cleared randomly as the drv_start is called
-+    prior to setting flag. Fix this by setting the flag prior to
-+    register_hw.
-     
+-    
 -    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-+    Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
-+    Signed-off-by: John W. Linville <linville@tuxdriver.com>
- 
+-
 -commit 91d70d40400c569b49605b78fd7c43e9405694f4
 -Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Tue Mar 11 14:00:37 2014 +0100
-+commit c82552c5b0cb1735dbcbad78b1ffc6d3c212dc56
-+Author: Tim Harvey <tharvey@gateworks.com>
-+Date:   Mon Apr 21 16:14:57 2014 -0700
- 
+-
 -    ath9k_hw: set ANI cycpwr_thr1 as absolute values instead of relative
 -    
 -    The table was copied from the ANI implementation of AR9300. It assumes
@@ -3960,26 +3946,22 @@ index a1af6c2..1405cc3 100644
 -    
 -    On older chips, the differences are bigger and especially AR5008/AR9001
 -    are configured to much more sensitive values than what is useful.
-+    ath9k: add a recv budget
-     
+-    
 -    Improve ANI behavior by reverting to the absolute values used in the
 -    previous implementation (expressed as a simple formula instead of the
 -    old table).
-+    Implement a recv budget so that in cases of high traffic we still allow other
-+    taskets to get processed.
-     
+-    
 -    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
++commit 4c8a3486cb577d40c1ef75f0a8dc9a04773eef83
++Author: Nickolay Ledovskikh <nledovskikh@gmail.com>
++Date:   Fri Apr 25 22:53:34 2014 +0400
+ 
 -commit c977493766310a825f406836636ffd66e1447783
 -Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Mon Mar 10 19:52:56 2014 +0100
 -
 -    ath9k_hw: remove ANI function restrictions for AP mode
-+    Without this, we can encounter a host of issues during high wireless traffic
-+    reception depending on system load including rcu stall's detected (ARM),
-+    soft lockups, failure to service critical tasks such as watchdog resets,
-+    and triggering of the tx stuck tasklet.
-     
+-    
 -    The primary purpose of this piece of code was to selectively disable
 -    OFDM weak signal detection. The checks for this are elsewhere, and an
 -    earlier commit relaxed the restrictions for older chips, which are more
@@ -3992,64 +3974,74 @@ index a1af6c2..1405cc3 100644
 -Date:   Sun Mar 9 11:25:43 2014 +0100
 -
 -    ath9k: clean up and enhance ANI debugfs file
-+    The same thing was proposed previously by Ben:
-+     http://www.spinics.net/lists/linux-wireless/msg112891.html
++    ath5k: Fix AR5K_PHY_TXPOWER_RATE_MAX register value setting.
      
 -    Unify scnprintf calls and include the current OFDM/CCK immunity level.
-+    The only difference here is that I make sure only processed packets are counted
-+    in the budget by checking at the end of the rx loop.
++    I was reading ath5k power setting code and
++    noticed typing error in ath5k_hw_txpower function.
++    Invalid value was written to AR5K_PHY_TXPOWER_RATE_MAX
++    register.
      
 -    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-+    Signed-off-by: Tim Harvey <tharvey@gateworks.com>
-+    Acked-by: Felix Fietkau <nbd@openwrt.org>
++    Signed-off-by: Nikolay Ledovskikh <nledovskikh@gmail.com>
++    Acked-by: Nick Kossifidis <mickflemm@gmail.com>
 +    Signed-off-by: John W. Linville <linville@tuxdriver.com>
  
 -commit 22e298b5a3a8a49e33805d4e351965123dede35b
 -Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Sun Mar 9 10:58:47 2014 +0100
-+commit 3a758134e66ca74a9df792616b5288b2fa2cfd7f
-+Author: Tim Harvey <tharvey@gateworks.com>
-+Date:   Mon Apr 21 16:14:56 2014 -0700
++commit 4d76248013dbb1948429555208900a585b0f351d
++Author: Janusz Dziedzic <janusz.dziedzic@tieto.com>
++Date:   Tue Apr 8 13:38:43 2014 +0200
  
 -    ath9k: fix ready time of the multicast buffer queue
-+    ath9k: fix possible hang on flush
-     
+-    
 -    qi->tqi_readyTime is written directly to registers that expect
 -    microseconds as unit instead of TU.
 -    When setting the CABQ ready time, cur_conf->beacon_interval is in TU, so
 -    convert it to microseconds before passing it to ath9k_hw.
-+    If a flush is requested, make sure to clear the descriptor once we've
-+    processed it.
++    ath9k: Enable DFS only when ATH9K_DFS_CERTIFIED
      
 -    This should hopefully fix some Tx DMA issues with buffered multicast
 -    frames in AP mode.
-+    This resolves a hang that will occur if all RX descriptors are full when a
-+    flush is requested.
++    Add DFS interface combination only when
++    CONFIG_ATH9K_DFS_CERTIFIED is set. In other case
++    user can run CAC/beaconing without proper handling
++    of pulse events (without radar detection activated).
      
 -    Cc: stable@vger.kernel.org
 -    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-+    Signed-off-by: Tim Harvey <tharvey@gateworks.com>
-+    Acked-by: Felix Fietkau <nbd@openwrt.org>
++    Reported-by: Cedric Voncken <cedric.voncken@acksys.fr>
++    Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
 +    Signed-off-by: John W. Linville <linville@tuxdriver.com>
  
 -commit fcb064fdd5a27bec8d24099bc0172468f34c97cb
-+commit eefb1d6adc4c60d219182b8917e4567484ce07fc
- Author: Felix Fietkau <nbd@openwrt.org>
+-Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Sun Mar 9 09:43:09 2014 +0100
--
++commit c83a4e5156a4b4dd22137d33a5625440982d6d37
++Author: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
++Date:   Mon Apr 28 21:17:08 2014 +0530
+ 
 -    ath9k_hw: fix unreachable code in baseband hang detection code
--    
++    ath9k_hw: fix worse EVM for 11b rates
+     
 -    The commit "ath9k: reduce baseband hang detection false positive rate"
 -    added a delay in the loop checking the baseband state, however it was
 -    unreachable due to previous 'continue' statements.
--    
++    Adjust FIR filter co-efficients to improve EVM for 11b rates.
+     
 -    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
 -    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
++    Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
++    Signed-off-by: John W. Linville <linville@tuxdriver.com>
+ 
 -commit 31959d8df39319e32c6d5ba9c135727be90cfad7
 -Author: Michal Kazior <michal.kazior@tieto.com>
 -Date:   Fri Mar 7 08:09:38 2014 +0100
--
++commit 8aab2c7a2f4a957e344db429dfb1190ae59ce8b5
++Author: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
++Date:   Mon Apr 28 21:17:07 2014 +0530
+ 
 -    mac80211: fix possible NULL dereference
 -    
 -    If chanctx is missing on a given vif then the band
@@ -4061,24 +4053,37 @@ index a1af6c2..1405cc3 100644
 -    
 -    [ 4605.207223] BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
 -    [ 4605.210789] IP: [<ffffffffa07b5635>] ieee80211_parse_bitrates+0x65/0x110 [mac80211]
--    
++    ath9k_hw: update ar9300 initvals
+     
 -    The splat was preceeded by WARN_ON(!chanctx_conf)
 -    in ieee80211_get_sdata_band().
--    
++     * rfsat gainchange hysteresis of rf_gain stuck with large
++       interference present.
+     
 -    Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
-+Date:   Mon Apr 28 18:27:41 2014 +0200
++    Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
++    Signed-off-by: John W. Linville <linville@tuxdriver.com>
  
 -commit 6c5a3ffa0a2d22c091a2717f427259bacf77ac5e
 -Author: Michael Braun <michael-dev@fami-braun.de>
 -Date:   Thu Mar 6 15:08:43 2014 +0100
--
++commit 8c7ae357cc5b6bd037ad2d666e9f3789cf882925
++Author: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
++Date:   Wed Apr 23 15:07:57 2014 +0530
+ 
 -    mac80211: fix WPA with VLAN on AP side with ps-sta again
--    
++    ath9k: fix race in setting ATH_OP_INVALID
+     
 -    commit de74a1d9032f4d37ea453ad2a647e1aff4cd2591
 -      "mac80211: fix WPA with VLAN on AP side with ps-sta"
 -    fixed an issue where queued multicast packets would
 -    be sent out encrypted with the key of an other bss.
--    
++    The commit "ath9k: move sc_flags to ath_common" moved setting
++    ATH_OP_INVALID flag below ieee80211_register_hw. This is causing
++    the flag never being cleared randomly as the drv_start is called
++    prior to setting flag. Fix this by setting the flag prior to
++    register_hw.
+     
 -    commit "7cbf9d017dbb5e3276de7d527925d42d4c11e732"
 -      "mac80211: fix oops on mesh PS broadcast forwarding"
 -    essentially reverted it, because vif.type cannot be AP_VLAN
@@ -4095,18 +4100,25 @@ index a1af6c2..1405cc3 100644
 -    Cc: <linux-wireless@vger.kernel.org>
 -    Cc: <projekt-wlan@fem.tu-ilmenau.de>
 -    Signed-off-by: Michael Braun <michael-dev@fami-braun.de>
--
++    Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
++    Signed-off-by: John W. Linville <linville@tuxdriver.com>
+ 
 -commit 9d6ab9bdb9b368a6cf9519f0f92509b5b2c297ec
 -Author: Johannes Berg <johannes.berg@intel.com>
 -Date:   Mon Mar 3 14:19:08 2014 +0100
--
++commit c82552c5b0cb1735dbcbad78b1ffc6d3c212dc56
++Author: Tim Harvey <tharvey@gateworks.com>
++Date:   Mon Apr 21 16:14:57 2014 -0700
+ 
 -    cfg80211: remove racy beacon_interval assignment
--    
++    ath9k: add a recv budget
+     
 -    In case of AP mode, the beacon interval is already reset to
 -    zero inside cfg80211_stop_ap(), and in the other modes it
 -    isn't relevant. Remove the assignment to remove a potential
 -    race since the assignment isn't properly locked.
-+    ath9k: remove tid->paused flag
++    Implement a recv budget so that in cases of high traffic we still allow other
++    taskets to get processed.
      
 -    Reported-by: Michal Kazior <michal.kazior@tieto.com>
 -    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
@@ -4116,82 +4128,86 @@ index a1af6c2..1405cc3 100644
 -Date:   Fri Feb 28 18:52:56 2014 +0100
 -
 -    ath9k_hw: tweak noise immunity thresholds for older chipsets
-+    There are some corner cases where the driver could get stuck with a full
-+    tid queue that is paused, leading to a software tx queue hang.
++    Without this, we can encounter a host of issues during high wireless traffic
++    reception depending on system load including rcu stall's detected (ARM),
++    soft lockups, failure to service critical tasks such as watchdog resets,
++    and triggering of the tx stuck tasklet.
      
 -    Older chipsets are more sensitive to high PHY error counts, and the
 -    current noise immunity thresholds were based on tests run at QCA with
 -    newer chipsets.
-+    Since the tx queueing rework, pausing per-tid queues on aggregation
-+    session setup is no longer necessary. The driver will assign sequence
-+    numbers to buffered frames when a new session is established, in order
-+    to get the correct starting sequence number.
++    The same thing was proposed previously by Ben:
++     http://www.spinics.net/lists/linux-wireless/msg112891.html
      
 -    This patch brings back the values from the old ANI implementation for
 -    old chipsets, and it also disables weak signal detection on an earlier
 -    noise immunity level, to improve overall radio stability on affected
 -    devices.
-+    mac80211 prevents new frames from entering the queue during setup.
++    The only difference here is that I make sure only processed packets are counted
++    in the budget by checking at the end of the rx loop.
      
-     Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+-    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
++    Signed-off-by: Tim Harvey <tharvey@gateworks.com>
++    Acked-by: Felix Fietkau <nbd@openwrt.org>
++    Signed-off-by: John W. Linville <linville@tuxdriver.com>
  
 -commit 431e506da5953adc3b65af25f4b90873d528c115
-+commit 98a713933d8495f4078f561c1e651b738dd5b531
- Author: Felix Fietkau <nbd@openwrt.org>
+-Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Fri Feb 28 18:44:13 2014 +0100
-+Date:   Sun Apr 27 14:49:03 2014 +0200
++commit 3a758134e66ca74a9df792616b5288b2fa2cfd7f
++Author: Tim Harvey <tharvey@gateworks.com>
++Date:   Mon Apr 21 16:14:56 2014 -0700
  
 -    ath9k_hw: toggle weak signal detection in AP mode on older chipsets
 -    
 -    The commit 80b4205b "ath9k: Fix OFDM weak signal detection for AP mode"
 -    prevented weak signal detection changes from taking effect in AP mode on
 -    all chipsets, claiming it is "not allowed".
-+    ath9k_hw: do not lower ANI setting below default on AR913x
++    ath9k: fix possible hang on flush
      
 -    The main reason for not disabling weak signal detection in AP mode is
 -    that typically beacon RSSI is used to track whether it is needed to
 -    boost range, and this is unavailable in AP mode for obvious reasons.
-+    When the amount of noise fluctuates strongly, low immunity settings
-+    can sometimes disrupt signal detection on AR913x chips. When that
-+    happens, no OFDM/CCK errors are reported anymore, and ANI tunes the
-+    radio to the lowest immunity settings.
-+    Usually rx/tx fails as well in that case.
++    If a flush is requested, make sure to clear the descriptor once we've
++    processed it.
      
 -    The problem with not disabling weak signal detection is that older
 -    chipsets are very sensitive to high PHY error counts. When faced with
 -    heavy noise, this can lead to an excessive amount of "Failed to stop
 -    TX DMA" errors in the field.
-+    To fix this, keep noise immunity settings at or above ANI default level,
-+    which will keep radio parameters at or above INI values.
++    This resolves a hang that will occur if all RX descriptors are full when a
++    flush is requested.
      
-     Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+-    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
++    Signed-off-by: Tim Harvey <tharvey@gateworks.com>
++    Acked-by: Felix Fietkau <nbd@openwrt.org>
++    Signed-off-by: John W. Linville <linville@tuxdriver.com>
  
 -commit 98d1a6c5b14688ed030e81b889f607be308e0df9
-+commit 7cbb4c021bfd1e656f5b9953a947ab3c64e4e3b0
++commit eefb1d6adc4c60d219182b8917e4567484ce07fc
  Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Mon Feb 24 22:20:32 2014 +0100
-+Date:   Thu Apr 10 10:49:01 2014 +0200
++Date:   Mon Apr 28 18:27:41 2014 +0200
  
 -    ath9k: fix invalid descriptor discarding
-+    mac80211: exclude AP_VLAN interfaces from tx power calculation
-     
+-    
 -    Only set sc->rx.discard_next to rx_stats->rs_more when actually
 -    discarding the current descriptor.
--    
++    ath9k: remove tid->paused flag
+     
 -    Also, fix a detection of broken descriptors:
 -    First the code checks if the current descriptor is not done.
 -    Then it checks if the next descriptor is done.
 -    Add a check that afterwards checks the first descriptor again, because
 -    it might have been completed in the mean time.
--    
++    There are some corner cases where the driver could get stuck with a full
++    tid queue that is paused, leading to a software tx queue hang.
+     
 -    This fixes a regression introduced in
 -    commit 723e711356b5a8a95728a890e254e8b0d47b55cf
 -    "ath9k: fix handling of broken descriptors"
-+    Their power value is initialized to zero. This patch fixes an issue
-+    where the configured power drops to the minimum value when AP_VLAN
-+    interfaces are created/removed.
-     
-     Cc: stable@vger.kernel.org
+-    
+-    Cc: stable@vger.kernel.org
 -    Reported-by: Marco André Dinis <marcoandredinis@gmail.com>
 -    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
 -
@@ -4200,18 +4216,26 @@ index a1af6c2..1405cc3 100644
 -Date:   Mon Feb 24 11:43:50 2014 +0100
 -
 -    ath9k: reduce baseband hang detection false positive rate
--    
++    Since the tx queueing rework, pausing per-tid queues on aggregation
++    session setup is no longer necessary. The driver will assign sequence
++    numbers to buffered frames when a new session is established, in order
++    to get the correct starting sequence number.
+     
 -    Check if the baseband state remains stable, and add a small delay
 -    between register reads.
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
++    mac80211 prevents new frames from entering the queue during setup.
+     
+     Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+ 
 -commit 118945bb12082e9d4edddc868d88143164e0f440
--Author: Felix Fietkau <nbd@openwrt.org>
++commit 98a713933d8495f4078f561c1e651b738dd5b531
+ Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Sat Feb 22 14:55:23 2014 +0100
--
++Date:   Sun Apr 27 14:49:03 2014 +0200
+ 
 -    ath5k: set SURVEY_INFO_IN_USE on get_survey
--    
++    ath9k_hw: do not lower ANI setting below default on AR913x
+     
 -    Only one channel is returned - the one currently being used.
 -    
 -    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
@@ -4221,46 +4245,60 @@ index a1af6c2..1405cc3 100644
 -Date:   Sat Feb 22 14:44:52 2014 +0100
 -
 -    ath9k: make some hardware reset log messages debug-only
--    
++    When the amount of noise fluctuates strongly, low immunity settings
++    can sometimes disrupt signal detection on AR913x chips. When that
++    happens, no OFDM/CCK errors are reported anymore, and ANI tunes the
++    radio to the lowest immunity settings.
++    Usually rx/tx fails as well in that case.
+     
 -    On some chips, baseband watchdog hangs are more common than others, and
 -    the driver has support for handling them.
 -    Interrupts even after a watchdog hang are also quite common, so there's
 -    not much point in spamming the user's logfiles.
--    
++    To fix this, keep noise immunity settings at or above ANI default level,
++    which will keep radio parameters at or above INI values.
+     
      Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  
 -commit b14fbb554fc65a2e0b5c41a319269b0350f187e7
-+commit 0ca13e26341733bf9577287fb04a3bef0d2f5cc9
++commit 7cbb4c021bfd1e656f5b9953a947ab3c64e4e3b0
  Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Sat Feb 22 14:35:25 2014 +0100
-+Date:   Wed Apr 9 00:07:01 2014 +0200
++Date:   Thu Apr 10 10:49:01 2014 +0200
  
 -    ath9k: do not set half/quarter channel flags in AR_PHY_MODE
-+    mac80211: suppress BSS info change notifications for AP_VLAN
-     
+-    
 -    5/10 MHz channel bandwidth is configured via the PLL clock, instead of
 -    the AR_PHY_MODE register. Using that register is AR93xx specific, and
 -    makes the mode incompatible with earlier chipsets.
-+    Fixes warnings on tx power changes
++    mac80211: exclude AP_VLAN interfaces from tx power calculation
      
 -    In some early versions, these flags were apparently applied at the wrong
 -    point in time and thus did not cause connectivity issues, however now
 -    they are causing problems, as pointed out in this OpenWrt ticket:
 -    
 -    https://dev.openwrt.org/ticket/14916
--    
--    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--
++    Their power value is initialized to zero. This patch fixes an issue
++    where the configured power drops to the minimum value when AP_VLAN
++    interfaces are created/removed.
+     
++    Cc: stable@vger.kernel.org
+     Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+ 
 -commit 0f1cb7be2551b30b02cd54c897e0e29e483cfda5
--Author: Felix Fietkau <nbd@openwrt.org>
++commit 0ca13e26341733bf9577287fb04a3bef0d2f5cc9
+ Author: Felix Fietkau <nbd@openwrt.org>
 -Date:   Sat Feb 22 13:43:29 2014 +0100
--
++Date:   Wed Apr 9 00:07:01 2014 +0200
+ 
 -    ath9k: fix ps-poll responses under a-mpdu sessions
--    
++    mac80211: suppress BSS info change notifications for AP_VLAN
+     
 -    When passing tx frames to the U-APSD queue for powersave poll responses,
 -    the ath_atx_tid pointer needs to be passed to ath_tx_setup_buffer for
 -    proper sequence number accounting.
--    
++    Fixes warnings on tx power changes
+     
 -    This fixes high latency and connection stability issues with ath9k
 -    running as AP and a few kinds of mobile phones as client, when PS-Poll
 -    is heavily used
@@ -4907,7 +4945,7 @@ index a1af6c2..1405cc3 100644
 -commit dfb6889a75c601aedb7450b7e606668e77da6679
 -Author: Johannes Berg <johannes.berg@intel.com>
 -Date:   Wed Jan 22 11:14:19 2014 +0200
- 
+-
 -    cfg80211: send scan results from work queue
 -    
 -    Due to the previous commit, when a scan finishes, it is in theory
@@ -4935,7 +4973,7 @@ index a1af6c2..1405cc3 100644
 -commit 45b7ab41fc08627d9a8428cb413d5d84662a9707
 -Author: Johannes Berg <johannes.berg@intel.com>
 -Date:   Wed Jan 22 11:14:18 2014 +0200
--
+ 
 -    cfg80211: fix scan done race
 -    
 -    When an interface/wdev is removed, any ongoing scan should be
@@ -6878,9 +6916,7 @@ index a1af6c2..1405cc3 100644
 - 				     !wdev->ibss_dfs_possible)
 - 				  ? CHAN_MODE_SHARED
 - 				  : CHAN_MODE_EXCLUSIVE;
-++	if (AR_SREV_9100(ah) && immunityLevel < ATH9K_ANI_OFDM_DEF_LEVEL)
-++		immunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL;
- +
+-+
 -+			/* consider worst-case - IBSS can try to return to the
 -+			 * original user-specified channel as creator */
 -+			if (wdev->ibss_dfs_possible)
@@ -6911,7 +6947,9 @@ index a1af6c2..1405cc3 100644
 --			*chan = wdev->channel;
 -+			*chan = wdev->chandef.chan;
 - 			*chanmode = CHAN_MODE_SHARED;
--+
+++	if (AR_SREV_9100(ah) && immunityLevel < ATH9K_ANI_OFDM_DEF_LEVEL)
+++		immunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL;
+ +
 -+			if (cfg80211_chandef_dfs_required(wdev->wiphy,
 -+							  &wdev->chandef))
 -+				*radar_detect |= BIT(wdev->chandef.width);
@@ -6927,9 +6965,7 @@ index a1af6c2..1405cc3 100644
 --		wdev->channel = setup->chandef.chan;
 -+		wdev->chandef = setup->chandef;
 - 	}
-+ 	if (!scan)
-+ 		aniState->ofdmNoiseImmunityLevel = immunityLevel;
-  
+- 
 - 	return err;
 -@@ -244,7 +244,7 @@ int cfg80211_set_mesh_channel(struct cfg
 - 		err = rdev_libertas_set_mesh_channel(rdev, wdev->netdev,
@@ -6937,9 +6973,8 @@ index a1af6c2..1405cc3 100644
 - 		if (!err)
 --			wdev->channel = chandef->chan;
 -+			wdev->chandef = *chandef;
-+@@ -235,6 +238,9 @@ static void ath9k_hw_set_cck_nil(struct 
-+ 		BEACON_RSSI(ah), ATH9K_ANI_RSSI_THR_LOW,
-+ 		ATH9K_ANI_RSSI_THR_HIGH);
++ 	if (!scan)
++ 		aniState->ofdmNoiseImmunityLevel = immunityLevel;
   
 - 		return err;
 - 	}
@@ -6957,7 +6992,10 @@ index a1af6c2..1405cc3 100644
 -@@ -772,7 +772,7 @@ void cfg80211_cac_event(struct net_devic
 - 	if (WARN_ON(!wdev->cac_started))
 - 		return;
-- 
++@@ -235,6 +238,9 @@ static void ath9k_hw_set_cck_nil(struct 
++ 		BEACON_RSSI(ah), ATH9K_ANI_RSSI_THR_LOW,
++ 		ATH9K_ANI_RSSI_THR_HIGH);
+  
 --	if (WARN_ON(!wdev->channel))
 -+	if (WARN_ON(!wdev->chandef.chan))
 - 		return;
@@ -6969,12 +7007,12 @@ index a1af6c2..1405cc3 100644
 - 			break;
 - 		}
 - 	}
--+
--+	if (is2GHz && !twiceMaxEdgePower)
--+		twiceMaxEdgePower = 60;
 ++	if (AR_SREV_9100(ah) && immunityLevel < ATH9K_ANI_CCK_DEF_LEVEL)
 ++		immunityLevel = ATH9K_ANI_CCK_DEF_LEVEL;
  +
+-+	if (is2GHz && !twiceMaxEdgePower)
+-+		twiceMaxEdgePower = 60;
+-+
 - 	return twiceMaxEdgePower;
 - }
 - 
@@ -7093,12 +7131,12 @@ index a1af6c2..1405cc3 100644
 -+	int magnitude, phase;
 - 	u32 tx_corr_coeff[MAX_MEASUREMENT][AR9300_MAX_CHAINS];
 - 	struct ath9k_hw_cal_data *caldata = ah->caldata;
-+ 	struct ath_atx_ac *ac = tid->ac;
-  
+- 
 -@@ -920,21 +923,30 @@ static void ar9003_hw_tx_iqcal_load_avg_
 - 		if (nmeasurement > MAX_MEASUREMENT)
 - 			nmeasurement = MAX_MEASUREMENT;
-- 
++ 	struct ath_atx_ac *ac = tid->ac;
+  
 --		/* detect outlier only if nmeasurement > 1 */
 --		if (nmeasurement > 1) {
 --			/* Detect magnitude outlier */
@@ -7273,16 +7311,14 @@ index a1af6c2..1405cc3 100644
 - 
 -@@ -1409,7 +1484,7 @@ skip_tx_iqcal:
 - 	}
-+@@ -1510,7 +1505,6 @@ void ath_tx_aggr_resume(struct ath_softc
-+ 	ath_txq_lock(sc, txq);
-  
+- 
 - 	if (txiqcal_done)
 --		ar9003_hw_tx_iq_cal_post_proc(ah, is_reusable);
 -+		ar9003_hw_tx_iq_cal_post_proc(ah, 0, is_reusable);
 - 	else if (caldata && test_bit(TXIQCAL_DONE, &caldata->cal_flags))
 - 		ar9003_hw_tx_iq_cal_reload(ah);
-+ 	tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor;
-+-	tid->paused = false;
++@@ -1510,7 +1505,6 @@ void ath_tx_aggr_resume(struct ath_softc
++ 	ath_txq_lock(sc, txq);
   
 -@@ -1455,14 +1530,38 @@ skip_tx_iqcal:
 - 	return true;
@@ -7321,7 +7357,9 @@ index a1af6c2..1405cc3 100644
 -+	bool status = true;
 - 	bool run_agc_cal = false, sep_iq_cal = false;
 -+	int i = 0;
-- 
++ 	tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor;
++-	tid->paused = false;
+  
 - 	/* Use chip chainmask only for calibration */
 - 	ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
 -@@ -1485,7 +1584,12 @@ static bool ar9003_hw_init_cal_soc(struc
@@ -7607,20 +7645,7 @@ index a1af6c2..1405cc3 100644
 - 
 --static void cleanup_single_sta(struct sta_info *sta)
 -+static void __cleanup_single_sta(struct sta_info *sta)
-+@@ -781,6 +781,9 @@ int ath9k_init_device(u16 devid, struct 
-+ 	common = ath9k_hw_common(ah);
-+ 	ath9k_set_hw_capab(sc, hw);
-+ 
-++	/* Will be cleared in ath9k_start() */
-++	set_bit(ATH_OP_INVALID, &common->op_flags);
-++
-+ 	/* Initialize regulatory */
-+ 	error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
-+ 			      ath9k_reg_notifier);
-+--- a/drivers/net/wireless/ath/ath9k/pci.c
-++++ b/drivers/net/wireless/ath/ath9k/pci.c
-+@@ -784,7 +784,6 @@ static int ath_pci_probe(struct pci_dev 
-  {
+- {
 - 	int ac, i;
 - 	struct tid_ampdu_tx *tid_tx;
 -@@ -99,7 +99,8 @@ static void cleanup_single_sta(struct st
@@ -7672,20 +7697,7 @@ index a1af6c2..1405cc3 100644
 --	err = sta_info_insert_drv_state(local, sdata, sta);
 --	if (err)
 --		goto out_err;
-+ 	struct ath_softc *sc;
-+ 	struct ieee80211_hw *hw;
-+-	struct ath_common *common;
-+ 	u8 csz;
-+ 	u32 val;
-+ 	int ret = 0;
-+@@ -877,10 +876,6 @@ static int ath_pci_probe(struct pci_dev 
-+ 	wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
-+ 		   hw_name, (unsigned long)sc->mem, pdev->irq);
-+ 
-+-	/* Will be cleared in ath9k_start() */
-+-	common = ath9k_hw_common(sc->sc_ah);
-+-	set_bit(ATH_OP_INVALID, &common->op_flags);
- -
+--
 - 	local->num_sta++;
 - 	local->sta_generation++;
 - 	smp_mb();
@@ -7712,7 +7724,7 @@ index a1af6c2..1405cc3 100644
 -@@ -522,6 +537,12 @@ static int sta_info_insert_finish(struct
 - 		mesh_accept_plinks_update(sdata);
 - 
-  	return 0;
+- 	return 0;
 -+ out_remove:
 -+	sta_info_hash_del(local, sta);
 -+	list_del_rcu(&sta->list);
@@ -7763,7 +7775,21 @@ index a1af6c2..1405cc3 100644
 -@@ -1109,6 +1120,8 @@ void ieee80211_sta_ps_deliver_wakeup(str
 - 
 - 	skb_queue_head_init(&pending);
-- 
++@@ -670,6 +670,7 @@ static const struct ieee80211_iface_comb
++ 		.num_different_channels = 1,
++ 		.beacon_int_infra_match = true,
++ 	},
+++#ifdef CONFIG_ATH9K_DFS_CERTIFIED
++ 	{
++ 		.limits = if_dfs_limits,
++ 		.n_limits = ARRAY_SIZE(if_dfs_limits),
++@@ -679,6 +680,7 @@ static const struct ieee80211_iface_comb
++ 		.radar_detect_widths =	BIT(NL80211_CHAN_WIDTH_20_NOHT) |
++ 					BIT(NL80211_CHAN_WIDTH_20),
++ 	}
+++#endif
++ };
+  
 -+	/* sync with ieee80211_tx_h_unicast_ps_buf */
 -+	spin_lock(&sta->ps_lock);
 - 	/* Send all buffered frames to the station */
@@ -7772,13 +7798,19 @@ index a1af6c2..1405cc3 100644
 -@@ -1127,7 +1140,12 @@ void ieee80211_sta_ps_deliver_wakeup(str
 - 		buffered += tmp - count;
 - 	}
-- 
++ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
++@@ -781,6 +783,9 @@ int ath9k_init_device(u16 devid, struct 
++ 	common = ath9k_hw_common(ah);
++ 	ath9k_set_hw_capab(sc, hw);
+  
 --	ieee80211_add_pending_skbs_fn(local, &pending, clear_sta_ps_flags, sta);
 -+	ieee80211_add_pending_skbs(local, &pending);
 -+	clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
 -+	clear_sta_flag(sta, WLAN_STA_PS_STA);
 -+	spin_unlock(&sta->ps_lock);
--+
+++	/* Will be cleared in ath9k_start() */
+++	set_bit(ATH_OP_INVALID, &common->op_flags);
+ +
 -+	atomic_dec(&ps->num_sta_ps);
 - 
 - 	/* This station just woke up and isn't aware of our SMPS state */
@@ -7817,7 +7849,13 @@ index a1af6c2..1405cc3 100644
 --				   void (*fn)(void *data), void *data)
 -+void ieee80211_add_pending_skbs(struct ieee80211_local *local,
 -+				struct sk_buff_head *skbs)
-- {
++ 	/* Initialize regulatory */
++ 	error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
++ 			      ath9k_reg_notifier);
++--- a/drivers/net/wireless/ath/ath9k/pci.c
+++++ b/drivers/net/wireless/ath/ath9k/pci.c
++@@ -784,7 +784,6 @@ static int ath_pci_probe(struct pci_dev 
+  {
 - 	struct ieee80211_hw *hw = &local->hw;
 - 	struct sk_buff *skb;
 -@@ -461,9 +460,6 @@ void ieee80211_add_pending_skbs_fn(struc
@@ -7826,7 +7864,20 @@ index a1af6c2..1405cc3 100644
 - 
 --	if (fn)
 --		fn(data);
---
++ 	struct ath_softc *sc;
++ 	struct ieee80211_hw *hw;
++-	struct ath_common *common;
++ 	u8 csz;
++ 	u32 val;
++ 	int ret = 0;
++@@ -877,10 +876,6 @@ static int ath_pci_probe(struct pci_dev 
++ 	wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
++ 		   hw_name, (unsigned long)sc->mem, pdev->irq);
++ 
++-	/* Will be cleared in ath9k_start() */
++-	common = ath9k_hw_common(sc->sc_ah);
++-	set_bit(ATH_OP_INVALID, &common->op_flags);
+ -
 - 	for (i = 0; i < hw->queues; i++)
 - 		__ieee80211_wake_queue(hw, i,
 - 			IEEE80211_QUEUE_STOP_REASON_SKB_ADD);
@@ -7927,7 +7978,7 @@ index a1af6c2..1405cc3 100644
 -+	len += scnprintf(buf + len, sizeof(buf) - len,
 - 			 "%17s: %2d\n", "MCI Reset",
 - 			 sc->debug.stats.reset[RESET_TYPE_MCI]);
-  
+- 
 ---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
 -+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
 -@@ -868,10 +868,6 @@ static void ar9003_hw_set_rfmode(struct 
@@ -8035,12 +8086,107 @@ index a1af6c2..1405cc3 100644
 -@@ -1043,18 +1048,15 @@ static int ath9k_rx_skb_preprocess(struc
 - 		if (ath_process_fft(sc, hdr, rx_stats, rx_status->mactime))
 - 			RX_STAT_INC(rx_spectral);
-- 
++ 	return 0;
+  
 --		ret = -EINVAL;
 --		goto exit;
 -+		return -EINVAL;
-- 	}
-- 
++ err_init:
++--- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
+++++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
++@@ -410,7 +410,7 @@ static const u32 ar9300_2p2_baseband_cor
++ 	{0x00009e30, 0x06336f77},
++ 	{0x00009e34, 0x6af6532f},
++ 	{0x00009e38, 0x0cc80c00},
++-	{0x00009e40, 0x0d261820},
+++	{0x00009e40, 0x0d261800},
++ 	{0x00009e4c, 0x00001004},
++ 	{0x00009e50, 0x00ff03f1},
++ 	{0x00009e54, 0x00000000},
++--- a/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h
+++++ b/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h
++@@ -592,7 +592,7 @@ static const u32 ar9331_1p1_baseband_cor
++ 	{0x00009e30, 0x06336f77},
++ 	{0x00009e34, 0x6af6532f},
++ 	{0x00009e38, 0x0cc80c00},
++-	{0x00009e40, 0x0d261820},
+++	{0x00009e40, 0x0d261800},
++ 	{0x00009e4c, 0x00001004},
++ 	{0x00009e50, 0x00ff03f1},
++ 	{0x00009fc0, 0x803e4788},
++--- a/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h
+++++ b/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h
++@@ -231,7 +231,7 @@ static const u32 ar9331_1p2_baseband_cor
++ 	{0x00009e30, 0x06336f77},
++ 	{0x00009e34, 0x6af6532f},
++ 	{0x00009e38, 0x0cc80c00},
++-	{0x00009e40, 0x0d261820},
+++	{0x00009e40, 0x0d261800},
++ 	{0x00009e4c, 0x00001004},
++ 	{0x00009e50, 0x00ff03f1},
++ 	{0x00009fc0, 0x803e4788},
++--- a/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
+++++ b/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
++@@ -318,7 +318,7 @@ static const u32 ar9340_1p0_baseband_cor
++ 	{0x00009e30, 0x06336f77},
++ 	{0x00009e34, 0x6af6532f},
++ 	{0x00009e38, 0x0cc80c00},
++-	{0x00009e40, 0x0d261820},
+++	{0x00009e40, 0x0d261800},
++ 	{0x00009e4c, 0x00001004},
++ 	{0x00009e50, 0x00ff03f1},
++ 	{0x00009e54, 0x00000000},
++@@ -348,9 +348,9 @@ static const u32 ar9340_1p0_baseband_cor
++ 	{0x0000a370, 0x00000000},
++ 	{0x0000a390, 0x00000001},
++ 	{0x0000a394, 0x00000444},
++-	{0x0000a398, 0x00000000},
++-	{0x0000a39c, 0x210d0401},
++-	{0x0000a3a0, 0xab9a7144},
+++	{0x0000a398, 0x001f0e0f},
+++	{0x0000a39c, 0x0075393f},
+++	{0x0000a3a0, 0xb79f6427},
++ 	{0x0000a3a4, 0x00000000},
++ 	{0x0000a3a8, 0xaaaaaaaa},
++ 	{0x0000a3ac, 0x3c466478},
++--- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h
+++++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h
++@@ -90,7 +90,7 @@ static const u32 ar9580_1p0_baseband_cor
++ 	{0x00009e30, 0x06336f77},
++ 	{0x00009e34, 0x6af6532f},
++ 	{0x00009e38, 0x0cc80c00},
++-	{0x00009e40, 0x0d261820},
+++	{0x00009e40, 0x0d261800},
++ 	{0x00009e4c, 0x00001004},
++ 	{0x00009e50, 0x00ff03f1},
++ 	{0x00009e54, 0x00000000},
++--- a/drivers/net/wireless/ath/ath9k/ar953x_initvals.h
+++++ b/drivers/net/wireless/ath/ath9k/ar953x_initvals.h
++@@ -257,9 +257,9 @@ static const u32 qca953x_1p0_baseband_co
++ 	{0x0000a370, 0x00000000},
++ 	{0x0000a390, 0x00000001},
++ 	{0x0000a394, 0x00000444},
++-	{0x0000a398, 0x1f020503},
++-	{0x0000a39c, 0x29180c03},
++-	{0x0000a3a0, 0x9a8b6844},
+++	{0x0000a398, 0x001f0e0f},
+++	{0x0000a39c, 0x0075393f},
+++	{0x0000a3a0, 0xb79f6427},
++ 	{0x0000a3a4, 0x000000ff},
++ 	{0x0000a3a8, 0x6a6a6a6a},
++ 	{0x0000a3ac, 0x6a6a6a6a},
++--- a/drivers/net/wireless/ath/ath5k/phy.c
+++++ b/drivers/net/wireless/ath/ath5k/phy.c
++@@ -3709,8 +3709,8 @@ ath5k_hw_txpower(struct ath5k_hw *ah, st
++ 			AR5K_REG_MS(AR5K_TUNE_MAX_TXPOWER, AR5K_TPC_CHIRP),
++ 			AR5K_TPC);
++ 	} else {
++-		ath5k_hw_reg_write(ah, AR5K_PHY_TXPOWER_RATE_MAX |
++-			AR5K_TUNE_MAX_TXPOWER, AR5K_PHY_TXPOWER_RATE_MAX);
+++		ath5k_hw_reg_write(ah, AR5K_TUNE_MAX_TXPOWER,
+++			AR5K_PHY_TXPOWER_RATE_MAX);
+  	}
+  
 - 	/*
 - 	 * everything but the rate is checked here, the rate check is done
 - 	 * separately to avoid doing two lookups for a rate for each frame.
@@ -8317,7 +8463,7 @@ index a1af6c2..1405cc3 100644
 - 				aniState->iniDef.cycpwrThr1Ext);
 - 			if (level > aniState->spurImmunityLevel)
 - 				ah->stats.ast_ani_spurup++;
-+ err_init:
++ 	return 0;
 diff --git a/package/mac80211/patches/310-ap_scan.patch b/package/mac80211/patches/310-ap_scan.patch
 index 389a003..87f165a 100644
 --- a/package/mac80211/patches/310-ap_scan.patch
@@ -8468,7 +8614,7 @@ index 96e7c6d..169eb9a 100644
   		ah->get_mac_revision = pdata->get_mac_revision;
   		ah->external_reset = pdata->external_reset;
 diff --git a/package/mac80211/patches/502-ath9k_ahb_init.patch b/package/mac80211/patches/502-ath9k_ahb_init.patch
-index 4edc63b..c1bdc6f 100644
+index 4edc63b..de61a9e 100644
 --- a/package/mac80211/patches/502-ath9k_ahb_init.patch
 +++ b/package/mac80211/patches/502-ath9k_ahb_init.patch
 @@ -1,15 +1,15 @@
@@ -8477,7 +8623,7 @@ index 4edc63b..c1bdc6f 100644
 -@@ -1112,23 +1112,23 @@ static int __init ath9k_init(void)
 - 		goto err_out;
 - 	}
-+@@ -895,23 +895,23 @@ static int __init ath9k_init(void)
++@@ -897,23 +897,23 @@ static int __init ath9k_init(void)
 + {
 + 	int error;
   
@@ -8853,7 +8999,7 @@ index 30aa9ee..b84a991 100644
   
   	if (changed & IEEE80211_CONF_CHANGE_POWER) {
 diff --git a/package/mac80211/patches/530-ath9k_extra_leds.patch b/package/mac80211/patches/530-ath9k_extra_leds.patch
-index 59f78d9..1174a47 100644
+index 59f78d9..c78a3e5 100644
 --- a/package/mac80211/patches/530-ath9k_extra_leds.patch
 +++ b/package/mac80211/patches/530-ath9k_extra_leds.patch
 @@ -1,6 +1,6 @@
@@ -8889,7 +9035,7 @@ index 59f78d9..1174a47 100644
  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
 -@@ -1018,7 +1018,7 @@ int ath9k_init_device(u16 devid, struct 
-+@@ -809,7 +809,7 @@ int ath9k_init_device(u16 devid, struct 
++@@ -811,7 +811,7 @@ int ath9k_init_device(u16 devid, struct 
   
   #ifdef CPTCFG_MAC80211_LEDS
   	/* must be initialized before ieee80211_register_hw */
@@ -8982,7 +9128,7 @@ index d26a5af..e2e18c9 100644
   		ah->get_mac_revision = pdata->get_mac_revision;
   		ah->external_reset = pdata->external_reset;
 diff --git a/package/mac80211/patches/550-ath9k_entropy_from_adc.patch b/package/mac80211/patches/550-ath9k_entropy_from_adc.patch
-index b59c362..513c48d 100644
+index b59c362..439a574 100644
 --- a/package/mac80211/patches/550-ath9k_entropy_from_adc.patch
 +++ b/package/mac80211/patches/550-ath9k_entropy_from_adc.patch
 @@ -55,7 +55,7 @@
@@ -9001,7 +9147,7 @@ index b59c362..513c48d 100644
 - void ath9k_reload_chainmask_settings(struct ath_softc *sc)
 -@@ -980,6 +981,18 @@ static void ath9k_set_hw_capab(struct at
 + static const struct ieee80211_iface_limit if_limits[] = {
-+@@ -768,6 +769,18 @@ static void ath9k_set_hw_capab(struct at
++@@ -770,6 +771,18 @@ static void ath9k_set_hw_capab(struct at
   	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
   }
   
@@ -9010,7 +9156,7 @@ index b59c362..513c48d 100644
   		    const struct ath_bus_ops *bus_ops)
   {
 -@@ -1025,6 +1038,8 @@ int ath9k_init_device(u16 devid, struct 
-+@@ -816,6 +829,8 @@ int ath9k_init_device(u16 devid, struct 
++@@ -818,6 +831,8 @@ int ath9k_init_device(u16 devid, struct 
   		ARRAY_SIZE(ath9k_tpt_blink));
   #endif
   
@@ -9037,7 +9183,7 @@ index ffffe0c..579a633 100644
   static const struct ieee80211_iface_limit if_limits[] = {
   	{ .max = 2048,	.types = BIT(NL80211_IFTYPE_STATION) |
 diff --git a/package/mac80211/patches/552-ath9k_p2p_ps_support.patch b/package/mac80211/patches/552-ath9k_p2p_ps_support.patch
-index 4a61db3..e066a38 100644
+index 4a61db3..8cf9e61 100644
 --- a/package/mac80211/patches/552-ath9k_p2p_ps_support.patch
 +++ b/package/mac80211/patches/552-ath9k_p2p_ps_support.patch
 @@ -27,7 +27,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
@@ -9166,7 +9312,7 @@ index 4a61db3..e066a38 100644
   	ath9k_init_misc(sc);
   	ath_fill_led_pin(sc);
 -@@ -1082,6 +1085,9 @@ static void ath9k_deinit_softc(struct at
-+@@ -873,6 +876,9 @@ static void ath9k_deinit_softc(struct at
++@@ -875,6 +878,9 @@ static void ath9k_deinit_softc(struct at
   {
   	int i = 0;
   
@@ -9218,136 +9364,111 @@ index af94c9e..eddbc6c 100644
   	if (AR_SREV_9565(ah) && common->bt_ant_diversity)
   		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
   
-diff --git a/package/mac80211/patches/567-ath9k-qca953x-support.patch b/package/mac80211/patches/567-ath9k-qca953x-support.patch
-deleted file mode 100644
-index e73083a..0000000
---- a/package/mac80211/patches/567-ath9k-qca953x-support.patch
-+++ /dev/null
-@@ -1,124 +0,0 @@
----- a/drivers/net/wireless/ath/ath9k/ahb.c
--+++ b/drivers/net/wireless/ath/ath9k/ahb.c
--@@ -39,6 +39,10 @@ static const struct platform_device_id a
-- 		.name = "qca955x_wmac",
-- 		.driver_data = AR9300_DEVID_QCA955X,
-- 	},
--+	{
--+		.name = "qca953x_wmac",
--+		.driver_data = AR9300_DEVID_AR953X,
--+	},
-- 	{},
-- };
-- 
----- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
--+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
--@@ -4792,43 +4792,54 @@ static void ar9003_hw_power_control_over
-- 
-- tempslope:
-- 	if (AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
--+		u8 txmask = (eep->baseEepHeader.txrxMask & 0xf0) >> 4;
--+
-- 		/*
-- 		 * AR955x has tempSlope register for each chain.
-- 		 * Check whether temp_compensation feature is enabled or not.
-- 		 */
-- 		if (eep->baseEepHeader.featureEnable & 0x1) {
-- 			if (frequency < 4000) {
---				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
---					      AR_PHY_TPC_19_ALPHA_THERM,
---					      eep->base_ext2.tempSlopeLow);
---				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
---					      AR_PHY_TPC_19_ALPHA_THERM,
---					      temp_slope);
---				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
---					      AR_PHY_TPC_19_ALPHA_THERM,
---					      eep->base_ext2.tempSlopeHigh);
--+				if (txmask & BIT(0))
--+					REG_RMW_FIELD(ah, AR_PHY_TPC_19,
--+						      AR_PHY_TPC_19_ALPHA_THERM,
--+						      eep->base_ext2.tempSlopeLow);
--+				if (txmask & BIT(1))
--+					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
--+						      AR_PHY_TPC_19_ALPHA_THERM,
--+						      temp_slope);
--+				if (txmask & BIT(2))
--+					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
--+						      AR_PHY_TPC_19_ALPHA_THERM,
--+						      eep->base_ext2.tempSlopeHigh);
-- 			} else {
---				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
---					      AR_PHY_TPC_19_ALPHA_THERM,
---					      temp_slope);
---				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
---					      AR_PHY_TPC_19_ALPHA_THERM,
---					      temp_slope1);
---				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
---					      AR_PHY_TPC_19_ALPHA_THERM,
---					      temp_slope2);
--+				if (txmask & BIT(0))
--+					REG_RMW_FIELD(ah, AR_PHY_TPC_19,
--+						      AR_PHY_TPC_19_ALPHA_THERM,
--+						      temp_slope);
--+				if (txmask & BIT(1))
--+					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
--+						      AR_PHY_TPC_19_ALPHA_THERM,
--+						      temp_slope1);
--+				if (txmask & BIT(2))
--+					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
--+						      AR_PHY_TPC_19_ALPHA_THERM,
--+						      temp_slope2);
-- 			}
-- 		} else {
-- 			/*
-- 			 * If temp compensation is not enabled,
-- 			 * set all registers to 0.
-- 			 */
---			REG_RMW_FIELD(ah, AR_PHY_TPC_19,
---				      AR_PHY_TPC_19_ALPHA_THERM, 0);
---			REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
---				      AR_PHY_TPC_19_ALPHA_THERM, 0);
---			REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
---				      AR_PHY_TPC_19_ALPHA_THERM, 0);
--+			if (txmask & BIT(0))
--+				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
--+					      AR_PHY_TPC_19_ALPHA_THERM, 0);
--+			if (txmask & BIT(1))
--+				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
--+					      AR_PHY_TPC_19_ALPHA_THERM, 0);
--+			if (txmask & BIT(2))
--+				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
--+					      AR_PHY_TPC_19_ALPHA_THERM, 0);
-- 		}
-- 	} else {
-- 		REG_RMW_FIELD(ah, AR_PHY_TPC_19,
----- a/drivers/net/wireless/ath/ath9k/hw.c
--+++ b/drivers/net/wireless/ath/ath9k/hw.c
--@@ -901,7 +901,7 @@ static void ath9k_hw_init_interrupt_mask
-- 		AR_IMR_RXORN |
-- 		AR_IMR_BCNMISC;
-- 
---	if (AR_SREV_9340(ah) || AR_SREV_9550(ah))
--+	if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah))
-- 		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;
-- 
-- 	if (AR_SREV_9300_20_OR_LATER(ah)) {
--@@ -3104,6 +3104,7 @@ static struct {
-- 	{ AR_SREV_VERSION_9462,         "9462" },
-- 	{ AR_SREV_VERSION_9550,         "9550" },
-- 	{ AR_SREV_VERSION_9565,         "9565" },
--+	{ AR_SREV_VERSION_9531,         "9531" },
-- };
-- 
-- /* For devices with external radios */
----- a/drivers/net/wireless/ath/ath9k/mac.c
--+++ b/drivers/net/wireless/ath/ath9k/mac.c
--@@ -837,7 +837,7 @@ void ath9k_hw_enable_interrupts(struct a
-- 		return;
-- 	}
-- 
---	if (AR_SREV_9340(ah) || AR_SREV_9550(ah))
--+	if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah))
-- 		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;
-- 
-- 	async_mask = AR_INTR_MAC_IRQ;
+diff --git a/package/mac80211/patches/567-ath9k_ar953x_read_mac_rev.patch b/package/mac80211/patches/567-ath9k_ar953x_read_mac_rev.patch
+new file mode 100644
+index 0000000..31778a4
+--- /dev/null
++++ b/package/mac80211/patches/567-ath9k_ar953x_read_mac_rev.patch
+@@ -0,0 +1,11 @@
++--- a/drivers/net/wireless/ath/ath9k/hw.c
+++++ b/drivers/net/wireless/ath/ath9k/hw.c
++@@ -260,6 +260,8 @@ static void ath9k_hw_read_revisions(stru
++ 		return;
++ 	case AR9300_DEVID_AR953X:
++ 		ah->hw_version.macVersion = AR_SREV_VERSION_9531;
+++		if (ah->get_mac_revision)
+++			ah->hw_version.macRev = ah->get_mac_revision();
++ 		return;
++ 	}
++ 
+diff --git a/package/mac80211/patches/570-restrict_dfs_regions.patch b/package/mac80211/patches/570-restrict_dfs_regions.patch
+new file mode 100644
+index 0000000..10157dc
+--- /dev/null
++++ b/package/mac80211/patches/570-restrict_dfs_regions.patch
+@@ -0,0 +1,82 @@
++--- a/drivers/net/wireless/ath/ath10k/mac.c
+++++ b/drivers/net/wireless/ath/ath10k/mac.c
++@@ -4321,6 +4321,7 @@ static const struct ieee80211_iface_comb
++ 					BIT(NL80211_CHAN_WIDTH_20) |
++ 					BIT(NL80211_CHAN_WIDTH_40) |
++ 					BIT(NL80211_CHAN_WIDTH_80),
+++		.radar_detect_regions = BIT(NL80211_DFS_ETSI),
++ #endif
++ 	},
++ };
++--- a/drivers/net/wireless/ath/ath9k/init.c
+++++ b/drivers/net/wireless/ath/ath9k/init.c
++@@ -688,6 +688,7 @@ static const struct ieee80211_iface_comb
++ 		.beacon_int_infra_match = true,
++ 		.radar_detect_widths =	BIT(NL80211_CHAN_WIDTH_20_NOHT) |
++ 					BIT(NL80211_CHAN_WIDTH_20),
+++		.radar_detect_regions = BIT(NL80211_DFS_ETSI),
++ 	}
++ #endif
++ };
++--- a/include/net/cfg80211.h
+++++ b/include/net/cfg80211.h
++@@ -2620,6 +2620,7 @@ struct ieee80211_iface_limit {
++  *	between infrastructure and AP types must match. This is required
++  *	only in special cases.
++  * @radar_detect_widths: bitmap of channel widths supported for radar detection
+++ * @radar_detect_regions: bitmap of regions supported for radar detection
++  *
++  * With this structure the driver can describe which interface
++  * combinations it supports concurrently.
++@@ -2677,6 +2678,7 @@ struct ieee80211_iface_combination {
++ 	u8 n_limits;
++ 	bool beacon_int_infra_match;
++ 	u8 radar_detect_widths;
+++	u8 radar_detect_regions;
++ };
++ 
++ struct ieee80211_txrx_stypes {
++--- a/net/wireless/util.c
+++++ b/net/wireless/util.c
++@@ -1259,6 +1259,7 @@ int cfg80211_can_use_iftype_chan(struct 
++ 				 enum cfg80211_chan_mode chanmode,
++ 				 u8 radar_detect)
++ {
+++	const struct ieee80211_regdomain *regdom;
++ 	struct wireless_dev *wdev_iter;
++ 	u32 used_iftypes = BIT(iftype);
++ 	int num[NUM_NL80211_IFTYPES];
++@@ -1267,6 +1268,7 @@ int cfg80211_can_use_iftype_chan(struct 
++ 	struct ieee80211_channel *ch;
++ 	enum cfg80211_chan_mode chmode;
++ 	int num_different_channels = 0;
+++	enum nl80211_dfs_regions region = 0;
++ 	int total = 1;
++ 	int i, j;
++ 
++@@ -1285,6 +1287,14 @@ int cfg80211_can_use_iftype_chan(struct 
++ 		return 0;
++ 	}
++ 
+++	if (radar_detect) {
+++		rcu_read_lock();
+++		regdom = rcu_dereference(cfg80211_regdomain);
+++		if (regdom)
+++			region = regdom->dfs_region;
+++		rcu_read_unlock();
+++	}
+++
++ 	memset(num, 0, sizeof(num));
++ 	memset(used_channels, 0, sizeof(used_channels));
++ 
++@@ -1392,6 +1402,10 @@ int cfg80211_can_use_iftype_chan(struct 
++ 		if (radar_detect && !(c->radar_detect_widths & radar_detect))
++ 			goto cont;
++ 
+++		if (radar_detect && c->radar_detect_regions &&
+++		    !(c->radar_detect_regions & BIT(region)))
+++			goto cont;
+++
++ 		/*
++ 		 * Finally check that all iftypes that we're currently
++ 		 * using are actually part of this combination. If they
 diff --git a/package/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch b/package/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
 new file mode 100644
 index 0000000..d344957
diff --git a/patches/openwrt/0016-mac80211-ath9k-add-support-for-QCA953x.patch b/patches/openwrt/0016-mac80211-ath9k-add-support-for-QCA953x.patch
deleted file mode 100644
index a5914db231a2eedd3bbcbf8604878f39f90311ba..0000000000000000000000000000000000000000
--- a/patches/openwrt/0016-mac80211-ath9k-add-support-for-QCA953x.patch
+++ /dev/null
@@ -1,140 +0,0 @@
-From: Matthias Schiffer <mschiffer@universe-factory.net>
-Date: Fri, 18 Apr 2014 18:30:05 +0200
-Subject: mac80211: ath9k: add support for QCA953x
-
-This adds the following patches by Sujith Manoharan from ath9k-devel:
-
-ath9k: Add QCA953x WMAC platform support
-ath9k: Disable AR_INTR_SYNC_HOST1_FATAL for QCA953x
-ath9k: Fix temperature compensation
-
-diff --git a/package/mac80211/patches/567-ath9k-qca953x-support.patch b/package/mac80211/patches/567-ath9k-qca953x-support.patch
-new file mode 100644
-index 0000000..e73083a
---- /dev/null
-+++ b/package/mac80211/patches/567-ath9k-qca953x-support.patch
-@@ -0,0 +1,124 @@
-+--- a/drivers/net/wireless/ath/ath9k/ahb.c
-++++ b/drivers/net/wireless/ath/ath9k/ahb.c
-+@@ -39,6 +39,10 @@ static const struct platform_device_id a
-+ 		.name = "qca955x_wmac",
-+ 		.driver_data = AR9300_DEVID_QCA955X,
-+ 	},
-++	{
-++		.name = "qca953x_wmac",
-++		.driver_data = AR9300_DEVID_AR953X,
-++	},
-+ 	{},
-+ };
-+ 
-+--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
-+@@ -4792,43 +4792,54 @@ static void ar9003_hw_power_control_over
-+ 
-+ tempslope:
-+ 	if (AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
-++		u8 txmask = (eep->baseEepHeader.txrxMask & 0xf0) >> 4;
-++
-+ 		/*
-+ 		 * AR955x has tempSlope register for each chain.
-+ 		 * Check whether temp_compensation feature is enabled or not.
-+ 		 */
-+ 		if (eep->baseEepHeader.featureEnable & 0x1) {
-+ 			if (frequency < 4000) {
-+-				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-+-					      AR_PHY_TPC_19_ALPHA_THERM,
-+-					      eep->base_ext2.tempSlopeLow);
-+-				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-+-					      AR_PHY_TPC_19_ALPHA_THERM,
-+-					      temp_slope);
-+-				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-+-					      AR_PHY_TPC_19_ALPHA_THERM,
-+-					      eep->base_ext2.tempSlopeHigh);
-++				if (txmask & BIT(0))
-++					REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-++						      AR_PHY_TPC_19_ALPHA_THERM,
-++						      eep->base_ext2.tempSlopeLow);
-++				if (txmask & BIT(1))
-++					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-++						      AR_PHY_TPC_19_ALPHA_THERM,
-++						      temp_slope);
-++				if (txmask & BIT(2))
-++					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-++						      AR_PHY_TPC_19_ALPHA_THERM,
-++						      eep->base_ext2.tempSlopeHigh);
-+ 			} else {
-+-				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-+-					      AR_PHY_TPC_19_ALPHA_THERM,
-+-					      temp_slope);
-+-				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-+-					      AR_PHY_TPC_19_ALPHA_THERM,
-+-					      temp_slope1);
-+-				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-+-					      AR_PHY_TPC_19_ALPHA_THERM,
-+-					      temp_slope2);
-++				if (txmask & BIT(0))
-++					REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-++						      AR_PHY_TPC_19_ALPHA_THERM,
-++						      temp_slope);
-++				if (txmask & BIT(1))
-++					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-++						      AR_PHY_TPC_19_ALPHA_THERM,
-++						      temp_slope1);
-++				if (txmask & BIT(2))
-++					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-++						      AR_PHY_TPC_19_ALPHA_THERM,
-++						      temp_slope2);
-+ 			}
-+ 		} else {
-+ 			/*
-+ 			 * If temp compensation is not enabled,
-+ 			 * set all registers to 0.
-+ 			 */
-+-			REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-+-				      AR_PHY_TPC_19_ALPHA_THERM, 0);
-+-			REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-+-				      AR_PHY_TPC_19_ALPHA_THERM, 0);
-+-			REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-+-				      AR_PHY_TPC_19_ALPHA_THERM, 0);
-++			if (txmask & BIT(0))
-++				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-++					      AR_PHY_TPC_19_ALPHA_THERM, 0);
-++			if (txmask & BIT(1))
-++				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
-++					      AR_PHY_TPC_19_ALPHA_THERM, 0);
-++			if (txmask & BIT(2))
-++				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
-++					      AR_PHY_TPC_19_ALPHA_THERM, 0);
-+ 		}
-+ 	} else {
-+ 		REG_RMW_FIELD(ah, AR_PHY_TPC_19,
-+--- a/drivers/net/wireless/ath/ath9k/hw.c
-++++ b/drivers/net/wireless/ath/ath9k/hw.c
-+@@ -901,7 +901,7 @@ static void ath9k_hw_init_interrupt_mask
-+ 		AR_IMR_RXORN |
-+ 		AR_IMR_BCNMISC;
-+ 
-+-	if (AR_SREV_9340(ah) || AR_SREV_9550(ah))
-++	if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah))
-+ 		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;
-+ 
-+ 	if (AR_SREV_9300_20_OR_LATER(ah)) {
-+@@ -3104,6 +3104,7 @@ static struct {
-+ 	{ AR_SREV_VERSION_9462,         "9462" },
-+ 	{ AR_SREV_VERSION_9550,         "9550" },
-+ 	{ AR_SREV_VERSION_9565,         "9565" },
-++	{ AR_SREV_VERSION_9531,         "9531" },
-+ };
-+ 
-+ /* For devices with external radios */
-+--- a/drivers/net/wireless/ath/ath9k/mac.c
-++++ b/drivers/net/wireless/ath/ath9k/mac.c
-+@@ -837,7 +837,7 @@ void ath9k_hw_enable_interrupts(struct a
-+ 		return;
-+ 	}
-+ 
-+-	if (AR_SREV_9340(ah) || AR_SREV_9550(ah))
-++	if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah))
-+ 		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;
-+ 
-+ 	async_mask = AR_INTR_MAC_IRQ;
diff --git a/patches/openwrt/0020-Backport-support-for-TL-WR842N-v2-and-TL-MR3420-v2.patch b/patches/openwrt/0019-Backport-support-for-TL-WR842N-v2-and-TL-MR3420-v2.patch
similarity index 100%
rename from patches/openwrt/0020-Backport-support-for-TL-WR842N-v2-and-TL-MR3420-v2.patch
rename to patches/openwrt/0019-Backport-support-for-TL-WR842N-v2-and-TL-MR3420-v2.patch