Browse Source

mac80211: update to wireless-testing 2013-04-16 + backports

Signed-off-by: Felix Fietkau <[email protected]>

SVN-Revision: 36448
Felix Fietkau 12 years ago
parent
commit
accc6e309e
67 changed files with 1210 additions and 2443 deletions
  1. 9 6
      package/mac80211/Makefile
  2. 37 0
      package/mac80211/patches/000-disable_drivers.patch
  3. 2 2
      package/mac80211/patches/002-disable_ssb_build.patch
  4. 1 1
      package/mac80211/patches/010-add_include_for_bcma.patch
  5. 1 1
      package/mac80211/patches/030-wext.patch
  6. 0 153
      package/mac80211/patches/040-linux_3_9_compat.patch
  7. 0 212
      package/mac80211/patches/130-mesh_pathtbl_backport.patch
  8. 5 5
      package/mac80211/patches/150-disable_addr_notifier.patch
  9. 938 105
      package/mac80211/patches/300-pending_work.patch
  10. 1 1
      package/mac80211/patches/310-ap_scan.patch
  11. 2 2
      package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
  12. 2 2
      package/mac80211/patches/420-ath5k_disable_fast_cc.patch
  13. 2 2
      package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
  14. 2 2
      package/mac80211/patches/501-ath9k-eeprom_endianess.patch
  15. 1 1
      package/mac80211/patches/502-ath9k_ahb_init.patch
  16. 1 1
      package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
  17. 10 10
      package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
  18. 4 4
      package/mac80211/patches/520-mac80211_cur_txpower.patch
  19. 2 2
      package/mac80211/patches/521-ath9k_cur_txpower.patch
  20. 11 230
      package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch
  21. 26 26
      package/mac80211/patches/523-mac80211_configure_antenna_gain.patch
  22. 2 2
      package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch
  23. 6 6
      package/mac80211/patches/530-ath9k_extra_leds.patch
  24. 0 98
      package/mac80211/patches/540-mac80211_optimize_mcs_rate_mask.patch
  25. 2 2
      package/mac80211/patches/552-ath9k_rx_dma_stop_check.patch
  26. 8 8
      package/mac80211/patches/553-ath9k_debugfs_diag.patch
  27. 3 3
      package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch
  28. 0 18
      package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch
  29. 1 1
      package/mac80211/patches/601-rt2x00-set_pci_mwi.patch
  30. 16 16
      package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
  31. 1 1
      package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch
  32. 6 6
      package/mac80211/patches/605-rt2x00-pci-eeprom.patch
  33. 1 1
      package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
  34. 4 4
      package/mac80211/patches/608-add_platform_data_mac_addr.patch
  35. 14 14
      package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
  36. 8 8
      package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
  37. 1 1
      package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
  38. 0 47
      package/mac80211/patches/613-rt2x00-fixup-symbols.patch
  39. 1 1
      package/mac80211/patches/614-rt2x00-of_load_eeprom_filename.patch
  40. 1 1
      package/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch
  41. 54 54
      package/mac80211/patches/616-rt2x00-support-rt5350.patch
  42. 1 1
      package/mac80211/patches/617-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
  43. 1 1
      package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
  44. 0 70
      package/mac80211/patches/701-mwl8k-don-t-overwrite-regulatory-settings.patch
  45. 0 44
      package/mac80211/patches/702-mwl8k-always-apply-configuration-even-when-device-is.patch
  46. 2 2
      package/mac80211/patches/800-b43-gpio-mask-module-option.patch
  47. 1 1
      package/mac80211/patches/810-b43_no_pio.patch
  48. 9 9
      package/mac80211/patches/820-b43-add-antenna-control.patch
  49. 5 5
      package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
  50. 0 11
      package/mac80211/patches/840-b43-increase_number_of_rx_dma_slots.patch
  51. 5 5
      package/mac80211/patches/850-brcmsmac-start-adding-support-for-core-rev-28.patch
  52. 0 0
      package/mac80211/patches/851-brcmsmac-remove-extra-regulation-restriction.patch
  53. 0 121
      package/mac80211/patches/860-brcmsmac-implement-ieee80211_ops-get_tsf-and-set_tsf.patch
  54. 0 66
      package/mac80211/patches/861-brcmsmac-add-interface-type-to-brcms_bss_cfg.patch
  55. 0 79
      package/mac80211/patches/862-brcmsmac-remove-brcms_bss_cfg-BSS.patch
  56. 0 74
      package/mac80211/patches/863-brcmsmac-remove-brcms_bss_cfg-associated.patch
  57. 0 32
      package/mac80211/patches/864-brcmsmac-remove-brcms_bss_cfg-enable.patch
  58. 0 51
      package/mac80211/patches/865-brcmsmac-remove-brcms_bss_cfg-up.patch
  59. 0 30
      package/mac80211/patches/866-brcmsmac-remove-brcms_bss_cfg-cur_etheraddr.patch
  60. 0 21
      package/mac80211/patches/867-brcmsmac-remove-brcms_pub-bcmerr.patch
  61. 0 23
      package/mac80211/patches/868-brcmsmac-write-beacon-period-to-hardware.patch
  62. 0 266
      package/mac80211/patches/869-brcmsmac-add-beacon-template-support.patch
  63. 0 43
      package/mac80211/patches/870-brcmsmac-react-on-changing-SSID.patch
  64. 0 216
      package/mac80211/patches/871-brcmsmac-add-support-for-probe-response-template.patch
  65. 0 59
      package/mac80211/patches/872-brcmsmac-deactivate-ucode-sending-probe-responses.patch
  66. 0 79
      package/mac80211/patches/873-brcmsmac-activate-AP-support.patch
  67. 0 74
      package/mac80211/patches/874-brcmsmac-add-support-for-adhoc-mode.patch

+ 9 - 6
package/mac80211/Makefile

@@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=2013-02-22
+PKG_VERSION:=2013-04-16
 PKG_RELEASE:=1
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
-PKG_MD5SUM:=de1a03ca1f72748d4523672c8facbf7e
+PKG_MD5SUM:=ec4cd40f0a8838aeea2ccff3ec5deb1a
 
 PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
@@ -212,7 +212,7 @@ $(call KernelPackage/rt2x00/Default)
   DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-mac80211 +kmod-lib-crc-itu-t
   TITLE+= (LIB)
   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00lib.ko
-  AUTOLOAD:=$(call AutoLoad,25,rt2x00lib)
+  AUTOLOAD:=$(call AutoLoad,24,rt2x00lib)
   MENU:=1
 endef
 
@@ -239,8 +239,10 @@ define KernelPackage/rt2x00-pci
 $(call KernelPackage/rt2x00/Default)
   DEPENDS+= @(PCI_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-eeprom-93cx6
   TITLE+= (PCI)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00pci.ko
-  AUTOLOAD:=$(call AutoLoad,26,rt2x00pci)
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00pci.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00mmio.ko
+  AUTOLOAD:=$(call AutoLoad,25,rt2x00mmio rt2x00pci)
 endef
 
 define KernelPackage/rt2x00-usb
@@ -1269,6 +1271,7 @@ MAKE_OPTS:= \
 	CONFIG_P54_SPI_DEFAULT_EEPROM=n \
 	CONFIG_RT2X00=$(if $(CONFIG_PACKAGE_kmod-rt2x00-lib),m) \
 	CONFIG_RT2X00_LIB=$(if $(CONFIG_PACKAGE_kmod-rt2x00-lib),m) \
+	CONFIG_RT2X00_LIB_MMIO=$(if $(CONFIG_PACKAGE_kmod-rt2x00-pci),m) \
 	CONFIG_RT2X00_LIB_PCI=$(if $(CONFIG_PACKAGE_kmod-rt2x00-pci),m) \
 	CONFIG_RT2X00_LIB_USB=$(if $(CONFIG_PACKAGE_kmod-rt2x00-usb),m) \
 	CONFIG_RT2X00_LIB_SOC=$(if $(CONFIG_PACKAGE_kmod-rt2x00-soc),m) \
@@ -1290,7 +1293,7 @@ MAKE_OPTS:= \
 	CONFIG_RTL8187=$(if $(CONFIG_PACKAGE_kmod-rtl8187),m) \
 	CONFIG_RTL8192CE= \
 	CONFIG_RTLWIFI= \
-	CONFIG_MAC80211_HWSIM=$(if $(CONFIG_PACKAGE_kmod-mac80211-hwsim),m) \
+	CONFIG_COMPAT_MAC80211_HWSIM=$(if $(CONFIG_PACKAGE_kmod-mac80211-hwsim),m) \
 	CONFIG_PCMCIA= \
 	CONFIG_LIBIPW=$(if $(CONFIG_PACKAGE_kmod-net-libipw),m) \
 	CONFIG_LIBERTAS=$(if $(CONFIG_PACKAGE_kmod-libertas-sd)$(CONFIG_PACKAGE_kmod-libertas-usb),m) \

+ 37 - 0
package/mac80211/patches/000-disable_drivers.patch

@@ -0,0 +1,37 @@
+--- a/config.mk
++++ b/config.mk
+@@ -724,34 +724,3 @@ endif #CONFIG_LEDS_TRIGGERS
+ # export CONFIG_RFKILL_BACKPORT_INPUT=y
+ endif #CONFIG_COMPAT_KERNEL_2_6_31
+ 
+-# compilation has been tested down to 3.0 but run time
+-# tests have only started on 3.2.
+-ifndef CONFIG_COMPAT_KERNEL_3_2
+-# Basic DRM support
+-export CONFIG_COMPAT_VIDEO_MODULES=y
+-export CONFIG_COMPAT_DRM=m
+-export CONFIG_COMPAT_DRM_TTM=m
+-export CONFIG_COMPAT_DRM_KMS_HELPER=m
+-export CONFIG_COMPAT_DRM_LOAD_EDID_FIRMWARE=y
+-# Intel i915
+-export CONFIG_COMPAT_DRM_I915=m
+-# ATI/AMD Radeon
+-export CONFIG_COMPAT_DRM_RADEON=m
+-export CONFIG_COMPAT_DRM_RADEON_KMS=y
+-export CONFIG_COMPAT_DRM_NOUVEAU=m
+-export CONFIG_COMPAT_DRM_NOUVEAU_BACKLIGHT=y
+-export CONFIG_COMPAT_NOUVEAU_DEBUG=5
+-export CONFIG_COMPAT_NOUVEAU_DEBUG_DEFAULT=3
+-ifdef CONFIG_MEDIA_CONTROLLER
+-export CONFIG_COMPAT_USB_VIDEO_CLASS=m
+-endif #CONFIG_MEDIA_CONTROLLER
+-export CONFIG_USB_VIDEO_CLASS=y
+-endif #CONFIG_COMPAT_KERNEL_3_2
+-
+-ifndef CONFIG_COMPAT_KERNEL_3_2
+-export CONFIG_COMPAT_MEDIA_MODULES=y
+-export CONFIG_COMPAT_VIDEO_V4L2=m
+-export CONFIG_COMPAT_VIDEOBUF2_CORE=m
+-export CONFIG_COMPAT_VIDEOBUF2_VMALLOC=m
+-export CONFIG_COMPAT_VIDEOBUF2_MEMOPS=m
+-endif #CONFIG_COMPAT_KERNEL_3_2

+ 2 - 2
package/mac80211/patches/002-disable_ssb_build.patch

@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -364,7 +364,8 @@ export CONFIG_IPW2200_QOS=y
+@@ -371,7 +371,8 @@ export CONFIG_IPW2200_QOS=y
  # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface
  endif #CONFIG_WIRELESS_EXT
  
@@ -10,7 +10,7 @@
  # Sonics Silicon Backplane
  export CONFIG_SSB_SPROM=y
  
-@@ -377,7 +378,7 @@ endif #CONFIG_PCMCIA
+@@ -384,7 +385,7 @@ endif #CONFIG_PCMCIA
  # export CONFIG_SSB_DEBUG=y
  export CONFIG_SSB_DRIVER_PCICORE=y
  export CONFIG_B43_SSB=y

+ 1 - 1
package/mac80211/patches/010-add_include_for_bcma.patch

@@ -1,6 +1,6 @@
 --- a/include/linux/compat-3.0.h
 +++ b/include/linux/compat-3.0.h
-@@ -36,6 +36,8 @@ static inline struct page *shmem_read_ma
+@@ -38,6 +38,8 @@ static inline struct page *shmem_read_ma
  #endif
  
  

+ 1 - 1
package/mac80211/patches/030-wext.patch

@@ -1,6 +1,6 @@
 --- a/net/wireless/core.c
 +++ b/net/wireless/core.c
-@@ -884,6 +884,15 @@ static int cfg80211_netdev_notifier_call
+@@ -951,6 +951,15 @@ static int cfg80211_netdev_notifier_call
  		wdev->sme_state = CFG80211_SME_IDLE;
  		mutex_unlock(&rdev->devlist_mtx);
  #ifdef CONFIG_CFG80211_WEXT

+ 0 - 153
package/mac80211/patches/040-linux_3_9_compat.patch

@@ -1,153 +0,0 @@
---- a/include/linux/compat-2.6.h
-+++ b/include/linux/compat-2.6.h
-@@ -69,6 +69,7 @@ void compat_dependency_symbol(void);
- #include <linux/compat-3.6.h>
- #include <linux/compat-3.7.h>
- #include <linux/compat-3.8.h>
-+#include <linux/compat-3.9.h>
- 
- #endif /* __ASSEMBLY__ */
- 
---- /dev/null
-+++ b/include/linux/compat-3.9.h
-@@ -0,0 +1,140 @@
-+#ifndef LINUX_3_9_COMPAT_H
-+#define LINUX_3_9_COMPAT_H
-+
-+#include <linux/version.h>
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0))
-+
-+#include <linux/idr.h>
-+#include <linux/list.h>
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,25))
-+#include <linux/rculist.h>
-+#endif
-+#include <net/sock.h>
-+#include <linux/tty.h>
-+#include <linux/tty_flip.h>
-+
-+/* include this before changing hlist_for_each_* to use the old versions. */
-+#include <net/sch_generic.h>
-+
-+
-+/**
-+ * backport of idr idr_alloc() usage
-+ * 
-+ * This backports a patch series send by Tejun Heo:
-+ * https://lkml.org/lkml/2013/2/2/159
-+ */
-+static inline void compat_idr_destroy(struct idr *idp)
-+{
-+	idr_remove_all(idp);
-+	idr_destroy(idp);
-+}
-+#define idr_destroy(idp) compat_idr_destroy(idp)
-+
-+static inline int idr_alloc(struct idr *idr, void *ptr, int start, int end,
-+			    gfp_t gfp_mask)
-+{
-+	int id, ret;
-+
-+	do {
-+		if (!idr_pre_get(idr, gfp_mask))
-+			return -ENOMEM;
-+		ret = idr_get_new_above(idr, ptr, start, &id);
-+		if (!ret && id > end) {
-+			idr_remove(idr, id);
-+			ret = -ENOSPC;
-+		}
-+	} while (ret == -EAGAIN);
-+
-+	return ret ? ret : id;
-+}
-+
-+static inline void idr_preload(gfp_t gfp_mask)
-+{
-+}
-+
-+static inline void idr_preload_end(void)
-+{
-+}
-+
-+
-+/**
-+ * backport:
-+ *
-+ * commit 0bbacca7c3911451cea923b0ad6389d58e3d9ce9
-+ * Author: Sasha Levin <[email protected]>
-+ * Date:   Thu Feb 7 12:32:18 2013 +1100
-+ *
-+ *     hlist: drop the node parameter from iterators
-+ */
-+
-+#define hlist_entry_safe(ptr, type, member) \
-+	(ptr) ? hlist_entry(ptr, type, member) : NULL
-+
-+#undef hlist_for_each_entry
-+/**
-+ * hlist_for_each_entry	- iterate over list of given type
-+ * @pos:	the type * to use as a loop cursor.
-+ * @head:	the head for your list.
-+ * @member:	the name of the hlist_node within the struct.
-+ */
-+#define hlist_for_each_entry(pos, head, member)					\
-+	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);	\
-+	     pos;								\
-+	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
-+
-+#undef hlist_for_each_entry_safe
-+/**
-+ * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
-+ * @pos:	the type * to use as a loop cursor.
-+ * @n:		another &struct hlist_node to use as temporary storage
-+ * @head:	the head for your list.
-+ * @member:	the name of the hlist_node within the struct.
-+ */
-+#define hlist_for_each_entry_safe(pos, n, head, member) 			\
-+	for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);	\
-+	     pos && ({ n = pos->member.next; 1; });				\
-+	     pos = hlist_entry_safe(n, typeof(*pos), member))
-+
-+#undef hlist_for_each_entry_rcu
-+/**
-+ * hlist_for_each_entry_rcu - iterate over rcu list of given type
-+ * @pos:	the type * to use as a loop cursor.
-+ * @head:	the head for your list.
-+ * @member:	the name of the hlist_node within the struct.
-+ *
-+ * This list-traversal primitive may safely run concurrently with
-+ * the _rcu list-mutation primitives such as hlist_add_head_rcu()
-+ * as long as the traversal is guarded by rcu_read_lock().
-+ */
-+#define hlist_for_each_entry_rcu(pos, head, member)				\
-+	for (pos = hlist_entry_safe (rcu_dereference_raw(hlist_first_rcu(head)),\
-+			typeof(*(pos)), member);				\
-+		pos;								\
-+		pos = hlist_entry_safe(rcu_dereference_raw(hlist_next_rcu(	\
-+			&(pos)->member)), typeof(*(pos)), member))
-+
-+#undef sk_for_each
-+#define sk_for_each(__sk, list) \
-+	hlist_for_each_entry(__sk, list, sk_node)
-+
-+#define tty_flip_buffer_push(port) tty_flip_buffer_push((port)->tty)
-+#define tty_insert_flip_string(port, chars, size) tty_insert_flip_string((port)->tty, chars, size)
-+
-+/**
-+ * backport of:
-+ *
-+ * commit 496ad9aa8ef448058e36ca7a787c61f2e63f0f54
-+ * Author: Al Viro <[email protected]>
-+ * Date:   Wed Jan 23 17:07:38 2013 -0500
-+ *
-+ *     new helper: file_inode(file)
-+ */
-+static inline struct inode *file_inode(struct file *f)
-+{
-+	return f->f_path.dentry->d_inode;
-+}
-+
-+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0)) */
-+
-+#endif /* LINUX_3_9_COMPAT_H */

+ 0 - 212
package/mac80211/patches/130-mesh_pathtbl_backport.patch

