Просмотр исходного кода

mac80211: update to wireless-testing 2013-11-05

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

SVN-Revision: 38783
Felix Fietkau 12 лет назад
Родитель
Сommit
5f1c42d8b6
55 измененных файлов с 1484 добавлено и 5612 удалено
  1. 27 17
      package/kernel/mac80211/Makefile
  2. 1 1
      package/kernel/mac80211/patches/001-fix_build.patch
  3. 15 4
      package/kernel/mac80211/patches/030-rt2x00_options.patch
  4. 2 2
      package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch
  5. 347 0
      package/kernel/mac80211/patches/100-revert_aes_ccm_port.patch
  6. 5 5
      package/kernel/mac80211/patches/150-disable_addr_notifier.patch
  7. 541 1494
      package/kernel/mac80211/patches/300-pending_work.patch
  8. 0 3348
      package/kernel/mac80211/patches/301-pending_work-rt2x00.patch
  9. 1 1
      package/kernel/mac80211/patches/310-ap_scan.patch
  10. 5 5
      package/kernel/mac80211/patches/400-ath_move_debug_code.patch
  11. 1 1
      package/kernel/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch
  12. 6 6
      package/kernel/mac80211/patches/403-ath_regd_optional.patch
  13. 5 5
      package/kernel/mac80211/patches/404-world_regd_fixup.patch
  14. 2 2
      package/kernel/mac80211/patches/405-regd_no_assoc_hints.patch
  15. 2 2
      package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
  16. 3 3
      package/kernel/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch
  17. 2 2
      package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch
  18. 3 3
      package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch
  19. 3 3
      package/kernel/mac80211/patches/501-ath9k-eeprom_endianess.patch
  20. 1 1
      package/kernel/mac80211/patches/502-ath9k_ahb_init.patch
  21. 1 1
      package/kernel/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch
  22. 2 2
      package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch
  23. 8 8
      package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch
  24. 3 3
      package/kernel/mac80211/patches/520-mac80211_cur_txpower.patch
  25. 1 1
      package/kernel/mac80211/patches/521-ath9k_cur_txpower.patch
  26. 29 10
      package/kernel/mac80211/patches/522-ath9k_per_chain_signal_strength.patch
  27. 80 79
      package/kernel/mac80211/patches/523-mac80211_configure_antenna_gain.patch
  28. 2 2
      package/kernel/mac80211/patches/524-ath9k_use_configured_antenna_gain.patch
  29. 6 6
      package/kernel/mac80211/patches/530-ath9k_extra_leds.patch
  30. 8 8
      package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch
  31. 3 3
      package/kernel/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch
  32. 14 14
      package/kernel/mac80211/patches/550-ath9k_entropy_from_adc.patch
  33. 2 2
      package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch
  34. 168 156
      package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
  35. 31 0
      package/kernel/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch
  36. 34 24
      package/kernel/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
  37. 0 46
      package/kernel/mac80211/patches/605-rt2x00-pci-eeprom.patch
  38. 1 1
      package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
  39. 1 1
      package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch
  40. 16 16
      package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
  41. 13 22
      package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
  42. 4 4
      package/kernel/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
  43. 0 28
      package/kernel/mac80211/patches/614-rt2x00-of_load_eeprom_filename.patch
  44. 1 1
      package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch
  45. 44 48
      package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch
  46. 0 32
      package/kernel/mac80211/patches/618-rt2x00-msi-fix.patch
  47. 1 1
      package/kernel/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
  48. 1 1
      package/kernel/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
  49. 0 27
      package/kernel/mac80211/patches/750-rtlwifi-Align-private-space-in-rtl_priv-struct.patch
  50. 4 4
      package/kernel/mac80211/patches/820-b43-add-antenna-control.patch
  51. 5 5
      package/kernel/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
  52. 29 0
      package/kernel/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch
  53. 0 31
      package/kernel/mac80211/patches/851-brcmsmac-remove-extra-regulation-restriction.patch
  54. 0 84
      package/kernel/mac80211/patches/860-brcmsmac-use-bcma-PCIe-up-and-down-functions.patch
  55. 0 36
      package/kernel/mac80211/patches/861-b43-call-PCIe-up-and-down-functions.patch

+ 27 - 17
package/kernel/mac80211/Makefile

@@ -10,11 +10,11 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=2013-06-27
+PKG_VERSION:=2013-11-05
 PKG_RELEASE:=1
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
-PKG_BACKPORT_VERSION:=.1
-PKG_MD5SUM:=73bd220c64c5c6fdc22b3bb7f180644f
+PKG_BACKPORT_VERSION:=
+PKG_MD5SUM:=5ef839d02d19c341629555a529beebee
 
 PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
@@ -24,8 +24,8 @@ PKG_MAINTAINER:=Felix Fietkau <[email protected]>
 
 PKG_DRIVERS = \
 	adm8211 ath5k libertas-usb libertas-sd p54-common p54-pci p54-usb p54-spi \
-	rt2x00-lib rt2x00-pci rt2x00-usb rt2x00-soc rt2800-lib rt2400-pci \
-	rt2500-pci rt2500-usb rt61-pci rt73-usb rt2800-pci rt2800-usb \
+	rt2x00-lib rt2x00-pci rt2x00-usb rt2800-lib rt2400-pci rt2500-pci \
+	rt2500-usb rt61-pci rt73-usb rt2800-mmio rt2800-pci rt2800-usb rt2800-soc \
 	rtl8180 rtl8187 zd1211rw mac80211-hwsim carl9170 b43 b43legacy \
 	ath9k-common ath9k ath9k-htc ath10k ath net-libipw net-ipw2100 net-ipw2200 \
 	mwl8k net-hermes net-hermes-pci net-hermes-plx net-hermes-pcmcia \
@@ -263,15 +263,6 @@ $(call KernelPackage/rt2x00/Default)
   AUTOLOAD:=$(call AutoProbe,rt2x00usb)
 endef
 
-define KernelPackage/rt2x00-soc
-$(call KernelPackage/rt2x00/Default)
-  DEPENDS+=@TARGET_ramips_rt305x +kmod-rt2x00-mmio +kmod-rt2x00-lib
-  HIDDEN:=1
-  TITLE+= (SoC)
-  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00soc.ko
-  AUTOLOAD:=$(call AutoProbe,rt2x00soc)
-endef
-
 define KernelPackage/rt2800-lib
 $(call KernelPackage/rt2x00/Default)
   DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT||TARGET_ramips) +kmod-rt2x00-lib +kmod-lib-crc-ccitt +@DRIVER_11N_SUPPORT
@@ -320,9 +311,27 @@ define KernelPackage/rt73-usb
   AUTOLOAD:=$(call AutoProbe,rt73usb)
 endef
 
+define KernelPackage/rt2800-mmio
+$(call KernelPackage/rt2x00/Default)
+  TITLE += (RT28xx/RT3xxx MMIO)
+  DEPENDS += +kmod-rt2800-lib +kmod-rt2x00-mmio
+  HIDDEN:=1
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800mmio.ko
+endef
+
+define KernelPackage/rt2800-soc
+$(call KernelPackage/rt2x00/Default)
+  DEPENDS += @TARGET_ramips_rt305x +kmod-rt2800-mmio +kmod-rt2800-lib
+  TITLE += (RT28xx/RT3xxx SoC)
+  FILES := \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2x00soc.ko \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800soc.ko
+  AUTOLOAD:=$(call AutoProbe,rt2800soc)
+endef
+
 define KernelPackage/rt2800-pci
 $(call KernelPackage/rt2x00/Default)
-  DEPENDS+= @(PCI_SUPPORT||TARGET_ramips_rt305x) +PCI_SUPPORT:kmod-rt2x00-pci +kmod-rt2800-lib +kmod-lib-crc-ccitt +TARGET_ramips_rt305x:kmod-rt2x00-soc
+  DEPENDS+= @PCI_SUPPORT +kmod-rt2x00-pci +kmod-rt2800-lib +kmod-rt2800-mmio
   TITLE+= (RT2860 PCI)
   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rt2x00/rt2800pci.ko
   AUTOLOAD:=$(call AutoProbe,rt2800pci)
@@ -1365,7 +1374,6 @@ config-$(call config_package,rt2x00-lib) += RT2X00 RT2X00_LIB
 config-$(call config_package,rt2x00-pci) += RT2X00_LIB_PCI
 config-$(call config_package,rt2x00-mmio) += RT2X00_LIB_MMIO
 config-$(call config_package,rt2x00-usb) += RT2X00_LIB_USB
-config-$(call config_package,rt2x00-soc) += RT2X00_LIB_SOC
 config-$(CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS) += RT2X00_LIB_DEBUGFS
 config-$(CONFIG_PACKAGE_RT2X00_DEBUG) += RT2X00_DEBUG
 
@@ -1377,6 +1385,7 @@ config-$(call config_package,rt73-usb) += RT73USB
 
 config-$(call config_package,rt2800-lib) += RT2800_LIB
 
+config-$(call config_package,rt2800-soc) += RT2800SOC
 config-$(call config_package,rt2800-pci) += RT2800PCI
 config-y += RT2800PCI_RT33XX RT2800PCI_RT35XX RT2800PCI_RT53XX RT2800PCI_RT3290
 
@@ -1748,13 +1757,14 @@ $(eval $(call KernelPackage,rt2x00-lib))
 $(eval $(call KernelPackage,rt2x00-mmio))
 $(eval $(call KernelPackage,rt2x00-pci))
 $(eval $(call KernelPackage,rt2x00-usb))
-$(eval $(call KernelPackage,rt2x00-soc))
 $(eval $(call KernelPackage,rt2800-lib))
 $(eval $(call KernelPackage,rt2400-pci))
 $(eval $(call KernelPackage,rt2500-pci))
 $(eval $(call KernelPackage,rt2500-usb))
 $(eval $(call KernelPackage,rt61-pci))
 $(eval $(call KernelPackage,rt73-usb))
+$(eval $(call KernelPackage,rt2800-mmio))
+$(eval $(call KernelPackage,rt2800-soc))
 $(eval $(call KernelPackage,rt2800-pci))
 $(eval $(call KernelPackage,rt2800-usb))
 $(eval $(call KernelPackage,rtl8180))

+ 1 - 1
package/kernel/mac80211/patches/001-fix_build.patch

@@ -128,7 +128,7 @@
 +	@$(MAKE) Kconfig.versions
  	@$(MAKE) -f Makefile.real "$@"
  
- else
+ .PHONY: defconfig-help
 --- a/Makefile.real
 +++ b/Makefile.real
 @@ -54,7 +54,7 @@ defconfig-%::

+ 15 - 4
package/kernel/mac80211/patches/030-rt2x00_options.patch

@@ -1,13 +1,20 @@
 --- a/drivers/net/wireless/rt2x00/Kconfig
 +++ b/drivers/net/wireless/rt2x00/Kconfig
-@@ -202,25 +202,28 @@ config RT2800USB_UNKNOWN
- endif
+@@ -225,36 +225,37 @@ config RT2800SOC
+ 
  
  config RT2800_LIB
 -	tristate
 +	tristate "RT2800 USB/PCI support"
  	depends on m
  
+ config RT2800_LIB_MMIO
+-	tristate
++	tristate "RT2800 MMIO support"
+ 	depends on m
+ 	select RT2X00_LIB_MMIO
+ 	select RT2800_LIB
+ 
  config RT2X00_LIB_MMIO
 -	tristate
 +	tristate "RT2x00 MMIO support"
@@ -16,7 +23,6 @@
  config RT2X00_LIB_PCI
 -	tristate
 +	tristate "RT2x00 PCI support"
-+	depends on PCI
  	depends on m
  	select RT2X00_LIB
  
@@ -30,7 +36,12 @@
  config RT2X00_LIB_USB
 -	tristate
 +	tristate "RT2x00 USB support"
-+	depends on USB
  	depends on m
  	select RT2X00_LIB
  
+ config RT2X00_LIB
+-	tristate
++	tristate "RT2x00 support"
+ 	depends on m
+ 	select BACKPORT_AVERAGE
+ 

+ 2 - 2
package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch

@@ -1,6 +1,6 @@
 --- a/.local-symbols
 +++ b/.local-symbols
-@@ -363,42 +363,6 @@ USB_CDC_PHONET=
+@@ -382,42 +382,6 @@ USB_CDC_PHONET=
  USB_IPHETH=
  USB_SIERRA_NET=
  USB_VL600=
@@ -77,7 +77,7 @@
  	return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
  #else
  	return bus->chipco.dev;
-@@ -4735,7 +4735,7 @@ static int b43_wireless_core_init(struct
+@@ -4736,7 +4736,7 @@ static int b43_wireless_core_init(struct
  	}
  	if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
  		hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */

+ 347 - 0
package/kernel/mac80211/patches/100-revert_aes_ccm_port.patch

@@ -0,0 +1,347 @@
+--- a/net/mac80211/Kconfig
++++ b/net/mac80211/Kconfig
+@@ -5,7 +5,6 @@ config MAC80211
+ 	depends on CRYPTO
+ 	depends on CRYPTO_ARC4
+ 	depends on CRYPTO_AES
+-	depends on CRYPTO_CCM
+ 	depends on CRC32
+ 	select BACKPORT_AVERAGE
+ 	---help---
+--- a/net/mac80211/aes_ccm.c
++++ b/net/mac80211/aes_ccm.c
+@@ -2,8 +2,6 @@
+  * Copyright 2003-2004, Instant802 Networks, Inc.
+  * Copyright 2005-2006, Devicescape Software, Inc.
+  *
+- * Rewrite: Copyright (C) 2013 Linaro Ltd <[email protected]>
+- *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License version 2 as
+  * published by the Free Software Foundation.
+@@ -19,75 +17,134 @@
+ #include "key.h"
+ #include "aes_ccm.h"
+ 
+-void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
+-			       u8 *data, size_t data_len, u8 *mic)
++static void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *scratch, u8 *a)
+ {
+-	struct scatterlist assoc, pt, ct[2];
+-	struct {
+-		struct aead_request	req;
+-		u8			priv[crypto_aead_reqsize(tfm)];
+-	} aead_req;
+-
+-	memset(&aead_req, 0, sizeof(aead_req));
+-
+-	sg_init_one(&pt, data, data_len);
+-	sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
+-	sg_init_table(ct, 2);
+-	sg_set_buf(&ct[0], data, data_len);
+-	sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
+-
+-	aead_request_set_tfm(&aead_req.req, tfm);
+-	aead_request_set_assoc(&aead_req.req, &assoc, assoc.length);
+-	aead_request_set_crypt(&aead_req.req, &pt, ct, data_len, b_0);
++	int i;
++	u8 *b_0, *aad, *b, *s_0;
+ 
+-	crypto_aead_encrypt(&aead_req.req);
++	b_0 = scratch + 3 * AES_BLOCK_SIZE;
++	aad = scratch + 4 * AES_BLOCK_SIZE;
++	b = scratch;
++	s_0 = scratch + AES_BLOCK_SIZE;
++
++	crypto_cipher_encrypt_one(tfm, b, b_0);
++
++	/* Extra Authenticate-only data (always two AES blocks) */
++	for (i = 0; i < AES_BLOCK_SIZE; i++)
++		aad[i] ^= b[i];
++	crypto_cipher_encrypt_one(tfm, b, aad);
++
++	aad += AES_BLOCK_SIZE;
++
++	for (i = 0; i < AES_BLOCK_SIZE; i++)
++		aad[i] ^= b[i];
++	crypto_cipher_encrypt_one(tfm, a, aad);
++
++	/* Mask out bits from auth-only-b_0 */
++	b_0[0] &= 0x07;
++
++	/* S_0 is used to encrypt T (= MIC) */
++	b_0[14] = 0;
++	b_0[15] = 0;
++	crypto_cipher_encrypt_one(tfm, s_0, b_0);
+ }
+ 
+-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
+-			      u8 *data, size_t data_len, u8 *mic)
++
++void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
++			       u8 *data, size_t data_len,
++			       u8 *cdata, u8 *mic)
+ {
+-	struct scatterlist assoc, pt, ct[2];
+-	struct {
+-		struct aead_request	req;
+-		u8			priv[crypto_aead_reqsize(tfm)];
+-	} aead_req;
+-
+-	memset(&aead_req, 0, sizeof(aead_req));
+-
+-	sg_init_one(&pt, data, data_len);
+-	sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
+-	sg_init_table(ct, 2);
+-	sg_set_buf(&ct[0], data, data_len);
+-	sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
+-
+-	aead_request_set_tfm(&aead_req.req, tfm);
+-	aead_request_set_assoc(&aead_req.req, &assoc, assoc.length);
+-	aead_request_set_crypt(&aead_req.req, ct, &pt,
+-			       data_len + IEEE80211_CCMP_MIC_LEN, b_0);
++	int i, j, last_len, num_blocks;
++	u8 *pos, *cpos, *b, *s_0, *e, *b_0;
++
++	b = scratch;
++	s_0 = scratch + AES_BLOCK_SIZE;
++	e = scratch + 2 * AES_BLOCK_SIZE;
++	b_0 = scratch + 3 * AES_BLOCK_SIZE;
++
++	num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
++	last_len = data_len % AES_BLOCK_SIZE;
++	aes_ccm_prepare(tfm, scratch, b);
++
++	/* Process payload blocks */
++	pos = data;
++	cpos = cdata;
++	for (j = 1; j <= num_blocks; j++) {
++		int blen = (j == num_blocks && last_len) ?
++			last_len : AES_BLOCK_SIZE;
++
++		/* Authentication followed by encryption */
++		for (i = 0; i < blen; i++)
++			b[i] ^= pos[i];
++		crypto_cipher_encrypt_one(tfm, b, b);
++
++		b_0[14] = (j >> 8) & 0xff;
++		b_0[15] = j & 0xff;
++		crypto_cipher_encrypt_one(tfm, e, b_0);
++		for (i = 0; i < blen; i++)
++			*cpos++ = *pos++ ^ e[i];
++	}
+ 
+-	return crypto_aead_decrypt(&aead_req.req);
++	for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++)
++		mic[i] = b[i] ^ s_0[i];
+ }
+ 
+-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[])
++
++int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
++			      u8 *cdata, size_t data_len, u8 *mic, u8 *data)
+ {
+-	struct crypto_aead *tfm;
+-	int err;
++	int i, j, last_len, num_blocks;
++	u8 *pos, *cpos, *b, *s_0, *a, *b_0;
+ 
+-	tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
+-	if (IS_ERR(tfm))
+-		return tfm;
+-
+-	err = crypto_aead_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
+-	if (!err)
+-		err = crypto_aead_setauthsize(tfm, IEEE80211_CCMP_MIC_LEN);
+-	if (!err)
+-		return tfm;
++	b = scratch;
++	s_0 = scratch + AES_BLOCK_SIZE;
++	a = scratch + 2 * AES_BLOCK_SIZE;
++	b_0 = scratch + 3 * AES_BLOCK_SIZE;
++
++	num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE);
++	last_len = data_len % AES_BLOCK_SIZE;
++	aes_ccm_prepare(tfm, scratch, a);
++
++	/* Process payload blocks */
++	cpos = cdata;
++	pos = data;
++	for (j = 1; j <= num_blocks; j++) {
++		int blen = (j == num_blocks && last_len) ?
++			last_len : AES_BLOCK_SIZE;
++
++		/* Decryption followed by authentication */
++		b_0[14] = (j >> 8) & 0xff;
++		b_0[15] = j & 0xff;
++		crypto_cipher_encrypt_one(tfm, b, b_0);
++		for (i = 0; i < blen; i++) {
++			*pos = *cpos++ ^ b[i];
++			a[i] ^= *pos++;
++		}
++		crypto_cipher_encrypt_one(tfm, a, a);
++	}
++
++	for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++) {
++		if ((mic[i] ^ s_0[i]) != a[i])
++			return -1;
++	}
+ 
+-	crypto_free_aead(tfm);
+-	return ERR_PTR(err);
++	return 0;
+ }
+ 
+-void ieee80211_aes_key_free(struct crypto_aead *tfm)
++
++struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[])
++{
++	struct crypto_cipher *tfm;
++
++	tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
++	if (!IS_ERR(tfm))
++		crypto_cipher_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
++
++	return tfm;
++}
++
++
++void ieee80211_aes_key_free(struct crypto_cipher *tfm)
+ {
+-	crypto_free_aead(tfm);
++	crypto_free_cipher(tfm);
+ }
+--- a/net/mac80211/aes_ccm.h
++++ b/net/mac80211/aes_ccm.h
+@@ -12,11 +12,13 @@
+ 
+ #include <linux/crypto.h>
+ 
+-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[]);
+-void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
+-			       u8 *data, size_t data_len, u8 *mic);
+-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
+-			      u8 *data, size_t data_len, u8 *mic);
+-void ieee80211_aes_key_free(struct crypto_aead *tfm);
++struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[]);
++void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
++			       u8 *data, size_t data_len,
++			       u8 *cdata, u8 *mic);
++int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
++			      u8 *cdata, size_t data_len,
++			      u8 *mic, u8 *data);
++void ieee80211_aes_key_free(struct crypto_cipher *tfm);
+ 
+ #endif /* AES_CCM_H */
+--- a/net/mac80211/key.h
++++ b/net/mac80211/key.h
+@@ -83,7 +83,7 @@ struct ieee80211_key {
+ 			 * Management frames.
+ 			 */
+ 			u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
+-			struct crypto_aead *tfm;
++			struct crypto_cipher *tfm;
+ 			u32 replays; /* dot11RSNAStatsCCMPReplays */
+ 		} ccmp;
+ 		struct {
+--- a/net/mac80211/wpa.c
++++ b/net/mac80211/wpa.c
+@@ -301,16 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
+ }
+ 
+ 
+-static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
++static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *scratch,
+ 				int encrypted)
+ {
+ 	__le16 mask_fc;
+ 	int a4_included, mgmt;
+ 	u8 qos_tid;
+-	u16 len_a;
++	u8 *b_0, *aad;
++	u16 data_len, len_a;
+ 	unsigned int hdrlen;
+ 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+ 
++	memset(scratch, 0, 6 * AES_BLOCK_SIZE);
++
++	b_0 = scratch + 3 * AES_BLOCK_SIZE;
++	aad = scratch + 4 * AES_BLOCK_SIZE;
++
+ 	/*
+ 	 * Mask FC: zero subtype b4 b5 b6 (if not mgmt)
+ 	 * Retry, PwrMgt, MoreData; set Protected
+@@ -332,21 +338,20 @@ static void ccmp_special_blocks(struct s
+ 	else
+ 		qos_tid = 0;
+ 
+-	/* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
+-	 * mode authentication are not allowed to collide, yet both are derived
+-	 * from this vector b_0. We only set L := 1 here to indicate that the
+-	 * data size can be represented in (L+1) bytes. The CCM layer will take
+-	 * care of storing the data length in the top (L+1) bytes and setting
+-	 * and clearing the other bits as is required to derive the two IVs.
+-	 */
+-	b_0[0] = 0x1;
++	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN;
++	if (encrypted)
++		data_len -= IEEE80211_CCMP_MIC_LEN;
+ 
++	/* First block, b_0 */
++	b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
+ 	/* Nonce: Nonce Flags | A2 | PN
+ 	 * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
+ 	 */
+ 	b_0[1] = qos_tid | (mgmt << 4);
+ 	memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
+ 	memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
++	/* l(m) */
++	put_unaligned_be16(data_len, &b_0[14]);
+ 
+ 	/* AAD (extra authenticate-only data) / masked 802.11 header
+ 	 * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
+@@ -402,8 +407,7 @@ static int ccmp_encrypt_skb(struct ieee8
+ 	u8 *pos;
+ 	u8 pn[6];
+ 	u64 pn64;
+-	u8 aad[2 * AES_BLOCK_SIZE];
+-	u8 b_0[AES_BLOCK_SIZE];
++	u8 scratch[6 * AES_BLOCK_SIZE];
+ 
+ 	if (info->control.hw_key &&
+ 	    !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
+@@ -456,9 +460,9 @@ static int ccmp_encrypt_skb(struct ieee8
+ 		return 0;
+ 
+ 	pos += IEEE80211_CCMP_HDR_LEN;
+-	ccmp_special_blocks(skb, pn, b_0, aad, 0);
+-	ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
+-				  skb_put(skb, IEEE80211_CCMP_MIC_LEN));
++	ccmp_special_blocks(skb, pn, scratch, 0);
++	ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, pos, len,
++				  pos, skb_put(skb, IEEE80211_CCMP_MIC_LEN));
+ 
+ 	return 0;
+ }
+@@ -521,16 +525,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee
+ 	}
+ 
+ 	if (!(status->flag & RX_FLAG_DECRYPTED)) {
+-		u8 aad[2 * AES_BLOCK_SIZE];
+-		u8 b_0[AES_BLOCK_SIZE];
++		u8 scratch[6 * AES_BLOCK_SIZE];
+ 		/* hardware didn't decrypt/verify MIC */
+-		ccmp_special_blocks(skb, pn, b_0, aad, 1);
++		ccmp_special_blocks(skb, pn, scratch, 1);
+ 
+ 		if (ieee80211_aes_ccm_decrypt(
+-			    key->u.ccmp.tfm, b_0, aad,
++			    key->u.ccmp.tfm, scratch,
+ 			    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
+ 			    data_len,
+-			    skb->data + skb->len - IEEE80211_CCMP_MIC_LEN))
++			    skb->data + skb->len - IEEE80211_CCMP_MIC_LEN,
++			    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN))
+ 			return RX_DROP_UNUSABLE;
+ 	}
+ 

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

@@ -1,6 +1,6 @@
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -300,7 +300,7 @@ void ieee80211_restart_hw(struct ieee802
+@@ -291,7 +291,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)
  {
-@@ -359,7 +359,7 @@ static int ieee80211_ifa_changed(struct 
+@@ -350,7 +350,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)
  {
-@@ -990,14 +990,14 @@ int ieee80211_register_hw(struct ieee802
+@@ -978,14 +978,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)
-@@ -1006,13 +1006,13 @@ int ieee80211_register_hw(struct ieee802
+@@ -994,13 +994,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);
-@@ -1045,10 +1045,10 @@ void ieee80211_unregister_hw(struct ieee
+@@ -1033,10 +1033,10 @@ void ieee80211_unregister_hw(struct ieee
  
  	pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
  			       &local->network_latency_notifier);

Разница между файлами не показана из-за своего большого размера
+ 541 - 1494
package/kernel/mac80211/patches/300-pending_work.patch


+ 0 - 3348
package/kernel/mac80211/patches/301-pending_work-rt2x00.patch

@@ -1,3348 +0,0 @@
-Contains the following changes from wireless-testing/master-2013-08-26:
-
-  commit 8951b79a4e6d8228babf56ae79a345e4abc5ac82
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 11:25:52 2013 +0200
-
-      rt2x00: rt2800lib: introduce rt2800_eeprom_word enum
-
-  commit 3e38d3daf881a78ac13e93504a8ac5777040797e
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 11:25:53 2013 +0200
-
-      rt2x00: rt2800lib: introduce local EEPROM access functions
-
-  commit 022138ca93f016374d5d3f69c070c75596c5ecac
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 11:25:54 2013 +0200
-
-      rt2x00: rt2800lib: introduce rt2800_eeprom_read_from_array helper
-
-  commit 379448fe34e289fdcc473399d4f6cac19e757fb8
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 11:25:55 2013 +0200
-
-      rt2x00: rt2800lib: introduce rt2800_eeprom_word_index helper
-
-  commit fa31d157f83ef71b6530aacf0400bafe7816acbd
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 11:25:56 2013 +0200
-
-      rt2x00: rt2800lib: add EEPROM map for the RT3593 chipset
-
-  commit 1706d15d82f4a579119b419cd673987af60f1d9b
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:16 2013 +0200
-
-      rt2x00: rt2800lib: add MAC register initialization for RT3593
-
-  commit b189a1814135bc52f516ca61a1fa161914d57a54
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:17 2013 +0200
-
-      rt2x00: rt2800lib: add BBP register initialization for RT3593
-
-  commit ab7078ac3d920e0d49b17e92f327f3ada25600e8
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:18 2013 +0200
-
-      rt2x00: rt2800lib: add RFCSR register initialization for RT3593
-
-  commit d63f7e8ca560dc9a76a15c323cb9cba14b25f430
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:19 2013 +0200
-
-      rt2x00: rt2800lib: add BBP post initialization for RT3593
-
-  commit 34542ff5a665061d548c3f860807df341f718adf
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:20 2013 +0200
-
-      rt2x00: rt2800lib: add TX power configuration for RT3593
-
-  commit 4788ac1e4842d8ef46ee620cfccf96c426043177
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:21 2013 +0200
-
-      rt2x00: rt2800lib: fix BBP1_TX_ANTENNA field configuration for 3T devices
-
-  commit 5cddb3c2d5102d9a6b1b809e1518da54c8be8296
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:22 2013 +0200
-
-      rt2x00: rt2800lib: fix antenna configuration for RT3593
-
-  commit 97aa03f15e83174df74aa468eea127c5cee480f0
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:23 2013 +0200
-
-      rt2x00: rt2800lib: add rt2800_txpower_to_dev helper
-
-  commit fc739cfe0f305647677edbf99a76d9ece96e3795
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:24 2013 +0200
-
-      rt2x00: rt2800lib: fix default TX power values for RT3593
-
-  commit a3f1625dae58f06c5df1ec0094b275e9a46fd8b3
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:25 2013 +0200
-
-      rt2x00: rt2800lib: introduce rt2800_get_txmixer_gain_{24,5}g helpers
-
-  commit 6316c786cc8aff762530ea740233bf2da10fea33
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:26 2013 +0200
-
-      rt2x00: rt2800lib: hardcode TX mixer gain values for RT3593
-
-  commit f36bb0ca1be5bcb7148ad32263626f8609dfc0d7
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:27 2013 +0200
-
-      rt2x00: rt2800lib: fix LNA_A[12] gain values for RT3593
-
-  commit c0a14369ebd3e7940e70e397ecc3dd7eaf81e9ab
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:28 2013 +0200
-
-      rt2x00: rt2800lib: add default_power3 field for three-chain devices
-
-  commit c8b9d3dc83cab569de6054a10e355a143e2b52a0
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:29 2013 +0200
-
-      rt2x00: rt2800lib: add rf_vals for RF3053
-
-  commit f42b046578efb018064302fd9b66586f5da7d75b
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:30 2013 +0200
-
-      rt2x00: rt2800lib: add channel configuration for RF3053
-
-  commit 1095df07bfc5924e100f1748e6ebc9e5a5881565
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:31 2013 +0200
-
-      rt2x00: rt2800lib: enable VCO recalibration for RF3053
-
-  commit 0f5af26a49c8d6a50ecec2f1b66174069c9f9581
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:32 2013 +0200
-
-      rt2x00: rt2800lib: enable RF3053 support
-
-  commit 2dc2bd2f8aa8eb79184fb3c7e5f530006500897f
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:33 2013 +0200
-
-      rt2x00: rt2800lib: enable RT3593 support
-
-  commit 65d3c0d5cffb9f1227927544e418a9ac231eae42
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:34 2013 +0200
-
-      rt2x00: rt2800usb: use correct [RT]XWI size for RT3593
-
-  commit d02433d15566f542e42e3c469dfade0de332dc7b
-  Author: Gabor Juhos <[email protected]>
-  Date:   Mon Jul 8 16:08:35 2013 +0200
-
-      rt2x00: rt2800usb: add USB device ID for Linksys AE3000
-
-  commit 637065267eab4817c0b06cbf3c7fc80842acab99
-  Author: Xose Vazquez Perez <[email protected]>
-  Date:   Tue Jul 23 14:55:15 2013 +0200
-
-      wireless: rt2x00: rt2800usb: add RT3573 devices
-
-  commit ae1b1c5dcdef1ebd4b37a7d56ad767add757a660
-  Author: Gabor Juhos <[email protected]>
-  Date:   Fri Aug 16 10:23:29 2013 +0200
-
-      rt2x00: rt2800lib: introduce rt2800_get_txwi_rxwi_size helper
-
-  commit 41caa760d6acaf47cbd44c3d78307fb9be089111
-  Author: Gabor Juhos <[email protected]>
-  Date:   Fri Aug 16 10:23:30 2013 +0200
-
-      rt2x00: rt2800pci: fix AUX_CTRL register setup for RT3090/3390/3593/5592
-
-  commit 91a3fa39ddf2f85a15cb20ccc3a54c1f0497af1e
-  Author: Gabor Juhos <[email protected]>
-  Date:   Sat Aug 17 00:15:49 2013 +0200
-
-      rt2x00: rt2800: rename HW_BEACON_OFFSET macro
-
-  commit 77f7c0f3b8f2d464e841c5c35f3da8b4999a885c
-  Author: Gabor Juhos <[email protected]>
-  Date:   Sat Aug 17 00:15:50 2013 +0200
-
-      rt2x00: rt2800lib: pass beacon index to rt2800_clear_beacon_register
-
-  commit c1fada4e5e53d88a8edd3ff01cee9d316cbf6025
-  Author: Gabor Juhos <[email protected]>
-  Date:   Sat Aug 17 14:09:28 2013 +0200
-
-      rt2x00: rt2800lib: fix frequency offset boundary calculation
-
-  commit 6af1bdccabe956a08a37f2ae049d37307ec0c91c
-  Author: Gabor Juhos <[email protected]>
-  Date:   Sat Aug 17 14:09:29 2013 +0200
-
-      rt2x00: rt2800lib: optimize frequency offset adjustment
-
-  commit 76773f301f2210dcc20c466aebda7118062673eb
-  Author: Gabor Juhos <[email protected]>
-  Date:   Sat Aug 17 14:09:30 2013 +0200
-
-      rt2x00: rt2800lib: use a MCU command for frequency adjustment on USB devices
-
-  commit 8d38eca8e089179b6858ca5f3ea03f571a5892a5
-  Author: Gabor Juhos <[email protected]>
-  Date:   Sat Aug 17 14:09:31 2013 +0200
-
-      rt2x00: rt2800lib: use step-by-step frequency offset adjustment on MMIO devices
-
-  commit 3f1b8739a498c7570ca2fae6c49fd1561ef2358c
-  Author: Gabor Juhos <[email protected]>
-  Date:   Sat Aug 17 14:09:32 2013 +0200
-
-      rt2x00: rt2800lib: move rt2800_adjust_freq_offset function
-
-  commit e979a8ab204edbf7b0815162109ee9c85e4d7ea5
-  Author: Gabor Juhos <[email protected]>
-  Date:   Sat Aug 17 14:09:33 2013 +0200
-
-      rt2x00: rt2800lib: adjust frequency offset for RF3053
-
-  commit 21c6af6b69b609b7934caaccda1b4535dceb402c
-  Author: Gabor Juhos <[email protected]>
-  Date:   Thu Aug 22 20:53:21 2013 +0200
-
-      rt2x00: rt2800lib: add rt2800_hw_beacon_base helper
-
-  commit 634b80595fef79071d82bc231b7f82c4f808a1e8
-  Author: Gabor Juhos <[email protected]>
-  Date:   Thu Aug 22 20:53:22 2013 +0200
-
-      rt2x00: rt2800lib: don't hardcode beacon offsets
-
-  commit 6e956da2027c767859128b9bfef085cf2a8e233b
-  Author: Stanislaw Gruszka <[email protected]>
-  Date:   Mon Aug 26 15:18:53 2013 +0200
-
-      rt2800: fix wrong TX power compensation
-
----
---- a/drivers/net/wireless/rt2x00/Kconfig
-+++ b/drivers/net/wireless/rt2x00/Kconfig
-@@ -174,6 +174,12 @@ config RT2800USB_RT35XX
- 	  rt2800usb driver.
- 	  Supported chips: RT3572
- 
-+config RT2800USB_RT3573
-+	bool "rt2800usb - Include support for rt3573 devices (EXPERIMENTAL)"
-+	---help---
-+	  This enables support for RT3573 chipset based wireless USB devices
-+	  in the rt2800usb driver.
-+
- config RT2800USB_RT53XX
-        bool "rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)"
-        ---help---
---- a/drivers/net/wireless/rt2x00/rt2800.h
-+++ b/drivers/net/wireless/rt2x00/rt2800.h
-@@ -88,6 +88,7 @@
- #define REV_RT3071E			0x0211
- #define REV_RT3090E			0x0211
- #define REV_RT3390E			0x0211
-+#define REV_RT3593E			0x0211
- #define REV_RT5390F			0x0502
- #define REV_RT5390R			0x1502
- #define REV_RT5592C			0x0221
-@@ -1082,6 +1083,15 @@
- #define TX_PWR_CFG_0_9MBS		FIELD32(0x00f00000)
- #define TX_PWR_CFG_0_12MBS		FIELD32(0x0f000000)
- #define TX_PWR_CFG_0_18MBS		FIELD32(0xf0000000)
-+/* bits for 3T devices */
-+#define TX_PWR_CFG_0_CCK1_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_0_CCK1_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_0_CCK5_CH0		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_0_CCK5_CH1		FIELD32(0x0000f000)
-+#define TX_PWR_CFG_0_OFDM6_CH0		FIELD32(0x000f0000)
-+#define TX_PWR_CFG_0_OFDM6_CH1		FIELD32(0x00f00000)
-+#define TX_PWR_CFG_0_OFDM12_CH0		FIELD32(0x0f000000)
-+#define TX_PWR_CFG_0_OFDM12_CH1		FIELD32(0xf0000000)
- 
- /*
-  * TX_PWR_CFG_1:
-@@ -1095,6 +1105,15 @@
- #define TX_PWR_CFG_1_MCS1		FIELD32(0x00f00000)
- #define TX_PWR_CFG_1_MCS2		FIELD32(0x0f000000)
- #define TX_PWR_CFG_1_MCS3		FIELD32(0xf0000000)
-+/* bits for 3T devices */
-+#define TX_PWR_CFG_1_OFDM24_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_1_OFDM24_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_1_OFDM48_CH0		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_1_OFDM48_CH1		FIELD32(0x0000f000)
-+#define TX_PWR_CFG_1_MCS0_CH0		FIELD32(0x000f0000)
-+#define TX_PWR_CFG_1_MCS0_CH1		FIELD32(0x00f00000)
-+#define TX_PWR_CFG_1_MCS2_CH0		FIELD32(0x0f000000)
-+#define TX_PWR_CFG_1_MCS2_CH1		FIELD32(0xf0000000)
- 
- /*
-  * TX_PWR_CFG_2:
-@@ -1108,6 +1127,15 @@
- #define TX_PWR_CFG_2_MCS9		FIELD32(0x00f00000)
- #define TX_PWR_CFG_2_MCS10		FIELD32(0x0f000000)
- #define TX_PWR_CFG_2_MCS11		FIELD32(0xf0000000)
-+/* bits for 3T devices */
-+#define TX_PWR_CFG_2_MCS4_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_2_MCS4_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_2_MCS6_CH0		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_2_MCS6_CH1		FIELD32(0x0000f000)
-+#define TX_PWR_CFG_2_MCS8_CH0		FIELD32(0x000f0000)
-+#define TX_PWR_CFG_2_MCS8_CH1		FIELD32(0x00f00000)
-+#define TX_PWR_CFG_2_MCS10_CH0		FIELD32(0x0f000000)
-+#define TX_PWR_CFG_2_MCS10_CH1		FIELD32(0xf0000000)
- 
- /*
-  * TX_PWR_CFG_3:
-@@ -1121,6 +1149,15 @@
- #define TX_PWR_CFG_3_UKNOWN2		FIELD32(0x00f00000)
- #define TX_PWR_CFG_3_UKNOWN3		FIELD32(0x0f000000)
- #define TX_PWR_CFG_3_UKNOWN4		FIELD32(0xf0000000)
-+/* bits for 3T devices */
-+#define TX_PWR_CFG_3_MCS12_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_3_MCS12_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_3_MCS14_CH0		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_3_MCS14_CH1		FIELD32(0x0000f000)
-+#define TX_PWR_CFG_3_STBC0_CH0		FIELD32(0x000f0000)
-+#define TX_PWR_CFG_3_STBC0_CH1		FIELD32(0x00f00000)
-+#define TX_PWR_CFG_3_STBC2_CH0		FIELD32(0x0f000000)
-+#define TX_PWR_CFG_3_STBC2_CH1		FIELD32(0xf0000000)
- 
- /*
-  * TX_PWR_CFG_4:
-@@ -1130,6 +1167,11 @@
- #define TX_PWR_CFG_4_UKNOWN6		FIELD32(0x000000f0)
- #define TX_PWR_CFG_4_UKNOWN7		FIELD32(0x00000f00)
- #define TX_PWR_CFG_4_UKNOWN8		FIELD32(0x0000f000)
-+/* bits for 3T devices */
-+#define TX_PWR_CFG_3_STBC4_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_3_STBC4_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_3_STBC6_CH0		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_3_STBC6_CH1		FIELD32(0x0000f000)
- 
- /*
-  * TX_PIN_CFG:
-@@ -1451,6 +1493,81 @@
-  */
- #define EXP_ACK_TIME			0x1380
- 
-+/* TX_PWR_CFG_5 */
-+#define TX_PWR_CFG_5			0x1384
-+#define TX_PWR_CFG_5_MCS16_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_5_MCS16_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_5_MCS16_CH2		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_5_MCS18_CH0		FIELD32(0x000f0000)
-+#define TX_PWR_CFG_5_MCS18_CH1		FIELD32(0x00f00000)
-+#define TX_PWR_CFG_5_MCS18_CH2		FIELD32(0x0f000000)
-+
-+/* TX_PWR_CFG_6 */
-+#define TX_PWR_CFG_6			0x1388
-+#define TX_PWR_CFG_6_MCS20_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_6_MCS20_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_6_MCS20_CH2		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_6_MCS22_CH0		FIELD32(0x000f0000)
-+#define TX_PWR_CFG_6_MCS22_CH1		FIELD32(0x00f00000)
-+#define TX_PWR_CFG_6_MCS22_CH2		FIELD32(0x0f000000)
-+
-+/* TX_PWR_CFG_0_EXT */
-+#define TX_PWR_CFG_0_EXT		0x1390
-+#define TX_PWR_CFG_0_EXT_CCK1_CH2	FIELD32(0x0000000f)
-+#define TX_PWR_CFG_0_EXT_CCK5_CH2	FIELD32(0x00000f00)
-+#define TX_PWR_CFG_0_EXT_OFDM6_CH2	FIELD32(0x000f0000)
-+#define TX_PWR_CFG_0_EXT_OFDM12_CH2	FIELD32(0x0f000000)
-+
-+/* TX_PWR_CFG_1_EXT */
-+#define TX_PWR_CFG_1_EXT		0x1394
-+#define TX_PWR_CFG_1_EXT_OFDM24_CH2	FIELD32(0x0000000f)
-+#define TX_PWR_CFG_1_EXT_OFDM48_CH2	FIELD32(0x00000f00)
-+#define TX_PWR_CFG_1_EXT_MCS0_CH2	FIELD32(0x000f0000)
-+#define TX_PWR_CFG_1_EXT_MCS2_CH2	FIELD32(0x0f000000)
-+
-+/* TX_PWR_CFG_2_EXT */
-+#define TX_PWR_CFG_2_EXT		0x1398
-+#define TX_PWR_CFG_2_EXT_MCS4_CH2	FIELD32(0x0000000f)
-+#define TX_PWR_CFG_2_EXT_MCS6_CH2	FIELD32(0x00000f00)
-+#define TX_PWR_CFG_2_EXT_MCS8_CH2	FIELD32(0x000f0000)
-+#define TX_PWR_CFG_2_EXT_MCS10_CH2	FIELD32(0x0f000000)
-+
-+/* TX_PWR_CFG_3_EXT */
-+#define TX_PWR_CFG_3_EXT		0x139c
-+#define TX_PWR_CFG_3_EXT_MCS12_CH2	FIELD32(0x0000000f)
-+#define TX_PWR_CFG_3_EXT_MCS14_CH2	FIELD32(0x00000f00)
-+#define TX_PWR_CFG_3_EXT_STBC0_CH2	FIELD32(0x000f0000)
-+#define TX_PWR_CFG_3_EXT_STBC2_CH2	FIELD32(0x0f000000)
-+
-+/* TX_PWR_CFG_4_EXT */
-+#define TX_PWR_CFG_4_EXT		0x13a0
-+#define TX_PWR_CFG_4_EXT_STBC4_CH2	FIELD32(0x0000000f)
-+#define TX_PWR_CFG_4_EXT_STBC6_CH2	FIELD32(0x00000f00)
-+
-+/* TX_PWR_CFG_7 */
-+#define TX_PWR_CFG_7			0x13d4
-+#define TX_PWR_CFG_7_OFDM54_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_7_OFDM54_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_7_OFDM54_CH2		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_7_MCS7_CH0		FIELD32(0x000f0000)
-+#define TX_PWR_CFG_7_MCS7_CH1		FIELD32(0x00f00000)
-+#define TX_PWR_CFG_7_MCS7_CH2		FIELD32(0x0f000000)
-+
-+/* TX_PWR_CFG_8 */
-+#define TX_PWR_CFG_8			0x13d8
-+#define TX_PWR_CFG_8_MCS15_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_8_MCS15_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_8_MCS15_CH2		FIELD32(0x00000f00)
-+#define TX_PWR_CFG_8_MCS23_CH0		FIELD32(0x000f0000)
-+#define TX_PWR_CFG_8_MCS23_CH1		FIELD32(0x00f00000)
-+#define TX_PWR_CFG_8_MCS23_CH2		FIELD32(0x0f000000)
-+
-+/* TX_PWR_CFG_9 */
-+#define TX_PWR_CFG_9			0x13dc
-+#define TX_PWR_CFG_9_STBC7_CH0		FIELD32(0x0000000f)
-+#define TX_PWR_CFG_9_STBC7_CH1		FIELD32(0x000000f0)
-+#define TX_PWR_CFG_9_STBC7_CH2		FIELD32(0x00000f00)
-+
- /*
-  * RX_FILTER_CFG: RX configuration register.
-  */
-@@ -1902,11 +2019,13 @@ struct mac_iveiv_entry {
- #define HW_BEACON_BASE6			0x5dc0
- #define HW_BEACON_BASE7			0x5bc0
- 
--#define HW_BEACON_OFFSET(__index) \
-+#define HW_BEACON_BASE(__index) \
- 	(((__index) < 4) ? (HW_BEACON_BASE0 + (__index * 0x0200)) : \
- 	  (((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \
- 	  (HW_BEACON_BASE6 - ((__index - 6) * 0x0200))))
- 
-+#define BEACON_BASE_TO_OFFSET(_base)	(((_base) - 0x4000) / 64)
-+
- /*
-  * BBP registers.
-  * The wordsize of the BBP is 8 bits.
-@@ -1975,6 +2094,10 @@ struct mac_iveiv_entry {
- #define BBP109_TX0_POWER		FIELD8(0x0f)
- #define BBP109_TX1_POWER		FIELD8(0xf0)
- 
-+/* BBP 110 */
-+#define BBP110_TX2_POWER		FIELD8(0x0f)
-+
-+
- /*
-  * BBP 138: Unknown
-  */
-@@ -2024,6 +2147,12 @@ struct mac_iveiv_entry {
- #define RFCSR3_PA2_CASCODE_BIAS_CCKK	FIELD8(0x80)
- /* Bits for RF3290/RF5360/RF5370/RF5372/RF5390/RF5392 */
- #define RFCSR3_VCOCAL_EN		FIELD8(0x80)
-+/* Bits for RF3050 */
-+#define RFCSR3_BIT1			FIELD8(0x02)
-+#define RFCSR3_BIT2			FIELD8(0x04)
-+#define RFCSR3_BIT3			FIELD8(0x08)
-+#define RFCSR3_BIT4			FIELD8(0x10)
-+#define RFCSR3_BIT5			FIELD8(0x20)
- 
- /*
-  * FRCSR 5:
-@@ -2036,6 +2165,8 @@ struct mac_iveiv_entry {
- #define RFCSR6_R1			FIELD8(0x03)
- #define RFCSR6_R2			FIELD8(0x40)
- #define RFCSR6_TXDIV		FIELD8(0x0c)
-+/* bits for RF3053 */
-+#define RFCSR6_VCO_IC			FIELD8(0xc0)
- 
- /*
-  * RFCSR 7:
-@@ -2060,7 +2191,12 @@ struct mac_iveiv_entry {
-  * RFCSR 11:
-  */
- #define RFCSR11_R			FIELD8(0x03)
-+#define RFCSR11_PLL_MOD			FIELD8(0x0c)
- #define RFCSR11_MOD			FIELD8(0xc0)
-+/* bits for RF3053 */
-+/* TODO: verify RFCSR11_MOD usage on other chips */
-+#define RFCSR11_PLL_IDOH		FIELD8(0x40)
-+
- 
- /*
-  * RFCSR 12:
-@@ -2092,6 +2228,10 @@ struct mac_iveiv_entry {
- #define RFCSR17_R			FIELD8(0x20)
- #define RFCSR17_CODE                   FIELD8(0x7f)
- 
-+/* RFCSR 18 */
-+#define RFCSR18_XO_TUNE_BYPASS		FIELD8(0x40)
-+
-+
- /*
-  * RFCSR 20:
-  */
-@@ -2152,6 +2292,12 @@ struct mac_iveiv_entry {
- #define RFCSR31_RX_H20M			FIELD8(0x20)
- #define RFCSR31_RX_CALIB		FIELD8(0x7f)
- 
-+/* RFCSR 32 bits for RF3053 */
-+#define RFCSR32_TX_AGC_FC		FIELD8(0xf8)
-+
-+/* RFCSR 36 bits for RF3053 */
-+#define RFCSR36_RF_BS			FIELD8(0x80)
-+
- /*
-  * RFCSR 38:
-  */
-@@ -2160,6 +2306,7 @@ struct mac_iveiv_entry {
- /*
-  * RFCSR 39:
-  */
-+#define RFCSR39_RX_DIV			FIELD8(0x40)
- #define RFCSR39_RX_LO2_EN		FIELD8(0x80)
- 
- /*
-@@ -2167,12 +2314,36 @@ struct mac_iveiv_entry {
-  */
- #define RFCSR49_TX			FIELD8(0x3f)
- #define RFCSR49_EP			FIELD8(0xc0)
-+/* bits for RT3593 */
-+#define RFCSR49_TX_LO1_IC		FIELD8(0x1c)
-+#define RFCSR49_TX_DIV			FIELD8(0x20)
- 
- /*
-  * RFCSR 50:
-  */
- #define RFCSR50_TX			FIELD8(0x3f)
- #define RFCSR50_EP			FIELD8(0xc0)
-+/* bits for RT3593 */
-+#define RFCSR50_TX_LO1_EN		FIELD8(0x20)
-+#define RFCSR50_TX_LO2_EN		FIELD8(0x10)
-+
-+/* RFCSR 51 */
-+/* bits for RT3593 */
-+#define RFCSR51_BITS01			FIELD8(0x03)
-+#define RFCSR51_BITS24			FIELD8(0x1c)
-+#define RFCSR51_BITS57			FIELD8(0xe0)
-+
-+#define RFCSR53_TX_POWER		FIELD8(0x3f)
-+#define RFCSR53_UNKNOWN			FIELD8(0xc0)
-+
-+#define RFCSR54_TX_POWER		FIELD8(0x3f)
-+#define RFCSR54_UNKNOWN			FIELD8(0xc0)
-+
-+#define RFCSR55_TX_POWER		FIELD8(0x3f)
-+#define RFCSR55_UNKNOWN			FIELD8(0xc0)
-+
-+#define RFCSR57_DRV_CC			FIELD8(0xfc)
-+
- 
- /*
-  * RF registers
-@@ -2206,28 +2377,67 @@ struct mac_iveiv_entry {
-  * The wordsize of the EEPROM is 16 bits.
-  */
- 
--/*
-- * Chip ID
-- */
--#define EEPROM_CHIP_ID			0x0000
-+enum rt2800_eeprom_word {
-+	EEPROM_CHIP_ID = 0,
-+	EEPROM_VERSION,
-+	EEPROM_MAC_ADDR_0,
-+	EEPROM_MAC_ADDR_1,
-+	EEPROM_MAC_ADDR_2,
-+	EEPROM_NIC_CONF0,
-+	EEPROM_NIC_CONF1,
-+	EEPROM_FREQ,
-+	EEPROM_LED_AG_CONF,
-+	EEPROM_LED_ACT_CONF,
-+	EEPROM_LED_POLARITY,
-+	EEPROM_NIC_CONF2,
-+	EEPROM_LNA,
-+	EEPROM_RSSI_BG,
-+	EEPROM_RSSI_BG2,
-+	EEPROM_TXMIXER_GAIN_BG,
-+	EEPROM_RSSI_A,
-+	EEPROM_RSSI_A2,
-+	EEPROM_TXMIXER_GAIN_A,
-+	EEPROM_EIRP_MAX_TX_POWER,
-+	EEPROM_TXPOWER_DELTA,
-+	EEPROM_TXPOWER_BG1,
-+	EEPROM_TXPOWER_BG2,
-+	EEPROM_TSSI_BOUND_BG1,
-+	EEPROM_TSSI_BOUND_BG2,
-+	EEPROM_TSSI_BOUND_BG3,
-+	EEPROM_TSSI_BOUND_BG4,
-+	EEPROM_TSSI_BOUND_BG5,
-+	EEPROM_TXPOWER_A1,
-+	EEPROM_TXPOWER_A2,
-+	EEPROM_TSSI_BOUND_A1,
-+	EEPROM_TSSI_BOUND_A2,
-+	EEPROM_TSSI_BOUND_A3,
-+	EEPROM_TSSI_BOUND_A4,
-+	EEPROM_TSSI_BOUND_A5,
-+	EEPROM_TXPOWER_BYRATE,
-+	EEPROM_BBP_START,
-+
-+	/* IDs for extended EEPROM format used by three-chain devices */
-+	EEPROM_EXT_LNA2,
-+	EEPROM_EXT_TXPOWER_BG3,
-+	EEPROM_EXT_TXPOWER_A3,
-+
-+	/* New values must be added before this */
-+	EEPROM_WORD_COUNT
-+};
- 
- /*
-  * EEPROM Version
-  */
--#define EEPROM_VERSION			0x0001
- #define EEPROM_VERSION_FAE		FIELD16(0x00ff)
- #define EEPROM_VERSION_VERSION		FIELD16(0xff00)
- 
- /*
-  * HW MAC address.
-  */
--#define EEPROM_MAC_ADDR_0		0x0002
- #define EEPROM_MAC_ADDR_BYTE0		FIELD16(0x00ff)
- #define EEPROM_MAC_ADDR_BYTE1		FIELD16(0xff00)
--#define EEPROM_MAC_ADDR_1		0x0003
- #define EEPROM_MAC_ADDR_BYTE2		FIELD16(0x00ff)
- #define EEPROM_MAC_ADDR_BYTE3		FIELD16(0xff00)
--#define EEPROM_MAC_ADDR_2		0x0004
- #define EEPROM_MAC_ADDR_BYTE4		FIELD16(0x00ff)
- #define EEPROM_MAC_ADDR_BYTE5		FIELD16(0xff00)
- 
-@@ -2237,7 +2447,6 @@ struct mac_iveiv_entry {
-  * TXPATH: 1: 1T, 2: 2T, 3: 3T
-  * RF_TYPE: RFIC type
-  */
--#define	EEPROM_NIC_CONF0		0x001a
- #define EEPROM_NIC_CONF0_RXPATH		FIELD16(0x000f)
- #define EEPROM_NIC_CONF0_TXPATH		FIELD16(0x00f0)
- #define EEPROM_NIC_CONF0_RF_TYPE		FIELD16(0x0f00)
-@@ -2261,7 +2470,6 @@ struct mac_iveiv_entry {
-  * BT_COEXIST: 0: disable, 1: enable
-  * DAC_TEST: 0: disable, 1: enable
-  */
--#define	EEPROM_NIC_CONF1		0x001b
- #define EEPROM_NIC_CONF1_HW_RADIO		FIELD16(0x0001)
- #define EEPROM_NIC_CONF1_EXTERNAL_TX_ALC		FIELD16(0x0002)
- #define EEPROM_NIC_CONF1_EXTERNAL_LNA_2G		FIELD16(0x0004)
-@@ -2281,7 +2489,6 @@ struct mac_iveiv_entry {
- /*
-  * EEPROM frequency
-  */
--#define	EEPROM_FREQ			0x001d
- #define EEPROM_FREQ_OFFSET		FIELD16(0x00ff)
- #define EEPROM_FREQ_LED_MODE		FIELD16(0x7f00)
- #define EEPROM_FREQ_LED_POLARITY	FIELD16(0x1000)
-@@ -2298,9 +2505,6 @@ struct mac_iveiv_entry {
-  * POLARITY_GPIO_4: Polarity GPIO4 setting.
-  * LED_MODE: Led mode.
-  */
--#define EEPROM_LED_AG_CONF		0x001e
--#define EEPROM_LED_ACT_CONF		0x001f
--#define EEPROM_LED_POLARITY		0x0020
- #define EEPROM_LED_POLARITY_RDY_BG	FIELD16(0x0001)
- #define EEPROM_LED_POLARITY_RDY_A	FIELD16(0x0002)
- #define EEPROM_LED_POLARITY_ACT		FIELD16(0x0004)
-@@ -2317,7 +2521,6 @@ struct mac_iveiv_entry {
-  * TX_STREAM: 0: Reserved, 1: 1 Stream, 2: 2 Stream
-  * CRYSTAL: 00: Reserved, 01: One crystal, 10: Two crystal, 11: Reserved
-  */
--#define EEPROM_NIC_CONF2		0x0021
- #define EEPROM_NIC_CONF2_RX_STREAM		FIELD16(0x000f)
- #define EEPROM_NIC_CONF2_TX_STREAM		FIELD16(0x00f0)
- #define EEPROM_NIC_CONF2_CRYSTAL		FIELD16(0x0600)
-@@ -2325,54 +2528,46 @@ struct mac_iveiv_entry {
- /*
-  * EEPROM LNA
-  */
--#define EEPROM_LNA			0x0022
- #define EEPROM_LNA_BG			FIELD16(0x00ff)
- #define EEPROM_LNA_A0			FIELD16(0xff00)
- 
- /*
-  * EEPROM RSSI BG offset
-  */
--#define EEPROM_RSSI_BG			0x0023
- #define EEPROM_RSSI_BG_OFFSET0		FIELD16(0x00ff)
- #define EEPROM_RSSI_BG_OFFSET1		FIELD16(0xff00)
- 
- /*
-  * EEPROM RSSI BG2 offset
-  */
--#define EEPROM_RSSI_BG2			0x0024
- #define EEPROM_RSSI_BG2_OFFSET2		FIELD16(0x00ff)
- #define EEPROM_RSSI_BG2_LNA_A1		FIELD16(0xff00)
- 
- /*
-  * EEPROM TXMIXER GAIN BG offset (note overlaps with EEPROM RSSI BG2).
-  */
--#define EEPROM_TXMIXER_GAIN_BG		0x0024
- #define EEPROM_TXMIXER_GAIN_BG_VAL	FIELD16(0x0007)
- 
- /*
-  * EEPROM RSSI A offset
-  */
--#define EEPROM_RSSI_A			0x0025
- #define EEPROM_RSSI_A_OFFSET0		FIELD16(0x00ff)
- #define EEPROM_RSSI_A_OFFSET1		FIELD16(0xff00)
- 
- /*
-  * EEPROM RSSI A2 offset
-  */
--#define EEPROM_RSSI_A2			0x0026
- #define EEPROM_RSSI_A2_OFFSET2		FIELD16(0x00ff)
- #define EEPROM_RSSI_A2_LNA_A2		FIELD16(0xff00)
- 
- /*
-  * EEPROM TXMIXER GAIN A offset (note overlaps with EEPROM RSSI A2).
-  */
--#define EEPROM_TXMIXER_GAIN_A		0x0026
- #define EEPROM_TXMIXER_GAIN_A_VAL	FIELD16(0x0007)
- 
- /*
-  * EEPROM EIRP Maximum TX power values(unit: dbm)
-  */
--#define EEPROM_EIRP_MAX_TX_POWER	0x0027
- #define EEPROM_EIRP_MAX_TX_POWER_2GHZ	FIELD16(0x00ff)
- #define EEPROM_EIRP_MAX_TX_POWER_5GHZ	FIELD16(0xff00)
- 
-@@ -2383,7 +2578,6 @@ struct mac_iveiv_entry {
-  * TYPE: 1: Plus the delta value, 0: minus the delta value
-  * ENABLE: enable tx power compensation for 40BW
-  */
--#define EEPROM_TXPOWER_DELTA		0x0028
- #define EEPROM_TXPOWER_DELTA_VALUE_2G	FIELD16(0x003f)
- #define EEPROM_TXPOWER_DELTA_TYPE_2G	FIELD16(0x0040)
- #define EEPROM_TXPOWER_DELTA_ENABLE_2G	FIELD16(0x0080)
-@@ -2394,8 +2588,6 @@ struct mac_iveiv_entry {
- /*
-  * EEPROM TXPOWER 802.11BG
-  */
--#define	EEPROM_TXPOWER_BG1		0x0029
--#define	EEPROM_TXPOWER_BG2		0x0030
- #define EEPROM_TXPOWER_BG_SIZE		7
- #define EEPROM_TXPOWER_BG_1		FIELD16(0x00ff)
- #define EEPROM_TXPOWER_BG_2		FIELD16(0xff00)
-@@ -2407,7 +2599,6 @@ struct mac_iveiv_entry {
-  * MINUS3: If the actual TSSI is below this boundary, tx power needs to be
-  *         reduced by (agc_step * -3)
-  */
--#define EEPROM_TSSI_BOUND_BG1		0x0037
- #define EEPROM_TSSI_BOUND_BG1_MINUS4	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_BG1_MINUS3	FIELD16(0xff00)
- 
-@@ -2418,7 +2609,6 @@ struct mac_iveiv_entry {
-  * MINUS1: If the actual TSSI is below this boundary, tx power needs to be
-  *         reduced by (agc_step * -1)
-  */
--#define EEPROM_TSSI_BOUND_BG2		0x0038
- #define EEPROM_TSSI_BOUND_BG2_MINUS2	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_BG2_MINUS1	FIELD16(0xff00)
- 
-@@ -2428,7 +2618,6 @@ struct mac_iveiv_entry {
-  * PLUS1: If the actual TSSI is above this boundary, tx power needs to be
-  *        increased by (agc_step * 1)
-  */
--#define EEPROM_TSSI_BOUND_BG3		0x0039
- #define EEPROM_TSSI_BOUND_BG3_REF	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_BG3_PLUS1	FIELD16(0xff00)
- 
-@@ -2439,7 +2628,6 @@ struct mac_iveiv_entry {
-  * PLUS3: If the actual TSSI is above this boundary, tx power needs to be
-  *        increased by (agc_step * 3)
-  */
--#define EEPROM_TSSI_BOUND_BG4		0x003a
- #define EEPROM_TSSI_BOUND_BG4_PLUS2	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_BG4_PLUS3	FIELD16(0xff00)
- 
-@@ -2449,19 +2637,20 @@ struct mac_iveiv_entry {
-  *        increased by (agc_step * 4)
-  * AGC_STEP: Temperature compensation step.
-  */
--#define EEPROM_TSSI_BOUND_BG5		0x003b
- #define EEPROM_TSSI_BOUND_BG5_PLUS4	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_BG5_AGC_STEP	FIELD16(0xff00)
- 
- /*
-  * EEPROM TXPOWER 802.11A
-  */
--#define EEPROM_TXPOWER_A1		0x003c
--#define EEPROM_TXPOWER_A2		0x0053
- #define EEPROM_TXPOWER_A_SIZE		6
- #define EEPROM_TXPOWER_A_1		FIELD16(0x00ff)
- #define EEPROM_TXPOWER_A_2		FIELD16(0xff00)
- 
-+/* EEPROM_TXPOWER_{A,G} fields for RT3593 */
-+#define EEPROM_TXPOWER_ALC		FIELD8(0x1f)
-+#define EEPROM_TXPOWER_FINE_CTRL	FIELD8(0xe0)
-+
- /*
-  * EEPROM temperature compensation boundaries 802.11A
-  * MINUS4: If the actual TSSI is below this boundary, tx power needs to be
-@@ -2469,7 +2658,6 @@ struct mac_iveiv_entry {
-  * MINUS3: If the actual TSSI is below this boundary, tx power needs to be
-  *         reduced by (agc_step * -3)
-  */
--#define EEPROM_TSSI_BOUND_A1		0x006a
- #define EEPROM_TSSI_BOUND_A1_MINUS4	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_A1_MINUS3	FIELD16(0xff00)
- 
-@@ -2480,7 +2668,6 @@ struct mac_iveiv_entry {
-  * MINUS1: If the actual TSSI is below this boundary, tx power needs to be
-  *         reduced by (agc_step * -1)
-  */
--#define EEPROM_TSSI_BOUND_A2		0x006b
- #define EEPROM_TSSI_BOUND_A2_MINUS2	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_A2_MINUS1	FIELD16(0xff00)
- 
-@@ -2490,7 +2677,6 @@ struct mac_iveiv_entry {
-  * PLUS1: If the actual TSSI is above this boundary, tx power needs to be
-  *        increased by (agc_step * 1)
-  */
--#define EEPROM_TSSI_BOUND_A3		0x006c
- #define EEPROM_TSSI_BOUND_A3_REF	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_A3_PLUS1	FIELD16(0xff00)
- 
-@@ -2501,7 +2687,6 @@ struct mac_iveiv_entry {
-  * PLUS3: If the actual TSSI is above this boundary, tx power needs to be
-  *        increased by (agc_step * 3)
-  */
--#define EEPROM_TSSI_BOUND_A4		0x006d
- #define EEPROM_TSSI_BOUND_A4_PLUS2	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_A4_PLUS3	FIELD16(0xff00)
- 
-@@ -2511,14 +2696,12 @@ struct mac_iveiv_entry {
-  *        increased by (agc_step * 4)
-  * AGC_STEP: Temperature compensation step.
-  */
--#define EEPROM_TSSI_BOUND_A5		0x006e
- #define EEPROM_TSSI_BOUND_A5_PLUS4	FIELD16(0x00ff)
- #define EEPROM_TSSI_BOUND_A5_AGC_STEP	FIELD16(0xff00)
- 
- /*
-  * EEPROM TXPOWER by rate: tx power per tx rate for HT20 mode
-  */
--#define EEPROM_TXPOWER_BYRATE		0x006f
- #define EEPROM_TXPOWER_BYRATE_SIZE	9
- 
- #define EEPROM_TXPOWER_BYRATE_RATE0	FIELD16(0x000f)
-@@ -2529,11 +2712,14 @@ struct mac_iveiv_entry {
- /*
-  * EEPROM BBP.
-  */
--#define	EEPROM_BBP_START		0x0078
- #define EEPROM_BBP_SIZE			16
- #define EEPROM_BBP_VALUE		FIELD16(0x00ff)
- #define EEPROM_BBP_REG_ID		FIELD16(0xff00)
- 
-+/* EEPROM_EXT_LNA2 */
-+#define EEPROM_EXT_LNA2_A1		FIELD16(0x00ff)
-+#define EEPROM_EXT_LNA2_A2		FIELD16(0xff00)
-+
- /*
-  * EEPROM IQ Calibration, unlike other entries those are byte addresses.
-  */
-@@ -2610,6 +2796,7 @@ struct mac_iveiv_entry {
- #define MCU_RADAR			0x60
- #define MCU_BOOT_SIGNAL			0x72
- #define MCU_ANT_SELECT			0X73
-+#define MCU_FREQ_OFFSET			0x74
- #define MCU_BBP_SIGNAL			0x80
- #define MCU_POWER_SAVE			0x83
- #define MCU_BAND_SELECT		0x91
-@@ -2630,6 +2817,7 @@ struct mac_iveiv_entry {
- #define TXWI_DESC_SIZE_5WORDS		(5 * sizeof(__le32))
- 
- #define RXWI_DESC_SIZE_4WORDS		(4 * sizeof(__le32))
-+#define RXWI_DESC_SIZE_5WORDS		(5 * sizeof(__le32))
- #define RXWI_DESC_SIZE_6WORDS		(6 * sizeof(__le32))
- 
- /*
-@@ -2750,18 +2938,15 @@ struct mac_iveiv_entry {
- #define MAX_A_TXPOWER	15
- #define DEFAULT_TXPOWER	5
- 
-+#define MIN_A_TXPOWER_3593	0
-+#define MAX_A_TXPOWER_3593	31
-+
- #define TXPOWER_G_FROM_DEV(__txpower) \
- 	((__txpower) > MAX_G_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
- 
--#define TXPOWER_G_TO_DEV(__txpower) \
--	clamp_t(char, __txpower, MIN_G_TXPOWER, MAX_G_TXPOWER)
--
- #define TXPOWER_A_FROM_DEV(__txpower) \
- 	((__txpower) > MAX_A_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
- 
--#define TXPOWER_A_TO_DEV(__txpower) \
--	clamp_t(char, __txpower, MIN_A_TXPOWER, MAX_A_TXPOWER)
--
- /*
-  *  Board's maximun TX power limitation
-  */
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -221,6 +221,157 @@ static void rt2800_rf_write(struct rt2x0
- 	mutex_unlock(&rt2x00dev->csr_mutex);
- }
- 
-+static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
-+	[EEPROM_CHIP_ID]		= 0x0000,
-+	[EEPROM_VERSION]		= 0x0001,
-+	[EEPROM_MAC_ADDR_0]		= 0x0002,
-+	[EEPROM_MAC_ADDR_1]		= 0x0003,
-+	[EEPROM_MAC_ADDR_2]		= 0x0004,
-+	[EEPROM_NIC_CONF0]		= 0x001a,
-+	[EEPROM_NIC_CONF1]		= 0x001b,
-+	[EEPROM_FREQ]			= 0x001d,
-+	[EEPROM_LED_AG_CONF]		= 0x001e,
-+	[EEPROM_LED_ACT_CONF]		= 0x001f,
-+	[EEPROM_LED_POLARITY]		= 0x0020,
-+	[EEPROM_NIC_CONF2]		= 0x0021,
-+	[EEPROM_LNA]			= 0x0022,
-+	[EEPROM_RSSI_BG]		= 0x0023,
-+	[EEPROM_RSSI_BG2]		= 0x0024,
-+	[EEPROM_TXMIXER_GAIN_BG]	= 0x0024, /* overlaps with RSSI_BG2 */
-+	[EEPROM_RSSI_A]			= 0x0025,
-+	[EEPROM_RSSI_A2]		= 0x0026,
-+	[EEPROM_TXMIXER_GAIN_A]		= 0x0026, /* overlaps with RSSI_A2 */
-+	[EEPROM_EIRP_MAX_TX_POWER]	= 0x0027,
-+	[EEPROM_TXPOWER_DELTA]		= 0x0028,
-+	[EEPROM_TXPOWER_BG1]		= 0x0029,
-+	[EEPROM_TXPOWER_BG2]		= 0x0030,
-+	[EEPROM_TSSI_BOUND_BG1]		= 0x0037,
-+	[EEPROM_TSSI_BOUND_BG2]		= 0x0038,
-+	[EEPROM_TSSI_BOUND_BG3]		= 0x0039,
-+	[EEPROM_TSSI_BOUND_BG4]		= 0x003a,
-+	[EEPROM_TSSI_BOUND_BG5]		= 0x003b,
-+	[EEPROM_TXPOWER_A1]		= 0x003c,
-+	[EEPROM_TXPOWER_A2]		= 0x0053,
-+	[EEPROM_TSSI_BOUND_A1]		= 0x006a,
-+	[EEPROM_TSSI_BOUND_A2]		= 0x006b,
-+	[EEPROM_TSSI_BOUND_A3]		= 0x006c,
-+	[EEPROM_TSSI_BOUND_A4]		= 0x006d,
-+	[EEPROM_TSSI_BOUND_A5]		= 0x006e,
-+	[EEPROM_TXPOWER_BYRATE]		= 0x006f,
-+	[EEPROM_BBP_START]		= 0x0078,
-+};
-+
-+static const unsigned int rt2800_eeprom_map_ext[EEPROM_WORD_COUNT] = {
-+	[EEPROM_CHIP_ID]		= 0x0000,
-+	[EEPROM_VERSION]		= 0x0001,
-+	[EEPROM_MAC_ADDR_0]		= 0x0002,
-+	[EEPROM_MAC_ADDR_1]		= 0x0003,
-+	[EEPROM_MAC_ADDR_2]		= 0x0004,
-+	[EEPROM_NIC_CONF0]		= 0x001a,
-+	[EEPROM_NIC_CONF1]		= 0x001b,
-+	[EEPROM_NIC_CONF2]		= 0x001c,
-+	[EEPROM_EIRP_MAX_TX_POWER]	= 0x0020,
-+	[EEPROM_FREQ]			= 0x0022,
-+	[EEPROM_LED_AG_CONF]		= 0x0023,
-+	[EEPROM_LED_ACT_CONF]		= 0x0024,
-+	[EEPROM_LED_POLARITY]		= 0x0025,
-+	[EEPROM_LNA]			= 0x0026,
-+	[EEPROM_EXT_LNA2]		= 0x0027,
-+	[EEPROM_RSSI_BG]		= 0x0028,
-+	[EEPROM_TXPOWER_DELTA]		= 0x0028, /* Overlaps with RSSI_BG */
-+	[EEPROM_RSSI_BG2]		= 0x0029,
-+	[EEPROM_TXMIXER_GAIN_BG]	= 0x0029, /* Overlaps with RSSI_BG2 */
-+	[EEPROM_RSSI_A]			= 0x002a,
-+	[EEPROM_RSSI_A2]		= 0x002b,
-+	[EEPROM_TXMIXER_GAIN_A]		= 0x002b, /* Overlaps with RSSI_A2 */
-+	[EEPROM_TXPOWER_BG1]		= 0x0030,
-+	[EEPROM_TXPOWER_BG2]		= 0x0037,
-+	[EEPROM_EXT_TXPOWER_BG3]	= 0x003e,
-+	[EEPROM_TSSI_BOUND_BG1]		= 0x0045,
-+	[EEPROM_TSSI_BOUND_BG2]		= 0x0046,
-+	[EEPROM_TSSI_BOUND_BG3]		= 0x0047,
-+	[EEPROM_TSSI_BOUND_BG4]		= 0x0048,
-+	[EEPROM_TSSI_BOUND_BG5]		= 0x0049,
-+	[EEPROM_TXPOWER_A1]		= 0x004b,
-+	[EEPROM_TXPOWER_A2]		= 0x0065,
-+	[EEPROM_EXT_TXPOWER_A3]		= 0x007f,
-+	[EEPROM_TSSI_BOUND_A1]		= 0x009a,
-+	[EEPROM_TSSI_BOUND_A2]		= 0x009b,
-+	[EEPROM_TSSI_BOUND_A3]		= 0x009c,
-+	[EEPROM_TSSI_BOUND_A4]		= 0x009d,
-+	[EEPROM_TSSI_BOUND_A5]		= 0x009e,
-+	[EEPROM_TXPOWER_BYRATE]		= 0x00a0,
-+};
-+
-+static unsigned int rt2800_eeprom_word_index(struct rt2x00_dev *rt2x00dev,
-+					     const enum rt2800_eeprom_word word)
-+{
-+	const unsigned int *map;
-+	unsigned int index;
-+
-+	if (WARN_ONCE(word >= EEPROM_WORD_COUNT,
-+		      "%s: invalid EEPROM word %d\n",
-+		      wiphy_name(rt2x00dev->hw->wiphy), word))
-+		return 0;
-+
-+	if (rt2x00_rt(rt2x00dev, RT3593))
-+		map = rt2800_eeprom_map_ext;
-+	else
-+		map = rt2800_eeprom_map;
-+
-+	index = map[word];
-+
-+	/* Index 0 is valid only for EEPROM_CHIP_ID.
-+	 * Otherwise it means that the offset of the
-+	 * given word is not initialized in the map,
-+	 * or that the field is not usable on the
-+	 * actual chipset.
-+	 */
-+	WARN_ONCE(word != EEPROM_CHIP_ID && index == 0,
-+		  "%s: invalid access of EEPROM word %d\n",
-+		  wiphy_name(rt2x00dev->hw->wiphy), word);
-+
-+	return index;
-+}
-+
-+static void *rt2800_eeprom_addr(struct rt2x00_dev *rt2x00dev,
-+				const enum rt2800_eeprom_word word)
-+{
-+	unsigned int index;
-+
-+	index = rt2800_eeprom_word_index(rt2x00dev, word);
-+	return rt2x00_eeprom_addr(rt2x00dev, index);
-+}
-+
-+static void rt2800_eeprom_read(struct rt2x00_dev *rt2x00dev,
-+			       const enum rt2800_eeprom_word word, u16 *data)
-+{
-+	unsigned int index;
-+
-+	index = rt2800_eeprom_word_index(rt2x00dev, word);
-+	rt2x00_eeprom_read(rt2x00dev, index, data);
-+}
-+
-+static void rt2800_eeprom_write(struct rt2x00_dev *rt2x00dev,
-+				const enum rt2800_eeprom_word word, u16 data)
-+{
-+	unsigned int index;
-+
-+	index = rt2800_eeprom_word_index(rt2x00dev, word);
-+	rt2x00_eeprom_write(rt2x00dev, index, data);
-+}
-+
-+static void rt2800_eeprom_read_from_array(struct rt2x00_dev *rt2x00dev,
-+					  const enum rt2800_eeprom_word array,
-+					  unsigned int offset,
-+					  u16 *data)
-+{
-+	unsigned int index;
-+
-+	index = rt2800_eeprom_word_index(rt2x00dev, array);
-+	rt2x00_eeprom_read(rt2x00dev, index + offset, data);
-+}
-+
- static int rt2800_enable_wlan_rt3290(struct rt2x00_dev *rt2x00dev)
- {
- 	u32 reg;
-@@ -370,6 +521,29 @@ void rt2800_disable_wpdma(struct rt2x00_
- }
- EXPORT_SYMBOL_GPL(rt2800_disable_wpdma);
- 
-+void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
-+			       unsigned short *txwi_size,
-+			       unsigned short *rxwi_size)
-+{
-+	switch (rt2x00dev->chip.rt) {
-+	case RT3593:
-+		*txwi_size = TXWI_DESC_SIZE_4WORDS;
-+		*rxwi_size = RXWI_DESC_SIZE_5WORDS;
-+		break;
-+
-+	case RT5592:
-+		*txwi_size = TXWI_DESC_SIZE_5WORDS;
-+		*rxwi_size = RXWI_DESC_SIZE_6WORDS;
-+		break;
-+
-+	default:
-+		*txwi_size = TXWI_DESC_SIZE_4WORDS;
-+		*rxwi_size = RXWI_DESC_SIZE_4WORDS;
-+		break;
-+	}
-+}
-+EXPORT_SYMBOL_GPL(rt2800_get_txwi_rxwi_size);
-+
- static bool rt2800_check_firmware_crc(const u8 *data, const size_t len)
- {
- 	u16 fw_crc;
-@@ -609,16 +783,16 @@ static int rt2800_agc_to_rssi(struct rt2
- 	u8 offset2;
- 
- 	if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ) {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &eeprom);
- 		offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET0);
- 		offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET1);
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom);
- 		offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG2_OFFSET2);
- 	} else {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &eeprom);
- 		offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET0);
- 		offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET1);
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom);
- 		offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A2_OFFSET2);
- 	}
- 
-@@ -766,6 +940,18 @@ void rt2800_txdone_entry(struct queue_en
- }
- EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
- 
-+static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
-+					  unsigned int index)
-+{
-+	return HW_BEACON_BASE(index);
-+}
-+
-+static inline u8 rt2800_get_beacon_offset(struct rt2x00_dev *rt2x00dev,
-+					  unsigned int index)
-+{
-+	return BEACON_BASE_TO_OFFSET(rt2800_hw_beacon_base(rt2x00dev, index));
-+}
-+
- void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
- {
- 	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
-@@ -818,7 +1004,8 @@ void rt2800_write_beacon(struct queue_en
- 		return;
- 	}
- 
--	beacon_base = HW_BEACON_OFFSET(entry->entry_idx);
-+	beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
-+
- 	rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
- 				   entry->skb->len + padding_len);
- 
-@@ -837,10 +1024,13 @@ void rt2800_write_beacon(struct queue_en
- EXPORT_SYMBOL_GPL(rt2800_write_beacon);
- 
- static inline void rt2800_clear_beacon_register(struct rt2x00_dev *rt2x00dev,
--						unsigned int beacon_base)
-+						unsigned int index)
- {
- 	int i;
- 	const int txwi_desc_size = rt2x00dev->bcn->winfo_size;
-+	unsigned int beacon_base;
-+
-+	beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);
- 
- 	/*
- 	 * For the Beacon base registers we only need to clear
-@@ -867,8 +1057,7 @@ void rt2800_clear_beacon(struct queue_en
- 	/*
- 	 * Clear beacon.
- 	 */
--	rt2800_clear_beacon_register(rt2x00dev,
--				     HW_BEACON_OFFSET(entry->entry_idx));
-+	rt2800_clear_beacon_register(rt2x00dev, entry->entry_idx);
- 
- 	/*
- 	 * Enabled beaconing again.
-@@ -890,6 +1079,9 @@ const struct rt2x00debug rt2800_rt2x00de
- 		.word_count	= CSR_REG_SIZE / sizeof(u32),
- 	},
- 	.eeprom	= {
-+		/* NOTE: The local EEPROM access functions can't
-+		 * be used here, use the generic versions instead.
-+		 */
- 		.read		= rt2x00_eeprom_read,
- 		.write		= rt2x00_eeprom_write,
- 		.word_base	= EEPROM_BASE,
-@@ -1547,7 +1739,7 @@ static void rt2800_config_3572bt_ant(str
- 	led_r_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 0 : 3;
- 	if (led_g_mode != rt2x00_get_field32(reg, LED_CFG_G_LED_MODE) ||
- 	    led_r_mode != rt2x00_get_field32(reg, LED_CFG_R_LED_MODE)) {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
- 		led_ctrl = rt2x00_get_field16(eeprom, EEPROM_FREQ_LED_MODE);
- 		if (led_ctrl == 0 || led_ctrl > 0x40) {
- 			rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, led_g_mode);
-@@ -1609,7 +1801,7 @@ void rt2800_config_ant(struct rt2x00_dev
- 			rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
- 		break;
- 	case 3:
--		rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
-+		rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
- 		break;
- 	}
- 
-@@ -1622,7 +1814,7 @@ void rt2800_config_ant(struct rt2x00_dev
- 		    rt2x00_rt(rt2x00dev, RT3090) ||
- 		    rt2x00_rt(rt2x00dev, RT3352) ||
- 		    rt2x00_rt(rt2x00dev, RT3390)) {
--			rt2x00_eeprom_read(rt2x00dev,
-+			rt2800_eeprom_read(rt2x00dev,
- 					   EEPROM_NIC_CONF1, &eeprom);
- 			if (rt2x00_get_field16(eeprom,
- 						EEPROM_NIC_CONF1_ANT_DIVERSITY))
-@@ -1649,6 +1841,13 @@ void rt2800_config_ant(struct rt2x00_dev
- 
- 	rt2800_bbp_write(rt2x00dev, 3, r3);
- 	rt2800_bbp_write(rt2x00dev, 1, r1);
-+
-+	if (rt2x00_rt(rt2x00dev, RT3593)) {
-+		if (ant->rx_chain_num == 1)
-+			rt2800_bbp_write(rt2x00dev, 86, 0x00);
-+		else
-+			rt2800_bbp_write(rt2x00dev, 86, 0x46);
-+	}
- }
- EXPORT_SYMBOL_GPL(rt2800_config_ant);
- 
-@@ -1659,22 +1858,73 @@ static void rt2800_config_lna_gain(struc
- 	short lna_gain;
- 
- 	if (libconf->rf.channel <= 14) {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
- 		lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_BG);
- 	} else if (libconf->rf.channel <= 64) {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
- 		lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
- 	} else if (libconf->rf.channel <= 128) {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom);
--		lna_gain = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG2_LNA_A1);
-+		if (rt2x00_rt(rt2x00dev, RT3593)) {
-+			rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom);
-+			lna_gain = rt2x00_get_field16(eeprom,
-+						      EEPROM_EXT_LNA2_A1);
-+		} else {
-+			rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom);
-+			lna_gain = rt2x00_get_field16(eeprom,
-+						      EEPROM_RSSI_BG2_LNA_A1);
-+		}
- 	} else {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom);
--		lna_gain = rt2x00_get_field16(eeprom, EEPROM_RSSI_A2_LNA_A2);
-+		if (rt2x00_rt(rt2x00dev, RT3593)) {
-+			rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom);
-+			lna_gain = rt2x00_get_field16(eeprom,
-+						      EEPROM_EXT_LNA2_A2);
-+		} else {
-+			rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom);
-+			lna_gain = rt2x00_get_field16(eeprom,
-+						      EEPROM_RSSI_A2_LNA_A2);
-+		}
- 	}
- 
- 	rt2x00dev->lna_gain = lna_gain;
- }
- 
-+#define FREQ_OFFSET_BOUND	0x5f
-+
-+static void rt2800_adjust_freq_offset(struct rt2x00_dev *rt2x00dev)
-+{
-+	u8 freq_offset, prev_freq_offset;
-+	u8 rfcsr, prev_rfcsr;
-+
-+	freq_offset = rt2x00_get_field8(rt2x00dev->freq_offset, RFCSR17_CODE);
-+	freq_offset = min_t(u8, freq_offset, FREQ_OFFSET_BOUND);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
-+	prev_rfcsr = rfcsr;
-+
-+	rt2x00_set_field8(&rfcsr, RFCSR17_CODE, freq_offset);
-+	if (rfcsr == prev_rfcsr)
-+		return;
-+
-+	if (rt2x00_is_usb(rt2x00dev)) {
-+		rt2800_mcu_request(rt2x00dev, MCU_FREQ_OFFSET, 0xff,
-+				   freq_offset, prev_rfcsr);
-+		return;
-+	}
-+
-+	prev_freq_offset = rt2x00_get_field8(prev_rfcsr, RFCSR17_CODE);
-+	while (prev_freq_offset != freq_offset) {
-+		if (prev_freq_offset < freq_offset)
-+			prev_freq_offset++;
-+		else
-+			prev_freq_offset--;
-+
-+		rt2x00_set_field8(&rfcsr, RFCSR17_CODE, prev_freq_offset);
-+		rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
-+
-+		usleep_range(1000, 1500);
-+	}
-+}
-+
- static void rt2800_config_channel_rf2xxx(struct rt2x00_dev *rt2x00dev,
- 					 struct ieee80211_conf *conf,
- 					 struct rf_channel *rf,
-@@ -1993,22 +2243,306 @@ static void rt2800_config_channel_rf3052
- 	rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
- }
- 
--#define POWER_BOUND		0x27
--#define POWER_BOUND_5G		0x2b
--#define FREQ_OFFSET_BOUND	0x5f
--
--static void rt2800_adjust_freq_offset(struct rt2x00_dev *rt2x00dev)
-+static void rt2800_config_channel_rf3053(struct rt2x00_dev *rt2x00dev,
-+					 struct ieee80211_conf *conf,
-+					 struct rf_channel *rf,
-+					 struct channel_info *info)
- {
-+	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
-+	u8 txrx_agc_fc;
-+	u8 txrx_h20m;
- 	u8 rfcsr;
-+	u8 bbp;
-+	const bool txbf_enabled = false; /* TODO */
- 
--	rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
--	if (rt2x00dev->freq_offset > FREQ_OFFSET_BOUND)
--		rt2x00_set_field8(&rfcsr, RFCSR17_CODE, FREQ_OFFSET_BOUND);
-+	/* TODO: use TX{0,1,2}FinePowerControl values from EEPROM */
-+	rt2800_bbp_read(rt2x00dev, 109, &bbp);
-+	rt2x00_set_field8(&bbp, BBP109_TX0_POWER, 0);
-+	rt2x00_set_field8(&bbp, BBP109_TX1_POWER, 0);
-+	rt2800_bbp_write(rt2x00dev, 109, bbp);
-+
-+	rt2800_bbp_read(rt2x00dev, 110, &bbp);
-+	rt2x00_set_field8(&bbp, BBP110_TX2_POWER, 0);
-+	rt2800_bbp_write(rt2x00dev, 110, bbp);
-+
-+	if (rf->channel <= 14) {
-+		/* Restore BBP 25 & 26 for 2.4 GHz */
-+		rt2800_bbp_write(rt2x00dev, 25, drv_data->bbp25);
-+		rt2800_bbp_write(rt2x00dev, 26, drv_data->bbp26);
-+	} else {
-+		/* Hard code BBP 25 & 26 for 5GHz */
-+
-+		/* Enable IQ Phase correction */
-+		rt2800_bbp_write(rt2x00dev, 25, 0x09);
-+		/* Setup IQ Phase correction value */
-+		rt2800_bbp_write(rt2x00dev, 26, 0xff);
-+	}
-+
-+	rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
-+	rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3 & 0xf);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 11, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR11_R, (rf->rf2 & 0x3));
-+	rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 11, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR11_PLL_IDOH, 1);
-+	if (rf->channel <= 14)
-+		rt2x00_set_field8(&rfcsr, RFCSR11_PLL_MOD, 1);
- 	else
--		rt2x00_set_field8(&rfcsr, RFCSR17_CODE, rt2x00dev->freq_offset);
--	rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
-+		rt2x00_set_field8(&rfcsr, RFCSR11_PLL_MOD, 2);
-+	rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 53, &rfcsr);
-+	if (rf->channel <= 14) {
-+		rfcsr = 0;
-+		rt2x00_set_field8(&rfcsr, RFCSR53_TX_POWER,
-+				  info->default_power1 & 0x1f);
-+	} else {
-+		if (rt2x00_is_usb(rt2x00dev))
-+			rfcsr = 0x40;
-+
-+		rt2x00_set_field8(&rfcsr, RFCSR53_TX_POWER,
-+				  ((info->default_power1 & 0x18) << 1) |
-+				  (info->default_power1 & 7));
-+	}
-+	rt2800_rfcsr_write(rt2x00dev, 53, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 55, &rfcsr);
-+	if (rf->channel <= 14) {
-+		rfcsr = 0;
-+		rt2x00_set_field8(&rfcsr, RFCSR55_TX_POWER,
-+				  info->default_power2 & 0x1f);
-+	} else {
-+		if (rt2x00_is_usb(rt2x00dev))
-+			rfcsr = 0x40;
-+
-+		rt2x00_set_field8(&rfcsr, RFCSR55_TX_POWER,
-+				  ((info->default_power2 & 0x18) << 1) |
-+				  (info->default_power2 & 7));
-+	}
-+	rt2800_rfcsr_write(rt2x00dev, 55, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 54, &rfcsr);
-+	if (rf->channel <= 14) {
-+		rfcsr = 0;
-+		rt2x00_set_field8(&rfcsr, RFCSR54_TX_POWER,
-+				  info->default_power3 & 0x1f);
-+	} else {
-+		if (rt2x00_is_usb(rt2x00dev))
-+			rfcsr = 0x40;
-+
-+		rt2x00_set_field8(&rfcsr, RFCSR54_TX_POWER,
-+				  ((info->default_power3 & 0x18) << 1) |
-+				  (info->default_power3 & 7));
-+	}
-+	rt2800_rfcsr_write(rt2x00dev, 54, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
-+
-+	switch (rt2x00dev->default_ant.tx_chain_num) {
-+	case 3:
-+		rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
-+		/* fallthrough */
-+	case 2:
-+		rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
-+		/* fallthrough */
-+	case 1:
-+		rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
-+		break;
-+	}
-+
-+	switch (rt2x00dev->default_ant.rx_chain_num) {
-+	case 3:
-+		rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
-+		/* fallthrough */
-+	case 2:
-+		rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
-+		/* fallthrough */
-+	case 1:
-+		rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
-+		break;
-+	}
-+	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
-+
-+	rt2800_adjust_freq_offset(rt2x00dev);
-+
-+	if (conf_is_ht40(conf)) {
-+		txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw40,
-+						RFCSR24_TX_AGC_FC);
-+		txrx_h20m = rt2x00_get_field8(drv_data->calibration_bw40,
-+					      RFCSR24_TX_H20M);
-+	} else {
-+		txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw20,
-+						RFCSR24_TX_AGC_FC);
-+		txrx_h20m = rt2x00_get_field8(drv_data->calibration_bw20,
-+					      RFCSR24_TX_H20M);
-+	}
-+
-+	/* NOTE: the reference driver does not writes the new value
-+	 * back to RFCSR 32
-+	 */
-+	rt2800_rfcsr_read(rt2x00dev, 32, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR32_TX_AGC_FC, txrx_agc_fc);
-+
-+	if (rf->channel <= 14)
-+		rfcsr = 0xa0;
-+	else
-+		rfcsr = 0x80;
-+	rt2800_rfcsr_write(rt2x00dev, 31, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR30_TX_H20M, txrx_h20m);
-+	rt2x00_set_field8(&rfcsr, RFCSR30_RX_H20M, txrx_h20m);
-+	rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
-+
-+	/* Band selection */
-+	rt2800_rfcsr_read(rt2x00dev, 36, &rfcsr);
-+	if (rf->channel <= 14)
-+		rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1);
-+	else
-+		rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0);
-+	rt2800_rfcsr_write(rt2x00dev, 36, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 34, &rfcsr);
-+	if (rf->channel <= 14)
-+		rfcsr = 0x3c;
-+	else
-+		rfcsr = 0x20;
-+	rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 12, &rfcsr);
-+	if (rf->channel <= 14)
-+		rfcsr = 0x1a;
-+	else
-+		rfcsr = 0x12;
-+	rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
-+	if (rf->channel >= 1 && rf->channel <= 14)
-+		rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 1);
-+	else if (rf->channel >= 36 && rf->channel <= 64)
-+		rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 2);
-+	else if (rf->channel >= 100 && rf->channel <= 128)
-+		rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 2);
-+	else
-+		rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 1);
-+	rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR30_RX_VCM, 2);
-+	rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
-+
-+	rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
-+
-+	if (rf->channel <= 14) {
-+		rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
-+		rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
-+	} else {
-+		rt2800_rfcsr_write(rt2x00dev, 10, 0xd8);
-+		rt2800_rfcsr_write(rt2x00dev, 13, 0x23);
-+	}
-+
-+	rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR51_BITS01, 1);
-+	rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr);
-+	if (rf->channel <= 14) {
-+		rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, 5);
-+		rt2x00_set_field8(&rfcsr, RFCSR51_BITS57, 3);
-+	} else {
-+		rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, 4);
-+		rt2x00_set_field8(&rfcsr, RFCSR51_BITS57, 2);
-+	}
-+	rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 49, &rfcsr);
-+	if (rf->channel <= 14)
-+		rt2x00_set_field8(&rfcsr, RFCSR49_TX_LO1_IC, 3);
-+	else
-+		rt2x00_set_field8(&rfcsr, RFCSR49_TX_LO1_IC, 2);
-+
-+	if (txbf_enabled)
-+		rt2x00_set_field8(&rfcsr, RFCSR49_TX_DIV, 1);
-+
-+	rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR50_TX_LO1_EN, 0);
-+	rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 57, &rfcsr);
-+	if (rf->channel <= 14)
-+		rt2x00_set_field8(&rfcsr, RFCSR57_DRV_CC, 0x1b);
-+	else
-+		rt2x00_set_field8(&rfcsr, RFCSR57_DRV_CC, 0x0f);
-+	rt2800_rfcsr_write(rt2x00dev, 57, rfcsr);
-+
-+	if (rf->channel <= 14) {
-+		rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
-+		rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
-+	} else {
-+		rt2800_rfcsr_write(rt2x00dev, 44, 0x9b);
-+		rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
-+	}
-+
-+	/* Initiate VCO calibration */
-+	rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
-+	if (rf->channel <= 14) {
-+		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
-+	} else {
-+		rt2x00_set_field8(&rfcsr, RFCSR3_BIT1, 1);
-+		rt2x00_set_field8(&rfcsr, RFCSR3_BIT2, 1);
-+		rt2x00_set_field8(&rfcsr, RFCSR3_BIT3, 1);
-+		rt2x00_set_field8(&rfcsr, RFCSR3_BIT4, 1);
-+		rt2x00_set_field8(&rfcsr, RFCSR3_BIT5, 1);
-+		rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
-+	}
-+	rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
-+
-+	if (rf->channel >= 1 && rf->channel <= 14) {
-+		rfcsr = 0x23;
-+		if (txbf_enabled)
-+			rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
-+		rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
-+
-+		rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
-+	} else if (rf->channel >= 36 && rf->channel <= 64) {
-+		rfcsr = 0x36;
-+		if (txbf_enabled)
-+			rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
-+		rt2800_rfcsr_write(rt2x00dev, 39, 0x36);
-+
-+		rt2800_rfcsr_write(rt2x00dev, 45, 0xeb);
-+	} else if (rf->channel >= 100 && rf->channel <= 128) {
-+		rfcsr = 0x32;
-+		if (txbf_enabled)
-+			rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
-+		rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
-+
-+		rt2800_rfcsr_write(rt2x00dev, 45, 0xb3);
-+	} else {
-+		rfcsr = 0x30;
-+		if (txbf_enabled)
-+			rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
-+		rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
-+
-+		rt2800_rfcsr_write(rt2x00dev, 45, 0x9b);
-+	}
- }
- 
-+#define POWER_BOUND		0x27
-+#define POWER_BOUND_5G		0x2b
-+
- static void rt2800_config_channel_rf3290(struct rt2x00_dev *rt2x00dev,
- 					 struct ieee80211_conf *conf,
- 					 struct rf_channel *rf,
-@@ -2563,6 +3097,23 @@ static void rt2800_iq_calibrate(struct r
- 	rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0);
- }
- 
-+static char rt2800_txpower_to_dev(struct rt2x00_dev *rt2x00dev,
-+				  unsigned int channel,
-+				  char txpower)
-+{
-+	if (rt2x00_rt(rt2x00dev, RT3593))
-+		txpower = rt2x00_get_field8(txpower, EEPROM_TXPOWER_ALC);
-+
-+	if (channel <= 14)
-+		return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER);
-+
-+	if (rt2x00_rt(rt2x00dev, RT3593))
-+		return clamp_t(char, txpower, MIN_A_TXPOWER_3593,
-+			       MAX_A_TXPOWER_3593);
-+	else
-+		return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
-+}
-+
- static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
- 				  struct ieee80211_conf *conf,
- 				  struct rf_channel *rf,
-@@ -2572,13 +3123,14 @@ static void rt2800_config_channel(struct
- 	unsigned int tx_pin;
- 	u8 bbp, rfcsr;
- 
--	if (rf->channel <= 14) {
--		info->default_power1 = TXPOWER_G_TO_DEV(info->default_power1);
--		info->default_power2 = TXPOWER_G_TO_DEV(info->default_power2);
--	} else {
--		info->default_power1 = TXPOWER_A_TO_DEV(info->default_power1);
--		info->default_power2 = TXPOWER_A_TO_DEV(info->default_power2);
--	}
-+	info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
-+						     info->default_power1);
-+	info->default_power2 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
-+						     info->default_power2);
-+	if (rt2x00dev->default_ant.tx_chain_num > 2)
-+		info->default_power3 =
-+			rt2800_txpower_to_dev(rt2x00dev, rf->channel,
-+					      info->default_power3);
- 
- 	switch (rt2x00dev->chip.rf) {
- 	case RF2020:
-@@ -2591,6 +3143,9 @@ static void rt2800_config_channel(struct
- 	case RF3052:
- 		rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
- 		break;
-+	case RF3053:
-+		rt2800_config_channel_rf3053(rt2x00dev, conf, rf, info);
-+		break;
- 	case RF3290:
- 		rt2800_config_channel_rf3290(rt2x00dev, conf, rf, info);
- 		break;
-@@ -2636,6 +3191,23 @@ static void rt2800_config_channel(struct
- 		rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
- 		rt2800_bbp_write(rt2x00dev, 27, 0x20);
- 		rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
-+	} else if (rt2x00_rt(rt2x00dev, RT3593)) {
-+		if (rf->channel > 14) {
-+			/* Disable CCK Packet detection on 5GHz */
-+			rt2800_bbp_write(rt2x00dev, 70, 0x00);
-+		} else {
-+			rt2800_bbp_write(rt2x00dev, 70, 0x0a);
-+		}
-+
-+		if (conf_is_ht40(conf))
-+			rt2800_bbp_write(rt2x00dev, 105, 0x04);
-+		else
-+			rt2800_bbp_write(rt2x00dev, 105, 0x34);
-+
-+		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
-+		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
-+		rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
-+		rt2800_bbp_write(rt2x00dev, 77, 0x98);
- 	} else {
- 		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
- 		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
-@@ -2651,16 +3223,27 @@ static void rt2800_config_channel(struct
- 				rt2800_bbp_write(rt2x00dev, 82, 0x62);
- 				rt2800_bbp_write(rt2x00dev, 75, 0x46);
- 			} else {
--				rt2800_bbp_write(rt2x00dev, 82, 0x84);
-+				if (rt2x00_rt(rt2x00dev, RT3593))
-+					rt2800_bbp_write(rt2x00dev, 82, 0x62);
-+				else
-+					rt2800_bbp_write(rt2x00dev, 82, 0x84);
- 				rt2800_bbp_write(rt2x00dev, 75, 0x50);
- 			}
-+			if (rt2x00_rt(rt2x00dev, RT3593))
-+				rt2800_bbp_write(rt2x00dev, 83, 0x8a);
- 		}
-+
- 	} else {
- 		if (rt2x00_rt(rt2x00dev, RT3572))
- 			rt2800_bbp_write(rt2x00dev, 82, 0x94);
-+		else if (rt2x00_rt(rt2x00dev, RT3593))
-+			rt2800_bbp_write(rt2x00dev, 82, 0x82);
- 		else
- 			rt2800_bbp_write(rt2x00dev, 82, 0xf2);
- 
-+		if (rt2x00_rt(rt2x00dev, RT3593))
-+			rt2800_bbp_write(rt2x00dev, 83, 0x9a);
-+
- 		if (test_bit(CAPABILITY_EXTERNAL_LNA_A, &rt2x00dev->cap_flags))
- 			rt2800_bbp_write(rt2x00dev, 75, 0x46);
- 		else
-@@ -2731,6 +3314,41 @@ static void rt2800_config_channel(struct
- 	if (rt2x00_rt(rt2x00dev, RT3572))
- 		rt2800_rfcsr_write(rt2x00dev, 8, 0x80);
- 
-+	if (rt2x00_rt(rt2x00dev, RT3593)) {
-+		if (rt2x00_is_usb(rt2x00dev)) {
-+			rt2800_register_read(rt2x00dev, GPIO_CTRL, &reg);
-+
-+			/* Band selection. GPIO #8 controls all paths */
-+			rt2x00_set_field32(&reg, GPIO_CTRL_DIR8, 0);
-+			if (rf->channel <= 14)
-+				rt2x00_set_field32(&reg, GPIO_CTRL_VAL8, 1);
-+			else
-+				rt2x00_set_field32(&reg, GPIO_CTRL_VAL8, 0);
-+
-+			rt2x00_set_field32(&reg, GPIO_CTRL_DIR4, 0);
-+			rt2x00_set_field32(&reg, GPIO_CTRL_DIR7, 0);
-+
-+			/* LNA PE control.
-+			* GPIO #4 controls PE0 and PE1,
-+			* GPIO #7 controls PE2
-+			*/
-+			rt2x00_set_field32(&reg, GPIO_CTRL_VAL4, 1);
-+			rt2x00_set_field32(&reg, GPIO_CTRL_VAL7, 1);
-+
-+			rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
-+		}
-+
-+		/* AGC init */
-+		if (rf->channel <= 14)
-+			reg = 0x1c + 2 * rt2x00dev->lna_gain;
-+		else
-+			reg = 0x22 + ((rt2x00dev->lna_gain * 5) / 3);
-+
-+		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
-+
-+		usleep_range(1000, 1500);
-+	}
-+
- 	if (rt2x00_rt(rt2x00dev, RT5592)) {
- 		rt2800_bbp_write(rt2x00dev, 195, 141);
- 		rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a);
-@@ -2790,6 +3408,13 @@ static int rt2800_get_gain_calibration_d
- 	int i;
- 
- 	/*
-+	 * First check if temperature compensation is supported.
-+	 */
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
-+	if (!rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_TX_ALC))
-+		return 0;
-+
-+	/*
- 	 * Read TSSI boundaries for temperature compensation from
- 	 * the EEPROM.
- 	 *
-@@ -2798,62 +3423,62 @@ static int rt2800_get_gain_calibration_d
- 	 * Example TSSI bounds  0xF0 0xD0 0xB5 0xA0 0x88 0x45 0x25 0x15 0x00
- 	 */
- 	if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ) {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG1, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG1, &eeprom);
- 		tssi_bounds[0] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG1_MINUS4);
- 		tssi_bounds[1] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG1_MINUS3);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG2, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG2, &eeprom);
- 		tssi_bounds[2] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG2_MINUS2);
- 		tssi_bounds[3] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG2_MINUS1);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG3, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG3, &eeprom);
- 		tssi_bounds[4] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG3_REF);
- 		tssi_bounds[5] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG3_PLUS1);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG4, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG4, &eeprom);
- 		tssi_bounds[6] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG4_PLUS2);
- 		tssi_bounds[7] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG4_PLUS3);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG5, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG5, &eeprom);
- 		tssi_bounds[8] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_BG5_PLUS4);
- 
- 		step = rt2x00_get_field16(eeprom,
- 					  EEPROM_TSSI_BOUND_BG5_AGC_STEP);
- 	} else {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A1, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A1, &eeprom);
- 		tssi_bounds[0] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A1_MINUS4);
- 		tssi_bounds[1] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A1_MINUS3);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A2, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A2, &eeprom);
- 		tssi_bounds[2] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A2_MINUS2);
- 		tssi_bounds[3] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A2_MINUS1);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A3, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A3, &eeprom);
- 		tssi_bounds[4] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A3_REF);
- 		tssi_bounds[5] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A3_PLUS1);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A4, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A4, &eeprom);
- 		tssi_bounds[6] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A4_PLUS2);
- 		tssi_bounds[7] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A4_PLUS3);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A5, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A5, &eeprom);
- 		tssi_bounds[8] = rt2x00_get_field16(eeprom,
- 					EEPROM_TSSI_BOUND_A5_PLUS4);
- 
-@@ -2899,7 +3524,7 @@ static int rt2800_get_txpower_bw_comp(st
- 	u8 comp_type;
- 	int comp_value = 0;
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_TXPOWER_DELTA, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_TXPOWER_DELTA, &eeprom);
- 
- 	/*
- 	 * HT40 compensation not required.
-@@ -2966,6 +3591,9 @@ static u8 rt2800_compensate_txpower(stru
- 	u8 eirp_txpower_criterion;
- 	u8 reg_limit;
- 
-+	if (rt2x00_rt(rt2x00dev, RT3593))
-+		return min_t(u8, txpower, 0xc);
-+
- 	if (test_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags)) {
- 		/*
- 		 * Check if eirp txpower exceed txpower_limit.
-@@ -2974,12 +3602,12 @@ static u8 rt2800_compensate_txpower(stru
- 		 * .11b data rate need add additional 4dbm
- 		 * when calculating eirp txpower.
- 		 */
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TXPOWER_BYRATE + 1,
--				   &eeprom);
-+		rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+					      1, &eeprom);
- 		criterion = rt2x00_get_field16(eeprom,
- 					       EEPROM_TXPOWER_BYRATE_RATE0);
- 
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER,
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER,
- 				   &eeprom);
- 
- 		if (band == IEEE80211_BAND_2GHZ)
-@@ -3001,6 +3629,412 @@ static u8 rt2800_compensate_txpower(stru
- 	return min_t(u8, txpower, 0xc);
- }
- 
-+
-+enum {
-+	TX_PWR_CFG_0_IDX,
-+	TX_PWR_CFG_1_IDX,
-+	TX_PWR_CFG_2_IDX,
-+	TX_PWR_CFG_3_IDX,
-+	TX_PWR_CFG_4_IDX,
-+	TX_PWR_CFG_5_IDX,
-+	TX_PWR_CFG_6_IDX,
-+	TX_PWR_CFG_7_IDX,
-+	TX_PWR_CFG_8_IDX,
-+	TX_PWR_CFG_9_IDX,
-+	TX_PWR_CFG_0_EXT_IDX,
-+	TX_PWR_CFG_1_EXT_IDX,
-+	TX_PWR_CFG_2_EXT_IDX,
-+	TX_PWR_CFG_3_EXT_IDX,
-+	TX_PWR_CFG_4_EXT_IDX,
-+	TX_PWR_CFG_IDX_COUNT,
-+};
-+
-+static void rt2800_config_txpower_rt3593(struct rt2x00_dev *rt2x00dev,
-+					 struct ieee80211_channel *chan,
-+					 int power_level)
-+{
-+	u8 txpower;
-+	u16 eeprom;
-+	u32 regs[TX_PWR_CFG_IDX_COUNT];
-+	unsigned int offset;
-+	enum ieee80211_band band = chan->band;
-+	int delta;
-+	int i;
-+
-+	memset(regs, '\0', sizeof(regs));
-+
-+	/* TODO: adapt TX power reduction from the rt28xx code */
-+
-+	/* calculate temperature compensation delta */
-+	delta = rt2800_get_gain_calibration_delta(rt2x00dev);
-+
-+	if (band == IEEE80211_BAND_5GHZ)
-+		offset = 16;
-+	else
-+		offset = 0;
-+
-+	if (test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
-+		offset += 8;
-+
-+	/* read the next four txpower values */
-+	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+				      offset, &eeprom);
-+
-+	/* CCK 1MBS,2MBS */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 1, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
-+			   TX_PWR_CFG_0_CCK1_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
-+			   TX_PWR_CFG_0_CCK1_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
-+			   TX_PWR_CFG_0_EXT_CCK1_CH2, txpower);
-+
-+	/* CCK 5.5MBS,11MBS */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 1, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
-+			   TX_PWR_CFG_0_CCK5_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
-+			   TX_PWR_CFG_0_CCK5_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
-+			   TX_PWR_CFG_0_EXT_CCK5_CH2, txpower);
-+
-+	/* OFDM 6MBS,9MBS */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
-+			   TX_PWR_CFG_0_OFDM6_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
-+			   TX_PWR_CFG_0_OFDM6_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
-+			   TX_PWR_CFG_0_EXT_OFDM6_CH2, txpower);
-+
-+	/* OFDM 12MBS,18MBS */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
-+			   TX_PWR_CFG_0_OFDM12_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
-+			   TX_PWR_CFG_0_OFDM12_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
-+			   TX_PWR_CFG_0_EXT_OFDM12_CH2, txpower);
-+
-+	/* read the next four txpower values */
-+	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+				      offset + 1, &eeprom);
-+
-+	/* OFDM 24MBS,36MBS */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
-+			   TX_PWR_CFG_1_OFDM24_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
-+			   TX_PWR_CFG_1_OFDM24_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
-+			   TX_PWR_CFG_1_EXT_OFDM24_CH2, txpower);
-+
-+	/* OFDM 48MBS */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
-+			   TX_PWR_CFG_1_OFDM48_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
-+			   TX_PWR_CFG_1_OFDM48_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
-+			   TX_PWR_CFG_1_EXT_OFDM48_CH2, txpower);
-+
-+	/* OFDM 54MBS */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
-+			   TX_PWR_CFG_7_OFDM54_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
-+			   TX_PWR_CFG_7_OFDM54_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
-+			   TX_PWR_CFG_7_OFDM54_CH2, txpower);
-+
-+	/* read the next four txpower values */
-+	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+				      offset + 2, &eeprom);
-+
-+	/* MCS 0,1 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
-+			   TX_PWR_CFG_1_MCS0_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
-+			   TX_PWR_CFG_1_MCS0_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
-+			   TX_PWR_CFG_1_EXT_MCS0_CH2, txpower);
-+
-+	/* MCS 2,3 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
-+			   TX_PWR_CFG_1_MCS2_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
-+			   TX_PWR_CFG_1_MCS2_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
-+			   TX_PWR_CFG_1_EXT_MCS2_CH2, txpower);
-+
-+	/* MCS 4,5 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
-+			   TX_PWR_CFG_2_MCS4_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
-+			   TX_PWR_CFG_2_MCS4_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
-+			   TX_PWR_CFG_2_EXT_MCS4_CH2, txpower);
-+
-+	/* MCS 6 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
-+			   TX_PWR_CFG_2_MCS6_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
-+			   TX_PWR_CFG_2_MCS6_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
-+			   TX_PWR_CFG_2_EXT_MCS6_CH2, txpower);
-+
-+	/* read the next four txpower values */
-+	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+				      offset + 3, &eeprom);
-+
-+	/* MCS 7 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
-+			   TX_PWR_CFG_7_MCS7_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
-+			   TX_PWR_CFG_7_MCS7_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
-+			   TX_PWR_CFG_7_MCS7_CH2, txpower);
-+
-+	/* MCS 8,9 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
-+			   TX_PWR_CFG_2_MCS8_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
-+			   TX_PWR_CFG_2_MCS8_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
-+			   TX_PWR_CFG_2_EXT_MCS8_CH2, txpower);
-+
-+	/* MCS 10,11 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
-+			   TX_PWR_CFG_2_MCS10_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
-+			   TX_PWR_CFG_2_MCS10_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
-+			   TX_PWR_CFG_2_EXT_MCS10_CH2, txpower);
-+
-+	/* MCS 12,13 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
-+			   TX_PWR_CFG_3_MCS12_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
-+			   TX_PWR_CFG_3_MCS12_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
-+			   TX_PWR_CFG_3_EXT_MCS12_CH2, txpower);
-+
-+	/* read the next four txpower values */
-+	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+				      offset + 4, &eeprom);
-+
-+	/* MCS 14 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
-+			   TX_PWR_CFG_3_MCS14_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
-+			   TX_PWR_CFG_3_MCS14_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
-+			   TX_PWR_CFG_3_EXT_MCS14_CH2, txpower);
-+
-+	/* MCS 15 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
-+			   TX_PWR_CFG_8_MCS15_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
-+			   TX_PWR_CFG_8_MCS15_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
-+			   TX_PWR_CFG_8_MCS15_CH2, txpower);
-+
-+	/* MCS 16,17 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
-+			   TX_PWR_CFG_5_MCS16_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
-+			   TX_PWR_CFG_5_MCS16_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
-+			   TX_PWR_CFG_5_MCS16_CH2, txpower);
-+
-+	/* MCS 18,19 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
-+			   TX_PWR_CFG_5_MCS18_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
-+			   TX_PWR_CFG_5_MCS18_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
-+			   TX_PWR_CFG_5_MCS18_CH2, txpower);
-+
-+	/* read the next four txpower values */
-+	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+				      offset + 5, &eeprom);
-+
-+	/* MCS 20,21 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
-+			   TX_PWR_CFG_6_MCS20_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
-+			   TX_PWR_CFG_6_MCS20_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
-+			   TX_PWR_CFG_6_MCS20_CH2, txpower);
-+
-+	/* MCS 22 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
-+			   TX_PWR_CFG_6_MCS22_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
-+			   TX_PWR_CFG_6_MCS22_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
-+			   TX_PWR_CFG_6_MCS22_CH2, txpower);
-+
-+	/* MCS 23 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
-+			   TX_PWR_CFG_8_MCS23_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
-+			   TX_PWR_CFG_8_MCS23_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
-+			   TX_PWR_CFG_8_MCS23_CH2, txpower);
-+
-+	/* read the next four txpower values */
-+	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+				      offset + 6, &eeprom);
-+
-+	/* STBC, MCS 0,1 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
-+			   TX_PWR_CFG_3_STBC0_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
-+			   TX_PWR_CFG_3_STBC0_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
-+			   TX_PWR_CFG_3_EXT_STBC0_CH2, txpower);
-+
-+	/* STBC, MCS 2,3 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
-+			   TX_PWR_CFG_3_STBC2_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
-+			   TX_PWR_CFG_3_STBC2_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
-+			   TX_PWR_CFG_3_EXT_STBC2_CH2, txpower);
-+
-+	/* STBC, MCS 4,5 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_4_EXT_IDX], TX_PWR_CFG_RATE0,
-+			   txpower);
-+
-+	/* STBC, MCS 6 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE2, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE3, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_4_EXT_IDX], TX_PWR_CFG_RATE2,
-+			   txpower);
-+
-+	/* read the next four txpower values */
-+	rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+				      offset + 7, &eeprom);
-+
-+	/* STBC, MCS 7 */
-+	txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
-+	txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
-+					    txpower, delta);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
-+			   TX_PWR_CFG_9_STBC7_CH0, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
-+			   TX_PWR_CFG_9_STBC7_CH1, txpower);
-+	rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
-+			   TX_PWR_CFG_9_STBC7_CH2, txpower);
-+
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_0, regs[TX_PWR_CFG_0_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_1, regs[TX_PWR_CFG_1_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_2, regs[TX_PWR_CFG_2_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_3, regs[TX_PWR_CFG_3_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_4, regs[TX_PWR_CFG_4_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_5, regs[TX_PWR_CFG_5_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_6, regs[TX_PWR_CFG_6_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_7, regs[TX_PWR_CFG_7_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_8, regs[TX_PWR_CFG_8_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, regs[TX_PWR_CFG_9_IDX]);
-+
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_0_EXT,
-+			      regs[TX_PWR_CFG_0_EXT_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_1_EXT,
-+			      regs[TX_PWR_CFG_1_EXT_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_2_EXT,
-+			      regs[TX_PWR_CFG_2_EXT_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_3_EXT,
-+			      regs[TX_PWR_CFG_3_EXT_IDX]);
-+	rt2800_register_write(rt2x00dev, TX_PWR_CFG_4_EXT,
-+			      regs[TX_PWR_CFG_4_EXT_IDX]);
-+
-+	for (i = 0; i < TX_PWR_CFG_IDX_COUNT; i++)
-+		rt2x00_dbg(rt2x00dev,
-+			   "band:%cGHz, BW:%c0MHz, TX_PWR_CFG_%d%s = %08lx\n",
-+			   (band == IEEE80211_BAND_5GHZ) ? '5' : '2',
-+			   (test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)) ?
-+								'4' : '2',
-+			   (i > TX_PWR_CFG_9_IDX) ?
-+					(i - TX_PWR_CFG_9_IDX - 1) : i,
-+			   (i > TX_PWR_CFG_9_IDX) ? "_EXT" : "",
-+			   (unsigned long) regs[i]);
-+}
-+
- /*
-  * We configure transmit power using MAC TX_PWR_CFG_{0,...,N} registers and
-  * BBP R1 register. TX_PWR_CFG_X allow to configure per rate TX power values,
-@@ -3010,9 +4044,9 @@ static u8 rt2800_compensate_txpower(stru
-  * EEPROM_TXPOWER_BYRATE offset. We adjust them and BBP R1 settings according to
-  * current conditions (i.e. band, bandwidth, temperature, user settings).
-  */
--static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
--				  struct ieee80211_channel *chan,
--				  int power_level)
-+static void rt2800_config_txpower_rt28xx(struct rt2x00_dev *rt2x00dev,
-+					 struct ieee80211_channel *chan,
-+					 int power_level)
- {
- 	u8 txpower, r1;
- 	u16 eeprom;
-@@ -3080,8 +4114,8 @@ static void rt2800_config_txpower(struct
- 		rt2800_register_read(rt2x00dev, offset, &reg);
- 
- 		/* read the next four txpower values */
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TXPOWER_BYRATE + i,
--				   &eeprom);
-+		rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+					      i, &eeprom);
- 
- 		is_rate_b = i ? 0 : 1;
- 		/*
-@@ -3129,8 +4163,8 @@ static void rt2800_config_txpower(struct
- 		rt2x00_set_field32(&reg, TX_PWR_CFG_RATE3, txpower);
- 
- 		/* read the next four txpower values */
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_TXPOWER_BYRATE + i + 1,
--				   &eeprom);
-+		rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
-+					      i + 1, &eeprom);
- 
- 		is_rate_b = 0;
- 		/*
-@@ -3184,6 +4218,16 @@ static void rt2800_config_txpower(struct
- 	}
- }
- 
-+static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
-+				  struct ieee80211_channel *chan,
-+				  int power_level)
-+{
-+	if (rt2x00_rt(rt2x00dev, RT3593))
-+		rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level);
-+	else
-+		rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level);
-+}
-+
- void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev)
- {
- 	rt2800_config_txpower(rt2x00dev, rt2x00dev->hw->conf.chandef.chan,
-@@ -3219,6 +4263,7 @@ void rt2800_vco_calibration(struct rt2x0
- 		rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
- 		rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
- 		break;
-+	case RF3053:
- 	case RF3290:
- 	case RF5360:
- 	case RF5370:
-@@ -3442,17 +4487,25 @@ static int rt2800_init_registers(struct 
- 		return ret;
- 
- 	rt2800_register_read(rt2x00dev, BCN_OFFSET0, &reg);
--	rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0, 0xe0); /* 0x3800 */
--	rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1, 0xe8); /* 0x3a00 */
--	rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2, 0xf0); /* 0x3c00 */
--	rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3, 0xf8); /* 0x3e00 */
-+	rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0,
-+			   rt2800_get_beacon_offset(rt2x00dev, 0));
-+	rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1,
-+			   rt2800_get_beacon_offset(rt2x00dev, 1));
-+	rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2,
-+			   rt2800_get_beacon_offset(rt2x00dev, 2));
-+	rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3,
-+			   rt2800_get_beacon_offset(rt2x00dev, 3));
- 	rt2800_register_write(rt2x00dev, BCN_OFFSET0, reg);
- 
- 	rt2800_register_read(rt2x00dev, BCN_OFFSET1, &reg);
--	rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4, 0xc8); /* 0x3200 */
--	rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5, 0xd0); /* 0x3400 */
--	rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6, 0x77); /* 0x1dc0 */
--	rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7, 0x6f); /* 0x1bc0 */
-+	rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4,
-+			   rt2800_get_beacon_offset(rt2x00dev, 4));
-+	rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5,
-+			   rt2800_get_beacon_offset(rt2x00dev, 5));
-+	rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6,
-+			   rt2800_get_beacon_offset(rt2x00dev, 6));
-+	rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7,
-+			   rt2800_get_beacon_offset(rt2x00dev, 7));
- 	rt2800_register_write(rt2x00dev, BCN_OFFSET1, reg);
- 
- 	rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
-@@ -3528,7 +4581,8 @@ static int rt2800_init_registers(struct 
- 		if (rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
- 		    rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E) ||
- 		    rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E)) {
--			rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
-+			rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1,
-+					   &eeprom);
- 			if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_DAC_TEST))
- 				rt2800_register_write(rt2x00dev, TX_SW_CFG2,
- 						      0x0000002c);
-@@ -3559,6 +4613,23 @@ 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, RT3593)) {
-+		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
-+		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
-+		if (rt2x00_rt_rev_lt(rt2x00dev, RT3593, REV_RT3593E)) {
-+			rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1,
-+					   &eeprom);
-+			if (rt2x00_get_field16(eeprom,
-+					       EEPROM_NIC_CONF1_DAC_TEST))
-+				rt2800_register_write(rt2x00dev, TX_SW_CFG2,
-+						      0x0000001f);
-+			else
-+				rt2800_register_write(rt2x00dev, TX_SW_CFG2,
-+						      0x0000000f);
-+		} else {
-+			rt2800_register_write(rt2x00dev, TX_SW_CFG2,
-+					      0x00000000);
-+		}
- 	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
- 		   rt2x00_rt(rt2x00dev, RT5392) ||
- 		   rt2x00_rt(rt2x00dev, RT5592)) {
-@@ -3786,14 +4857,8 @@ static int rt2800_init_registers(struct 
- 	/*
- 	 * Clear all beacons
- 	 */
--	rt2800_clear_beacon_register(rt2x00dev, HW_BEACON_BASE0);
--	rt2800_clear_beacon_register(rt2x00dev, HW_BEACON_BASE1);
--	rt2800_clear_beacon_register(rt2x00dev, HW_BEACON_BASE2);
--	rt2800_clear_beacon_register(rt2x00dev, HW_BEACON_BASE3);
--	rt2800_clear_beacon_register(rt2x00dev, HW_BEACON_BASE4);
--	rt2800_clear_beacon_register(rt2x00dev, HW_BEACON_BASE5);
--	rt2800_clear_beacon_register(rt2x00dev, HW_BEACON_BASE6);
--	rt2800_clear_beacon_register(rt2x00dev, HW_BEACON_BASE7);
-+	for (i = 0; i < 8; i++)
-+		rt2800_clear_beacon_register(rt2x00dev, i);
- 
- 	if (rt2x00_is_usb(rt2x00dev)) {
- 		rt2800_register_read(rt2x00dev, US_CYC_CNT, &reg);
-@@ -3989,7 +5054,7 @@ static void rt2800_disable_unused_dac_ad
- 	u8 value;
- 
- 	rt2800_bbp_read(rt2x00dev, 138, &value);
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
- 	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
- 		value |= 0x20;
- 	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
-@@ -4332,6 +5397,22 @@ static void rt2800_init_bbp_3572(struct 
- 	rt2800_disable_unused_dac_adc(rt2x00dev);
- }
- 
-+static void rt2800_init_bbp_3593(struct rt2x00_dev *rt2x00dev)
-+{
-+	rt2800_init_bbp_early(rt2x00dev);
-+
-+	rt2800_bbp_write(rt2x00dev, 79, 0x13);
-+	rt2800_bbp_write(rt2x00dev, 80, 0x05);
-+	rt2800_bbp_write(rt2x00dev, 81, 0x33);
-+	rt2800_bbp_write(rt2x00dev, 137, 0x0f);
-+
-+	rt2800_bbp_write(rt2x00dev, 84, 0x19);
-+
-+	/* Enable DC filter */
-+	if (rt2x00_rt_rev_gte(rt2x00dev, RT3593, REV_RT3593E))
-+		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
-+}
-+
- static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
- {
- 	int ant, div_mode;
-@@ -4402,7 +5483,7 @@ static void rt2800_init_bbp_53xx(struct 
- 
- 	rt2800_disable_unused_dac_adc(rt2x00dev);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
- 	div_mode = rt2x00_get_field16(eeprom,
- 				      EEPROM_NIC_CONF1_ANT_DIVERSITY);
- 	ant = (div_mode == 3) ? 1 : 0;
-@@ -4488,7 +5569,7 @@ static void rt2800_init_bbp_5592(struct 
- 
- 	rt2800_bbp4_mac_if_ctrl(rt2x00dev);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
- 	div_mode = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_ANT_DIVERSITY);
- 	ant = (div_mode == 3) ? 1 : 0;
- 	rt2800_bbp_read(rt2x00dev, 152, &value);
-@@ -4547,6 +5628,9 @@ static void rt2800_init_bbp(struct rt2x0
- 	case RT3572:
- 		rt2800_init_bbp_3572(rt2x00dev);
- 		break;
-+	case RT3593:
-+		rt2800_init_bbp_3593(rt2x00dev);
-+		return;
- 	case RT5390:
- 	case RT5392:
- 		rt2800_init_bbp_53xx(rt2x00dev);
-@@ -4557,7 +5641,8 @@ static void rt2800_init_bbp(struct rt2x0
- 	}
- 
- 	for (i = 0; i < EEPROM_BBP_SIZE; i++) {
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom);
-+		rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_BBP_START, i,
-+					      &eeprom);
- 
- 		if (eeprom != 0xffff && eeprom != 0x0000) {
- 			reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID);
-@@ -4728,7 +5813,7 @@ static void rt2800_normal_mode_setup_3xx
- 	if (rt2x00_rt(rt2x00dev, RT3090)) {
- 		/*  Turn off unused DAC1 and ADC1 to reduce power consumption */
- 		rt2800_bbp_read(rt2x00dev, 138, &bbp);
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
- 		if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
- 			rt2x00_set_field8(&bbp, BBP138_RX_ADC1, 0);
- 		if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
-@@ -4771,6 +5856,42 @@ static void rt2800_normal_mode_setup_3xx
- 	}
- }
- 
-+static void rt2800_normal_mode_setup_3593(struct rt2x00_dev *rt2x00dev)
-+{
-+	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
-+	u8 rfcsr;
-+	u8 tx_gain;
-+
-+	rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR50_TX_LO2_EN, 0);
-+	rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr);
-+	tx_gain = rt2x00_get_field8(drv_data->txmixer_gain_24g,
-+				    RFCSR17_TXMIXER_GAIN);
-+	rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, tx_gain);
-+	rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
-+	rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 39, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR39_RX_LO2_EN, 0);
-+	rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
-+	rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
-+	rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR30_RX_VCM, 2);
-+	rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
-+
-+	/* TODO: enable stream mode */
-+}
-+
- static void rt2800_normal_mode_setup_5xxx(struct rt2x00_dev *rt2x00dev)
- {
- 	u8 reg;
-@@ -4778,7 +5899,7 @@ static void rt2800_normal_mode_setup_5xx
- 
- 	/*  Turn off unused DAC1 and ADC1 to reduce power consumption */
- 	rt2800_bbp_read(rt2x00dev, 138, &reg);
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
- 	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
- 		rt2x00_set_field8(&reg, BBP138_RX_ADC1, 0);
- 	if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
-@@ -4884,7 +6005,8 @@ static void rt2800_init_rfcsr_30xx(struc
- 		rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
- 		if (rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
- 		    rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E)) {
--			rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
-+			rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1,
-+					   &eeprom);
- 			if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_DAC_TEST))
- 				rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
- 			else
-@@ -5152,6 +6274,136 @@ static void rt2800_init_rfcsr_3572(struc
- 	rt2800_normal_mode_setup_3xxx(rt2x00dev);
- }
- 
-+static void rt3593_post_bbp_init(struct rt2x00_dev *rt2x00dev)
-+{
-+	u8 bbp;
-+	bool txbf_enabled = false; /* FIXME */
-+
-+	rt2800_bbp_read(rt2x00dev, 105, &bbp);
-+	if (rt2x00dev->default_ant.rx_chain_num == 1)
-+		rt2x00_set_field8(&bbp, BBP105_MLD, 0);
-+	else
-+		rt2x00_set_field8(&bbp, BBP105_MLD, 1);
-+	rt2800_bbp_write(rt2x00dev, 105, bbp);
-+
-+	rt2800_bbp4_mac_if_ctrl(rt2x00dev);
-+
-+	rt2800_bbp_write(rt2x00dev, 92, 0x02);
-+	rt2800_bbp_write(rt2x00dev, 82, 0x82);
-+	rt2800_bbp_write(rt2x00dev, 106, 0x05);
-+	rt2800_bbp_write(rt2x00dev, 104, 0x92);
-+	rt2800_bbp_write(rt2x00dev, 88, 0x90);
-+	rt2800_bbp_write(rt2x00dev, 148, 0xc8);
-+	rt2800_bbp_write(rt2x00dev, 47, 0x48);
-+	rt2800_bbp_write(rt2x00dev, 120, 0x50);
-+
-+	if (txbf_enabled)
-+		rt2800_bbp_write(rt2x00dev, 163, 0xbd);
-+	else
-+		rt2800_bbp_write(rt2x00dev, 163, 0x9d);
-+
-+	/* SNR mapping */
-+	rt2800_bbp_write(rt2x00dev, 142, 6);
-+	rt2800_bbp_write(rt2x00dev, 143, 160);
-+	rt2800_bbp_write(rt2x00dev, 142, 7);
-+	rt2800_bbp_write(rt2x00dev, 143, 161);
-+	rt2800_bbp_write(rt2x00dev, 142, 8);
-+	rt2800_bbp_write(rt2x00dev, 143, 162);
-+
-+	/* ADC/DAC control */
-+	rt2800_bbp_write(rt2x00dev, 31, 0x08);
-+
-+	/* RX AGC energy lower bound in log2 */
-+	rt2800_bbp_write(rt2x00dev, 68, 0x0b);
-+
-+	/* FIXME: BBP 105 owerwrite? */
-+	rt2800_bbp_write(rt2x00dev, 105, 0x04);
-+
-+}
-+
-+static void rt2800_init_rfcsr_3593(struct rt2x00_dev *rt2x00dev)
-+{
-+	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
-+	u32 reg;
-+	u8 rfcsr;
-+
-+	/* Disable GPIO #4 and #7 function for LAN PE control */
-+	rt2800_register_read(rt2x00dev, GPIO_SWITCH, &reg);
-+	rt2x00_set_field32(&reg, GPIO_SWITCH_4, 0);
-+	rt2x00_set_field32(&reg, GPIO_SWITCH_7, 0);
-+	rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
-+
-+	/* Initialize default register values */
-+	rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
-+	rt2800_rfcsr_write(rt2x00dev, 3, 0x80);
-+	rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
-+	rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
-+	rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
-+	rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
-+	rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
-+	rt2800_rfcsr_write(rt2x00dev, 11, 0x40);
-+	rt2800_rfcsr_write(rt2x00dev, 12, 0x4e);
-+	rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
-+	rt2800_rfcsr_write(rt2x00dev, 18, 0x40);
-+	rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
-+	rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
-+	rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
-+	rt2800_rfcsr_write(rt2x00dev, 32, 0x78);
-+	rt2800_rfcsr_write(rt2x00dev, 33, 0x3b);
-+	rt2800_rfcsr_write(rt2x00dev, 34, 0x3c);
-+	rt2800_rfcsr_write(rt2x00dev, 35, 0xe0);
-+	rt2800_rfcsr_write(rt2x00dev, 38, 0x86);
-+	rt2800_rfcsr_write(rt2x00dev, 39, 0x23);
-+	rt2800_rfcsr_write(rt2x00dev, 44, 0xd3);
-+	rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
-+	rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
-+	rt2800_rfcsr_write(rt2x00dev, 49, 0x8e);
-+	rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
-+	rt2800_rfcsr_write(rt2x00dev, 51, 0x75);
-+	rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
-+	rt2800_rfcsr_write(rt2x00dev, 53, 0x18);
-+	rt2800_rfcsr_write(rt2x00dev, 54, 0x18);
-+	rt2800_rfcsr_write(rt2x00dev, 55, 0x18);
-+	rt2800_rfcsr_write(rt2x00dev, 56, 0xdb);
-+	rt2800_rfcsr_write(rt2x00dev, 57, 0x6e);
-+
-+	/* Initiate calibration */
-+	/* TODO: use rt2800_rf_init_calibration ? */
-+	rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
-+	rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
-+
-+	rt2800_adjust_freq_offset(rt2x00dev);
-+
-+	rt2800_rfcsr_read(rt2x00dev, 18, &rfcsr);
-+	rt2x00_set_field8(&rfcsr, RFCSR18_XO_TUNE_BYPASS, 1);
-+	rt2800_rfcsr_write(rt2x00dev, 18, rfcsr);
-+
-+	rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
-+	rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
-+	rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
-+	rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
-+	usleep_range(1000, 1500);
-+	rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
-+	rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 0);
-+	rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
-+
-+	/* Set initial values for RX filter calibration */
-+	drv_data->calibration_bw20 = 0x1f;
-+	drv_data->calibration_bw40 = 0x2f;
-+
-+	/* Save BBP 25 & 26 values for later use in channel switching */
-+	rt2800_bbp_read(rt2x00dev, 25, &drv_data->bbp25);
-+	rt2800_bbp_read(rt2x00dev, 26, &drv_data->bbp26);
-+
-+	rt2800_led_open_drain_enable(rt2x00dev);
-+	rt2800_normal_mode_setup_3593(rt2x00dev);
-+
-+	rt3593_post_bbp_init(rt2x00dev);
-+
-+	/* TODO: enable stream mode support */
-+}
-+
- static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
- {
- 	rt2800_rf_init_calibration(rt2x00dev, 2);
-@@ -5380,6 +6632,9 @@ static void rt2800_init_rfcsr(struct rt2
- 	case RT3572:
- 		rt2800_init_rfcsr_3572(rt2x00dev);
- 		break;
-+	case RT3593:
-+		rt2800_init_rfcsr_3593(rt2x00dev);
-+		break;
- 	case RT5390:
- 		rt2800_init_rfcsr_5390(rt2x00dev);
- 		break;
-@@ -5404,19 +6659,20 @@ int rt2800_enable_radio(struct rt2x00_de
- 		     rt2800_init_registers(rt2x00dev)))
- 		return -EIO;
- 
-+	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev)))
-+		return -EIO;
-+
- 	/*
- 	 * Send signal to firmware during boot time.
- 	 */
- 	rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
- 	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
--	if (rt2x00_is_usb(rt2x00dev)) {
-+	if (rt2x00_is_usb(rt2x00dev))
- 		rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
--		rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
--	}
-+	rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
- 	msleep(1);
- 
--	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev) ||
--		     rt2800_wait_bbp_ready(rt2x00dev)))
-+	if (unlikely(rt2800_wait_bbp_ready(rt2x00dev)))
- 		return -EIO;
- 
- 	rt2800_init_bbp(rt2x00dev);
-@@ -5456,15 +6712,15 @@ int rt2800_enable_radio(struct rt2x00_de
- 	/*
- 	 * Initialize LED control
- 	 */
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_LED_AG_CONF, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_LED_AG_CONF, &word);
- 	rt2800_mcu_request(rt2x00dev, MCU_LED_AG_CONF, 0xff,
- 			   word & 0xff, (word >> 8) & 0xff);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_LED_ACT_CONF, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_LED_ACT_CONF, &word);
- 	rt2800_mcu_request(rt2x00dev, MCU_LED_ACT_CONF, 0xff,
- 			   word & 0xff, (word >> 8) & 0xff);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_LED_POLARITY, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_LED_POLARITY, &word);
- 	rt2800_mcu_request(rt2x00dev, MCU_LED_LED_POLARITY, 0xff,
- 			   word & 0xff, (word >> 8) & 0xff);
- 
-@@ -5560,6 +6816,34 @@ int rt2800_read_eeprom_efuse(struct rt2x
- }
- EXPORT_SYMBOL_GPL(rt2800_read_eeprom_efuse);
- 
-+static u8 rt2800_get_txmixer_gain_24g(struct rt2x00_dev *rt2x00dev)
-+{
-+	u16 word;
-+
-+	if (rt2x00_rt(rt2x00dev, RT3593))
-+		return 0;
-+
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word);
-+	if ((word & 0x00ff) != 0x00ff)
-+		return rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_BG_VAL);
-+
-+	return 0;
-+}
-+
-+static u8 rt2800_get_txmixer_gain_5g(struct rt2x00_dev *rt2x00dev)
-+{
-+	u16 word;
-+
-+	if (rt2x00_rt(rt2x00dev, RT3593))
-+		return 0;
-+
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, &word);
-+	if ((word & 0x00ff) != 0x00ff)
-+		return rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_A_VAL);
-+
-+	return 0;
-+}
-+
- static int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
- {
- 	struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
-@@ -5578,18 +6862,18 @@ static int rt2800_validate_eeprom(struct
- 	/*
- 	 * Start validation of the data that has been read.
- 	 */
--	mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
-+	mac = rt2800_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
- 	if (!is_valid_ether_addr(mac)) {
- 		eth_random_addr(mac);
- 		rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
- 	}
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &word);
- 	if (word == 0xffff) {
- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2);
- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_TXPATH, 1);
- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
--		rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
- 		rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
- 	} else if (rt2x00_rt(rt2x00dev, RT2860) ||
- 		   rt2x00_rt(rt2x00dev, RT2872)) {
-@@ -5598,10 +6882,10 @@ 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);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
- 	}
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &word);
- 	if (word == 0xffff) {
- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_HW_RADIO, 0);
- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_TX_ALC, 0);
-@@ -5618,24 +6902,24 @@ static int rt2800_validate_eeprom(struct
- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_INTERNAL_TX_ALC, 0);
- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BT_COEXIST, 0);
- 		rt2x00_set_field16(&word, EEPROM_NIC_CONF1_DAC_TEST, 0);
--		rt2x00_eeprom_write(rt2x00dev, EEPROM_NIC_CONF1, word);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF1, word);
- 		rt2x00_eeprom_dbg(rt2x00dev, "NIC: 0x%04x\n", word);
- 	}
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ, &word);
- 	if ((word & 0x00ff) == 0x00ff) {
- 		rt2x00_set_field16(&word, EEPROM_FREQ_OFFSET, 0);
--		rt2x00_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
- 		rt2x00_eeprom_dbg(rt2x00dev, "Freq: 0x%04x\n", word);
- 	}
- 	if ((word & 0xff00) == 0xff00) {
- 		rt2x00_set_field16(&word, EEPROM_FREQ_LED_MODE,
- 				   LED_MODE_TXRX_ACTIVITY);
- 		rt2x00_set_field16(&word, EEPROM_FREQ_LED_POLARITY, 0);
--		rt2x00_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
--		rt2x00_eeprom_write(rt2x00dev, EEPROM_LED_AG_CONF, 0x5555);
--		rt2x00_eeprom_write(rt2x00dev, EEPROM_LED_ACT_CONF, 0x2221);
--		rt2x00_eeprom_write(rt2x00dev, EEPROM_LED_POLARITY, 0xa9f8);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_LED_AG_CONF, 0x5555);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_LED_ACT_CONF, 0x2221);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_LED_POLARITY, 0xa9f8);
- 		rt2x00_eeprom_dbg(rt2x00dev, "Led Mode: 0x%04x\n", word);
- 	}
- 
-@@ -5644,56 +6928,61 @@ static int rt2800_validate_eeprom(struct
- 	 * lna0 as correct value. Note that EEPROM_LNA
- 	 * is never validated.
- 	 */
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_LNA, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &word);
- 	default_lna_gain = rt2x00_get_field16(word, EEPROM_LNA_A0);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &word);
- 	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET0)) > 10)
- 		rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET0, 0);
- 	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET1)) > 10)
- 		rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET1, 0);
--	rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word);
-+	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word);
--	if ((word & 0x00ff) != 0x00ff) {
--		drv_data->txmixer_gain_24g =
--			rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_BG_VAL);
--	} else {
--		drv_data->txmixer_gain_24g = 0;
--	}
-+	drv_data->txmixer_gain_24g = rt2800_get_txmixer_gain_24g(rt2x00dev);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
- 	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
- 		rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
--	if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
--	    rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
--		rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
--				   default_lna_gain);
--	rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word);
--
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, &word);
--	if ((word & 0x00ff) != 0x00ff) {
--		drv_data->txmixer_gain_5g =
--			rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_A_VAL);
--	} else {
--		drv_data->txmixer_gain_5g = 0;
-+	if (!rt2x00_rt(rt2x00dev, RT3593)) {
-+		if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
-+		    rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
-+			rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
-+					   default_lna_gain);
- 	}
-+	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word);
-+
-+	drv_data->txmixer_gain_5g = rt2800_get_txmixer_gain_5g(rt2x00dev);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &word);
- 	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET0)) > 10)
- 		rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET0, 0);
- 	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET1)) > 10)
- 		rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET1, 0);
--	rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_A, word);
-+	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A, word);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word);
- 	if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
- 		rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0);
--	if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
--	    rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
--		rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
--				   default_lna_gain);
--	rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
-+	if (!rt2x00_rt(rt2x00dev, RT3593)) {
-+		if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
-+		    rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
-+			rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
-+					   default_lna_gain);
-+	}
-+	rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
-+
-+	if (rt2x00_rt(rt2x00dev, RT3593)) {
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &word);
-+		if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 ||
-+		    rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff)
-+			rt2x00_set_field16(&word, EEPROM_EXT_LNA2_A1,
-+					   default_lna_gain);
-+		if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A2) == 0x00 ||
-+		    rt2x00_get_field16(word, EEPROM_EXT_LNA2_A2) == 0xff)
-+			rt2x00_set_field16(&word, EEPROM_EXT_LNA2_A1,
-+					   default_lna_gain);
-+		rt2800_eeprom_write(rt2x00dev, EEPROM_EXT_LNA2, word);
-+	}
- 
- 	return 0;
- }
-@@ -5707,7 +6996,7 @@ static int rt2800_init_eeprom(struct rt2
- 	/*
- 	 * Read EEPROM word for configuration.
- 	 */
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
- 
- 	/*
- 	 * Identify RF chipset by EEPROM value
-@@ -5717,7 +7006,7 @@ static int rt2800_init_eeprom(struct rt2
- 	if (rt2x00_rt(rt2x00dev, RT3290) ||
- 	    rt2x00_rt(rt2x00dev, RT5390) ||
- 	    rt2x00_rt(rt2x00dev, RT5392))
--		rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
-+		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
- 	else
- 		rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
- 
-@@ -5731,6 +7020,7 @@ static int rt2800_init_eeprom(struct rt2
- 	case RF3021:
- 	case RF3022:
- 	case RF3052:
-+	case RF3053:
- 	case RF3290:
- 	case RF3320:
- 	case RF3322:
-@@ -5757,7 +7047,7 @@ static int rt2800_init_eeprom(struct rt2
- 	rt2x00dev->default_ant.rx_chain_num =
- 	    rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH);
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
- 
- 	if (rt2x00_rt(rt2x00dev, RT3070) ||
- 	    rt2x00_rt(rt2x00dev, RT3090) ||
-@@ -5810,7 +7100,7 @@ static int rt2800_init_eeprom(struct rt2
- 	/*
- 	 * Read frequency offset and RF programming sequence.
- 	 */
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ, &eeprom);
- 	rt2x00dev->freq_offset = rt2x00_get_field16(eeprom, EEPROM_FREQ_OFFSET);
- 
- 	/*
-@@ -5827,7 +7117,7 @@ static int rt2800_init_eeprom(struct rt2
- 	/*
- 	 * Check if support EIRP tx power limit feature.
- 	 */
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER, &eeprom);
- 
- 	if (rt2x00_get_field16(eeprom, EEPROM_EIRP_MAX_TX_POWER_2GHZ) <
- 					EIRP_MAX_TX_POWER_LIMIT)
-@@ -6109,12 +7399,79 @@ static const struct rf_channel rf_vals_5
- 	{196, 83, 0, 12, 1},
- };
- 
-+static const struct rf_channel rf_vals_3053[] = {
-+	/* Channel, N, R, K */
-+	{1, 241, 2, 2},
-+	{2, 241, 2, 7},
-+	{3, 242, 2, 2},
-+	{4, 242, 2, 7},
-+	{5, 243, 2, 2},
-+	{6, 243, 2, 7},
-+	{7, 244, 2, 2},
-+	{8, 244, 2, 7},
-+	{9, 245, 2, 2},
-+	{10, 245, 2, 7},
-+	{11, 246, 2, 2},
-+	{12, 246, 2, 7},
-+	{13, 247, 2, 2},
-+	{14, 248, 2, 4},
-+
-+	{36, 0x56, 0, 4},
-+	{38, 0x56, 0, 6},
-+	{40, 0x56, 0, 8},
-+	{44, 0x57, 0, 0},
-+	{46, 0x57, 0, 2},
-+	{48, 0x57, 0, 4},
-+	{52, 0x57, 0, 8},
-+	{54, 0x57, 0, 10},
-+	{56, 0x58, 0, 0},
-+	{60, 0x58, 0, 4},
-+	{62, 0x58, 0, 6},
-+	{64, 0x58, 0, 8},
-+
-+	{100, 0x5B, 0, 8},
-+	{102, 0x5B, 0, 10},
-+	{104, 0x5C, 0, 0},
-+	{108, 0x5C, 0, 4},
-+	{110, 0x5C, 0, 6},
-+	{112, 0x5C, 0, 8},
-+
-+	/* NOTE: Channel 114 has been removed intentionally.
-+	 * The EEPROM contains no TX power values for that,
-+	 * and it is disabled in the vendor driver as well.
-+	 */
-+
-+	{116, 0x5D, 0, 0},
-+	{118, 0x5D, 0, 2},
-+	{120, 0x5D, 0, 4},
-+	{124, 0x5D, 0, 8},
-+	{126, 0x5D, 0, 10},
-+	{128, 0x5E, 0, 0},
-+	{132, 0x5E, 0, 4},
-+	{134, 0x5E, 0, 6},
-+	{136, 0x5E, 0, 8},
-+	{140, 0x5F, 0, 0},
-+
-+	{149, 0x5F, 0, 9},
-+	{151, 0x5F, 0, 11},
-+	{153, 0x60, 0, 1},
-+	{157, 0x60, 0, 5},
-+	{159, 0x60, 0, 7},
-+	{161, 0x60, 0, 9},
-+	{165, 0x61, 0, 1},
-+	{167, 0x61, 0, 3},
-+	{169, 0x61, 0, 5},
-+	{171, 0x61, 0, 7},
-+	{173, 0x61, 0, 9},
-+};
-+
- static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
- {
- 	struct hw_mode_spec *spec = &rt2x00dev->spec;
- 	struct channel_info *info;
- 	char *default_power1;
- 	char *default_power2;
-+	char *default_power3;
- 	unsigned int i;
- 	u16 eeprom;
- 	u32 reg;
-@@ -6149,7 +7506,7 @@ static int rt2800_probe_hw_mode(struct r
- 
- 	SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
- 	SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
--				rt2x00_eeprom_addr(rt2x00dev,
-+				rt2800_eeprom_addr(rt2x00dev,
- 						   EEPROM_MAC_ADDR_0));
- 
- 	/*
-@@ -6165,7 +7522,7 @@ static int rt2800_probe_hw_mode(struct r
- 	rt2x00dev->hw->max_report_rates = 7;
- 	rt2x00dev->hw->max_rate_tries = 1;
- 
--	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
-+	rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
- 
- 	/*
- 	 * Initialize hw_mode information.
-@@ -6200,6 +7557,10 @@ static int rt2800_probe_hw_mode(struct r
- 		spec->supported_bands |= SUPPORT_BAND_5GHZ;
- 		spec->num_channels = ARRAY_SIZE(rf_vals_3x);
- 		spec->channels = rf_vals_3x;
-+	} else if (rt2x00_rf(rt2x00dev, RF3053)) {
-+		spec->supported_bands |= SUPPORT_BAND_5GHZ;
-+		spec->num_channels = ARRAY_SIZE(rf_vals_3053);
-+		spec->channels = rf_vals_3053;
- 	} else if (rt2x00_rf(rt2x00dev, RF5592)) {
- 		spec->supported_bands |= SUPPORT_BAND_5GHZ;
- 
-@@ -6265,21 +7626,40 @@ static int rt2800_probe_hw_mode(struct r
- 
- 	spec->channels_info = info;
- 
--	default_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
--	default_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
-+	default_power1 = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
-+	default_power2 = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
-+
-+	if (rt2x00dev->default_ant.tx_chain_num > 2)
-+		default_power3 = rt2800_eeprom_addr(rt2x00dev,
-+						    EEPROM_EXT_TXPOWER_BG3);
-+	else
-+		default_power3 = NULL;
- 
- 	for (i = 0; i < 14; i++) {
- 		info[i].default_power1 = default_power1[i];
- 		info[i].default_power2 = default_power2[i];
-+		if (default_power3)
-+			info[i].default_power3 = default_power3[i];
- 	}
- 
- 	if (spec->num_channels > 14) {
--		default_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A1);
--		default_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A2);
-+		default_power1 = rt2800_eeprom_addr(rt2x00dev,
-+						    EEPROM_TXPOWER_A1);
-+		default_power2 = rt2800_eeprom_addr(rt2x00dev,
-+						    EEPROM_TXPOWER_A2);
-+
-+		if (rt2x00dev->default_ant.tx_chain_num > 2)
-+			default_power3 =
-+				rt2800_eeprom_addr(rt2x00dev,
-+						   EEPROM_EXT_TXPOWER_A3);
-+		else
-+			default_power3 = NULL;
- 
- 		for (i = 14; i < spec->num_channels; i++) {
- 			info[i].default_power1 = default_power1[i - 14];
- 			info[i].default_power2 = default_power2[i - 14];
-+			if (default_power3)
-+				info[i].default_power3 = default_power3[i - 14];
- 		}
- 	}
- 
-@@ -6290,6 +7670,7 @@ static int rt2800_probe_hw_mode(struct r
- 	case RF3022:
- 	case RF3320:
- 	case RF3052:
-+	case RF3053:
- 	case RF3290:
- 	case RF5360:
- 	case RF5370:
-@@ -6328,6 +7709,7 @@ static int rt2800_probe_rt(struct rt2x00
- 	case RT3352:
- 	case RT3390:
- 	case RT3572:
-+	case RT3593:
- 	case RT5390:
- 	case RT5392:
- 	case RT5592:
---- a/drivers/net/wireless/rt2x00/rt2800lib.h
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
-@@ -226,4 +226,8 @@ int rt2800_get_survey(struct ieee80211_h
- 		      struct survey_info *survey);
- void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev);
- 
-+void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
-+			       unsigned short *txwi_size,
-+			       unsigned short *rxwi_size);
-+
- #endif /* RT2800LIB_H */
---- a/drivers/net/wireless/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -507,9 +507,13 @@ static int rt2800pci_init_registers(stru
- 	rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
- 
- 	if (rt2x00_is_pcie(rt2x00dev) &&
--	    (rt2x00_rt(rt2x00dev, RT3572) ||
-+	    (rt2x00_rt(rt2x00dev, RT3090) ||
-+	     rt2x00_rt(rt2x00dev, RT3390) ||
-+	     rt2x00_rt(rt2x00dev, RT3572) ||
-+	     rt2x00_rt(rt2x00dev, RT3593) ||
- 	     rt2x00_rt(rt2x00dev, RT5390) ||
--	     rt2x00_rt(rt2x00dev, RT5392))) {
-+	     rt2x00_rt(rt2x00dev, RT5392) ||
-+	     rt2x00_rt(rt2x00dev, RT5592))) {
- 		rt2x00mmio_register_read(rt2x00dev, AUX_CTRL, &reg);
- 		rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
- 		rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
-@@ -1189,12 +1193,17 @@ static const struct rt2x00lib_ops rt2800
- 
- static void rt2800pci_queue_init(struct data_queue *queue)
- {
-+	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
-+	unsigned short txwi_size, rxwi_size;
-+
-+	rt2800_get_txwi_rxwi_size(rt2x00dev, &txwi_size, &rxwi_size);
-+
- 	switch (queue->qid) {
- 	case QID_RX:
- 		queue->limit = 128;
- 		queue->data_size = AGGREGATION_SIZE;
- 		queue->desc_size = RXD_DESC_SIZE;
--		queue->winfo_size = RXWI_DESC_SIZE_4WORDS;
-+		queue->winfo_size = rxwi_size;
- 		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
- 		break;
- 
-@@ -1205,7 +1214,7 @@ static void rt2800pci_queue_init(struct 
- 		queue->limit = 64;
- 		queue->data_size = AGGREGATION_SIZE;
- 		queue->desc_size = TXD_DESC_SIZE;
--		queue->winfo_size = TXWI_DESC_SIZE_4WORDS;
-+		queue->winfo_size = txwi_size;
- 		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
- 		break;
- 
-@@ -1213,7 +1222,7 @@ static void rt2800pci_queue_init(struct 
- 		queue->limit = 8;
- 		queue->data_size = 0; /* No DMA required for beacons */
- 		queue->desc_size = TXD_DESC_SIZE;
--		queue->winfo_size = TXWI_DESC_SIZE_4WORDS;
-+		queue->winfo_size = txwi_size;
- 		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
- 		break;
- 
---- a/drivers/net/wireless/rt2x00/rt2800usb.c
-+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
-@@ -176,8 +176,8 @@ static bool rt2800usb_tx_sta_fifo_read_c
- 		queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
- 
- 	if (rt2800usb_txstatus_pending(rt2x00dev)) {
--		/* Read register after 250 us */
--		hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000),
-+		/* Read register after 1 ms */
-+		hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 1000000),
- 			      HRTIMER_MODE_REL);
- 		return false;
- 	}
-@@ -202,8 +202,8 @@ static void rt2800usb_async_read_tx_stat
- 	if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags))
- 		return;
- 
--	/* Read TX_STA_FIFO register after 500 us */
--	hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000),
-+	/* Read TX_STA_FIFO register after 2 ms */
-+	hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 2000000),
- 		      HRTIMER_MODE_REL);
- }
- 
-@@ -854,13 +854,7 @@ static void rt2800usb_queue_init(struct 
- 	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
- 	unsigned short txwi_size, rxwi_size;
- 
--	if (rt2x00_rt(rt2x00dev, RT5592)) {
--		txwi_size = TXWI_DESC_SIZE_5WORDS;
--		rxwi_size = RXWI_DESC_SIZE_6WORDS;
--	} else {
--		txwi_size = TXWI_DESC_SIZE_4WORDS;
--		rxwi_size = RXWI_DESC_SIZE_4WORDS;
--	}
-+	rt2800_get_txwi_rxwi_size(rt2x00dev, &txwi_size, &rxwi_size);
- 
- 	switch (queue->qid) {
- 	case QID_RX:
-@@ -1194,6 +1188,40 @@ static struct usb_device_id rt2800usb_de
- 	/* Zinwell */
- 	{ USB_DEVICE(0x5a57, 0x0284) },
- #endif
-+#ifdef CPTCFG_RT2800USB_RT3573
-+	/* AirLive */
-+	{ USB_DEVICE(0x1b75, 0x7733) },
-+	/* ASUS */
-+	{ USB_DEVICE(0x0b05, 0x17bc) },
-+	{ USB_DEVICE(0x0b05, 0x17ad) },
-+	/* Belkin */
-+	{ USB_DEVICE(0x050d, 0x1103) },
-+	/* Cameo */
-+	{ USB_DEVICE(0x148f, 0xf301) },
-+	/* Edimax */
-+	{ USB_DEVICE(0x7392, 0x7733) },
-+	/* Hawking */
-+	{ USB_DEVICE(0x0e66, 0x0020) },
-+	{ USB_DEVICE(0x0e66, 0x0021) },
-+	/* I-O DATA */
-+	{ USB_DEVICE(0x04bb, 0x094e) },
-+	/* Linksys */
-+	{ USB_DEVICE(0x13b1, 0x003b) },
-+	/* Logitec */
-+	{ USB_DEVICE(0x0789, 0x016b) },
-+	/* NETGEAR */
-+	{ USB_DEVICE(0x0846, 0x9012) },
-+	{ USB_DEVICE(0x0846, 0x9019) },
-+	/* Planex */
-+	{ USB_DEVICE(0x2019, 0xed19) },
-+	/* Ralink */
-+	{ USB_DEVICE(0x148f, 0x3573) },
-+	/* Sitecom */
-+	{ USB_DEVICE(0x0df6, 0x0067) },
-+	{ USB_DEVICE(0x0df6, 0x006a) },
-+	/* ZyXEL */
-+	{ USB_DEVICE(0x0586, 0x3421) },
-+#endif
- #ifdef CPTCFG_RT2800USB_RT53XX
- 	/* Arcadyan */
- 	{ USB_DEVICE(0x043e, 0x7a12) },
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -211,6 +211,7 @@ struct channel_info {
- 	short max_power;
- 	short default_power1;
- 	short default_power2;
-+	short default_power3;
- };
- 
- /*

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

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

+ 5 - 5
package/kernel/mac80211/patches/400-ath_move_debug_code.patch

@@ -1,12 +1,12 @@
 --- a/drivers/net/wireless/ath/Makefile
 +++ b/drivers/net/wireless/ath/Makefile
-@@ -11,7 +11,7 @@ obj-$(CPTCFG_ATH_COMMON)	+= ath.o
- ath-objs :=	main.o \
+@@ -13,8 +13,8 @@ ath-objs :=	main.o \
  		regd.o \
  		hw.o \
--		key.o
-+		key.o \
-+		debug.o
+ 		key.o \
++		debug.o \
+ 		dfs_pattern_detector.o \
+ 		dfs_pri_detector.o
  
 -ath-$(CPTCFG_ATH_DEBUG) += debug.o
  ccflags-y += -D__CHECK_ENDIAN__

+ 1 - 1
package/kernel/mac80211/patches/402-ath9k-fix-invalid-mac-address-handling.patch

@@ -8,7 +8,7 @@
  #include <asm/unaligned.h>
  
  #include "hw.h"
-@@ -513,8 +514,16 @@ static int ath9k_hw_init_macaddr(struct 
+@@ -512,8 +513,16 @@ static int ath9k_hw_init_macaddr(struct 
  		common->macaddr[2 * i] = eeval >> 8;
  		common->macaddr[2 * i + 1] = eeval & 0xff;
  	}

+ 6 - 6
package/kernel/mac80211/patches/403-ath_regd_optional.patch

@@ -11,7 +11,7 @@
  	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  
  		if (!wiphy->bands[band])
-@@ -250,6 +254,10 @@ ath_reg_apply_active_scan_flags(struct w
+@@ -249,6 +253,10 @@ ath_reg_apply_active_scan_flags(struct w
  	struct ieee80211_channel *ch;
  	const struct ieee80211_reg_rule *reg_rule;
  
@@ -22,7 +22,7 @@
  	sband = wiphy->bands[IEEE80211_BAND_2GHZ];
  	if (!sband)
  		return;
-@@ -299,6 +307,10 @@ static void ath_reg_apply_radar_flags(st
+@@ -298,6 +306,10 @@ static void ath_reg_apply_radar_flags(st
  	struct ieee80211_channel *ch;
  	unsigned int i;
  
@@ -33,7 +33,7 @@
  	if (!wiphy->bands[IEEE80211_BAND_5GHZ])
  		return;
  
-@@ -503,6 +515,10 @@ ath_regd_init_wiphy(struct ath_regulator
+@@ -606,6 +618,10 @@ ath_regd_init_wiphy(struct ath_regulator
  {
  	const struct ieee80211_regdomain *regd;
  
@@ -58,11 +58,11 @@
  	---help---
 --- a/.local-symbols
 +++ b/.local-symbols
-@@ -123,6 +123,7 @@ RTL8187_LEDS=
+@@ -126,6 +126,7 @@ RTL8187_LEDS=
  ATH_COMMON=
  ATH_CARDS=
  ATH_DEBUG=
 +ATH_USER_REGD=
+ ATH_REG_DYNAMIC_USER_REG_HINTS=
+ ATH_REG_DYNAMIC_USER_CERT_TESTING=
  ATH5K=
- ATH5K_DEBUG=
- ATH5K_TRACER=

+ 5 - 5
package/kernel/mac80211/patches/404-world_regd_fixup.patch

@@ -1,15 +1,15 @@
 --- a/drivers/net/wireless/ath/regd.c
 +++ b/drivers/net/wireless/ath/regd.c
 @@ -42,7 +42,8 @@ static int __ath_regd_init(struct ath_re
- 				NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
+ 				NL80211_RRF_NO_IR | NL80211_RRF_NO_OFDM)
  
  /* We allow IBSS on these on a case by case basis by regulatory domain */
 -#define ATH9K_5GHZ_5150_5350	REG_RULE(5150-10, 5350+10, 80, 0, 30,\
-+#define ATH9K_5GHZ_5150_5350	REG_RULE(5150-10, 5250, 80, 0, 30, 0), \
-+				REG_RULE(5250, 5350+10, 80, 0, 30,\
- 				NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
++#define ATH9K_5GHZ_5150_5350	REG_RULE(5150-10, 5240+10, 80, 0, 30, 0),\
++				REG_RULE(5260-10, 5350+10, 80, 0, 30,\
+ 				NL80211_RRF_NO_IR)
  #define ATH9K_5GHZ_5470_5850	REG_RULE(5470-10, 5850+10, 80, 0, 30,\
- 				NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
+ 				NL80211_RRF_NO_IR)
 @@ -60,57 +61,56 @@ static int __ath_regd_init(struct ath_re
  #define ATH9K_5GHZ_NO_MIDBAND	ATH9K_5GHZ_5150_5350, \
  				ATH9K_5GHZ_5725_5850

+ 2 - 2
package/kernel/mac80211/patches/405-regd_no_assoc_hints.patch

@@ -1,6 +1,6 @@
 --- a/net/wireless/reg.c
 +++ b/net/wireless/reg.c
-@@ -1696,6 +1696,8 @@ void regulatory_hint_11d(struct wiphy *w
+@@ -1706,6 +1706,8 @@ void regulatory_hint_country_ie(struct w
  	enum environment_cap env = ENVIRON_ANY;
  	struct regulatory_request *request = NULL, *lr;
  
@@ -9,7 +9,7 @@
  	/* IE len must be evenly divisible by 2 */
  	if (country_ie_len & 0x01)
  		return;
-@@ -1890,6 +1892,7 @@ static void restore_regulatory_settings(
+@@ -1900,6 +1902,7 @@ static void restore_regulatory_settings(
  
  void regulatory_hint_disconnect(void)
  {

+ 2 - 2
package/kernel/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
-@@ -814,6 +814,7 @@ static const struct ieee80211_iface_limi
+@@ -844,6 +844,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_limit if_dfs_limits[] = {

+ 3 - 3
package/kernel/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch

@@ -18,7 +18,7 @@
  		goto end;
 --- a/drivers/net/wireless/ath/ath5k/base.c
 +++ b/drivers/net/wireless/ath/ath5k/base.c
-@@ -1916,7 +1916,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
+@@ -1951,7 +1951,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
  	}
  
  	if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
@@ -27,7 +27,7 @@
  			ah->opmode == NL80211_IFTYPE_MESH_POINT) {
  		u64 tsf = ath5k_hw_get_tsf64(ah);
  		u32 tsftu = TSF_TO_TU(tsf);
-@@ -2002,7 +2002,7 @@ ath5k_beacon_update_timers(struct ath5k_
+@@ -2037,7 +2037,7 @@ ath5k_beacon_update_timers(struct ath5k_
  
  	intval = ah->bintval & AR5K_BEACON_PERIOD;
  	if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
@@ -36,7 +36,7 @@
  		intval /= ATH_BCBUF;	/* staggered multi-bss beacons */
  		if (intval < 15)
  			ATH5K_WARN(ah, "intval %u is too low, min 15\n",
-@@ -2469,6 +2469,7 @@ static const struct ieee80211_iface_limi
+@@ -2504,6 +2504,7 @@ static const struct ieee80211_iface_limi
  				 BIT(NL80211_IFTYPE_MESH_POINT) |
  #endif
  				 BIT(NL80211_IFTYPE_AP) },

+ 2 - 2
package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch

@@ -11,7 +11,7 @@ drivers/net/wireless/ath/ath5k/debug.c |   86 ++++++++++++++++++++++++++++++++
 
 --- a/drivers/net/wireless/ath/ath5k/debug.c
 +++ b/drivers/net/wireless/ath/ath5k/debug.c
-@@ -811,6 +811,89 @@ static const struct file_operations fops
+@@ -821,6 +821,89 @@ static const struct file_operations fops
  	.llseek = default_llseek,
  };
  
@@ -101,7 +101,7 @@ drivers/net/wireless/ath/ath5k/debug.c |   86 ++++++++++++++++++++++++++++++++
  
  /* debugfs: queues etc */
  
-@@ -902,6 +985,9 @@ ath5k_debug_init_device(struct ath5k_hw 
+@@ -914,6 +997,9 @@ ath5k_debug_init_device(struct ath5k_hw 
  	debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah,
  			    &fops_beacon);
  

+ 3 - 3
package/kernel/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
-@@ -1871,6 +1871,53 @@ void ath9k_deinit_debug(struct ath_softc
+@@ -1782,6 +1782,53 @@ void ath9k_deinit_debug(struct ath_softc
  	}
  }
  
@@ -54,9 +54,9 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -1888,6 +1935,8 @@ int ath9k_init_debug(struct ath_hw *ah)
- 
+@@ -1800,6 +1847,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  	ath9k_dfs_init_debug(sc);
+ 	ath9k_tx99_init_debug(sc);
  
 +	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
 +			    &fops_eeprom);

+ 3 - 3
package/kernel/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
-@@ -717,6 +717,7 @@ enum ath_cal_list {
+@@ -727,6 +727,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
-@@ -665,6 +665,8 @@ static int ath9k_init_softc(u16 devid, s
+@@ -695,6 +695,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;
@@ -89,7 +89,7 @@
 +			ah->ah_flags |= AH_NO_EEP_SWAP;
  	}
  
- 	common = ath9k_hw_common(ah);
+ 	common->ops = &ah->reg_ops;
 --- a/include/linux/ath9k_platform.h
 +++ b/include/linux/ath9k_platform.h
 @@ -31,6 +31,7 @@ struct ath9k_platform_data {

+ 1 - 1
package/kernel/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
-@@ -1072,23 +1072,23 @@ static int __init ath9k_init(void)
+@@ -1086,23 +1086,23 @@ static int __init ath9k_init(void)
  		goto err_out;
  	}
  

+ 1 - 1
package/kernel/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
-@@ -1993,8 +1993,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2014,8 +2014,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  		REG_WRITE(ah, AR_OBS, 8);
  
  	if (ah->config.rx_intr_mitigation) {

+ 2 - 2
package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1918,6 +1918,52 @@ static const struct file_operations fops
+@@ -1829,6 +1829,52 @@ static const struct file_operations fops
  	.owner = THIS_MODULE
  };
  
@@ -53,7 +53,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -1937,6 +1983,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1849,6 +1895,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  
  	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
  			    &fops_eeprom);

+ 8 - 8
package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch

@@ -1,10 +1,10 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -724,6 +724,7 @@ int ath9k_hw_init(struct ath_hw *ah)
+@@ -732,6 +732,7 @@ int ath9k_hw_init(struct ath_hw *ah)
  	case AR9300_DEVID_AR9462:
  	case AR9485_DEVID_AR1111:
  	case AR9300_DEVID_AR9565:
-+	case AR9300_DEVID_AR9381:
++	case AR9300_DEVID_INVALID:
  		break;
  	default:
  		if (common->bus_ops->ath_bus_type == ATH_USB)
@@ -14,17 +14,17 @@
  #define AR9300_DEVID_QCA955X	0x0038
  #define AR9485_DEVID_AR1111	0x0037
  #define AR9300_DEVID_AR9565     0x0036
-+#define AR9300_DEVID_AR9381     0xabcd
++#define AR9300_DEVID_INVALID    0xabcd
  
  #define AR5416_AR9100_DEVID	0x000b
  
 --- a/drivers/net/wireless/ath/ath9k/pci.c
 +++ b/drivers/net/wireless/ath/ath9k/pci.c
-@@ -270,6 +270,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
- 	{ PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E  AR9462 */
- 	{ PCI_VDEVICE(ATHEROS, 0x0037) }, /* PCI-E  AR1111/AR9485 */
- 	{ PCI_VDEVICE(ATHEROS, 0x0036) }, /* PCI-E  AR9565 */
-+	{ PCI_VDEVICE(ATHEROS, 0xabcd) }, /* PCI-E  AR9381 */
+@@ -463,6 +463,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
+ 	{ PCI_VDEVICE(ATHEROS, 0x0036),
+ 	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
+ 
++	{ PCI_VDEVICE(ATHEROS, 0xabcd) }, /* PCI-E  internal chip default ID */
  	{ 0 }
  };
  

+ 3 - 3
package/kernel/mac80211/patches/520-mac80211_cur_txpower.patch

@@ -1,6 +1,6 @@
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1622,6 +1622,7 @@ struct ieee80211_hw {
+@@ -1659,6 +1659,7 @@ struct ieee80211_hw {
  	u8 max_tx_aggregation_subframes;
  	u8 offchannel_tx_hw_queue;
  	u8 radiotap_mcs_details;
@@ -10,7 +10,7 @@
  	u8 uapsd_queues;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2283,7 +2283,9 @@ static int ieee80211_get_tx_power(struct
+@@ -2294,7 +2294,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
-@@ -167,6 +167,7 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -158,6 +158,7 @@ static u32 ieee80211_hw_conf_chan(struct
  
  	if (local->hw.conf.power_level != power) {
  		changed |= IEEE80211_CONF_CHANGE_POWER;

+ 1 - 1
package/kernel/mac80211/patches/521-ath9k_cur_txpower.patch

@@ -14,7 +14,7 @@
  
  out:
  	spin_unlock_bh(&sc->sc_pcu_lock);
-@@ -1304,6 +1308,7 @@ static int ath9k_config(struct ieee80211
+@@ -1340,6 +1344,7 @@ static int ath9k_config(struct ieee80211
  		sc->config.txpowlimit = 2 * conf->power_level;
  		ath9k_cmn_update_txpow(ah, sc->curtxpow,
  				       sc->config.txpowlimit, &sc->curtxpow);

+ 29 - 10
package/kernel/mac80211/patches/522-ath9k_per_chain_signal_strength.patch

@@ -17,7 +17,7 @@
  	u8 rs_moreaggr;
 --- a/drivers/net/wireless/ath/ath9k/recv.c
 +++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -892,6 +892,7 @@ static void ath9k_process_rssi(struct at
+@@ -906,6 +906,7 @@ static void ath9k_process_rssi(struct at
  	struct ath_hw *ah = common->ah;
  	int last_rssi;
  	int rssi = rx_stats->rs_rssi;
@@ -25,7 +25,7 @@
  
  	/*
  	 * RSSI is not available for subframes in an A-MPDU.
-@@ -910,6 +911,20 @@ static void ath9k_process_rssi(struct at
+@@ -924,6 +925,20 @@ static void ath9k_process_rssi(struct at
  		return;
  	}
  
@@ -46,15 +46,34 @@
  	/*
  	 * Update Beacon RSSI, this is used by ANI.
  	 */
-@@ -1000,7 +1015,7 @@ static int ath_process_fft(struct ath_so
- 	fft_sample.tlv.length = __cpu_to_be16(length);
+@@ -1073,14 +1088,14 @@ static int ath_process_fft(struct ath_so
+ 		fft_sample_40.channel_type = chan_type;
  
- 	fft_sample.freq = __cpu_to_be16(ah->curchan->chan->center_freq);
--	fft_sample.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
-+	fft_sample.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
- 	fft_sample.noise = ah->noise;
+ 		if (chan_type == NL80211_CHAN_HT40PLUS) {
+-			lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
+-			upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0);
++			lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
++			upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]);
  
- 	switch (len - SPECTRAL_HT20_TOTAL_DATA_LEN) {
+ 			fft_sample_40.lower_noise = ah->noise;
+ 			fft_sample_40.upper_noise = ext_nf;
+ 		} else {
+-			lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0);
+-			upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
++			lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]);
++			upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
+ 
+ 			fft_sample_40.lower_noise = ext_nf;
+ 			fft_sample_40.upper_noise = ah->noise;
+@@ -1116,7 +1131,7 @@ static int ath_process_fft(struct ath_so
+ 		fft_sample_20.tlv.length = __cpu_to_be16(length);
+ 		fft_sample_20.freq = __cpu_to_be16(freq);
+ 
+-		fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
++		fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
+ 		fft_sample_20.noise = ah->noise;
+ 
+ 		mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1;
 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 @@ -476,12 +476,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
@@ -131,7 +150,7 @@
  	 * hardware stores this as 8 bit signed value.
 --- a/drivers/net/wireless/ath/ath9k/antenna.c
 +++ b/drivers/net/wireless/ath/ath9k/antenna.c
-@@ -744,14 +744,14 @@ void ath_ant_comb_scan(struct ath_softc 
+@@ -724,14 +724,14 @@ void ath_ant_comb_scan(struct ath_softc 
  	struct ath_ant_comb *antcomb = &sc->ant_comb;
  	int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
  	int curr_main_set;

+ 80 - 79
package/kernel/mac80211/patches/523-mac80211_configure_antenna_gain.patch

@@ -1,6 +1,24 @@
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -2081,6 +2081,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
++ * @set_antenna_gain: set antenna gain to reduce maximum tx power if necessary
+  *
+  * @set_wds_peer: set the WDS peer for a WDS interface
+  *
+@@ -2303,6 +2304,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);
++	int	(*set_antenna_gain)(struct wiphy *wiphy, int dbi);
+ 
+ 	int	(*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev,
+ 				const u8 *addr);
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1002,6 +1002,7 @@ enum ieee80211_smps_mode {
+@@ -1029,6 +1029,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
@@ -8,7 +26,7 @@
   *
   * @chandef: the channel definition to tune to
   * @radar_enabled: whether radar detection is enabled
-@@ -1023,6 +1024,7 @@ struct ieee80211_conf {
+@@ -1050,6 +1051,7 @@ struct ieee80211_conf {
  	u32 flags;
  	int power_level, dynamic_ps_timeout;
  	int max_sleep_period;
@@ -16,73 +34,30 @@
  
  	u16 listen_interval;
  	u8 ps_dtim_period;
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -1130,6 +1130,7 @@ struct ieee80211_local {
- 	int dynamic_ps_forced_timeout;
- 
- 	int user_power_level; /* in dBm, for all interfaces */
-+	int user_antenna_gain; /* in dBi */
- 
- 	enum ieee80211_smps_mode smps_mode;
- 
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -1460,6 +1460,9 @@ enum nl80211_commands {
-  * @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter
-  *	field in the probe response (%NL80211_ATTR_PROBE_RESP).
+@@ -1511,6 +1511,9 @@ enum nl80211_commands {
+  * @NL80211_ATTR_SUPPORT_5_10_MHZ: A flag indicating that the device supports
+  *	5 MHz and 10 MHz channel bandwidth.
   *
 + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
-+ *	transmit power to stay within regulatory limits.
++ *	transmit power to stay within regulatory limits. u32, dBi.
 + *
   * @NL80211_ATTR_MAX: highest attribute number currently defined
   * @__NL80211_ATTR_AFTER_LAST: internal use
   */
-@@ -1766,6 +1769,8 @@ enum nl80211_attrs {
- 	NL80211_ATTR_CSA_C_OFF_BEACON,
- 	NL80211_ATTR_CSA_C_OFF_PRESP,
+@@ -1829,6 +1832,8 @@ enum nl80211_attrs {
+ 
+ 	NL80211_ATTR_SUPPORT_5_10_MHZ,
  
 +	NL80211_ATTR_WIPHY_ANTENNA_GAIN,
 +
  	/* add attributes here, update the policy in nl80211.c */
  
  	__NL80211_ATTR_AFTER_LAST,
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -354,6 +354,7 @@ static const struct nla_policy nl80211_p
- 	[NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
- 	[NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 },
- 	[NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 },
-+	[NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
- };
- 
- /* policy for the key attributes */
-@@ -2000,6 +2001,22 @@ static int nl80211_set_wiphy(struct sk_b
- 			goto bad_res;
- 	}
- 
-+	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
-+		int idx, dbi = 0;
-+
-+		if (!rdev->ops->set_antenna_gain) {
-+			result = -EOPNOTSUPP;
-+			goto bad_res;
-+		}
-+
-+		idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN;
-+		dbi = nla_get_u32(info->attrs[idx]);
-+
-+		result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi);
-+		if (result)
-+			goto bad_res;
-+	}
-+
- 	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
- 	    info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
- 		u32 tx_ant, rx_ant;
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2293,6 +2293,19 @@ static int ieee80211_get_tx_power(struct
+@@ -2304,6 +2304,19 @@ static int ieee80211_get_tx_power(struct
  	return 0;
  }
  
@@ -102,7 +77,7 @@
  static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
  				  const u8 *addr)
  {
-@@ -3656,6 +3669,7 @@ struct cfg80211_ops mac80211_config_ops 
+@@ -3839,6 +3852,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,
@@ -110,37 +85,30 @@
  	.set_wds_peer = ieee80211_set_wds_peer,
  	.rfkill_poll = ieee80211_rfkill_poll,
  	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -1994,6 +1994,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
-+ * @set_antenna_gain: set antenna gain to reduce maximum tx power if necessary
-  *
-  * @set_wds_peer: set the WDS peer for a WDS interface
-  *
-@@ -2215,6 +2216,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);
-+	int	(*set_antenna_gain)(struct wiphy *wiphy, int dbi);
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -1179,6 +1179,7 @@ struct ieee80211_local {
+ 	int dynamic_ps_forced_timeout;
+ 
+ 	int user_power_level; /* in dBm, for all interfaces */
++	int user_antenna_gain; /* in dBi */
+ 
+ 	enum ieee80211_smps_mode smps_mode;
  
- 	int	(*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev,
- 				const u8 *addr);
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -102,6 +102,7 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
+ 	struct ieee80211_sub_if_data *sdata;
  	struct cfg80211_chan_def chandef = {};
  	u32 changed = 0;
- 	int power = 0;
-+	int ant_gain, max_power;
+-	int power;
++	int power, ant_gain, max_power;
  	u32 offchannel_flag;
  
  	offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
-@@ -165,8 +166,21 @@ static u32 ieee80211_hw_conf_chan(struct
- 
- 	power = min(power, chandef.chan->max_power);
+@@ -156,8 +156,21 @@ static u32 ieee80211_hw_conf_chan(struct
+ 	}
+ 	rcu_read_unlock();
  
 -	if (local->hw.conf.power_level != power) {
 +	max_power = chandef.chan->max_reg_power;
@@ -155,13 +123,13 @@
 +	}
 +
 +	if (local->hw.conf.power_level != power ||
-+		local->hw.conf.max_antenna_gain != ant_gain) {
++	    local->hw.conf.max_antenna_gain != ant_gain) {
  		changed |= IEEE80211_CONF_CHANGE_POWER;
 +		local->hw.conf.max_antenna_gain = ant_gain;
  		local->hw.cur_power_level = power;
  		local->hw.conf.power_level = power;
  	}
-@@ -597,6 +611,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
+@@ -588,6 +601,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;
@@ -169,3 +137,36 @@
  	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;
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -357,6 +357,7 @@ static const struct nla_policy nl80211_p
+ 	[NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY },
+ 	[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY },
+ 	[NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
++	[NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
+ };
+ 
+ /* policy for the key attributes */
+@@ -2038,6 +2039,22 @@ static int nl80211_set_wiphy(struct sk_b
+ 			goto bad_res;
+ 	}
+ 
++	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
++		int idx, dbi = 0;
++
++		if (!rdev->ops->set_antenna_gain) {
++			result = -EOPNOTSUPP;
++			goto bad_res;
++		}
++
++		idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN;
++		dbi = nla_get_u32(info->attrs[idx]);
++
++		result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi);
++		if (result)
++			goto bad_res;
++	}
++
+ 	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
+ 	    info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
+ 		u32 tx_ant, rx_ant;

+ 2 - 2
package/kernel/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
-@@ -2832,7 +2832,7 @@ void ath9k_hw_apply_txpower(struct ath_h
+@@ -2853,7 +2853,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
-@@ -1304,7 +1304,10 @@ static int ath9k_config(struct ieee80211
+@@ -1340,7 +1340,10 @@ static int ath9k_config(struct ieee80211
  	}
  
  	if (changed & IEEE80211_CONF_CHANGE_POWER) {

+ 6 - 6
package/kernel/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
-@@ -561,6 +561,9 @@ struct ath9k_wow_pattern {
+@@ -558,6 +558,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)
  {
-@@ -705,6 +708,13 @@ enum spectral_mode {
+@@ -732,6 +735,13 @@ enum spectral_mode {
  	SPECTRAL_CHANSCAN,
  };
  
@@ -24,7 +24,7 @@
  struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct device *dev;
-@@ -747,9 +757,8 @@ struct ath_softc {
+@@ -774,9 +784,8 @@ struct ath_softc {
  	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
  
  #ifdef CPTCFG_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
-@@ -978,7 +978,7 @@ int ath9k_init_device(u16 devid, struct 
+@@ -992,7 +992,7 @@ int ath9k_init_device(u16 devid, struct 
  
  #ifdef CPTCFG_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
-@@ -1963,6 +1963,61 @@ static const struct file_operations fops
+@@ -1874,6 +1874,61 @@ static const struct file_operations fops
  	.llseek = default_llseek,
  };
  
@@ -235,7 +235,7 @@
  
  int ath9k_init_debug(struct ath_hw *ah)
  {
-@@ -1985,6 +2040,10 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1897,6 +1952,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);

+ 8 - 8
package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -2019,6 +2019,50 @@ static const struct file_operations fops
+@@ -1930,6 +1930,50 @@ static const struct file_operations fops
  #endif
  
  
@@ -51,7 +51,7 @@
  int ath9k_init_debug(struct ath_hw *ah)
  {
  	struct ath_common *common = ath9k_hw_common(ah);
-@@ -2044,6 +2088,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1956,6 +2000,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
-@@ -475,6 +475,12 @@ enum {
+@@ -480,6 +480,12 @@ enum {
  	ATH9K_RESET_COLD,
  };
  
@@ -75,7 +75,7 @@
  struct ath9k_hw_version {
  	u32 magic;
  	u16 devid;
-@@ -755,6 +761,8 @@ struct ath_hw {
+@@ -765,6 +771,8 @@ struct ath_hw {
  	u32 rfkill_polarity;
  	u32 ah_flags;
  
@@ -84,7 +84,7 @@
  	bool reset_power_on;
  	bool htc_reset_init;
  
-@@ -1005,6 +1013,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
+@@ -1016,6 +1024,7 @@ void ath9k_hw_check_nav(struct ath_hw *a
  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
-@@ -1840,6 +1840,20 @@ fail:
+@@ -1861,6 +1861,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)
  {
-@@ -2039,6 +2053,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2060,6 +2074,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
-@@ -565,6 +565,11 @@ irqreturn_t ath_isr(int irq, void *dev)
+@@ -571,6 +571,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/kernel/mac80211/patches/543-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
-@@ -2432,17 +2432,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
+@@ -2453,17 +2453,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
-@@ -925,6 +925,8 @@ struct ath_hw {
+@@ -935,6 +935,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
-@@ -665,6 +665,8 @@ static int ath9k_init_softc(u16 devid, s
+@@ -695,6 +695,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;

+ 14 - 14
package/kernel/mac80211/patches/550-ath9k_entropy_from_adc.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/hw.h
 +++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -676,6 +676,7 @@ struct ath_spec_scan {
+@@ -682,6 +682,7 @@ struct ath_spec_scan {
   * @config_pci_powersave:
   * @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC
   *
@@ -8,7 +8,7 @@
   * @spectral_scan_config: set parameters for spectral scan and enable/disable it
   * @spectral_scan_trigger: trigger a spectral scan run
   * @spectral_scan_wait: wait for a spectral scan run to finish
-@@ -698,6 +699,7 @@ struct ath_hw_ops {
+@@ -704,6 +705,7 @@ struct ath_hw_ops {
  			struct ath_hw_antcomb_conf *antconf);
  	void (*antdiv_comb_conf_set)(struct ath_hw *ah,
  			struct ath_hw_antcomb_conf *antconf);
@@ -18,8 +18,8 @@
  	void (*spectral_scan_trigger)(struct ath_hw *ah);
 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-@@ -1609,6 +1609,26 @@ static void ar9003_hw_spectral_scan_wait
- 	}
+@@ -1709,6 +1709,26 @@ static void ar9003_hw_tx99_set_txpower(s
+ 		  ATH9K_POW_SM(p_pwr_array[ALL_TARGET_HT40_14],  0));
  }
  
 +static void ar9003_hw_get_adc_entropy(struct ath_hw *ah, u8 *buf, size_t len)
@@ -45,7 +45,7 @@
  void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
  {
  	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
-@@ -1639,6 +1659,7 @@ void ar9003_hw_attach_phy_ops(struct ath
+@@ -1739,6 +1759,7 @@ void ar9003_hw_attach_phy_ops(struct ath
  	priv_ops->set_radar_params = ar9003_hw_set_radar_params;
  	priv_ops->fast_chan_change = ar9003_hw_fast_chan_change;
  
@@ -55,7 +55,7 @@
  	ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
 --- a/drivers/net/wireless/ath/ath9k/init.c
 +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -794,7 +794,8 @@ static void ath9k_init_txpower_limits(st
+@@ -824,7 +824,8 @@ static void ath9k_init_txpower_limits(st
  	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
  		ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
  
@@ -65,7 +65,7 @@
  }
  
  void ath9k_reload_chainmask_settings(struct ath_softc *sc)
-@@ -940,6 +941,18 @@ void ath9k_set_hw_capab(struct ath_softc
+@@ -954,6 +955,18 @@ void ath9k_set_hw_capab(struct ath_softc
  	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
  }
  
@@ -84,7 +84,7 @@
  int ath9k_init_device(u16 devid, struct ath_softc *sc,
  		    const struct ath_bus_ops *bus_ops)
  {
-@@ -985,6 +998,8 @@ int ath9k_init_device(u16 devid, struct 
+@@ -999,6 +1012,8 @@ int ath9k_init_device(u16 devid, struct 
  		ARRAY_SIZE(ath9k_tpt_blink));
  #endif
  
@@ -95,8 +95,8 @@
  	if (error)
 --- a/drivers/net/wireless/ath/ath9k/hw-ops.h
 +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
-@@ -78,6 +78,12 @@ static inline void ath9k_hw_antdiv_comb_
- 	ath9k_hw_ops(ah)->antdiv_comb_conf_set(ah, antconf);
+@@ -94,6 +94,12 @@ static inline void ath9k_hw_tx99_set_txp
+ 		ath9k_hw_ops(ah)->tx99_set_txpower(ah, power);
  }
  
 +static inline void ath9k_hw_get_adc_entropy(struct ath_hw *ah,
@@ -110,7 +110,7 @@
  static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
 --- a/drivers/net/wireless/ath/ath9k/link.c
 +++ b/drivers/net/wireless/ath/ath9k/link.c
-@@ -342,6 +342,11 @@ void ath_ani_calibrate(unsigned long dat
+@@ -354,6 +354,11 @@ void ath_ani_calibrate(unsigned long dat
  	unsigned int timestamp = jiffies_to_msecs(jiffies);
  	u32 cal_interval, short_cal_interval, long_cal_interval;
  	unsigned long flags;
@@ -120,11 +120,11 @@
 +	ath9k_hw_get_adc_entropy(ah, buf, sizeof(buf));
 +	add_device_randomness(buf, sizeof(buf));
  
- 	if (ah->caldata && ah->caldata->nfcal_interference)
+ 	if (ah->caldata && test_bit(NFCAL_INTF, &ah->caldata->cal_flags))
  		long_cal_interval = ATH_LONG_CALINTERVAL_INT;
 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
 +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -1299,9 +1299,30 @@ static void ar5008_hw_set_radar_conf(str
+@@ -1296,9 +1296,30 @@ static void ar5008_hw_set_radar_conf(str
  	conf->radar_inband = 8;
  }
  
@@ -155,7 +155,7 @@
  	static const u32 ar5416_cca_regs[6] = {
  		AR_PHY_CCA,
  		AR_PHY_CH1_CCA,
-@@ -1316,6 +1337,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
+@@ -1313,6 +1334,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
  	if (ret)
  	    return ret;
  

+ 2 - 2
package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch

@@ -22,10 +22,10 @@
 +#endif /* _RT2X00_PLATFORM_H */
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -39,6 +39,7 @@
- #include <linux/input-polldev.h>
+@@ -40,6 +40,7 @@
  #include <linux/kfifo.h>
  #include <linux/hrtimer.h>
+ #include <linux/average.h>
 +#include <linux/rt2x00_platform.h>
  
  #include <net/mac80211.h>

+ 168 - 156
package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch

@@ -1,6 +1,158 @@
+--- a/.local-symbols
++++ b/.local-symbols
+@@ -283,6 +283,7 @@ RT2X00_LIB_FIRMWARE=
+ RT2X00_LIB_CRYPTO=
+ RT2X00_LIB_LEDS=
+ RT2X00_LIB_DEBUGFS=
++RT2X00_LIB_EEPROM=
+ RT2X00_DEBUG=
+ RTL_CARDS=
+ RTL8192CE=
+--- a/drivers/net/wireless/rt2x00/Kconfig
++++ b/drivers/net/wireless/rt2x00/Kconfig
+@@ -69,6 +69,7 @@ config RT2800PCI
+ 	select RT2X00_LIB_MMIO
+ 	select RT2X00_LIB_PCI
+ 	select RT2X00_LIB_FIRMWARE
++	select RT2X00_LIB_EEPROM
+ 	select RT2X00_LIB_CRYPTO
+ 	depends on CRC_CCITT
+ 	depends on EEPROM_93CX6
+@@ -215,6 +216,7 @@ config RT2800SOC
+ 	select RT2X00_LIB_MMIO
+ 	select RT2X00_LIB_CRYPTO
+ 	select RT2X00_LIB_FIRMWARE
++	select RT2X00_LIB_EEPROM
+ 	select RT2800_LIB
+ 	select RT2800_LIB_MMIO
+ 	---help---
+@@ -266,6 +268,9 @@ config RT2X00_LIB_FIRMWARE
+ config RT2X00_LIB_CRYPTO
+ 	boolean
+ 
++config RT2X00_LIB_EEPROM
++	boolean
++
+ config RT2X00_LIB_LEDS
+ 	boolean
+ 	default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n)
+--- a/drivers/net/wireless/rt2x00/Makefile
++++ b/drivers/net/wireless/rt2x00/Makefile
+@@ -7,6 +7,7 @@ rt2x00lib-$(CPTCFG_RT2X00_LIB_DEBUGFS)	+
+ rt2x00lib-$(CPTCFG_RT2X00_LIB_CRYPTO)	+= rt2x00crypto.o
+ rt2x00lib-$(CPTCFG_RT2X00_LIB_FIRMWARE)	+= rt2x00firmware.o
+ rt2x00lib-$(CPTCFG_RT2X00_LIB_LEDS)	+= rt2x00leds.o
++rt2x00lib-$(CPTCFG_RT2X00_LIB_EEPROM)	+= rt2x00eeprom.o
+ 
+ obj-$(CPTCFG_RT2X00_LIB)		+= rt2x00lib.o
+ obj-$(CPTCFG_RT2X00_LIB_MMIO)		+= rt2x00mmio.o
+--- a/drivers/net/wireless/rt2x00/rt2800lib.h
++++ b/drivers/net/wireless/rt2x00/rt2800lib.h
+@@ -22,6 +22,8 @@
+ #ifndef RT2800LIB_H
+ #define RT2800LIB_H
+ 
++#include "rt2800.h"
++
+ struct rt2800_ops {
+ 	void (*register_read)(struct rt2x00_dev *rt2x00dev,
+ 			      const unsigned int offset, u32 *value);
+@@ -121,6 +123,15 @@ static inline int rt2800_read_eeprom(str
+ {
+ 	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
+ 
++	if (rt2x00dev->eeprom_file) {
++		memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data,
++		       EEPROM_SIZE);
++		return 0;
++	}
++
++	if (!rt2800ops->read_eeprom)
++		return -EINVAL;
++
+ 	return rt2800ops->read_eeprom(rt2x00dev);
+ }
+ 
+--- a/drivers/net/wireless/rt2x00/rt2800soc.c
++++ b/drivers/net/wireless/rt2x00/rt2800soc.c
+@@ -97,19 +97,6 @@ static int rt2800soc_set_device_state(st
+ 	return retval;
+ }
+ 
+-static int rt2800soc_read_eeprom(struct rt2x00_dev *rt2x00dev)
+-{
+-	void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
+-
+-	if (!base_addr)
+-		return -ENOMEM;
+-
+-	memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
+-
+-	iounmap(base_addr);
+-	return 0;
+-}
+-
+ /* Firmware functions */
+ static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev)
+ {
+@@ -173,7 +160,6 @@ static const struct rt2800_ops rt2800soc
+ 	.register_multiread	= rt2x00mmio_register_multiread,
+ 	.register_multiwrite	= rt2x00mmio_register_multiwrite,
+ 	.regbusy_read		= rt2x00mmio_regbusy_read,
+-	.read_eeprom		= rt2800soc_read_eeprom,
+ 	.hwcrypt_disabled	= rt2800soc_hwcrypt_disabled,
+ 	.drv_write_firmware	= rt2800soc_write_firmware,
+ 	.drv_init_registers	= rt2800mmio_init_registers,
+--- a/drivers/net/wireless/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/rt2x00/rt2x00.h
+@@ -696,6 +696,7 @@ enum rt2x00_capability_flags {
+ 	REQUIRE_SW_SEQNO,
+ 	REQUIRE_HT_TX_DESC,
+ 	REQUIRE_PS_AUTOWAKE,
++	REQUIRE_EEPROM_FILE,
+ 
+ 	/*
+ 	 * Capabilities
+@@ -965,6 +966,11 @@ struct rt2x00_dev {
+ 	const struct firmware *fw;
+ 
+ 	/*
++	 * EEPROM image.
++	 */
++	const struct firmware *eeprom_file;
++
++	/*
+ 	 * FIFO for storing tx status reports between isr and tasklet.
+ 	 */
+ 	DECLARE_KFIFO_PTR(txstatus_fifo, u32);
+--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
+@@ -1325,6 +1325,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
+ 	INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
+ 	INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
+ 
++	retval = rt2x00lib_load_eeprom_file(rt2x00dev);
++	if (retval)
++		goto exit;
++
+ 	/*
+ 	 * Let the driver probe the device to detect the capabilities.
+ 	 */
+@@ -1455,6 +1459,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
+ 	 */
+ 	if (rt2x00dev->drv_data)
+ 		kfree(rt2x00dev->drv_data);
++
++	/*
++	 * Free EEPROM image.
++	 */
++	rt2x00lib_free_eeprom_file(rt2x00dev);
+ }
+ EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
+ 
 --- /dev/null
 +++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
-@@ -0,0 +1,98 @@
+@@ -0,0 +1,111 @@
 +/*
 +	Copyright (C) 2004 - 2009 Ivo van Doorn <[email protected]>
 +	Copyright (C) 2004 - 2009 Gertjan van Wingerde <[email protected]>
@@ -33,13 +185,24 @@
 +#include "rt2x00.h"
 +#include "rt2x00lib.h"
 +
++static const char *
++rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
++{
++	struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
++
++	if (pdata && pdata->eeprom_file_name)
++		return pdata->eeprom_file_name;
++
++	return NULL
++}
++
 +static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
 +{
 +	const struct firmware *ee;
 +	char *ee_name;
 +	int retval;
 +
-+	ee_name = rt2x00dev->ops->lib->get_eeprom_file_name(rt2x00dev);
++	ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev);
 +	if (!ee_name) {
 +		rt2x00_err(rt2x00dev,
 +			   "Invalid EEPROM filename.\n"
@@ -82,9 +245,11 @@
 +{
 +	int retval;
 +
-+	if (!test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags))
++	if (!rt2x00lib_get_eeprom_file_name(rt2x00dev))
 +		return 0;
 +
++	set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags);
++
 +	if (!rt2x00dev->eeprom_file) {
 +		retval = rt2x00lib_request_eeprom_file(rt2x00dev);
 +		if (retval)
@@ -99,36 +264,6 @@
 +	release_firmware(rt2x00dev->eeprom_file);
 +	rt2x00dev->eeprom_file = NULL;
 +}
---- a/drivers/net/wireless/rt2x00/rt2x00.h
-+++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -550,6 +550,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);
-+	char *(*get_eeprom_file_name) (struct rt2x00_dev *rt2x00dev);
- 
- 	/*
- 	 * Device initialization/deinitialization handlers.
-@@ -706,6 +707,7 @@ enum rt2x00_capability_flags {
- 	REQUIRE_SW_SEQNO,
- 	REQUIRE_HT_TX_DESC,
- 	REQUIRE_PS_AUTOWAKE,
-+	REQUIRE_EEPROM_FILE,
- 
- 	/*
- 	 * Capabilities
-@@ -975,6 +977,11 @@ struct rt2x00_dev {
- 	const struct firmware *fw;
- 
- 	/*
-+	 * EEPROM image.
-+	 */
-+	const struct firmware *eeprom_file;
-+
-+	/*
- 	 * FIFO for storing tx status reports between isr and tasklet.
- 	 */
- 	DECLARE_KFIFO_PTR(txstatus_fifo, u32);
 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
 @@ -322,6 +322,22 @@ static inline void rt2x00lib_free_firmwa
@@ -154,119 +289,6 @@
   * Debugfs handlers.
   */
  #ifdef CPTCFG_RT2X00_LIB_DEBUGFS
---- a/drivers/net/wireless/rt2x00/Kconfig
-+++ b/drivers/net/wireless/rt2x00/Kconfig
-@@ -69,6 +69,7 @@ config RT2800PCI
- 	select RT2X00_LIB_PCI if PCI
- 	select RT2X00_LIB_SOC if SOC_RT288X || SOC_RT305X
- 	select RT2X00_LIB_FIRMWARE
-+	select RT2X00_LIB_EEPROM
- 	select RT2X00_LIB_CRYPTO
- 	depends on CRC_CCITT
- 	depends on EEPROM_93CX6
-@@ -244,6 +245,9 @@ config RT2X00_LIB_FIRMWARE
- config RT2X00_LIB_CRYPTO
- 	boolean
- 
-+config RT2X00_LIB_EEPROM
-+	boolean
-+
- config RT2X00_LIB_LEDS
- 	depends on !BACKPORT_KERNEL_2_6_25
- 	boolean
---- a/drivers/net/wireless/rt2x00/Makefile
-+++ b/drivers/net/wireless/rt2x00/Makefile
-@@ -7,6 +7,7 @@ rt2x00lib-$(CPTCFG_RT2X00_LIB_DEBUGFS)	+
- rt2x00lib-$(CPTCFG_RT2X00_LIB_CRYPTO)	+= rt2x00crypto.o
- rt2x00lib-$(CPTCFG_RT2X00_LIB_FIRMWARE)	+= rt2x00firmware.o
- rt2x00lib-$(CPTCFG_RT2X00_LIB_LEDS)	+= rt2x00leds.o
-+rt2x00lib-$(CPTCFG_RT2X00_LIB_EEPROM)	+= rt2x00eeprom.o
- 
- obj-$(CPTCFG_RT2X00_LIB)		+= rt2x00lib.o
- obj-$(CPTCFG_RT2X00_LIB_MMIO)		+= rt2x00mmio.o
---- a/drivers/net/wireless/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -90,25 +90,11 @@ static void rt2800pci_mcu_status(struct 
- 	rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
- }
- 
--#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);
--
--	if (!base_addr)
--		return -ENOMEM;
--
--	memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
--
--	iounmap(base_addr);
-+	memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE);
- 	return 0;
- }
--#else
--static inline int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
--{
--	return -ENOMEM;
--}
--#endif /* CONFIG_SOC_RT288X || CONFIG_SOC_RT305X */
- 
- #ifdef CONFIG_PCI
- static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
-@@ -332,6 +318,20 @@ static int rt2800pci_write_firmware(stru
- }
- 
- /*
-+ * EEPROM file functions.
-+ */
-+static char *rt2800pci_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
-+{
-+	struct rt2x00_platform_data *pdata;
-+
-+	pdata = rt2x00dev->dev->platform_data;
-+	if (pdata)
-+		return pdata->eeprom_file_name;
-+
-+	return NULL;
-+}
-+
-+/*
-  * Initialization functions.
-  */
- static bool rt2800pci_get_entry_state(struct queue_entry *entry)
-@@ -1160,6 +1160,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		= 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
-@@ -1325,6 +1325,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
- 	INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
- 	INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
- 
-+	retval = rt2x00lib_load_eeprom_file(rt2x00dev);
-+	if (retval)
-+		goto exit;
-+
- 	/*
- 	 * Let the driver probe the device to detect the capabilities.
- 	 */
-@@ -1455,6 +1459,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
- 	 */
- 	if (rt2x00dev->drv_data)
- 		kfree(rt2x00dev->drv_data);
-+
-+	/*
-+	 * Free EEPROM image.
-+	 */
-+	rt2x00lib_free_eeprom_file(rt2x00dev);
- }
- EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
- 
 --- a/drivers/net/wireless/rt2x00/rt2x00soc.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00soc.c
 @@ -94,6 +94,7 @@ int rt2x00soc_probe(struct platform_devi
@@ -277,13 +299,3 @@
  
  	rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC);
  
---- a/.local-symbols
-+++ b/.local-symbols
-@@ -272,6 +272,7 @@ RT2X00_LIB_FIRMWARE=
- RT2X00_LIB_CRYPTO=
- RT2X00_LIB_LEDS=
- RT2X00_LIB_DEBUGFS=
-+RT2X00_LIB_EEPROM=
- RT2X00_DEBUG=
- RTLWIFI=
- RTLWIFI_DEBUG=

+ 31 - 0
package/kernel/mac80211/patches/604-rt2x00-of_load_eeprom_filename.patch

@@ -0,0 +1,31 @@
+--- a/drivers/net/wireless/rt2x00/rt2x00eeprom.c
++++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
+@@ -26,6 +26,7 @@
+ 
+ #include <linux/kernel.h>
+ #include <linux/module.h>
++#include <linux/of.h>
+ 
+ #include "rt2x00.h"
+ #include "rt2x00lib.h"
+@@ -34,11 +35,19 @@ static const char *
+ rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
+ {
+ 	struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
++	struct device_node *np;
++	char *eep;
+ 
+ 	if (pdata && pdata->eeprom_file_name)
+ 		return pdata->eeprom_file_name;
+ 
+-	return NULL
++#ifdef CONFIG_OF
++	np = rt2x00dev->dev->of_node;
++	if (np && of_property_read_string(np, "ralink,eeprom", &eep) == 0)
++	    return eep;
++#endif
++
++	return NULL;
+ }
+ 
+ static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)

+ 34 - 24
package/kernel/mac80211/patches/617-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch → package/kernel/mac80211/patches/605-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch

@@ -12,32 +12,35 @@ Signed-off-by: John Crispin <[email protected]>
 
 --- a/drivers/net/wireless/rt2x00/Kconfig
 +++ b/drivers/net/wireless/rt2x00/Kconfig
-@@ -71,6 +71,7 @@ config RT2800PCI
- 	select RT2X00_LIB_FIRMWARE
+@@ -219,6 +219,7 @@ config RT2800SOC
  	select RT2X00_LIB_EEPROM
- 	select RT2X00_LIB_CRYPTO
+ 	select RT2800_LIB
+ 	select RT2800_LIB_MMIO
 +	select MTD if SOC_RT288X || SOC_RT305X
- 	depends on CRC_CCITT
- 	depends on EEPROM_93CX6
  	---help---
+ 	  This adds support for Ralink WiSoC devices.
+ 	  Supported chips: RT2880, RT3050, RT3052, RT3350, RT3352.
 --- a/drivers/net/wireless/rt2x00/rt2x00eeprom.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00eeprom.c
-@@ -30,12 +30,77 @@
- #include "rt2x00.h"
- #include "rt2x00lib.h"
+@@ -26,17 +26,72 @@
  
-+#ifdef CONFIG_OF
-+#include <linux/of.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
 +#include <linux/mtd/mtd.h>
 +#include <linux/mtd/partitions.h>
-+
-+static struct firmware mtd_fw;
-+
-+static int rt2800pci_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
+ #include <linux/of.h>
+ 
+ #include "rt2x00.h"
+ #include "rt2x00lib.h"
+ 
++static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
 +{
++	int ret = -EINVAL;
++#ifdef CONFIG_OF
++	static struct firmware mtd_fw;
 +	struct device_node *np = rt2x00dev->dev->of_node, *mtd_np = NULL;
 +	size_t retlen, len = rt2x00dev->ops->eeprom_size;
-+	int ret, size, offset = 0;
++	int size, offset = 0;
 +	struct mtd_info *mtd;
 +	const char *part;
 +	const __be32 *list;
@@ -78,25 +81,32 @@ Signed-off-by: John Crispin <[email protected]>
 +		mtd_fw.size = len;
 +		mtd_fw.data = rt2x00dev->eeprom;
 +	}
++#endif
 +
 +	return ret;
 +}
-+#else
-+static inline int rt2800pci_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
-+{
-+	return -EINVAL;
-+}
-+#endif
 +
+ static const char *
+ rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
+ {
+ 	struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
+ 	struct device_node *np;
+-	char *eep;
++	const char *eep;
+ 
+ 	if (pdata && pdata->eeprom_file_name)
+ 		return pdata->eeprom_file_name;
+@@ -53,9 +108,12 @@ rt2x00lib_get_eeprom_file_name(struct rt
  static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
  {
  	const struct firmware *ee;
- 	char *ee_name;
+-	char *ee_name;
++	const char *ee_name;
  	int retval;
  
-+	if (!rt2800pci_read_eeprom_mtd(rt2x00dev))
++	if (!rt2800lib_read_eeprom_mtd(rt2x00dev))
 +		return 0;
 +
- 	ee_name = rt2x00dev->ops->lib->get_eeprom_file_name(rt2x00dev);
+ 	ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev);
  	if (!ee_name) {
  		rt2x00_err(rt2x00dev,

+ 0 - 46
package/kernel/mac80211/patches/605-rt2x00-pci-eeprom.patch

@@ -1,46 +0,0 @@
---- a/drivers/net/wireless/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -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;
-@@ -1097,8 +1097,9 @@ static int rt2800pci_read_eeprom(struct 
- {
- 	int retval;
- 
--	if (rt2x00_is_soc(rt2x00dev))
--		retval = rt2800pci_read_eeprom_soc(rt2x00dev);
-+	if (rt2x00_is_soc(rt2x00dev) ||
-+	    test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags))
-+		retval = rt2800pci_read_eeprom_file(rt2x00dev);
- 	else if (rt2800pci_efuse_detect(rt2x00dev))
- 		retval = rt2800pci_read_eeprom_efuse(rt2x00dev);
- 	else
---- a/drivers/net/wireless/rt2x00/rt2x00pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
-@@ -78,6 +78,7 @@ exit:
- int rt2x00pci_probe(struct pci_dev *pci_dev, const struct rt2x00_ops *ops)
- {
- 	struct ieee80211_hw *hw;
-+	struct rt2x00_platform_data *pdata;
- 	struct rt2x00_dev *rt2x00dev;
- 	int retval;
- 	u16 chip;
-@@ -125,6 +126,12 @@ int rt2x00pci_probe(struct pci_dev *pci_
- 	rt2x00dev->irq = pci_dev->irq;
- 	rt2x00dev->name = pci_name(pci_dev);
- 
-+	/* if we get passed the name of a eeprom_file_name, then use this in
-+	   favour of the eeprom */
-+	pdata = rt2x00dev->dev->platform_data;
-+	if (pdata && pdata->eeprom_file_name)
-+		set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags);
-+
- 	if (pci_is_pcie(pci_dev))
- 		rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_PCIE);
- 	else

+ 1 - 1
package/kernel/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
-@@ -415,6 +415,7 @@ struct hw_mode_spec {
+@@ -405,6 +405,7 @@ struct hw_mode_spec {
  	unsigned int supported_bands;
  #define SUPPORT_BAND_2GHZ	0x00000001
  #define SUPPORT_BAND_5GHZ	0x00000002

+ 1 - 1
package/kernel/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
-@@ -1327,6 +1327,7 @@ static inline void rt2x00debug_dump_fram
+@@ -1403,6 +1403,7 @@ static inline void rt2x00debug_dump_fram
   */
  u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
  			 struct ieee80211_vif *vif);

+ 16 - 16
package/kernel/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
-@@ -3186,11 +3186,17 @@ static void rt2800_config_channel(struct
+@@ -3178,11 +3178,17 @@ static void rt2800_config_channel(struct
  	/*
  	 * Change BBP settings
  	 */
@@ -18,7 +18,7 @@
  	} else if (rt2x00_rt(rt2x00dev, RT3593)) {
  		if (rf->channel > 14) {
  			/* Disable CCK Packet detection on 5GHz */
-@@ -3204,14 +3210,8 @@ static void rt2800_config_channel(struct
+@@ -3196,14 +3202,8 @@ static void rt2800_config_channel(struct
  		else
  			rt2800_bbp_write(rt2x00dev, 105, 0x34);
  
@@ -33,7 +33,7 @@
  		rt2800_bbp_write(rt2x00dev, 86, 0);
  	}
  
-@@ -6093,6 +6093,12 @@ static void rt2800_init_rfcsr_3290(struc
+@@ -6127,6 +6127,12 @@ static void rt2800_init_rfcsr_3290(struc
  
  static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
  {
@@ -46,7 +46,7 @@
  	rt2800_rf_init_calibration(rt2x00dev, 30);
  
  	rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
-@@ -6128,15 +6134,30 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -6162,15 +6168,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);
@@ -80,7 +80,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
  	rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
-@@ -6144,15 +6165,20 @@ static void rt2800_init_rfcsr_3352(struc
+@@ -6178,15 +6199,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);
@@ -110,7 +110,7 @@
  	rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
  	rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
-@@ -7004,6 +7030,7 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7046,6 +7072,7 @@ static int rt2800_init_eeprom(struct rt2
  	 * RT53xx: defined in "EEPROM_CHIP_ID" field
  	 */
  	if (rt2x00_rt(rt2x00dev, RT3290) ||
@@ -118,7 +118,7 @@
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
-@@ -7094,7 +7121,8 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7137,7 +7164,8 @@ static int rt2800_init_eeprom(struct rt2
  	/*
  	 * Detect if this device has Bluetooth co-existence.
  	 */
@@ -128,7 +128,7 @@
  		__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
  
  	/*
-@@ -7123,6 +7151,22 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7166,6 +7194,22 @@ static int rt2800_init_eeprom(struct rt2
  					EIRP_MAX_TX_POWER_LIMIT)
  		__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
  
@@ -153,7 +153,7 @@
  
 --- a/drivers/net/wireless/rt2x00/rt2800.h
 +++ b/drivers/net/wireless/rt2x00/rt2800.h
-@@ -2299,6 +2299,12 @@ struct mac_iveiv_entry {
+@@ -2301,6 +2301,12 @@ struct mac_iveiv_entry {
  #define RFCSR36_RF_BS			FIELD8(0x80)
  
  /*
@@ -166,7 +166,7 @@
   * RFCSR 38:
   */
  #define RFCSR38_RX_LO1_EN		FIELD8(0x20)
-@@ -2310,6 +2316,18 @@ struct mac_iveiv_entry {
+@@ -2312,6 +2318,18 @@ struct mac_iveiv_entry {
  #define RFCSR39_RX_LO2_EN		FIELD8(0x80)
  
  /*
@@ -185,7 +185,7 @@
   * RFCSR 49:
   */
  #define RFCSR49_TX			FIELD8(0x3f)
-@@ -2322,6 +2340,8 @@ struct mac_iveiv_entry {
+@@ -2324,6 +2342,8 @@ struct mac_iveiv_entry {
   * RFCSR 50:
   */
  #define RFCSR50_TX			FIELD8(0x3f)
@@ -194,7 +194,7 @@
  #define RFCSR50_EP			FIELD8(0xc0)
  /* bits for RT3593 */
  #define RFCSR50_TX_LO1_EN		FIELD8(0x20)
-@@ -2469,6 +2489,8 @@ enum rt2800_eeprom_word {
+@@ -2471,6 +2491,8 @@ enum rt2800_eeprom_word {
   * INTERNAL_TX_ALC: 0: disable, 1: enable
   * BT_COEXIST: 0: disable, 1: enable
   * DAC_TEST: 0: disable, 1: enable
@@ -202,9 +202,9 @@
 + * EXTERNAL_TX1_PA: 0: disable, 1: enable (only on RT3352)
   */
  #define EEPROM_NIC_CONF1_HW_RADIO		FIELD16(0x0001)
- #define EEPROM_NIC_CONF1_EXTERNAL_TX_ALC		FIELD16(0x0002)
-@@ -2485,6 +2507,8 @@ enum rt2800_eeprom_word {
- #define EEPROM_NIC_CONF1_INTERNAL_TX_ALC		FIELD16(0x2000)
+ #define EEPROM_NIC_CONF1_EXTERNAL_TX_ALC	FIELD16(0x0002)
+@@ -2487,6 +2509,8 @@ enum rt2800_eeprom_word {
+ #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)
 +#define EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352	FIELD16(0x4000)
@@ -214,7 +214,7 @@
   * EEPROM frequency
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -727,6 +727,8 @@ enum rt2x00_capability_flags {
+@@ -716,6 +716,8 @@ enum rt2x00_capability_flags {
  	CAPABILITY_DOUBLE_ANTENNA,
  	CAPABILITY_BT_COEXIST,
  	CAPABILITY_VCO_RECALIBRATION,

+ 13 - 22
package/kernel/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
-@@ -7509,6 +7509,27 @@ static const struct rf_channel rf_vals_3
- 	{173, 0x61, 0, 9},
+@@ -7486,6 +7486,27 @@ static const struct rf_channel rf_vals_5
+ 	{196, 83, 0, 12, 1},
  };
  
 +/*
@@ -28,28 +28,19 @@
  static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  {
  	struct hw_mode_spec *spec = &rt2x00dev->spec;
-@@ -7589,7 +7610,6 @@ static int rt2800_probe_hw_mode(struct r
- 		   rt2x00_rf(rt2x00dev, RF3022) ||
- 		   rt2x00_rf(rt2x00dev, RF3290) ||
- 		   rt2x00_rf(rt2x00dev, RF3320) ||
--		   rt2x00_rf(rt2x00dev, RF3322) ||
- 		   rt2x00_rf(rt2x00dev, RF5360) ||
- 		   rt2x00_rf(rt2x00dev, RF5370) ||
- 		   rt2x00_rf(rt2x00dev, RF5372) ||
-@@ -7597,6 +7617,12 @@ static int rt2800_probe_hw_mode(struct r
- 		   rt2x00_rf(rt2x00dev, RF5392)) {
+@@ -7574,7 +7595,10 @@ static int rt2800_probe_hw_mode(struct r
+ 	case RF5390:
+ 	case RF5392:
  		spec->num_channels = 14;
- 		spec->channels = rf_vals_3x;
-+	} else if (rt2x00_rf(rt2x00dev, RF3322)) {
-+		spec->num_channels = 14;
+-		spec->channels = rf_vals_3x;
 +		if (spec->clk_is_20mhz)
 +			spec->channels = rf_vals_xtal20mhz_3x;
 +		else
 +			spec->channels = rf_vals_3x;
- 	} else if (rt2x00_rf(rt2x00dev, RF3052)) {
- 		spec->supported_bands |= SUPPORT_BAND_5GHZ;
- 		spec->num_channels = ARRAY_SIZE(rf_vals_3x);
-@@ -7769,6 +7795,19 @@ static int rt2800_probe_rt(struct rt2x00
+ 		break;
+ 
+ 	case RF3052:
+@@ -7750,6 +7774,19 @@ static int rt2800_probe_rt(struct rt2x00
  	return 0;
  }
  
@@ -69,7 +60,7 @@
  int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  {
  	int retval;
-@@ -7798,6 +7837,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
+@@ -7779,6 +7816,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  	rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
  
  	/*
@@ -87,7 +78,7 @@
  	retval = rt2800_probe_hw_mode(rt2x00dev);
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -410,6 +410,7 @@ static inline struct rt2x00_intf* vif_to
+@@ -400,6 +400,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 +86,7 @@
   */
  struct hw_mode_spec {
  	unsigned int supported_bands;
-@@ -426,6 +427,7 @@ struct hw_mode_spec {
+@@ -416,6 +417,7 @@ struct hw_mode_spec {
  	const struct channel_info *channels_info;
  
  	struct ieee80211_sta_ht_cap ht;

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

@@ -11,10 +11,10 @@ Signed-off-by: John Crispin <[email protected]>
  drivers/net/wireless/rt2x00/rt2800pci.c |    7 +++++++
  1 file changed, 7 insertions(+)
 
---- a/drivers/net/wireless/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -1318,11 +1318,18 @@ static int rt2800soc_probe(struct platfo
- 	return rt2x00soc_probe(pdev, &rt2800pci_ops);
+--- a/drivers/net/wireless/rt2x00/rt2800soc.c
++++ b/drivers/net/wireless/rt2x00/rt2800soc.c
+@@ -229,11 +229,18 @@ static int rt2800soc_probe(struct platfo
+ 	return rt2x00soc_probe(pdev, &rt2800soc_ops);
  }
  
 +static const struct of_device_id rt2880_wmac_match[] = {

+ 0 - 28
package/kernel/mac80211/patches/614-rt2x00-of_load_eeprom_filename.patch

@@ -1,28 +0,0 @@
---- a/drivers/net/wireless/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
-@@ -39,6 +39,7 @@
- #include <linux/pci.h>
- #include <linux/platform_device.h>
- #include <linux/eeprom_93cx6.h>
-+#include <linux/of.h>
- 
- #include "rt2x00.h"
- #include "rt2x00mmio.h"
-@@ -323,11 +324,17 @@ static int rt2800pci_write_firmware(stru
- static char *rt2800pci_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
- {
- 	struct rt2x00_platform_data *pdata;
-+	struct device_node *np;
-+	char *eep;
- 
- 	pdata = rt2x00dev->dev->platform_data;
- 	if (pdata)
- 		return pdata->eeprom_file_name;
- 
-+	np = rt2x00dev->dev->of_node;
-+	if (np && !of_property_read_string(np, "ralink,eeprom", &eep))
-+		return eep;
-+
- 	return NULL;
- }
- 

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

@@ -8,7 +8,7 @@
  
  #include "rt2x00.h"
  #include "rt2800lib.h"
-@@ -7797,13 +7798,14 @@ static int rt2800_probe_rt(struct rt2x00
+@@ -7776,13 +7777,14 @@ static int rt2800_probe_rt(struct rt2x00
  
  int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev)
  {

+ 44 - 48
package/kernel/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
-@@ -71,6 +71,7 @@
- #define RF3053				0x000d
+@@ -73,6 +73,7 @@
  #define RF5592				0x000f
+ #define RF3070				0x3070
  #define RF3290				0x3290
 +#define RF5350				0x5350
  #define RF5360				0x5360
@@ -10,39 +10,37 @@
  #define RF5372				0x5372
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -2675,6 +2675,15 @@ static void rt2800_config_channel_rf53xx
- 	if (rf->channel <= 14) {
- 		int idx = rf->channel-1;
+@@ -2707,6 +2707,13 @@ static void rt2800_config_channel_rf53xx
  
-+		if (rt2x00_rt(rt2x00dev, RT5350)) {
-+			static const char r59_non_bt[] = {0x0b, 0x0b,
-+				0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
-+				0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
+ 				rt2800_rfcsr_write(rt2x00dev, 59,
+ 						   r59_non_bt[idx]);
++			} else if (rt2x00_rt(rt2x00dev, RT5350)) {
++				static const char r59_non_bt[] = {0x0b, 0x0b,
++					0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
++					0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
 +
-+			rt2800_rfcsr_write(rt2x00dev, 59,
-+					   r59_non_bt[idx]);
-+		}
-+
- 		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 */
-@@ -3153,6 +3162,7 @@ static void rt2800_config_channel(struct
- 	case RF3322:
++				rt2800_rfcsr_write(rt2x00dev, 59,
++						   r59_non_bt[idx]);
+ 			}
+ 		}
+ 	}
+@@ -3144,6 +3151,7 @@ static void rt2800_config_channel(struct
  		rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
  		break;
+ 	case RF3070:
 +	case RF5350:
  	case RF5360:
  	case RF5370:
  	case RF5372:
-@@ -3169,6 +3179,7 @@ static void rt2800_config_channel(struct
- 
- 	if (rt2x00_rf(rt2x00dev, RF3290) ||
+@@ -3161,6 +3169,7 @@ static void rt2800_config_channel(struct
+ 	if (rt2x00_rf(rt2x00dev, RF3070) ||
+ 	    rt2x00_rf(rt2x00dev, RF3290) ||
  	    rt2x00_rf(rt2x00dev, RF3322) ||
 +	    rt2x00_rf(rt2x00dev, RF5350) ||
  	    rt2x00_rf(rt2x00dev, RF5360) ||
  	    rt2x00_rf(rt2x00dev, RF5370) ||
  	    rt2x00_rf(rt2x00dev, RF5372) ||
-@@ -3393,7 +3404,8 @@ static void rt2800_config_channel(struct
+@@ -3401,7 +3410,8 @@ static void rt2800_config_channel(struct
  	/*
  	 * Clear update flag
  	 */
@@ -52,15 +50,15 @@
  		rt2800_bbp_read(rt2x00dev, 49, &bbp);
  		rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
  		rt2800_bbp_write(rt2x00dev, 49, bbp);
-@@ -4266,6 +4278,7 @@ void rt2800_vco_calibration(struct rt2x0
- 		break;
+@@ -4275,6 +4285,7 @@ void rt2800_vco_calibration(struct rt2x0
  	case RF3053:
+ 	case RF3070:
  	case RF3290:
 +	case RF5350:
  	case RF5360:
  	case RF5370:
  	case RF5372:
-@@ -4637,6 +4650,8 @@ static int rt2800_init_registers(struct 
+@@ -4671,6 +4682,8 @@ static int rt2800_init_registers(struct 
  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
  		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
@@ -69,7 +67,7 @@
  	} else {
  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
  		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-@@ -5278,9 +5293,13 @@ static void rt2800_init_bbp_3352(struct 
+@@ -5312,9 +5325,13 @@ static void rt2800_init_bbp_3352(struct 
  
  	rt2800_bbp_write(rt2x00dev, 82, 0x62);
  
@@ -86,7 +84,7 @@
  
  	rt2800_bbp_write(rt2x00dev, 86, 0x38);
  
-@@ -5294,9 +5313,13 @@ static void rt2800_init_bbp_3352(struct 
+@@ -5328,9 +5345,13 @@ static void rt2800_init_bbp_3352(struct 
  
  	rt2800_bbp_write(rt2x00dev, 104, 0x92);
  
@@ -103,7 +101,7 @@
  
  	rt2800_bbp_write(rt2x00dev, 120, 0x50);
  
-@@ -5321,6 +5344,13 @@ static void rt2800_init_bbp_3352(struct 
+@@ -5355,6 +5376,13 @@ static void rt2800_init_bbp_3352(struct 
  	rt2800_bbp_write(rt2x00dev, 143, 0xa2);
  
  	rt2800_bbp_write(rt2x00dev, 148, 0xc8);
@@ -117,7 +115,7 @@
  }
  
  static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
-@@ -5621,6 +5651,7 @@ static void rt2800_init_bbp(struct rt2x0
+@@ -5655,6 +5683,7 @@ static void rt2800_init_bbp(struct rt2x0
  		rt2800_init_bbp_3290(rt2x00dev);
  		break;
  	case RT3352:
@@ -125,7 +123,7 @@
  		rt2800_init_bbp_3352(rt2x00dev);
  		break;
  	case RT3390:
-@@ -6431,6 +6462,76 @@ static void rt2800_init_rfcsr_3593(struc
+@@ -6465,6 +6494,76 @@ static void rt2800_init_rfcsr_3593(struc
  	/* TODO: enable stream mode support */
  }
  
@@ -202,7 +200,7 @@
  static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
  {
  	rt2800_rf_init_calibration(rt2x00dev, 2);
-@@ -6662,6 +6763,9 @@ static void rt2800_init_rfcsr(struct rt2
+@@ -6695,6 +6794,9 @@ static void rt2800_init_rfcsr(struct rt2
  	case RT3593:
  		rt2800_init_rfcsr_3593(rt2x00dev);
  		break;
@@ -212,7 +210,7 @@
  	case RT5390:
  		rt2800_init_rfcsr_5390(rt2x00dev);
  		break;
-@@ -6902,6 +7006,12 @@ static int rt2800_validate_eeprom(struct
+@@ -6944,6 +7046,12 @@ static int rt2800_validate_eeprom(struct
  		rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
  		rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
  		rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
@@ -225,7 +223,7 @@
  	} else if (rt2x00_rt(rt2x00dev, RT2860) ||
  		   rt2x00_rt(rt2x00dev, RT2872)) {
  		/*
-@@ -7035,6 +7145,8 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7077,6 +7185,8 @@ static int rt2800_init_eeprom(struct rt2
  	    rt2x00_rt(rt2x00dev, RT5390) ||
  	    rt2x00_rt(rt2x00dev, RT5392))
  		rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
@@ -234,7 +232,15 @@
  	else
  		rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
  
-@@ -7052,6 +7164,7 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7095,6 +7205,7 @@ static int rt2800_init_eeprom(struct rt2
+ 	case RF3290:
+ 	case RF3320:
+ 	case RF3322:
++	case RF5350:
+ 	case RF5360:
+ 	case RF5370:
+ 	case RF5372:
+@@ -7590,6 +7701,7 @@ static int rt2800_probe_hw_mode(struct r
  	case RF3290:
  	case RF3320:
  	case RF3322:
@@ -242,25 +248,15 @@
  	case RF5360:
  	case RF5370:
  	case RF5372:
-@@ -7618,7 +7731,8 @@ static int rt2800_probe_hw_mode(struct r
- 		   rt2x00_rf(rt2x00dev, RF5392)) {
- 		spec->num_channels = 14;
- 		spec->channels = rf_vals_3x;
--	} else if (rt2x00_rf(rt2x00dev, RF3322)) {
-+	} else if (rt2x00_rf(rt2x00dev, RF3322) ||
-+		   rt2x00_rf(rt2x00dev, RF5350)) {
- 		spec->num_channels = 14;
- 		if (spec->clk_is_20mhz)
- 			spec->channels = rf_vals_xtal20mhz_3x;
-@@ -7743,6 +7857,7 @@ static int rt2800_probe_hw_mode(struct r
- 	case RF3052:
+@@ -7722,6 +7834,7 @@ static int rt2800_probe_hw_mode(struct r
  	case RF3053:
+ 	case RF3070:
  	case RF3290:
 +	case RF5350:
  	case RF5360:
  	case RF5370:
  	case RF5372:
-@@ -7781,6 +7896,7 @@ static int rt2800_probe_rt(struct rt2x00
+@@ -7760,6 +7873,7 @@ static int rt2800_probe_rt(struct rt2x00
  	case RT3390:
  	case RT3572:
  	case RT3593:
@@ -270,7 +266,7 @@
  	case RT5592:
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -181,6 +181,7 @@ struct rt2x00_chip {
+@@ -171,6 +171,7 @@ struct rt2x00_chip {
  #define RT3572		0x3572
  #define RT3593		0x3593
  #define RT3883		0x3883	/* WSOC */

+ 0 - 32
package/kernel/mac80211/patches/618-rt2x00-msi-fix.patch

@@ -1,32 +0,0 @@
---- a/drivers/net/wireless/rt2x00/rt2x00pci.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
-@@ -108,7 +108,9 @@ int rt2x00pci_probe(struct pci_dev *pci_
- 		goto exit_release_regions;
- 	}
- 
-+#ifdef CONFIG_PCI_MSI
- 	pci_enable_msi(pci_dev);
-+#endif
- 
- 	hw = ieee80211_alloc_hw(sizeof(struct rt2x00_dev), ops->hw);
- 	if (!hw) {
-@@ -162,7 +164,9 @@ exit_free_device:
- 	ieee80211_free_hw(hw);
- 
- exit_disable_msi:
-+#ifdef CONFIG_PCI_SET_MWI
- 	pci_disable_msi(pci_dev);
-+#endif
- 
- exit_release_regions:
- 	pci_release_regions(pci_dev);
-@@ -188,7 +192,9 @@ void rt2x00pci_remove(struct pci_dev *pc
- 	rt2x00pci_free_reg(rt2x00dev);
- 	ieee80211_free_hw(hw);
- 
-+#ifdef CONFIG_PCI_MSI
- 	pci_disable_msi(pci_dev);
-+#endif
- 
- 	/*
- 	 * Free the PCI device data.

+ 1 - 1
package/kernel/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch

@@ -8,7 +8,7 @@
  
  #include "rt2x00.h"
  #include "rt2800lib.h"
-@@ -7253,6 +7254,17 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7294,6 +7295,17 @@ static int rt2800_init_eeprom(struct rt2
  	rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
  	rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
  

+ 1 - 1
package/kernel/mac80211/patches/620-rt2x00-rt3352-rf-id.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/rt2x00/rt2800lib.c
 +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -7142,10 +7142,11 @@ static int rt2800_init_eeprom(struct rt2
+@@ -7182,10 +7182,11 @@ static int rt2800_init_eeprom(struct rt2
  	 * RT53xx: defined in "EEPROM_CHIP_ID" field
  	 */
  	if (rt2x00_rt(rt2x00dev, RT3290) ||

+ 0 - 27
package/kernel/mac80211/patches/750-rtlwifi-Align-private-space-in-rtl_priv-struct.patch

@@ -1,27 +0,0 @@
-From 60ce314d1750fef843e9db70050e09e49f838b69 Mon Sep 17 00:00:00 2001
-From: Larry Finger <[email protected]>
-Date: Thu, 19 Sep 2013 02:21:35 +0000
-Subject: rtlwifi: Align private space in rtl_priv struct
-
-The private array at the end of the rtl_priv struct is not aligned.
-On ARM architecture, this causes an alignment trap and is fixed by aligning
-that array with __align(sizeof(void *)). That should properly align that
-space according to the requirements of all architectures.
-
-Reported-by: Jason Andrews <[email protected]>
-Tested-by: Jason Andrews <[email protected]>
-Signed-off-by: Larry Finger <[email protected]>
-Cc: Stable <[email protected]>
-Signed-off-by: John W. Linville <[email protected]>
----
---- a/drivers/net/wireless/rtlwifi/wifi.h
-+++ b/drivers/net/wireless/rtlwifi/wifi.h
-@@ -2057,7 +2057,7 @@ struct rtl_priv {
- 	   that it points to the data allocated
- 	   beyond  this structure like:
- 	   rtl_pci_priv or rtl_usb_priv */
--	u8 priv[0];
-+	u8 priv[0] __aligned(sizeof(void *));
- };
- 
- #define rtl_priv(hw)		(((struct rtl_priv *)(hw)->priv))

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

@@ -42,7 +42,7 @@
  
  	if (wl->radio_enabled != phy->radio_on) {
  		if (wl->radio_enabled) {
-@@ -5028,6 +5025,47 @@ static int b43_op_get_survey(struct ieee
+@@ -5029,6 +5026,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,
-@@ -5049,6 +5087,8 @@ static const struct ieee80211_ops b43_hw
+@@ -5050,6 +5088,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.
-@@ -5295,6 +5335,8 @@ static int b43_one_core_attach(struct b4
+@@ -5292,6 +5332,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;
-@@ -5385,6 +5427,9 @@ static struct b43_wl *b43_wireless_init(
+@@ -5382,6 +5424,9 @@ static struct b43_wl *b43_wireless_init(
  
  	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
  

+ 5 - 5
package/kernel/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
-@@ -1061,6 +1061,32 @@ static inline bool b43_using_pio_transfe
+@@ -1058,6 +1058,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
-@@ -5417,14 +5417,14 @@ static inline void check_phyreg(struct b
+@@ -5418,14 +5418,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);
  }
  
-@@ -5432,7 +5432,7 @@ static void b43_nphy_op_maskset(struct b
+@@ -5433,7 +5433,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);
  }
  
-@@ -5443,7 +5443,7 @@ static u16 b43_nphy_op_radio_read(struct
+@@ -5444,7 +5444,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);
  }
  
-@@ -5452,7 +5452,7 @@ static void b43_nphy_op_radio_write(stru
+@@ -5453,7 +5453,7 @@ static void b43_nphy_op_radio_write(stru
  	/* Register 1 is a 32-bit register. */
  	B43_WARN_ON(reg == 1);
  

+ 29 - 0
package/kernel/mac80211/patches/850-brcmsmac-remove-extra-regulation-restriction.patch

@@ -0,0 +1,29 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
+@@ -58,21 +58,12 @@
+ 				 (((c) < 149) ? 3 : 4))))
+ 
+ #define BRCM_2GHZ_2412_2462	REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
+-#define BRCM_2GHZ_2467_2472	REG_RULE(2467-10, 2472+10, 20, 0, 19, \
+-					 NL80211_RRF_NO_IR)
++#define BRCM_2GHZ_2467_2472	REG_RULE(2467-10, 2472+10, 20, 0, 19, 0)
+ 
+-#define BRCM_5GHZ_5180_5240	REG_RULE(5180-10, 5240+10, 40, 0, 21, \
+-					 NL80211_RRF_NO_IR)
+-#define BRCM_5GHZ_5260_5320	REG_RULE(5260-10, 5320+10, 40, 0, 21, \
+-					 NL80211_RRF_NO_IR | \
+-					 NL80211_RRF_DFS | \
+-					 NL80211_RRF_NO_IR)
+-#define BRCM_5GHZ_5500_5700	REG_RULE(5500-10, 5700+10, 40, 0, 21, \
+-					 NL80211_RRF_NO_IR | \
+-					 NL80211_RRF_DFS | \
+-					 NL80211_RRF_NO_IR)
+-#define BRCM_5GHZ_5745_5825	REG_RULE(5745-10, 5825+10, 40, 0, 21, \
+-					 NL80211_RRF_NO_IR)
++#define BRCM_5GHZ_5180_5240	REG_RULE(5180-10, 5240+10, 40, 0, 21, 0)
++#define BRCM_5GHZ_5260_5320	REG_RULE(5260-10, 5320+10, 40, 0, 21, 0)
++#define BRCM_5GHZ_5500_5700	REG_RULE(5500-10, 5700+10, 40, 0, 21, 0)
++#define BRCM_5GHZ_5745_5825	REG_RULE(5745-10, 5825+10, 40, 0, 21, 0)
+ 
+ static const struct ieee80211_regdomain brcms_regdom_x2 = {
+ 	.n_reg_rules = 6,

+ 0 - 31
package/kernel/mac80211/patches/851-brcmsmac-remove-extra-regulation-restriction.patch

@@ -1,31 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
-@@ -59,23 +59,16 @@
- 
- #define BRCM_2GHZ_2412_2462	REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
- #define BRCM_2GHZ_2467_2472	REG_RULE(2467-10, 2472+10, 20, 0, 19, \
--					 NL80211_RRF_PASSIVE_SCAN | \
--					 NL80211_RRF_NO_IBSS)
-+					 0)
- 
- #define BRCM_5GHZ_5180_5240	REG_RULE(5180-10, 5240+10, 40, 0, 21, \
--					 NL80211_RRF_PASSIVE_SCAN | \
--					 NL80211_RRF_NO_IBSS)
-+					 0)
- #define BRCM_5GHZ_5260_5320	REG_RULE(5260-10, 5320+10, 40, 0, 21, \
--					 NL80211_RRF_PASSIVE_SCAN | \
--					 NL80211_RRF_DFS | \
--					 NL80211_RRF_NO_IBSS)
-+					 0)
- #define BRCM_5GHZ_5500_5700	REG_RULE(5500-10, 5700+10, 40, 0, 21, \
--					 NL80211_RRF_PASSIVE_SCAN | \
--					 NL80211_RRF_DFS | \
--					 NL80211_RRF_NO_IBSS)
-+					 0)
- #define BRCM_5GHZ_5745_5825	REG_RULE(5745-10, 5825+10, 40, 0, 21, \
--					 NL80211_RRF_PASSIVE_SCAN | \
--					 NL80211_RRF_NO_IBSS)
-+					 0)
- 
- static const struct ieee80211_regdomain brcms_regdom_x2 = {
- 	.n_reg_rules = 6,

+ 0 - 84
package/kernel/mac80211/patches/860-brcmsmac-use-bcma-PCIe-up-and-down-functions.patch

@@ -1,84 +0,0 @@
-brcmsmac: use bcma PCIe up and down functions
-
-replace the calls to bcma_core_pci_extend_L1timer() by calls to the
-newly introduced bcma_core_pci_ip() and bcma_core_pci_down()
-
-Signed-off-by: Hauke Mehrtens <[email protected]>
-
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-@@ -679,27 +679,6 @@ bool ai_clkctl_cc(struct si_pub *sih, en
- 	return mode == BCMA_CLKMODE_FAST;
- }
- 
--void ai_pci_up(struct si_pub *sih)
--{
--	struct si_info *sii;
--
--	sii = container_of(sih, struct si_info, pub);
--
--	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
--		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci[0], true);
--}
--
--/* Unconfigure and/or apply various WARs when going down */
--void ai_pci_down(struct si_pub *sih)
--{
--	struct si_info *sii;
--
--	sii = container_of(sih, struct si_info, pub);
--
--	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
--		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci[0], false);
--}
--
- /* Enable BT-COEX & Ex-PA for 4313 */
- void ai_epa_4313war(struct si_pub *sih)
- {
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
-@@ -183,9 +183,6 @@ extern u16 ai_clkctl_fast_pwrup_delay(st
- extern bool ai_clkctl_cc(struct si_pub *sih, enum bcma_clkmode mode);
- extern bool ai_deviceremoved(struct si_pub *sih);
- 
--extern void ai_pci_down(struct si_pub *sih);
--extern void ai_pci_up(struct si_pub *sih);
--
- /* Enable Ex-PA for 4313 */
- extern void ai_epa_4313war(struct si_pub *sih);
- 
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -4667,7 +4667,7 @@ static int brcms_b_attach(struct brcms_c
- 	brcms_c_coredisable(wlc_hw);
- 
- 	/* Match driver "down" state */
--	ai_pci_down(wlc_hw->sih);
-+	bcma_core_pci_down(wlc_hw->d11core->bus);
- 
- 	/* turn off pll and xtal to match driver "down" state */
- 	brcms_b_xtal(wlc_hw, OFF);
-@@ -5010,12 +5010,12 @@ static int brcms_b_up_prep(struct brcms_
- 	 */
- 	if (brcms_b_radio_read_hwdisabled(wlc_hw)) {
- 		/* put SB PCI in down state again */
--		ai_pci_down(wlc_hw->sih);
-+		bcma_core_pci_down(wlc_hw->d11core->bus);
- 		brcms_b_xtal(wlc_hw, OFF);
- 		return -ENOMEDIUM;
- 	}
- 
--	ai_pci_up(wlc_hw->sih);
-+	bcma_core_pci_up(wlc_hw->d11core->bus);
- 
- 	/* reset the d11 core */
- 	brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS);
-@@ -5212,7 +5212,7 @@ static int brcms_b_down_finish(struct br
- 
- 		/* turn off primary xtal and pll */
- 		if (!wlc_hw->noreset) {
--			ai_pci_down(wlc_hw->sih);
-+			bcma_core_pci_down(wlc_hw->d11core->bus);
- 			brcms_b_xtal(wlc_hw, OFF);
- 		}
- 	}

+ 0 - 36
package/kernel/mac80211/patches/861-b43-call-PCIe-up-and-down-functions.patch

@@ -1,36 +0,0 @@
-b43: call PCIe up and down functions
-
-Tell the PCIe host core when the wifi is activated.
-
-Signed-off-by: Hauke Mehrtens <[email protected]>
-
---- a/drivers/net/wireless/b43/main.c
-+++ b/drivers/net/wireless/b43/main.c
-@@ -4670,6 +4670,19 @@ static void b43_wireless_core_exit(struc
- 	b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN,
- 		      B43_MACCTL_PSM_JMP0);
- 
-+	switch (dev->dev->bus_type) {
-+#ifdef CPTCFG_B43_BCMA
-+	case B43_BUS_BCMA:
-+		bcma_core_pci_down(dev->dev->bdev->bus);
-+		break;
-+#endif
-+#ifdef CPTCFG_B43_SSB
-+	case B43_BUS_SSB:
-+		/* TODO */
-+		break;
-+#endif
-+	}
-+
- 	b43_dma_free(dev);
- 	b43_pio_free(dev);
- 	b43_chip_exit(dev);
-@@ -4709,6 +4722,7 @@ static int b43_wireless_core_init(struct
- 	case B43_BUS_BCMA:
- 		bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
- 				      dev->dev->bdev, true);
-+		bcma_core_pci_up(dev->dev->bdev->bus);
- 		break;
- #endif
- #ifdef CPTCFG_B43_SSB

Некоторые файлы не были показаны из-за большого количества измененных файлов