@@ -1,212 +0,0 @@
---- a/net/mac80211/mesh_pathtbl.c
-+++ b/net/mac80211/mesh_pathtbl.c
-@@ -72,9 +72,9 @@ static inline struct mesh_table *resize_
-  * it's used twice. So it is illegal to do
-  *	for_each_mesh_entry(rcu_dereference(...), ...)
-  */
--#define for_each_mesh_entry(tbl, p, node, i) \
-+#define for_each_mesh_entry(tbl, node, i) \
- 	for (i = 0; i <= tbl->hash_mask; i++) \
--		hlist_for_each_entry_rcu(node, p, &tbl->hash_buckets[i], list)
-+		hlist_for_each_entry_rcu(node, &tbl->hash_buckets[i], list)
- 
- 
- static struct mesh_table *mesh_table_alloc(int size_order)
-@@ -139,7 +139,7 @@ static void mesh_table_free(struct mesh_
- 	}
- 	if (free_leafs) {
- 		spin_lock_bh(&tbl->gates_lock);
--		hlist_for_each_entry_safe(gate, p, q,
-+		hlist_for_each_entry_safe(gate, q,
- 					 tbl->known_gates, list) {
- 			hlist_del(&gate->list);
- 			kfree(gate);
-@@ -333,12 +333,11 @@ static struct mesh_path *mpath_lookup(st
- 				      struct ieee80211_sub_if_data *sdata)
- {
- 	struct mesh_path *mpath;
--	struct hlist_node *n;
- 	struct hlist_head *bucket;
- 	struct mpath_node *node;
- 
- 	bucket = &tbl->hash_buckets[mesh_table_hash(dst, sdata, tbl)];
--	hlist_for_each_entry_rcu(node, n, bucket, list) {
-+	hlist_for_each_entry_rcu(node, bucket, list) {
- 		mpath = node->mpath;
- 		if (mpath->sdata == sdata &&
- 		    ether_addr_equal(dst, mpath->dst)) {
-@@ -389,11 +388,10 @@ mesh_path_lookup_by_idx(struct ieee80211
- {
- 	struct mesh_table *tbl = rcu_dereference(mesh_paths);
- 	struct mpath_node *node;
--	struct hlist_node *p;
- 	int i;
- 	int j = 0;
- 
--	for_each_mesh_entry(tbl, p, node, i) {
-+	for_each_mesh_entry(tbl, node, i) {
- 		if (sdata && node->mpath->sdata != sdata)
- 			continue;
- 		if (j++ == idx) {
-@@ -417,13 +415,12 @@ int mesh_path_add_gate(struct mesh_path
- {
- 	struct mesh_table *tbl;
- 	struct mpath_node *gate, *new_gate;
--	struct hlist_node *n;
- 	int err;
- 
- 	rcu_read_lock();
- 	tbl = rcu_dereference(mesh_paths);
- 
--	hlist_for_each_entry_rcu(gate, n, tbl->known_gates, list)
-+	hlist_for_each_entry_rcu(gate, tbl->known_gates, list)
- 		if (gate->mpath == mpath) {
- 			err = -EEXIST;
- 			goto err_rcu;
-@@ -460,9 +457,9 @@ err_rcu:
- static void mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath)
- {
- 	struct mpath_node *gate;
--	struct hlist_node *p, *q;
-+	struct hlist_node *q;
- 
--	hlist_for_each_entry_safe(gate, p, q, tbl->known_gates, list) {
-+	hlist_for_each_entry_safe(gate, q, tbl->known_gates, list) {
- 		if (gate->mpath != mpath)
- 			continue;
- 		spin_lock_bh(&tbl->gates_lock);
-@@ -504,7 +501,6 @@ int mesh_path_add(struct ieee80211_sub_i
- 	struct mesh_path *mpath, *new_mpath;
- 	struct mpath_node *node, *new_node;
- 	struct hlist_head *bucket;
--	struct hlist_node *n;
- 	int grow = 0;
- 	int err = 0;
- 	u32 hash_idx;
-@@ -550,7 +546,7 @@ int mesh_path_add(struct ieee80211_sub_i
- 	spin_lock(&tbl->hashwlock[hash_idx]);
- 
- 	err = -EEXIST;
--	hlist_for_each_entry(node, n, bucket, list) {
-+	hlist_for_each_entry(node, bucket, list) {
- 		mpath = node->mpath;
- 		if (mpath->sdata == sdata &&
- 		    ether_addr_equal(dst, mpath->dst))
-@@ -640,7 +636,6 @@ int mpp_path_add(struct ieee80211_sub_if
- 	struct mesh_path *mpath, *new_mpath;
- 	struct mpath_node *node, *new_node;
- 	struct hlist_head *bucket;
--	struct hlist_node *n;
- 	int grow = 0;
- 	int err = 0;
- 	u32 hash_idx;
-@@ -680,7 +675,7 @@ int mpp_path_add(struct ieee80211_sub_if
- 	spin_lock(&tbl->hashwlock[hash_idx]);
- 
- 	err = -EEXIST;
--	hlist_for_each_entry(node, n, bucket, list) {
-+	hlist_for_each_entry(node, bucket, list) {
- 		mpath = node->mpath;
- 		if (mpath->sdata == sdata &&
- 		    ether_addr_equal(dst, mpath->dst))
-@@ -725,14 +720,13 @@ void mesh_plink_broken(struct sta_info *
- 	static const u8 bcast[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
- 	struct mesh_path *mpath;
- 	struct mpath_node *node;
--	struct hlist_node *p;
- 	struct ieee80211_sub_if_data *sdata = sta->sdata;
- 	int i;
- 	__le16 reason = cpu_to_le16(WLAN_REASON_MESH_PATH_DEST_UNREACHABLE);
- 
- 	rcu_read_lock();
- 	tbl = rcu_dereference(mesh_paths);
--	for_each_mesh_entry(tbl, p, node, i) {
-+	for_each_mesh_entry(tbl, node, i) {
- 		mpath = node->mpath;
- 		if (rcu_dereference(mpath->next_hop) == sta &&
- 		    mpath->flags & MESH_PATH_ACTIVE &&
-@@ -792,13 +786,12 @@ void mesh_path_flush_by_nexthop(struct s
- 	struct mesh_table *tbl;
- 	struct mesh_path *mpath;
- 	struct mpath_node *node;
--	struct hlist_node *p;
- 	int i;
- 
- 	rcu_read_lock();
- 	read_lock_bh(&pathtbl_resize_lock);
- 	tbl = resize_dereference_mesh_paths();
--	for_each_mesh_entry(tbl, p, node, i) {
-+	for_each_mesh_entry(tbl, node, i) {
- 		mpath = node->mpath;
- 		if (rcu_dereference(mpath->next_hop) == sta) {
- 			spin_lock(&tbl->hashwlock[i]);
-@@ -815,11 +808,9 @@ static void table_flush_by_iface(struct
- {
- 	struct mesh_path *mpath;
- 	struct mpath_node *node;
--	struct hlist_node *p;
- 	int i;
- 
--	WARN_ON(!rcu_read_lock_held());
--	for_each_mesh_entry(tbl, p, node, i) {
-+	for_each_mesh_entry(tbl, node, i) {
- 		mpath = node->mpath;
- 		if (mpath->sdata != sdata)
- 			continue;
-@@ -865,7 +856,6 @@ int mesh_path_del(struct ieee80211_sub_i
- 	struct mesh_path *mpath;
- 	struct mpath_node *node;
- 	struct hlist_head *bucket;
--	struct hlist_node *n;
- 	int hash_idx;
- 	int err = 0;
- 
-@@ -875,7 +865,7 @@ int mesh_path_del(struct ieee80211_sub_i
- 	bucket = &tbl->hash_buckets[hash_idx];
- 
- 	spin_lock(&tbl->hashwlock[hash_idx]);
--	hlist_for_each_entry(node, n, bucket, list) {
-+	hlist_for_each_entry(node, bucket, list) {
- 		mpath = node->mpath;
- 		if (mpath->sdata == sdata &&
- 		    ether_addr_equal(addr, mpath->dst)) {
-@@ -920,7 +910,6 @@ void mesh_path_tx_pending(struct mesh_pa
- int mesh_path_send_to_gates(struct mesh_path *mpath)
- {
- 	struct ieee80211_sub_if_data *sdata = mpath->sdata;
--	struct hlist_node *n;
- 	struct mesh_table *tbl;
- 	struct mesh_path *from_mpath = mpath;
- 	struct mpath_node *gate = NULL;
-@@ -935,7 +924,7 @@ int mesh_path_send_to_gates(struct mesh_
- 	if (!known_gates)
- 		return -EHOSTUNREACH;
- 
--	hlist_for_each_entry_rcu(gate, n, known_gates, list) {
-+	hlist_for_each_entry_rcu(gate, known_gates, list) {
- 		if (gate->mpath->sdata != sdata)
- 			continue;
- 
-@@ -951,7 +940,7 @@ int mesh_path_send_to_gates(struct mesh_
- 		}
- 	}
- 
--	hlist_for_each_entry_rcu(gate, n, known_gates, list)
-+	hlist_for_each_entry_rcu(gate, known_gates, list)
- 		if (gate->mpath->sdata == sdata) {
- 			mpath_dbg(sdata, "Sending to %pM\n", gate->mpath->dst);
- 			mesh_path_tx_pending(gate->mpath);
-@@ -1096,12 +1085,11 @@ void mesh_path_expire(struct ieee80211_s
- 	struct mesh_table *tbl;
- 	struct mesh_path *mpath;
- 	struct mpath_node *node;
--	struct hlist_node *p;
- 	int i;
- 
- 	rcu_read_lock();
- 	tbl = rcu_dereference(mesh_paths);
--	for_each_mesh_entry(tbl, p, node, i) {
-+	for_each_mesh_entry(tbl, node, i) {
- 		if (node->mpath->sdata != sdata)
- 			continue;
- 		mpath = node->mpath;

+ 5 - 5
package/mac80211/patches/150-disable_addr_notifier.patch

@@ -1,6 +1,6 @@
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -313,7 +313,7 @@ void ieee80211_restart_hw(struct ieee802
+@@ -300,7 +300,7 @@ void ieee80211_restart_hw(struct ieee802
  }
  EXPORT_SYMBOL(ieee80211_restart_hw);
  
@@ -9,7 +9,7 @@
  static int ieee80211_ifa_changed(struct notifier_block *nb,
  				 unsigned long data, void *arg)
  {
-@@ -372,7 +372,7 @@ static int ieee80211_ifa_changed(struct
+@@ -359,7 +359,7 @@ static int ieee80211_ifa_changed(struct 
  }
  #endif
  
@@ -18,7 +18,7 @@
  static int ieee80211_ifa6_changed(struct notifier_block *nb,
  				  unsigned long data, void *arg)
  {
-@@ -1015,14 +1015,14 @@ int ieee80211_register_hw(struct ieee802
+@@ -990,14 +990,14 @@ int ieee80211_register_hw(struct ieee802
  		goto fail_pm_qos;
  	}
  
@@ -35,7 +35,7 @@
  	local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
  	result = register_inet6addr_notifier(&local->ifa6_notifier);
  	if (result)
-@@ -1034,13 +1034,13 @@ int ieee80211_register_hw(struct ieee802
+@@ -1006,13 +1006,13 @@ int ieee80211_register_hw(struct ieee802
  
  	return 0;
  
@@ -52,7 +52,7 @@
   fail_ifa:
  	pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
  			       &local->network_latency_notifier);
-@@ -1073,10 +1073,10 @@ void ieee80211_unregister_hw(struct ieee
+@@ -1045,10 +1045,10 @@ void ieee80211_unregister_hw(struct ieee
  
  	pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
  			       &local->network_latency_notifier);

File diff suppressed because it is too large
+ 938 - 105
package/mac80211/patches/300-pending_work.patch


+ 1 - 1
package/mac80211/patches/310-ap_scan.patch

@@ -1,6 +1,6 @@
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2009,7 +2009,7 @@ static int ieee80211_scan(struct wiphy *
+@@ -2078,7 +2078,7 @@ static int ieee80211_scan(struct wiphy *
  		 * the  frames sent while scanning on other channel will be
  		 * lost)
  		 */

+ 2 - 2
package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

@@ -1,10 +1,10 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -727,6 +727,7 @@ static const struct ieee80211_iface_limi
+@@ -731,6 +731,7 @@ static const struct ieee80211_iface_limi
  #endif
  				 BIT(NL80211_IFTYPE_AP) |
  				 BIT(NL80211_IFTYPE_P2P_GO) },
 +	{ .max = 1,	.types = BIT(NL80211_IFTYPE_ADHOC) },
  };
  
- static const struct ieee80211_iface_combination if_comb = {
+ 

+ 2 - 2
package/mac80211/patches/420-ath5k_disable_fast_cc.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath5k/reset.c
 +++ b/drivers/net/wireless/ath/ath5k/reset.c
-@@ -1158,6 +1158,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
+@@ -1156,6 +1156,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
  	tsf_lo = 0;
  	mode = 0;
  
@@ -8,7 +8,7 @@
  	/*
  	 * Sanity check for fast flag
  	 * Fast channel change only available
-@@ -1165,6 +1166,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
+@@ -1163,6 +1164,7 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum
  	 */
  	if (fast && (ah->ah_radio != AR5K_RF2413) &&
  	(ah->ah_radio != AR5K_RF5413))

+ 2 - 2
package/mac80211/patches/500-ath9k_eeprom_debugfs.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -2003,6 +2003,53 @@ void ath9k_get_et_stats(struct ieee80211
+@@ -2012,6 +2012,53 @@ void ath9k_get_et_stats(struct ieee80211
  	WARN_ON(i != ATH9K_SSTATS_LEN);
  }
  
@@ -54,7 +54,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -2020,6 +2067,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2029,6 +2076,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  
  	ath9k_dfs_init_debug(sc);
  

+ 2 - 2
package/mac80211/patches/501-ath9k-eeprom_endianess.patch

@@ -71,7 +71,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -740,6 +740,7 @@ enum ath_cal_list {
+@@ -739,6 +739,7 @@ enum ath_cal_list {
  #define AH_USE_EEPROM   0x1
  #define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
  #define AH_FASTCC       0x4
@@ -81,7 +81,7 @@
  	struct ath_ops reg_ops;
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -587,6 +587,8 @@ static int ath9k_init_softc(u16 devid, s
+@@ -591,6 +591,8 @@ static int ath9k_init_softc(u16 devid, s
  		ah->is_clk_25mhz = pdata->is_clk_25mhz;
  		ah->get_mac_revision = pdata->get_mac_revision;
  		ah->external_reset = pdata->external_reset;

+ 1 - 1
package/mac80211/patches/502-ath9k_ahb_init.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -965,23 +965,23 @@ static int __init ath9k_init(void)
+@@ -986,23 +986,23 @@ static int __init ath9k_init(void)
  		goto err_out;
  	}
  

+ 1 - 1
package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1946,8 +1946,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2001,8 +2001,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  		REG_WRITE(ah, AR_OBS, 8);
  
  	if (ah->config.rx_intr_mitigation) {

+ 10 - 10
package/mac80211/patches/512-ath9k_channelbw_debugfs.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -689,6 +689,7 @@ struct ath_softc {
+@@ -691,6 +691,7 @@ struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct device *dev;
  
@@ -8,7 +8,7 @@
  	struct survey_info *cur_survey;
  	struct survey_info survey[ATH9K_NUM_CHANNELS];
  
-@@ -893,6 +894,7 @@ struct fft_sample_ht20 {
+@@ -895,6 +896,7 @@ struct fft_sample_ht20 {
  	u8 data[SPECTRAL_HT20_NUM_BINS];
  } __packed;
  
@@ -18,7 +18,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -2050,6 +2050,50 @@ static const struct file_operations fops
+@@ -2059,6 +2059,50 @@ static const struct file_operations fops
  	.owner = THIS_MODULE
  };
  
@@ -69,7 +69,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -2069,6 +2113,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2078,6 +2122,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  
  	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
  			    &fops_eeprom);
@@ -80,7 +80,7 @@
  	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1136,7 +1136,7 @@ int ath9k_spectral_scan_config(struct ie
+@@ -1140,7 +1140,7 @@ int ath9k_spectral_scan_config(struct ie
  	return 0;
  }
  
@@ -89,10 +89,10 @@
  {
  	struct ath_softc *sc = hw->priv;
  	struct ath_hw *ah = sc->sc_ah;
-@@ -1190,9 +1190,11 @@ static int ath9k_config(struct ieee80211
- 
- 	if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
- 		struct ieee80211_channel *curchan = hw->conf.channel;
+@@ -1196,9 +1196,11 @@ static int ath9k_config(struct ieee80211
+ 		struct ieee80211_channel *curchan = hw->conf.chandef.chan;
+ 		enum nl80211_channel_type channel_type =
+ 			cfg80211_get_chandef_type(&conf->chandef);
 +		struct ath9k_channel *hchan;
  		int pos = curchan->hw_value;
  		int old_pos = -1;
@@ -101,7 +101,7 @@
  
  		if (ah->curchan)
  			old_pos = ah->curchan - &ah->channels[0];
-@@ -1235,7 +1237,23 @@ static int ath9k_config(struct ieee80211
+@@ -1241,7 +1243,23 @@ static int ath9k_config(struct ieee80211
  			memset(&sc->survey[pos], 0, sizeof(struct survey_info));
  		}
  

+ 4 - 4
package/mac80211/patches/520-mac80211_cur_txpower.patch

@@ -1,16 +1,16 @@
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1554,6 +1554,7 @@ struct ieee80211_hw {
+@@ -1605,6 +1605,7 @@ struct ieee80211_hw {
  	u8 max_tx_aggregation_subframes;
  	u8 offchannel_tx_hw_queue;
  	u8 radiotap_mcs_details;
 +	s8 cur_power_level;
  	u16 radiotap_vht_details;
  	netdev_features_t netdev_features;
- };
+ 	u8 uapsd_queues;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2190,7 +2190,9 @@ static int ieee80211_get_tx_power(struct
+@@ -2259,7 +2259,9 @@ static int ieee80211_get_tx_power(struct
  	struct ieee80211_local *local = wiphy_priv(wiphy);
  	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  
@@ -23,7 +23,7 @@
  		*dbm = sdata->vif.bss_conf.txpower;
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -166,6 +166,7 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -167,6 +167,7 @@ static u32 ieee80211_hw_conf_chan(struct
  
  	if (local->hw.conf.power_level != power) {
  		changed |= IEEE80211_CONF_CHANGE_POWER;

+ 2 - 2
package/mac80211/patches/521-ath9k_cur_txpower.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1260,6 +1260,8 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1266,6 +1266,8 @@ int ath9k_config(struct ieee80211_hw *hw
  			return -EINVAL;
  		}
  
@@ -9,7 +9,7 @@
  		/*
  		 * The most recent snapshot of channel->noisefloor for the old
  		 * channel is only available after the hardware reset. Copy it to
-@@ -1279,6 +1281,7 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1302,6 +1304,7 @@ int ath9k_config(struct ieee80211_hw *hw
  		sc->config.txpowlimit = 2 * conf->power_level;
  		ath9k_cmn_update_txpow(ah, sc->curtxpow,
  				       sc->config.txpowlimit, &sc->curtxpow);

+ 11 - 230
package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch

@@ -1,121 +1,3 @@
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -839,6 +839,9 @@ enum mac80211_rx_flags {
-  * @signal: signal strength when receiving this frame, either in dBm, in dB or
-  *	unspecified depending on the hardware capabilities flags
-  *	@IEEE80211_HW_SIGNAL_*
-+ * @chains: bitmask of receive chains for which separate signal strength
-+ *	values were filled.
-+ * @chain_signal: per-chain signal strength, same format as @signal
-  * @antenna: antenna used
-  * @rate_idx: index of data rate into band's supported rates or MCS index if
-  *	HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
-@@ -870,6 +873,8 @@ struct ieee80211_rx_status {
- 	u8 band;
- 	u8 antenna;
- 	s8 signal;
-+	u8 chains;
-+	s8 chain_signal[4];
- 	u8 ampdu_delimiter_crc;
- 	u8 vendor_radiotap_align;
- 	u8 vendor_radiotap_oui[3];
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -342,6 +342,11 @@ struct sta_info {
- 	int last_signal;
- 	struct ewma avg_signal;
- 	int last_ack_signal;
-+
-+	u8 chains;
-+	s8 chain_signal_last[4];
-+	struct ewma chain_signal_avg[4];
-+
- 	/* Plus 1 for non-QoS frames */
- 	__le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1];
- 
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -1383,6 +1383,7 @@ ieee80211_rx_h_sta_process(struct ieee80
- 	struct sk_buff *skb = rx->skb;
- 	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-+	int i;
- 
- 	if (!sta)
- 		return RX_CONTINUE;
-@@ -1433,6 +1434,19 @@ ieee80211_rx_h_sta_process(struct ieee80
- 		ewma_add(&sta->avg_signal, -status->signal);
- 	}
- 
-+	if (status->chains) {
-+		sta->chains = status->chains;
-+		for (i = 0; i < 4; i++) {
-+			int signal = status->chain_signal[i];
-+
-+			if (!(status->chains & BIT(i)))
-+				continue;
-+
-+			sta->chain_signal_last[i] = signal;
-+			ewma_add(&sta->chain_signal_avg[i], -signal);
-+		}
-+	}
-+
- 	/*
- 	 * Change STA power saving mode only at the end of a frame
- 	 * exchange sequence.
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -353,6 +353,8 @@ struct sta_info *sta_info_alloc(struct i
- 	do_posix_clock_monotonic_gettime(&uptime);
- 	sta->last_connected = uptime.tv_sec;
- 	ewma_init(&sta->avg_signal, 1024, 8);
-+	for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++)
-+		ewma_init(&sta->chain_signal_avg[i], 1024, 8);
- 
- 	if (sta_prepare_rate_control(local, sta, gfp)) {
- 		kfree(sta);
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -721,6 +721,8 @@ struct station_parameters {
-  * @STATION_INFO_LOCAL_PM: @local_pm filled
-  * @STATION_INFO_PEER_PM: @peer_pm filled
-  * @STATION_INFO_NONPEER_PM: @nonpeer_pm filled
-+ * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled
-+ * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled
-  */
- enum station_info_flags {
- 	STATION_INFO_INACTIVE_TIME	= 1<<0,
-@@ -749,6 +751,8 @@ enum station_info_flags {
- 	STATION_INFO_NONPEER_PM		= 1<<23,
- 	STATION_INFO_RX_BYTES64		= 1<<24,
- 	STATION_INFO_TX_BYTES64		= 1<<25,
-+	STATION_INFO_CHAIN_SIGNAL	= 1<<26,
-+	STATION_INFO_CHAIN_SIGNAL_AVG	= 1<<27,
- };
- 
- /**
-@@ -842,6 +846,9 @@ struct sta_bss_parameters {
-  *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
-  * @signal_avg: Average signal strength, type depends on the wiphy's signal_type.
-  *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
-+ * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg
-+ * @chain_signal: per-chain signal strength of last received packet in dBm
-+ * @chain_signal_avg: per-chain signal strength average in dBm
-  * @txrate: current unicast bitrate from this station
-  * @rxrate: current unicast bitrate to this station
-  * @rx_packets: packets received from this station
-@@ -877,6 +884,11 @@ struct station_info {
- 	u8 plink_state;
- 	s8 signal;
- 	s8 signal_avg;
-+
-+	u8 chains;
-+	s8 chain_signal[4];
-+	s8 chain_signal_avg[4];
-+
- 	struct rate_info txrate;
- 	struct rate_info rxrate;
- 	u32 rx_packets;
 --- a/drivers/net/wireless/ath/ath9k/mac.h
 +++ b/drivers/net/wireless/ath/ath9k/mac.h
 @@ -133,12 +133,8 @@ struct ath_rx_status {
@@ -135,15 +17,15 @@
  	u8 rs_num_delims;
 --- a/drivers/net/wireless/ath/ath9k/recv.c
 +++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -937,6 +937,7 @@ static int ath9k_rx_skb_preprocess(struc
- 				   bool *decrypt_error)
- {
- 	struct ath_hw *ah = common->ah;
+@@ -950,6 +950,7 @@ static int ath9k_rx_skb_preprocess(struc
+ 	struct ath_hw *ah = sc->sc_ah;
+ 	struct ath_common *common = ath9k_hw_common(ah);
+ 	bool discard_current = sc->rx.discard_next;
 +	int i, j;
  
- 	/*
- 	 * everything but the rate is checked here, the rate check is done
-@@ -962,6 +963,20 @@ static int ath9k_rx_skb_preprocess(struc
+ 	sc->rx.discard_next = rx_stats->rs_more;
+ 	if (discard_current)
+@@ -979,6 +980,21 @@ static int ath9k_rx_skb_preprocess(struc
  	if (rx_stats->rs_moreaggr)
  		rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
  
@@ -161,10 +43,11 @@
 +		j++;
 +	}
 +
++
+ 	sc->rx.discard_next = false;
  	return 0;
  }
- 
-@@ -1070,7 +1085,7 @@ static int ath_process_fft(struct ath_so
+@@ -1088,7 +1104,7 @@ static int ath_process_fft(struct ath_so
  	fft_sample.tlv.length = __cpu_to_be16(length);
  
  	fft_sample.freq = __cpu_to_be16(ah->curchan->chan->center_freq);
@@ -236,7 +119,7 @@
  	if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -940,12 +940,12 @@ void ath_debug_stat_rx(struct ath_softc 
+@@ -943,12 +943,12 @@ void ath_debug_stat_rx(struct ath_softc 
  #ifdef CONFIG_ATH9K_MAC_DEBUG
  	spin_lock(&sc->debug.samp_lock);
  	RX_SAMP_DBG(jiffies) = jiffies;
@@ -255,108 +138,6 @@
  	RX_SAMP_DBG(antenna) = rs->rs_antenna;
  	RX_SAMP_DBG(rssi) = rs->rs_rssi;
  	RX_SAMP_DBG(rate) = rs->rs_rate;
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -1918,6 +1918,8 @@ enum nl80211_sta_bss_param {
-  * @NL80211_STA_INFO_PEER_PM: peer mesh STA link-specific power mode
-  * @NL80211_STA_INFO_NONPEER_PM: neighbor mesh STA power save mode towards
-  *	non-peer STA
-+ * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU
-+ * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average
-  * @__NL80211_STA_INFO_AFTER_LAST: internal
-  * @NL80211_STA_INFO_MAX: highest possible station info attribute
-  */
-@@ -1947,6 +1949,8 @@ enum nl80211_sta_info {
- 	NL80211_STA_INFO_NONPEER_PM,
- 	NL80211_STA_INFO_RX_BYTES64,
- 	NL80211_STA_INFO_TX_BYTES64,
-+	NL80211_STA_INFO_CHAIN_SIGNAL,
-+	NL80211_STA_INFO_CHAIN_SIGNAL_AVG,
- 
- 	/* keep last */
- 	__NL80211_STA_INFO_AFTER_LAST,
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -3082,6 +3082,32 @@ static bool nl80211_put_sta_rate(struct 
- 	return true;
- }
- 
-+static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
-+			       int id)
-+{
-+	void *attr;
-+	int i = 0;
-+
-+	if (!mask)
-+		return true;
-+
-+	attr = nla_nest_start(msg, id);
-+	if (!attr)
-+		return false;
-+
-+	for (i = 0; i < 4; i++) {
-+		if (!(mask & BIT(i)))
-+			continue;
-+
-+		if (nla_put_u8(msg, i, signal[i]))
-+			return false;
-+	}
-+
-+	nla_nest_end(msg, attr);
-+
-+	return true;
-+}
-+
- static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq,
- 				int flags,
- 				struct cfg80211_registered_device *rdev,
-@@ -3153,6 +3179,18 @@ static int nl80211_send_station(struct s
- 	default:
- 		break;
- 	}
-+	if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL) {
-+		if (!nl80211_put_signal(msg, sinfo->chains,
-+					sinfo->chain_signal,
-+					NL80211_STA_INFO_CHAIN_SIGNAL))
-+			goto nla_put_failure;
-+	}
-+	if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL_AVG) {
-+		if (!nl80211_put_signal(msg, sinfo->chains,
-+					sinfo->chain_signal_avg,
-+					NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
-+			goto nla_put_failure;
-+	}
- 	if (sinfo->filled & STATION_INFO_TX_BITRATE) {
- 		if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
- 					  NL80211_STA_INFO_TX_BITRATE))
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -445,6 +445,7 @@ static void sta_set_sinfo(struct sta_inf
- 	struct ieee80211_sub_if_data *sdata = sta->sdata;
- 	struct ieee80211_local *local = sdata->local;
- 	struct timespec uptime;
-+	int i;
- 
- 	sinfo->generation = sdata->local->sta_generation;
- 
-@@ -484,6 +485,17 @@ static void sta_set_sinfo(struct sta_inf
- 			sinfo->signal = (s8)sta->last_signal;
- 		sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
- 	}
-+	if (sta->chains) {
-+		sinfo->filled |= STATION_INFO_CHAIN_SIGNAL |
-+				 STATION_INFO_CHAIN_SIGNAL_AVG;
-+
-+		sinfo->chains = sta->chains;
-+		for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
-+			sinfo->chain_signal[i] = sta->chain_signal_last[i];
-+			sinfo->chain_signal_avg[i] =
-+				(s8) -ewma_read(&sta->chain_signal_avg[i]);
-+		}
-+	}
- 
- 	sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate);
- 	sta_set_rate_info_rx(sta, &sinfo->rxrate);
 --- a/drivers/net/wireless/ath/ath9k/dfs.c
 +++ b/drivers/net/wireless/ath/ath9k/dfs.c
 @@ -164,8 +164,8 @@ void ath9k_dfs_process_phyerr(struct ath

+ 26 - 26
package/mac80211/patches/523-mac80211_configure_antenna_gain.patch

@@ -1,14 +1,14 @@
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -978,6 +978,7 @@ enum ieee80211_smps_mode {
+@@ -988,6 +988,7 @@ enum ieee80211_smps_mode {
   *
   * @power_level: requested transmit power (in dBm), backward compatibility
   *	value only that is set to the minimum of all interfaces
 + * @max_antenna_gain: maximum antenna gain adjusted by user config (in dBi)
   *
-  * @channel: the channel to tune to
-  * @channel_type: the channel (HT) type
-@@ -1000,6 +1001,7 @@ struct ieee80211_conf {
+  * @chandef: the channel definition to tune to
+  * @radar_enabled: whether radar detection is enabled
+@@ -1009,6 +1010,7 @@ struct ieee80211_conf {
  	u32 flags;
  	int power_level, dynamic_ps_timeout;
  	int max_sleep_period;
@@ -18,7 +18,7 @@
  	u8 ps_dtim_period;
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1116,6 +1116,7 @@ struct ieee80211_local {
+@@ -1110,6 +1110,7 @@ struct ieee80211_local {
  	int dynamic_ps_forced_timeout;
  
  	int user_power_level; /* in dBm, for all interfaces */
@@ -28,9 +28,9 @@
  
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -1654,6 +1654,8 @@ enum nl80211_attrs {
- 	NL80211_ATTR_STA_CAPABILITY,
- 	NL80211_ATTR_STA_EXT_CAPABILITY,
+@@ -1709,6 +1709,8 @@ enum nl80211_attrs {
+ 	NL80211_ATTR_MDID,
+ 	NL80211_ATTR_IE_RIC,
  
 +	NL80211_ATTR_WIPHY_ANTENNA_GAIN,
 +
@@ -39,15 +39,15 @@
  	__NL80211_ATTR_AFTER_LAST,
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -370,6 +370,7 @@ static const struct nla_policy nl80211_p
- 	[NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
- 	[NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
- 	[NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
+@@ -378,6 +378,7 @@ static const struct nla_policy nl80211_p
+ 	[NL80211_ATTR_MDID] = { .type = NLA_U16 },
+ 	[NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
+ 				  .len = IEEE80211_MAX_DATA_LEN },
 +	[NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
  };
  
  /* policy for the key attributes */
-@@ -1706,6 +1707,22 @@ static int nl80211_set_wiphy(struct sk_b
+@@ -1990,6 +1991,22 @@ static int nl80211_set_wiphy(struct sk_b
  			goto bad_res;
  	}
  
@@ -72,7 +72,7 @@
  		u32 tx_ant, rx_ant;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2212,6 +2212,19 @@ static int ieee80211_get_tx_power(struct
+@@ -2269,6 +2269,19 @@ static int ieee80211_get_tx_power(struct
  	return 0;
  }
  
@@ -92,7 +92,7 @@
  static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
  				  const u8 *addr)
  {
-@@ -3375,6 +3388,7 @@ struct cfg80211_ops mac80211_config_ops 
+@@ -3459,6 +3472,7 @@ struct cfg80211_ops mac80211_config_ops 
  	.set_wiphy_params = ieee80211_set_wiphy_params,
  	.set_tx_power = ieee80211_set_tx_power,
  	.get_tx_power = ieee80211_get_tx_power,
@@ -102,7 +102,7 @@
  	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -1862,6 +1862,7 @@ struct cfg80211_gtk_rekey_data {
+@@ -1921,6 +1921,7 @@ struct cfg80211_update_ft_ies_params {
   *	(as advertised by the nl80211 feature flag.)
   * @get_tx_power: store the current TX power into the dbm variable;
   *	return 0 if successful
@@ -110,7 +110,7 @@
   *
   * @set_wds_peer: set the WDS peer for a WDS interface
   *
-@@ -2071,6 +2072,7 @@ struct cfg80211_ops {
+@@ -2134,6 +2135,7 @@ struct cfg80211_ops {
  				enum nl80211_tx_power_setting type, int mbm);
  	int	(*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
  				int *dbm);
@@ -122,20 +122,20 @@
 +++ b/net/mac80211/main.c
 @@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
  	struct ieee80211_sub_if_data *sdata;
- 	struct ieee80211_channel *chan;
+ 	struct cfg80211_chan_def chandef = {};
  	u32 changed = 0;
 -	int power;
 +	int power, ant_gain, max_power;
- 	enum nl80211_channel_type channel_type;
  	u32 offchannel_flag;
- 	bool scanning = false;
-@@ -164,8 +164,21 @@ static u32 ieee80211_hw_conf_chan(struct
+ 
+ 	offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
+@@ -165,8 +165,21 @@ static u32 ieee80211_hw_conf_chan(struct
  	}
  	rcu_read_unlock();
  
 -	if (local->hw.conf.power_level != power) {
-+	max_power = chan->max_reg_power;
-+	ant_gain = chan->max_antenna_gain;
++	max_power = chandef.chan->max_reg_power;
++	ant_gain = chandef.chan->max_antenna_gain;
 +	if (local->user_antenna_gain > 0) {
 +		if (local->user_antenna_gain > ant_gain) {
 +			max_power -= local->user_antenna_gain - ant_gain;
@@ -152,11 +152,11 @@
  		local->hw.cur_power_level = power;
  		local->hw.conf.power_level = power;
  	}
-@@ -612,6 +625,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
+@@ -597,6 +610,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
  					 IEEE80211_RADIOTAP_MCS_HAVE_BW;
  	local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
  					 IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
 +	local->user_antenna_gain = 0;
+ 	local->hw.uapsd_queues = IEEE80211_DEFAULT_UAPSD_QUEUES;
+ 	local->hw.uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN;
  	local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
- 	wiphy->ht_capa_mod_mask = &mac80211_ht_capa_mod_mask;
- 

+ 2 - 2
package/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch

@@ -10,7 +10,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2817,7 +2817,7 @@ void ath9k_hw_apply_txpower(struct ath_h
+@@ -2843,7 +2843,7 @@ void ath9k_hw_apply_txpower(struct ath_h
  	channel = chan->chan;
  	chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
  	new_pwr = min_t(int, chan_pwr, reg->power_limit);
@@ -21,7 +21,7 @@
  	if (ant_gain > max_gain)
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1277,7 +1277,10 @@ int ath9k_config(struct ieee80211_hw *hw
+@@ -1300,7 +1300,10 @@ int ath9k_config(struct ieee80211_hw *hw
  	}
  
  	if (changed & IEEE80211_CONF_CHANGE_POWER) {

+ 6 - 6
package/mac80211/patches/530-ath9k_extra_leds.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -551,6 +551,9 @@ struct ath9k_wow_pattern {
+@@ -553,6 +553,9 @@ struct ath9k_wow_pattern {
  void ath_init_leds(struct ath_softc *sc);
  void ath_deinit_leds(struct ath_softc *sc);
  void ath_fill_led_pin(struct ath_softc *sc);
@@ -10,7 +10,7 @@
  #else
  static inline void ath_init_leds(struct ath_softc *sc)
  {
-@@ -685,6 +688,13 @@ enum spectral_mode {
+@@ -687,6 +690,13 @@ enum spectral_mode {
  	SPECTRAL_CHANSCAN,
  };
  
@@ -24,7 +24,7 @@
  struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct device *dev;
-@@ -726,9 +736,8 @@ struct ath_softc {
+@@ -728,9 +738,8 @@ struct ath_softc {
  	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
  
  #ifdef CONFIG_MAC80211_LEDS
@@ -162,7 +162,7 @@
  void ath_fill_led_pin(struct ath_softc *sc)
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -870,7 +870,7 @@ int ath9k_init_device(u16 devid, struct 
+@@ -891,7 +891,7 @@ int ath9k_init_device(u16 devid, struct 
  
  #ifdef CONFIG_MAC80211_LEDS
  	/* must be initialized before ieee80211_register_hw */
@@ -173,7 +173,7 @@
  #endif
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1482,6 +1482,61 @@ static const struct file_operations fops
+@@ -1489,6 +1489,61 @@ static const struct file_operations fops
  	.llseek = default_llseek,
  };
  
@@ -235,7 +235,7 @@
  #ifdef CONFIG_ATH9K_MAC_DEBUG
  
  void ath9k_debug_samp_bb_mac(struct ath_softc *sc)
-@@ -2115,6 +2170,10 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2124,6 +2179,10 @@ int ath9k_init_debug(struct ath_hw *ah)
  			    &fops_eeprom);
  	debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
  			    sc, &fops_chanbw);

+ 0 - 98
package/mac80211/patches/540-mac80211_optimize_mcs_rate_mask.patch

@@ -1,98 +0,0 @@
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -739,6 +739,8 @@ struct ieee80211_sub_if_data {
- 
- 	/* bitmap of allowed (non-MCS) rate indexes for rate control */
- 	u32 rc_rateidx_mask[IEEE80211_NUM_BANDS];
-+
-+	bool rc_has_mcs_mask[IEEE80211_NUM_BANDS];
- 	u8  rc_rateidx_mcs_mask[IEEE80211_NUM_BANDS][IEEE80211_HT_MCS_MASK_LEN];
- 
- 	union {
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -2386,9 +2386,20 @@ static int ieee80211_set_bitrate_mask(st
- 	}
- 
- 	for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
-+		struct ieee80211_supported_band *sband = wiphy->bands[i];
-+
- 		sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
- 		memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].mcs,
- 		       sizeof(mask->control[i].mcs));
-+
-+		sdata->rc_has_mcs_mask[i] = false;
-+		if (!sband)
-+			continue;
-+
-+		if (memcmp(sdata->rc_rateidx_mcs_mask[i],
-+			   sband->ht_cap.mcs.rx_mask,
-+			   sizeof(sband->ht_cap.mcs.rx_mask)) != 0)
-+			sdata->rc_has_mcs_mask[i] = true;
- 	}
- 
- 	return 0;
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -4091,7 +4091,7 @@ void ieee80211_send_bar(struct ieee80211
-  *	(deprecated; this will be removed once drivers get updated to use
-  *	rate_idx_mask)
-  * @rate_idx_mask: user-requested (legacy) rate mask
-- * @rate_idx_mcs_mask: user-requested MCS rate mask
-+ * @rate_idx_mcs_mask: user-requested MCS rate mask (NULL if not in use)
-  * @bss: whether this frame is sent out in AP or IBSS mode
-  */
- struct ieee80211_tx_rate_control {
-@@ -4103,7 +4103,7 @@ struct ieee80211_tx_rate_control {
- 	bool rts, short_preamble;
- 	u8 max_rate_idx;
- 	u32 rate_idx_mask;
--	u8 rate_idx_mcs_mask[IEEE80211_HT_MCS_MASK_LEN];
-+	u8 *rate_idx_mcs_mask;
- 	bool bss;
- };
- 
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -641,9 +641,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021
- 		txrc.max_rate_idx = -1;
- 	else
- 		txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
--	memcpy(txrc.rate_idx_mcs_mask,
--	       tx->sdata->rc_rateidx_mcs_mask[info->band],
--	       sizeof(txrc.rate_idx_mcs_mask));
-+
-+	if (tx->sdata->rc_has_mcs_mask[info->band])
-+		txrc.rate_idx_mcs_mask =
-+			tx->sdata->rc_rateidx_mcs_mask[info->band];
-+
- 	txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP ||
- 		    tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
- 		    tx->sdata->vif.type == NL80211_IFTYPE_ADHOC);
-@@ -2511,8 +2513,6 @@ struct sk_buff *ieee80211_beacon_get_tim
- 		txrc.max_rate_idx = -1;
- 	else
- 		txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;
--	memcpy(txrc.rate_idx_mcs_mask, sdata->rc_rateidx_mcs_mask[band],
--	       sizeof(txrc.rate_idx_mcs_mask));
- 	txrc.bss = true;
- 	rate_control_get_rate(sdata, NULL, &txrc);
- 
---- a/net/mac80211/rate.c
-+++ b/net/mac80211/rate.c
-@@ -460,9 +460,12 @@ void rate_control_get_rate(struct ieee80
- 	 * the common case.
- 	 */
- 	mask = sdata->rc_rateidx_mask[info->band];
--	memcpy(mcs_mask, sdata->rc_rateidx_mcs_mask[info->band],
--	       sizeof(mcs_mask));
--	if (mask != (1 << txrc->sband->n_bitrates) - 1) {
-+	if (mask != (1 << txrc->sband->n_bitrates) - 1 || txrc->rate_idx_mcs_mask) {
-+		if (txrc->rate_idx_mcs_mask)
-+			memcpy(mcs_mask, txrc->rate_idx_mcs_mask, sizeof(mcs_mask));
-+		else
-+			memset(mcs_mask, 0xff, sizeof(mcs_mask));
-+
- 		if (sta) {
- 			/* Filter out rates that the STA does not support */
- 			mask &= sta->sta.supp_rates[info->band];

+ 2 - 2
package/mac80211/patches/552-ath9k_rx_dma_stop_check.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/mac.c
 +++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -689,7 +689,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
+@@ -697,7 +697,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
  {
  #define AH_RX_STOP_DMA_TIMEOUT 10000   /* usec */
  	struct ath_common *common = ath9k_hw_common(ah);
@@ -9,7 +9,7 @@
  	int i;
  
  	/* Enable access to the DMA observation bus */
-@@ -719,6 +719,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
+@@ -727,6 +727,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw 
  	}
  
  	if (i == 0) {

+ 8 - 8
package/mac80211/patches/553-ath9k_debugfs_diag.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -2149,6 +2149,50 @@ static const struct file_operations fops
+@@ -2158,6 +2158,50 @@ static const struct file_operations fops
  };
  
  
@@ -51,7 +51,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -2174,6 +2218,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2183,6 +2227,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  	debugfs_create_file("gpio_led", S_IWUSR,
  			   sc->debug.debugfs_phy, sc, &fops_gpio_led);
  #endif
@@ -62,7 +62,7 @@
  	debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -500,6 +500,12 @@ enum {
+@@ -499,6 +499,12 @@ enum {
  	ATH9K_RESET_COLD,
  };
  
@@ -75,7 +75,7 @@
  struct ath9k_hw_version {
  	u32 magic;
  	u16 devid;
-@@ -778,6 +784,8 @@ struct ath_hw {
+@@ -777,6 +783,8 @@ struct ath_hw {
  	u32 rfkill_polarity;
  	u32 ah_flags;
  
@@ -84,7 +84,7 @@
  	bool reset_power_on;
  	bool htc_reset_init;
  
-@@ -1041,6 +1049,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
+@@ -1027,6 +1035,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
  bool ath9k_hw_check_alive(struct ath_hw *ah);
  
  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
@@ -94,7 +94,7 @@
  void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause);
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1747,6 +1747,20 @@ fail:
+@@ -1845,6 +1845,20 @@ fail:
  	return -EINVAL;
  }
  
@@ -115,7 +115,7 @@
  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
  		   struct ath9k_hw_cal_data *caldata, bool fastcc)
  {
-@@ -2023,6 +2037,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2046,6 +2060,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  	}
  
  	ath9k_hw_apply_gpio_override(ah);
@@ -125,7 +125,7 @@
  		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -459,6 +459,11 @@ irqreturn_t ath_isr(int irq, void *dev)
+@@ -463,6 +463,11 @@ irqreturn_t ath_isr(int irq, void *dev)
  	ath9k_hw_getisr(ah, &status);	/* NB: clears ISR too */
  	status &= ah->imask;	/* discard unasked-for bits */
  

+ 3 - 3
package/mac80211/patches/555-ath9k-allow-to-disable-bands-via-platform-data.patch

@@ -12,7 +12,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2413,17 +2413,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
+@@ -2439,17 +2439,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
  	}
  
  	eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
@@ -48,7 +48,7 @@
  	    AR_SREV_9285(ah) ||
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -961,6 +961,8 @@ struct ath_hw {
+@@ -947,6 +947,8 @@ struct ath_hw {
  	bool is_clk_25mhz;
  	int (*get_mac_revision)(void);
  	int (*external_reset)(void);
@@ -59,7 +59,7 @@
  };
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -587,6 +587,8 @@ static int ath9k_init_softc(u16 devid, s
+@@ -591,6 +591,8 @@ static int ath9k_init_softc(u16 devid, s
  		ah->is_clk_25mhz = pdata->is_clk_25mhz;
  		ah->get_mac_revision = pdata->get_mac_revision;
  		ah->external_reset = pdata->external_reset;

+ 0 - 18
package/mac80211/patches/600-rt2x00-disable-pci-code-if-CONFIG_PCI-not-defined.patch

@@ -1,18 +0,0 @@
---- a/drivers/net/wireless/rt2x00/rt2x00pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
-@@ -208,6 +208,7 @@ void rt2x00pci_uninitialize(struct rt2x0
- }
- EXPORT_SYMBOL_GPL(rt2x00pci_uninitialize);
- 
-+#ifdef CONFIG_PCI
- /*
-  * PCI driver handlers.
-  */
-@@ -392,6 +393,7 @@ int rt2x00pci_resume(struct pci_dev *pci
- }
- EXPORT_SYMBOL_GPL(rt2x00pci_resume);
- #endif /* CONFIG_PM */
-+#endif /* CONFIG_PCI */
- 
- /*
-  * rt2x00pci module information.

+ 1 - 1
package/mac80211/patches/601-rt2x00-set_pci_mwi.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
-@@ -273,8 +273,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
+@@ -96,8 +96,10 @@ int rt2x00pci_probe(struct pci_dev *pci_
  
  	pci_set_master(pci_dev);
  

+ 16 - 16
package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch

@@ -101,7 +101,7 @@
 +}
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -559,6 +559,7 @@ struct rt2x00lib_ops {
+@@ -560,6 +560,7 @@ struct rt2x00lib_ops {
  			       const u8 *data, const size_t len);
  	int (*load_firmware) (struct rt2x00_dev *rt2x00dev,
  			      const u8 *data, const size_t len);
@@ -109,7 +109,7 @@
  
  	/*
  	 * Device initialization/deinitialization handlers.
-@@ -719,6 +720,7 @@ enum rt2x00_capability_flags {
+@@ -720,6 +721,7 @@ enum rt2x00_capability_flags {
  	REQUIRE_SW_SEQNO,
  	REQUIRE_HT_TX_DESC,
  	REQUIRE_PS_AUTOWAKE,
@@ -117,7 +117,7 @@
  
  	/*
  	 * Capabilities
-@@ -988,6 +990,11 @@ struct rt2x00_dev {
+@@ -989,6 +991,11 @@ struct rt2x00_dev {
  	const struct firmware *fw;
  
  	/*
@@ -156,15 +156,15 @@
  #ifdef CONFIG_RT2X00_LIB_DEBUGFS
 --- a/drivers/net/wireless/rt2x00/Kconfig
 +++ b/drivers/net/wireless/rt2x00/Kconfig
-@@ -60,6 +60,7 @@ config RT2800PCI
+@@ -64,6 +64,7 @@ config RT2800PCI
  	select RT2X00_LIB_PCI if PCI
- 	select RT2X00_LIB_SOC if RALINK_RT288X || RALINK_RT305X
+ 	select RT2X00_LIB_SOC if SOC_RT288X || SOC_RT305X
  	select RT2X00_LIB_FIRMWARE
 +	select RT2X00_LIB_EEPROM
  	select RT2X00_LIB_CRYPTO
  	select CRC_CCITT
  	select EEPROM_93CX6
-@@ -212,6 +213,9 @@ config RT2X00_LIB_FIRMWARE
+@@ -221,6 +222,9 @@ config RT2X00_LIB_FIRMWARE
  config RT2X00_LIB_CRYPTO
  	boolean
  
@@ -183,14 +183,14 @@
 +rt2x00lib-$(CONFIG_RT2X00_LIB_EEPROM)	+= rt2x00eeprom.o
  
  obj-$(CONFIG_RT2X00_LIB)		+= rt2x00lib.o
- obj-$(CONFIG_RT2X00_LIB_PCI)		+= rt2x00pci.o
+ obj-$(CONFIG_RT2X00_LIB_MMIO)		+= rt2x00mmio.o
 --- a/drivers/net/wireless/rt2x00/rt2800pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -89,25 +89,11 @@ static void rt2800pci_mcu_status(struct 
- 	rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
+@@ -90,25 +90,11 @@ static void rt2800pci_mcu_status(struct 
+ 	rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
  }
  
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
+-#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
  static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
  {
 -	void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
@@ -209,11 +209,11 @@
 -{
 -	return -ENOMEM;
 -}
--#endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */
+-#endif /* CONFIG_SOC_RT288X || CONFIG_SOC_RT305X */
  
  #ifdef CONFIG_PCI
  static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
-@@ -331,6 +317,20 @@ static int rt2800pci_write_firmware(stru
+@@ -332,6 +318,20 @@ static int rt2800pci_write_firmware(stru
  }
  
  /*
@@ -234,13 +234,13 @@
   * Initialization functions.
   */
  static bool rt2800pci_get_entry_state(struct queue_entry *entry)
-@@ -1046,6 +1046,7 @@ static const struct rt2x00lib_ops rt2800
+@@ -1162,6 +1162,7 @@ static const struct rt2x00lib_ops rt2800
  	.get_firmware_name	= rt2800pci_get_firmware_name,
  	.check_firmware		= rt2800_check_firmware,
  	.load_firmware		= rt2800_load_firmware,
-+	.get_eeprom_file_name   = rt2800pci_get_eeprom_file_name,
- 	.initialize		= rt2x00pci_initialize,
- 	.uninitialize		= rt2x00pci_uninitialize,
++	.get_eeprom_file_name	= rt2800pci_get_eeprom_file_name,
+ 	.initialize		= rt2x00mmio_initialize,
+ 	.uninitialize		= rt2x00mmio_uninitialize,
  	.get_entry_state	= rt2800pci_get_entry_state,
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c

+ 1 - 1
package/mac80211/patches/604-rt2x00-add-CONFIG_RT2X00_LIB_EEPROM-option.patch

@@ -1,6 +1,6 @@
 --- a/config.mk
 +++ b/config.mk
-@@ -640,6 +640,7 @@ export CONFIG_RT2X00=y
+@@ -647,6 +647,7 @@ export CONFIG_RT2X00=y
  export CONFIG_RT2X00_LIB=m
  export CONFIG_RT2800_LIB=m
  export CONFIG_RT2X00_LIB_FIRMWARE=y

+ 6 - 6
package/mac80211/patches/605-rt2x00-pci-eeprom.patch

@@ -1,15 +1,15 @@
 --- a/drivers/net/wireless/rt2x00/rt2800pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -89,7 +89,7 @@ static void rt2800pci_mcu_status(struct 
- 	rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
+@@ -90,7 +90,7 @@ static void rt2800pci_mcu_status(struct 
+ 	rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
  }
  
 -static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
 +static int rt2800pci_read_eeprom_file(struct rt2x00_dev *rt2x00dev)
  {
  	memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE);
- 	return 0;
-@@ -983,8 +983,9 @@ static int rt2800pci_read_eeprom(struct 
+ 	return -ENOMEM;
+@@ -1099,8 +1099,9 @@ static int rt2800pci_read_eeprom(struct 
  {
  	int retval;
  
@@ -23,7 +23,7 @@
  	else
 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
-@@ -255,6 +255,7 @@ exit:
+@@ -78,6 +78,7 @@ exit:
  int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
  {
  	struct ieee80211_hw *hw;
@@ -31,7 +31,7 @@
  	struct rt2x00_dev *rt2x00dev;
  	int retval;
  	u16 chip;
-@@ -300,6 +301,12 @@ int rt2x00pci_probe(struct pci_dev *pci_
+@@ -123,6 +124,12 @@ int rt2x00pci_probe(struct pci_dev *pci_
  	rt2x00dev->irq = pci_dev->irq;
  	rt2x00dev->name = pci_name(pci_dev);
  

+ 1 - 1
package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch

@@ -37,7 +37,7 @@
  		num_rates += 4;
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -424,6 +424,7 @@ struct hw_mode_spec {
+@@ -425,6 +425,7 @@ struct hw_mode_spec {
  	unsigned int supported_bands;
  #define SUPPORT_BAND_2GHZ	0x00000001
  #define SUPPORT_BAND_5GHZ	0x00000002

+ 4 - 4
package/mac80211/patches/608-add_platform_data_mac_addr.patch

@@ -31,7 +31,7 @@
  {
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -1314,6 +1314,7 @@ static inline void rt2x00debug_dump_fram
+@@ -1337,6 +1337,7 @@ static inline void rt2x00debug_dump_fram
   */
  u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
  			 struct ieee80211_vif *vif);
@@ -41,15 +41,15 @@
   * Interrupt context handlers.
 --- a/drivers/net/wireless/rt2x00/rt61pci.c
 +++ b/drivers/net/wireless/rt2x00/rt61pci.c
-@@ -2392,6 +2392,7 @@ static int rt61pci_validate_eeprom(struc
+@@ -2396,6 +2396,7 @@ static int rt61pci_validate_eeprom(struc
  	u32 reg;
  	u16 word;
  	u8 *mac;
 +	const u8 *pdata_mac;
  	s8 value;
  
- 	rt2x00pci_register_read(rt2x00dev, E2PROM_CSR, &reg);
-@@ -2412,7 +2413,11 @@ static int rt61pci_validate_eeprom(struc
+ 	rt2x00mmio_register_read(rt2x00dev, E2PROM_CSR, &reg);
+@@ -2416,7 +2417,11 @@ static int rt61pci_validate_eeprom(struc
  	/*
  	 * Start validation of the data that has been read.
  	 */

+ 14 - 14
package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -2249,15 +2249,18 @@ static void rt2800_config_channel(struct
+@@ -2622,15 +2622,18 @@ static void rt2800_config_channel(struct
  	/*
  	 * Change BBP settings
  	 */
@@ -22,7 +22,7 @@
  		rt2800_bbp_write(rt2x00dev, 86, 0);
  	}
  
-@@ -3670,6 +3673,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4203,6 +4206,7 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 120, 0x50);
  
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
@@ -30,7 +30,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 128, 0x12);
-@@ -3976,6 +3980,12 @@ static void rt2800_init_rfcsr_3290(struc
+@@ -4507,6 +4511,12 @@ static void rt2800_init_rfcsr_3290(struc
  
  static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
  {
@@ -43,7 +43,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
  	rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
  	rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
-@@ -4009,15 +4019,30 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -4540,15 +4550,30 @@ static void rt2800_init_rfcsr_3352(struc
  	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
  	rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
  	rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
@@ -77,7 +77,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
-@@ -4025,15 +4050,20 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -4556,15 +4581,20 @@ static void rt2800_init_rfcsr_3352(struc
  	rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
  	rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
  	rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
@@ -107,7 +107,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
-@@ -4949,7 +4979,8 @@ static int rt2800_init_eeprom(struct rt2
+@@ -5534,7 +5564,8 @@ static int rt2800_init_eeprom(struct rt2
  	/*
  	 * Detect if this device has Bluetooth co-existence.
  	 */
@@ -117,7 +117,7 @@
  		__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
  
  	/*
-@@ -4978,6 +5009,22 @@ static int rt2800_init_eeprom(struct rt2
+@@ -5563,6 +5594,22 @@ static int rt2800_init_eeprom(struct rt2
  					EIRP_MAX_TX_POWER_LIMIT)
  		__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
  
@@ -142,7 +142,7 @@
  
 --- a/drivers/net/wireless/rt2x00/rt2800.h
 +++ b/drivers/net/wireless/rt2x00/rt2800.h
-@@ -2117,6 +2117,12 @@ struct mac_iveiv_entry {
+@@ -2153,6 +2153,12 @@ struct mac_iveiv_entry {
  #define RFCSR31_RX_CALIB		FIELD8(0x7f)
  
  /*
@@ -155,7 +155,7 @@
   * RFCSR 38:
   */
  #define RFCSR38_RX_LO1_EN		FIELD8(0x20)
-@@ -2127,6 +2133,18 @@ struct mac_iveiv_entry {
+@@ -2163,6 +2169,18 @@ struct mac_iveiv_entry {
  #define RFCSR39_RX_LO2_EN		FIELD8(0x80)
  
  /*
@@ -174,16 +174,16 @@
   * RFCSR 49:
   */
  #define RFCSR49_TX			FIELD8(0x3f)
-@@ -2135,6 +2153,8 @@ struct mac_iveiv_entry {
+@@ -2172,6 +2190,8 @@ struct mac_iveiv_entry {
   * RFCSR 50:
   */
  #define RFCSR50_TX			FIELD8(0x3f)
 +#define RFCSR50_TX0_EXT_PA		FIELD8(0x02)
 +#define RFCSR50_TX1_EXT_PA		FIELD8(0x10)
+ #define RFCSR50_EP			FIELD8(0xc0)
  
  /*
-  * RF registers
-@@ -2222,6 +2242,8 @@ struct mac_iveiv_entry {
+@@ -2260,6 +2280,8 @@ struct mac_iveiv_entry {
   * INTERNAL_TX_ALC: 0: disable, 1: enable
   * BT_COEXIST: 0: disable, 1: enable
   * DAC_TEST: 0: disable, 1: enable
@@ -192,7 +192,7 @@
   */
  #define	EEPROM_NIC_CONF1		0x001b
  #define EEPROM_NIC_CONF1_HW_RADIO		FIELD16(0x0001)
-@@ -2239,6 +2261,8 @@ struct mac_iveiv_entry {
+@@ -2277,6 +2299,8 @@ struct mac_iveiv_entry {
  #define EEPROM_NIC_CONF1_INTERNAL_TX_ALC		FIELD16(0x2000)
  #define EEPROM_NIC_CONF1_BT_COEXIST		FIELD16(0x4000)
  #define EEPROM_NIC_CONF1_DAC_TEST		FIELD16(0x8000)
@@ -203,7 +203,7 @@
   * EEPROM frequency
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -740,6 +740,8 @@ enum rt2x00_capability_flags {
+@@ -741,6 +741,8 @@ enum rt2x00_capability_flags {
  	CAPABILITY_DOUBLE_ANTENNA,
  	CAPABILITY_BT_COEXIST,
  	CAPABILITY_VCO_RECALIBRATION,

+ 8 - 8
package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch

@@ -1,7 +1,7 @@
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -5169,6 +5169,27 @@ static const struct rf_channel rf_vals_3
- 	{173, 0x61, 0, 9},
+@@ -5886,6 +5886,27 @@ static const struct rf_channel rf_vals_5
+ 	{196, 83, 0, 12, 1},
  };
  
 +/*
@@ -28,7 +28,7 @@
  static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  {
  	struct hw_mode_spec *spec = &rt2x00dev->spec;
-@@ -5246,7 +5267,6 @@ static int rt2800_probe_hw_mode(struct r
+@@ -5964,7 +5985,6 @@ static int rt2800_probe_hw_mode(struct r
  		   rt2x00_rf(rt2x00dev, RF3022) ||
  		   rt2x00_rf(rt2x00dev, RF3290) ||
  		   rt2x00_rf(rt2x00dev, RF3320) ||
@@ -36,7 +36,7 @@
  		   rt2x00_rf(rt2x00dev, RF5360) ||
  		   rt2x00_rf(rt2x00dev, RF5370) ||
  		   rt2x00_rf(rt2x00dev, RF5372) ||
-@@ -5254,6 +5274,12 @@ static int rt2800_probe_hw_mode(struct r
+@@ -5972,6 +5992,12 @@ static int rt2800_probe_hw_mode(struct r
  		   rt2x00_rf(rt2x00dev, RF5392)) {
  		spec->num_channels = 14;
  		spec->channels = rf_vals_3x;
@@ -49,7 +49,7 @@
  	} else if (rt2x00_rf(rt2x00dev, RF3052)) {
  		spec->supported_bands |= SUPPORT_BAND_5GHZ;
  		spec->num_channels = ARRAY_SIZE(rf_vals_3x);
-@@ -5347,6 +5373,19 @@ static int rt2800_probe_hw_mode(struct r
+@@ -6120,6 +6146,19 @@ static int rt2800_probe_rt(struct rt2x00
  	return 0;
  }
  
@@ -69,7 +69,7 @@
  int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  {
  	int retval;
-@@ -5372,6 +5411,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+@@ -6149,6 +6188,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
  
  	/*
@@ -87,7 +87,7 @@
  	retval = rt2800_probe_hw_mode(rt2x00dev);
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -419,6 +419,7 @@ static inline struct rt2x00_intf* vif_to
+@@ -420,6 +420,7 @@ static inline struct rt2x00_intf* vif_to
   * @channels: Device/chipset specific channel values (See &struct rf_channel).
   * @channels_info: Additional information for channels (See &struct channel_info).
   * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
@@ -95,7 +95,7 @@
   */
  struct hw_mode_spec {
  	unsigned int supported_bands;
-@@ -435,6 +436,7 @@ struct hw_mode_spec {
+@@ -436,6 +437,7 @@ struct hw_mode_spec {
  	const struct channel_info *channels_info;
  
  	struct ieee80211_sta_ht_cap ht;

+ 1 - 1
package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch

@@ -13,7 +13,7 @@ Signed-off-by: John Crispin <[email protected]>
 
 --- a/drivers/net/wireless/rt2x00/rt2800pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -1185,11 +1185,18 @@ static int rt2800soc_probe(struct platfo
+@@ -1301,11 +1301,18 @@ static int rt2800soc_probe(struct platfo
  	return rt2x00soc_probe(pdev, &rt2800pci_ops);
  }
  

+ 0 - 47
package/mac80211/patches/613-rt2x00-fixup-symbols.patch

@@ -1,47 +0,0 @@
---- a/drivers/net/wireless/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -1179,7 +1179,7 @@ MODULE_DEVICE_TABLE(pci, rt2800pci_devic
- #endif /* CONFIG_PCI */
- MODULE_LICENSE("GPL");
- 
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
-+#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
- static int rt2800soc_probe(struct platform_device *pdev)
- {
- 	return rt2x00soc_probe(pdev, &rt2800pci_ops);
-@@ -1203,7 +1203,7 @@ static struct platform_driver rt2800soc_
- 	.suspend	= rt2x00soc_suspend,
- 	.resume		= rt2x00soc_resume,
- };
--#endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */
-+#endif /* CONFIG_SOC_RT288X || CONFIG_SOC_RT305X */
- 
- #ifdef CONFIG_PCI
- static int rt2800pci_probe(struct pci_dev *pci_dev,
-@@ -1226,7 +1226,7 @@ static int __init rt2800pci_init(void)
- {
- 	int ret = 0;
- 
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
-+#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
- 	ret = platform_driver_register(&rt2800soc_driver);
- 	if (ret)
- 		return ret;
-@@ -1234,7 +1234,7 @@ static int __init rt2800pci_init(void)
- #ifdef CONFIG_PCI
- 	ret = pci_register_driver(&rt2800pci_driver);
- 	if (ret) {
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
-+#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
- 		platform_driver_unregister(&rt2800soc_driver);
- #endif
- 		return ret;
-@@ -1249,7 +1249,7 @@ static void __exit rt2800pci_exit(void)
- #ifdef CONFIG_PCI
- 	pci_unregister_driver(&rt2800pci_driver);
- #endif
--#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
-+#if defined(CONFIG_SOC_RT288X) || defined(CONFIG_SOC_RT305X)
- 	platform_driver_unregister(&rt2800soc_driver);
- #endif
- }

+ 1 - 1
package/mac80211/patches/614-rt2x00-of_load_eeprom_filename.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/rt2x00/rt2800pci.c
 +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -322,11 +322,17 @@ static int rt2800pci_write_firmware(stru
+@@ -323,11 +323,17 @@ static int rt2800pci_write_firmware(stru
  static char *rt2800pci_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
  {
  	struct rt2x00_platform_data *pdata;

+ 1 - 1
package/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch

@@ -8,7 +8,7 @@
  
  #include "rt2x00.h"
  #include "rt2800lib.h"
-@@ -5375,13 +5376,14 @@ static int rt2800_probe_hw_mode(struct r
+@@ -6148,13 +6149,14 @@ static int rt2800_probe_rt(struct rt2x00
  
  int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
  {

+ 54 - 54
package/mac80211/patches/616-rt2x00-support-rt5350.patch

@@ -1,8 +1,8 @@
 --- a/drivers/net/wireless/rt2x00/rt2800.h
 +++ b/drivers/net/wireless/rt2x00/rt2800.h
-@@ -69,6 +69,7 @@
- #define RF3322				0x000c
+@@ -71,6 +71,7 @@
  #define RF3053				0x000d
+ #define RF5592				0x000f
  #define RF3290				0x3290
 +#define RF5350				0x5350
  #define RF5360				0x5360
@@ -10,7 +10,7 @@
  #define RF5372				0x5372
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -2138,6 +2138,15 @@ static void rt2800_config_channel_rf53xx
+@@ -2132,6 +2132,15 @@ static void rt2800_config_channel_rf53xx
  	if (rf->channel <= 14) {
  		int idx = rf->channel-1;
  
@@ -26,7 +26,7 @@
  		if (test_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags)) {
  			if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
  				/* r55/r59 value array of channel 1~14 */
-@@ -2219,6 +2228,7 @@ static void rt2800_config_channel(struct
+@@ -2589,6 +2598,7 @@ static void rt2800_config_channel(struct
  	case RF3322:
  		rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
  		break;
@@ -34,7 +34,7 @@
  	case RF5360:
  	case RF5370:
  	case RF5372:
-@@ -2232,6 +2242,7 @@ static void rt2800_config_channel(struct
+@@ -2605,6 +2615,7 @@ static void rt2800_config_channel(struct
  
  	if (rt2x00_rf(rt2x00dev, RF3290) ||
  	    rt2x00_rf(rt2x00dev, RF3322) ||
@@ -42,7 +42,7 @@
  	    rt2x00_rf(rt2x00dev, RF5360) ||
  	    rt2x00_rf(rt2x00dev, RF5370) ||
  	    rt2x00_rf(rt2x00dev, RF5372) ||
-@@ -2362,7 +2373,8 @@ static void rt2800_config_channel(struct
+@@ -2746,7 +2757,8 @@ static void rt2800_config_channel(struct
  	/*
  	 * Clear update flag
  	 */
@@ -52,7 +52,7 @@
  		rt2800_bbp_read(rt2x00dev, 49, &bbp);
  		rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
  		rt2800_bbp_write(rt2x00dev, 49, bbp);
-@@ -2801,6 +2813,7 @@ void rt2800_vco_calibration(struct rt2x0
+@@ -3185,6 +3197,7 @@ void rt2800_vco_calibration(struct rt2x0
  		rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
  		break;
  	case RF3290:
@@ -60,17 +60,17 @@
  	case RF5360:
  	case RF5370:
  	case RF5372:
-@@ -3125,7 +3138,8 @@ static int rt2800_init_registers(struct 
+@@ -3524,7 +3537,8 @@ static int rt2800_init_registers(struct 
  	} else if (rt2x00_rt(rt2x00dev, RT3572)) {
  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
  		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
 -	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
 +	} else if (rt2x00_rt(rt2x00dev, RT5350) ||
 +		   rt2x00_rt(rt2x00dev, RT5390) ||
- 		   rt2x00_rt(rt2x00dev, RT5392)) {
+ 		   rt2x00_rt(rt2x00dev, RT5392) ||
+ 		   rt2x00_rt(rt2x00dev, RT5592)) {
  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
- 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-@@ -3507,6 +3521,10 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4043,6 +4057,10 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 4, 0x50);
  	}
  
@@ -80,8 +80,8 @@
 +
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
  	    rt2x00_rt(rt2x00dev, RT5390) ||
- 	    rt2x00_rt(rt2x00dev, RT5392)) {
-@@ -3519,11 +3537,13 @@ static int rt2800_init_bbp(struct rt2x00
+ 	    rt2x00_rt(rt2x00dev, RT5392))
+@@ -4052,11 +4070,13 @@ static int rt2800_init_bbp(struct rt2x00
  	    rt2x00_rt(rt2x00dev, RT3290) ||
  	    rt2x00_rt(rt2x00dev, RT3352) ||
  	    rt2x00_rt(rt2x00dev, RT3572) ||
@@ -96,7 +96,7 @@
  		rt2800_bbp_write(rt2x00dev, 47, 0x48);
  
  	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
-@@ -3531,6 +3551,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4064,6 +4084,7 @@ static int rt2800_init_bbp(struct rt2x00
  
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
  	    rt2x00_rt(rt2x00dev, RT3352) ||
@@ -104,7 +104,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 68, 0x0b);
-@@ -3540,6 +3561,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4073,6 +4094,7 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 73, 0x12);
  	} else if (rt2x00_rt(rt2x00dev, RT3290) ||
  		   rt2x00_rt(rt2x00dev, RT3352) ||
@@ -112,7 +112,7 @@
  		   rt2x00_rt(rt2x00dev, RT5390) ||
  		   rt2x00_rt(rt2x00dev, RT5392)) {
  		rt2800_bbp_write(rt2x00dev, 69, 0x12);
-@@ -3576,7 +3598,8 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4109,7 +4131,8 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 79, 0x18);
  		rt2800_bbp_write(rt2x00dev, 80, 0x09);
  		rt2800_bbp_write(rt2x00dev, 81, 0x33);
@@ -122,7 +122,7 @@
  		rt2800_bbp_write(rt2x00dev, 78, 0x0e);
  		rt2800_bbp_write(rt2x00dev, 80, 0x08);
  		rt2800_bbp_write(rt2x00dev, 81, 0x37);
-@@ -3586,6 +3609,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4119,6 +4142,7 @@ static int rt2800_init_bbp(struct rt2x00
  
  	rt2800_bbp_write(rt2x00dev, 82, 0x62);
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
@@ -130,7 +130,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 83, 0x7a);
-@@ -3595,6 +3619,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4128,6 +4152,7 @@ static int rt2800_init_bbp(struct rt2x00
  	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
  		rt2800_bbp_write(rt2x00dev, 84, 0x19);
  	else if (rt2x00_rt(rt2x00dev, RT3290) ||
@@ -138,7 +138,7 @@
  		 rt2x00_rt(rt2x00dev, RT5390) ||
  		 rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 84, 0x9a);
-@@ -3603,6 +3628,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4136,6 +4161,7 @@ static int rt2800_init_bbp(struct rt2x00
  
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
  	    rt2x00_rt(rt2x00dev, RT3352) ||
@@ -146,7 +146,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 86, 0x38);
-@@ -3617,6 +3643,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4150,6 +4176,7 @@ static int rt2800_init_bbp(struct rt2x00
  
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
  	    rt2x00_rt(rt2x00dev, RT3352) ||
@@ -154,7 +154,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 92, 0x02);
-@@ -3635,6 +3662,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4168,6 +4195,7 @@ static int rt2800_init_bbp(struct rt2x00
  	    rt2x00_rt(rt2x00dev, RT3290) ||
  	    rt2x00_rt(rt2x00dev, RT3352) ||
  	    rt2x00_rt(rt2x00dev, RT3572) ||
@@ -162,7 +162,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392) ||
  	    rt2800_is_305x_soc(rt2x00dev))
-@@ -3644,6 +3672,7 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4177,6 +4205,7 @@ static int rt2800_init_bbp(struct rt2x00
  
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
  	    rt2x00_rt(rt2x00dev, RT3352) ||
@@ -170,7 +170,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 104, 0x92);
-@@ -3654,13 +3683,15 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4187,13 +4216,15 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 105, 0x1c);
  	else if (rt2x00_rt(rt2x00dev, RT3352))
  		rt2800_bbp_write(rt2x00dev, 105, 0x34);
@@ -187,7 +187,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390))
  		rt2800_bbp_write(rt2x00dev, 106, 0x03);
  	else if (rt2x00_rt(rt2x00dev, RT3352))
-@@ -3670,11 +3701,13 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4203,11 +4234,13 @@ static int rt2800_init_bbp(struct rt2x00
  	else
  		rt2800_bbp_write(rt2x00dev, 106, 0x35);
  
@@ -202,7 +202,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_bbp_write(rt2x00dev, 128, 0x12);
-@@ -3684,13 +3717,15 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4217,13 +4250,15 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 135, 0xf6);
  	}
  
@@ -219,7 +219,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392)) {
  		rt2800_bbp_read(rt2x00dev, 138, &value);
-@@ -3727,7 +3762,8 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4260,7 +4295,8 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 3, value);
  	}
  
@@ -229,7 +229,7 @@
  		rt2800_bbp_write(rt2x00dev, 163, 0xbd);
  		/* Set ITxBF timeout to 0x9c40=1000msec */
  		rt2800_bbp_write(rt2x00dev, 179, 0x02);
-@@ -3749,6 +3785,14 @@ static int rt2800_init_bbp(struct rt2x00
+@@ -4282,6 +4318,14 @@ static int rt2800_init_bbp(struct rt2x00
  		rt2800_bbp_write(rt2x00dev, 148, 0xc8);
  	}
  
@@ -244,7 +244,7 @@
  	if (rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392)) {
  		int ant, div_mode;
-@@ -4143,6 +4187,76 @@ static void rt2800_init_rfcsr_3572(struc
+@@ -4674,6 +4718,76 @@ static void rt2800_init_rfcsr_3572(struc
  	rt2800_rfcsr_write(rt2x00dev, 31, 0x10);
  }
  
@@ -321,15 +321,15 @@
  static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
  {
  	rt2800_rfcsr_write(rt2x00dev, 1, 0x0f);
-@@ -4305,6 +4419,7 @@ static int rt2800_init_rfcsr(struct rt2x
+@@ -4899,6 +5013,7 @@ static int rt2800_init_rfcsr(struct rt2x
  	    !rt2x00_rt(rt2x00dev, RT3352) &&
  	    !rt2x00_rt(rt2x00dev, RT3390) &&
  	    !rt2x00_rt(rt2x00dev, RT3572) &&
 +	    !rt2x00_rt(rt2x00dev, RT5350) &&
  	    !rt2x00_rt(rt2x00dev, RT5390) &&
  	    !rt2x00_rt(rt2x00dev, RT5392) &&
- 	    !rt2800_is_305x_soc(rt2x00dev))
-@@ -4355,6 +4470,9 @@ static int rt2800_init_rfcsr(struct rt2x
+ 	    !rt2x00_rt(rt2x00dev, RT5392) &&
+@@ -4951,6 +5066,9 @@ static int rt2800_init_rfcsr(struct rt2x
  	case RT3572:
  		rt2800_init_rfcsr_3572(rt2x00dev);
  		break;
@@ -339,7 +339,7 @@
  	case RT5390:
  		rt2800_init_rfcsr_5390(rt2x00dev);
  		break;
-@@ -4751,6 +4869,12 @@ static int rt2800_validate_eeprom(struct
+@@ -5361,6 +5479,12 @@ static int rt2800_validate_eeprom(struct
  		if (rt2x00_get_field16(word, EEPROM_NIC_CONF0_RXPATH) > 2)
  			rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2);
  		rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
@@ -352,24 +352,16 @@
  	}
  
  	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &word);
-@@ -4875,6 +4999,8 @@ static int rt2800_init_eeprom(struct rt2
- 	    rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
- 	    rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
- 		rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
-+	else if(rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5350)
-+		value = RF5350;
+@@ -5480,6 +5604,8 @@ static int rt2800_init_eeprom(struct rt2
+ 	    rt2x00_rt(rt2x00dev, RT5390) ||
+ 	    rt2x00_rt(rt2x00dev, RT5392))
+ 		rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
++	else if (rt2x00_rt(rt2x00dev, RT5350))
++		rf = RF5350;
  	else
- 		value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
+ 		rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
  
-@@ -4892,6 +5018,7 @@ static int rt2800_init_eeprom(struct rt2
- 	case RT3352:
- 	case RT3390:
- 	case RT3572:
-+	case RT5350:
- 	case RT5390:
- 	case RT5392:
- 		break;
-@@ -4913,6 +5040,7 @@ static int rt2800_init_eeprom(struct rt2
+@@ -5496,6 +5622,7 @@ static int rt2800_init_eeprom(struct rt2
  	case RF3290:
  	case RF3320:
  	case RF3322:
@@ -377,7 +369,7 @@
  	case RF5360:
  	case RF5370:
  	case RF5372:
-@@ -5275,7 +5403,8 @@ static int rt2800_probe_hw_mode(struct r
+@@ -5993,7 +6120,8 @@ static int rt2800_probe_hw_mode(struct r
  		   rt2x00_rf(rt2x00dev, RF5392)) {
  		spec->num_channels = 14;
  		spec->channels = rf_vals_3x;
@@ -387,14 +379,22 @@
  		spec->num_channels = 14;
  		if (spec->clk_is_20mhz)
  			spec->channels = rf_vals_xtal20mhz_3x;
-@@ -5364,6 +5493,7 @@ static int rt2800_probe_hw_mode(struct r
+@@ -6094,6 +6222,7 @@ static int rt2800_probe_hw_mode(struct r
+ 	case RF3320:
+ 	case RF3052:
  	case RF3290:
++	case RF5350:
  	case RF5360:
  	case RF5370:
-+	case RF5350:
  	case RF5372:
- 	case RF5390:
- 	case RF5392:
+@@ -6131,6 +6260,7 @@ static int rt2800_probe_rt(struct rt2x00
+ 	case RT3352:
+ 	case RT3390:
+ 	case RT3572:
++	case RT5350:
+ 	case RT5390:
+ 	case RT5392:
+ 	case RT5592:
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
 @@ -192,6 +192,7 @@ struct rt2x00_chip {
@@ -404,4 +404,4 @@
 +#define RT5350		0x5350  /* WSOC 2.4GHz */
  #define RT5390		0x5390  /* 2.4GHz */
  #define RT5392		0x5392  /* 2.4GHz */
- 
+ #define RT5592		0x5592

+ 1 - 1
package/mac80211/patches/617-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch

@@ -12,7 +12,7 @@ Signed-off-by: John Crispin <[email protected]>
 
 --- a/drivers/net/wireless/rt2x00/Kconfig
 +++ b/drivers/net/wireless/rt2x00/Kconfig
-@@ -64,6 +64,7 @@ config RT2800PCI
+@@ -68,6 +68,7 @@ config RT2800PCI
  	select RT2X00_LIB_CRYPTO
  	select CRC_CCITT
  	select EEPROM_93CX6

+ 1 - 1
package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/mwl8k.c
 +++ b/drivers/net/wireless/mwl8k.c
-@@ -5497,6 +5497,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
+@@ -5525,6 +5525,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
  MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
  
  static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {

+ 0 - 70
package/mac80211/patches/701-mwl8k-don-t-overwrite-regulatory-settings.patch

@@ -1,70 +0,0 @@
-From f340b99171e923eb6b54c1d0c22c15b45df40647 Mon Sep 17 00:00:00 2001
-From: Jonas Gorski <[email protected]>
-Date: Mon, 11 Mar 2013 17:17:28 +0100
-Subject: [PATCH] mwl8k: don't overwrite regulatory settings
-
-Currently the caps are parsed on every firmware reload, causing any
-channel flags to be cleared.
-When there is a firmware to interface mode mismatch, the triggered
-firmware reload causes a reset of the regulatory settings, causing all
-channels to become available:
-
-root@openrouter:/# iw phy phy0 info
-Wiphy phy0
-        Band 1:
-		(...)
-                Frequencies:
-                        * 2412 MHz [1] (0.0 dBm)
-                        * 2417 MHz [2] (0.0 dBm)
-                        * 2422 MHz [3] (0.0 dBm)
-                        * 2427 MHz [4] (0.0 dBm)
-                        * 2432 MHz [5] (0.0 dBm)
-                        * 2437 MHz [6] (0.0 dBm)
-                        * 2442 MHz [7] (0.0 dBm)
-                        * 2447 MHz [8] (0.0 dBm)
-                        * 2452 MHz [9] (0.0 dBm)
-                        * 2457 MHz [10] (0.0 dBm)
-                        * 2462 MHz [11] (0.0 dBm)
-                        * 2467 MHz [12] (0.0 dBm)
-                        * 2472 MHz [13] (0.0 dBm)
-                        * 2484 MHz [14] (0.0 dBm)
-		(...)
-
-To prevent this, only parse the caps on the first firmware load during
-hardware probe, and store them locally to know we have already parsed
-them.
-
-Signed-off-by: Jonas Gorski <[email protected]>
----
- drivers/net/wireless/mwl8k.c |    6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/drivers/net/wireless/mwl8k.c
-+++ b/drivers/net/wireless/mwl8k.c
-@@ -232,6 +232,7 @@ struct mwl8k_priv {
- 	u16 num_mcaddrs;
- 	u8 hw_rev;
- 	u32 fw_rev;
-+	u32 caps;
- 
- 	/*
- 	 * Running count of TX packets in flight, to avoid
-@@ -2401,6 +2402,9 @@ mwl8k_set_caps(struct ieee80211_hw *hw, 
- {
- 	struct mwl8k_priv *priv = hw->priv;
- 
-+	if (priv->caps)
-+		return;
-+
- 	if ((caps & MWL8K_CAP_2GHZ4) || !(caps & MWL8K_CAP_BAND_MASK)) {
- 		mwl8k_setup_2ghz_band(hw);
- 		if (caps & MWL8K_CAP_MIMO)
-@@ -2412,6 +2416,8 @@ mwl8k_set_caps(struct ieee80211_hw *hw, 
- 		if (caps & MWL8K_CAP_MIMO)
- 			mwl8k_set_ht_caps(hw, &priv->band_50, caps);
- 	}
-+
-+	priv->caps = caps;
- }
- 
- static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw)

+ 0 - 44
package/mac80211/patches/702-mwl8k-always-apply-configuration-even-when-device-is.patch

@@ -1,44 +0,0 @@
-From 5d1ed64614ccb21c26bc0ee321e9c51b6359ceb8 Mon Sep 17 00:00:00 2001
-From: Jonas Gorski <[email protected]>
-Date: Mon, 25 Mar 2013 15:37:42 +0100
-Subject: [PATCH] mwl8k: always apply configuration even when device is idle
-
-Fix settings not being applied when the device is idle and the firmware
-gets reloaded (because of changing from STA to AP mode). This caused
-the device using the wrong channel (and likely band), e.g. a 5 GHz only
-card still defaulted to channel 6 in the 2.4 GHz band when left
-unconfigured.
-
-This issue was always present, but only made visible with "mwl8k: Do not
-call mwl8k_cmd_set_rf_channel unconditionally" (0f4316b9), since before
-that the channel was (re-)configured at the next _config call even when
-it did not change from the mac80211 perspective.
-
-Signed-off-by: Jonas Gorski <[email protected]>
----
- drivers/net/wireless/mwl8k.c |   10 ++++------
- 1 file changed, 4 insertions(+), 6 deletions(-)
-
---- a/drivers/net/wireless/mwl8k.c
-+++ b/drivers/net/wireless/mwl8k.c
-@@ -4818,16 +4818,14 @@ static int mwl8k_config(struct ieee80211
- 	struct mwl8k_priv *priv = hw->priv;
- 	int rc;
- 
--	if (conf->flags & IEEE80211_CONF_IDLE) {
--		mwl8k_cmd_radio_disable(hw);
--		return 0;
--	}
--
- 	rc = mwl8k_fw_lock(hw);
- 	if (rc)
- 		return rc;
- 
--	rc = mwl8k_cmd_radio_enable(hw);
-+	if (conf->flags & IEEE80211_CONF_IDLE)
-+		rc = mwl8k_cmd_radio_disable(hw);
-+	else
-+		rc = mwl8k_cmd_radio_enable(hw);
- 	if (rc)
- 		goto out;
- 

+ 2 - 2
package/mac80211/patches/800-b43-gpio-mask-module-option.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/b43/b43.h
 +++ b/drivers/net/wireless/b43/b43.h
-@@ -812,6 +812,7 @@ struct b43_wldev {
+@@ -820,6 +820,7 @@ struct b43_wldev {
  	bool qos_enabled;		/* TRUE, if QoS is used. */
  	bool hwcrypto_enabled;		/* TRUE, if HW crypto acceleration is enabled. */
  	bool use_pio;			/* TRUE if next init should use PIO */
@@ -22,7 +22,7 @@
  static int modparam_bad_frames_preempt;
  module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
  MODULE_PARM_DESC(bad_frames_preempt,
-@@ -2740,10 +2745,10 @@ static int b43_gpio_init(struct b43_wlde
+@@ -2747,10 +2752,10 @@ static int b43_gpio_init(struct b43_wlde
  	u32 mask, set;
  
  	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);

+ 1 - 1
package/mac80211/patches/810-b43_no_pio.patch

@@ -11,7 +11,7 @@
  b43-$(CONFIG_B43_PCMCIA)	+= pcmcia.o
 --- a/drivers/net/wireless/b43/main.c
 +++ b/drivers/net/wireless/b43/main.c
-@@ -1909,10 +1909,12 @@ static void b43_do_interrupt_thread(stru
+@@ -1916,10 +1916,12 @@ static void b43_do_interrupt_thread(stru
  			       dma_reason[0], dma_reason[1],
  			       dma_reason[2], dma_reason[3],
  			       dma_reason[4], dma_reason[5]);

+ 9 - 9
package/mac80211/patches/820-b43-add-antenna-control.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/b43/main.c
 +++ b/drivers/net/wireless/b43/main.c
-@@ -1553,7 +1553,7 @@ static void b43_write_beacon_template(st
+@@ -1560,7 +1560,7 @@ static void b43_write_beacon_template(st
  				  len, ram_offset, shm_size_offset, rate);
  
  	/* Write the PHY TX control parameters. */
@@ -9,7 +9,7 @@
  	antenna = b43_antenna_to_phyctl(antenna);
  	ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
  	/* We can't send beacons with short preamble. Would get PHY errors. */
-@@ -3101,8 +3101,8 @@ static int b43_chip_init(struct b43_wlde
+@@ -3105,8 +3105,8 @@ static int b43_chip_init(struct b43_wlde
  
  	/* Select the antennae */
  	if (phy->ops->set_rx_antenna)
@@ -20,7 +20,7 @@
  
  	if (phy->type == B43_PHYTYPE_B) {
  		value16 = b43_read16(dev, 0x005E);
-@@ -3846,7 +3846,6 @@ static int b43_op_config(struct ieee8021
+@@ -3850,7 +3850,6 @@ static int b43_op_config(struct ieee8021
  	struct b43_wldev *dev;
  	struct b43_phy *phy;
  	struct ieee80211_conf *conf = &hw->conf;
@@ -28,7 +28,7 @@
  	int err = 0;
  	bool reload_bss = false;
  
-@@ -3900,11 +3899,9 @@ static int b43_op_config(struct ieee8021
+@@ -3904,11 +3903,9 @@ static int b43_op_config(struct ieee8021
  	}
  
  	/* Antennas for RX and management frame TX. */
@@ -42,7 +42,7 @@
  
  	if (wl->radio_enabled != phy->radio_on) {
  		if (wl->radio_enabled) {
-@@ -5030,6 +5027,47 @@ static int b43_op_get_survey(struct ieee
+@@ -5033,6 +5030,47 @@ static int b43_op_get_survey(struct ieee
  	return 0;
  }
  
@@ -90,7 +90,7 @@
  static const struct ieee80211_ops b43_hw_ops = {
  	.tx			= b43_op_tx,
  	.conf_tx		= b43_op_conf_tx,
-@@ -5051,6 +5089,8 @@ static const struct ieee80211_ops b43_hw
+@@ -5054,6 +5092,8 @@ static const struct ieee80211_ops b43_hw
  	.sw_scan_complete	= b43_op_sw_scan_complete_notifier,
  	.get_survey		= b43_op_get_survey,
  	.rfkill_poll		= b43_rfkill_poll,
@@ -99,7 +99,7 @@
  };
  
  /* Hard-reset the chip. Do not call this directly.
-@@ -5297,6 +5337,8 @@ static int b43_one_core_attach(struct b4
+@@ -5300,6 +5340,8 @@ static int b43_one_core_attach(struct b4
  	if (!wldev)
  		goto out;
  
@@ -108,7 +108,7 @@
  	wldev->use_pio = b43_modparam_pio;
  	wldev->dev = dev;
  	wldev->wl = wl;
-@@ -5387,6 +5429,9 @@ static struct b43_wl *b43_wireless_init(
+@@ -5390,6 +5432,9 @@ static struct b43_wl *b43_wireless_init(
  
  	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
  
@@ -120,7 +120,7 @@
  	SET_IEEE80211_DEV(hw, dev->dev);
 --- a/drivers/net/wireless/b43/b43.h
 +++ b/drivers/net/wireless/b43/b43.h
-@@ -813,6 +813,8 @@ struct b43_wldev {
+@@ -821,6 +821,8 @@ struct b43_wldev {
  	bool hwcrypto_enabled;		/* TRUE, if HW crypto acceleration is enabled. */
  	bool use_pio;			/* TRUE if next init should use PIO */
  	int gpiomask;			/* GPIO LED mask as a module parameter */

+ 5 - 5
package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch

@@ -19,7 +19,7 @@ Signed-off-by: Hauke Mehrtens <[email protected]>
 
 --- a/drivers/net/wireless/b43/b43.h
 +++ b/drivers/net/wireless/b43/b43.h
-@@ -1053,6 +1053,32 @@ static inline bool b43_using_pio_transfe
+@@ -1061,6 +1061,32 @@ static inline bool b43_using_pio_transfe
  	return dev->__using_pio_transfers;
  }
  
@@ -88,7 +88,7 @@ Signed-off-by: Hauke Mehrtens <[email protected]>
  		dev->phy.writes_counter = 0;
 --- a/drivers/net/wireless/b43/phy_n.c
 +++ b/drivers/net/wireless/b43/phy_n.c
-@@ -5423,14 +5423,14 @@ static inline void check_phyreg(struct b
+@@ -5368,14 +5368,14 @@ static inline void check_phyreg(struct b
  static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg)
  {
  	check_phyreg(dev, reg);
@@ -105,7 +105,7 @@ Signed-off-by: Hauke Mehrtens <[email protected]>
  	b43_write16(dev, B43_MMIO_PHY_DATA, value);
  }
  
-@@ -5438,7 +5438,7 @@ static void b43_nphy_op_maskset(struct b
+@@ -5383,7 +5383,7 @@ static void b43_nphy_op_maskset(struct b
  				 u16 set)
  {
  	check_phyreg(dev, reg);
@@ -114,7 +114,7 @@ Signed-off-by: Hauke Mehrtens <[email protected]>
  	b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
  }
  
-@@ -5449,7 +5449,7 @@ static u16 b43_nphy_op_radio_read(struct
+@@ -5394,7 +5394,7 @@ static u16 b43_nphy_op_radio_read(struct
  	/* N-PHY needs 0x100 for read access */
  	reg |= 0x100;
  
@@ -123,7 +123,7 @@ Signed-off-by: Hauke Mehrtens <[email protected]>
  	return b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
  }
  
-@@ -5458,7 +5458,7 @@ static void b43_nphy_op_radio_write(stru
+@@ -5403,7 +5403,7 @@ static void b43_nphy_op_radio_write(stru
  	/* Register 1 is a 32-bit register. */
  	B43_WARN_ON(reg == 1);
  

+ 0 - 11
package/mac80211/patches/840-b43-increase_number_of_rx_dma_slots.patch

@@ -1,11 +0,0 @@
---- a/drivers/net/wireless/b43/dma.h
-+++ b/drivers/net/wireless/b43/dma.h
-@@ -169,7 +169,7 @@ struct b43_dmadesc_generic {
- 
- /* DMA engine tuning knobs */
- #define B43_TXRING_SLOTS		256
--#define B43_RXRING_SLOTS		64
-+#define B43_RXRING_SLOTS		256
- #define B43_DMA0_RX_FW598_BUFSIZE	(B43_DMA0_RX_FW598_FO + IEEE80211_MAX_FRAME_LEN)
- #define B43_DMA0_RX_FW351_BUFSIZE	(B43_DMA0_RX_FW351_FO + IEEE80211_MAX_FRAME_LEN)
- 

+ 5 - 5
package/mac80211/patches/850-brcmsmac-start-adding-support-for-core-rev-28.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -99,6 +99,7 @@ static struct bcma_device_id brcms_corei
+@@ -101,6 +101,7 @@ static struct bcma_device_id brcms_corei
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 17, BCMA_ANY_CLASS),
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS),
  	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS),
@@ -10,7 +10,7 @@
  MODULE_DEVICE_TABLE(bcma, brcms_coreid_table);
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -717,7 +717,7 @@ static void brcms_c_ucode_bsinit(struct 
+@@ -722,7 +722,7 @@ static void brcms_c_ucode_bsinit(struct 
  	brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs);
  
  	/* do band-specific ucode IHR, SHM, and SCR inits */
@@ -19,7 +19,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band))
  			brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
  		else
-@@ -2257,7 +2257,7 @@ static void brcms_ucode_download(struct 
+@@ -2288,7 +2288,7 @@ static void brcms_ucode_download(struct 
  	if (wlc_hw->ucode_loaded)
  		return;
  
@@ -28,7 +28,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band)) {
  			brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
  					  ucode->bcm43xx_16_mimosz);
-@@ -3207,7 +3207,7 @@ static void brcms_b_coreinit(struct brcm
+@@ -3231,7 +3231,7 @@ static void brcms_b_coreinit(struct brcm
  
  	sflags = bcma_aread32(core, BCMA_IOST);
  
@@ -37,7 +37,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band))
  			brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
  		else
-@@ -5663,6 +5663,8 @@ static bool brcms_c_chipmatch_soc(struct
+@@ -5723,6 +5723,8 @@ static bool brcms_c_chipmatch_soc(struct
  
  	if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
  		return true;

+ 0 - 0
package/mac80211/patches/875-brcmsmac-remove-extra-regulation-restriction.patch → package/mac80211/patches/851-brcmsmac-remove-extra-regulation-restriction.patch


+ 0 - 121
package/mac80211/patches/860-brcmsmac-implement-ieee80211_ops-get_tsf-and-set_tsf.patch

@@ -1,121 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/d11.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/d11.h
-@@ -457,6 +457,7 @@ struct d11regs {
- /*== maccontrol register ==*/
- #define	MCTL_GMODE		(1U << 31)
- #define	MCTL_DISCARD_PMQ	(1 << 30)
-+#define	MCTL_TBTTHOLD		(1 << 28)
- #define	MCTL_WAKE		(1 << 26)
- #define	MCTL_HPS		(1 << 25)
- #define	MCTL_PROMISC		(1 << 24)
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -741,6 +741,28 @@ static void brcms_ops_flush(struct ieee8
- 			   "ret=%d\n", jiffies_to_msecs(ret));
- }
- 
-+static u64 brcms_ops_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
-+{
-+	struct brcms_info *wl = hw->priv;
-+	u64 tsf;
-+
-+	spin_lock_bh(&wl->lock);
-+	tsf = brcms_c_tsf_get(wl->wlc);
-+	spin_unlock_bh(&wl->lock);
-+
-+	return tsf;
-+}
-+
-+static void brcms_ops_set_tsf(struct ieee80211_hw *hw,
-+			   struct ieee80211_vif *vif, u64 tsf)
-+{
-+	struct brcms_info *wl = hw->priv;
-+
-+	spin_lock_bh(&wl->lock);
-+	brcms_c_tsf_set(wl->wlc, tsf);
-+	spin_unlock_bh(&wl->lock);
-+}
-+
- static const struct ieee80211_ops brcms_ops = {
- 	.tx = brcms_ops_tx,
- 	.start = brcms_ops_start,
-@@ -757,6 +779,8 @@ static const struct ieee80211_ops brcms_
- 	.ampdu_action = brcms_ops_ampdu_action,
- 	.rfkill_poll = brcms_ops_rfkill_poll,
- 	.flush = brcms_ops_flush,
-+	.get_tsf = brcms_ops_get_tsf,
-+	.set_tsf = brcms_ops_set_tsf,
- };
- 
- void brcms_dpc(unsigned long data)
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -5545,6 +5545,20 @@ int brcms_c_set_rateset(struct brcms_c_i
- 	return bcmerror;
- }
- 
-+static void brcms_c_time_lock(struct brcms_c_info *wlc)
-+{
-+	bcma_set32(wlc->hw->d11core, D11REGOFFS(maccontrol), MCTL_TBTTHOLD);
-+	/* Commit the write */
-+	bcma_read32(wlc->hw->d11core, D11REGOFFS(maccontrol));
-+}
-+
-+static void brcms_c_time_unlock(struct brcms_c_info *wlc)
-+{
-+	bcma_mask32(wlc->hw->d11core, D11REGOFFS(maccontrol), ~MCTL_TBTTHOLD);
-+	/* Commit the write */
-+	bcma_read32(wlc->hw->d11core, D11REGOFFS(maccontrol));
-+}
-+
- int brcms_c_set_beacon_period(struct brcms_c_info *wlc, u16 period)
- {
- 	if (period == 0)
-@@ -7530,6 +7544,36 @@ void brcms_c_set_beacon_listen_interval(
- 		brcms_c_bcn_li_upd(wlc);
- }
- 
-+u64 brcms_c_tsf_get(struct brcms_c_info *wlc)
-+{
-+	u32 tsf_h, tsf_l;
-+	u64 tsf;
-+
-+	brcms_b_read_tsf(wlc->hw, &tsf_l, &tsf_h);
-+
-+	tsf = tsf_h;
-+	tsf <<= 32;
-+	tsf |= tsf_l;
-+
-+	return tsf;
-+}
-+
-+void brcms_c_tsf_set(struct brcms_c_info *wlc, u64 tsf)
-+{
-+	u32 tsf_h, tsf_l;
-+
-+	brcms_c_time_lock(wlc);
-+
-+	tsf_l = tsf;
-+	tsf_h = (tsf >> 32);
-+
-+	/* read the tsf timer low, then high to get an atomic read */
-+	bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_timerlow), tsf_l);
-+	bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_timerhigh), tsf_h);
-+
-+	brcms_c_time_unlock(wlc);
-+}
-+
- int brcms_c_set_tx_power(struct brcms_c_info *wlc, int txpwr)
- {
- 	uint qdbm;
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -326,6 +326,8 @@ extern void brcms_c_set_shortslot_overri
- 				    s8 sslot_override);
- extern void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc,
- 					u8 interval);
-+extern u64 brcms_c_tsf_get(struct brcms_c_info *wlc);
-+extern void brcms_c_tsf_set(struct brcms_c_info *wlc, u64 tsf);
- extern int brcms_c_set_tx_power(struct brcms_c_info *wlc, int txpwr);
- extern int brcms_c_get_tx_power(struct brcms_c_info *wlc);
- extern bool brcms_c_check_radio_disabled(struct brcms_c_info *wlc);

+ 0 - 66
package/mac80211/patches/861-brcmsmac-add-interface-type-to-brcms_bss_cfg.patch

@@ -1,66 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -367,9 +367,10 @@ brcms_ops_add_interface(struct ieee80211
- 	}
- 
- 	spin_lock_bh(&wl->lock);
--	memcpy(wl->pub->cur_etheraddr, vif->addr, sizeof(vif->addr));
- 	wl->mute_tx = false;
- 	brcms_c_mute(wl->wlc, false);
-+	if (vif->type == NL80211_IFTYPE_STATION)
-+		brcms_c_start_station(wl->wlc, vif->addr);
- 	spin_unlock_bh(&wl->lock);
- 
- 	return 0;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -2165,6 +2165,12 @@ void brcms_b_switch_macfreq(struct brcms
- 	}
- }
- 
-+void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr)
-+{
-+	memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
-+	wlc->bsscfg->type = BRCMS_TYPE_STATION;
-+}
-+
- /* Initialize GPIOs that are controlled by D11 core */
- static void brcms_c_gpio_init(struct brcms_c_info *wlc)
- {
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -576,10 +576,17 @@ struct antsel_info {
- 	struct brcms_antselcfg antcfg_cur; /* current antenna config (auto) */
- };
- 
-+enum brcms_bss_type {
-+	BRCMS_TYPE_STATION,
-+	BRCMS_TYPE_AP,
-+	BRCMS_TYPE_ADHOC,
-+};
-+
- /*
-  * BSS configuration state
-  *
-  * wlc: wlc to which this bsscfg belongs to.
-+ * type: interface type
-  * up: is this configuration up operational
-  * enable: is this configuration enabled
-  * associated: is BSS in ASSOCIATED state
-@@ -599,6 +606,7 @@ struct antsel_info {
-  */
- struct brcms_bss_cfg {
- 	struct brcms_c_info *wlc;
-+	enum brcms_bss_type type;
- 	bool up;
- 	bool enable;
- 	bool associated;
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -333,5 +333,6 @@ extern int brcms_c_get_tx_power(struct b
- extern bool brcms_c_check_radio_disabled(struct brcms_c_info *wlc);
- extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
- extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
-+extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
- 
- #endif				/* _BRCM_PUB_H_ */

+ 0 - 79
package/mac80211/patches/862-brcmsmac-remove-brcms_bss_cfg-BSS.patch

@@ -1,79 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -1071,7 +1071,7 @@ brcms_b_txstatus(struct brcms_hardware *
- 
- static void brcms_c_tbtt(struct brcms_c_info *wlc)
- {
--	if (!wlc->bsscfg->BSS)
-+	if (wlc->bsscfg->type == BRCMS_TYPE_ADHOC)
- 		/*
- 		 * DirFrmQ is now valid...defer setting until end
- 		 * of ATIM window
-@@ -3061,16 +3061,8 @@ static bool brcms_c_ps_allowed(struct br
- 	if (wlc->filter_flags & FIF_PROMISC_IN_BSS)
- 		return false;
- 
--	if (cfg->associated) {
--		/*
--		 * disallow PS when one of the following
--		 * bsscfg specific conditions meets
--		 */
--		if (!cfg->BSS)
--			return false;
--
-+	if (cfg->associated)
- 		return false;
--	}
- 
- 	return true;
- }
-@@ -5080,8 +5072,9 @@ int brcms_c_up(struct brcms_c_info *wlc)
- 				struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- 				mboolset(wlc->pub->radio_disabled,
- 					 WL_RADIO_HW_DISABLE);
--
--				if (bsscfg->enable && bsscfg->BSS)
-+				if (bsscfg->enable &&
-+				    (bsscfg->type == BRCMS_TYPE_STATION ||
-+				     bsscfg->type == BRCMS_TYPE_ADHOC))
- 					brcms_err(wlc->hw->d11core,
- 						  "wl%d: up: rfdisable -> "
- 						  "bsscfg_disable()\n",
-@@ -7390,7 +7383,8 @@ void brcms_c_update_beacon(struct brcms_
- {
- 	struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- 
--	if (bsscfg->up && !bsscfg->BSS)
-+	if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
-+			   bsscfg->type == BRCMS_TYPE_ADHOC))
- 		/* Clear the soft intmask */
- 		wlc->defmacintmask &= ~MI_BCNTPL;
- }
-@@ -7465,7 +7459,8 @@ void brcms_c_update_probe_resp(struct br
- 	struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- 
- 	/* update AP or IBSS probe responses */
--	if (bsscfg->up && !bsscfg->BSS)
-+	if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
-+			   bsscfg->type == BRCMS_TYPE_ADHOC))
- 		brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -590,7 +590,6 @@ enum brcms_bss_type {
-  * up: is this configuration up operational
-  * enable: is this configuration enabled
-  * associated: is BSS in ASSOCIATED state
-- * BSS: infraustructure or adhoc
-  * SSID_len: the length of SSID
-  * SSID: SSID string
-  *
-@@ -610,7 +609,6 @@ struct brcms_bss_cfg {
- 	bool up;
- 	bool enable;
- 	bool associated;
--	bool BSS;
- 	u8 SSID_len;
- 	u8 SSID[IEEE80211_MAX_SSID_LEN];
- 	u8 BSSID[ETH_ALEN];

+ 0 - 74
package/mac80211/patches/863-brcmsmac-remove-brcms_bss_cfg-associated.patch

@@ -1,74 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -3051,8 +3051,6 @@ static void brcms_b_antsel_set(struct br
-  */
- static bool brcms_c_ps_allowed(struct brcms_c_info *wlc)
- {
--	struct brcms_bss_cfg *cfg = wlc->bsscfg;
--
- 	/* disallow PS when one of the following global conditions meets */
- 	if (!wlc->pub->associated)
- 		return false;
-@@ -3061,9 +3059,6 @@ static bool brcms_c_ps_allowed(struct br
- 	if (wlc->filter_flags & FIF_PROMISC_IN_BSS)
- 		return false;
- 
--	if (cfg->associated)
--		return false;
--
- 	return true;
- }
- 
-@@ -3821,7 +3816,7 @@ static void brcms_c_set_home_chanspec(st
- 	if (wlc->home_chanspec != chanspec) {
- 		wlc->home_chanspec = chanspec;
- 
--		if (wlc->bsscfg->associated)
-+		if (wlc->pub->associated)
- 			wlc->bsscfg->current_bss->chanspec = chanspec;
- 	}
- }
-@@ -5435,7 +5430,7 @@ static void brcms_c_ofdm_rateset_war(str
- 	u8 r;
- 	bool war = false;
- 
--	if (wlc->bsscfg->associated)
-+	if (wlc->pub->associated)
- 		r = wlc->bsscfg->current_bss->rateset.rates[0];
- 	else
- 		r = wlc->default_bss->rateset.rates[0];
-@@ -5529,7 +5524,7 @@ int brcms_c_set_rateset(struct brcms_c_i
- 	/* merge rateset coming in with the current mcsset */
- 	if (wlc->pub->_n_enab & SUPPORT_11N) {
- 		struct brcms_bss_info *mcsset_bss;
--		if (wlc->bsscfg->associated)
-+		if (wlc->pub->associated)
- 			mcsset_bss = wlc->bsscfg->current_bss;
- 		else
- 			mcsset_bss = wlc->default_bss;
-@@ -7500,7 +7495,6 @@ void brcms_c_scan_stop(struct brcms_c_in
- void brcms_c_associate_upd(struct brcms_c_info *wlc, bool state)
- {
- 	wlc->pub->associated = state;
--	wlc->bsscfg->associated = state;
- }
- 
- /*
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -589,7 +589,6 @@ enum brcms_bss_type {
-  * type: interface type
-  * up: is this configuration up operational
-  * enable: is this configuration enabled
-- * associated: is BSS in ASSOCIATED state
-  * SSID_len: the length of SSID
-  * SSID: SSID string
-  *
-@@ -608,7 +607,6 @@ struct brcms_bss_cfg {
- 	enum brcms_bss_type type;
- 	bool up;
- 	bool enable;
--	bool associated;
- 	u8 SSID_len;
- 	u8 SSID[IEEE80211_MAX_SSID_LEN];
- 	u8 BSSID[ETH_ALEN];

+ 0 - 32
package/mac80211/patches/864-brcmsmac-remove-brcms_bss_cfg-enable.patch

@@ -1,32 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -5067,9 +5067,8 @@ int brcms_c_up(struct brcms_c_info *wlc)
- 				struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- 				mboolset(wlc->pub->radio_disabled,
- 					 WL_RADIO_HW_DISABLE);
--				if (bsscfg->enable &&
--				    (bsscfg->type == BRCMS_TYPE_STATION ||
--				     bsscfg->type == BRCMS_TYPE_ADHOC))
-+				if (bsscfg->type == BRCMS_TYPE_STATION ||
-+				    bsscfg->type == BRCMS_TYPE_ADHOC)
- 					brcms_err(wlc->hw->d11core,
- 						  "wl%d: up: rfdisable -> "
- 						  "bsscfg_disable()\n",
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -588,7 +588,6 @@ enum brcms_bss_type {
-  * wlc: wlc to which this bsscfg belongs to.
-  * type: interface type
-  * up: is this configuration up operational
-- * enable: is this configuration enabled
-  * SSID_len: the length of SSID
-  * SSID: SSID string
-  *
-@@ -606,7 +605,6 @@ struct brcms_bss_cfg {
- 	struct brcms_c_info *wlc;
- 	enum brcms_bss_type type;
- 	bool up;
--	bool enable;
- 	u8 SSID_len;
- 	u8 SSID[IEEE80211_MAX_SSID_LEN];
- 	u8 BSSID[ETH_ALEN];

+ 0 - 51
package/mac80211/patches/865-brcmsmac-remove-brcms_bss_cfg-up.patch

@@ -1,51 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -7377,8 +7377,8 @@ void brcms_c_update_beacon(struct brcms_
- {
- 	struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- 
--	if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
--			   bsscfg->type == BRCMS_TYPE_ADHOC))
-+	if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
-+			     bsscfg->type == BRCMS_TYPE_ADHOC))
- 		/* Clear the soft intmask */
- 		wlc->defmacintmask &= ~MI_BCNTPL;
- }
-@@ -7453,8 +7453,8 @@ void brcms_c_update_probe_resp(struct br
- 	struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- 
- 	/* update AP or IBSS probe responses */
--	if (bsscfg->up && (bsscfg->type == BRCMS_TYPE_AP ||
--			   bsscfg->type == BRCMS_TYPE_ADHOC))
-+	if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
-+			     bsscfg->type == BRCMS_TYPE_ADHOC))
- 		brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
- }
- 
-@@ -7807,7 +7807,7 @@ void brcms_c_init(struct brcms_c_info *w
- 	brcms_c_set_bssid(wlc->bsscfg);
- 
- 	/* Update tsf_cfprep if associated and up */
--	if (wlc->pub->associated && wlc->bsscfg->up) {
-+	if (wlc->pub->associated && wlc->pub->up) {
- 		u32 bi;
- 
- 		/* get beacon period and convert to uS */
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -587,7 +587,6 @@ enum brcms_bss_type {
-  *
-  * wlc: wlc to which this bsscfg belongs to.
-  * type: interface type
-- * up: is this configuration up operational
-  * SSID_len: the length of SSID
-  * SSID: SSID string
-  *
-@@ -604,7 +603,6 @@ enum brcms_bss_type {
- struct brcms_bss_cfg {
- 	struct brcms_c_info *wlc;
- 	enum brcms_bss_type type;
--	bool up;
- 	u8 SSID_len;
- 	u8 SSID[IEEE80211_MAX_SSID_LEN];
- 	u8 BSSID[ETH_ALEN];

+ 0 - 30
package/mac80211/patches/866-brcmsmac-remove-brcms_bss_cfg-cur_etheraddr.patch

@@ -1,30 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -3766,7 +3766,7 @@ static int brcms_c_set_mac(struct brcms_
- 	struct brcms_c_info *wlc = bsscfg->wlc;
- 
- 	/* enter the MAC addr into the RXE match registers */
--	brcms_c_set_addrmatch(wlc, RCM_MAC_OFFSET, bsscfg->cur_etheraddr);
-+	brcms_c_set_addrmatch(wlc, RCM_MAC_OFFSET, wlc->pub->cur_etheraddr);
- 
- 	brcms_c_ampdu_macaddr_upd(wlc);
- 
-@@ -7359,7 +7359,7 @@ brcms_c_bcn_prb_template(struct brcms_c_
- 	/* A1 filled in by MAC for prb resp, broadcast for bcn */
- 	if (type == IEEE80211_STYPE_BEACON)
- 		memcpy(&h->da, &ether_bcast, ETH_ALEN);
--	memcpy(&h->sa, &cfg->cur_etheraddr, ETH_ALEN);
-+	memcpy(&h->sa, &wlc->pub->cur_etheraddr, ETH_ALEN);
- 	memcpy(&h->bssid, &cfg->BSSID, ETH_ALEN);
- 
- 	/* SEQ filled in by MAC */
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -606,7 +606,6 @@ struct brcms_bss_cfg {
- 	u8 SSID_len;
- 	u8 SSID[IEEE80211_MAX_SSID_LEN];
- 	u8 BSSID[ETH_ALEN];
--	u8 cur_etheraddr[ETH_ALEN];
- 	struct brcms_bss_info *current_bss;
- };
- 

+ 0 - 21
package/mac80211/patches/867-brcmsmac-remove-brcms_pub-bcmerr.patch

@@ -1,21 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -4327,7 +4327,6 @@ static void brcms_c_info_init(struct brc
- 
- 	/* WME QoS mode is Auto by default */
- 	wlc->pub->_ampdu = AMPDU_AGG_HOST;
--	wlc->pub->bcmerror = 0;
- }
- 
- static uint brcms_c_attach_module(struct brcms_c_info *wlc)
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -164,8 +164,6 @@ struct brcms_pub {
- 
- 	u8 cur_etheraddr[ETH_ALEN];	/* our local ethernet address */
- 
--	int bcmerror;		/* last bcm error */
--
- 	u32 radio_disabled;	/* bit vector for radio disabled reasons */
- 
- 	u16 boardrev;	/* version # of particular board */

+ 0 - 23
package/mac80211/patches/868-brcmsmac-write-beacon-period-to-hardware.patch

@@ -1,23 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -5553,10 +5553,20 @@ static void brcms_c_time_unlock(struct b
- 
- int brcms_c_set_beacon_period(struct brcms_c_info *wlc, u16 period)
- {
-+	u32 bcnint_us;
-+
- 	if (period == 0)
- 		return -EINVAL;
- 
- 	wlc->default_bss->beacon_period = period;
-+
-+	bcnint_us = period << 10;
-+	brcms_c_time_lock(wlc);
-+	bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_cfprep),
-+		     (bcnint_us << CFPREP_CBI_SHIFT));
-+	bcma_write32(wlc->hw->d11core, D11REGOFFS(tsf_cfpstart), bcnint_us);
-+	brcms_c_time_unlock(wlc);
-+
- 	return 0;
- }
- 

+ 0 - 266
package/mac80211/patches/869-brcmsmac-add-beacon-template-support.patch

@@ -1,266 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -1,5 +1,6 @@
- /*
-  * Copyright (c) 2010 Broadcom Corporation
-+ * Copyright (c) 2013 Hauke Mehrtens <[email protected]>
-  *
-  * Permission to use, copy, modify, and/or distribute this software for any
-  * purpose with or without fee is hereby granted, provided that the above
-@@ -522,9 +523,17 @@ brcms_ops_bss_info_changed(struct ieee80
- 		brcms_c_set_addrmatch(wl->wlc, RCM_BSSID_OFFSET, info->bssid);
- 		spin_unlock_bh(&wl->lock);
- 	}
--	if (changed & BSS_CHANGED_BEACON)
-+	if (changed & BSS_CHANGED_BEACON) {
- 		/* Beacon data changed, retrieve new beacon (beaconing modes) */
--		brcms_err(core, "%s: beacon changed\n", __func__);
-+		struct sk_buff *beacon;
-+		u16 tim_offset = 0;
-+
-+		spin_lock_bh(&wl->lock);
-+		beacon = ieee80211_beacon_get_tim(hw, vif, &tim_offset, NULL);
-+		brcms_c_set_new_beacon(wl->wlc, beacon, tim_offset,
-+				       info->dtim_period);
-+		spin_unlock_bh(&wl->lock);
-+	}
- 
- 	if (changed & BSS_CHANGED_BEACON_ENABLED) {
- 		/* Beaconing should be enabled/disabled (beaconing modes) */
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -1,5 +1,6 @@
- /*
-  * Copyright (c) 2010 Broadcom Corporation
-+ * Copyright (c) 2013 Hauke Mehrtens <[email protected]>
-  *
-  * Permission to use, copy, modify, and/or distribute this software for any
-  * purpose with or without fee is hereby granted, provided that the above
-@@ -450,6 +451,8 @@ static void brcms_c_detach_mfree(struct 
- 	kfree(wlc->corestate);
- 	kfree(wlc->hw->bandstate[0]);
- 	kfree(wlc->hw);
-+	if (wlc->beacon)
-+		dev_kfree_skb_any(wlc->beacon);
- 
- 	/* free the wlc */
- 	kfree(wlc);
-@@ -4086,10 +4089,14 @@ void brcms_c_wme_setparams(struct brcms_
- 					  *shm_entry++);
- 	}
- 
--	if (suspend) {
-+	if (suspend)
- 		brcms_c_suspend_mac_and_wait(wlc);
-+
-+	brcms_c_update_beacon(wlc);
-+	brcms_c_update_probe_resp(wlc, false);
-+
-+	if (suspend)
- 		brcms_c_enable_mac(wlc);
--	}
- }
- 
- static void brcms_c_edcf_setparams(struct brcms_c_info *wlc, bool suspend)
-@@ -7379,6 +7386,107 @@ int brcms_c_get_header_len(void)
- 	return TXOFF;
- }
- 
-+static void brcms_c_beacon_write(struct brcms_c_info *wlc,
-+				 struct sk_buff *beacon, u16 tim_offset,
-+				 u16 dtim_period, bool bcn0, bool bcn1)
-+{
-+	size_t len;
-+	struct ieee80211_tx_info *tx_info;
-+	struct brcms_hardware *wlc_hw = wlc->hw;
-+	struct ieee80211_hw *ieee_hw = brcms_c_pub(wlc)->ieee_hw;
-+
-+	/* Get tx_info */
-+	tx_info = IEEE80211_SKB_CB(beacon);
-+
-+	len = min_t(size_t, beacon->len, BCN_TMPL_LEN);
-+	wlc->bcn_rspec = ieee80211_get_tx_rate(ieee_hw, tx_info)->hw_value;
-+
-+	brcms_c_compute_plcp(wlc, wlc->bcn_rspec,
-+			     len + FCS_LEN - D11_PHY_HDR_LEN, beacon->data);
-+
-+	/* "Regular" and 16 MBSS but not for 4 MBSS */
-+	/* Update the phytxctl for the beacon based on the rspec */
-+	brcms_c_beacon_phytxctl_txant_upd(wlc, wlc->bcn_rspec);
-+
-+	if (bcn0) {
-+		/* write the probe response into the template region */
-+		brcms_b_write_template_ram(wlc_hw, T_BCN0_TPL_BASE,
-+					    (len + 3) & ~3, beacon->data);
-+
-+		/* write beacon length to SCR */
-+		brcms_b_write_shm(wlc_hw, M_BCN0_FRM_BYTESZ, (u16) len);
-+	}
-+	if (bcn1) {
-+		/* write the probe response into the template region */
-+		brcms_b_write_template_ram(wlc_hw, T_BCN1_TPL_BASE,
-+					    (len + 3) & ~3, beacon->data);
-+
-+		/* write beacon length to SCR */
-+		brcms_b_write_shm(wlc_hw, M_BCN1_FRM_BYTESZ, (u16) len);
-+	}
-+
-+	if (tim_offset != 0) {
-+		brcms_b_write_shm(wlc_hw, M_TIMBPOS_INBEACON,
-+				  tim_offset + D11B_PHY_HDR_LEN);
-+		brcms_b_write_shm(wlc_hw, M_DOT11_DTIMPERIOD, dtim_period);
-+	} else {
-+		brcms_b_write_shm(wlc_hw, M_TIMBPOS_INBEACON,
-+				  len + D11B_PHY_HDR_LEN);
-+		brcms_b_write_shm(wlc_hw, M_DOT11_DTIMPERIOD, 0);
-+	}
-+}
-+
-+static void brcms_c_update_beacon_hw(struct brcms_c_info *wlc,
-+				     struct sk_buff *beacon, u16 tim_offset,
-+				     u16 dtim_period)
-+{
-+	struct brcms_hardware *wlc_hw = wlc->hw;
-+	struct bcma_device *core = wlc_hw->d11core;
-+
-+	/* Hardware beaconing for this config */
-+	u32 both_valid = MCMD_BCN0VLD | MCMD_BCN1VLD;
-+
-+	/* Check if both templates are in use, if so sched. an interrupt
-+	 *      that will call back into this routine
-+	 */
-+	if ((bcma_read32(core, D11REGOFFS(maccommand)) & both_valid) == both_valid)
-+		/* clear any previous status */
-+		bcma_write32(core, D11REGOFFS(macintstatus), MI_BCNTPL);
-+
-+	if (wlc->beacon_template_virgin) {
-+		wlc->beacon_template_virgin = false;
-+		brcms_c_beacon_write(wlc, beacon, tim_offset, dtim_period, true,
-+				     true);
-+		/* mark beacon0 valid */
-+		bcma_set32(core, D11REGOFFS(maccommand), MCMD_BCN0VLD);
-+		return;
-+	}
-+
-+	/* Check that after scheduling the interrupt both of the
-+	 *      templates are still busy. if not clear the int. & remask
-+	 */
-+	if ((bcma_read32(core, D11REGOFFS(maccommand)) & both_valid) == both_valid) {
-+		wlc->defmacintmask |= MI_BCNTPL;
-+		return;
-+	}
-+
-+	if (!(bcma_read32(core, D11REGOFFS(maccommand)) & MCMD_BCN0VLD)) {
-+		brcms_c_beacon_write(wlc, beacon, tim_offset, dtim_period, true,
-+				     false);
-+		/* mark beacon0 valid */
-+		bcma_set32(core, D11REGOFFS(maccommand), MCMD_BCN0VLD);
-+		return;
-+	}
-+	if (!(bcma_read32(core, D11REGOFFS(maccommand)) & MCMD_BCN1VLD)) {
-+		brcms_c_beacon_write(wlc, beacon, tim_offset, dtim_period,
-+				     false, true);
-+		/* mark beacon0 valid */
-+		bcma_set32(core, D11REGOFFS(maccommand), MCMD_BCN1VLD);
-+		return;
-+	}
-+	return;
-+}
-+
- /*
-  * Update all beacons for the system.
-  */
-@@ -7387,9 +7495,31 @@ void brcms_c_update_beacon(struct brcms_
- 	struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- 
- 	if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
--			     bsscfg->type == BRCMS_TYPE_ADHOC))
-+			     bsscfg->type == BRCMS_TYPE_ADHOC)) {
- 		/* Clear the soft intmask */
- 		wlc->defmacintmask &= ~MI_BCNTPL;
-+		if (!wlc->beacon)
-+			return;
-+		brcms_c_update_beacon_hw(wlc, wlc->beacon,
-+					 wlc->beacon_tim_offset,
-+					 wlc->beacon_dtim_period);
-+	}
-+}
-+
-+void brcms_c_set_new_beacon(struct brcms_c_info *wlc, struct sk_buff *beacon,
-+			    u16 tim_offset, u16 dtim_period)
-+{
-+	if (!beacon)
-+		return;
-+	if (wlc->beacon)
-+		dev_kfree_skb_any(wlc->beacon);
-+	wlc->beacon = beacon;
-+
-+	/* add PLCP */
-+	skb_push(wlc->beacon, D11_PHY_HDR_LEN);
-+	wlc->beacon_tim_offset = tim_offset;
-+	wlc->beacon_dtim_period = dtim_period;
-+	brcms_c_update_beacon(wlc);
- }
- 
- /* Write ssid into shared memory */
-@@ -7788,6 +7918,10 @@ bool brcms_c_dpc(struct brcms_c_info *wl
- 		brcms_rfkill_set_hw_state(wlc->wl);
- 	}
- 
-+	/* BCN template is available */
-+	if (macintstatus & MI_BCNTPL)
-+		brcms_c_update_beacon(wlc);
-+
- 	/* it isn't done and needs to be resched if macintstatus is non-zero */
- 	return wlc->macintstatus != 0;
- 
-@@ -7919,6 +8053,7 @@ brcms_c_attach(struct brcms_info *wl, st
- 	pub->unit = unit;
- 	pub->_piomode = piomode;
- 	wlc->bandinit_pending = false;
-+	wlc->beacon_template_virgin = true;
- 
- 	/* populate struct brcms_c_info with default values  */
- 	brcms_c_info_init(wlc, unit);
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -492,6 +492,8 @@ struct brcms_c_info {
- 	bool radio_monitor;
- 	bool going_down;
- 
-+	bool beacon_template_virgin;
-+
- 	struct brcms_timer *wdtimer;
- 	struct brcms_timer *radio_timer;
- 
-@@ -561,6 +563,10 @@ struct brcms_c_info {
- 
- 	struct wiphy *wiphy;
- 	struct scb pri_scb;
-+
-+	struct sk_buff *beacon;
-+	u16 beacon_tim_offset;
-+	u16 beacon_dtim_period;
- };
- 
- /* antsel module specific state */
-@@ -630,7 +636,6 @@ extern u16 brcms_c_compute_rtscts_dur(st
- extern void brcms_c_inval_dma_pkts(struct brcms_hardware *hw,
- 			       struct ieee80211_sta *sta,
- 			       void (*dma_callback_fn));
--extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
- extern void brcms_c_update_probe_resp(struct brcms_c_info *wlc, bool suspend);
- extern int brcms_c_set_nmode(struct brcms_c_info *wlc);
- extern void brcms_c_beacon_phytxctl_txant_upd(struct brcms_c_info *wlc,
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -332,5 +332,9 @@ extern bool brcms_c_check_radio_disabled
- extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
- extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
- extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
-+extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
-+extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
-+				   struct sk_buff *beacon, u16 tim_offset,
-+				   u16 dtim_period);
- 
- #endif				/* _BRCM_PUB_H_ */

+ 0 - 43
package/mac80211/patches/870-brcmsmac-react-on-changing-SSID.patch

@@ -1,43 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -523,6 +523,12 @@ brcms_ops_bss_info_changed(struct ieee80
- 		brcms_c_set_addrmatch(wl->wlc, RCM_BSSID_OFFSET, info->bssid);
- 		spin_unlock_bh(&wl->lock);
- 	}
-+	if (changed & BSS_CHANGED_SSID) {
-+		/* BSSID changed, for whatever reason (IBSS and managed mode) */
-+		spin_lock_bh(&wl->lock);
-+		brcms_c_set_ssid(wl->wlc, info->ssid, info->ssid_len);
-+		spin_unlock_bh(&wl->lock);
-+	}
- 	if (changed & BSS_CHANGED_BEACON) {
- 		/* Beacon data changed, retrieve new beacon (beaconing modes) */
- 		struct sk_buff *beacon;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -3785,6 +3785,15 @@ static void brcms_c_set_bssid(struct brc
- 	brcms_c_set_addrmatch(bsscfg->wlc, RCM_BSSID_OFFSET, bsscfg->BSSID);
- }
- 
-+void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid, size_t ssid_len)
-+{
-+	u8 len = min_t(u8, sizeof(wlc->bsscfg->SSID), ssid_len);
-+	memset(wlc->bsscfg->SSID, 0, sizeof(wlc->bsscfg->SSID));
-+
-+	memcpy(wlc->bsscfg->SSID, ssid, len);
-+	wlc->bsscfg->SSID_len = len;
-+}
-+
- static void brcms_b_set_shortslot(struct brcms_hardware *wlc_hw, bool shortslot)
- {
- 	wlc_hw->shortslot = shortslot;
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -336,5 +336,7 @@ extern void brcms_c_update_beacon(struct
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
- 				   struct sk_buff *beacon, u16 tim_offset,
- 				   u16 dtim_period);
-+extern void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid,
-+			     size_t ssid_len);
- 
- #endif				/* _BRCM_PUB_H_ */

+ 0 - 216
package/mac80211/patches/871-brcmsmac-add-support-for-probe-response-template.patch

@@ -1,216 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -541,6 +541,15 @@ brcms_ops_bss_info_changed(struct ieee80
- 		spin_unlock_bh(&wl->lock);
- 	}
- 
-+	if (changed & BSS_CHANGED_AP_PROBE_RESP) {
-+		struct sk_buff *probe_resp;
-+
-+		spin_lock_bh(&wl->lock);
-+		probe_resp = ieee80211_proberesp_get(hw, vif);
-+		brcms_c_set_new_probe_resp(wl->wlc, probe_resp);
-+		spin_unlock_bh(&wl->lock);
-+	}
-+
- 	if (changed & BSS_CHANGED_BEACON_ENABLED) {
- 		/* Beaconing should be enabled/disabled (beaconing modes) */
- 		brcms_err(core, "%s: Beacon enabled: %s\n", __func__,
-@@ -1039,6 +1048,8 @@ static int ieee_hw_init(struct ieee80211
- 	hw->channel_change_time = 7 * 1000;
- 	hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
- 
-+	hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
-+
- 	hw->rate_control_algorithm = "minstrel_ht";
- 
- 	hw->sta_data_size = 0;
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -453,6 +453,8 @@ static void brcms_c_detach_mfree(struct 
- 	kfree(wlc->hw);
- 	if (wlc->beacon)
- 		dev_kfree_skb_any(wlc->beacon);
-+	if (wlc->probe_resp)
-+		dev_kfree_skb_any(wlc->probe_resp);
- 
- 	/* free the wlc */
- 	kfree(wlc);
-@@ -7327,69 +7329,6 @@ brcms_c_mod_prb_rsp_rate_table(struct br
- 	}
- }
- 
--/*	Max buffering needed for beacon template/prb resp template is 142 bytes.
-- *
-- *	PLCP header is 6 bytes.
-- *	802.11 A3 header is 24 bytes.
-- *	Max beacon frame body template length is 112 bytes.
-- *	Max probe resp frame body template length is 110 bytes.
-- *
-- *      *len on input contains the max length of the packet available.
-- *
-- *	The *len value is set to the number of bytes in buf used, and starts
-- *	with the PLCP and included up to, but not including, the 4 byte FCS.
-- */
--static void
--brcms_c_bcn_prb_template(struct brcms_c_info *wlc, u16 type,
--			 u32 bcn_rspec,
--			 struct brcms_bss_cfg *cfg, u16 *buf, int *len)
--{
--	static const u8 ether_bcast[ETH_ALEN] = {255, 255, 255, 255, 255, 255};
--	struct cck_phy_hdr *plcp;
--	struct ieee80211_mgmt *h;
--	int hdr_len, body_len;
--
--	hdr_len = D11_PHY_HDR_LEN + DOT11_MAC_HDR_LEN;
--
--	/* calc buffer size provided for frame body */
--	body_len = *len - hdr_len;
--	/* return actual size */
--	*len = hdr_len + body_len;
--
--	/* format PHY and MAC headers */
--	memset(buf, 0, hdr_len);
--
--	plcp = (struct cck_phy_hdr *) buf;
--
--	/*
--	 * PLCP for Probe Response frames are filled in from
--	 * core's rate table
--	 */
--	if (type == IEEE80211_STYPE_BEACON)
--		/* fill in PLCP */
--		brcms_c_compute_plcp(wlc, bcn_rspec,
--				 (DOT11_MAC_HDR_LEN + body_len + FCS_LEN),
--				 (u8 *) plcp);
--
--	/* "Regular" and 16 MBSS but not for 4 MBSS */
--	/* Update the phytxctl for the beacon based on the rspec */
--	brcms_c_beacon_phytxctl_txant_upd(wlc, bcn_rspec);
--
--	h = (struct ieee80211_mgmt *)&plcp[1];
--
--	/* fill in 802.11 header */
--	h->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | type);
--
--	/* DUR is 0 for multicast bcn, or filled in by MAC for prb resp */
--	/* A1 filled in by MAC for prb resp, broadcast for bcn */
--	if (type == IEEE80211_STYPE_BEACON)
--		memcpy(&h->da, &ether_bcast, ETH_ALEN);
--	memcpy(&h->sa, &wlc->pub->cur_etheraddr, ETH_ALEN);
--	memcpy(&h->bssid, &cfg->BSSID, ETH_ALEN);
--
--	/* SEQ filled in by MAC */
--}
--
- int brcms_c_get_header_len(void)
- {
- 	return TXOFF;
-@@ -7531,6 +7470,20 @@ void brcms_c_set_new_beacon(struct brcms
- 	brcms_c_update_beacon(wlc);
- }
- 
-+void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc,
-+				struct sk_buff *probe_resp)
-+{
-+	if (!probe_resp)
-+		return;
-+	if (wlc->probe_resp)
-+		dev_kfree_skb_any(wlc->probe_resp);
-+	wlc->probe_resp = probe_resp;
-+
-+	/* add PLCP */
-+	skb_push(wlc->probe_resp, D11_PHY_HDR_LEN);
-+	brcms_c_update_probe_resp(wlc, false);
-+}
-+
- /* Write ssid into shared memory */
- static void
- brcms_c_shm_ssid_upd(struct brcms_c_info *wlc, struct brcms_bss_cfg *cfg)
-@@ -7550,30 +7503,19 @@ brcms_c_shm_ssid_upd(struct brcms_c_info
- static void
- brcms_c_bss_update_probe_resp(struct brcms_c_info *wlc,
- 			      struct brcms_bss_cfg *cfg,
-+			      struct sk_buff *probe_resp,
- 			      bool suspend)
- {
--	u16 *prb_resp;
--	int len = BCN_TMPL_LEN;
-+	int len;
- 
--	prb_resp = kmalloc(BCN_TMPL_LEN, GFP_ATOMIC);
--	if (!prb_resp)
--		return;
--
--	/*
--	 * write the probe response to hardware, or save in
--	 * the config structure
--	 */
--
--	/* create the probe response template */
--	brcms_c_bcn_prb_template(wlc, IEEE80211_STYPE_PROBE_RESP, 0,
--				 cfg, prb_resp, &len);
-+	len = min_t(size_t, probe_resp->len, BCN_TMPL_LEN);
- 
- 	if (suspend)
- 		brcms_c_suspend_mac_and_wait(wlc);
- 
- 	/* write the probe response into the template region */
- 	brcms_b_write_template_ram(wlc->hw, T_PRS_TPL_BASE,
--				    (len + 3) & ~3, prb_resp);
-+				    (len + 3) & ~3, probe_resp->data);
- 
- 	/* write the length of the probe response frame (+PLCP/-FCS) */
- 	brcms_b_write_shm(wlc->hw, M_PRB_RESP_FRM_LEN, (u16) len);
-@@ -7587,13 +7529,11 @@ brcms_c_bss_update_probe_resp(struct brc
- 	 * PLCP header for the call to brcms_c_mod_prb_rsp_rate_table()
- 	 * by subtracting the PLCP len and adding the FCS.
- 	 */
--	len += (-D11_PHY_HDR_LEN + FCS_LEN);
--	brcms_c_mod_prb_rsp_rate_table(wlc, (u16) len);
-+	brcms_c_mod_prb_rsp_rate_table(wlc,
-+				      (u16)len + FCS_LEN - D11_PHY_HDR_LEN);
- 
- 	if (suspend)
- 		brcms_c_enable_mac(wlc);
--
--	kfree(prb_resp);
- }
- 
- void brcms_c_update_probe_resp(struct brcms_c_info *wlc, bool suspend)
-@@ -7602,8 +7542,12 @@ void brcms_c_update_probe_resp(struct br
- 
- 	/* update AP or IBSS probe responses */
- 	if (wlc->pub->up && (bsscfg->type == BRCMS_TYPE_AP ||
--			     bsscfg->type == BRCMS_TYPE_ADHOC))
--		brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
-+			     bsscfg->type == BRCMS_TYPE_ADHOC)) {
-+		if (!wlc->probe_resp)
-+			return;
-+		brcms_c_bss_update_probe_resp(wlc, bsscfg, wlc->probe_resp,
-+					      suspend);
-+	}
- }
- 
- int brcms_b_xmtfifo_sz_get(struct brcms_hardware *wlc_hw, uint fifo,
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
-@@ -567,6 +567,7 @@ struct brcms_c_info {
- 	struct sk_buff *beacon;
- 	u16 beacon_tim_offset;
- 	u16 beacon_dtim_period;
-+	struct sk_buff *probe_resp;
- };
- 
- /* antsel module specific state */
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -336,6 +336,8 @@ extern void brcms_c_update_beacon(struct
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
- 				   struct sk_buff *beacon, u16 tim_offset,
- 				   u16 dtim_period);
-+extern void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc,
-+				       struct sk_buff *probe_resp);
- extern void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid,
- 			     size_t ssid_len);
- 

+ 0 - 59
package/mac80211/patches/872-brcmsmac-deactivate-ucode-sending-probe-responses.patch

@@ -1,59 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -554,6 +554,12 @@ brcms_ops_bss_info_changed(struct ieee80
- 		/* Beaconing should be enabled/disabled (beaconing modes) */
- 		brcms_err(core, "%s: Beacon enabled: %s\n", __func__,
- 			  info->enable_beacon ? "true" : "false");
-+		if (info->enable_beacon &&
-+		    hw->wiphy->flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) {
-+			brcms_c_enable_probe_resp(wl->wlc, true);
-+		} else {
-+			brcms_c_enable_probe_resp(wl->wlc, false);
-+		}
- 	}
- 
- 	if (changed & BSS_CHANGED_CQM) {
-@@ -1048,7 +1054,12 @@ static int ieee_hw_init(struct ieee80211
- 	hw->channel_change_time = 7 * 1000;
- 	hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
- 
--	hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
-+	/*
-+	 * deactivate sending probe responses by ucude, because this will
-+	 * cause problems when WPS is used.
-+	 *
-+	 * hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
-+	 */
- 
- 	hw->rate_control_algorithm = "minstrel_ht";
- 
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -7484,6 +7484,17 @@ void brcms_c_set_new_probe_resp(struct b
- 	brcms_c_update_probe_resp(wlc, false);
- }
- 
-+void brcms_c_enable_probe_resp(struct brcms_c_info *wlc, bool enable)
-+{
-+	/*
-+	 * prevent ucode from sending probe responses by setting the timeout
-+	 * to 1, it can not send it in that time frame.
-+	 */
-+	wlc->prb_resp_timeout = enable ? BRCMS_PRB_RESP_TIMEOUT : 1;
-+	brcms_b_write_shm(wlc->hw, M_PRS_MAXTIME, wlc->prb_resp_timeout);
-+	/* TODO: if (enable) => also deactivate receiving of probe request */
-+}
-+
- /* Write ssid into shared memory */
- static void
- brcms_c_shm_ssid_upd(struct brcms_c_info *wlc, struct brcms_bss_cfg *cfg)
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -338,6 +338,7 @@ extern void brcms_c_set_new_beacon(struc
- 				   u16 dtim_period);
- extern void brcms_c_set_new_probe_resp(struct brcms_c_info *wlc,
- 				       struct sk_buff *probe_resp);
-+extern void brcms_c_enable_probe_resp(struct brcms_c_info *wlc, bool enable);
- extern void brcms_c_set_ssid(struct brcms_c_info *wlc, u8 *ssid,
- 			     size_t ssid_len);
- 

+ 0 - 79
package/mac80211/patches/873-brcmsmac-activate-AP-support.patch

@@ -1,79 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -359,10 +359,11 @@ brcms_ops_add_interface(struct ieee80211
- {
- 	struct brcms_info *wl = hw->priv;
- 
--	/* Just STA for now */
--	if (vif->type != NL80211_IFTYPE_STATION) {
-+	/* Just STA and AP for now */
-+	if (vif->type != NL80211_IFTYPE_STATION &&
-+	    vif->type != NL80211_IFTYPE_AP) {
- 		brcms_err(wl->wlc->hw->d11core,
--			  "%s: Attempt to add type %d, only STA for now\n",
-+			  "%s: Attempt to add type %d, only STA and AP for now\n",
- 			  __func__, vif->type);
- 		return -EOPNOTSUPP;
- 	}
-@@ -372,6 +373,9 @@ brcms_ops_add_interface(struct ieee80211
- 	brcms_c_mute(wl->wlc, false);
- 	if (vif->type == NL80211_IFTYPE_STATION)
- 		brcms_c_start_station(wl->wlc, vif->addr);
-+	else if (vif->type == NL80211_IFTYPE_AP)
-+		brcms_c_start_ap(wl->wlc, vif->addr, vif->bss_conf.bssid,
-+				 vif->bss_conf.ssid, vif->bss_conf.ssid_len);
- 	spin_unlock_bh(&wl->lock);
- 
- 	return 0;
-@@ -1052,7 +1056,8 @@ static int ieee_hw_init(struct ieee80211
- 
- 	/* channel change time is dependent on chip and band  */
- 	hw->channel_change_time = 7 * 1000;
--	hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
-+	hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-+				     BIT(NL80211_IFTYPE_AP);
- 
- 	/*
- 	 * deactivate sending probe responses by ucude, because this will
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -2176,6 +2176,18 @@ void brcms_c_start_station(struct brcms_
- 	wlc->bsscfg->type = BRCMS_TYPE_STATION;
- }
- 
-+void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, const u8 *bssid,
-+		      u8 *ssid, size_t ssid_len)
-+{
-+	brcms_c_set_ssid(wlc, ssid, ssid_len);
-+
-+	memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
-+	memcpy(wlc->bsscfg->BSSID, bssid, sizeof(wlc->bsscfg->BSSID));
-+	wlc->bsscfg->type = BRCMS_TYPE_AP;
-+
-+	brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA);
-+}
-+
- /* Initialize GPIOs that are controlled by D11 core */
- static void brcms_c_gpio_init(struct brcms_c_info *wlc)
- {
-@@ -3064,6 +3076,9 @@ static bool brcms_c_ps_allowed(struct br
- 	if (wlc->filter_flags & FIF_PROMISC_IN_BSS)
- 		return false;
- 
-+	if (wlc->bsscfg->type == BRCMS_TYPE_AP)
-+		return false;
-+
- 	return true;
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -332,6 +332,8 @@ extern bool brcms_c_check_radio_disabled
- extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
- extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
- extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
-+extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr,
-+			     const u8 *bssid, u8 *ssid, size_t ssid_len);
- extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
- 				   struct sk_buff *beacon, u16 tim_offset,

+ 0 - 74
package/mac80211/patches/874-brcmsmac-add-support-for-adhoc-mode.patch

@@ -1,74 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -359,11 +359,12 @@ brcms_ops_add_interface(struct ieee80211
- {
- 	struct brcms_info *wl = hw->priv;
- 
--	/* Just STA and AP for now */
-+	/* Just STA, AP and ADHOC for now */
- 	if (vif->type != NL80211_IFTYPE_STATION &&
--	    vif->type != NL80211_IFTYPE_AP) {
-+	    vif->type != NL80211_IFTYPE_AP &&
-+	    vif->type != NL80211_IFTYPE_ADHOC) {
- 		brcms_err(wl->wlc->hw->d11core,
--			  "%s: Attempt to add type %d, only STA and AP for now\n",
-+			  "%s: Attempt to add type %d, only STA, AP and AdHoc for now\n",
- 			  __func__, vif->type);
- 		return -EOPNOTSUPP;
- 	}
-@@ -376,6 +377,8 @@ brcms_ops_add_interface(struct ieee80211
- 	else if (vif->type == NL80211_IFTYPE_AP)
- 		brcms_c_start_ap(wl->wlc, vif->addr, vif->bss_conf.bssid,
- 				 vif->bss_conf.ssid, vif->bss_conf.ssid_len);
-+	else if (vif->type == NL80211_IFTYPE_ADHOC)
-+		brcms_c_start_adhoc(wl->wlc, vif->addr);
- 	spin_unlock_bh(&wl->lock);
- 
- 	return 0;
-@@ -1057,7 +1060,8 @@ static int ieee_hw_init(struct ieee80211
- 	/* channel change time is dependent on chip and band  */
- 	hw->channel_change_time = 7 * 1000;
- 	hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
--				     BIT(NL80211_IFTYPE_AP);
-+				     BIT(NL80211_IFTYPE_AP) |
-+				     BIT(NL80211_IFTYPE_ADHOC);
- 
- 	/*
- 	 * deactivate sending probe responses by ucude, because this will
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -2188,6 +2188,14 @@ void brcms_c_start_ap(struct brcms_c_inf
- 	brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA);
- }
- 
-+void brcms_c_start_adhoc(struct brcms_c_info *wlc, u8 *addr)
-+{
-+	memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr));
-+	wlc->bsscfg->type = BRCMS_TYPE_ADHOC;
-+
-+	brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, 0);
-+}
-+
- /* Initialize GPIOs that are controlled by D11 core */
- static void brcms_c_gpio_init(struct brcms_c_info *wlc)
- {
-@@ -3079,6 +3087,9 @@ static bool brcms_c_ps_allowed(struct br
- 	if (wlc->bsscfg->type == BRCMS_TYPE_AP)
- 		return false;
- 
-+	if (wlc->bsscfg->type == BRCMS_TYPE_ADHOC)
-+		return false;
-+
- 	return true;
- }
- 
---- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
-@@ -334,6 +334,7 @@ extern bool brcms_c_tx_flush_completed(s
- extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
- extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr,
- 			     const u8 *bssid, u8 *ssid, size_t ssid_len);
-+extern void brcms_c_start_adhoc(struct brcms_c_info *wlc, u8 *addr);
- extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
- extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc,
- 				   struct sk_buff *beacon, u16 tim_offset,

Some files were not shown because too many files changed in this diff