[OpenWrt-Devel] [PATCH] mac80211: backport rtlwifi fixes from wireless-testing

Daniel Golle daniel at makrotopia.org
Mon Feb 2 12:14:51 EST 2015


Fixes for various rtlwifi issues, including beaconing in AP and mesh mode
with rtl8192cu (which previously prevented AP mode from working on various
sunxi boards).
This is a temporary fix as all these patches were already merged in
wireless-testing, thus the next mac80211 compat-wireless version bump will
allow to remove them again.

Signed-off-by: Daniel Golle <daniel at makrotopia.org>
---
 ...-setting-of-tx-descriptor-for-new-trx-flo.patch |  39 +
 ...ifi-Fix-errors-in-descriptor-manipulation.patch |  42 ++
 ...rtlwifi-rtl8192se-Fix-connection-problems.patch | 122 ++++
 ...ate-RCR-register-in-rtl_op_configure_filt.patch |  79 +++
 ...s-rtlwifi-Do-not-always-include-drivers-i.patch |  74 ++
 ...s-rtlwifi-rtl8192ee-Fix-compilation-of-th.patch |  29 +
 ...tlwifi-rtl8821ae-Fix-5G-detection-problem.patch |  39 +
 ...10-rtlwifi-Change-order-in-device-startup.patch |  62 ++
 ...8192ce-Fix-editing-error-that-causes-sile.patch |  47 ++
 ...8192ce-Fix-kernel-crashes-due-to-missing-.patch |  88 +++
 ...tl8192ce-Fix-missing-interrupt-ready-flag.patch |  42 ++
 ...8821ae-fix-misspelling-of-current-functio.patch |  65 ++
 ...8192cu-Fix-sparse-non-static-symbol-warni.patch |  34 +
 ...-0016-rtlwifi-rtl8192ce-Set-fw_ready-flag.patch |  37 +
 ...ifi-rtl8192de-fw.c-Remove-unused-function.patch |  59 ++
 ...8821ae-Simplify-loading-of-WOWLAN-firmwar.patch | 211 ++++++
 ...l8821ae-Fix-typos-in-power-sequence-macro.patch |  33 +
 ...8192ce-Add-code-to-set-the-keep-alive-ope.patch |  50 ++
 ...8192ce-Update-setting-of-the-media-status.patch | 106 +++
 ...fi-rtl8192ce-Update-rate-setting-routines.patch | 199 ++++++
 ...tlwifi-rtl8192ce-Improve-RF-sleep-routine.patch |  35 +
 ...move-extraneous-argument-for-rate-mapping.patch | 138 ++++
 ...8723be-Switch-to-use-common-rate-mapping-.patch | 196 +++++
 ...8188ee-Switch-to-use-common-rate-mapping-.patch | 197 ++++++
 ...8723ae-Modify-driver-to-use-rate-mapping-.patch | 197 ++++++
 ...8192ee-Convert-driver-to-use-common-rate-.patch | 196 +++++
 ...vert-all-drivers-to-use-a-common-set-of-r.patch | 786 +++++++++++++++++++++
 ...tlwifi-rtl8821ae-Add-VHT-rate-descriptors.patch |  85 +++
 ...8192cu-Rework-calls-to-rate-control-routi.patch |  62 ++
 ...8192de-Rework-calls-to-rate-control-routi.patch |  42 ++
 ...8821ae-Switch-to-use-common-rate-control-.patch | 498 +++++++++++++
 ...fi-rtl8192ee-trx.c-Remove-unused-function.patch |  64 ++
 ...fi-rtl8723be-phy.c-Remove-unused-function.patch |  69 ++
 ...-error-when-accessing-unmapped-memory-in-.patch | 126 ++++
 ...ifi-Unify-variable-naming-for-all-drivers.patch | 300 ++++++++
 ...-rtlwifi-rtl8723be-Improve-modinfo-output.patch |  40 ++
 ...ate-new-routine-to-initialize-the-DM-tabl.patch | 607 ++++++++++++++++
 ...8188ee-Convert-driver-to-use-the-common-D.patch |  73 ++
 ...8192c-common-Convert-driver-to-use-common.patch | 411 +++++++++++
 ...8192de-Convert-driver-to-use-common-DM-ta.patch |  68 ++
 ...8192ee-Convert-driver-to-use-common-DM-ta.patch |  71 ++
 ...8723ae-Convert-driver-to-use-common-DM-ta.patch |  62 ++
 ...8723be-Convert-driver-to-use-common-DM-ta.patch |  69 ++
 ...8821ae-Convert-driver-to-use-common-DM-ta.patch |  73 ++
 ...47-rtlwifi-Move-macro-definitions-to-core.patch | 140 ++++
 ...-rtl8192de-remove-redundant-else-if-check.patch |  46 ++
 ...-rtlwifi-add-support-to-send-beacon-frame.patch |  47 ++
 ...680-0050-rtl8192cu-fix-the-mesh-beaconing.patch |  31 +
 ...-0051-rtlwifi-rtl8192cu-Set-fw_ready-flag.patch |  38 +
 49 files changed, 6224 insertions(+)
 create mode 100644 package/kernel/mac80211/patches/680-0002-rtlwifi-Fix-setting-of-tx-descriptor-for-new-trx-flo.patch
 create mode 100644 package/kernel/mac80211/patches/680-0003-rtlwifi-Fix-errors-in-descriptor-manipulation.patch
 create mode 100644 package/kernel/mac80211/patches/680-0004-rtlwifi-rtl8192se-Fix-connection-problems.patch
 create mode 100644 package/kernel/mac80211/patches/680-0006-rtlwifi-update-RCR-register-in-rtl_op_configure_filt.patch
 create mode 100644 package/kernel/mac80211/patches/680-0007-net-wireless-rtlwifi-Do-not-always-include-drivers-i.patch
 create mode 100644 package/kernel/mac80211/patches/680-0008-net-wireless-rtlwifi-rtl8192ee-Fix-compilation-of-th.patch
 create mode 100644 package/kernel/mac80211/patches/680-0009-rtlwifi-rtl8821ae-Fix-5G-detection-problem.patch
 create mode 100644 package/kernel/mac80211/patches/680-0010-rtlwifi-Change-order-in-device-startup.patch
 create mode 100644 package/kernel/mac80211/patches/680-0011-rtlwifi-rtl8192ce-Fix-editing-error-that-causes-sile.patch
 create mode 100644 package/kernel/mac80211/patches/680-0012-rtlwifi-rtl8192ce-Fix-kernel-crashes-due-to-missing-.patch
 create mode 100644 package/kernel/mac80211/patches/680-0013-rtlwifi-rtl8192ce-Fix-missing-interrupt-ready-flag.patch
 create mode 100644 package/kernel/mac80211/patches/680-0014-rtlwifi-rtl8821ae-fix-misspelling-of-current-functio.patch
 create mode 100644 package/kernel/mac80211/patches/680-0015-rtlwifi-rtl8192cu-Fix-sparse-non-static-symbol-warni.patch
 create mode 100644 package/kernel/mac80211/patches/680-0016-rtlwifi-rtl8192ce-Set-fw_ready-flag.patch
 create mode 100644 package/kernel/mac80211/patches/680-0017-rtlwifi-rtl8192de-fw.c-Remove-unused-function.patch
 create mode 100644 package/kernel/mac80211/patches/680-0018-rtlwifi-rtl8821ae-Simplify-loading-of-WOWLAN-firmwar.patch
 create mode 100644 package/kernel/mac80211/patches/680-0019-rtlwifi-rtl8821ae-Fix-typos-in-power-sequence-macro.patch
 create mode 100644 package/kernel/mac80211/patches/680-0020-rtlwifi-rtl8192ce-Add-code-to-set-the-keep-alive-ope.patch
 create mode 100644 package/kernel/mac80211/patches/680-0021-rtlwifi-rtl8192ce-Update-setting-of-the-media-status.patch
 create mode 100644 package/kernel/mac80211/patches/680-0022-rtlwifi-rtl8192ce-Update-rate-setting-routines.patch
 create mode 100644 package/kernel/mac80211/patches/680-0023-rtlwifi-rtl8192ce-Improve-RF-sleep-routine.patch
 create mode 100644 package/kernel/mac80211/patches/680-0024-rtlwifi-Remove-extraneous-argument-for-rate-mapping.patch
 create mode 100644 package/kernel/mac80211/patches/680-0025-rtlwifi-rtl8723be-Switch-to-use-common-rate-mapping-.patch
 create mode 100644 package/kernel/mac80211/patches/680-0026-rtlwifi-rtl8188ee-Switch-to-use-common-rate-mapping-.patch
 create mode 100644 package/kernel/mac80211/patches/680-0027-rtlwifi-rtl8723ae-Modify-driver-to-use-rate-mapping-.patch
 create mode 100644 package/kernel/mac80211/patches/680-0028-rtlwifi-rtl8192ee-Convert-driver-to-use-common-rate-.patch
 create mode 100644 package/kernel/mac80211/patches/680-0029-rtlwifi-Convert-all-drivers-to-use-a-common-set-of-r.patch
 create mode 100644 package/kernel/mac80211/patches/680-0030-rtlwifi-rtl8821ae-Add-VHT-rate-descriptors.patch
 create mode 100644 package/kernel/mac80211/patches/680-0031-rtlwifi-rtl8192cu-Rework-calls-to-rate-control-routi.patch
 create mode 100644 package/kernel/mac80211/patches/680-0032-rtlwifi-rtl8192de-Rework-calls-to-rate-control-routi.patch
 create mode 100644 package/kernel/mac80211/patches/680-0033-rtlwifi-rtl8821ae-Switch-to-use-common-rate-control-.patch
 create mode 100644 package/kernel/mac80211/patches/680-0034-rtlwifi-rtl8192ee-trx.c-Remove-unused-function.patch
 create mode 100644 package/kernel/mac80211/patches/680-0035-rtlwifi-rtl8723be-phy.c-Remove-unused-function.patch
 create mode 100644 package/kernel/mac80211/patches/680-0036-rtlwifi-Fix-error-when-accessing-unmapped-memory-in-.patch
 create mode 100644 package/kernel/mac80211/patches/680-0037-rtlwifi-Unify-variable-naming-for-all-drivers.patch
 create mode 100644 package/kernel/mac80211/patches/680-0038-rtlwifi-rtl8723be-Improve-modinfo-output.patch
 create mode 100644 package/kernel/mac80211/patches/680-0039-rtlwifi-Create-new-routine-to-initialize-the-DM-tabl.patch
 create mode 100644 package/kernel/mac80211/patches/680-0040-rtlwifi-rtl8188ee-Convert-driver-to-use-the-common-D.patch
 create mode 100644 package/kernel/mac80211/patches/680-0041-rtlwifi-rtl8192c-common-Convert-driver-to-use-common.patch
 create mode 100644 package/kernel/mac80211/patches/680-0042-rtlwifi-rtl8192de-Convert-driver-to-use-common-DM-ta.patch
 create mode 100644 package/kernel/mac80211/patches/680-0043-rtlwifi-rtl8192ee-Convert-driver-to-use-common-DM-ta.patch
 create mode 100644 package/kernel/mac80211/patches/680-0044-rtlwifi-rtl8723ae-Convert-driver-to-use-common-DM-ta.patch
 create mode 100644 package/kernel/mac80211/patches/680-0045-rtlwifi-rtl8723be-Convert-driver-to-use-common-DM-ta.patch
 create mode 100644 package/kernel/mac80211/patches/680-0046-rtlwifi-rtl8821ae-Convert-driver-to-use-common-DM-ta.patch
 create mode 100644 package/kernel/mac80211/patches/680-0047-rtlwifi-Move-macro-definitions-to-core.patch
 create mode 100644 package/kernel/mac80211/patches/680-0048-rtlwifi-rtl8192de-remove-redundant-else-if-check.patch
 create mode 100644 package/kernel/mac80211/patches/680-0049-rtlwifi-add-support-to-send-beacon-frame.patch
 create mode 100644 package/kernel/mac80211/patches/680-0050-rtl8192cu-fix-the-mesh-beaconing.patch
 create mode 100644 package/kernel/mac80211/patches/680-0051-rtlwifi-rtl8192cu-Set-fw_ready-flag.patch

diff --git a/package/kernel/mac80211/patches/680-0002-rtlwifi-Fix-setting-of-tx-descriptor-for-new-trx-flo.patch b/package/kernel/mac80211/patches/680-0002-rtlwifi-Fix-setting-of-tx-descriptor-for-new-trx-flo.patch
new file mode 100644
index 0000000..fbe941b
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0002-rtlwifi-Fix-setting-of-tx-descriptor-for-new-trx-flo.patch
@@ -0,0 +1,39 @@
+From fb6eaf2ccca7d3580931bcb4b735101b461f38cf Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Wed, 5 Nov 2014 19:10:52 -0600
+Subject: [PATCH 02/51] rtlwifi: Fix setting of tx descriptor for new trx flow
+
+Device RTL8192EE uses a new form of trx flow. This fix sets up the descriptors
+correctly.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/pci.c | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
+index 25daa87..116f746 100644
+--- a/drivers/net/wireless/rtlwifi/pci.c
++++ b/drivers/net/wireless/rtlwifi/pci.c
+@@ -1127,9 +1127,14 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
+ 
+ 	__skb_queue_tail(&ring->queue, pskb);
+ 
+-	rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, true, HW_DESC_OWN,
+-				    &temp_one);
+-
++	if (rtlpriv->use_new_trx_flow) {
++		temp_one = 4;
++		rtlpriv->cfg->ops->set_desc(hw, (u8 *)pbuffer_desc, true,
++					    HW_DESC_OWN, (u8 *)&temp_one);
++	} else {
++		rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, true, HW_DESC_OWN,
++					    &temp_one);
++	}
+ 	return;
+ }
+ 
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0003-rtlwifi-Fix-errors-in-descriptor-manipulation.patch b/package/kernel/mac80211/patches/680-0003-rtlwifi-Fix-errors-in-descriptor-manipulation.patch
new file mode 100644
index 0000000..e4cfcaf
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0003-rtlwifi-Fix-errors-in-descriptor-manipulation.patch
@@ -0,0 +1,42 @@
+From caea2172c23465a77556b2e1d06412b532b90235 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Wed, 5 Nov 2014 19:10:53 -0600
+Subject: [PATCH 03/51] rtlwifi: Fix errors in descriptor manipulation
+
+There are typos in the handling of the descriptor pointers where the wrong
+descriptor is referenced. There is also an error in which the pointer is
+incremented twice.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/pci.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
+index 116f746..6d2b628 100644
+--- a/drivers/net/wireless/rtlwifi/pci.c
++++ b/drivers/net/wireless/rtlwifi/pci.c
+@@ -1375,9 +1375,9 @@ static void _rtl_pci_free_tx_ring(struct ieee80211_hw *hw,
+ 	ring->desc = NULL;
+ 	if (rtlpriv->use_new_trx_flow) {
+ 		pci_free_consistent(rtlpci->pdev,
+-				    sizeof(*ring->desc) * ring->entries,
++				    sizeof(*ring->buffer_desc) * ring->entries,
+ 				    ring->buffer_desc, ring->buffer_desc_dma);
+-		ring->desc = NULL;
++		ring->buffer_desc = NULL;
+ 	}
+ }
+ 
+@@ -1548,7 +1548,6 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
+ 							 true,
+ 							 HW_DESC_TXBUFF_ADDR),
+ 						 skb->len, PCI_DMA_TODEVICE);
+-				ring->idx = (ring->idx + 1) % ring->entries;
+ 				kfree_skb(skb);
+ 				ring->idx = (ring->idx + 1) % ring->entries;
+ 			}
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0004-rtlwifi-rtl8192se-Fix-connection-problems.patch b/package/kernel/mac80211/patches/680-0004-rtlwifi-rtl8192se-Fix-connection-problems.patch
new file mode 100644
index 0000000..15a8b1b
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0004-rtlwifi-rtl8192se-Fix-connection-problems.patch
@@ -0,0 +1,122 @@
+From d1cd5ba4ca8b41793f4e581dd1dbf46b7f2cf691 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Fri, 7 Nov 2014 10:05:12 -0600
+Subject: [PATCH 04/51] rtlwifi: rtl8192se: Fix connection problems
+
+Changes in the vendor driver were added to rtlwifi, but some updates
+to rtl8192se were missed, and the driver could neither scan nor connect.
+There are other changes that will enhance performance, but this minimal
+set fix the basic functionality.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/pci.c           |  3 ++-
+ drivers/net/wireless/rtlwifi/rtl8192se/hw.c  |  7 +++++--
+ drivers/net/wireless/rtlwifi/rtl8192se/phy.c |  2 ++
+ drivers/net/wireless/rtlwifi/rtl8192se/sw.c  | 16 ++++++++++++++++
+ 4 files changed, 25 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
+index 6d2b628..61f5d36 100644
+--- a/drivers/net/wireless/rtlwifi/pci.c
++++ b/drivers/net/wireless/rtlwifi/pci.c
+@@ -842,7 +842,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
+ 			break;
+ 		}
+ 		/* handle command packet here */
+-		if (rtlpriv->cfg->ops->rx_command_packet(hw, stats, skb)) {
++		if (rtlpriv->cfg->ops->rx_command_packet &&
++		    rtlpriv->cfg->ops->rx_command_packet(hw, stats, skb)) {
+ 				dev_kfree_skb_any(skb);
+ 				goto end;
+ 		}
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
+index 00e0670..5761d5b 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
+@@ -1201,6 +1201,9 @@ static int _rtl92se_set_media_status(struct ieee80211_hw *hw,
+ 
+ 	}
+ 
++	if (type != NL80211_IFTYPE_AP &&
++	    rtlpriv->mac80211.link_state < MAC80211_LINKED)
++		bt_msr = rtl_read_byte(rtlpriv, MSR) & ~MSR_LINK_MASK;
+ 	rtl_write_byte(rtlpriv, (MSR), bt_msr);
+ 
+ 	temp = rtl_read_dword(rtlpriv, TCR);
+@@ -1262,6 +1265,7 @@ void rtl92se_enable_interrupt(struct ieee80211_hw *hw)
+ 	rtl_write_dword(rtlpriv, INTA_MASK, rtlpci->irq_mask[0]);
+ 	/* Support Bit 32-37(Assign as Bit 0-5) interrupt setting now */
+ 	rtl_write_dword(rtlpriv, INTA_MASK + 4, rtlpci->irq_mask[1] & 0x3F);
++	rtlpci->irq_enabled = true;
+ }
+ 
+ void rtl92se_disable_interrupt(struct ieee80211_hw *hw)
+@@ -1276,8 +1280,7 @@ void rtl92se_disable_interrupt(struct ieee80211_hw *hw)
+ 	rtlpci = rtl_pcidev(rtl_pcipriv(hw));
+ 	rtl_write_dword(rtlpriv, INTA_MASK, 0);
+ 	rtl_write_dword(rtlpriv, INTA_MASK + 4, 0);
+-
+-	synchronize_irq(rtlpci->pdev->irq);
++	rtlpci->irq_enabled = false;
+ }
+ 
+ static u8 _rtl92s_set_sysclk(struct ieee80211_hw *hw, u8 data)
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
+index 77c5b5f..4b4612f 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
+@@ -399,6 +399,8 @@ static bool _rtl92s_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
+ 		case 2:
+ 			currentcmd = &postcommoncmd[*step];
+ 			break;
++		default:
++			return true;
+ 		}
+ 
+ 		if (currentcmd->cmdid == CMDID_END) {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
+index aadba29..fb00386 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
+@@ -236,6 +236,19 @@ static void rtl92s_deinit_sw_vars(struct ieee80211_hw *hw)
+ 	}
+ }
+ 
++static bool rtl92se_is_tx_desc_closed(struct ieee80211_hw *hw, u8 hw_queue,
++				      u16 index)
++{
++	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
++	struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
++	u8 *entry = (u8 *)(&ring->desc[ring->idx]);
++	u8 own = (u8)rtl92se_get_desc(entry, true, HW_DESC_OWN);
++
++	if (own)
++		return false;
++	return true;
++}
++
+ static struct rtl_hal_ops rtl8192se_hal_ops = {
+ 	.init_sw_vars = rtl92s_init_sw_vars,
+ 	.deinit_sw_vars = rtl92s_deinit_sw_vars,
+@@ -269,6 +282,7 @@ static struct rtl_hal_ops rtl8192se_hal_ops = {
+ 	.led_control = rtl92se_led_control,
+ 	.set_desc = rtl92se_set_desc,
+ 	.get_desc = rtl92se_get_desc,
++	.is_tx_desc_closed = rtl92se_is_tx_desc_closed,
+ 	.tx_polling = rtl92se_tx_polling,
+ 	.enable_hw_sec = rtl92se_enable_hw_security_config,
+ 	.set_key = rtl92se_set_key,
+@@ -306,6 +320,8 @@ static struct rtl_hal_cfg rtl92se_hal_cfg = {
+ 	.maps[MAC_RCR_ACRC32] = RCR_ACRC32,
+ 	.maps[MAC_RCR_ACF] = RCR_ACF,
+ 	.maps[MAC_RCR_AAP] = RCR_AAP,
++	.maps[MAC_HIMR] = INTA_MASK,
++	.maps[MAC_HIMRE] = INTA_MASK + 4,
+ 
+ 	.maps[EFUSE_TEST] = REG_EFUSE_TEST,
+ 	.maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0006-rtlwifi-update-RCR-register-in-rtl_op_configure_filt.patch b/package/kernel/mac80211/patches/680-0006-rtlwifi-update-RCR-register-in-rtl_op_configure_filt.patch
new file mode 100644
index 0000000..0d85398
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0006-rtlwifi-update-RCR-register-in-rtl_op_configure_filt.patch
@@ -0,0 +1,79 @@
+From 99958588fce8f570d1d48bd67775b8e6c5f92623 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo.bianconi83 at gmail.com>
+Date: Sat, 22 Nov 2014 12:18:26 +0100
+Subject: [PATCH 06/51] rtlwifi: update RCR register in
+ rtl_op_configure_filter()
+
+Reconfigure RCR register in rtl_op_configure_filter() in order to apply RX
+filter configuration
+
+Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi83 at gmail.com>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/core.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
+index af52f0b..5fc6f52 100644
+--- a/drivers/net/wireless/rtlwifi/core.c
++++ b/drivers/net/wireless/rtlwifi/core.c
+@@ -786,6 +786,7 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
+ 				    unsigned int changed_flags,
+ 				    unsigned int *new_flags, u64 multicast)
+ {
++	bool update_rcr = false;
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+ 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
+ 
+@@ -806,6 +807,7 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
+ 			RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
+ 				 "Disable receive multicast frame\n");
+ 		}
++		update_rcr = true;
+ 	}
+ 
+ 	if (changed_flags & FIF_FCSFAIL) {
+@@ -818,6 +820,8 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
+ 			RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
+ 				 "Disable receive FCS error frame\n");
+ 		}
++		if (!update_rcr)
++			update_rcr = true;
+ 	}
+ 
+ 	/* if ssid not set to hw don't check bssid
+@@ -832,6 +836,8 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
+ 				rtlpriv->cfg->ops->set_chk_bssid(hw, false);
+ 			else
+ 				rtlpriv->cfg->ops->set_chk_bssid(hw, true);
++			if (update_rcr)
++				update_rcr = false;
+ 		}
+ 	}
+ 
+@@ -846,6 +852,8 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
+ 			RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
+ 				 "Disable receive control frame.\n");
+ 		}
++		if (!update_rcr)
++			update_rcr = true;
+ 	}
+ 
+ 	if (changed_flags & FIF_OTHER_BSS) {
+@@ -858,7 +866,13 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
+ 			RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
+ 				 "Disable receive other BSS's frame.\n");
+ 		}
++		if (!update_rcr)
++			update_rcr = true;
+ 	}
++
++	if (update_rcr)
++		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
++					      (u8 *)(&mac->rx_conf));
+ }
+ static int rtl_op_sta_add(struct ieee80211_hw *hw,
+ 			 struct ieee80211_vif *vif,
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0007-net-wireless-rtlwifi-Do-not-always-include-drivers-i.patch b/package/kernel/mac80211/patches/680-0007-net-wireless-rtlwifi-Do-not-always-include-drivers-i.patch
new file mode 100644
index 0000000..59cb09e
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0007-net-wireless-rtlwifi-Do-not-always-include-drivers-i.patch
@@ -0,0 +1,74 @@
+From 927a70874c34e862f6aea5ad9c4a5d2c3f140bcd Mon Sep 17 00:00:00 2001
+From: Andreas Ruprecht <rupran at einserver.de>
+Date: Mon, 24 Nov 2014 19:34:31 +0100
+Subject: [PATCH 07/51] net: wireless: rtlwifi: Do not always include drivers
+ in obj-m
+
+In four of the rtlwifi drivers, the Makefile contains superfluous
+statements indicating the compilation of the driver as an LKM
+regardless of the corresponding Kconfig option.
+
+If the corresponding option is set to 'y', the build system will then
+see the object file in obj-m and obj-y, which leads to a compilation
+as a built-in only. Even though this leads to the desired behavior,
+the unconditional appearance in obj-m is confusing for someone reading
+the Makefile.
+
+This patch removes the superfluous Makefile statements.
+
+Signed-off-by: Andreas Ruprecht <rupran at einserver.de>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ee/Makefile | 3 ---
+ drivers/net/wireless/rtlwifi/rtl8723ae/Makefile | 3 ---
+ drivers/net/wireless/rtlwifi/rtl8723be/Makefile | 3 ---
+ drivers/net/wireless/rtlwifi/rtl8821ae/Makefile | 3 ---
+ 4 files changed, 12 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile b/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile
+index 11952b9..6bd46a9 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile
+@@ -1,6 +1,3 @@
+-obj-m := rtl8192ee.o
+-
+-
+ rtl8192ee-objs :=		\
+ 		dm.o		\
+ 		fw.o		\
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/Makefile b/drivers/net/wireless/rtlwifi/rtl8723ae/Makefile
+index 9c34a85..6220672 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723ae/Makefile
++++ b/drivers/net/wireless/rtlwifi/rtl8723ae/Makefile
+@@ -1,6 +1,3 @@
+-obj-m := rtl8723ae.o
+-
+-
+ rtl8723ae-objs :=		\
+ 		dm.o		\
+ 		fw.o		\
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/Makefile b/drivers/net/wireless/rtlwifi/rtl8723be/Makefile
+index 59e416a..a77c341 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/Makefile
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/Makefile
+@@ -1,6 +1,3 @@
+-obj-m := rtl8723be.o
+-
+-
+ rtl8723be-objs :=		\
+ 		dm.o		\
+ 		fw.o		\
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile b/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile
+index 87ad604..f7a26f7 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile
+@@ -1,6 +1,3 @@
+-obj-m := rtl8821ae.o
+-
+-
+ rtl8821ae-objs :=		\
+ 		dm.o		\
+ 		fw.o		\
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0008-net-wireless-rtlwifi-rtl8192ee-Fix-compilation-of-th.patch b/package/kernel/mac80211/patches/680-0008-net-wireless-rtlwifi-rtl8192ee-Fix-compilation-of-th.patch
new file mode 100644
index 0000000..aa409f6
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0008-net-wireless-rtlwifi-rtl8192ee-Fix-compilation-of-th.patch
@@ -0,0 +1,29 @@
+From b880c6deabacc415488984f6a79918ec0fa2e53d Mon Sep 17 00:00:00 2001
+From: Andreas Ruprecht <rupran at einserver.de>
+Date: Mon, 24 Nov 2014 19:34:32 +0100
+Subject: [PATCH 08/51] net: wireless: rtlwifi: rtl8192ee: Fix compilation of
+ the driver
+
+In the Makefile for this driver, the wrong Kconfig option is used
+to trigger the compilation of the object file. This leads to the
+driver only being included into the kernel when both CONFIG_RTL8821AE
+and CONFIG_RTL8192AE are set to "y".
+
+Signed-off-by: Andreas Ruprecht <rupran at einserver.de>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ee/Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: compat-wireless-2014-11-04/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile
+===================================================================
+--- compat-wireless-2014-11-04.orig/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile
++++ compat-wireless-2014-11-04/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile
+@@ -11,6 +11,6 @@ rtl8192ee-objs :=		\
+ 		trx.o		\
+ 
+ 
+-obj-$(CPTCFG_RTL8821AE) += rtl8192ee.o
++obj-$(CPTCFG_RTL8192EE) += rtl8192ee.o
+ 
+ ccflags-y += -D__CHECK_ENDIAN__
diff --git a/package/kernel/mac80211/patches/680-0009-rtlwifi-rtl8821ae-Fix-5G-detection-problem.patch b/package/kernel/mac80211/patches/680-0009-rtlwifi-rtl8821ae-Fix-5G-detection-problem.patch
new file mode 100644
index 0000000..03a5d3f
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0009-rtlwifi-rtl8821ae-Fix-5G-detection-problem.patch
@@ -0,0 +1,39 @@
+From a91ed1901a80b401afa1b718d941d3450d868151 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 25 Nov 2014 10:32:06 -0600
+Subject: [PATCH 09/51] rtlwifi: rtl8821ae: Fix 5G detection problem
+
+The changes associated with moving this driver from staging to the regular
+tree missed one section setting the allowable rates for the 5GHz band.
+
+This patch is needed to fix the regression reported in Bug #88811
+(https://bugzilla.kernel.org/show_bug.cgi?id=88811).
+
+Reported-by: Valerio Passini <valerio.passini at unicam.it>
+Tested-by: Valerio Passini <valerio.passini at unicam.it>
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Cc: Valerio Passini <valerio.passini at unicam.it>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8821ae/hw.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
+index 310d316..8ec8200 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
+@@ -3672,8 +3672,9 @@ static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
+ 		mac->opmode == NL80211_IFTYPE_ADHOC)
+ 		macid = sta->aid + 1;
+ 	if (wirelessmode == WIRELESS_MODE_N_5G ||
+-	    wirelessmode == WIRELESS_MODE_AC_5G)
+-		ratr_bitmap = sta->supp_rates[NL80211_BAND_5GHZ];
++	    wirelessmode == WIRELESS_MODE_AC_5G ||
++	    wirelessmode == WIRELESS_MODE_A)
++		ratr_bitmap = sta->supp_rates[NL80211_BAND_5GHZ] << 4;
+ 	else
+ 		ratr_bitmap = sta->supp_rates[NL80211_BAND_2GHZ];
+ 
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0010-rtlwifi-Change-order-in-device-startup.patch b/package/kernel/mac80211/patches/680-0010-rtlwifi-Change-order-in-device-startup.patch
new file mode 100644
index 0000000..5ed3db4
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0010-rtlwifi-Change-order-in-device-startup.patch
@@ -0,0 +1,62 @@
+From 7d63a5f9b25ba6b130da8eb2d32a72b1462d0249 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 25 Nov 2014 10:32:07 -0600
+Subject: [PATCH 10/51] rtlwifi: Change order in device startup
+
+The existing order of steps when starting the PCI devices works for
+2.4G devices, but fails to initialize the 5G section of the RTL8821AE
+hardware.
+
+This patch is needed to fix the regression reported in Bug #88811
+(https://bugzilla.kernel.org/show_bug.cgi?id=88811).
+
+Reported-by: Valerio Passini <valerio.passini at unicam.it>
+Tested-by: Valerio Passini <valerio.passini at unicam.it>
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Cc: Valerio Passini <valerio.passini at unicam.it>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/pci.c | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
+index 61f5d36..846a2e6 100644
+--- a/drivers/net/wireless/rtlwifi/pci.c
++++ b/drivers/net/wireless/rtlwifi/pci.c
+@@ -2249,6 +2249,16 @@ int rtl_pci_probe(struct pci_dev *pdev,
+ 	/*like read eeprom and so on */
+ 	rtlpriv->cfg->ops->read_eeprom_info(hw);
+ 
++	if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
++		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n");
++		err = -ENODEV;
++		goto fail3;
++	}
++	rtlpriv->cfg->ops->init_sw_leds(hw);
++
++	/*aspm */
++	rtl_pci_init_aspm(hw);
++
+ 	/* Init mac80211 sw */
+ 	err = rtl_init_core(hw);
+ 	if (err) {
+@@ -2264,16 +2274,6 @@ int rtl_pci_probe(struct pci_dev *pdev,
+ 		goto fail3;
+ 	}
+ 
+-	if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
+-		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n");
+-		err = -ENODEV;
+-		goto fail3;
+-	}
+-	rtlpriv->cfg->ops->init_sw_leds(hw);
+-
+-	/*aspm */
+-	rtl_pci_init_aspm(hw);
+-
+ 	err = ieee80211_register_hw(hw);
+ 	if (err) {
+ 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0011-rtlwifi-rtl8192ce-Fix-editing-error-that-causes-sile.patch b/package/kernel/mac80211/patches/680-0011-rtlwifi-rtl8192ce-Fix-editing-error-that-causes-sile.patch
new file mode 100644
index 0000000..6186b5c
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0011-rtlwifi-rtl8192ce-Fix-editing-error-that-causes-sile.patch
@@ -0,0 +1,47 @@
+From 99a82f734aa6c6d397e029e6dfa933f04e0fa8c8 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Fri, 28 Nov 2014 10:41:14 -0600
+Subject: [PATCH 11/51] rtlwifi: rtl8192ce: Fix editing error that causes
+ silent memory corruption
+
+In the major update of the rtlwifi-family of drivers, there was an editing
+mistake. Unfortunately, this particular error leads to memory corruption that
+silently leads to failure of the system. This patch is one of three needed to
+fix the kernel regression reported at https://bugzilla.kernel.org/show_bug.cgi?id=88951.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Reported-by: Catalin Iacob <iacobcatalin at gmail.com>
+Tested-by: Catalin Iacob <iacobcatalin at gmail.com>
+Cc: Catalin Iacob <iacobcatalin at gmail.com>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+index dc3d20b..0916275 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+@@ -720,16 +720,15 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool istx, u8 desc_name)
+ 			break;
+ 		}
+ 	} else {
+-		struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc;
+ 		switch (desc_name) {
+ 		case HW_DESC_OWN:
+-			ret = GET_RX_DESC_OWN(pdesc);
++			ret = GET_RX_DESC_OWN(p_desc);
+ 			break;
+ 		case HW_DESC_RXPKT_LEN:
+-			ret = GET_RX_DESC_PKT_LEN(pdesc);
++			ret = GET_RX_DESC_PKT_LEN(p_desc);
+ 			break;
+ 		case HW_DESC_RXBUFF_ADDR:
+-			ret = GET_RX_STATUS_DESC_BUFF_ADDR(pdesc);
++			ret = GET_RX_DESC_BUFF_ADDR(p_desc);
+ 			break;
+ 		default:
+ 			RT_ASSERT(false, "ERR rxdesc :%d not process\n",
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0012-rtlwifi-rtl8192ce-Fix-kernel-crashes-due-to-missing-.patch b/package/kernel/mac80211/patches/680-0012-rtlwifi-rtl8192ce-Fix-kernel-crashes-due-to-missing-.patch
new file mode 100644
index 0000000..03e8132
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0012-rtlwifi-rtl8192ce-Fix-kernel-crashes-due-to-missing-.patch
@@ -0,0 +1,88 @@
+From f892914c03131a445b926b82815b03162c19288e Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Fri, 28 Nov 2014 10:41:15 -0600
+Subject: [PATCH 12/51] rtlwifi: rtl8192ce: Fix kernel crashes due to missing
+ callback entry
+
+In the major update of the rtlwifi-family of drivers, one of the callback entries
+was missed, which leads to memory corruption. Unfortunately, this corruption
+never caused a kernel oops, but showed up in other parts of the system.
+This patch is one of three needed to fix the kernel regression reported at
+https://bugzilla.kernel.org/show_bug.cgi?id=88951.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Reported-by: Catalin Iacob <iacobcatalin at gmail.com>
+Tested-by: Catalin Iacob <iacobcatalin at gmail.com>
+Cc: Catalin Iacob <iacobcatalin at gmail.com>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ce/sw.c  |  3 +++
+ drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 17 +++++++++++++++++
+ drivers/net/wireless/rtlwifi/rtl8192ce/trx.h |  2 ++
+ 3 files changed, 22 insertions(+)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+index 46ea076..dd5aa08 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+@@ -228,6 +228,7 @@ static struct rtl_hal_ops rtl8192ce_hal_ops = {
+ 	.led_control = rtl92ce_led_control,
+ 	.set_desc = rtl92ce_set_desc,
+ 	.get_desc = rtl92ce_get_desc,
++	.is_tx_desc_closed = rtl92ce_is_tx_desc_closed,
+ 	.tx_polling = rtl92ce_tx_polling,
+ 	.enable_hw_sec = rtl92ce_enable_hw_security_config,
+ 	.set_key = rtl92ce_set_key,
+@@ -271,6 +272,8 @@ static struct rtl_hal_cfg rtl92ce_hal_cfg = {
+ 	.maps[MAC_RCR_ACRC32] = ACRC32,
+ 	.maps[MAC_RCR_ACF] = ACF,
+ 	.maps[MAC_RCR_AAP] = AAP,
++	.maps[MAC_HIMR] = REG_HIMR,
++	.maps[MAC_HIMRE] = REG_HIMRE,
+ 
+ 	.maps[EFUSE_TEST] = REG_EFUSE_TEST,
+ 	.maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+index 0916275..e88dcd0 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+@@ -739,6 +739,23 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool istx, u8 desc_name)
+ 	return ret;
+ }
+ 
++bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw,
++			       u8 hw_queue, u16 index)
++{
++	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
++	struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
++	u8 *entry = (u8 *)(&ring->desc[ring->idx]);
++	u8 own = (u8)rtl92ce_get_desc(entry, true, HW_DESC_OWN);
++
++	/*beacon packet will only use the first
++	 *descriptor defautly,and the own may not
++	 *be cleared by the hardware
++	 */
++	if (own)
++		return false;
++	return true;
++}
++
+ void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.h b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.h
+index 9a39ec4..4bec4b0 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.h
+@@ -723,6 +723,8 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
+ void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
+ 		      u8 desc_name, u8 *val);
+ u32 rtl92ce_get_desc(u8 *pdesc, bool istx, u8 desc_name);
++bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw,
++			       u8 hw_queue, u16 index);
+ void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
+ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
+ 			     bool b_firstseg, bool b_lastseg,
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0013-rtlwifi-rtl8192ce-Fix-missing-interrupt-ready-flag.patch b/package/kernel/mac80211/patches/680-0013-rtlwifi-rtl8192ce-Fix-missing-interrupt-ready-flag.patch
new file mode 100644
index 0000000..6f29b9f
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0013-rtlwifi-rtl8192ce-Fix-missing-interrupt-ready-flag.patch
@@ -0,0 +1,42 @@
+From 87141db0848aa20c43d453f5545efc8f390d4372 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Fri, 28 Nov 2014 10:41:16 -0600
+Subject: [PATCH 13/51] rtlwifi: rtl8192ce: Fix missing interrupt ready flag
+
+Proper operation with the rewritten PCI mini driver requires that a flag be set
+when interrupts are enabled. This flag was missed.  This patch is one of three needed to
+fix the kernel regression reported at https://bugzilla.kernel.org/show_bug.cgi?id=88951.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Reported-by: Catalin Iacob <iacobcatalin at gmail.com>
+Tested-by: Catalin Iacob <iacobcatalin at gmail.com>
+Cc: Catalin Iacob <iacobcatalin at gmail.com>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+index 55357d6..d2ec516 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+@@ -1287,6 +1287,7 @@ void rtl92ce_enable_interrupt(struct ieee80211_hw *hw)
+ 
+ 	rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
+ 	rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
++	rtlpci->irq_enabled = true;
+ }
+ 
+ void rtl92ce_disable_interrupt(struct ieee80211_hw *hw)
+@@ -1296,7 +1297,7 @@ void rtl92ce_disable_interrupt(struct ieee80211_hw *hw)
+ 
+ 	rtl_write_dword(rtlpriv, REG_HIMR, IMR8190_DISABLED);
+ 	rtl_write_dword(rtlpriv, REG_HIMRE, IMR8190_DISABLED);
+-	synchronize_irq(rtlpci->pdev->irq);
++	rtlpci->irq_enabled = false;
+ }
+ 
+ static void _rtl92ce_poweroff_adapter(struct ieee80211_hw *hw)
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0014-rtlwifi-rtl8821ae-fix-misspelling-of-current-functio.patch b/package/kernel/mac80211/patches/680-0014-rtlwifi-rtl8821ae-fix-misspelling-of-current-functio.patch
new file mode 100644
index 0000000..d1f755f
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0014-rtlwifi-rtl8821ae-fix-misspelling-of-current-functio.patch
@@ -0,0 +1,65 @@
+From cf2bcc97dd332aa1d28eeacba1d8f8f89eccb7aa Mon Sep 17 00:00:00 2001
+From: Julia Lawall <Julia.Lawall at lip6.fr>
+Date: Sun, 7 Dec 2014 20:20:58 +0100
+Subject: [PATCH 14/51] rtlwifi: rtl8821ae: fix misspelling of current function
+ in string
+
+Replace a misspelled function name by %s and then __func__.
+
+8821 was written as 8812.
+
+This was done using Coccinelle, including the use of Levenshtein distance,
+as proposed by Rasmus Villemoes.
+
+Signed-off-by: Julia Lawall <Julia.Lawall at lip6.fr>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8821ae/dm.c | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
+index 9be1061..ba30b0d 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
+@@ -2078,8 +2078,7 @@ void rtl8821ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
+ 	if (rtldm->tx_rate != 0xFF)
+ 		tx_rate = rtl8821ae_hw_rate_to_mrate(hw, rtldm->tx_rate);
+ 
+-	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
+-		 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
++	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "===>%s\n", __func__);
+ 
+ 	if (tx_rate != 0xFF) { /* Mimic Modify High Rate BBSwing Limit.*/
+ 		/*CCK*/
+@@ -2128,7 +2127,7 @@ void rtl8821ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
+ 
+ 	if (method == BBSWING) {
+ 		RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
+-			 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
++			 "===>%s\n", __func__);
+ 		if (rf_path == RF90_PATH_A) {
+ 			final_swing_idx[RF90_PATH_A] =
+ 				(rtldm->ofdm_index[RF90_PATH_A] >
+@@ -2260,7 +2259,8 @@ void rtl8821ae_dm_txpower_tracking_callback_thermalmeter(
+ 	rtldm->txpower_trackinginit = true;
+ 
+ 	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
+-		 "===>rtl8812ae_dm_txpower_tracking_callback_thermalmeter,\n pDM_Odm->BbSwingIdxCckBase: %d,pDM_Odm->BbSwingIdxOfdmBase[A]:%d, pDM_Odm->DefaultOfdmIndex: %d\n",
++		 "===>%s,\n pDM_Odm->BbSwingIdxCckBase: %d,pDM_Odm->BbSwingIdxOfdmBase[A]:%d, pDM_Odm->DefaultOfdmIndex: %d\n",
++		 __func__,
+ 		 rtldm->swing_idx_cck_base,
+ 		 rtldm->swing_idx_ofdm_base[RF90_PATH_A],
+ 		 rtldm->default_ofdm_index);
+@@ -2539,8 +2539,7 @@ void rtl8821ae_dm_txpower_tracking_callback_thermalmeter(
+ 		}
+ 	}
+ 
+-	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
+-		 "<===rtl8812ae_dm_txpower_tracking_callback_thermalmeter\n");
++	RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "<===%s\n", __func__);
+ }
+ 
+ void rtl8821ae_dm_check_txpower_tracking_thermalmeter(struct ieee80211_hw *hw)
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0015-rtlwifi-rtl8192cu-Fix-sparse-non-static-symbol-warni.patch b/package/kernel/mac80211/patches/680-0015-rtlwifi-rtl8192cu-Fix-sparse-non-static-symbol-warni.patch
new file mode 100644
index 0000000..b46b79d
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0015-rtlwifi-rtl8192cu-Fix-sparse-non-static-symbol-warni.patch
@@ -0,0 +1,34 @@
+From 8670d4d603794e643601707e9222df49a2430840 Mon Sep 17 00:00:00 2001
+From: Wei Yongjun <yongjun_wei at trendmicro.com.cn>
+Date: Tue, 9 Dec 2014 21:18:43 +0800
+Subject: [PATCH 15/51] rtlwifi: rtl8192cu: Fix sparse non static symbol
+ warning
+
+Fixes the following sparse warning:
+
+drivers/net/wireless/rtlwifi/rtl8192cu/hw.c:1595:6: warning:
+ symbol 'usb_cmd_send_packet' was not declared. Should it be static?
+
+Signed-off-by: Wei Yongjun <yongjun_wei at trendmicro.com.cn>
+Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+index 873363a..5513217 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+@@ -1592,7 +1592,7 @@ void rtl92cu_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
+ 	}
+ }
+ 
+-bool usb_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb)
++static bool usb_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb)
+ {
+   /* Currently nothing happens here.
+    * Traffic stops after some seconds in WPA2 802.11n mode.
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0016-rtlwifi-rtl8192ce-Set-fw_ready-flag.patch b/package/kernel/mac80211/patches/680-0016-rtlwifi-rtl8192ce-Set-fw_ready-flag.patch
new file mode 100644
index 0000000..5f75b85
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0016-rtlwifi-rtl8192ce-Set-fw_ready-flag.patch
@@ -0,0 +1,37 @@
+From 9a1dce3a059111a7289680f4b8c0ec4f8736b6ee Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Wed, 10 Dec 2014 14:38:29 -0600
+Subject: [PATCH 16/51] rtlwifi: rtl8192ce: Set fw_ready flag
+
+The setting of this flag was missed in previous modifications.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Cc: Stable <stable at vger.kernel.org>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+index d2ec516..5c646d5 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+@@ -955,6 +955,7 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
+ 	local_save_flags(flags);
+ 	local_irq_enable();
+ 
++	rtlhal->fw_ready = false;
+ 	rtlpriv->intf_ops->disable_aspm(hw);
+ 	rtstatus = _rtl92ce_init_mac(hw);
+ 	if (!rtstatus) {
+@@ -971,6 +972,7 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
+ 		goto exit;
+ 	}
+ 
++	rtlhal->fw_ready = true;
+ 	rtlhal->last_hmeboxnum = 0;
+ 	rtl92c_phy_mac_config(hw);
+ 	/* because last function modify RCR, so we update
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0017-rtlwifi-rtl8192de-fw.c-Remove-unused-function.patch b/package/kernel/mac80211/patches/680-0017-rtlwifi-rtl8192de-fw.c-Remove-unused-function.patch
new file mode 100644
index 0000000..525e235
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0017-rtlwifi-rtl8192de-fw.c-Remove-unused-function.patch
@@ -0,0 +1,59 @@
+From 18e0c0bf3a5ea0f54384149570274d535341dc06 Mon Sep 17 00:00:00 2001
+From: Rickard Strandqvist <rickard_strandqvist at spectrumdigital.se>
+Date: Sun, 7 Dec 2014 23:00:13 +0100
+Subject: [PATCH 17/51] rtlwifi: rtl8192de: fw.c: Remove unused function
+
+Remove the function rtl92d_set_fw_pwrmode_cmd() that is not used anywhere.
+
+This was partially found by using a static code analysis program called cppcheck.
+
+Signed-off-by: Rickard Strandqvist <rickard_strandqvist at spectrumdigital.se>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192de/fw.c | 17 -----------------
+ drivers/net/wireless/rtlwifi/rtl8192de/fw.h |  1 -
+ 2 files changed, 18 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/fw.c b/drivers/net/wireless/rtlwifi/rtl8192de/fw.c
+index 2317707..62ef820 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/fw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/fw.c
+@@ -540,23 +540,6 @@ void rtl92d_fill_h2c_cmd(struct ieee80211_hw *hw,
+ 	return;
+ }
+ 
+-void rtl92d_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	u8 u1_h2c_set_pwrmode[3] = { 0 };
+-	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
+-
+-	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
+-	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode);
+-	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 1);
+-	SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode,
+-					      ppsc->reg_max_lps_awakeintvl);
+-	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
+-		      "rtl92d_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode",
+-		      u1_h2c_set_pwrmode, 3);
+-	rtl92d_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode);
+-}
+-
+ static bool _rtl92d_cmd_send_packet(struct ieee80211_hw *hw,
+ 				    struct sk_buff *skb)
+ {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/fw.h b/drivers/net/wireless/rtlwifi/rtl8192de/fw.h
+index a55a803..1646e7c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/fw.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/fw.h
+@@ -136,7 +136,6 @@ int rtl92d_download_fw(struct ieee80211_hw *hw);
+ void rtl92d_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
+ 			 u32 cmd_len, u8 *p_cmdbuffer);
+ void rtl92d_firmware_selfreset(struct ieee80211_hw *hw);
+-void rtl92d_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
+ void rtl92d_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
+ void rtl92d_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);
+ 
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0018-rtlwifi-rtl8821ae-Simplify-loading-of-WOWLAN-firmwar.patch b/package/kernel/mac80211/patches/680-0018-rtlwifi-rtl8821ae-Simplify-loading-of-WOWLAN-firmwar.patch
new file mode 100644
index 0000000..9a96f77
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0018-rtlwifi-rtl8821ae-Simplify-loading-of-WOWLAN-firmwar.patch
@@ -0,0 +1,211 @@
+From fe89707f0afa17edbb1bf8381fea1d2457aeebaa Mon Sep 17 00:00:00 2001
+From: Troy Tan <troy_tan at realsil.com.cn>
+Date: Thu, 18 Dec 2014 03:05:25 -0600
+Subject: [PATCH 18/51] rtlwifi: rtl8821ae: Simplify loading of WOWLAN firmware
+
+The existing method for loading both normal and WOWLAN firmware for the
+device duplicates a lot of code. This solution is much cleaner.
+
+Signed-off-by: Troy Tan <troy_tan at realsil.com.cn>
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/core.c         | 24 +++++++++-
+ drivers/net/wireless/rtlwifi/core.h         |  1 +
+ drivers/net/wireless/rtlwifi/rtl8821ae/sw.c | 74 ++++++++++-------------------
+ drivers/net/wireless/rtlwifi/wifi.h         |  3 +-
+ 4 files changed, 48 insertions(+), 54 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
+index 5fc6f52..deab852 100644
+--- a/drivers/net/wireless/rtlwifi/core.c
++++ b/drivers/net/wireless/rtlwifi/core.c
+@@ -95,7 +95,8 @@ void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data)
+ }
+ EXPORT_SYMBOL(rtl_bb_delay);
+ 
+-void rtl_fw_cb(const struct firmware *firmware, void *context)
++static void rtl_fw_do_work(const struct firmware *firmware, void *context,
++			   bool is_wow)
+ {
+ 	struct ieee80211_hw *hw = context;
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+@@ -125,12 +126,31 @@ found_alt:
+ 		release_firmware(firmware);
+ 		return;
+ 	}
+-	memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
++	if (!is_wow) {
++		memcpy(rtlpriv->rtlhal.pfirmware, firmware->data,
++		       firmware->size);
++		rtlpriv->rtlhal.fwsize = firmware->size;
++	} else {
++		memcpy(rtlpriv->rtlhal.wowlan_firmware, firmware->data,
++		       firmware->size);
++		rtlpriv->rtlhal.wowlan_fwsize = firmware->size;
++	}
+ 	rtlpriv->rtlhal.fwsize = firmware->size;
+ 	release_firmware(firmware);
+ }
++
++void rtl_fw_cb(const struct firmware *firmware, void *context)
++{
++	rtl_fw_do_work(firmware, context, false);
++}
+ EXPORT_SYMBOL(rtl_fw_cb);
+ 
++void rtl_wowlan_fw_cb(const struct firmware *firmware, void *context)
++{
++	rtl_fw_do_work(firmware, context, true);
++}
++EXPORT_SYMBOL(rtl_wowlan_fw_cb);
++
+ /*mutex for start & stop is must here. */
+ static int rtl_op_start(struct ieee80211_hw *hw)
+ {
+diff --git a/drivers/net/wireless/rtlwifi/core.h b/drivers/net/wireless/rtlwifi/core.h
+index 624e1dc..8c87eb5 100644
+--- a/drivers/net/wireless/rtlwifi/core.h
++++ b/drivers/net/wireless/rtlwifi/core.h
+@@ -37,6 +37,7 @@
+ 
+ extern const struct ieee80211_ops rtl_ops;
+ void rtl_fw_cb(const struct firmware *firmware, void *context);
++void rtl_wowlan_fw_cb(const struct firmware *firmware, void *context);
+ void rtl_addr_delay(u32 addr);
+ void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
+ 		     u32 mask, u32 data);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
+index fc92dd6..a4988121 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
+@@ -85,52 +85,6 @@ static void rtl8821ae_init_aspm_vars(struct ieee80211_hw *hw)
+ 	rtlpci->const_support_pciaspm = 1;
+ }
+ 
+-static void load_wowlan_fw(struct rtl_priv *rtlpriv)
+-{
+-	/* callback routine to load wowlan firmware after main fw has
+-	 * been loaded
+-	 */
+-	const struct firmware *wowlan_firmware;
+-	char *fw_name = NULL;
+-	int err;
+-
+-	/* for wowlan firmware buf */
+-	rtlpriv->rtlhal.wowlan_firmware = vzalloc(0x8000);
+-	if (!rtlpriv->rtlhal.wowlan_firmware) {
+-		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+-			 "Can't alloc buffer for wowlan fw.\n");
+-		return;
+-	}
+-
+-	if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8821AE)
+-		fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
+-	else
+-		fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
+-	err = request_firmware(&wowlan_firmware, fw_name, rtlpriv->io.dev);
+-	if (err) {
+-		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+-			 "Failed to request wowlan firmware!\n");
+-		goto error;
+-	}
+-
+-	if (wowlan_firmware->size > 0x8000) {
+-		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+-			 "Wowlan Firmware is too big!\n");
+-		goto error;
+-	}
+-
+-	memcpy(rtlpriv->rtlhal.wowlan_firmware, wowlan_firmware->data,
+-	       wowlan_firmware->size);
+-	rtlpriv->rtlhal.wowlan_fwsize = wowlan_firmware->size;
+-	release_firmware(wowlan_firmware);
+-
+-	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "WOWLAN FirmwareDownload OK\n");
+-	return;
+-error:
+-	release_firmware(wowlan_firmware);
+-	vfree(rtlpriv->rtlhal.wowlan_firmware);
+-}
+-
+ /*InitializeVariables8812E*/
+ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
+ {
+@@ -231,7 +185,6 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
+ 	else if (rtlpriv->psc.reg_fwctrl_lps == 3)
+ 		rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
+ 
+-	rtlpriv->rtl_fw_second_cb = load_wowlan_fw;
+ 	/* for firmware buf */
+ 	rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
+ 	if (!rtlpriv->rtlhal.pfirmware) {
+@@ -239,20 +192,41 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
+ 			 "Can't alloc buffer for fw.\n");
+ 		return 1;
+ 	}
++	rtlpriv->rtlhal.wowlan_firmware = vzalloc(0x8000);
++	if (!rtlpriv->rtlhal.wowlan_firmware) {
++		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
++			 "Can't alloc buffer for wowlan fw.\n");
++		return 1;
++	}
+ 
+-	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
++	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
+ 		rtlpriv->cfg->fw_name = "rtlwifi/rtl8812aefw.bin";
+-	else
++		rtlpriv->cfg->wowlan_fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
++	} else {
+ 		rtlpriv->cfg->fw_name = "rtlwifi/rtl8821aefw.bin";
++		rtlpriv->cfg->wowlan_fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
++	}
+ 
+ 	rtlpriv->max_fw_size = 0x8000;
++	/*load normal firmware*/
+ 	pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
+ 	err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
+ 				      rtlpriv->io.dev, GFP_KERNEL, hw,
+ 				      rtl_fw_cb);
+ 	if (err) {
+ 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+-			 "Failed to request firmware!\n");
++			 "Failed to request normal firmware!\n");
++		return 1;
++	}
++	/*load wowlan firmware*/
++	pr_info("Using firmware %s\n", rtlpriv->cfg->wowlan_fw_name);
++	err = request_firmware_nowait(THIS_MODULE, 1,
++				      rtlpriv->cfg->wowlan_fw_name,
++				      rtlpriv->io.dev, GFP_KERNEL, hw,
++				      rtl_wowlan_fw_cb);
++	if (err) {
++		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
++			 "Failed to request wowlan firmware!\n");
+ 		return 1;
+ 	}
+ 	return 0;
+diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
+index 6866dcf..a233b26 100644
+--- a/drivers/net/wireless/rtlwifi/wifi.h
++++ b/drivers/net/wireless/rtlwifi/wifi.h
+@@ -2242,6 +2242,7 @@ struct rtl_hal_cfg {
+ 	char *name;
+ 	char *fw_name;
+ 	char *alt_fw_name;
++	char *wowlan_fw_name;
+ 	struct rtl_hal_ops *ops;
+ 	struct rtl_mod_params *mod_params;
+ 	struct rtl_hal_usbint_cfg *usb_interface_cfg;
+@@ -2518,8 +2519,6 @@ struct proxim {
+ 
+ struct rtl_priv {
+ 	struct ieee80211_hw *hw;
+-	/* Used to load a second firmware */
+-	void (*rtl_fw_second_cb)(struct rtl_priv *rtlpriv);
+ 	struct completion firmware_loading_complete;
+ 	struct list_head list;
+ 	struct rtl_priv *buddy_priv;
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0019-rtlwifi-rtl8821ae-Fix-typos-in-power-sequence-macro.patch b/package/kernel/mac80211/patches/680-0019-rtlwifi-rtl8821ae-Fix-typos-in-power-sequence-macro.patch
new file mode 100644
index 0000000..09a3043
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0019-rtlwifi-rtl8821ae-Fix-typos-in-power-sequence-macro.patch
@@ -0,0 +1,33 @@
+From f091282fd367faa014ebc2aa0a2fd178a48b476d Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:26 -0600
+Subject: [PATCH 19/51] rtlwifi: rtl8821ae: Fix typos in power-sequence macro
+
+Two of the macros that control power sequencing have values to be set that
+contain bits that are not covered by the associated mask.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h
+index bf0b0ce..36b3e91 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h
+@@ -93,9 +93,9 @@
+ 
+ #define RTL8812_TRANS_CARDEMU_TO_SUS					\
+ 	{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
+-	PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xcc}, \
++	PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xc0}, \
+ 	{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
+-	PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xEC}, \
++	PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xE0}, \
+ 	{0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
+ 	PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x07 \
+ 	/* gpio11 input mode, gpio10~8 output mode */},	\
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0020-rtlwifi-rtl8192ce-Add-code-to-set-the-keep-alive-ope.patch b/package/kernel/mac80211/patches/680-0020-rtlwifi-rtl8192ce-Add-code-to-set-the-keep-alive-ope.patch
new file mode 100644
index 0000000..f80bd44
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0020-rtlwifi-rtl8192ce-Add-code-to-set-the-keep-alive-ope.patch
@@ -0,0 +1,50 @@
+From 1ed03272b58f1ed6545b99dde39c42358156af69 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:27 -0600
+Subject: [PATCH 20/51] rtlwifi: rtl8192ce: Add code to set the keep-alive
+ operation
+
+This change helps the device maintain a connection.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h | 1 +
+ drivers/net/wireless/rtlwifi/rtl8192ce/hw.c       | 9 +++++++--
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
+index b64ae45..e9f4281 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
+@@ -37,6 +37,7 @@
+ #define FW_8192C_POLLING_DELAY			5
+ #define FW_8192C_POLLING_TIMEOUT_COUNT		100
+ #define NORMAL_CHIP				BIT(4)
++#define H2C_92C_KEEP_ALIVE_CTRL			48
+ 
+ #define IS_FW_HEADER_EXIST(_pfwhdr)	\
+ 	((le16_to_cpu(_pfwhdr->signature)&0xFFF0) == 0x92C0 ||\
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+index 5c646d5..b63b78b 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+@@ -544,8 +544,13 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
+ 						(u8 *)(&fw_current_inps));
+ 			}
+ 		break; }
+-	case HW_VAR_KEEP_ALIVE:
+-		break;
++	case HW_VAR_KEEP_ALIVE: {
++		u8 array[2];
++
++		array[0] = 0xff;
++		array[1] = *((u8 *)val);
++		rtl92c_fill_h2c_cmd(hw, H2C_92C_KEEP_ALIVE_CTRL, 2, array);
++		break; }
+ 	default:
+ 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
+ 			 "switch case %d not processed\n", variable);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0021-rtlwifi-rtl8192ce-Update-setting-of-the-media-status.patch b/package/kernel/mac80211/patches/680-0021-rtlwifi-rtl8192ce-Update-setting-of-the-media-status.patch
new file mode 100644
index 0000000..4cb0e5a
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0021-rtlwifi-rtl8192ce-Update-setting-of-the-media-status.patch
@@ -0,0 +1,106 @@
+From 9d62c5531b515ef427cee13cca87777dba617c94 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:28 -0600
+Subject: [PATCH 21/51] rtlwifi: rtl8192ce: Update setting of the media status
+
+This patch applies changes found in the latest vendor driver.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 51 ++++++++++++++++++-----------
+ 1 file changed, 31 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+index b63b78b..2ee778a 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+@@ -1161,36 +1161,24 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+ 	u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
+ 	enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
+-	bt_msr &= 0xfc;
++	u8 mode = MSR_NOLINK;
+ 
+-	if (type == NL80211_IFTYPE_UNSPECIFIED ||
+-	    type == NL80211_IFTYPE_STATION) {
+-		_rtl92ce_stop_tx_beacon(hw);
+-		_rtl92ce_enable_bcn_sub_func(hw);
+-	} else if (type == NL80211_IFTYPE_ADHOC || type == NL80211_IFTYPE_AP ||
+-		   type == NL80211_IFTYPE_MESH_POINT) {
+-		_rtl92ce_resume_tx_beacon(hw);
+-		_rtl92ce_disable_bcn_sub_func(hw);
+-	} else {
+-		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
+-			 "Set HW_VAR_MEDIA_STATUS: No such media status(%x)\n",
+-			 type);
+-	}
++	bt_msr &= 0xfc;
+ 
+ 	switch (type) {
+ 	case NL80211_IFTYPE_UNSPECIFIED:
+-		bt_msr |= MSR_NOLINK;
++		mode = MSR_NOLINK;
+ 		ledaction = LED_CTL_LINK;
+ 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+ 			 "Set Network type to NO LINK!\n");
+ 		break;
+ 	case NL80211_IFTYPE_ADHOC:
+-		bt_msr |= MSR_ADHOC;
++		mode = MSR_ADHOC;
+ 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+ 			 "Set Network type to Ad Hoc!\n");
+ 		break;
+ 	case NL80211_IFTYPE_STATION:
+-		bt_msr |= MSR_INFRA;
++		mode = MSR_INFRA;
+ 		ledaction = LED_CTL_LINK;
+ 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+ 			 "Set Network type to STA!\n");
+@@ -1201,7 +1189,7 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
+ 			 "Set Network type to AP!\n");
+ 		break;
+ 	case NL80211_IFTYPE_MESH_POINT:
+-		bt_msr |= MSR_ADHOC;
++		mode = MSR_ADHOC;
+ 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+ 			 "Set Network type to Mesh Point!\n");
+ 		break;
+@@ -1212,9 +1200,32 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
+ 
+ 	}
+ 
+-	rtl_write_byte(rtlpriv, (MSR), bt_msr);
++	/* MSR_INFRA == Link in infrastructure network;
++	 * MSR_ADHOC == Link in ad hoc network;
++	 * Therefore, check link state is necessary.
++	 *
++	 * MSR_AP == AP mode; link state does not matter here.
++	 */
++	if (mode != MSR_AP &&
++	    rtlpriv->mac80211.link_state < MAC80211_LINKED) {
++		mode = MSR_NOLINK;
++		ledaction = LED_CTL_NO_LINK;
++	}
++	if (mode == MSR_NOLINK || mode == MSR_INFRA) {
++		_rtl92ce_stop_tx_beacon(hw);
++		_rtl92ce_enable_bcn_sub_func(hw);
++	} else if (mode == MSR_ADHOC || mode == MSR_AP) {
++		_rtl92ce_resume_tx_beacon(hw);
++		_rtl92ce_disable_bcn_sub_func(hw);
++	} else {
++		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
++			 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
++			 mode);
++	}
++	rtl_write_byte(rtlpriv, (MSR), bt_msr | mode);
++
+ 	rtlpriv->cfg->ops->led_control(hw, ledaction);
+-	if ((bt_msr & MSR_MASK) == MSR_AP)
++	if (mode == MSR_AP)
+ 		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
+ 	else
+ 		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0022-rtlwifi-rtl8192ce-Update-rate-setting-routines.patch b/package/kernel/mac80211/patches/680-0022-rtlwifi-rtl8192ce-Update-rate-setting-routines.patch
new file mode 100644
index 0000000..6f52560
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0022-rtlwifi-rtl8192ce-Update-rate-setting-routines.patch
@@ -0,0 +1,199 @@
+From ff6ee6b0ce1f62936a916ef1c33015a2ec48925e Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:29 -0600
+Subject: [PATCH 22/51] rtlwifi: rtl8192ce: Update rate setting routines
+
+These changes were found in the latest vendor driver.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | 107 ++++++++++++----------------
+ 1 file changed, 44 insertions(+), 63 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+index 2ee778a..303b299 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+@@ -1168,7 +1168,6 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
+ 	switch (type) {
+ 	case NL80211_IFTYPE_UNSPECIFIED:
+ 		mode = MSR_NOLINK;
+-		ledaction = LED_CTL_LINK;
+ 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+ 			 "Set Network type to NO LINK!\n");
+ 		break;
+@@ -1184,7 +1183,8 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
+ 			 "Set Network type to STA!\n");
+ 		break;
+ 	case NL80211_IFTYPE_AP:
+-		bt_msr |= MSR_AP;
++		mode = MSR_AP;
++		ledaction = LED_CTL_LINK;
+ 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
+ 			 "Set Network type to AP!\n");
+ 		break;
+@@ -1222,7 +1222,7 @@ static int _rtl92ce_set_media_status(struct ieee80211_hw *hw,
+ 			 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
+ 			 mode);
+ 	}
+-	rtl_write_byte(rtlpriv, (MSR), bt_msr | mode);
++	rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
+ 
+ 	rtlpriv->cfg->ops->led_control(hw, ledaction);
+ 	if (mode == MSR_AP)
+@@ -1849,7 +1849,6 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
+ 	u32 ratr_value;
+ 	u8 ratr_index = 0;
+ 	u8 nmode = mac->ht_enable;
+-	u8 mimo_ps = IEEE80211_SMPS_OFF;
+ 	u16 shortgi_rate;
+ 	u32 tmp_ratr_value;
+ 	u8 curtxbw_40mhz = mac->bw_40;
+@@ -1858,6 +1857,7 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
+ 	u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+ 			       1 : 0;
+ 	enum wireless_mode wirelessmode = mac->mode;
++	u32 ratr_mask;
+ 
+ 	if (rtlhal->current_bandtype == BAND_ON_5G)
+ 		ratr_value = sta->supp_rates[1] << 4;
+@@ -1881,19 +1881,13 @@ static void rtl92ce_update_hal_rate_table(struct ieee80211_hw *hw,
+ 	case WIRELESS_MODE_N_24G:
+ 	case WIRELESS_MODE_N_5G:
+ 		nmode = 1;
+-		if (mimo_ps == IEEE80211_SMPS_STATIC) {
+-			ratr_value &= 0x0007F005;
+-		} else {
+-			u32 ratr_mask;
+-
+-			if (get_rf_type(rtlphy) == RF_1T2R ||
+-			    get_rf_type(rtlphy) == RF_1T1R)
+-				ratr_mask = 0x000ff005;
+-			else
+-				ratr_mask = 0x0f0ff005;
++		if (get_rf_type(rtlphy) == RF_1T2R ||
++		    get_rf_type(rtlphy) == RF_1T1R)
++			ratr_mask = 0x000ff005;
++		else
++			ratr_mask = 0x0f0ff005;
+ 
+-			ratr_value &= ratr_mask;
+-		}
++		ratr_value &= ratr_mask;
+ 		break;
+ 	default:
+ 		if (rtlphy->rf_type == RF_1T2R)
+@@ -1946,17 +1940,16 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
+ 	struct rtl_sta_info *sta_entry = NULL;
+ 	u32 ratr_bitmap;
+ 	u8 ratr_index;
+-	u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
+-	u8 curshortgi_40mhz = curtxbw_40mhz &&
+-			      (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+-				1 : 0;
++	u8 curtxbw_40mhz = (sta->ht_cap.cap &
++			    IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
++	u8 curshortgi_40mhz = (sta->ht_cap.cap &
++			       IEEE80211_HT_CAP_SGI_40) ?  1 : 0;
+ 	u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+ 				1 : 0;
+ 	enum wireless_mode wirelessmode = 0;
+ 	bool shortgi = false;
+ 	u8 rate_mask[5];
+ 	u8 macid = 0;
+-	u8 mimo_ps = IEEE80211_SMPS_OFF;
+ 
+ 	sta_entry = (struct rtl_sta_info *) sta->drv_priv;
+ 	wirelessmode = sta_entry->wireless_mode;
+@@ -2001,47 +1994,38 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
+ 	case WIRELESS_MODE_N_5G:
+ 		ratr_index = RATR_INX_WIRELESS_NGB;
+ 
+-		if (mimo_ps == IEEE80211_SMPS_STATIC) {
+-			if (rssi_level == 1)
+-				ratr_bitmap &= 0x00070000;
+-			else if (rssi_level == 2)
+-				ratr_bitmap &= 0x0007f000;
+-			else
+-				ratr_bitmap &= 0x0007f005;
++		if (rtlphy->rf_type == RF_1T2R ||
++		    rtlphy->rf_type == RF_1T1R) {
++			if (curtxbw_40mhz) {
++				if (rssi_level == 1)
++					ratr_bitmap &= 0x000f0000;
++				else if (rssi_level == 2)
++					ratr_bitmap &= 0x000ff000;
++				else
++					ratr_bitmap &= 0x000ff015;
++			} else {
++				if (rssi_level == 1)
++					ratr_bitmap &= 0x000f0000;
++				else if (rssi_level == 2)
++					ratr_bitmap &= 0x000ff000;
++				else
++					ratr_bitmap &= 0x000ff005;
++			}
+ 		} else {
+-			if (rtlphy->rf_type == RF_1T2R ||
+-			    rtlphy->rf_type == RF_1T1R) {
+-				if (curtxbw_40mhz) {
+-					if (rssi_level == 1)
+-						ratr_bitmap &= 0x000f0000;
+-					else if (rssi_level == 2)
+-						ratr_bitmap &= 0x000ff000;
+-					else
+-						ratr_bitmap &= 0x000ff015;
+-				} else {
+-					if (rssi_level == 1)
+-						ratr_bitmap &= 0x000f0000;
+-					else if (rssi_level == 2)
+-						ratr_bitmap &= 0x000ff000;
+-					else
+-						ratr_bitmap &= 0x000ff005;
+-				}
++			if (curtxbw_40mhz) {
++				if (rssi_level == 1)
++					ratr_bitmap &= 0x0f0f0000;
++				else if (rssi_level == 2)
++					ratr_bitmap &= 0x0f0ff000;
++				else
++					ratr_bitmap &= 0x0f0ff015;
+ 			} else {
+-				if (curtxbw_40mhz) {
+-					if (rssi_level == 1)
+-						ratr_bitmap &= 0x0f0f0000;
+-					else if (rssi_level == 2)
+-						ratr_bitmap &= 0x0f0ff000;
+-					else
+-						ratr_bitmap &= 0x0f0ff015;
+-				} else {
+-					if (rssi_level == 1)
+-						ratr_bitmap &= 0x0f0f0000;
+-					else if (rssi_level == 2)
+-						ratr_bitmap &= 0x0f0ff000;
+-					else
+-						ratr_bitmap &= 0x0f0ff005;
+-				}
++				if (rssi_level == 1)
++					ratr_bitmap &= 0x0f0f0000;
++				else if (rssi_level == 2)
++					ratr_bitmap &= 0x0f0ff000;
++				else
++					ratr_bitmap &= 0x0f0ff005;
+ 			}
+ 		}
+ 
+@@ -2074,9 +2058,6 @@ static void rtl92ce_update_hal_rate_mask(struct ieee80211_hw *hw,
+ 		 "Rate_index:%x, ratr_val:%x, %5phC\n",
+ 		 ratr_index, ratr_bitmap, rate_mask);
+ 	rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask);
+-
+-	if (macid != 0)
+-		sta_entry->ratr_index = ratr_index;
+ }
+ 
+ void rtl92ce_update_hal_rate_tbl(struct ieee80211_hw *hw,
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0023-rtlwifi-rtl8192ce-Improve-RF-sleep-routine.patch b/package/kernel/mac80211/patches/680-0023-rtlwifi-rtl8192ce-Improve-RF-sleep-routine.patch
new file mode 100644
index 0000000..3fa78ed
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0023-rtlwifi-rtl8192ce-Improve-RF-sleep-routine.patch
@@ -0,0 +1,35 @@
+From 99057920a2f7360977979dc4c2ba60d5f9dc9e23 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:30 -0600
+Subject: [PATCH 23/51] rtlwifi: rtl8192ce: Improve RF sleep routine
+
+These changes match those of the latest vendor driver.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ce/phy.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
+index bc5ca98..1ee5a6a 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
+@@ -518,11 +518,12 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
+ 		}
+ 	case ERFSLEEP:{
+ 			if (ppsc->rfpwr_state == ERFOFF)
+-				return false;
++				break;
+ 			for (queue_id = 0, i = 0;
+ 			     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
+ 				ring = &pcipriv->dev.tx_ring[queue_id];
+-				if (skb_queue_len(&ring->queue) == 0) {
++				if (queue_id == BEACON_QUEUE ||
++				    skb_queue_len(&ring->queue) == 0) {
+ 					queue_id++;
+ 					continue;
+ 				} else {
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0024-rtlwifi-Remove-extraneous-argument-for-rate-mapping.patch b/package/kernel/mac80211/patches/680-0024-rtlwifi-Remove-extraneous-argument-for-rate-mapping.patch
new file mode 100644
index 0000000..2b3f8aa
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0024-rtlwifi-Remove-extraneous-argument-for-rate-mapping.patch
@@ -0,0 +1,138 @@
+From f1f21770b11ca83d688b2791b163c2b892ca6fa6 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:31 -0600
+Subject: [PATCH 24/51] rtlwifi: Remove extraneous argument for rate mapping
+
+Four of the drivers (92ce, 92cu, 92de, and 92se) supply an argument to the
+rate-mapping routine that is never used, thus it can be removed.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/base.c          |  2 +-
+ drivers/net/wireless/rtlwifi/base.h          |  2 +-
+ drivers/net/wireless/rtlwifi/rtl8192ce/trx.c |  5 ++---
+ drivers/net/wireless/rtlwifi/rtl8192cu/trx.c |  6 ++----
+ drivers/net/wireless/rtlwifi/rtl8192de/trx.c |  3 +--
+ drivers/net/wireless/rtlwifi/rtl8192se/trx.c | 11 +++++------
+ 6 files changed, 12 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
+index 40b6d1d..d4c8e95 100644
+--- a/drivers/net/wireless/rtlwifi/base.c
++++ b/drivers/net/wireless/rtlwifi/base.c
+@@ -883,7 +883,7 @@ static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw,
+  * DESC92_RATEMCS0-->DESC92_RATEMCS15 ==> idx is 0-->15
+  */
+ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+-			 bool isht, u8 desc_rate, bool first_ampdu)
++			 bool isht, u8 desc_rate)
+ {
+ 	int rate_idx;
+ 
+diff --git a/drivers/net/wireless/rtlwifi/base.h b/drivers/net/wireless/rtlwifi/base.h
+index 982f245..936c2bb 100644
+--- a/drivers/net/wireless/rtlwifi/base.h
++++ b/drivers/net/wireless/rtlwifi/base.h
+@@ -124,7 +124,7 @@ void rtl_deinit_deferred_work(struct ieee80211_hw *hw);
+ 
+ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
+ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+-			 bool isht, u8 desc_rate, bool first_ampdu);
++			 bool isht, u8 desc_rate);
+ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
+ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
+ 
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+index e88dcd0..d25aeeb 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+@@ -400,9 +400,8 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * are use (RX_FLAG_HT)
+ 	 * Notice: this is diff with windows define
+ 	 */
+-	rx_status->rate_idx = rtlwifi_rate_mapping(hw,
+-				stats->is_ht, stats->rate,
+-				stats->isfirst_ampdu);
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
++						   stats->rate);
+ 
+ 	rx_status->mactime = stats->timestamp_low;
+ 	if (phystatus) {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+index f383d5f..fa30b26 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+@@ -340,8 +340,7 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
+ 		rx_status->flag |= RX_FLAG_DECRYPTED;
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw,
+ 					(bool)GET_RX_DESC_RX_HT(pdesc),
+-					(u8)GET_RX_DESC_RX_MCS(pdesc),
+-					(bool)GET_RX_DESC_PAGGR(pdesc));
++					(u8)GET_RX_DESC_RX_MCS(pdesc));
+ 	rx_status->mactime = GET_RX_DESC_TSFL(pdesc);
+ 	if (phystatus) {
+ 		p_drvinfo = (struct rx_fwinfo_92c *)(skb->data +
+@@ -408,8 +407,7 @@ static void _rtl_rx_process(struct ieee80211_hw *hw, struct sk_buff *skb)
+ 	/* Data rate */
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw,
+ 					(bool)GET_RX_DESC_RX_HT(rxdesc),
+-					(u8)GET_RX_DESC_RX_MCS(rxdesc),
+-					(bool)GET_RX_DESC_PAGGR(rxdesc));
++					(u8)GET_RX_DESC_RX_MCS(rxdesc));
+ 	/*  There is a phy status after this rx descriptor. */
+ 	if (GET_RX_DESC_PHY_STATUS(rxdesc)) {
+ 		p_drvinfo = (struct rx_fwinfo_92c *)(rxdesc + RTL_RX_DESC_SIZE);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+index 8efbcc7..7fbae49 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+@@ -514,8 +514,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,	struct rtl_stats *stats,
+ 		rx_status->flag |= RX_FLAG_DECRYPTED;
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw,
+ 					(bool)GET_RX_DESC_RXHT(pdesc),
+-					(u8)GET_RX_DESC_RXMCS(pdesc),
+-					(bool)GET_RX_DESC_PAGGR(pdesc));
++					(u8)GET_RX_DESC_RXMCS(pdesc));
+ 	rx_status->mactime = GET_RX_DESC_TSFL(pdesc);
+ 	if (phystatus) {
+ 		p_drvinfo = (struct rx_fwinfo_92d *)(skb->data +
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+index 672fd3b..da053cb 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+@@ -264,7 +264,6 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
+ 	struct rx_fwinfo *p_drvinfo;
+ 	u32 phystatus = (u32)GET_RX_STATUS_DESC_PHY_STATUS(pdesc);
+ 	struct ieee80211_hdr *hdr;
+-	bool first_ampdu = false;
+ 
+ 	stats->length = (u16)GET_RX_STATUS_DESC_PKT_LEN(pdesc);
+ 	stats->rx_drvinfo_size = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE(pdesc) * 8;
+@@ -319,8 +318,8 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
+ 			rx_status->flag |= RX_FLAG_DECRYPTED;
+ 	}
+ 
+-	rx_status->rate_idx = rtlwifi_rate_mapping(hw,
+-			      stats->is_ht, stats->rate, first_ampdu);
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
++						   stats->rate);
+ 
+ 	rx_status->mactime = stats->timestamp_low;
+ 	if (phystatus) {
+@@ -398,9 +397,9 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
+ 
+ 		if (rtlhal->version == VERSION_8192S_ACUT) {
+ 			if (ptcb_desc->hw_rate == DESC92_RATE1M ||
+-				ptcb_desc->hw_rate  == DESC92_RATE2M ||
+-				ptcb_desc->hw_rate == DESC92_RATE5_5M ||
+-				ptcb_desc->hw_rate == DESC92_RATE11M) {
++			    ptcb_desc->hw_rate  == DESC92_RATE2M ||
++			    ptcb_desc->hw_rate == DESC92_RATE5_5M ||
++			    ptcb_desc->hw_rate == DESC92_RATE11M) {
+ 				ptcb_desc->hw_rate = DESC92_RATE12M;
+ 			}
+ 		}
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0025-rtlwifi-rtl8723be-Switch-to-use-common-rate-mapping-.patch b/package/kernel/mac80211/patches/680-0025-rtlwifi-rtl8723be-Switch-to-use-common-rate-mapping-.patch
new file mode 100644
index 0000000..6ee667f
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0025-rtlwifi-rtl8723be-Switch-to-use-common-rate-mapping-.patch
@@ -0,0 +1,196 @@
+From 7e0dde9248c413485aa2eb2079782d8941f062c8 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:32 -0600
+Subject: [PATCH 25/51] rtlwifi: rtl8723be: Switch to use common rate-mapping
+ routine
+
+This driver currently has its owm version of this routine that duplicates
+a routine in rtlwifi.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8723be/trx.c | 160 +--------------------------
+ 1 file changed, 1 insertion(+), 159 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/trx.c b/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
+index d6a1c70..cb23bed 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
+@@ -47,164 +47,6 @@ static u8 _rtl8723be_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
+ 	return skb->priority;
+ }
+ 
+-/* mac80211's rate_idx is like this:
+- *
+- * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
+- *
+- * B/G rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92C_RATE1M-->DESC92C_RATE54M ==> idx is 0-->11,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
+- *
+- * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
+- * A rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92C_RATE6M-->DESC92C_RATE54M ==> idx is 0-->7,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
+- */
+-static int _rtl8723be_rate_mapping(struct ieee80211_hw *hw,
+-				   bool isht, u8 desc_rate)
+-{
+-	int rate_idx;
+-
+-	if (!isht) {
+-		if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
+-			switch (desc_rate) {
+-			case DESC92C_RATE1M:
+-				rate_idx = 0;
+-				break;
+-			case DESC92C_RATE2M:
+-				rate_idx = 1;
+-				break;
+-			case DESC92C_RATE5_5M:
+-				rate_idx = 2;
+-				break;
+-			case DESC92C_RATE11M:
+-				rate_idx = 3;
+-				break;
+-			case DESC92C_RATE6M:
+-				rate_idx = 4;
+-				break;
+-			case DESC92C_RATE9M:
+-				rate_idx = 5;
+-				break;
+-			case DESC92C_RATE12M:
+-				rate_idx = 6;
+-				break;
+-			case DESC92C_RATE18M:
+-				rate_idx = 7;
+-				break;
+-			case DESC92C_RATE24M:
+-				rate_idx = 8;
+-				break;
+-			case DESC92C_RATE36M:
+-				rate_idx = 9;
+-				break;
+-			case DESC92C_RATE48M:
+-				rate_idx = 10;
+-				break;
+-			case DESC92C_RATE54M:
+-				rate_idx = 11;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		} else {
+-			switch (desc_rate) {
+-			case DESC92C_RATE6M:
+-				rate_idx = 0;
+-				break;
+-			case DESC92C_RATE9M:
+-				rate_idx = 1;
+-				break;
+-			case DESC92C_RATE12M:
+-				rate_idx = 2;
+-				break;
+-			case DESC92C_RATE18M:
+-				rate_idx = 3;
+-				break;
+-			case DESC92C_RATE24M:
+-				rate_idx = 4;
+-				break;
+-			case DESC92C_RATE36M:
+-				rate_idx = 5;
+-				break;
+-			case DESC92C_RATE48M:
+-				rate_idx = 6;
+-				break;
+-			case DESC92C_RATE54M:
+-				rate_idx = 7;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		}
+-	} else {
+-		switch (desc_rate) {
+-		case DESC92C_RATEMCS0:
+-			rate_idx = 0;
+-			break;
+-		case DESC92C_RATEMCS1:
+-			rate_idx = 1;
+-			break;
+-		case DESC92C_RATEMCS2:
+-			rate_idx = 2;
+-			break;
+-		case DESC92C_RATEMCS3:
+-			rate_idx = 3;
+-			break;
+-		case DESC92C_RATEMCS4:
+-			rate_idx = 4;
+-			break;
+-		case DESC92C_RATEMCS5:
+-			rate_idx = 5;
+-			break;
+-		case DESC92C_RATEMCS6:
+-			rate_idx = 6;
+-			break;
+-		case DESC92C_RATEMCS7:
+-			rate_idx = 7;
+-			break;
+-		case DESC92C_RATEMCS8:
+-			rate_idx = 8;
+-			break;
+-		case DESC92C_RATEMCS9:
+-			rate_idx = 9;
+-			break;
+-		case DESC92C_RATEMCS10:
+-			rate_idx = 10;
+-			break;
+-		case DESC92C_RATEMCS11:
+-			rate_idx = 11;
+-			break;
+-		case DESC92C_RATEMCS12:
+-			rate_idx = 12;
+-			break;
+-		case DESC92C_RATEMCS13:
+-			rate_idx = 13;
+-			break;
+-		case DESC92C_RATEMCS14:
+-			rate_idx = 14;
+-			break;
+-		case DESC92C_RATEMCS15:
+-			rate_idx = 15;
+-			break;
+-		default:
+-			rate_idx = 0;
+-			break;
+-		}
+-	}
+-	return rate_idx;
+-}
+-
+ static void _rtl8723be_query_rxphystatus(struct ieee80211_hw *hw,
+ 					 struct rtl_stats *pstatus, u8 *pdesc,
+ 					 struct rx_fwinfo_8723be *p_drvinfo,
+@@ -558,7 +400,7 @@ bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * supported rates or MCS index if HT rates
+ 	 * are use (RX_FLAG_HT)
+ 	 */
+-	rx_status->rate_idx = _rtl8723be_rate_mapping(hw, status->is_ht,
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
+ 						      status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0026-rtlwifi-rtl8188ee-Switch-to-use-common-rate-mapping-.patch b/package/kernel/mac80211/patches/680-0026-rtlwifi-rtl8188ee-Switch-to-use-common-rate-mapping-.patch
new file mode 100644
index 0000000..f418296
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0026-rtlwifi-rtl8188ee-Switch-to-use-common-rate-mapping-.patch
@@ -0,0 +1,197 @@
+From 5b243feff35ab6050893741bc1a7016fa3ae5a8b Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:33 -0600
+Subject: [PATCH 26/51] rtlwifi: rtl8188ee: Switch to use common rate-mapping
+ routine
+
+This driver duplicates a routine found in the core.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8188ee/trx.c | 162 +--------------------------
+ 1 file changed, 2 insertions(+), 160 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
+index df549c9..d430884 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
+@@ -47,164 +47,6 @@ static u8 _rtl88ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
+ 	return skb->priority;
+ }
+ 
+-/* mac80211's rate_idx is like this:
+- *
+- * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
+- *
+- * B/G rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92C_RATE1M-->DESC92C_RATE54M ==> idx is 0-->11,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
+- *
+- * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
+- * A rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92C_RATE6M-->DESC92C_RATE54M ==> idx is 0-->7,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
+- */
+-static int _rtl88ee_rate_mapping(struct ieee80211_hw *hw,
+-				 bool isht, u8 desc_rate)
+-{
+-	int rate_idx;
+-
+-	if (!isht) {
+-		if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
+-			switch (desc_rate) {
+-			case DESC92C_RATE1M:
+-				rate_idx = 0;
+-				break;
+-			case DESC92C_RATE2M:
+-				rate_idx = 1;
+-				break;
+-			case DESC92C_RATE5_5M:
+-				rate_idx = 2;
+-				break;
+-			case DESC92C_RATE11M:
+-				rate_idx = 3;
+-				break;
+-			case DESC92C_RATE6M:
+-				rate_idx = 4;
+-				break;
+-			case DESC92C_RATE9M:
+-				rate_idx = 5;
+-				break;
+-			case DESC92C_RATE12M:
+-				rate_idx = 6;
+-				break;
+-			case DESC92C_RATE18M:
+-				rate_idx = 7;
+-				break;
+-			case DESC92C_RATE24M:
+-				rate_idx = 8;
+-				break;
+-			case DESC92C_RATE36M:
+-				rate_idx = 9;
+-				break;
+-			case DESC92C_RATE48M:
+-				rate_idx = 10;
+-				break;
+-			case DESC92C_RATE54M:
+-				rate_idx = 11;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		} else {
+-			switch (desc_rate) {
+-			case DESC92C_RATE6M:
+-				rate_idx = 0;
+-				break;
+-			case DESC92C_RATE9M:
+-				rate_idx = 1;
+-				break;
+-			case DESC92C_RATE12M:
+-				rate_idx = 2;
+-				break;
+-			case DESC92C_RATE18M:
+-				rate_idx = 3;
+-				break;
+-			case DESC92C_RATE24M:
+-				rate_idx = 4;
+-				break;
+-			case DESC92C_RATE36M:
+-				rate_idx = 5;
+-				break;
+-			case DESC92C_RATE48M:
+-				rate_idx = 6;
+-				break;
+-			case DESC92C_RATE54M:
+-				rate_idx = 7;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		}
+-	} else {
+-		switch (desc_rate) {
+-		case DESC92C_RATEMCS0:
+-			rate_idx = 0;
+-			break;
+-		case DESC92C_RATEMCS1:
+-			rate_idx = 1;
+-			break;
+-		case DESC92C_RATEMCS2:
+-			rate_idx = 2;
+-			break;
+-		case DESC92C_RATEMCS3:
+-			rate_idx = 3;
+-			break;
+-		case DESC92C_RATEMCS4:
+-			rate_idx = 4;
+-			break;
+-		case DESC92C_RATEMCS5:
+-			rate_idx = 5;
+-			break;
+-		case DESC92C_RATEMCS6:
+-			rate_idx = 6;
+-			break;
+-		case DESC92C_RATEMCS7:
+-			rate_idx = 7;
+-			break;
+-		case DESC92C_RATEMCS8:
+-			rate_idx = 8;
+-			break;
+-		case DESC92C_RATEMCS9:
+-			rate_idx = 9;
+-			break;
+-		case DESC92C_RATEMCS10:
+-			rate_idx = 10;
+-			break;
+-		case DESC92C_RATEMCS11:
+-			rate_idx = 11;
+-			break;
+-		case DESC92C_RATEMCS12:
+-			rate_idx = 12;
+-			break;
+-		case DESC92C_RATEMCS13:
+-			rate_idx = 13;
+-			break;
+-		case DESC92C_RATEMCS14:
+-			rate_idx = 14;
+-			break;
+-		case DESC92C_RATEMCS15:
+-			rate_idx = 15;
+-			break;
+-		default:
+-			rate_idx = 0;
+-			break;
+-		}
+-	}
+-	return rate_idx;
+-}
+-
+ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
+ 			struct rtl_stats *pstatus, u8 *pdesc,
+ 			struct rx_fwinfo_88e *p_drvinfo,
+@@ -630,8 +472,8 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * are use (RX_FLAG_HT)
+ 	 * Notice: this is diff with windows define
+ 	 */
+-	rx_status->rate_idx = _rtl88ee_rate_mapping(hw,
+-				status->is_ht, status->rate);
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
++						   status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+ 	if (phystatus == true) {
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0027-rtlwifi-rtl8723ae-Modify-driver-to-use-rate-mapping-.patch b/package/kernel/mac80211/patches/680-0027-rtlwifi-rtl8723ae-Modify-driver-to-use-rate-mapping-.patch
new file mode 100644
index 0000000..435fa7c
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0027-rtlwifi-rtl8723ae-Modify-driver-to-use-rate-mapping-.patch
@@ -0,0 +1,197 @@
+From 8d3fc3a64ba34d859d6bb0de76bd1860b234cd1c Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:34 -0600
+Subject: [PATCH 27/51] rtlwifi: rtl8723ae: Modify driver to use rate-mapping
+ routine in core
+
+This driver is also converted to use the rate-mapping code in the core.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8723ae/trx.c | 162 +--------------------------
+ 1 file changed, 2 insertions(+), 160 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
+index d372cca..662a094 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
+@@ -45,164 +45,6 @@ static u8 _rtl8723e_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
+ 	return skb->priority;
+ }
+ 
+-/* mac80211's rate_idx is like this:
+- *
+- * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
+- *
+- * B/G rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92C_RATE1M-->DESC92C_RATE54M ==> idx is 0-->11,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
+- *
+- * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
+- * A rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92C_RATE6M-->DESC92C_RATE54M ==> idx is 0-->7,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
+- */
+-static int _rtl8723e_rate_mapping(struct ieee80211_hw *hw,
+-				  bool isht, u8 desc_rate)
+-{
+-	int rate_idx;
+-
+-	if (!isht) {
+-		if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
+-			switch (desc_rate) {
+-			case DESC92C_RATE1M:
+-				rate_idx = 0;
+-				break;
+-			case DESC92C_RATE2M:
+-				rate_idx = 1;
+-				break;
+-			case DESC92C_RATE5_5M:
+-				rate_idx = 2;
+-				break;
+-			case DESC92C_RATE11M:
+-				rate_idx = 3;
+-				break;
+-			case DESC92C_RATE6M:
+-				rate_idx = 4;
+-				break;
+-			case DESC92C_RATE9M:
+-				rate_idx = 5;
+-				break;
+-			case DESC92C_RATE12M:
+-				rate_idx = 6;
+-				break;
+-			case DESC92C_RATE18M:
+-				rate_idx = 7;
+-				break;
+-			case DESC92C_RATE24M:
+-				rate_idx = 8;
+-				break;
+-			case DESC92C_RATE36M:
+-				rate_idx = 9;
+-				break;
+-			case DESC92C_RATE48M:
+-				rate_idx = 10;
+-				break;
+-			case DESC92C_RATE54M:
+-				rate_idx = 11;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		} else {
+-			switch (desc_rate) {
+-			case DESC92C_RATE6M:
+-				rate_idx = 0;
+-				break;
+-			case DESC92C_RATE9M:
+-				rate_idx = 1;
+-				break;
+-			case DESC92C_RATE12M:
+-				rate_idx = 2;
+-				break;
+-			case DESC92C_RATE18M:
+-				rate_idx = 3;
+-				break;
+-			case DESC92C_RATE24M:
+-				rate_idx = 4;
+-				break;
+-			case DESC92C_RATE36M:
+-				rate_idx = 5;
+-				break;
+-			case DESC92C_RATE48M:
+-				rate_idx = 6;
+-				break;
+-			case DESC92C_RATE54M:
+-				rate_idx = 7;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		}
+-	} else {
+-		switch (desc_rate) {
+-		case DESC92C_RATEMCS0:
+-			rate_idx = 0;
+-			break;
+-		case DESC92C_RATEMCS1:
+-			rate_idx = 1;
+-			break;
+-		case DESC92C_RATEMCS2:
+-			rate_idx = 2;
+-			break;
+-		case DESC92C_RATEMCS3:
+-			rate_idx = 3;
+-			break;
+-		case DESC92C_RATEMCS4:
+-			rate_idx = 4;
+-			break;
+-		case DESC92C_RATEMCS5:
+-			rate_idx = 5;
+-			break;
+-		case DESC92C_RATEMCS6:
+-			rate_idx = 6;
+-			break;
+-		case DESC92C_RATEMCS7:
+-			rate_idx = 7;
+-			break;
+-		case DESC92C_RATEMCS8:
+-			rate_idx = 8;
+-			break;
+-		case DESC92C_RATEMCS9:
+-			rate_idx = 9;
+-			break;
+-		case DESC92C_RATEMCS10:
+-			rate_idx = 10;
+-			break;
+-		case DESC92C_RATEMCS11:
+-			rate_idx = 11;
+-			break;
+-		case DESC92C_RATEMCS12:
+-			rate_idx = 12;
+-			break;
+-		case DESC92C_RATEMCS13:
+-			rate_idx = 13;
+-			break;
+-		case DESC92C_RATEMCS14:
+-			rate_idx = 14;
+-			break;
+-		case DESC92C_RATEMCS15:
+-			rate_idx = 15;
+-			break;
+-		default:
+-			rate_idx = 0;
+-			break;
+-		}
+-	}
+-	return rate_idx;
+-}
+-
+ static void _rtl8723e_query_rxphystatus(struct ieee80211_hw *hw,
+ 					struct rtl_stats *pstatus, u8 *pdesc,
+ 					struct rx_fwinfo_8723e *p_drvinfo,
+@@ -503,8 +345,8 @@ bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * are use (RX_FLAG_HT)
+ 	 * Notice: this is diff with windows define
+ 	 */
+-	rx_status->rate_idx = _rtl8723e_rate_mapping(hw,
+-				status->is_ht, status->rate);
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
++						   status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+ 	if (phystatus == true) {
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0028-rtlwifi-rtl8192ee-Convert-driver-to-use-common-rate-.patch b/package/kernel/mac80211/patches/680-0028-rtlwifi-rtl8192ee-Convert-driver-to-use-common-rate-.patch
new file mode 100644
index 0000000..9fff206
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0028-rtlwifi-rtl8192ee-Convert-driver-to-use-common-rate-.patch
@@ -0,0 +1,196 @@
+From 7b7d0d60a558d80165a18c0eceb1cc7b0c7d6439 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:35 -0600
+Subject: [PATCH 28/51] rtlwifi: rtl8192ee: Convert driver to use common
+ rate-mapping code
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ee/trx.c | 163 +--------------------------
+ 1 file changed, 2 insertions(+), 161 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
+index 2fcbef1..fb46fb9 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
+@@ -47,164 +47,6 @@ static u8 _rtl92ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
+ 	return skb->priority;
+ }
+ 
+-/* mac80211's rate_idx is like this:
+- *
+- * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
+- *
+- * B/G rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92C_RATE1M-->DESC92C_RATE54M ==> idx is 0-->11,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
+- *
+- * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
+- * A rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92C_RATE6M-->DESC92C_RATE54M ==> idx is 0-->7,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
+- */
+-static int _rtl92ee_rate_mapping(struct ieee80211_hw *hw,
+-				 bool isht, u8 desc_rate)
+-{
+-	int rate_idx;
+-
+-	if (!isht) {
+-		if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
+-			switch (desc_rate) {
+-			case DESC92C_RATE1M:
+-				rate_idx = 0;
+-				break;
+-			case DESC92C_RATE2M:
+-				rate_idx = 1;
+-				break;
+-			case DESC92C_RATE5_5M:
+-				rate_idx = 2;
+-				break;
+-			case DESC92C_RATE11M:
+-				rate_idx = 3;
+-				break;
+-			case DESC92C_RATE6M:
+-				rate_idx = 4;
+-				break;
+-			case DESC92C_RATE9M:
+-				rate_idx = 5;
+-				break;
+-			case DESC92C_RATE12M:
+-				rate_idx = 6;
+-				break;
+-			case DESC92C_RATE18M:
+-				rate_idx = 7;
+-				break;
+-			case DESC92C_RATE24M:
+-				rate_idx = 8;
+-				break;
+-			case DESC92C_RATE36M:
+-				rate_idx = 9;
+-				break;
+-			case DESC92C_RATE48M:
+-				rate_idx = 10;
+-				break;
+-			case DESC92C_RATE54M:
+-				rate_idx = 11;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		} else {
+-			switch (desc_rate) {
+-			case DESC92C_RATE6M:
+-				rate_idx = 0;
+-				break;
+-			case DESC92C_RATE9M:
+-				rate_idx = 1;
+-				break;
+-			case DESC92C_RATE12M:
+-				rate_idx = 2;
+-				break;
+-			case DESC92C_RATE18M:
+-				rate_idx = 3;
+-				break;
+-			case DESC92C_RATE24M:
+-				rate_idx = 4;
+-				break;
+-			case DESC92C_RATE36M:
+-				rate_idx = 5;
+-				break;
+-			case DESC92C_RATE48M:
+-				rate_idx = 6;
+-				break;
+-			case DESC92C_RATE54M:
+-				rate_idx = 7;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		}
+-	} else {
+-		switch (desc_rate) {
+-		case DESC92C_RATEMCS0:
+-			rate_idx = 0;
+-			break;
+-		case DESC92C_RATEMCS1:
+-			rate_idx = 1;
+-			break;
+-		case DESC92C_RATEMCS2:
+-			rate_idx = 2;
+-			break;
+-		case DESC92C_RATEMCS3:
+-			rate_idx = 3;
+-			break;
+-		case DESC92C_RATEMCS4:
+-			rate_idx = 4;
+-			break;
+-		case DESC92C_RATEMCS5:
+-			rate_idx = 5;
+-			break;
+-		case DESC92C_RATEMCS6:
+-			rate_idx = 6;
+-			break;
+-		case DESC92C_RATEMCS7:
+-			rate_idx = 7;
+-			break;
+-		case DESC92C_RATEMCS8:
+-			rate_idx = 8;
+-			break;
+-		case DESC92C_RATEMCS9:
+-			rate_idx = 9;
+-			break;
+-		case DESC92C_RATEMCS10:
+-			rate_idx = 10;
+-			break;
+-		case DESC92C_RATEMCS11:
+-			rate_idx = 11;
+-			break;
+-		case DESC92C_RATEMCS12:
+-			rate_idx = 12;
+-			break;
+-		case DESC92C_RATEMCS13:
+-			rate_idx = 13;
+-			break;
+-		case DESC92C_RATEMCS14:
+-			rate_idx = 14;
+-			break;
+-		case DESC92C_RATEMCS15:
+-			rate_idx = 15;
+-			break;
+-		default:
+-			rate_idx = 0;
+-			break;
+-		}
+-	}
+-	return rate_idx;
+-}
+-
+ static void _rtl92ee_query_rxphystatus(struct ieee80211_hw *hw,
+ 				       struct rtl_stats *pstatus, u8 *pdesc,
+ 				       struct rx_fwinfo *p_drvinfo,
+@@ -576,9 +418,8 @@ bool rtl92ee_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * are use (RX_FLAG_HT)
+ 	 * Notice: this is diff with windows define
+ 	 */
+-	rx_status->rate_idx = _rtl92ee_rate_mapping(hw,
+-						    status->is_ht,
+-						    status->rate);
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
++						   status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+ 	if (phystatus) {
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0029-rtlwifi-Convert-all-drivers-to-use-a-common-set-of-r.patch b/package/kernel/mac80211/patches/680-0029-rtlwifi-Convert-all-drivers-to-use-a-common-set-of-r.patch
new file mode 100644
index 0000000..10cb532
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0029-rtlwifi-Convert-all-drivers-to-use-a-common-set-of-r.patch
@@ -0,0 +1,786 @@
+From e0e776a3c85c27751ab4399616fc50a474cc8379 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:36 -0600
+Subject: [PATCH 29/51] rtlwifi: Convert all drivers to use a common set of
+ rate descriptors
+
+This common set of rate descriptors is renamed to be DESC_RATExx.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/base.c          | 80 ++++++++++++++--------------
+ drivers/net/wireless/rtlwifi/rtl8192ce/sw.c  | 30 +++++------
+ drivers/net/wireless/rtlwifi/rtl8192ce/trx.c |  8 +--
+ drivers/net/wireless/rtlwifi/rtl8192cu/mac.c |  4 +-
+ drivers/net/wireless/rtlwifi/rtl8192cu/sw.c  | 28 +++++-----
+ drivers/net/wireless/rtlwifi/rtl8192cu/trx.c |  6 +--
+ drivers/net/wireless/rtlwifi/rtl8192de/sw.c  | 30 +++++------
+ drivers/net/wireless/rtlwifi/rtl8192de/trx.c | 20 +++----
+ drivers/net/wireless/rtlwifi/rtl8192ee/trx.c | 12 ++---
+ drivers/net/wireless/rtlwifi/rtl8192ee/trx.h |  8 +--
+ drivers/net/wireless/rtlwifi/rtl8192se/def.h |  8 +--
+ drivers/net/wireless/rtlwifi/rtl8192se/sw.c  | 30 +++++------
+ drivers/net/wireless/rtlwifi/rtl8192se/trx.c | 18 +++----
+ drivers/net/wireless/rtlwifi/rtl8821ae/def.h | 31 -----------
+ drivers/net/wireless/rtlwifi/wifi.h          | 72 ++++++++++++-------------
+ 15 files changed, 177 insertions(+), 208 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
+index d4c8e95..23fc51e 100644
+--- a/drivers/net/wireless/rtlwifi/base.c
++++ b/drivers/net/wireless/rtlwifi/base.c
+@@ -867,20 +867,20 @@ static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw,
+  *
+  * B/G rate:
+  * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92_RATE1M-->DESC92_RATE54M ==> idx is 0-->11,
++ * DESC_RATE1M-->DESC_RATE54M ==> idx is 0-->11,
+  *
+  * N rate:
+  * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92_RATEMCS0-->DESC92_RATEMCS15 ==> idx is 0-->15
++ * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
+  *
+  * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
+  * A rate:
+  * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC92_RATE6M-->DESC92_RATE54M ==> idx is 0-->7,
++ * DESC_RATE6M-->DESC_RATE54M ==> idx is 0-->7,
+  *
+  * N rate:
+  * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC92_RATEMCS0-->DESC92_RATEMCS15 ==> idx is 0-->15
++ * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
+  */
+ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+ 			 bool isht, u8 desc_rate)
+@@ -890,40 +890,40 @@ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+ 	if (false == isht) {
+ 		if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
+ 			switch (desc_rate) {
+-			case DESC92_RATE1M:
++			case DESC_RATE1M:
+ 				rate_idx = 0;
+ 				break;
+-			case DESC92_RATE2M:
++			case DESC_RATE2M:
+ 				rate_idx = 1;
+ 				break;
+-			case DESC92_RATE5_5M:
++			case DESC_RATE5_5M:
+ 				rate_idx = 2;
+ 				break;
+-			case DESC92_RATE11M:
++			case DESC_RATE11M:
+ 				rate_idx = 3;
+ 				break;
+-			case DESC92_RATE6M:
++			case DESC_RATE6M:
+ 				rate_idx = 4;
+ 				break;
+-			case DESC92_RATE9M:
++			case DESC_RATE9M:
+ 				rate_idx = 5;
+ 				break;
+-			case DESC92_RATE12M:
++			case DESC_RATE12M:
+ 				rate_idx = 6;
+ 				break;
+-			case DESC92_RATE18M:
++			case DESC_RATE18M:
+ 				rate_idx = 7;
+ 				break;
+-			case DESC92_RATE24M:
++			case DESC_RATE24M:
+ 				rate_idx = 8;
+ 				break;
+-			case DESC92_RATE36M:
++			case DESC_RATE36M:
+ 				rate_idx = 9;
+ 				break;
+-			case DESC92_RATE48M:
++			case DESC_RATE48M:
+ 				rate_idx = 10;
+ 				break;
+-			case DESC92_RATE54M:
++			case DESC_RATE54M:
+ 				rate_idx = 11;
+ 				break;
+ 			default:
+@@ -932,28 +932,28 @@ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+ 			}
+ 		} else {
+ 			switch (desc_rate) {
+-			case DESC92_RATE6M:
++			case DESC_RATE6M:
+ 				rate_idx = 0;
+ 				break;
+-			case DESC92_RATE9M:
++			case DESC_RATE9M:
+ 				rate_idx = 1;
+ 				break;
+-			case DESC92_RATE12M:
++			case DESC_RATE12M:
+ 				rate_idx = 2;
+ 				break;
+-			case DESC92_RATE18M:
++			case DESC_RATE18M:
+ 				rate_idx = 3;
+ 				break;
+-			case DESC92_RATE24M:
++			case DESC_RATE24M:
+ 				rate_idx = 4;
+ 				break;
+-			case DESC92_RATE36M:
++			case DESC_RATE36M:
+ 				rate_idx = 5;
+ 				break;
+-			case DESC92_RATE48M:
++			case DESC_RATE48M:
+ 				rate_idx = 6;
+ 				break;
+-			case DESC92_RATE54M:
++			case DESC_RATE54M:
+ 				rate_idx = 7;
+ 				break;
+ 			default:
+@@ -963,52 +963,52 @@ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+ 		}
+ 	} else {
+ 		switch (desc_rate) {
+-		case DESC92_RATEMCS0:
++		case DESC_RATEMCS0:
+ 			rate_idx = 0;
+ 			break;
+-		case DESC92_RATEMCS1:
++		case DESC_RATEMCS1:
+ 			rate_idx = 1;
+ 			break;
+-		case DESC92_RATEMCS2:
++		case DESC_RATEMCS2:
+ 			rate_idx = 2;
+ 			break;
+-		case DESC92_RATEMCS3:
++		case DESC_RATEMCS3:
+ 			rate_idx = 3;
+ 			break;
+-		case DESC92_RATEMCS4:
++		case DESC_RATEMCS4:
+ 			rate_idx = 4;
+ 			break;
+-		case DESC92_RATEMCS5:
++		case DESC_RATEMCS5:
+ 			rate_idx = 5;
+ 			break;
+-		case DESC92_RATEMCS6:
++		case DESC_RATEMCS6:
+ 			rate_idx = 6;
+ 			break;
+-		case DESC92_RATEMCS7:
++		case DESC_RATEMCS7:
+ 			rate_idx = 7;
+ 			break;
+-		case DESC92_RATEMCS8:
++		case DESC_RATEMCS8:
+ 			rate_idx = 8;
+ 			break;
+-		case DESC92_RATEMCS9:
++		case DESC_RATEMCS9:
+ 			rate_idx = 9;
+ 			break;
+-		case DESC92_RATEMCS10:
++		case DESC_RATEMCS10:
+ 			rate_idx = 10;
+ 			break;
+-		case DESC92_RATEMCS11:
++		case DESC_RATEMCS11:
+ 			rate_idx = 11;
+ 			break;
+-		case DESC92_RATEMCS12:
++		case DESC_RATEMCS12:
+ 			rate_idx = 12;
+ 			break;
+-		case DESC92_RATEMCS13:
++		case DESC_RATEMCS13:
+ 			rate_idx = 13;
+ 			break;
+-		case DESC92_RATEMCS14:
++		case DESC_RATEMCS14:
+ 			rate_idx = 14;
+ 			break;
+-		case DESC92_RATEMCS15:
++		case DESC_RATEMCS15:
+ 			rate_idx = 15;
+ 			break;
+ 		default:
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+index dd5aa08..de6cb6c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+@@ -334,21 +334,21 @@ static struct rtl_hal_cfg rtl92ce_hal_cfg = {
+ 	.maps[RTL_IMR_ROK] = IMR_ROK,
+ 	.maps[RTL_IBSS_INT_MASKS] = (IMR_BCNINT | IMR_TBDOK | IMR_TBDER),
+ 
+-	.maps[RTL_RC_CCK_RATE1M] = DESC92_RATE1M,
+-	.maps[RTL_RC_CCK_RATE2M] = DESC92_RATE2M,
+-	.maps[RTL_RC_CCK_RATE5_5M] = DESC92_RATE5_5M,
+-	.maps[RTL_RC_CCK_RATE11M] = DESC92_RATE11M,
+-	.maps[RTL_RC_OFDM_RATE6M] = DESC92_RATE6M,
+-	.maps[RTL_RC_OFDM_RATE9M] = DESC92_RATE9M,
+-	.maps[RTL_RC_OFDM_RATE12M] = DESC92_RATE12M,
+-	.maps[RTL_RC_OFDM_RATE18M] = DESC92_RATE18M,
+-	.maps[RTL_RC_OFDM_RATE24M] = DESC92_RATE24M,
+-	.maps[RTL_RC_OFDM_RATE36M] = DESC92_RATE36M,
+-	.maps[RTL_RC_OFDM_RATE48M] = DESC92_RATE48M,
+-	.maps[RTL_RC_OFDM_RATE54M] = DESC92_RATE54M,
+-
+-	.maps[RTL_RC_HT_RATEMCS7] = DESC92_RATEMCS7,
+-	.maps[RTL_RC_HT_RATEMCS15] = DESC92_RATEMCS15,
++	.maps[RTL_RC_CCK_RATE1M] = DESC_RATE1M,
++	.maps[RTL_RC_CCK_RATE2M] = DESC_RATE2M,
++	.maps[RTL_RC_CCK_RATE5_5M] = DESC_RATE5_5M,
++	.maps[RTL_RC_CCK_RATE11M] = DESC_RATE11M,
++	.maps[RTL_RC_OFDM_RATE6M] = DESC_RATE6M,
++	.maps[RTL_RC_OFDM_RATE9M] = DESC_RATE9M,
++	.maps[RTL_RC_OFDM_RATE12M] = DESC_RATE12M,
++	.maps[RTL_RC_OFDM_RATE18M] = DESC_RATE18M,
++	.maps[RTL_RC_OFDM_RATE24M] = DESC_RATE24M,
++	.maps[RTL_RC_OFDM_RATE36M] = DESC_RATE36M,
++	.maps[RTL_RC_OFDM_RATE48M] = DESC_RATE48M,
++	.maps[RTL_RC_OFDM_RATE54M] = DESC_RATE54M,
++
++	.maps[RTL_RC_HT_RATEMCS7] = DESC_RATEMCS7,
++	.maps[RTL_RC_HT_RATEMCS15] = DESC_RATEMCS15,
+ };
+ 
+ static const struct pci_device_id rtl92ce_pci_ids[] = {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+index d25aeeb..685faea 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+@@ -257,8 +257,8 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
+ 		pstats->recvsignalpower = rx_pwr_all;
+ 
+ 		/* (3)EVM of HT rate */
+-		if (pstats->is_ht && pstats->rate >= DESC92_RATEMCS8 &&
+-		    pstats->rate <= DESC92_RATEMCS15)
++		if (pstats->is_ht && pstats->rate >= DESC_RATEMCS8 &&
++		    pstats->rate <= DESC_RATEMCS15)
+ 			max_spatial_stream = 2;
+ 		else
+ 			max_spatial_stream = 1;
+@@ -500,7 +500,7 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
+ 		SET_TX_DESC_RTS_BW(pdesc, 0);
+ 		SET_TX_DESC_RTS_SC(pdesc, tcb_desc->rts_sc);
+ 		SET_TX_DESC_RTS_SHORT(pdesc,
+-				      ((tcb_desc->rts_rate <= DESC92_RATE54M) ?
++				      ((tcb_desc->rts_rate <= DESC_RATE54M) ?
+ 				       (tcb_desc->rts_use_shortpreamble ? 1 : 0)
+ 				       : (tcb_desc->rts_use_shortgi ? 1 : 0)));
+ 
+@@ -623,7 +623,7 @@ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
+ 	if (firstseg)
+ 		SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
+ 
+-	SET_TX_DESC_TX_RATE(pdesc, DESC92_RATE1M);
++	SET_TX_DESC_TX_RATE(pdesc, DESC_RATE1M);
+ 
+ 	SET_TX_DESC_SEQ(pdesc, 0);
+ 
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
+index c2d8ec6..133e395 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
+@@ -880,8 +880,8 @@ static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw,
+ 		pstats->rxpower = rx_pwr_all;
+ 		pstats->recvsignalpower = rx_pwr_all;
+ 		if (GET_RX_DESC_RX_MCS(pdesc) &&
+-		    GET_RX_DESC_RX_MCS(pdesc) >= DESC92_RATEMCS8 &&
+-		    GET_RX_DESC_RX_MCS(pdesc) <= DESC92_RATEMCS15)
++		    GET_RX_DESC_RX_MCS(pdesc) >= DESC_RATEMCS8 &&
++		    GET_RX_DESC_RX_MCS(pdesc) <= DESC_RATEMCS15)
+ 			max_spatial_stream = 2;
+ 		else
+ 			max_spatial_stream = 1;
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+index e06bafe..90a714c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+@@ -257,20 +257,20 @@ static struct rtl_hal_cfg rtl92cu_hal_cfg = {
+ 	.maps[RTL_IMR_ROK] = IMR_ROK,
+ 	.maps[RTL_IBSS_INT_MASKS] = (IMR_BCNINT | IMR_TBDOK | IMR_TBDER),
+ 
+-	.maps[RTL_RC_CCK_RATE1M] = DESC92_RATE1M,
+-	.maps[RTL_RC_CCK_RATE2M] = DESC92_RATE2M,
+-	.maps[RTL_RC_CCK_RATE5_5M] = DESC92_RATE5_5M,
+-	.maps[RTL_RC_CCK_RATE11M] = DESC92_RATE11M,
+-	.maps[RTL_RC_OFDM_RATE6M] = DESC92_RATE6M,
+-	.maps[RTL_RC_OFDM_RATE9M] = DESC92_RATE9M,
+-	.maps[RTL_RC_OFDM_RATE12M] = DESC92_RATE12M,
+-	.maps[RTL_RC_OFDM_RATE18M] = DESC92_RATE18M,
+-	.maps[RTL_RC_OFDM_RATE24M] = DESC92_RATE24M,
+-	.maps[RTL_RC_OFDM_RATE36M] = DESC92_RATE36M,
+-	.maps[RTL_RC_OFDM_RATE48M] = DESC92_RATE48M,
+-	.maps[RTL_RC_OFDM_RATE54M] = DESC92_RATE54M,
+-	.maps[RTL_RC_HT_RATEMCS7] = DESC92_RATEMCS7,
+-	.maps[RTL_RC_HT_RATEMCS15] = DESC92_RATEMCS15,
++	.maps[RTL_RC_CCK_RATE1M] = DESC_RATE1M,
++	.maps[RTL_RC_CCK_RATE2M] = DESC_RATE2M,
++	.maps[RTL_RC_CCK_RATE5_5M] = DESC_RATE5_5M,
++	.maps[RTL_RC_CCK_RATE11M] = DESC_RATE11M,
++	.maps[RTL_RC_OFDM_RATE6M] = DESC_RATE6M,
++	.maps[RTL_RC_OFDM_RATE9M] = DESC_RATE9M,
++	.maps[RTL_RC_OFDM_RATE12M] = DESC_RATE12M,
++	.maps[RTL_RC_OFDM_RATE18M] = DESC_RATE18M,
++	.maps[RTL_RC_OFDM_RATE24M] = DESC_RATE24M,
++	.maps[RTL_RC_OFDM_RATE36M] = DESC_RATE36M,
++	.maps[RTL_RC_OFDM_RATE48M] = DESC_RATE48M,
++	.maps[RTL_RC_OFDM_RATE54M] = DESC_RATE54M,
++	.maps[RTL_RC_HT_RATEMCS7] = DESC_RATEMCS7,
++	.maps[RTL_RC_HT_RATEMCS15] = DESC_RATEMCS15,
+ };
+ 
+ #define USB_VENDER_ID_REALTEK		0x0bda
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+index fa30b26..fe29876 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+@@ -543,7 +543,7 @@ void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,
+ 	SET_TX_DESC_RTS_BW(txdesc, 0);
+ 	SET_TX_DESC_RTS_SC(txdesc, tcb_desc->rts_sc);
+ 	SET_TX_DESC_RTS_SHORT(txdesc,
+-			      ((tcb_desc->rts_rate <= DESC92_RATE54M) ?
++			      ((tcb_desc->rts_rate <= DESC_RATE54M) ?
+ 			       (tcb_desc->rts_use_shortpreamble ? 1 : 0)
+ 			       : (tcb_desc->rts_use_shortgi ? 1 : 0)));
+ 	if (mac->bw_40) {
+@@ -642,7 +642,7 @@ void rtl92cu_fill_fake_txdesc(struct ieee80211_hw *hw, u8 * pDesc,
+ 	}
+ 	SET_TX_DESC_USE_RATE(pDesc, 1); /* use data rate which is set by Sw */
+ 	SET_TX_DESC_OWN(pDesc, 1);
+-	SET_TX_DESC_TX_RATE(pDesc, DESC92_RATE1M);
++	SET_TX_DESC_TX_RATE(pDesc, DESC_RATE1M);
+ 	_rtl_tx_desc_checksum(pDesc);
+ }
+ 
+@@ -658,7 +658,7 @@ void rtl92cu_tx_fill_cmddesc(struct ieee80211_hw *hw,
+ 	memset((void *)pdesc, 0, RTL_TX_HEADER_SIZE);
+ 	if (firstseg)
+ 		SET_TX_DESC_OFFSET(pdesc, RTL_TX_HEADER_SIZE);
+-	SET_TX_DESC_TX_RATE(pdesc, DESC92_RATE1M);
++	SET_TX_DESC_TX_RATE(pdesc, DESC_RATE1M);
+ 	SET_TX_DESC_SEQ(pdesc, 0);
+ 	SET_TX_DESC_LINIP(pdesc, 0);
+ 	SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
+index a0aba08..b19d039 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
+@@ -337,21 +337,21 @@ static struct rtl_hal_cfg rtl92de_hal_cfg = {
+ 	.maps[RTL_IMR_ROK] = IMR_ROK,
+ 	.maps[RTL_IBSS_INT_MASKS] = (IMR_BCNINT | IMR_TBDOK | IMR_TBDER),
+ 
+-	.maps[RTL_RC_CCK_RATE1M] = DESC92_RATE1M,
+-	.maps[RTL_RC_CCK_RATE2M] = DESC92_RATE2M,
+-	.maps[RTL_RC_CCK_RATE5_5M] = DESC92_RATE5_5M,
+-	.maps[RTL_RC_CCK_RATE11M] = DESC92_RATE11M,
+-	.maps[RTL_RC_OFDM_RATE6M] = DESC92_RATE6M,
+-	.maps[RTL_RC_OFDM_RATE9M] = DESC92_RATE9M,
+-	.maps[RTL_RC_OFDM_RATE12M] = DESC92_RATE12M,
+-	.maps[RTL_RC_OFDM_RATE18M] = DESC92_RATE18M,
+-	.maps[RTL_RC_OFDM_RATE24M] = DESC92_RATE24M,
+-	.maps[RTL_RC_OFDM_RATE36M] = DESC92_RATE36M,
+-	.maps[RTL_RC_OFDM_RATE48M] = DESC92_RATE48M,
+-	.maps[RTL_RC_OFDM_RATE54M] = DESC92_RATE54M,
+-
+-	.maps[RTL_RC_HT_RATEMCS7] = DESC92_RATEMCS7,
+-	.maps[RTL_RC_HT_RATEMCS15] = DESC92_RATEMCS15,
++	.maps[RTL_RC_CCK_RATE1M] = DESC_RATE1M,
++	.maps[RTL_RC_CCK_RATE2M] = DESC_RATE2M,
++	.maps[RTL_RC_CCK_RATE5_5M] = DESC_RATE5_5M,
++	.maps[RTL_RC_CCK_RATE11M] = DESC_RATE11M,
++	.maps[RTL_RC_OFDM_RATE6M] = DESC_RATE6M,
++	.maps[RTL_RC_OFDM_RATE9M] = DESC_RATE9M,
++	.maps[RTL_RC_OFDM_RATE12M] = DESC_RATE12M,
++	.maps[RTL_RC_OFDM_RATE18M] = DESC_RATE18M,
++	.maps[RTL_RC_OFDM_RATE24M] = DESC_RATE24M,
++	.maps[RTL_RC_OFDM_RATE36M] = DESC_RATE36M,
++	.maps[RTL_RC_OFDM_RATE48M] = DESC_RATE48M,
++	.maps[RTL_RC_OFDM_RATE54M] = DESC_RATE54M,
++
++	.maps[RTL_RC_HT_RATEMCS7] = DESC_RATEMCS7,
++	.maps[RTL_RC_HT_RATEMCS15] = DESC_RATEMCS15,
+ };
+ 
+ static struct pci_device_id rtl92de_pci_ids[] = {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+index 7fbae49..381a4c0 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+@@ -235,8 +235,8 @@ static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw,
+ 		pstats->rx_pwdb_all = pwdb_all;
+ 		pstats->rxpower = rx_pwr_all;
+ 		pstats->recvsignalpower = rx_pwr_all;
+-		if (pdesc->rxht && pdesc->rxmcs >= DESC92_RATEMCS8 &&
+-		    pdesc->rxmcs <= DESC92_RATEMCS15)
++		if (pdesc->rxht && pdesc->rxmcs >= DESC_RATEMCS8 &&
++		    pdesc->rxmcs <= DESC_RATEMCS15)
+ 			max_spatial_stream = 2;
+ 		else
+ 			max_spatial_stream = 1;
+@@ -611,14 +611,14 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
+ 		}
+ 		/* 5G have no CCK rate */
+ 		if (rtlhal->current_bandtype == BAND_ON_5G)
+-			if (ptcb_desc->hw_rate < DESC92_RATE6M)
+-				ptcb_desc->hw_rate = DESC92_RATE6M;
++			if (ptcb_desc->hw_rate < DESC_RATE6M)
++				ptcb_desc->hw_rate = DESC_RATE6M;
+ 		SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
+ 		if (ptcb_desc->use_shortgi || ptcb_desc->use_shortpreamble)
+ 			SET_TX_DESC_DATA_SHORTGI(pdesc, 1);
+ 
+ 		if (rtlhal->macphymode == DUALMAC_DUALPHY &&
+-			ptcb_desc->hw_rate == DESC92_RATEMCS7)
++			ptcb_desc->hw_rate == DESC_RATEMCS7)
+ 			SET_TX_DESC_DATA_SHORTGI(pdesc, 1);
+ 
+ 		if (info->flags & IEEE80211_TX_CTL_AMPDU) {
+@@ -634,13 +634,13 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
+ 		SET_TX_DESC_RTS_STBC(pdesc, ((ptcb_desc->rts_stbc) ? 1 : 0));
+ 		/* 5G have no CCK rate */
+ 		if (rtlhal->current_bandtype == BAND_ON_5G)
+-			if (ptcb_desc->rts_rate < DESC92_RATE6M)
+-				ptcb_desc->rts_rate = DESC92_RATE6M;
++			if (ptcb_desc->rts_rate < DESC_RATE6M)
++				ptcb_desc->rts_rate = DESC_RATE6M;
+ 		SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
+ 		SET_TX_DESC_RTS_BW(pdesc, 0);
+ 		SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
+ 		SET_TX_DESC_RTS_SHORT(pdesc, ((ptcb_desc->rts_rate <=
+-			DESC92_RATE54M) ?
++			DESC_RATE54M) ?
+ 			(ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
+ 			(ptcb_desc->rts_use_shortgi ? 1 : 0)));
+ 		if (bw_40) {
+@@ -755,9 +755,9 @@ void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw,
+ 	 * The braces are needed no matter what checkpatch says
+ 	 */
+ 	if (rtlhal->current_bandtype == BAND_ON_5G) {
+-		SET_TX_DESC_TX_RATE(pdesc, DESC92_RATE6M);
++		SET_TX_DESC_TX_RATE(pdesc, DESC_RATE6M);
+ 	} else {
+-		SET_TX_DESC_TX_RATE(pdesc, DESC92_RATE1M);
++		SET_TX_DESC_TX_RATE(pdesc, DESC_RATE1M);
+ 	}
+ 	SET_TX_DESC_SEQ(pdesc, 0);
+ 	SET_TX_DESC_LINIP(pdesc, 0);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
+index fb46fb9..3ea7367 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
+@@ -187,8 +187,8 @@ static void _rtl92ee_query_rxphystatus(struct ieee80211_hw *hw,
+ 		pstatus->recvsignalpower = rx_pwr_all;
+ 
+ 		/* (3)EVM of HT rate */
+-		if (pstatus->rate >= DESC92C_RATEMCS8 &&
+-		    pstatus->rate <= DESC92C_RATEMCS15)
++		if (pstatus->rate >= DESC_RATEMCS8 &&
++		    pstatus->rate <= DESC_RATEMCS15)
+ 			max_spatial_stream = 2;
+ 		else
+ 			max_spatial_stream = 1;
+@@ -742,13 +742,13 @@ void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
+ 		} else {
+ 			if (rtlpriv->ra.is_special_data) {
+ 				ptcb_desc->use_driver_rate = true;
+-				SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE11M);
++				SET_TX_DESC_TX_RATE(pdesc, DESC_RATE11M);
+ 			} else {
+ 				ptcb_desc->use_driver_rate = false;
+ 			}
+ 		}
+ 
+-		if (ptcb_desc->hw_rate > DESC92C_RATEMCS0)
++		if (ptcb_desc->hw_rate > DESC_RATEMCS0)
+ 			short_gi = (ptcb_desc->use_shortgi) ? 1 : 0;
+ 		else
+ 			short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0;
+@@ -768,7 +768,7 @@ void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
+ 		SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
+ 		SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
+ 		SET_TX_DESC_RTS_SHORT(pdesc,
+-				((ptcb_desc->rts_rate <= DESC92C_RATE54M) ?
++				((ptcb_desc->rts_rate <= DESC_RATE54M) ?
+ 				 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
+ 				 (ptcb_desc->rts_use_shortgi ? 1 : 0)));
+ 
+@@ -879,7 +879,7 @@ void rtl92ee_tx_fill_cmddesc(struct ieee80211_hw *hw,
+ 	if (firstseg)
+ 		SET_TX_DESC_OFFSET(pdesc, txdesc_len);
+ 
+-	SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE1M);
++	SET_TX_DESC_TX_RATE(pdesc, DESC_RATE1M);
+ 
+ 	SET_TX_DESC_SEQ(pdesc, 0);
+ 
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h
+index 6f9be1c..45fd9db 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h
+@@ -591,10 +591,10 @@ do {								\
+ } while (0)
+ 
+ #define RTL92EE_RX_HAL_IS_CCK_RATE(rxmcs)\
+-	(rxmcs == DESC92C_RATE1M ||\
+-	 rxmcs == DESC92C_RATE2M ||\
+-	 rxmcs == DESC92C_RATE5_5M ||\
+-	 rxmcs == DESC92C_RATE11M)
++	(rxmcs == DESC_RATE1M ||\
++	 rxmcs == DESC_RATE2M ||\
++	 rxmcs == DESC_RATE5_5M ||\
++	 rxmcs == DESC_RATE11M)
+ 
+ #define IS_LITTLE_ENDIAN	1
+ 
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/def.h b/drivers/net/wireless/rtlwifi/rtl8192se/def.h
+index 6e7a70b..ef87c09 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/def.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/def.h
+@@ -450,10 +450,10 @@
+ 	SHIFT_AND_MASK_LE(__pdesc + 24, 0, 32)
+ 
+ #define SE_RX_HAL_IS_CCK_RATE(_pdesc)\
+-	(GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC92_RATE1M ||	\
+-	 GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC92_RATE2M ||	\
+-	 GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC92_RATE5_5M ||\
+-	 GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC92_RATE11M)
++	(GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC_RATE1M ||	\
++	 GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC_RATE2M ||	\
++	 GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC_RATE5_5M ||\
++	 GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC_RATE11M)
+ 
+ enum rf_optype {
+ 	RF_OP_BY_SW_3WIRE = 0,
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
+index fb00386..e1fd27c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
+@@ -383,21 +383,21 @@ static struct rtl_hal_cfg rtl92se_hal_cfg = {
+ 	.maps[RTL_IMR_ROK] = IMR_ROK,
+ 	.maps[RTL_IBSS_INT_MASKS] = (IMR_BCNINT | IMR_TBDOK | IMR_TBDER),
+ 
+-	.maps[RTL_RC_CCK_RATE1M] = DESC92_RATE1M,
+-	.maps[RTL_RC_CCK_RATE2M] = DESC92_RATE2M,
+-	.maps[RTL_RC_CCK_RATE5_5M] = DESC92_RATE5_5M,
+-	.maps[RTL_RC_CCK_RATE11M] = DESC92_RATE11M,
+-	.maps[RTL_RC_OFDM_RATE6M] = DESC92_RATE6M,
+-	.maps[RTL_RC_OFDM_RATE9M] = DESC92_RATE9M,
+-	.maps[RTL_RC_OFDM_RATE12M] = DESC92_RATE12M,
+-	.maps[RTL_RC_OFDM_RATE18M] = DESC92_RATE18M,
+-	.maps[RTL_RC_OFDM_RATE24M] = DESC92_RATE24M,
+-	.maps[RTL_RC_OFDM_RATE36M] = DESC92_RATE36M,
+-	.maps[RTL_RC_OFDM_RATE48M] = DESC92_RATE48M,
+-	.maps[RTL_RC_OFDM_RATE54M] = DESC92_RATE54M,
+-
+-	.maps[RTL_RC_HT_RATEMCS7] = DESC92_RATEMCS7,
+-	.maps[RTL_RC_HT_RATEMCS15] = DESC92_RATEMCS15,
++	.maps[RTL_RC_CCK_RATE1M] = DESC_RATE1M,
++	.maps[RTL_RC_CCK_RATE2M] = DESC_RATE2M,
++	.maps[RTL_RC_CCK_RATE5_5M] = DESC_RATE5_5M,
++	.maps[RTL_RC_CCK_RATE11M] = DESC_RATE11M,
++	.maps[RTL_RC_OFDM_RATE6M] = DESC_RATE6M,
++	.maps[RTL_RC_OFDM_RATE9M] = DESC_RATE9M,
++	.maps[RTL_RC_OFDM_RATE12M] = DESC_RATE12M,
++	.maps[RTL_RC_OFDM_RATE18M] = DESC_RATE18M,
++	.maps[RTL_RC_OFDM_RATE24M] = DESC_RATE24M,
++	.maps[RTL_RC_OFDM_RATE36M] = DESC_RATE36M,
++	.maps[RTL_RC_OFDM_RATE48M] = DESC_RATE48M,
++	.maps[RTL_RC_OFDM_RATE54M] = DESC_RATE54M,
++
++	.maps[RTL_RC_HT_RATEMCS7] = DESC_RATEMCS7,
++	.maps[RTL_RC_HT_RATEMCS15] = DESC_RATEMCS15,
+ };
+ 
+ static struct pci_device_id rtl92se_pci_ids[] = {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+index da053cb..95eebff 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+@@ -191,8 +191,8 @@ static void _rtl92se_query_rxphystatus(struct ieee80211_hw *hw,
+ 		pstats->rxpower = rx_pwr_all;
+ 		pstats->recvsignalpower = rx_pwr_all;
+ 
+-		if (pstats->is_ht && pstats->rate >= DESC92_RATEMCS8 &&
+-		    pstats->rate <= DESC92_RATEMCS15)
++		if (pstats->is_ht && pstats->rate >= DESC_RATEMCS8 &&
++		    pstats->rate <= DESC_RATEMCS15)
+ 			max_spatial_stream = 2;
+ 		else
+ 			max_spatial_stream = 1;
+@@ -393,14 +393,14 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
+ 		SET_TX_DESC_RSVD_MACID(pdesc, reserved_macid);
+ 
+ 		SET_TX_DESC_TXHT(pdesc, ((ptcb_desc->hw_rate >=
+-				 DESC92_RATEMCS0) ? 1 : 0));
++				 DESC_RATEMCS0) ? 1 : 0));
+ 
+ 		if (rtlhal->version == VERSION_8192S_ACUT) {
+-			if (ptcb_desc->hw_rate == DESC92_RATE1M ||
+-			    ptcb_desc->hw_rate  == DESC92_RATE2M ||
+-			    ptcb_desc->hw_rate == DESC92_RATE5_5M ||
+-			    ptcb_desc->hw_rate == DESC92_RATE11M) {
+-				ptcb_desc->hw_rate = DESC92_RATE12M;
++			if (ptcb_desc->hw_rate == DESC_RATE1M ||
++			    ptcb_desc->hw_rate  == DESC_RATE2M ||
++			    ptcb_desc->hw_rate == DESC_RATE5_5M ||
++			    ptcb_desc->hw_rate == DESC_RATE11M) {
++				ptcb_desc->hw_rate = DESC_RATE12M;
+ 			}
+ 		}
+ 
+@@ -429,7 +429,7 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
+ 		SET_TX_DESC_RTS_BANDWIDTH(pdesc, 0);
+ 		SET_TX_DESC_RTS_SUB_CARRIER(pdesc, ptcb_desc->rts_sc);
+ 		SET_TX_DESC_RTS_SHORT(pdesc, ((ptcb_desc->rts_rate <=
+-		       DESC92_RATE54M) ?
++		       DESC_RATE54M) ?
+ 		       (ptcb_desc->rts_use_shortpreamble ? 1 : 0)
+ 		       : (ptcb_desc->rts_use_shortgi ? 1 : 0)));
+ 
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/def.h b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
+index a730985..53dc522 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
+@@ -374,37 +374,6 @@ enum rtl_desc_qsel {
+ };
+ 
+ enum rtl_desc8821ae_rate {
+-	DESC_RATE1M = 0x00,
+-	DESC_RATE2M = 0x01,
+-	DESC_RATE5_5M = 0x02,
+-	DESC_RATE11M = 0x03,
+-
+-	DESC_RATE6M = 0x04,
+-	DESC_RATE9M = 0x05,
+-	DESC_RATE12M = 0x06,
+-	DESC_RATE18M = 0x07,
+-	DESC_RATE24M = 0x08,
+-	DESC_RATE36M = 0x09,
+-	DESC_RATE48M = 0x0a,
+-	DESC_RATE54M = 0x0b,
+-
+-	DESC_RATEMCS0 = 0x0c,
+-	DESC_RATEMCS1 = 0x0d,
+-	DESC_RATEMCS2 = 0x0e,
+-	DESC_RATEMCS3 = 0x0f,
+-	DESC_RATEMCS4 = 0x10,
+-	DESC_RATEMCS5 = 0x11,
+-	DESC_RATEMCS6 = 0x12,
+-	DESC_RATEMCS7 = 0x13,
+-	DESC_RATEMCS8 = 0x14,
+-	DESC_RATEMCS9 = 0x15,
+-	DESC_RATEMCS10 = 0x16,
+-	DESC_RATEMCS11 = 0x17,
+-	DESC_RATEMCS12 = 0x18,
+-	DESC_RATEMCS13 = 0x19,
+-	DESC_RATEMCS14 = 0x1a,
+-	DESC_RATEMCS15 = 0x1b,
+-
+ 	DESC_RATEVHT1SS_MCS0 = 0x2c,
+ 	DESC_RATEVHT1SS_MCS1 = 0x2d,
+ 	DESC_RATEVHT1SS_MCS2 = 0x2e,
+diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
+index a233b26..26fd960 100644
+--- a/drivers/net/wireless/rtlwifi/wifi.h
++++ b/drivers/net/wireless/rtlwifi/wifi.h
+@@ -331,10 +331,10 @@ enum hardware_type {
+ (IS_HARDWARE_TYPE_8723E(rtlhal) || IS_HARDWARE_TYPE_8723U(rtlhal))
+ 
+ #define RX_HAL_IS_CCK_RATE(rxmcs)			\
+-	((rxmcs) == DESC92_RATE1M ||			\
+-	 (rxmcs) == DESC92_RATE2M ||			\
+-	 (rxmcs) == DESC92_RATE5_5M ||			\
+-	 (rxmcs) == DESC92_RATE11M)
++	((rxmcs) == DESC_RATE1M ||			\
++	 (rxmcs) == DESC_RATE2M ||			\
++	 (rxmcs) == DESC_RATE5_5M ||			\
++	 (rxmcs) == DESC_RATE11M)
+ 
+ enum scan_operation_backup_opt {
+ 	SCAN_OPT_BACKUP = 0,
+@@ -579,38 +579,38 @@ enum rtl_hal_state {
+ };
+ 
+ enum rtl_desc92_rate {
+-	DESC92_RATE1M = 0x00,
+-	DESC92_RATE2M = 0x01,
+-	DESC92_RATE5_5M = 0x02,
+-	DESC92_RATE11M = 0x03,
+-
+-	DESC92_RATE6M = 0x04,
+-	DESC92_RATE9M = 0x05,
+-	DESC92_RATE12M = 0x06,
+-	DESC92_RATE18M = 0x07,
+-	DESC92_RATE24M = 0x08,
+-	DESC92_RATE36M = 0x09,
+-	DESC92_RATE48M = 0x0a,
+-	DESC92_RATE54M = 0x0b,
+-
+-	DESC92_RATEMCS0 = 0x0c,
+-	DESC92_RATEMCS1 = 0x0d,
+-	DESC92_RATEMCS2 = 0x0e,
+-	DESC92_RATEMCS3 = 0x0f,
+-	DESC92_RATEMCS4 = 0x10,
+-	DESC92_RATEMCS5 = 0x11,
+-	DESC92_RATEMCS6 = 0x12,
+-	DESC92_RATEMCS7 = 0x13,
+-	DESC92_RATEMCS8 = 0x14,
+-	DESC92_RATEMCS9 = 0x15,
+-	DESC92_RATEMCS10 = 0x16,
+-	DESC92_RATEMCS11 = 0x17,
+-	DESC92_RATEMCS12 = 0x18,
+-	DESC92_RATEMCS13 = 0x19,
+-	DESC92_RATEMCS14 = 0x1a,
+-	DESC92_RATEMCS15 = 0x1b,
+-	DESC92_RATEMCS15_SG = 0x1c,
+-	DESC92_RATEMCS32 = 0x20,
++	DESC_RATE1M = 0x00,
++	DESC_RATE2M = 0x01,
++	DESC_RATE5_5M = 0x02,
++	DESC_RATE11M = 0x03,
++
++	DESC_RATE6M = 0x04,
++	DESC_RATE9M = 0x05,
++	DESC_RATE12M = 0x06,
++	DESC_RATE18M = 0x07,
++	DESC_RATE24M = 0x08,
++	DESC_RATE36M = 0x09,
++	DESC_RATE48M = 0x0a,
++	DESC_RATE54M = 0x0b,
++
++	DESC_RATEMCS0 = 0x0c,
++	DESC_RATEMCS1 = 0x0d,
++	DESC_RATEMCS2 = 0x0e,
++	DESC_RATEMCS3 = 0x0f,
++	DESC_RATEMCS4 = 0x10,
++	DESC_RATEMCS5 = 0x11,
++	DESC_RATEMCS6 = 0x12,
++	DESC_RATEMCS7 = 0x13,
++	DESC_RATEMCS8 = 0x14,
++	DESC_RATEMCS9 = 0x15,
++	DESC_RATEMCS10 = 0x16,
++	DESC_RATEMCS11 = 0x17,
++	DESC_RATEMCS12 = 0x18,
++	DESC_RATEMCS13 = 0x19,
++	DESC_RATEMCS14 = 0x1a,
++	DESC_RATEMCS15 = 0x1b,
++	DESC_RATEMCS15_SG = 0x1c,
++	DESC_RATEMCS32 = 0x20,
+ };
+ 
+ enum rtl_var_map {
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0030-rtlwifi-rtl8821ae-Add-VHT-rate-descriptors.patch b/package/kernel/mac80211/patches/680-0030-rtlwifi-rtl8821ae-Add-VHT-rate-descriptors.patch
new file mode 100644
index 0000000..bac0aec
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0030-rtlwifi-rtl8821ae-Add-VHT-rate-descriptors.patch
@@ -0,0 +1,85 @@
+From 5a0791d0f5511bac894bc753cc68705ed5dea2c4 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:37 -0600
+Subject: [PATCH 30/51] rtlwifi: rtl8821ae: Add VHT rate descriptors
+
+Device RTL8821AE is the first if the rtlwifi devices to implement 802.11ac
+capability. As a result, VHT rate descriptors are needed. In addition, the
+driver is converted to use the descriptors in rtlwifi.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8821ae/def.h | 23 -----------------------
+ drivers/net/wireless/rtlwifi/wifi.h          | 21 +++++++++++++++++++++
+ 2 files changed, 21 insertions(+), 23 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/def.h b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
+index 53dc522..ee7c208 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
+@@ -373,29 +373,6 @@ enum rtl_desc_qsel {
+ 	QSLT_CMD = 0x13,
+ };
+ 
+-enum rtl_desc8821ae_rate {
+-	DESC_RATEVHT1SS_MCS0 = 0x2c,
+-	DESC_RATEVHT1SS_MCS1 = 0x2d,
+-	DESC_RATEVHT1SS_MCS2 = 0x2e,
+-	DESC_RATEVHT1SS_MCS3 = 0x2f,
+-	DESC_RATEVHT1SS_MCS4 = 0x30,
+-	DESC_RATEVHT1SS_MCS5 = 0x31,
+-	DESC_RATEVHT1SS_MCS6 = 0x32,
+-	DESC_RATEVHT1SS_MCS7 = 0x33,
+-	DESC_RATEVHT1SS_MCS8 = 0x34,
+-	DESC_RATEVHT1SS_MCS9 = 0x35,
+-	DESC_RATEVHT2SS_MCS0 = 0x36,
+-	DESC_RATEVHT2SS_MCS1 = 0x37,
+-	DESC_RATEVHT2SS_MCS2 = 0x38,
+-	DESC_RATEVHT2SS_MCS3 = 0x39,
+-	DESC_RATEVHT2SS_MCS4 = 0x3a,
+-	DESC_RATEVHT2SS_MCS5 = 0x3b,
+-	DESC_RATEVHT2SS_MCS6 = 0x3c,
+-	DESC_RATEVHT2SS_MCS7 = 0x3d,
+-	DESC_RATEVHT2SS_MCS8 = 0x3e,
+-	DESC_RATEVHT2SS_MCS9 = 0x3f,
+-};
+-
+ enum rx_packet_type {
+ 	NORMAL_RX,
+ 	TX_REPORT1,
+diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
+index 26fd960..7a718fd 100644
+--- a/drivers/net/wireless/rtlwifi/wifi.h
++++ b/drivers/net/wireless/rtlwifi/wifi.h
+@@ -611,6 +611,27 @@ enum rtl_desc92_rate {
+ 	DESC_RATEMCS15 = 0x1b,
+ 	DESC_RATEMCS15_SG = 0x1c,
+ 	DESC_RATEMCS32 = 0x20,
++
++	DESC_RATEVHT1SS_MCS0 = 0x2c,
++	DESC_RATEVHT1SS_MCS1 = 0x2d,
++	DESC_RATEVHT1SS_MCS2 = 0x2e,
++	DESC_RATEVHT1SS_MCS3 = 0x2f,
++	DESC_RATEVHT1SS_MCS4 = 0x30,
++	DESC_RATEVHT1SS_MCS5 = 0x31,
++	DESC_RATEVHT1SS_MCS6 = 0x32,
++	DESC_RATEVHT1SS_MCS7 = 0x33,
++	DESC_RATEVHT1SS_MCS8 = 0x34,
++	DESC_RATEVHT1SS_MCS9 = 0x35,
++	DESC_RATEVHT2SS_MCS0 = 0x36,
++	DESC_RATEVHT2SS_MCS1 = 0x37,
++	DESC_RATEVHT2SS_MCS2 = 0x38,
++	DESC_RATEVHT2SS_MCS3 = 0x39,
++	DESC_RATEVHT2SS_MCS4 = 0x3a,
++	DESC_RATEVHT2SS_MCS5 = 0x3b,
++	DESC_RATEVHT2SS_MCS6 = 0x3c,
++	DESC_RATEVHT2SS_MCS7 = 0x3d,
++	DESC_RATEVHT2SS_MCS8 = 0x3e,
++	DESC_RATEVHT2SS_MCS9 = 0x3f,
+ };
+ 
+ enum rtl_var_map {
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0031-rtlwifi-rtl8192cu-Rework-calls-to-rate-control-routi.patch b/package/kernel/mac80211/patches/680-0031-rtlwifi-rtl8192cu-Rework-calls-to-rate-control-routi.patch
new file mode 100644
index 0000000..690e8df
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0031-rtlwifi-rtl8192cu-Rework-calls-to-rate-control-routi.patch
@@ -0,0 +1,62 @@
+From 6a7fd777078f02ba9c14fe1af4c4c3f3a5285a41 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:38 -0600
+Subject: [PATCH 31/51] rtlwifi: rtl8192cu: Rework calls to rate-control
+ routine
+
+The code uses macros to determine the parameters that are passed to the
+rate setting routine. A simpler method is implemented.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192cu/trx.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+index fe29876..5eccaba 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+@@ -325,6 +325,7 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
+ 				   && (GET_RX_DESC_FAGGR(pdesc) == 1));
+ 	stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
+ 	stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
++	stats->is_ht = (bool)GET_RX_DESC_RX_HT(pdesc);
+ 	rx_status->freq = hw->conf.chandef.chan->center_freq;
+ 	rx_status->band = hw->conf.chandef.chan->band;
+ 	if (GET_RX_DESC_CRC32(pdesc))
+@@ -338,9 +339,8 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
+ 	rx_status->flag |= RX_FLAG_MACTIME_START;
+ 	if (stats->decrypted)
+ 		rx_status->flag |= RX_FLAG_DECRYPTED;
+-	rx_status->rate_idx = rtlwifi_rate_mapping(hw,
+-					(bool)GET_RX_DESC_RX_HT(pdesc),
+-					(u8)GET_RX_DESC_RX_MCS(pdesc));
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
++						   stats->rate);
+ 	rx_status->mactime = GET_RX_DESC_TSFL(pdesc);
+ 	if (phystatus) {
+ 		p_drvinfo = (struct rx_fwinfo_92c *)(skb->data +
+@@ -392,6 +392,7 @@ static void _rtl_rx_process(struct ieee80211_hw *hw, struct sk_buff *skb)
+ 				   && (GET_RX_DESC_FAGGR(rxdesc) == 1));
+ 	stats.timestamp_low = GET_RX_DESC_TSFL(rxdesc);
+ 	stats.rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(rxdesc);
++	stats.is_ht = (bool)GET_RX_DESC_RX_HT(rxdesc);
+ 	/* TODO: is center_freq changed when doing scan? */
+ 	/* TODO: Shall we add protection or just skip those two step? */
+ 	rx_status->freq = hw->conf.chandef.chan->center_freq;
+@@ -405,9 +406,8 @@ static void _rtl_rx_process(struct ieee80211_hw *hw, struct sk_buff *skb)
+ 	if (GET_RX_DESC_RX_HT(rxdesc))
+ 		rx_status->flag |= RX_FLAG_HT;
+ 	/* Data rate */
+-	rx_status->rate_idx = rtlwifi_rate_mapping(hw,
+-					(bool)GET_RX_DESC_RX_HT(rxdesc),
+-					(u8)GET_RX_DESC_RX_MCS(rxdesc));
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats.is_ht,
++						   stats.rate);
+ 	/*  There is a phy status after this rx descriptor. */
+ 	if (GET_RX_DESC_PHY_STATUS(rxdesc)) {
+ 		p_drvinfo = (struct rx_fwinfo_92c *)(rxdesc + RTL_RX_DESC_SIZE);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0032-rtlwifi-rtl8192de-Rework-calls-to-rate-control-routi.patch b/package/kernel/mac80211/patches/680-0032-rtlwifi-rtl8192de-Rework-calls-to-rate-control-routi.patch
new file mode 100644
index 0000000..1e2eba4
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0032-rtlwifi-rtl8192de-Rework-calls-to-rate-control-routi.patch
@@ -0,0 +1,42 @@
+From a160ba06c1bde5e0609f7ac475a9650224337933 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:39 -0600
+Subject: [PATCH 32/51] rtlwifi: rtl8192de: Rework calls to rate-control
+ routine
+
+The code uses macros to determine the parameters that are passed to the
+rate setting routine. A simpler method is implemented.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192de/trx.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+index 381a4c0..547c6d0 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+@@ -499,6 +499,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,	struct rtl_stats *stats,
+ 					 && (GET_RX_DESC_FAGGR(pdesc) == 1));
+ 	stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
+ 	stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
++	stats->is_ht = (bool)GET_RX_DESC_RXHT(pdesc);
+ 	rx_status->freq = hw->conf.chandef.chan->center_freq;
+ 	rx_status->band = hw->conf.chandef.chan->band;
+ 	if (GET_RX_DESC_CRC32(pdesc))
+@@ -512,9 +513,8 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,	struct rtl_stats *stats,
+ 	rx_status->flag |= RX_FLAG_MACTIME_START;
+ 	if (stats->decrypted)
+ 		rx_status->flag |= RX_FLAG_DECRYPTED;
+-	rx_status->rate_idx = rtlwifi_rate_mapping(hw,
+-					(bool)GET_RX_DESC_RXHT(pdesc),
+-					(u8)GET_RX_DESC_RXMCS(pdesc));
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
++						   stats->rate);
+ 	rx_status->mactime = GET_RX_DESC_TSFL(pdesc);
+ 	if (phystatus) {
+ 		p_drvinfo = (struct rx_fwinfo_92d *)(skb->data +
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0033-rtlwifi-rtl8821ae-Switch-to-use-common-rate-control-.patch b/package/kernel/mac80211/patches/680-0033-rtlwifi-rtl8821ae-Switch-to-use-common-rate-control-.patch
new file mode 100644
index 0000000..20040d7
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0033-rtlwifi-rtl8821ae-Switch-to-use-common-rate-control-.patch
@@ -0,0 +1,498 @@
+From fd3cb22ad87fd53eb47dc64fd0cafd665d4124a1 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Thu, 18 Dec 2014 03:05:40 -0600
+Subject: [PATCH 33/51] rtlwifi: rtl8821ae: Switch to use common rate control
+ routine
+
+With this change, all of the drivers now use the common routine. As this
+driver has VHT capability, an additional parameter is needed, thus all the
+drivers had to be modified.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/base.c          |  76 ++++++++-
+ drivers/net/wireless/rtlwifi/base.h          |   4 +-
+ drivers/net/wireless/rtlwifi/rtl8188ee/trx.c |   2 +-
+ drivers/net/wireless/rtlwifi/rtl8192ce/trx.c |   2 +-
+ drivers/net/wireless/rtlwifi/rtl8192cu/trx.c |   4 +-
+ drivers/net/wireless/rtlwifi/rtl8192de/trx.c |   2 +-
+ drivers/net/wireless/rtlwifi/rtl8192ee/trx.c |   2 +-
+ drivers/net/wireless/rtlwifi/rtl8192se/trx.c |   2 +-
+ drivers/net/wireless/rtlwifi/rtl8723ae/trx.c |   2 +-
+ drivers/net/wireless/rtlwifi/rtl8723be/trx.c |   2 +-
+ drivers/net/wireless/rtlwifi/rtl8821ae/trx.c | 232 +--------------------------
+ 11 files changed, 88 insertions(+), 242 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
+index 23fc51e..1d46774 100644
+--- a/drivers/net/wireless/rtlwifi/base.c
++++ b/drivers/net/wireless/rtlwifi/base.c
+@@ -881,12 +881,84 @@ static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw,
+  * N rate:
+  * (rx_status->flag & RX_FLAG_HT) = 1,
+  * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
++ *
++ * VHT rates:
++ * DESC_RATEVHT1SS_MCS0-->DESC_RATEVHT1SS_MCS9 ==> idx is 0-->9
++ * DESC_RATEVHT2SS_MCS0-->DESC_RATEVHT2SS_MCS9 ==> idx is 0-->9
+  */
+-int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+-			 bool isht, u8 desc_rate)
++int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht, bool isvht,
++			 u8 desc_rate)
+ {
+ 	int rate_idx;
+ 
++	if (isvht) {
++		switch (desc_rate) {
++		case DESC_RATEVHT1SS_MCS0:
++			rate_idx = 0;
++			break;
++		case DESC_RATEVHT1SS_MCS1:
++			rate_idx = 1;
++			break;
++		case DESC_RATEVHT1SS_MCS2:
++			rate_idx = 2;
++			break;
++		case DESC_RATEVHT1SS_MCS3:
++			rate_idx = 3;
++			break;
++		case DESC_RATEVHT1SS_MCS4:
++			rate_idx = 4;
++			break;
++		case DESC_RATEVHT1SS_MCS5:
++			rate_idx = 5;
++			break;
++		case DESC_RATEVHT1SS_MCS6:
++			rate_idx = 6;
++			break;
++		case DESC_RATEVHT1SS_MCS7:
++			rate_idx = 7;
++			break;
++		case DESC_RATEVHT1SS_MCS8:
++			rate_idx = 8;
++			break;
++		case DESC_RATEVHT1SS_MCS9:
++			rate_idx = 9;
++			break;
++		case DESC_RATEVHT2SS_MCS0:
++			rate_idx = 0;
++			break;
++		case DESC_RATEVHT2SS_MCS1:
++			rate_idx = 1;
++			break;
++		case DESC_RATEVHT2SS_MCS2:
++			rate_idx = 2;
++			break;
++		case DESC_RATEVHT2SS_MCS3:
++			rate_idx = 3;
++			break;
++		case DESC_RATEVHT2SS_MCS4:
++			rate_idx = 4;
++			break;
++		case DESC_RATEVHT2SS_MCS5:
++			rate_idx = 5;
++			break;
++		case DESC_RATEVHT2SS_MCS6:
++			rate_idx = 6;
++			break;
++		case DESC_RATEVHT2SS_MCS7:
++			rate_idx = 7;
++			break;
++		case DESC_RATEVHT2SS_MCS8:
++			rate_idx = 8;
++			break;
++		case DESC_RATEVHT2SS_MCS9:
++			rate_idx = 9;
++			break;
++		default:
++			rate_idx = 0;
++			break;
++		}
++		return rate_idx;
++	}
+ 	if (false == isht) {
+ 		if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
+ 			switch (desc_rate) {
+diff --git a/drivers/net/wireless/rtlwifi/base.h b/drivers/net/wireless/rtlwifi/base.h
+index 936c2bb..c6cb49c 100644
+--- a/drivers/net/wireless/rtlwifi/base.h
++++ b/drivers/net/wireless/rtlwifi/base.h
+@@ -123,8 +123,8 @@ void rtl_watch_dog_timer_callback(unsigned long data);
+ void rtl_deinit_deferred_work(struct ieee80211_hw *hw);
+ 
+ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
+-int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
+-			 bool isht, u8 desc_rate);
++int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht,
++			 bool isvht, u8 desc_rate);
+ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
+ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
+ 
+diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
+index d430884..791efbe 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
+@@ -473,7 +473,7 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * Notice: this is diff with windows define
+ 	 */
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
+-						   status->rate);
++						   false, status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+ 	if (phystatus == true) {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+index 685faea..84ddd4d 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+@@ -401,7 +401,7 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * Notice: this is diff with windows define
+ 	 */
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
+-						   stats->rate);
++						   false, stats->rate);
+ 
+ 	rx_status->mactime = stats->timestamp_low;
+ 	if (phystatus) {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+index 5eccaba..cbead00 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+@@ -340,7 +340,7 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
+ 	if (stats->decrypted)
+ 		rx_status->flag |= RX_FLAG_DECRYPTED;
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
+-						   stats->rate);
++						   false, stats->rate);
+ 	rx_status->mactime = GET_RX_DESC_TSFL(pdesc);
+ 	if (phystatus) {
+ 		p_drvinfo = (struct rx_fwinfo_92c *)(skb->data +
+@@ -407,7 +407,7 @@ static void _rtl_rx_process(struct ieee80211_hw *hw, struct sk_buff *skb)
+ 		rx_status->flag |= RX_FLAG_HT;
+ 	/* Data rate */
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats.is_ht,
+-						   stats.rate);
++						   false, stats.rate);
+ 	/*  There is a phy status after this rx descriptor. */
+ 	if (GET_RX_DESC_PHY_STATUS(rxdesc)) {
+ 		p_drvinfo = (struct rx_fwinfo_92c *)(rxdesc + RTL_RX_DESC_SIZE);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+index 547c6d0..1feaa62 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+@@ -514,7 +514,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,	struct rtl_stats *stats,
+ 	if (stats->decrypted)
+ 		rx_status->flag |= RX_FLAG_DECRYPTED;
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
+-						   stats->rate);
++						   false, stats->rate);
+ 	rx_status->mactime = GET_RX_DESC_TSFL(pdesc);
+ 	if (phystatus) {
+ 		p_drvinfo = (struct rx_fwinfo_92d *)(skb->data +
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
+index 3ea7367..51806ac 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
+@@ -419,7 +419,7 @@ bool rtl92ee_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * Notice: this is diff with windows define
+ 	 */
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
+-						   status->rate);
++						   false, status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+ 	if (phystatus) {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+index 95eebff..125b29b 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+@@ -319,7 +319,7 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
+ 	}
+ 
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
+-						   stats->rate);
++						   false, stats->rate);
+ 
+ 	rx_status->mactime = stats->timestamp_low;
+ 	if (phystatus) {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
+index 662a094..2f7c144 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
+@@ -346,7 +346,7 @@ bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * Notice: this is diff with windows define
+ 	 */
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
+-						   status->rate);
++						   false, status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+ 	if (phystatus == true) {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/trx.c b/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
+index cb23bed..338ec9a 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
+@@ -401,7 +401,7 @@ bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * are use (RX_FLAG_HT)
+ 	 */
+ 	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
+-						      status->rate);
++						   false, status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+ 	if (phystatus) {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
+index 383b86b..72af4b9 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
+@@ -48,232 +48,6 @@ static u8 _rtl8821ae_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
+ 	return skb->priority;
+ }
+ 
+-/* mac80211's rate_idx is like this:
+- *
+- * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
+- *
+- * B/G rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC_RATE1M-->DESC_RATE54M ==> idx is 0-->11,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
+- *
+- * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
+- * A rate:
+- * (rx_status->flag & RX_FLAG_HT) = 0,
+- * DESC_RATE6M-->DESC_RATE54M ==> idx is 0-->7,
+- *
+- * N rate:
+- * (rx_status->flag & RX_FLAG_HT) = 1,
+- * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
+- */
+-static int _rtl8821ae_rate_mapping(struct ieee80211_hw *hw,
+-				   bool isht, bool isvht, u8 desc_rate)
+-{
+-	int rate_idx;
+-
+-	if (!isht) {
+-		if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
+-			switch (desc_rate) {
+-			case DESC_RATE1M:
+-				rate_idx = 0;
+-				break;
+-			case DESC_RATE2M:
+-				rate_idx = 1;
+-				break;
+-			case DESC_RATE5_5M:
+-				rate_idx = 2;
+-				break;
+-			case DESC_RATE11M:
+-				rate_idx = 3;
+-				break;
+-			case DESC_RATE6M:
+-				rate_idx = 4;
+-				break;
+-			case DESC_RATE9M:
+-				rate_idx = 5;
+-				break;
+-			case DESC_RATE12M:
+-				rate_idx = 6;
+-				break;
+-			case DESC_RATE18M:
+-				rate_idx = 7;
+-				break;
+-			case DESC_RATE24M:
+-				rate_idx = 8;
+-				break;
+-			case DESC_RATE36M:
+-				rate_idx = 9;
+-				break;
+-			case DESC_RATE48M:
+-				rate_idx = 10;
+-				break;
+-			case DESC_RATE54M:
+-				rate_idx = 11;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		} else {
+-			switch (desc_rate) {
+-			case DESC_RATE6M:
+-				rate_idx = 0;
+-				break;
+-			case DESC_RATE9M:
+-				rate_idx = 1;
+-				break;
+-			case DESC_RATE12M:
+-				rate_idx = 2;
+-				break;
+-			case DESC_RATE18M:
+-				rate_idx = 3;
+-				break;
+-			case DESC_RATE24M:
+-				rate_idx = 4;
+-				break;
+-			case DESC_RATE36M:
+-				rate_idx = 5;
+-				break;
+-			case DESC_RATE48M:
+-				rate_idx = 6;
+-				break;
+-			case DESC_RATE54M:
+-				rate_idx = 7;
+-				break;
+-			default:
+-				rate_idx = 0;
+-				break;
+-			}
+-		}
+-	} else {
+-		switch (desc_rate) {
+-		case DESC_RATEMCS0:
+-			rate_idx = 0;
+-			break;
+-		case DESC_RATEMCS1:
+-			rate_idx = 1;
+-			break;
+-		case DESC_RATEMCS2:
+-			rate_idx = 2;
+-			break;
+-		case DESC_RATEMCS3:
+-			rate_idx = 3;
+-			break;
+-		case DESC_RATEMCS4:
+-			rate_idx = 4;
+-			break;
+-		case DESC_RATEMCS5:
+-			rate_idx = 5;
+-			break;
+-		case DESC_RATEMCS6:
+-			rate_idx = 6;
+-			break;
+-		case DESC_RATEMCS7:
+-			rate_idx = 7;
+-			break;
+-		case DESC_RATEMCS8:
+-			rate_idx = 8;
+-			break;
+-		case DESC_RATEMCS9:
+-			rate_idx = 9;
+-			break;
+-		case DESC_RATEMCS10:
+-			rate_idx = 10;
+-			break;
+-		case DESC_RATEMCS11:
+-			rate_idx = 11;
+-			break;
+-		case DESC_RATEMCS12:
+-			rate_idx = 12;
+-			break;
+-		case DESC_RATEMCS13:
+-			rate_idx = 13;
+-			break;
+-		case DESC_RATEMCS14:
+-			rate_idx = 14;
+-			break;
+-		case DESC_RATEMCS15:
+-			rate_idx = 15;
+-			break;
+-		default:
+-			rate_idx = 0;
+-			break;
+-		}
+-	}
+-
+-	if (isvht) {
+-		switch (desc_rate) {
+-		case DESC_RATEVHT1SS_MCS0:
+-			rate_idx = 0;
+-			break;
+-		case DESC_RATEVHT1SS_MCS1:
+-			rate_idx = 1;
+-			break;
+-		case DESC_RATEVHT1SS_MCS2:
+-			rate_idx = 2;
+-			break;
+-		case DESC_RATEVHT1SS_MCS3:
+-			rate_idx = 3;
+-			break;
+-		case DESC_RATEVHT1SS_MCS4:
+-			rate_idx = 4;
+-			break;
+-		case DESC_RATEVHT1SS_MCS5:
+-			rate_idx = 5;
+-			break;
+-		case DESC_RATEVHT1SS_MCS6:
+-			rate_idx = 6;
+-			break;
+-		case DESC_RATEVHT1SS_MCS7:
+-			rate_idx = 7;
+-			break;
+-		case DESC_RATEVHT1SS_MCS8:
+-			rate_idx = 8;
+-			break;
+-		case DESC_RATEVHT1SS_MCS9:
+-			rate_idx = 9;
+-			break;
+-		case DESC_RATEVHT2SS_MCS0:
+-			rate_idx = 0;
+-			break;
+-		case DESC_RATEVHT2SS_MCS1:
+-			rate_idx = 1;
+-			break;
+-		case DESC_RATEVHT2SS_MCS2:
+-			rate_idx = 2;
+-			break;
+-		case DESC_RATEVHT2SS_MCS3:
+-			rate_idx = 3;
+-			break;
+-		case DESC_RATEVHT2SS_MCS4:
+-			rate_idx = 4;
+-			break;
+-		case DESC_RATEVHT2SS_MCS5:
+-			rate_idx = 5;
+-			break;
+-		case DESC_RATEVHT2SS_MCS6:
+-			rate_idx = 6;
+-			break;
+-		case DESC_RATEVHT2SS_MCS7:
+-			rate_idx = 7;
+-			break;
+-		case DESC_RATEVHT2SS_MCS8:
+-			rate_idx = 8;
+-			break;
+-		case DESC_RATEVHT2SS_MCS9:
+-			rate_idx = 9;
+-			break;
+-		default:
+-			rate_idx = 0;
+-			break;
+-		}
+-	}
+-	return rate_idx;
+-}
+-
+ static u16 odm_cfo(char value)
+ {
+ 	int ret_val;
+@@ -766,9 +540,9 @@ bool rtl8821ae_rx_query_desc(struct ieee80211_hw *hw,
+ 	 * supported rates or MCS index if HT rates
+ 	 * are use (RX_FLAG_HT)
+ 	 */
+-	rx_status->rate_idx =
+-	  _rtl8821ae_rate_mapping(hw, status->is_ht,
+-				  status->is_vht, status->rate);
++	rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
++						   status->is_vht,
++						   status->rate);
+ 
+ 	rx_status->mactime = status->timestamp_low;
+ 	if (phystatus) {
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0034-rtlwifi-rtl8192ee-trx.c-Remove-unused-function.patch b/package/kernel/mac80211/patches/680-0034-rtlwifi-rtl8192ee-trx.c-Remove-unused-function.patch
new file mode 100644
index 0000000..3050a93
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0034-rtlwifi-rtl8192ee-trx.c-Remove-unused-function.patch
@@ -0,0 +1,64 @@
+From 9898b77536b8569be2704964d3c519ef070e4a27 Mon Sep 17 00:00:00 2001
+From: Rickard Strandqvist <rickard_strandqvist at spectrumdigital.se>
+Date: Sat, 20 Dec 2014 13:48:14 +0100
+Subject: [PATCH 34/51] rtlwifi: rtl8192ee: trx.c: Remove unused function
+
+Remove the function rtl92ee_get_available_desc() that is not used anywhere.
+
+This was partially found by using a static code analysis program called cppcheck.
+
+Signed-off-by: Rickard Strandqvist <rickard_strandqvist at spectrumdigital.se>
+Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ee/trx.c | 21 ---------------------
+ drivers/net/wireless/rtlwifi/rtl8192ee/trx.h |  1 -
+ 2 files changed, 22 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
+index 51806ac..55d1da5 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
+@@ -551,27 +551,6 @@ static u16 get_desc_addr_fr_q_idx(u16 queue_index)
+ 	return desc_address;
+ }
+ 
+-void rtl92ee_get_available_desc(struct ieee80211_hw *hw, u8 q_idx)
+-{
+-	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	u16 point_diff = 0;
+-	u16 current_tx_read_point = 0, current_tx_write_point = 0;
+-	u32 tmp_4byte;
+-
+-	tmp_4byte = rtl_read_dword(rtlpriv,
+-				   get_desc_addr_fr_q_idx(q_idx));
+-	current_tx_read_point = (u16)((tmp_4byte >> 16) & 0x0fff);
+-	current_tx_write_point = (u16)((tmp_4byte) & 0x0fff);
+-
+-	point_diff = ((current_tx_read_point > current_tx_write_point) ?
+-		      (current_tx_read_point - current_tx_write_point) :
+-		      (TX_DESC_NUM_92E - current_tx_write_point +
+-		       current_tx_read_point));
+-
+-	rtlpci->tx_ring[q_idx].avl_desc = point_diff;
+-}
+-
+ void rtl92ee_pre_fill_tx_bd_desc(struct ieee80211_hw *hw,
+ 				 u8 *tx_bd_desc, u8 *desc, u8 queue_index,
+ 				 struct sk_buff *skb, dma_addr_t addr)
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h
+index 45fd9db..48504c2 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h
+@@ -829,7 +829,6 @@ void rtl92ee_rx_check_dma_ok(struct ieee80211_hw *hw, u8 *header_desc,
+ 			     u8 queue_index);
+ u16	rtl92ee_rx_desc_buff_remained_cnt(struct ieee80211_hw *hw,
+ 					  u8 queue_index);
+-void rtl92ee_get_available_desc(struct ieee80211_hw *hw, u8 queue_index);
+ void rtl92ee_pre_fill_tx_bd_desc(struct ieee80211_hw *hw,
+ 				 u8 *tx_bd_desc, u8 *desc, u8 queue_index,
+ 				 struct sk_buff *skb, dma_addr_t addr);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0035-rtlwifi-rtl8723be-phy.c-Remove-unused-function.patch b/package/kernel/mac80211/patches/680-0035-rtlwifi-rtl8723be-phy.c-Remove-unused-function.patch
new file mode 100644
index 0000000..4d5b1a4
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0035-rtlwifi-rtl8723be-phy.c-Remove-unused-function.patch
@@ -0,0 +1,69 @@
+From b30b2e0f3dbcde630b911bdc8fda8ae8300fff6a Mon Sep 17 00:00:00 2001
+From: Rickard Strandqvist <rickard_strandqvist at spectrumdigital.se>
+Date: Sat, 20 Dec 2014 23:59:18 +0100
+Subject: [PATCH 35/51] rtlwifi: rtl8723be: phy.c: Remove unused function
+
+Remove the function rtl8723be_phy_get_txpower_level() that is not used anywhere.
+
+This was partially found by using a static code analysis program called cppcheck.
+
+Signed-off-by: Rickard Strandqvist <rickard_strandqvist at spectrumdigital.se>
+Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8723be/phy.c | 25 -------------------------
+ drivers/net/wireless/rtlwifi/rtl8723be/phy.h |  2 --
+ 2 files changed, 27 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/phy.c b/drivers/net/wireless/rtlwifi/rtl8723be/phy.c
+index 20dcc25..b7b73cb 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/phy.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/phy.c
+@@ -874,31 +874,6 @@ void rtl8723be_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
+ 		  ROFDM0_RXDETECTOR3, rtlphy->framesync);
+ }
+ 
+-void rtl8723be_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	struct rtl_phy *rtlphy = &rtlpriv->phy;
+-	u8 txpwr_level;
+-	long txpwr_dbm;
+-
+-	txpwr_level = rtlphy->cur_cck_txpwridx;
+-	txpwr_dbm = rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B,
+-						 txpwr_level);
+-	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
+-	if (rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, txpwr_level) >
+-	    txpwr_dbm)
+-		txpwr_dbm =
+-		    rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
+-						 txpwr_level);
+-	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
+-	if (rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
+-					 txpwr_level) > txpwr_dbm)
+-		txpwr_dbm =
+-		    rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
+-						 txpwr_level);
+-	*powerlevel = txpwr_dbm;
+-}
+-
+ static u8 _rtl8723be_phy_get_ratesection_intxpower_byrate(enum radio_path path,
+ 							  u8 rate)
+ {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/phy.h b/drivers/net/wireless/rtlwifi/rtl8723be/phy.h
+index 6339738..9021d47 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/phy.h
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/phy.h
+@@ -114,8 +114,6 @@ bool rtl8723be_phy_mac_config(struct ieee80211_hw *hw);
+ bool rtl8723be_phy_bb_config(struct ieee80211_hw *hw);
+ bool rtl8723be_phy_rf_config(struct ieee80211_hw *hw);
+ void rtl8723be_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
+-void rtl8723be_phy_get_txpower_level(struct ieee80211_hw *hw,
+-				     long *powerlevel);
+ void rtl8723be_phy_set_txpower_level(struct ieee80211_hw *hw,
+ 				     u8 channel);
+ void rtl8723be_phy_scan_operation_backup(struct ieee80211_hw *hw,
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0036-rtlwifi-Fix-error-when-accessing-unmapped-memory-in-.patch b/package/kernel/mac80211/patches/680-0036-rtlwifi-Fix-error-when-accessing-unmapped-memory-in-.patch
new file mode 100644
index 0000000..59bdbfe
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0036-rtlwifi-Fix-error-when-accessing-unmapped-memory-in-.patch
@@ -0,0 +1,126 @@
+From e9538cf4f90713eca71b1d6a74b4eae1d445c664 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 30 Dec 2014 21:33:07 -0600
+Subject: [PATCH 36/51] rtlwifi: Fix error when accessing unmapped memory in
+ skb
+
+These drivers use 9100-byte receive buffers, thus allocating an skb requires
+an O(3) memory allocation. Under heavy memory loads and fragmentation, such
+a request can fail. Previous versions of the driver have dropped the packet
+and reused the old buffer; however, the new version introduced a bug in that
+it released the old buffer before trying to allocate a new one. The previous
+method is implemented here. The skb is unmapped before any attempt is made to
+allocate another.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Cc: Stable <stable at vger.kernel.org>  [v3.18]
+Reported-by: Eric Biggers <ebiggers3 at gmail.com>
+Cc: Eric Biggers <ebiggers3 at gmail.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/pci.c | 32 ++++++++++++++++++++++++--------
+ 1 file changed, 24 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
+index 846a2e6..c70efb9 100644
+--- a/drivers/net/wireless/rtlwifi/pci.c
++++ b/drivers/net/wireless/rtlwifi/pci.c
+@@ -666,7 +666,8 @@ tx_status_ok:
+ }
+ 
+ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
+-				    u8 *entry, int rxring_idx, int desc_idx)
++				    struct sk_buff *new_skb, u8 *entry,
++				    int rxring_idx, int desc_idx)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+ 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
+@@ -674,11 +675,15 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
+ 	u8 tmp_one = 1;
+ 	struct sk_buff *skb;
+ 
++	if (likely(new_skb)) {
++		skb = new_skb;
++		goto remap;
++	}
+ 	skb = dev_alloc_skb(rtlpci->rxbuffersize);
+ 	if (!skb)
+ 		return 0;
+-	rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
+ 
++remap:
+ 	/* just set skb->cb to mapping addr for pci_unmap_single use */
+ 	*((dma_addr_t *)skb->cb) =
+ 		pci_map_single(rtlpci->pdev, skb_tail_pointer(skb),
+@@ -686,6 +691,7 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
+ 	bufferaddress = *((dma_addr_t *)skb->cb);
+ 	if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
+ 		return 0;
++	rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
+ 	if (rtlpriv->use_new_trx_flow) {
+ 		rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
+ 					    HW_DESC_RX_PREPARE,
+@@ -781,6 +787,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
+ 		/*rx pkt */
+ 		struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[
+ 				      rtlpci->rx_ring[rxring_idx].idx];
++		struct sk_buff *new_skb;
+ 
+ 		if (rtlpriv->use_new_trx_flow) {
+ 			rx_remained_cnt =
+@@ -807,6 +814,13 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
+ 		pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb),
+ 				 rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
+ 
++		/* get a new skb - if fail, old one will be reused */
++		new_skb = dev_alloc_skb(rtlpci->rxbuffersize);
++		if (unlikely(!new_skb)) {
++			pr_err("Allocation of new skb failed in %s\n",
++			       __func__);
++			goto no_new;
++		}
+ 		if (rtlpriv->use_new_trx_flow) {
+ 			buffer_desc =
+ 			  &rtlpci->rx_ring[rxring_idx].buffer_desc
+@@ -911,14 +925,16 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
+ 			schedule_work(&rtlpriv->works.lps_change_work);
+ 		}
+ end:
++		skb = new_skb;
++no_new:
+ 		if (rtlpriv->use_new_trx_flow) {
+-			_rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc,
++			_rtl_pci_init_one_rxdesc(hw, skb, (u8 *)buffer_desc,
+ 						 rxring_idx,
+-					       rtlpci->rx_ring[rxring_idx].idx);
++						 rtlpci->rx_ring[rxring_idx].idx);
+ 		} else {
+-			_rtl_pci_init_one_rxdesc(hw, (u8 *)pdesc, rxring_idx,
++			_rtl_pci_init_one_rxdesc(hw, skb, (u8 *)pdesc,
++						 rxring_idx,
+ 						 rtlpci->rx_ring[rxring_idx].idx);
+-
+ 			if (rtlpci->rx_ring[rxring_idx].idx ==
+ 			    rtlpci->rxringcount - 1)
+ 				rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc,
+@@ -1307,7 +1323,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
+ 		rtlpci->rx_ring[rxring_idx].idx = 0;
+ 		for (i = 0; i < rtlpci->rxringcount; i++) {
+ 			entry = &rtlpci->rx_ring[rxring_idx].buffer_desc[i];
+-			if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
++			if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry,
+ 						      rxring_idx, i))
+ 				return -ENOMEM;
+ 		}
+@@ -1332,7 +1348,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
+ 
+ 		for (i = 0; i < rtlpci->rxringcount; i++) {
+ 			entry = &rtlpci->rx_ring[rxring_idx].desc[i];
+-			if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
++			if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry,
+ 						      rxring_idx, i))
+ 				return -ENOMEM;
+ 		}
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0037-rtlwifi-Unify-variable-naming-for-all-drivers.patch b/package/kernel/mac80211/patches/680-0037-rtlwifi-Unify-variable-naming-for-all-drivers.patch
new file mode 100644
index 0000000..107aa0a
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0037-rtlwifi-Unify-variable-naming-for-all-drivers.patch
@@ -0,0 +1,300 @@
+From 1f6969fb230b79debcdf8ec3614162b553664396 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:02 -0600
+Subject: [PATCH 37/51] rtlwifi: Unify variable naming for all drivers
+
+Some drivers refer to a particular quantity in the driver's private
+are by one name, while others use a different name. These differences
+are removed.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c |  2 +-
+ drivers/net/wireless/rtlwifi/rtl8192ee/dm.c       | 26 ++++++++++----------
+ drivers/net/wireless/rtlwifi/rtl8723be/dm.c       | 26 ++++++++++----------
+ drivers/net/wireless/rtlwifi/rtl8821ae/dm.c       | 30 +++++++++++------------
+ drivers/net/wireless/rtlwifi/wifi.h               |  2 --
+ 5 files changed, 42 insertions(+), 44 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+index f6cb5ae..c3aad76 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+@@ -221,7 +221,7 @@ static void rtl92c_dm_diginit(struct ieee80211_hw *hw)
+ 	dm_digtable->forbidden_igi = DM_DIG_MIN;
+ 	dm_digtable->large_fa_hit = 0;
+ 	dm_digtable->recover_cnt = 0;
+-	dm_digtable->dig_dynamic_min  = 0x25;
++	dm_digtable->dig_min_0  = 0x25;
+ }
+ 
+ static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
+index 77deedf..2fa4c45 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
+@@ -172,8 +172,8 @@ static void rtl92ee_dm_diginit(struct ieee80211_hw *hw)
+ 	dm_dig->forbidden_igi = DM_DIG_MIN;
+ 	dm_dig->large_fa_hit = 0;
+ 	dm_dig->recover_cnt = 0;
+-	dm_dig->dig_dynamic_min = DM_DIG_MIN;
+-	dm_dig->dig_dynamic_min_1 = DM_DIG_MIN;
++	dm_dig->dig_min_0 = DM_DIG_MIN;
++	dm_dig->dig_min_1 = DM_DIG_MIN;
+ 	dm_dig->media_connect_0 = false;
+ 	dm_dig->media_connect_1 = false;
+ 	rtlpriv->dm.dm_initialgain_enable = true;
+@@ -298,7 +298,7 @@ static void rtl92ee_dm_dig(struct ieee80211_hw *hw)
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+ 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
+ 	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
+-	u8 dig_dynamic_min , dig_maxofmin;
++	u8 dig_min_0, dig_maxofmin;
+ 	bool bfirstconnect , bfirstdisconnect;
+ 	u8 dm_dig_max, dm_dig_min;
+ 	u8 current_igi = dm_dig->cur_igvalue;
+@@ -308,7 +308,7 @@ static void rtl92ee_dm_dig(struct ieee80211_hw *hw)
+ 	if (mac->act_scanning)
+ 		return;
+ 
+-	dig_dynamic_min = dm_dig->dig_dynamic_min;
++	dig_min_0 = dm_dig->dig_min_0;
+ 	bfirstconnect = (mac->link_state >= MAC80211_LINKED) &&
+ 			!dm_dig->media_connect_0;
+ 	bfirstdisconnect = (mac->link_state < MAC80211_LINKED) &&
+@@ -329,19 +329,19 @@ static void rtl92ee_dm_dig(struct ieee80211_hw *hw)
+ 		if (rtlpriv->dm.one_entry_only) {
+ 			offset = 0;
+ 			if (dm_dig->rssi_val_min - offset < dm_dig_min)
+-				dig_dynamic_min = dm_dig_min;
++				dig_min_0 = dm_dig_min;
+ 			else if (dm_dig->rssi_val_min - offset >
+ 				 dig_maxofmin)
+-				dig_dynamic_min = dig_maxofmin;
++				dig_min_0 = dig_maxofmin;
+ 			else
+-				dig_dynamic_min = dm_dig->rssi_val_min - offset;
++				dig_min_0 = dm_dig->rssi_val_min - offset;
+ 		} else {
+-			dig_dynamic_min = dm_dig_min;
++			dig_min_0 = dm_dig_min;
+ 		}
+ 
+ 	} else {
+ 		dm_dig->rx_gain_max = dm_dig_max;
+-		dig_dynamic_min = dm_dig_min;
++		dig_min_0 = dm_dig_min;
+ 		RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "no link\n");
+ 	}
+ 
+@@ -368,10 +368,10 @@ static void rtl92ee_dm_dig(struct ieee80211_hw *hw)
+ 		} else {
+ 			if (dm_dig->large_fa_hit < 3) {
+ 				if ((dm_dig->forbidden_igi - 1) <
+-				    dig_dynamic_min) {
+-					dm_dig->forbidden_igi = dig_dynamic_min;
++				    dig_min_0) {
++					dm_dig->forbidden_igi = dig_min_0;
+ 					dm_dig->rx_gain_min =
+-								dig_dynamic_min;
++								dig_min_0;
+ 				} else {
+ 					dm_dig->forbidden_igi--;
+ 					dm_dig->rx_gain_min =
+@@ -430,7 +430,7 @@ static void rtl92ee_dm_dig(struct ieee80211_hw *hw)
+ 	rtl92ee_dm_write_dig(hw , current_igi);
+ 	dm_dig->media_connect_0 = ((mac->link_state >= MAC80211_LINKED) ?
+ 				   true : false);
+-	dm_dig->dig_dynamic_min = dig_dynamic_min;
++	dm_dig->dig_min_0 = dig_min_0;
+ }
+ 
+ void rtl92ee_dm_write_cck_cca_thres(struct ieee80211_hw *hw, u8 cur_thres)
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/dm.c b/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
+index dd7eb43..b92c521e 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
+@@ -232,8 +232,8 @@ static void rtl8723be_dm_diginit(struct ieee80211_hw *hw)
+ 	dm_digtable->forbidden_igi = DM_DIG_MIN;
+ 	dm_digtable->large_fa_hit = 0;
+ 	dm_digtable->recover_cnt = 0;
+-	dm_digtable->dig_dynamic_min = DM_DIG_MIN;
+-	dm_digtable->dig_dynamic_min_1 = DM_DIG_MIN;
++	dm_digtable->dig_min_0 = DM_DIG_MIN;
++	dm_digtable->dig_min_1 = DM_DIG_MIN;
+ 	dm_digtable->media_connect_0 = false;
+ 	dm_digtable->media_connect_1 = false;
+ 	rtlpriv->dm.dm_initialgain_enable = true;
+@@ -424,7 +424,7 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+ 	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
+ 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
+-	u8 dig_dynamic_min, dig_maxofmin;
++	u8 dig_min_0, dig_maxofmin;
+ 	bool bfirstconnect, bfirstdisconnect;
+ 	u8 dm_dig_max, dm_dig_min;
+ 	u8 current_igi = dm_digtable->cur_igvalue;
+@@ -434,7 +434,7 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
+ 	if (mac->act_scanning)
+ 		return;
+ 
+-	dig_dynamic_min = dm_digtable->dig_dynamic_min;
++	dig_min_0 = dm_digtable->dig_min_0;
+ 	bfirstconnect = (mac->link_state >= MAC80211_LINKED) &&
+ 			!dm_digtable->media_connect_0;
+ 	bfirstdisconnect = (mac->link_state < MAC80211_LINKED) &&
+@@ -456,20 +456,20 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
+ 		if (rtlpriv->dm.one_entry_only) {
+ 			offset = 12;
+ 			if (dm_digtable->rssi_val_min - offset < dm_dig_min)
+-				dig_dynamic_min = dm_dig_min;
++				dig_min_0 = dm_dig_min;
+ 			else if (dm_digtable->rssi_val_min - offset >
+ 							dig_maxofmin)
+-				dig_dynamic_min = dig_maxofmin;
++				dig_min_0 = dig_maxofmin;
+ 			else
+-				dig_dynamic_min =
++				dig_min_0 =
+ 					dm_digtable->rssi_val_min - offset;
+ 		} else {
+-			dig_dynamic_min = dm_dig_min;
++			dig_min_0 = dm_dig_min;
+ 		}
+ 
+ 	} else {
+ 		dm_digtable->rx_gain_max = dm_dig_max;
+-		dig_dynamic_min = dm_dig_min;
++		dig_min_0 = dm_dig_min;
+ 		RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "no link\n");
+ 	}
+ 
+@@ -497,11 +497,11 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
+ 		} else {
+ 			if (dm_digtable->large_fa_hit < 3) {
+ 				if ((dm_digtable->forbidden_igi - 1) <
+-				     dig_dynamic_min) {
++				     dig_min_0) {
+ 					dm_digtable->forbidden_igi =
+-							dig_dynamic_min;
++							dig_min_0;
+ 					dm_digtable->rx_gain_min =
+-							dig_dynamic_min;
++							dig_min_0;
+ 				} else {
+ 					dm_digtable->forbidden_igi--;
+ 					dm_digtable->rx_gain_min =
+@@ -552,7 +552,7 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
+ 	rtl8723be_dm_write_dig(hw, current_igi);
+ 	dm_digtable->media_connect_0 =
+ 		((mac->link_state >= MAC80211_LINKED) ? true : false);
+-	dm_digtable->dig_dynamic_min = dig_dynamic_min;
++	dm_digtable->dig_min_0 = dig_min_0;
+ }
+ 
+ static void rtl8723be_dm_false_alarm_counter_statistics(
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
+index ba30b0d..8b0bfb2 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
+@@ -539,8 +539,8 @@ static void rtl8821ae_dm_diginit(struct ieee80211_hw *hw)
+ 	dm_digtable->forbidden_igi = DM_DIG_MIN;
+ 	dm_digtable->large_fa_hit = 0;
+ 	dm_digtable->recover_cnt = 0;
+-	dm_digtable->dig_dynamic_min = DM_DIG_MIN;
+-	dm_digtable->dig_dynamic_min_1 = DM_DIG_MIN;
++	dm_digtable->dig_min_0 = DM_DIG_MIN;
++	dm_digtable->dig_min_1 = DM_DIG_MIN;
+ 	dm_digtable->media_connect_0 = false;
+ 	dm_digtable->media_connect_1 = false;
+ 	rtlpriv->dm.dm_initialgain_enable = true;
+@@ -822,7 +822,7 @@ static void rtl8821ae_dm_dig(struct ieee80211_hw *hw)
+ 	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
+ 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
+ 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
+-	u8 dig_dynamic_min;
++	u8 dig_min_0;
+ 	u8 dig_max_of_min;
+ 	bool first_connect, first_disconnect;
+ 	u8 dm_dig_max, dm_dig_min, offset;
+@@ -837,7 +837,7 @@ static void rtl8821ae_dm_dig(struct ieee80211_hw *hw)
+ 	}
+ 
+ 	/*add by Neil Chen to avoid PSD is processing*/
+-	dig_dynamic_min = dm_digtable->dig_dynamic_min;
++	dig_min_0 = dm_digtable->dig_min_0;
+ 	first_connect = (mac->link_state >= MAC80211_LINKED) &&
+ 			(!dm_digtable->media_connect_0);
+ 	first_disconnect = (mac->link_state < MAC80211_LINKED) &&
+@@ -876,23 +876,23 @@ static void rtl8821ae_dm_dig(struct ieee80211_hw *hw)
+ 			offset = 0;
+ 
+ 			if (dm_digtable->rssi_val_min - offset < dm_dig_min)
+-				dig_dynamic_min = dm_dig_min;
++				dig_min_0 = dm_dig_min;
+ 			else if (dm_digtable->rssi_val_min -
+ 				offset > dig_max_of_min)
+-				dig_dynamic_min = dig_max_of_min;
++				dig_min_0 = dig_max_of_min;
+ 			else
+-				dig_dynamic_min =
++				dig_min_0 =
+ 					dm_digtable->rssi_val_min - offset;
+ 
+ 			RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
+-				 "bOneEntryOnly=TRUE, dig_dynamic_min=0x%x\n",
+-				 dig_dynamic_min);
++				 "bOneEntryOnly=TRUE, dig_min_0=0x%x\n",
++				 dig_min_0);
+ 		} else {
+-			dig_dynamic_min = dm_dig_min;
++			dig_min_0 = dm_dig_min;
+ 		}
+ 	} else {
+ 		dm_digtable->rx_gain_max = dm_dig_max;
+-		dig_dynamic_min = dm_dig_min;
++		dig_min_0 = dm_dig_min;
+ 		RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
+ 			 "No Link\n");
+ 	}
+@@ -925,11 +925,11 @@ static void rtl8821ae_dm_dig(struct ieee80211_hw *hw)
+ 		} else {
+ 			if (dm_digtable->large_fa_hit < 3) {
+ 				if ((dm_digtable->forbidden_igi - 1) <
+-				    dig_dynamic_min) {
++				    dig_min_0) {
+ 					dm_digtable->forbidden_igi =
+-						dig_dynamic_min;
++						dig_min_0;
+ 					dm_digtable->rx_gain_min =
+-						dig_dynamic_min;
++						dig_min_0;
+ 					RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
+ 						 "Normal Case: At Lower Bound\n");
+ 				} else {
+@@ -1024,7 +1024,7 @@ static void rtl8821ae_dm_dig(struct ieee80211_hw *hw)
+ 	rtl8821ae_dm_write_dig(hw, current_igi);
+ 	dm_digtable->media_connect_0 =
+ 		((mac->link_state >= MAC80211_LINKED) ? true : false);
+-	dm_digtable->dig_dynamic_min = dig_dynamic_min;
++	dm_digtable->dig_min_0 = dig_min_0;
+ }
+ 
+ static void rtl8821ae_dm_common_info_self_update(struct ieee80211_hw *hw)
+diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
+index 7a718fd..b53d9dd 100644
+--- a/drivers/net/wireless/rtlwifi/wifi.h
++++ b/drivers/net/wireless/rtlwifi/wifi.h
+@@ -2412,8 +2412,6 @@ struct dig_t {
+ 	u8 pre_ccastate;
+ 	u8 cur_ccasate;
+ 	u8 large_fa_hit;
+-	u8 dig_dynamic_min;
+-	u8 dig_dynamic_min_1;
+ 	u8 forbidden_igi;
+ 	u8 dig_state;
+ 	u8 dig_highpwrstate;
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0038-rtlwifi-rtl8723be-Improve-modinfo-output.patch b/package/kernel/mac80211/patches/680-0038-rtlwifi-rtl8723be-Improve-modinfo-output.patch
new file mode 100644
index 0000000..fede8ad
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0038-rtlwifi-rtl8723be-Improve-modinfo-output.patch
@@ -0,0 +1,40 @@
+From 3f0c1cfa735a12dbe24c583d2ab833d348745856 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:03 -0600
+Subject: [PATCH 38/51] rtlwifi: rtl8723be: Improve modinfo output
+
+The description of the power-save variables for this driver is not as
+clear as for the others. The wording is changed to match the others.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8723be/sw.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/sw.c b/drivers/net/wireless/rtlwifi/rtl8723be/sw.c
+index 223eb42..1017f02 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/sw.c
+@@ -387,12 +387,14 @@ module_param_named(swlps, rtl8723be_mod_params.swctrl_lps, bool, 0444);
+ module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444);
+ module_param_named(disable_watchdog, rtl8723be_mod_params.disable_watchdog,
+ 		   bool, 0444);
+-MODULE_PARM_DESC(swenc, "using hardware crypto (default 0 [hardware])\n");
+-MODULE_PARM_DESC(ips, "using no link power save (default 1 is open)\n");
+-MODULE_PARM_DESC(fwlps, "using linked fw control power save (default 1 is open)\n");
++MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
++MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
++MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
++MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
+ MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 0)\n");
+ MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
+-MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
++MODULE_PARM_DESC(disable_watchdog,
++		 "Set to 1 to disable the watchdog (default 0)\n");
+ 
+ static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
+ 
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0039-rtlwifi-Create-new-routine-to-initialize-the-DM-tabl.patch b/package/kernel/mac80211/patches/680-0039-rtlwifi-Create-new-routine-to-initialize-the-DM-tabl.patch
new file mode 100644
index 0000000..edc0b40
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0039-rtlwifi-Create-new-routine-to-initialize-the-DM-tabl.patch
@@ -0,0 +1,607 @@
+From 6f8214b6905741ac5c58958a35257e8103645c90 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:04 -0600
+Subject: [PATCH 39/51] rtlwifi: Create new routine to initialize the DM tables
+
+Each of the drivers contains a routine that initializes the dm_digtable
+member of the driver's private area. As a first step toward reducing the
+size of the drivers, a copy of this driver is created in rtlwifi, and the
+definitions of the parameters are moved there.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/core.c               | 34 +++++++++++++++++++++++
+ drivers/net/wireless/rtlwifi/core.h               | 24 ++++++++++++++++
+ drivers/net/wireless/rtlwifi/rtl8188ee/dm.c       |  1 +
+ drivers/net/wireless/rtlwifi/rtl8188ee/dm.h       | 22 ---------------
+ drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c |  1 +
+ drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h | 22 ---------------
+ drivers/net/wireless/rtlwifi/rtl8192ce/dm.c       |  1 +
+ drivers/net/wireless/rtlwifi/rtl8192ce/dm.h       | 13 ---------
+ drivers/net/wireless/rtlwifi/rtl8192de/dm.c       |  1 +
+ drivers/net/wireless/rtlwifi/rtl8192de/dm.h       | 22 ---------------
+ drivers/net/wireless/rtlwifi/rtl8192ee/dm.c       |  1 +
+ drivers/net/wireless/rtlwifi/rtl8192ee/dm.h       | 13 ---------
+ drivers/net/wireless/rtlwifi/rtl8192se/dm.c       |  1 +
+ drivers/net/wireless/rtlwifi/rtl8192se/dm.h       | 19 -------------
+ drivers/net/wireless/rtlwifi/rtl8723ae/dm.c       |  1 +
+ drivers/net/wireless/rtlwifi/rtl8723ae/dm.h       | 22 ---------------
+ drivers/net/wireless/rtlwifi/rtl8723be/dm.c       |  1 +
+ drivers/net/wireless/rtlwifi/rtl8723be/dm.h       | 22 ---------------
+ drivers/net/wireless/rtlwifi/rtl8821ae/dm.c       |  1 +
+ drivers/net/wireless/rtlwifi/rtl8821ae/dm.h       | 16 -----------
+ 20 files changed, 67 insertions(+), 171 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
+index deab852..5aa3ab3 100644
+--- a/drivers/net/wireless/rtlwifi/core.c
++++ b/drivers/net/wireless/rtlwifi/core.c
+@@ -1871,3 +1871,37 @@ bool rtl_btc_status_false(void)
+ 	return false;
+ }
+ EXPORT_SYMBOL_GPL(rtl_btc_status_false);
++
++void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igvalue)
++{
++	struct rtl_priv *rtlpriv = rtl_priv(hw);
++	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
++
++	dm_digtable->dig_enable_flag = true;
++	dm_digtable->cur_igvalue = cur_igvalue;
++	dm_digtable->pre_igvalue = 0;
++	dm_digtable->cur_sta_cstate = DIG_STA_DISCONNECT;
++	dm_digtable->presta_cstate = DIG_STA_DISCONNECT;
++	dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
++	dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
++	dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
++	dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
++	dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
++	dm_digtable->rx_gain_max = DM_DIG_MAX;
++	dm_digtable->rx_gain_min = DM_DIG_MIN;
++	dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
++	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
++	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
++	dm_digtable->pre_cck_cca_thres = 0xff;
++	dm_digtable->cur_cck_cca_thres = 0x83;
++	dm_digtable->forbidden_igi = DM_DIG_MIN;
++	dm_digtable->large_fa_hit = 0;
++	dm_digtable->recover_cnt = 0;
++	dm_digtable->dig_min_0 = 0x25;
++	dm_digtable->dig_min_1 = 0x25;
++	dm_digtable->media_connect_0 = false;
++	dm_digtable->media_connect_1 = false;
++	rtlpriv->dm.dm_initialgain_enable = true;
++	dm_digtable->bt30_cur_igi = 0x32;
++}
++EXPORT_SYMBOL(rtl_dm_diginit);
+diff --git a/drivers/net/wireless/rtlwifi/core.h b/drivers/net/wireless/rtlwifi/core.h
+index 8c87eb5..c0a0317 100644
+--- a/drivers/net/wireless/rtlwifi/core.h
++++ b/drivers/net/wireless/rtlwifi/core.h
+@@ -35,6 +35,29 @@
+ 
+ #define RTL_SUPPORTED_CTRL_FILTER	0xFF
+ 
++#define DM_DIG_THRESH_HIGH		40
++#define DM_DIG_THRESH_LOW		35
++#define DM_FALSEALARM_THRESH_LOW	400
++#define DM_FALSEALARM_THRESH_HIGH	1000
++
++#define DM_DIG_MAX			0x3e
++#define DM_DIG_MIN			0x1e
++#define DM_DIG_BACKOFF_MAX		12
++#define DM_DIG_BACKOFF_MIN		-4
++#define DM_DIG_BACKOFF_DEFAULT		10
++
++enum dm_dig_connect_e {
++	DIG_STA_DISCONNECT,
++	DIG_STA_CONNECT,
++	DIG_STA_BEFORE_CONNECT,
++	DIG_MULTISTA_DISCONNECT,
++	DIG_MULTISTA_CONNECT,
++	DIG_AP_DISCONNECT,
++	DIG_AP_CONNECT,
++	DIG_AP_ADD_STATION,
++	DIG_CONNECT_MAX
++};
++
+ extern const struct ieee80211_ops rtl_ops;
+ void rtl_fw_cb(const struct firmware *firmware, void *context);
+ void rtl_wowlan_fw_cb(const struct firmware *firmware, void *context);
+@@ -44,5 +67,6 @@ void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
+ void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data);
+ bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb);
+ bool rtl_btc_status_false(void);
++void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igval);
+ 
+ #endif
+diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
+index 2aa34d9..7ebf6e0 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
+@@ -26,6 +26,7 @@
+ #include "../wifi.h"
+ #include "../base.h"
+ #include "../pci.h"
++#include "../core.h"
+ #include "reg.h"
+ #include "def.h"
+ #include "phy.h"
+diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
+index 64f1f3ea..6217b7c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
+@@ -186,15 +186,6 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW				25
+ #define BW_AUTO_SWITCH_LOW_HIGH				30
+ 
+-#define DM_DIG_THRESH_HIGH				40
+-#define DM_DIG_THRESH_LOW				35
+-
+-#define DM_FALSEALARM_THRESH_LOW			400
+-#define DM_FALSEALARM_THRESH_HIGH			1000
+-
+-#define DM_DIG_MAX					0x3e
+-#define DM_DIG_MIN					0x1e
+-
+ #define DM_DIG_MAX_AP					0x32
+ #define DM_DIG_MIN_AP					0x20
+ 
+@@ -204,10 +195,6 @@
+ #define DM_DIG_FA_TH1					0x300
+ #define DM_DIG_FA_TH2					0x400
+ 
+-#define DM_DIG_BACKOFF_MAX				12
+-#define DM_DIG_BACKOFF_MIN				-4
+-#define DM_DIG_BACKOFF_DEFAULT				10
+-
+ #define RXPATHSELECTION_SS_TH_W				30
+ #define RXPATHSELECTION_DIFF_TH				18
+ 
+@@ -296,15 +283,6 @@ enum dm_dig_ext_port_alg_e {
+ 	DIG_EXT_PORT_STAGE_MAX = 4,
+ };
+ 
+-enum dm_dig_connect_e {
+-	DIG_STA_DISCONNECT = 0,
+-	DIG_STA_CONNECT = 1,
+-	DIG_STA_BEFORE_CONNECT = 2,
+-	DIG_MULTISTA_DISCONNECT = 3,
+-	DIG_MULTISTA_CONNECT = 4,
+-	DIG_CONNECT_MAX
+-};
+-
+ enum pwr_track_control_method {
+ 	BBSWING,
+ 	TXAGC
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+index c3aad76..dabe18f 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+@@ -32,6 +32,7 @@
+ #include "phy_common.h"
+ #include "../pci.h"
+ #include "../base.h"
++#include "../core.h"
+ 
+ #define BT_RSSI_STATE_NORMAL_POWER	BIT_OFFSET_LEN_MASK_32(0, 1)
+ #define BT_RSSI_STATE_AMDPU_OFF		BIT_OFFSET_LEN_MASK_32(1, 1)
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
+index 4f232a0..55ebffd 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
+@@ -47,25 +47,12 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW			25
+ #define BW_AUTO_SWITCH_LOW_HIGH			30
+ 
+-#define DM_DIG_THRESH_HIGH			40
+-#define DM_DIG_THRESH_LOW			35
+-
+-#define DM_FALSEALARM_THRESH_LOW		400
+-#define DM_FALSEALARM_THRESH_HIGH		1000
+-
+-#define DM_DIG_MAX				0x3e
+-#define DM_DIG_MIN				0x1e
+-
+ #define DM_DIG_FA_UPPER				0x32
+ #define DM_DIG_FA_LOWER				0x20
+ #define DM_DIG_FA_TH0				0x20
+ #define DM_DIG_FA_TH1				0x100
+ #define DM_DIG_FA_TH2				0x200
+ 
+-#define DM_DIG_BACKOFF_MAX			12
+-#define DM_DIG_BACKOFF_MIN			-4
+-#define DM_DIG_BACKOFF_DEFAULT			10
+-
+ #define RXPATHSELECTION_SS_TH_lOW		30
+ #define RXPATHSELECTION_DIFF_TH			18
+ 
+@@ -157,15 +144,6 @@ enum dm_dig_ext_port_alg_e {
+ 	DIG_EXT_PORT_STAGE_MAX = 4,
+ };
+ 
+-enum dm_dig_connect_e {
+-	DIG_STA_DISCONNECT = 0,
+-	DIG_STA_CONNECT = 1,
+-	DIG_STA_BEFORE_CONNECT = 2,
+-	DIG_MULTISTA_DISCONNECT = 3,
+-	DIG_MULTISTA_CONNECT = 4,
+-	DIG_CONNECT_MAX
+-};
+-
+ void rtl92c_dm_init(struct ieee80211_hw *hw);
+ void rtl92c_dm_watchdog(struct ieee80211_hw *hw);
+ void rtl92c_dm_write_dig(struct ieee80211_hw *hw);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/dm.c b/drivers/net/wireless/rtlwifi/rtl8192ce/dm.c
+index 74f9c08..09898cf 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/dm.c
+@@ -30,6 +30,7 @@
+ #include "../wifi.h"
+ #include "../base.h"
+ #include "../pci.h"
++#include "../core.h"
+ #include "reg.h"
+ #include "def.h"
+ #include "phy.h"
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h b/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
+index 9c5311c..38ba707 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
+@@ -42,25 +42,12 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW			25
+ #define BW_AUTO_SWITCH_LOW_HIGH			30
+ 
+-#define DM_DIG_THRESH_HIGH			40
+-#define DM_DIG_THRESH_LOW			35
+-
+-#define DM_FALSEALARM_THRESH_LOW		400
+-#define DM_FALSEALARM_THRESH_HIGH		1000
+-
+-#define DM_DIG_MAX				0x3e
+-#define DM_DIG_MIN				0x1e
+-
+ #define DM_DIG_FA_UPPER				0x32
+ #define DM_DIG_FA_LOWER				0x20
+ #define DM_DIG_FA_TH0				0x20
+ #define DM_DIG_FA_TH1				0x100
+ #define DM_DIG_FA_TH2				0x200
+ 
+-#define DM_DIG_BACKOFF_MAX			12
+-#define DM_DIG_BACKOFF_MIN			-4
+-#define DM_DIG_BACKOFF_DEFAULT			10
+-
+ #define RXPATHSELECTION_SS_TH_lOW		30
+ #define RXPATHSELECTION_DIFF_TH			18
+ 
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/dm.c b/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
+index 304c443..75643ab 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
+@@ -29,6 +29,7 @@
+ 
+ #include "../wifi.h"
+ #include "../base.h"
++#include "../core.h"
+ #include "reg.h"
+ #include "def.h"
+ #include "phy.h"
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/dm.h b/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
+index 3fea0c1..d21b3bc 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
+@@ -42,25 +42,12 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW			25
+ #define BW_AUTO_SWITCH_LOW_HIGH			30
+ 
+-#define DM_DIG_THRESH_HIGH			40
+-#define DM_DIG_THRESH_LOW			35
+-
+-#define DM_FALSEALARM_THRESH_LOW		400
+-#define DM_FALSEALARM_THRESH_HIGH		1000
+-
+-#define DM_DIG_MAX				0x3e
+-#define DM_DIG_MIN				0x1c
+-
+ #define DM_DIG_FA_UPPER				0x32
+ #define DM_DIG_FA_LOWER				0x20
+ #define DM_DIG_FA_TH0				0x100
+ #define DM_DIG_FA_TH1				0x400
+ #define DM_DIG_FA_TH2				0x600
+ 
+-#define DM_DIG_BACKOFF_MAX			12
+-#define DM_DIG_BACKOFF_MIN			-4
+-#define DM_DIG_BACKOFF_DEFAULT			10
+-
+ #define RXPATHSELECTION_SS_TH_lOW		30
+ #define RXPATHSELECTION_DIFF_TH			18
+ 
+@@ -142,15 +129,6 @@ enum dm_dig_ext_port_alg {
+ 	DIG_EXT_PORT_STAGE_MAX = 4,
+ };
+ 
+-enum dm_dig_connect {
+-	DIG_STA_DISCONNECT = 0,
+-	DIG_STA_CONNECT = 1,
+-	DIG_STA_BEFORE_CONNECT = 2,
+-	DIG_MULTISTA_DISCONNECT = 3,
+-	DIG_MULTISTA_CONNECT = 4,
+-	DIG_CONNECT_MAX
+-};
+-
+ void rtl92d_dm_init(struct ieee80211_hw *hw);
+ void rtl92d_dm_watchdog(struct ieee80211_hw *hw);
+ void rtl92d_dm_init_edca_turbo(struct ieee80211_hw *hw);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
+index 2fa4c45..70e58d1 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
+@@ -26,6 +26,7 @@
+ #include "../wifi.h"
+ #include "../base.h"
+ #include "../pci.h"
++#include "../core.h"
+ #include "reg.h"
+ #include "def.h"
+ #include "phy.h"
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h
+index 881db7d..4880e19 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h
+@@ -189,15 +189,6 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW			25
+ #define BW_AUTO_SWITCH_LOW_HIGH			30
+ 
+-#define DM_DIG_THRESH_HIGH			40
+-#define DM_DIG_THRESH_LOW			35
+-
+-#define DM_FALSEALARM_THRESH_LOW		400
+-#define DM_FALSEALARM_THRESH_HIGH		1000
+-
+-#define DM_DIG_MAX				0x3e
+-#define DM_DIG_MIN				0x1e
+-
+ #define DM_DIG_MAX_AP				0x32
+ #define DM_DIG_MIN_AP				0x20
+ 
+@@ -207,10 +198,6 @@
+ #define DM_DIG_FA_TH1				0x300
+ #define DM_DIG_FA_TH2				0x400
+ 
+-#define DM_DIG_BACKOFF_MAX			12
+-#define DM_DIG_BACKOFF_MIN			-4
+-#define DM_DIG_BACKOFF_DEFAULT			10
+-
+ #define RXPATHSELECTION_SS_TH_LOW		30
+ #define RXPATHSELECTION_DIFF_TH			18
+ 
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/dm.c b/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
+index b3a2d5e..6cac70b 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
+@@ -29,6 +29,7 @@
+ 
+ #include "../wifi.h"
+ #include "../base.h"
++#include "../core.h"
+ #include "reg.h"
+ #include "def.h"
+ #include "phy.h"
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/dm.h b/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
+index 2e9052c..7d778d3 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
+@@ -54,16 +54,6 @@ enum dm_dig_sta {
+ 	DM_STA_DIG_MAX
+ };
+ 
+-enum dm_dig_connect {
+-	DIG_STA_DISCONNECT = 0,
+-	DIG_STA_CONNECT = 1,
+-	DIG_STA_BEFORE_CONNECT = 2,
+-	DIG_AP_DISCONNECT = 3,
+-	DIG_AP_CONNECT = 4,
+-	DIG_AP_ADD_STATION = 5,
+-	DIG_CONNECT_MAX
+-};
+-
+ enum dm_dig_ext_port_alg {
+ 	DIG_EXT_PORT_STAGE_0 = 0,
+ 	DIG_EXT_PORT_STAGE_1 = 1,
+@@ -99,22 +89,13 @@ enum dm_ratr_sta {
+ #define	TX_POWER_NEAR_FIELD_THRESH_LVL2	74
+ #define	TX_POWER_NEAR_FIELD_THRESH_LVL1	67
+ 
+-#define DM_DIG_THRESH_HIGH		40
+-#define DM_DIG_THRESH_LOW		35
+-#define	DM_FALSEALARM_THRESH_LOW	40
+-#define	DM_FALSEALARM_THRESH_HIGH	1000
+ #define	DM_DIG_HIGH_PWR_THRESH_HIGH	75
+ #define	DM_DIG_HIGH_PWR_THRESH_LOW	70
+ #define	DM_DIG_BACKOFF			12
+-#define	DM_DIG_MAX			0x3e
+-#define	DM_DIG_MIN			0x1c
+ #define	DM_DIG_MIN_Netcore		0x12
+-#define	DM_DIG_BACKOFF_MAX		12
+-#define	DM_DIG_BACKOFF_MIN		-4
+ 
+ void rtl92s_dm_watchdog(struct ieee80211_hw *hw);
+ void rtl92s_dm_init(struct ieee80211_hw *hw);
+ void rtl92s_dm_init_edca_turbo(struct ieee80211_hw *hw);
+ 
+ #endif
+-
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
+index a0e8692..80f4c54 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
+@@ -26,6 +26,7 @@
+ #include "../wifi.h"
+ #include "../base.h"
+ #include "../pci.h"
++#include "../core.h"
+ #include "reg.h"
+ #include "def.h"
+ #include "phy.h"
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
+index 6fa0feb..c54024e 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
+@@ -42,25 +42,12 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW			25
+ #define BW_AUTO_SWITCH_LOW_HIGH			30
+ 
+-#define DM_DIG_THRESH_HIGH			40
+-#define DM_DIG_THRESH_LOW			35
+-
+-#define DM_FALSEALARM_THRESH_LOW		400
+-#define DM_FALSEALARM_THRESH_HIGH		1000
+-
+-#define DM_DIG_MAX				0x3e
+-#define DM_DIG_MIN				0x1e
+-
+ #define DM_DIG_FA_UPPER				0x32
+ #define DM_DIG_FA_LOWER				0x20
+ #define DM_DIG_FA_TH0				0x20
+ #define DM_DIG_FA_TH1				0x100
+ #define DM_DIG_FA_TH2				0x200
+ 
+-#define DM_DIG_BACKOFF_MAX			12
+-#define DM_DIG_BACKOFF_MIN			-4
+-#define DM_DIG_BACKOFF_DEFAULT			10
+-
+ #define RXPATHSELECTION_SS_TH_LOW		30
+ #define RXPATHSELECTION_DIFF_TH			18
+ 
+@@ -142,15 +129,6 @@ enum dm_dig_ext_port_alg_e {
+ 	DIG_EXT_PORT_STAGE_MAX = 4,
+ };
+ 
+-enum dm_dig_connect_e {
+-	DIG_STA_DISCONNECT = 0,
+-	DIG_STA_CONNECT = 1,
+-	DIG_STA_BEFORE_CONNECT = 2,
+-	DIG_MULTISTA_DISCONNECT = 3,
+-	DIG_MULTISTA_CONNECT = 4,
+-	DIG_CONNECT_MAX
+-};
+-
+ #define BT_RSSI_STATE_NORMAL_POWER      BIT_OFFSET_LEN_MASK_32(0, 1)
+ #define BT_RSSI_STATE_AMDPU_OFF         BIT_OFFSET_LEN_MASK_32(1, 1)
+ #define BT_RSSI_STATE_SPECIAL_LOW       BIT_OFFSET_LEN_MASK_32(2, 1)
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/dm.c b/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
+index b92c521e..ddf45d9 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
+@@ -26,6 +26,7 @@
+ #include "../wifi.h"
+ #include "../base.h"
+ #include "../pci.h"
++#include "../core.h"
+ #include "reg.h"
+ #include "def.h"
+ #include "phy.h"
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/dm.h b/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
+index e4c0e8a..f3e47ab 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
+@@ -180,15 +180,6 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW			25
+ #define BW_AUTO_SWITCH_LOW_HIGH			30
+ 
+-#define DM_DIG_THRESH_HIGH			40
+-#define DM_DIG_THRESH_LOW			35
+-
+-#define DM_FALSEALARM_THRESH_LOW		400
+-#define DM_FALSEALARM_THRESH_HIGH		1000
+-
+-#define DM_DIG_MAX				0x3e
+-#define DM_DIG_MIN				0x1e
+-
+ #define DM_DIG_MAX_AP				0x32
+ #define DM_DIG_MIN_AP				0x20
+ 
+@@ -198,10 +189,6 @@
+ #define DM_DIG_FA_TH1				0x300
+ #define DM_DIG_FA_TH2				0x400
+ 
+-#define DM_DIG_BACKOFF_MAX			12
+-#define DM_DIG_BACKOFF_MIN			-4
+-#define DM_DIG_BACKOFF_DEFAULT			10
+-
+ #define RXPATHSELECTION_SS_TH_LOW		30
+ #define RXPATHSELECTION_DIFF_TH			18
+ 
+@@ -260,15 +247,6 @@ enum dm_dig_ext_port_alg_e {
+ 	DIG_EXT_PORT_STAGE_MAX	= 4,
+ };
+ 
+-enum dm_dig_connect_e {
+-	DIG_STA_DISCONNECT	= 0,
+-	DIG_STA_CONNECT		= 1,
+-	DIG_STA_BEFORE_CONNECT	= 2,
+-	DIG_MULTISTA_DISCONNECT	= 3,
+-	DIG_MULTISTA_CONNECT	= 4,
+-	DIG_CONNECT_MAX
+-};
+-
+ enum pwr_track_control_method {
+ 	BBSWING,
+ 	TXAGC
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
+index 8b0bfb2..4af4613 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
+@@ -26,6 +26,7 @@
+ #include "../wifi.h"
+ #include "../base.h"
+ #include "../pci.h"
++#include "../core.h"
+ #include "reg.h"
+ #include "def.h"
+ #include "phy.h"
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
+index 9dd40dd..f311887 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
+@@ -187,9 +187,6 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW		25
+ #define BW_AUTO_SWITCH_LOW_HIGH		30
+ 
+-#define DM_DIG_THRESH_HIGH			40
+-#define DM_DIG_THRESH_LOW			35
+-
+ #define DM_FALSEALARM_THRESH_LOW	400
+ #define DM_FALSEALARM_THRESH_HIGH	1000
+ 
+@@ -205,10 +202,6 @@
+ #define DM_DIG_FA_TH1				0x300
+ #define DM_DIG_FA_TH2				0x400
+ 
+-#define DM_DIG_BACKOFF_MAX			12
+-#define DM_DIG_BACKOFF_MIN			-4
+-#define DM_DIG_BACKOFF_DEFAULT		10
+-
+ #define RXPATHSELECTION_SS_TH_LOW	30
+ #define RXPATHSELECTION_DIFF_TH		18
+ 
+@@ -296,15 +289,6 @@ enum dm_dig_ext_port_alg_e {
+ 	DIG_EXT_PORT_STAGE_MAX = 4,
+ };
+ 
+-enum dm_dig_connect_e {
+-	DIG_STA_DISCONNECT = 0,
+-	DIG_STA_CONNECT = 1,
+-	DIG_STA_BEFORE_CONNECT = 2,
+-	DIG_MULTISTA_DISCONNECT = 3,
+-	DIG_MULTISTA_CONNECT = 4,
+-	DIG_CONNECT_MAX
+-};
+-
+ enum pwr_track_control_method {
+ 	BBSWING,
+ 	TXAGC,
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0040-rtlwifi-rtl8188ee-Convert-driver-to-use-the-common-D.patch b/package/kernel/mac80211/patches/680-0040-rtlwifi-rtl8188ee-Convert-driver-to-use-the-common-D.patch
new file mode 100644
index 0000000..f89e2c3
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0040-rtlwifi-rtl8188ee-Convert-driver-to-use-the-common-D.patch
@@ -0,0 +1,73 @@
+From b5d4478dc35e0cd9ef482d22aba069a19fe04a04 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:05 -0600
+Subject: [PATCH 40/51] rtlwifi: rtl8188ee: Convert driver to use the common DM
+ table init routine
+
+The previous patch created a routine in rtlwifi to initialize dm_digtable.
+Driver rtl8188ee is converted to use that routine.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8188ee/dm.c | 35 ++---------------------------
+ 1 file changed, 2 insertions(+), 33 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
+index 7ebf6e0..d930c1f 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
+@@ -342,38 +342,6 @@ static void dm_tx_pwr_track_set_pwr(struct ieee80211_hw *hw,
+ 	}
+ }
+ 
+-static void rtl88e_dm_diginit(struct ieee80211_hw *hw)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
+-
+-	dm_dig->dig_enable_flag = true;
+-	dm_dig->cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
+-	dm_dig->pre_igvalue = 0;
+-	dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
+-	dm_dig->presta_cstate = DIG_STA_DISCONNECT;
+-	dm_dig->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
+-	dm_dig->rssi_lowthresh = DM_DIG_THRESH_LOW;
+-	dm_dig->rssi_highthresh = DM_DIG_THRESH_HIGH;
+-	dm_dig->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
+-	dm_dig->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
+-	dm_dig->rx_gain_max = DM_DIG_MAX;
+-	dm_dig->rx_gain_min = DM_DIG_MIN;
+-	dm_dig->back_val = DM_DIG_BACKOFF_DEFAULT;
+-	dm_dig->back_range_max = DM_DIG_BACKOFF_MAX;
+-	dm_dig->back_range_min = DM_DIG_BACKOFF_MIN;
+-	dm_dig->pre_cck_cca_thres = 0xff;
+-	dm_dig->cur_cck_cca_thres = 0x83;
+-	dm_dig->forbidden_igi = DM_DIG_MIN;
+-	dm_dig->large_fa_hit = 0;
+-	dm_dig->recover_cnt = 0;
+-	dm_dig->dig_min_0 = 0x25;
+-	dm_dig->dig_min_1 = 0x25;
+-	dm_dig->media_connect_0 = false;
+-	dm_dig->media_connect_1 = false;
+-	rtlpriv->dm.dm_initialgain_enable = true;
+-}
+-
+ static u8 rtl88e_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+@@ -1797,9 +1765,10 @@ static void rtl88e_dm_antenna_diversity(struct ieee80211_hw *hw)
+ void rtl88e_dm_init(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
++	u32 cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
+ 
+ 	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
+-	rtl88e_dm_diginit(hw);
++	rtl_dm_diginit(hw, cur_igvalue);
+ 	rtl88e_dm_init_dynamic_txpower(hw);
+ 	rtl88e_dm_init_edca_turbo(hw);
+ 	rtl88e_dm_init_rate_adaptive_mask(hw);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0041-rtlwifi-rtl8192c-common-Convert-driver-to-use-common.patch b/package/kernel/mac80211/patches/680-0041-rtlwifi-rtl8192c-common-Convert-driver-to-use-common.patch
new file mode 100644
index 0000000..b51dbcb
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0041-rtlwifi-rtl8192c-common-Convert-driver-to-use-common.patch
@@ -0,0 +1,411 @@
+From 3424a00fd559debf402559c226d9b1d895b94a5f Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:06 -0600
+Subject: [PATCH 41/51] rtlwifi: rtl8192c-common: Convert driver to use common
+ DM table initialization
+
+These changes convert both rtl8192ce and rtl8192cu to use the new routine.
+Some additional definitions are needed in the core, thus several of the
+headers for other drivers are affected, but no other executable code is
+changed.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/core.c               |  3 ++
+ drivers/net/wireless/rtlwifi/core.h               | 16 +++++++++
+ drivers/net/wireless/rtlwifi/rtl8188ee/dm.h       | 16 ---------
+ drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | 44 ++++-------------------
+ drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h | 16 ---------
+ drivers/net/wireless/rtlwifi/rtl8192de/dm.h       | 16 ---------
+ drivers/net/wireless/rtlwifi/rtl8192se/dm.h       |  8 -----
+ drivers/net/wireless/rtlwifi/rtl8723ae/dm.c       | 14 ++++----
+ drivers/net/wireless/rtlwifi/rtl8723ae/dm.h       | 16 ---------
+ drivers/net/wireless/rtlwifi/rtl8723be/dm.h       |  8 -----
+ drivers/net/wireless/rtlwifi/rtl8821ae/dm.h       | 16 ---------
+ 11 files changed, 33 insertions(+), 140 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
+index 5aa3ab3..eb20316 100644
+--- a/drivers/net/wireless/rtlwifi/core.c
++++ b/drivers/net/wireless/rtlwifi/core.c
+@@ -1878,6 +1878,7 @@ void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igvalue)
+ 	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
+ 
+ 	dm_digtable->dig_enable_flag = true;
++	dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
+ 	dm_digtable->cur_igvalue = cur_igvalue;
+ 	dm_digtable->pre_igvalue = 0;
+ 	dm_digtable->cur_sta_cstate = DIG_STA_DISCONNECT;
+@@ -1903,5 +1904,7 @@ void rtl_dm_diginit(struct ieee80211_hw *hw, u32 cur_igvalue)
+ 	dm_digtable->media_connect_1 = false;
+ 	rtlpriv->dm.dm_initialgain_enable = true;
+ 	dm_digtable->bt30_cur_igi = 0x32;
++	dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
++	dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_LOWRSSI;
+ }
+ EXPORT_SYMBOL(rtl_dm_diginit);
+diff --git a/drivers/net/wireless/rtlwifi/core.h b/drivers/net/wireless/rtlwifi/core.h
+index c0a0317..1cde356 100644
+--- a/drivers/net/wireless/rtlwifi/core.h
++++ b/drivers/net/wireless/rtlwifi/core.h
+@@ -46,6 +46,22 @@
+ #define DM_DIG_BACKOFF_MIN		-4
+ #define DM_DIG_BACKOFF_DEFAULT		10
+ 
++enum cck_packet_detection_threshold {
++	CCK_PD_STAGE_LOWRSSI = 0,
++	CCK_PD_STAGE_HIGHRSSI = 1,
++	CCK_FA_STAGE_LOW = 2,
++	CCK_FA_STAGE_HIGH = 3,
++	CCK_PD_STAGE_MAX = 4,
++};
++
++enum dm_dig_ext_port_alg_e {
++	DIG_EXT_PORT_STAGE_0 = 0,
++	DIG_EXT_PORT_STAGE_1 = 1,
++	DIG_EXT_PORT_STAGE_2 = 2,
++	DIG_EXT_PORT_STAGE_3 = 3,
++	DIG_EXT_PORT_STAGE_MAX = 4,
++};
++
+ enum dm_dig_connect_e {
+ 	DIG_STA_DISCONNECT,
+ 	DIG_STA_CONNECT,
+diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
+index 6217b7c..51ad3f9 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
+@@ -249,14 +249,6 @@ enum tag_dynamic_init_gain_operation_type_definition {
+ 	DIG_OP_TYPE_MAX
+ };
+ 
+-enum tag_cck_packet_detection_threshold_type_definition {
+-	CCK_PD_STAGE_LOWRSSI = 0,
+-	CCK_PD_STAGE_HIGHRSSI = 1,
+-	CCK_FA_STAGE_LOW = 2,
+-	CCK_FA_STAGE_HIGH = 3,
+-	CCK_PD_STAGE_MAX = 4,
+-};
+-
+ enum dm_1r_cca_e {
+ 	CCA_1R = 0,
+ 	CCA_2R = 1,
+@@ -275,14 +267,6 @@ enum dm_sw_ant_switch_e {
+ 	ANS_ANTENNA_MAX = 3,
+ };
+ 
+-enum dm_dig_ext_port_alg_e {
+-	DIG_EXT_PORT_STAGE_0 = 0,
+-	DIG_EXT_PORT_STAGE_1 = 1,
+-	DIG_EXT_PORT_STAGE_2 = 2,
+-	DIG_EXT_PORT_STAGE_3 = 3,
+-	DIG_EXT_PORT_STAGE_MAX = 4,
+-};
+-
+ enum pwr_track_control_method {
+ 	BBSWING,
+ 	TXAGC
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+index dabe18f..f5ee67c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+@@ -195,36 +195,6 @@ void dm_savepowerindex(struct ieee80211_hw *hw)
+ }
+ EXPORT_SYMBOL_GPL(dm_savepowerindex);
+ 
+-static void rtl92c_dm_diginit(struct ieee80211_hw *hw)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
+-
+-	dm_digtable->dig_enable_flag = true;
+-	dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
+-	dm_digtable->cur_igvalue = 0x20;
+-	dm_digtable->pre_igvalue = 0x0;
+-	dm_digtable->cursta_cstate = DIG_STA_DISCONNECT;
+-	dm_digtable->presta_cstate = DIG_STA_DISCONNECT;
+-	dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
+-	dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
+-	dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
+-	dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
+-	dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
+-	dm_digtable->rx_gain_max = DM_DIG_MAX;
+-	dm_digtable->rx_gain_min = DM_DIG_MIN;
+-	dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
+-	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
+-	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
+-	dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
+-	dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_LowRssi;
+-
+-	dm_digtable->forbidden_igi = DM_DIG_MIN;
+-	dm_digtable->large_fa_hit = 0;
+-	dm_digtable->recover_cnt = 0;
+-	dm_digtable->dig_min_0  = 0x25;
+-}
+-
+ static u8 rtl92c_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+@@ -508,27 +478,27 @@ static void rtl92c_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
+ 		if (dm_digtable->rssi_val_min > 100)
+ 			dm_digtable->rssi_val_min = 100;
+ 
+-		if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) {
++		if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LOWRSSI) {
+ 			if (dm_digtable->rssi_val_min <= 25)
+ 				dm_digtable->cur_cck_pd_state =
+-				    CCK_PD_STAGE_LowRssi;
++				    CCK_PD_STAGE_LOWRSSI;
+ 			else
+ 				dm_digtable->cur_cck_pd_state =
+-				    CCK_PD_STAGE_HighRssi;
++				    CCK_PD_STAGE_HIGHRSSI;
+ 		} else {
+ 			if (dm_digtable->rssi_val_min <= 20)
+ 				dm_digtable->cur_cck_pd_state =
+-				    CCK_PD_STAGE_LowRssi;
++				    CCK_PD_STAGE_LOWRSSI;
+ 			else
+ 				dm_digtable->cur_cck_pd_state =
+-				    CCK_PD_STAGE_HighRssi;
++				    CCK_PD_STAGE_HIGHRSSI;
+ 		}
+ 	} else {
+ 		dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
+ 	}
+ 
+ 	if (dm_digtable->pre_cck_pd_state != dm_digtable->cur_cck_pd_state) {
+-		if ((dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LowRssi) ||
++		if ((dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI) ||
+ 		    (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_MAX))
+ 			rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 0x83);
+ 		else
+@@ -1375,7 +1345,7 @@ void rtl92c_dm_init(struct ieee80211_hw *hw)
+ 	rtlpriv->dm.undec_sm_pwdb = -1;
+ 	rtlpriv->dm.undec_sm_cck = -1;
+ 	rtlpriv->dm.dm_initialgain_enable = true;
+-	rtl92c_dm_diginit(hw);
++	rtl_dm_diginit(hw, 0x20);
+ 
+ 	rtlpriv->dm.dm_flag |= HAL_DM_HIPWR_DISABLE;
+ 	rtl92c_dm_init_dynamic_txpower(hw);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
+index 55ebffd..4422e31 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.h
+@@ -110,14 +110,6 @@ enum tag_dynamic_init_gain_operation_type_definition {
+ 	DIG_OP_TYPE_MAX
+ };
+ 
+-enum tag_cck_packet_detection_threshold_type_definition {
+-	CCK_PD_STAGE_LowRssi = 0,
+-	CCK_PD_STAGE_HighRssi = 1,
+-	CCK_FA_STAGE_Low = 2,
+-	CCK_FA_STAGE_High = 3,
+-	CCK_PD_STAGE_MAX = 4,
+-};
+-
+ enum dm_1r_cca_e {
+ 	CCA_1R = 0,
+ 	CCA_2R = 1,
+@@ -136,14 +128,6 @@ enum dm_sw_ant_switch_e {
+ 	ANS_ANTENNA_MAX = 3,
+ };
+ 
+-enum dm_dig_ext_port_alg_e {
+-	DIG_EXT_PORT_STAGE_0 = 0,
+-	DIG_EXT_PORT_STAGE_1 = 1,
+-	DIG_EXT_PORT_STAGE_2 = 2,
+-	DIG_EXT_PORT_STAGE_3 = 3,
+-	DIG_EXT_PORT_STAGE_MAX = 4,
+-};
+-
+ void rtl92c_dm_init(struct ieee80211_hw *hw);
+ void rtl92c_dm_watchdog(struct ieee80211_hw *hw);
+ void rtl92c_dm_write_dig(struct ieee80211_hw *hw);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/dm.h b/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
+index d21b3bc..f2d318c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/dm.h
+@@ -95,14 +95,6 @@ enum tag_dynamic_init_gain_operation_type_definition {
+ 	DIG_OP_TYPE_MAX
+ };
+ 
+-enum tag_cck_packet_detection_threshold_type_definition {
+-	CCK_PD_STAGE_LOWRSSI = 0,
+-	CCK_PD_STAGE_HIGHRSSI = 1,
+-	CCK_FA_STAGE_LOW = 2,
+-	CCK_FA_STAGE_HIGH = 3,
+-	CCK_PD_STAGE_MAX = 4,
+-};
+-
+ enum dm_1r_cca {
+ 	CCA_1R = 0,
+ 	CCA_2R = 1,
+@@ -121,14 +113,6 @@ enum dm_sw_ant_switch {
+ 	ANS_ANTENNA_MAX = 3,
+ };
+ 
+-enum dm_dig_ext_port_alg {
+-	DIG_EXT_PORT_STAGE_0 = 0,
+-	DIG_EXT_PORT_STAGE_1 = 1,
+-	DIG_EXT_PORT_STAGE_2 = 2,
+-	DIG_EXT_PORT_STAGE_3 = 3,
+-	DIG_EXT_PORT_STAGE_MAX = 4,
+-};
+-
+ void rtl92d_dm_init(struct ieee80211_hw *hw);
+ void rtl92d_dm_watchdog(struct ieee80211_hw *hw);
+ void rtl92d_dm_init_edca_turbo(struct ieee80211_hw *hw);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/dm.h b/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
+index 7d778d3..be07d81 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
+@@ -54,14 +54,6 @@ enum dm_dig_sta {
+ 	DM_STA_DIG_MAX
+ };
+ 
+-enum dm_dig_ext_port_alg {
+-	DIG_EXT_PORT_STAGE_0 = 0,
+-	DIG_EXT_PORT_STAGE_1 = 1,
+-	DIG_EXT_PORT_STAGE_2 = 2,
+-	DIG_EXT_PORT_STAGE_3 = 3,
+-	DIG_EXT_PORT_STAGE_MAX = 4,
+-};
+-
+ enum dm_ratr_sta {
+ 	DM_RATR_STA_HIGH = 0,
+ 	DM_RATR_STA_MIDDLEHIGH = 1,
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
+index 80f4c54..8bd124c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
+@@ -396,30 +396,30 @@ static void rtl8723e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
+ 	if (dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
+ 		dm_digtable->rssi_val_min = rtl8723e_dm_initial_gain_min_pwdb(hw);
+ 
+-		if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) {
++		if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LOWRSSI) {
+ 			if (dm_digtable->rssi_val_min <= 25)
+ 				dm_digtable->cur_cck_pd_state =
+-				    CCK_PD_STAGE_LowRssi;
++				    CCK_PD_STAGE_LOWRSSI;
+ 			else
+ 				dm_digtable->cur_cck_pd_state =
+-				    CCK_PD_STAGE_HighRssi;
++				    CCK_PD_STAGE_HIGHRSSI;
+ 		} else {
+ 			if (dm_digtable->rssi_val_min <= 20)
+ 				dm_digtable->cur_cck_pd_state =
+-				    CCK_PD_STAGE_LowRssi;
++				    CCK_PD_STAGE_LOWRSSI;
+ 			else
+ 				dm_digtable->cur_cck_pd_state =
+-				    CCK_PD_STAGE_HighRssi;
++				    CCK_PD_STAGE_HIGHRSSI;
+ 		}
+ 	} else {
+ 		dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
+ 	}
+ 
+ 	if (dm_digtable->pre_cck_pd_state != dm_digtable->cur_cck_pd_state) {
+-		if (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LowRssi) {
++		if (dm_digtable->cur_cck_pd_state == CCK_PD_STAGE_LOWRSSI) {
+ 			if (rtlpriv->falsealm_cnt.cnt_cck_fail > 800)
+ 				dm_digtable->cur_cck_fa_state =
+-				    CCK_FA_STAGE_High;
++				    CCK_FA_STAGE_HIGH;
+ 			else
+ 				dm_digtable->cur_cck_fa_state =
+ 				    CCK_FA_STAGE_LOW;
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
+index c54024e..5711105 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
+@@ -95,14 +95,6 @@ enum tag_dynamic_init_gain_operation_type_definition {
+ 	DIG_OP_TYPE_MAX
+ };
+ 
+-enum tag_cck_packet_detection_threshold_type_definition {
+-	CCK_PD_STAGE_LowRssi = 0,
+-	CCK_PD_STAGE_HighRssi = 1,
+-	CCK_FA_STAGE_LOW = 2,
+-	CCK_FA_STAGE_High = 3,
+-	CCK_PD_STAGE_MAX = 4,
+-};
+-
+ enum dm_1r_cca_e {
+ 	CCA_1R = 0,
+ 	CCA_2R = 1,
+@@ -121,14 +113,6 @@ enum dm_sw_ant_switch_e {
+ 	ANS_ANTENNA_MAX = 3,
+ };
+ 
+-enum dm_dig_ext_port_alg_e {
+-	DIG_EXT_PORT_STAGE_0 = 0,
+-	DIG_EXT_PORT_STAGE_1 = 1,
+-	DIG_EXT_PORT_STAGE_2 = 2,
+-	DIG_EXT_PORT_STAGE_3 = 3,
+-	DIG_EXT_PORT_STAGE_MAX = 4,
+-};
+-
+ #define BT_RSSI_STATE_NORMAL_POWER      BIT_OFFSET_LEN_MASK_32(0, 1)
+ #define BT_RSSI_STATE_AMDPU_OFF         BIT_OFFSET_LEN_MASK_32(1, 1)
+ #define BT_RSSI_STATE_SPECIAL_LOW       BIT_OFFSET_LEN_MASK_32(2, 1)
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/dm.h b/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
+index f3e47ab..533b4f2 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
+@@ -239,14 +239,6 @@ enum dm_sw_ant_switch_e {
+ 	ANS_ANTENNA_MAX	= 3,
+ };
+ 
+-enum dm_dig_ext_port_alg_e {
+-	DIG_EXT_PORT_STAGE_0	= 0,
+-	DIG_EXT_PORT_STAGE_1	= 1,
+-	DIG_EXT_PORT_STAGE_2	= 2,
+-	DIG_EXT_PORT_STAGE_3	= 3,
+-	DIG_EXT_PORT_STAGE_MAX	= 4,
+-};
+-
+ enum pwr_track_control_method {
+ 	BBSWING,
+ 	TXAGC
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
+index f311887..5516557 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
+@@ -255,14 +255,6 @@ enum tag_dynamic_init_gain_operation_type_definition {
+ 	DIG_OP_TYPE_MAX
+ };
+ 
+-enum tag_cck_packet_detection_threshold_type_definition {
+-	CCK_PD_STAGE_LOWRSSI = 0,
+-	CCK_PD_STAGE_HIGHRSSI = 1,
+-	CCK_FA_STAGE_LOW = 2,
+-	CCK_FA_STAGE_HIGH = 3,
+-	CCK_PD_STAGE_MAX = 4,
+-};
+-
+ enum dm_1r_cca_e {
+ 	CCA_1R = 0,
+ 	CCA_2R = 1,
+@@ -281,14 +273,6 @@ enum dm_sw_ant_switch_e {
+ 	ANS_ANTENNA_MAX = 3,
+ };
+ 
+-enum dm_dig_ext_port_alg_e {
+-	DIG_EXT_PORT_STAGE_0 = 0,
+-	DIG_EXT_PORT_STAGE_1 = 1,
+-	DIG_EXT_PORT_STAGE_2 = 2,
+-	DIG_EXT_PORT_STAGE_3 = 3,
+-	DIG_EXT_PORT_STAGE_MAX = 4,
+-};
+-
+ enum pwr_track_control_method {
+ 	BBSWING,
+ 	TXAGC,
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0042-rtlwifi-rtl8192de-Convert-driver-to-use-common-DM-ta.patch b/package/kernel/mac80211/patches/680-0042-rtlwifi-rtl8192de-Convert-driver-to-use-common-DM-ta.patch
new file mode 100644
index 0000000..7b45006
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0042-rtlwifi-rtl8192de-Convert-driver-to-use-common-DM-ta.patch
@@ -0,0 +1,68 @@
+From 8b17c1f3a5e058952177339d0310f27a4fb42c13 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:07 -0600
+Subject: [PATCH 42/51] rtlwifi: rtl8192de: Convert driver to use common DM
+ table initialization
+
+This patch converts driver rtl8192de to use the common routine to
+initialize dm_digtable.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192de/dm.c | 32 +++--------------------------
+ 1 file changed, 3 insertions(+), 29 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/dm.c b/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
+index 75643ab..a1be5a6 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/dm.c
+@@ -156,34 +156,6 @@ static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
+ 	{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}     /* 32, -16.0dB */
+ };
+ 
+-static void rtl92d_dm_diginit(struct ieee80211_hw *hw)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	struct dig_t *de_digtable = &rtlpriv->dm_digtable;
+-
+-	de_digtable->dig_enable_flag = true;
+-	de_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
+-	de_digtable->cur_igvalue = 0x20;
+-	de_digtable->pre_igvalue = 0x0;
+-	de_digtable->cursta_cstate = DIG_STA_DISCONNECT;
+-	de_digtable->presta_cstate = DIG_STA_DISCONNECT;
+-	de_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
+-	de_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
+-	de_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
+-	de_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
+-	de_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
+-	de_digtable->rx_gain_max = DM_DIG_FA_UPPER;
+-	de_digtable->rx_gain_min = DM_DIG_FA_LOWER;
+-	de_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
+-	de_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
+-	de_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
+-	de_digtable->pre_cck_pd_state = CCK_PD_STAGE_LOWRSSI;
+-	de_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
+-	de_digtable->large_fa_hit = 0;
+-	de_digtable->recover_cnt = 0;
+-	de_digtable->forbidden_igi = DM_DIG_FA_LOWER;
+-}
+-
+ static void rtl92d_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
+ {
+ 	u32 ret_value;
+@@ -1306,7 +1278,9 @@ void rtl92d_dm_init(struct ieee80211_hw *hw)
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+ 
+ 	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
+-	rtl92d_dm_diginit(hw);
++	rtl_dm_diginit(hw, 0x20);
++	rtlpriv->dm_digtable.rx_gain_max = DM_DIG_FA_UPPER;
++	rtlpriv->dm_digtable.rx_gain_min = DM_DIG_FA_LOWER;
+ 	rtl92d_dm_init_dynamic_txpower(hw);
+ 	rtl92d_dm_init_edca_turbo(hw);
+ 	rtl92d_dm_init_rate_adaptive_mask(hw);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0043-rtlwifi-rtl8192ee-Convert-driver-to-use-common-DM-ta.patch b/package/kernel/mac80211/patches/680-0043-rtlwifi-rtl8192ee-Convert-driver-to-use-common-DM-ta.patch
new file mode 100644
index 0000000..b522d52
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0043-rtlwifi-rtl8192ee-Convert-driver-to-use-common-DM-ta.patch
@@ -0,0 +1,71 @@
+From 153cb55731b68ddf7b0ebaa55536b56d766b47e6 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:08 -0600
+Subject: [PATCH 43/51] rtlwifi: rtl8192ee: Convert driver to use common DM
+ table initialization
+
+Convert driver rtl8192ee to use the common routine to initialize
+dm_digtable.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192ee/dm.c | 32 ++---------------------------
+ 1 file changed, 2 insertions(+), 30 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
+index 70e58d1..459f3d0 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
+@@ -152,35 +152,6 @@ static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
+ 	{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}  /* 32, -16.0dB */
+ };
+ 
+-static void rtl92ee_dm_diginit(struct ieee80211_hw *hw)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
+-
+-	dm_dig->cur_igvalue = rtl_get_bbreg(hw, DM_REG_IGI_A_11N,
+-					    DM_BIT_IGI_11N);
+-	dm_dig->rssi_lowthresh = DM_DIG_THRESH_LOW;
+-	dm_dig->rssi_highthresh = DM_DIG_THRESH_HIGH;
+-	dm_dig->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
+-	dm_dig->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
+-	dm_dig->rx_gain_max = DM_DIG_MAX;
+-	dm_dig->rx_gain_min = DM_DIG_MIN;
+-	dm_dig->back_val = DM_DIG_BACKOFF_DEFAULT;
+-	dm_dig->back_range_max = DM_DIG_BACKOFF_MAX;
+-	dm_dig->back_range_min = DM_DIG_BACKOFF_MIN;
+-	dm_dig->pre_cck_cca_thres = 0xff;
+-	dm_dig->cur_cck_cca_thres = 0x83;
+-	dm_dig->forbidden_igi = DM_DIG_MIN;
+-	dm_dig->large_fa_hit = 0;
+-	dm_dig->recover_cnt = 0;
+-	dm_dig->dig_min_0 = DM_DIG_MIN;
+-	dm_dig->dig_min_1 = DM_DIG_MIN;
+-	dm_dig->media_connect_0 = false;
+-	dm_dig->media_connect_1 = false;
+-	rtlpriv->dm.dm_initialgain_enable = true;
+-	dm_dig->bt30_cur_igi = 0x32;
+-}
+-
+ static void rtl92ee_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
+ {
+ 	u32 ret_value;
+@@ -1089,10 +1060,11 @@ static void rtl92ee_dm_init_dynamic_atc_switch(struct ieee80211_hw *hw)
+ void rtl92ee_dm_init(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
++	u32 cur_igvalue = rtl_get_bbreg(hw, DM_REG_IGI_A_11N, DM_BIT_IGI_11N);
+ 
+ 	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
+ 
+-	rtl92ee_dm_diginit(hw);
++	rtl_dm_diginit(hw, cur_igvalue);
+ 	rtl92ee_dm_init_rate_adaptive_mask(hw);
+ 	rtl92ee_dm_init_primary_cca_check(hw);
+ 	rtl92ee_dm_init_edca_turbo(hw);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0044-rtlwifi-rtl8723ae-Convert-driver-to-use-common-DM-ta.patch b/package/kernel/mac80211/patches/680-0044-rtlwifi-rtl8723ae-Convert-driver-to-use-common-DM-ta.patch
new file mode 100644
index 0000000..2f29e77
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0044-rtlwifi-rtl8723ae-Convert-driver-to-use-common-DM-ta.patch
@@ -0,0 +1,62 @@
+From 3592c54b6c8e85a1713515f463379c6a97bf8009 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:09 -0600
+Subject: [PATCH 44/51] rtlwifi: rtl8723ae: Convert driver to use common DM
+ table initialization
+
+Convert driver rtl8723ae to use common routine rtl_dm_diginit().
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8723ae/dm.c | 27 +--------------------------
+ 1 file changed, 1 insertion(+), 26 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
+index 8bd124c..4c1c96c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
+@@ -147,31 +147,6 @@ static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
+ 	{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}
+ };
+ 
+-static void rtl8723e_dm_diginit(struct ieee80211_hw *hw)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
+-
+-	dm_digtable->dig_enable_flag = true;
+-	dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
+-	dm_digtable->cur_igvalue = 0x20;
+-	dm_digtable->pre_igvalue = 0x0;
+-	dm_digtable->cursta_cstate = DIG_STA_DISCONNECT;
+-	dm_digtable->presta_cstate = DIG_STA_DISCONNECT;
+-	dm_digtable->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
+-	dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
+-	dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
+-	dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
+-	dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
+-	dm_digtable->rx_gain_max = DM_DIG_MAX;
+-	dm_digtable->rx_gain_min = DM_DIG_MIN;
+-	dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
+-	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
+-	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
+-	dm_digtable->pre_cck_pd_state = CCK_PD_STAGE_MAX;
+-	dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
+-}
+-
+ static u8 rtl8723e_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+@@ -819,7 +794,7 @@ void rtl8723e_dm_init(struct ieee80211_hw *hw)
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+ 
+ 	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
+-	rtl8723e_dm_diginit(hw);
++	rtl_dm_diginit(hw, 0x20);
+ 	rtl8723_dm_init_dynamic_txpower(hw);
+ 	rtl8723_dm_init_edca_turbo(hw);
+ 	rtl8723e_dm_init_rate_adaptive_mask(hw);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0045-rtlwifi-rtl8723be-Convert-driver-to-use-common-DM-ta.patch b/package/kernel/mac80211/patches/680-0045-rtlwifi-rtl8723be-Convert-driver-to-use-common-DM-ta.patch
new file mode 100644
index 0000000..8c5e5ff
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0045-rtlwifi-rtl8723be-Convert-driver-to-use-common-DM-ta.patch
@@ -0,0 +1,69 @@
+From ac2f0baefab920a3f9117993eb1455b40b265ab5 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:10 -0600
+Subject: [PATCH 45/51] rtlwifi: rtl8723be: Convert driver to use common DM
+ table initialization
+
+Convert driver rtl8723be to use routine rtl_dm_diginit().
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8723be/dm.c | 32 ++---------------------------
+ 1 file changed, 2 insertions(+), 30 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/dm.c b/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
+index ddf45d9..2367e8f 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
+@@ -212,35 +212,6 @@ void rtl8723be_dm_txpower_track_adjust(struct ieee80211_hw *hw, u8 type,
+ 		(pwr_val << 16) | (pwr_val << 24);
+ }
+ 
+-static void rtl8723be_dm_diginit(struct ieee80211_hw *hw)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
+-
+-	dm_digtable->dig_enable_flag = true;
+-	dm_digtable->cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
+-	dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
+-	dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
+-	dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
+-	dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
+-	dm_digtable->rx_gain_max = DM_DIG_MAX;
+-	dm_digtable->rx_gain_min = DM_DIG_MIN;
+-	dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
+-	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
+-	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
+-	dm_digtable->pre_cck_cca_thres = 0xff;
+-	dm_digtable->cur_cck_cca_thres = 0x83;
+-	dm_digtable->forbidden_igi = DM_DIG_MIN;
+-	dm_digtable->large_fa_hit = 0;
+-	dm_digtable->recover_cnt = 0;
+-	dm_digtable->dig_min_0 = DM_DIG_MIN;
+-	dm_digtable->dig_min_1 = DM_DIG_MIN;
+-	dm_digtable->media_connect_0 = false;
+-	dm_digtable->media_connect_1 = false;
+-	rtlpriv->dm.dm_initialgain_enable = true;
+-	dm_digtable->bt30_cur_igi = 0x32;
+-}
+-
+ void rtl8723be_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+@@ -294,9 +265,10 @@ static void rtl8723be_dm_init_dynamic_atc_switch(struct ieee80211_hw *hw)
+ void rtl8723be_dm_init(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
++	u32 cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
+ 
+ 	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
+-	rtl8723be_dm_diginit(hw);
++	rtl_dm_diginit(hw, cur_igvalue);
+ 	rtl8723be_dm_init_rate_adaptive_mask(hw);
+ 	rtl8723_dm_init_edca_turbo(hw);
+ 	rtl8723_dm_init_dynamic_bb_powersaving(hw);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0046-rtlwifi-rtl8821ae-Convert-driver-to-use-common-DM-ta.patch b/package/kernel/mac80211/patches/680-0046-rtlwifi-rtl8821ae-Convert-driver-to-use-common-DM-ta.patch
new file mode 100644
index 0000000..7c49dcb
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0046-rtlwifi-rtl8821ae-Convert-driver-to-use-common-DM-ta.patch
@@ -0,0 +1,73 @@
+From 9259ee79208a95aa20a9824717a9f22b0a52cccd Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:11 -0600
+Subject: [PATCH 46/51] rtlwifi: rtl8821ae: Convert driver to use common DM
+ table initialization
+
+Convert driver to use routine rtl_dm_diginit().
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8821ae/dm.c | 31 ++---------------------------
+ 1 file changed, 2 insertions(+), 29 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
+index 4af4613..0b2082d 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
+@@ -520,34 +520,6 @@ void rtl8821ae_dm_initialize_txpower_tracking_thermalmeter(
+ 	}
+ }
+ 
+-static void rtl8821ae_dm_diginit(struct ieee80211_hw *hw)
+-{
+-	struct rtl_priv *rtlpriv = rtl_priv(hw);
+-	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
+-
+-	dm_digtable->cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
+-	dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
+-	dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
+-	dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
+-	dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
+-	dm_digtable->rx_gain_max = DM_DIG_MAX;
+-	dm_digtable->rx_gain_min = DM_DIG_MIN;
+-	dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
+-	dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
+-	dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
+-	dm_digtable->pre_cck_cca_thres = 0xff;
+-	dm_digtable->cur_cck_cca_thres = 0x83;
+-	dm_digtable->forbidden_igi = DM_DIG_MIN;
+-	dm_digtable->large_fa_hit = 0;
+-	dm_digtable->recover_cnt = 0;
+-	dm_digtable->dig_min_0 = DM_DIG_MIN;
+-	dm_digtable->dig_min_1 = DM_DIG_MIN;
+-	dm_digtable->media_connect_0 = false;
+-	dm_digtable->media_connect_1 = false;
+-	rtlpriv->dm.dm_initialgain_enable = true;
+-	dm_digtable->bt30_cur_igi = 0x32;
+-}
+-
+ void rtl8821ae_dm_init_edca_turbo(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+@@ -607,6 +579,7 @@ void rtl8821ae_dm_init(struct ieee80211_hw *hw)
+ {
+ 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+ 	struct rtl_phy *rtlphy = &rtlpriv->phy;
++	u32 cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
+ 
+ 	spin_lock(&rtlpriv->locks.iqk_lock);
+ 	rtlphy->lck_inprogress = false;
+@@ -614,7 +587,7 @@ void rtl8821ae_dm_init(struct ieee80211_hw *hw)
+ 
+ 	rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
+ 	rtl8821ae_dm_common_info_self_init(hw);
+-	rtl8821ae_dm_diginit(hw);
++	rtl_dm_diginit(hw, cur_igvalue);
+ 	rtl8821ae_dm_init_rate_adaptive_mask(hw);
+ 	rtl8821ae_dm_init_edca_turbo(hw);
+ 	rtl8821ae_dm_initialize_txpower_tracking_thermalmeter(hw);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0047-rtlwifi-Move-macro-definitions-to-core.patch b/package/kernel/mac80211/patches/680-0047-rtlwifi-Move-macro-definitions-to-core.patch
new file mode 100644
index 0000000..faf34c1
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0047-rtlwifi-Move-macro-definitions-to-core.patch
@@ -0,0 +1,140 @@
+From ed0fb7eb2b2d27a07610b75d1f3a68cc22716347 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger at lwfinger.net>
+Date: Tue, 6 Jan 2015 09:58:12 -0600
+Subject: [PATCH 47/51] rtlwifi: Move macro definitions to core
+
+Several of the drivers still were defining their own copies of various
+macros. These are all moved into the core.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/core.h         | 1 +
+ drivers/net/wireless/rtlwifi/rtl8188ee/dm.h | 3 ---
+ drivers/net/wireless/rtlwifi/rtl8192ee/dm.h | 3 ---
+ drivers/net/wireless/rtlwifi/rtl8192se/dm.c | 6 +++---
+ drivers/net/wireless/rtlwifi/rtl8192se/dm.h | 1 -
+ drivers/net/wireless/rtlwifi/rtl8723be/dm.h | 3 ---
+ drivers/net/wireless/rtlwifi/rtl8821ae/dm.h | 9 ---------
+ 7 files changed, 4 insertions(+), 22 deletions(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/core.h b/drivers/net/wireless/rtlwifi/core.h
+index 1cde356..7b64e34 100644
+--- a/drivers/net/wireless/rtlwifi/core.h
++++ b/drivers/net/wireless/rtlwifi/core.h
+@@ -42,6 +42,7 @@
+ 
+ #define DM_DIG_MAX			0x3e
+ #define DM_DIG_MIN			0x1e
++#define DM_DIG_MAX_AP			0x32
+ #define DM_DIG_BACKOFF_MAX		12
+ #define DM_DIG_BACKOFF_MIN		-4
+ #define DM_DIG_BACKOFF_DEFAULT		10
+diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
+index 51ad3f9..071ccee 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
+@@ -186,9 +186,6 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW				25
+ #define BW_AUTO_SWITCH_LOW_HIGH				30
+ 
+-#define DM_DIG_MAX_AP					0x32
+-#define DM_DIG_MIN_AP					0x20
+-
+ #define DM_DIG_FA_UPPER					0x3e
+ #define DM_DIG_FA_LOWER					0x1e
+ #define DM_DIG_FA_TH0					0x200
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h
+index 4880e19..107d5a4 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h
+@@ -189,9 +189,6 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW			25
+ #define BW_AUTO_SWITCH_LOW_HIGH			30
+ 
+-#define DM_DIG_MAX_AP				0x32
+-#define DM_DIG_MIN_AP				0x20
+-
+ #define DM_DIG_FA_UPPER				0x3e
+ #define DM_DIG_FA_LOWER				0x1e
+ #define DM_DIG_FA_TH0				0x200
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/dm.c b/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
+index 6cac70b..575980b 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/dm.c
+@@ -470,7 +470,7 @@ static void _rtl92s_dm_initial_gain_sta_beforeconnect(struct ieee80211_hw *hw)
+ 			if (digtable->backoff_enable_flag)
+ 				rtl92s_backoff_enable_flag(hw);
+ 			else
+-				digtable->back_val = DM_DIG_BACKOFF;
++				digtable->back_val = DM_DIG_BACKOFF_MAX;
+ 
+ 			if ((digtable->rssi_val + 10 - digtable->back_val) >
+ 				digtable->rx_gain_max)
+@@ -504,7 +504,7 @@ static void _rtl92s_dm_initial_gain_sta_beforeconnect(struct ieee80211_hw *hw)
+ 		digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
+ 		rtl92s_phy_set_fw_cmd(hw, FW_CMD_DIG_ENABLE);
+ 
+-		digtable->back_val = DM_DIG_BACKOFF;
++		digtable->back_val = DM_DIG_BACKOFF_MAX;
+ 		digtable->cur_igvalue = rtlpriv->phy.default_initialgain[0];
+ 		digtable->pre_igvalue = 0;
+ 		return;
+@@ -692,7 +692,7 @@ static void _rtl92s_dm_init_dig(struct ieee80211_hw *hw)
+ 
+ 	/* for dig debug rssi value */
+ 	digtable->rssi_val = 50;
+-	digtable->back_val = DM_DIG_BACKOFF;
++	digtable->back_val = DM_DIG_BACKOFF_MAX;
+ 	digtable->rx_gain_max = DM_DIG_MAX;
+ 
+ 	digtable->rx_gain_min = DM_DIG_MIN;
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/dm.h b/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
+index be07d81..de6ac79 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/dm.h
+@@ -83,7 +83,6 @@ enum dm_ratr_sta {
+ 
+ #define	DM_DIG_HIGH_PWR_THRESH_HIGH	75
+ #define	DM_DIG_HIGH_PWR_THRESH_LOW	70
+-#define	DM_DIG_BACKOFF			12
+ #define	DM_DIG_MIN_Netcore		0x12
+ 
+ void rtl92s_dm_watchdog(struct ieee80211_hw *hw);
+diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/dm.h b/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
+index 533b4f2..f752a2c 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
+@@ -180,9 +180,6 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW			25
+ #define BW_AUTO_SWITCH_LOW_HIGH			30
+ 
+-#define DM_DIG_MAX_AP				0x32
+-#define DM_DIG_MIN_AP				0x20
+-
+ #define DM_DIG_FA_UPPER				0x3e
+ #define DM_DIG_FA_LOWER				0x1e
+ #define DM_DIG_FA_TH0				0x200
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
+index 5516557..625a6bb 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
+@@ -187,15 +187,6 @@
+ #define BW_AUTO_SWITCH_HIGH_LOW		25
+ #define BW_AUTO_SWITCH_LOW_HIGH		30
+ 
+-#define DM_FALSEALARM_THRESH_LOW	400
+-#define DM_FALSEALARM_THRESH_HIGH	1000
+-
+-#define DM_DIG_MAX					0x3e
+-#define DM_DIG_MIN					0x1e
+-
+-#define DM_DIG_MAX_AP				0x32
+-#define DM_DIG_MIN_AP				0x20
+-
+ #define DM_DIG_FA_UPPER				0x3e
+ #define DM_DIG_FA_LOWER				0x1e
+ #define DM_DIG_FA_TH0				200
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0048-rtlwifi-rtl8192de-remove-redundant-else-if-check.patch b/package/kernel/mac80211/patches/680-0048-rtlwifi-rtl8192de-remove-redundant-else-if-check.patch
new file mode 100644
index 0000000..9457e6d
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0048-rtlwifi-rtl8192de-remove-redundant-else-if-check.patch
@@ -0,0 +1,46 @@
+From 59b23ebd7fd0af3facd174e96ee4dbc1494fa215 Mon Sep 17 00:00:00 2001
+From: Colin Ian King <colin.king at canonical.com>
+Date: Tue, 13 Jan 2015 14:07:34 +0000
+Subject: [PATCH 48/51] rtlwifi/rtl8192de: remove redundant else if check
+
+The else if check condition checks for the opposite of the
+if check, hence the else if check is redundant and can be
+replaced with a simple else:
+
+if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
+	..
+} else if (rtlpriv->rtlhal.macphymode != SINGLEMAC_SINGLEPHY) {
+	..
+}
+
+replaced with:
+
+if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
+	..
+} else {
+	..
+}
+
+Signed-off-by: Colin Ian King <colin.king at canonical.com>
+Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192de/hw.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/hw.c b/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
+index 280c3da..01bcc2d 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
+@@ -546,7 +546,7 @@ static bool _rtl92de_llt_table_init(struct ieee80211_hw *hw)
+ 		txpktbuf_bndy = 246;
+ 		value8 = 0;
+ 		value32 = 0x80bf0d29;
+-	} else if (rtlpriv->rtlhal.macphymode != SINGLEMAC_SINGLEPHY) {
++	} else {
+ 		maxPage = 127;
+ 		txpktbuf_bndy = 123;
+ 		value8 = 0;
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0049-rtlwifi-add-support-to-send-beacon-frame.patch b/package/kernel/mac80211/patches/680-0049-rtlwifi-add-support-to-send-beacon-frame.patch
new file mode 100644
index 0000000..d7e8abe
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0049-rtlwifi-add-support-to-send-beacon-frame.patch
@@ -0,0 +1,47 @@
+From 33511b157bbcebaef853cc1811992b664a2e5862 Mon Sep 17 00:00:00 2001
+From: Taehee Yoo <ap420073 at gmail.com>
+Date: Wed, 21 Jan 2015 16:58:19 +0900
+Subject: [PATCH 49/51] rtlwifi: add support to send beacon frame.
+
+In AP mode, beacon frame is necessary to keep connection.
+this patch adds a sending beacon frame routine in initialization routine.
+
+Signed-off-by: Taehee Yoo <ap420073 at gmail.com>
+Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/core.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
+index eb20316..a31a127 100644
+--- a/drivers/net/wireless/rtlwifi/core.c
++++ b/drivers/net/wireless/rtlwifi/core.c
+@@ -1010,6 +1010,16 @@ static int rtl_op_conf_tx(struct ieee80211_hw *hw,
+ 	return 0;
+ }
+ 
++static void send_beacon_frame(struct ieee80211_hw *hw,
++			      struct ieee80211_vif *vif)
++{
++	struct rtl_priv *rtlpriv = rtl_priv(hw);
++	struct sk_buff *skb = ieee80211_beacon_get(hw, vif);
++
++	if (skb)
++		rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, NULL);
++}
++
+ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
+ 				    struct ieee80211_vif *vif,
+ 				    struct ieee80211_bss_conf *bss_conf,
+@@ -1040,6 +1050,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
+ 
+ 				if (rtlpriv->cfg->ops->linked_set_reg)
+ 					rtlpriv->cfg->ops->linked_set_reg(hw);
++				send_beacon_frame(hw, vif);
+ 			}
+ 		}
+ 		if ((changed & BSS_CHANGED_BEACON_ENABLED &&
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0050-rtl8192cu-fix-the-mesh-beaconing.patch b/package/kernel/mac80211/patches/680-0050-rtl8192cu-fix-the-mesh-beaconing.patch
new file mode 100644
index 0000000..8254fde
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0050-rtl8192cu-fix-the-mesh-beaconing.patch
@@ -0,0 +1,31 @@
+From 0b70dc273c13da02241b5b9e76fca5a714bd2965 Mon Sep 17 00:00:00 2001
+From: Chun-Yeow Yeoh <yeohchunyeow at gmail.com>
+Date: Fri, 23 Jan 2015 16:59:24 +0800
+Subject: [PATCH 50/51] rtl8192cu: fix the mesh beaconing
+
+Patch "rtlwifi: add support to send beacon frame" allows
+the beaconing of rtl8192cu. But mesh beaconing is not
+working. Fix this.
+
+Signed-off-by: Chun-Yeow Yeoh <yeohchunyeow at gmail.com>
+Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+index 5513217..e5a7c4f 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+@@ -1509,6 +1509,7 @@ void rtl92cu_set_beacon_related_registers(struct ieee80211_hw *hw)
+ 	/* TODO: Modify later (Find the right parameters)
+ 	 * NOTE: Fix test chip's bug (about contention windows's randomness) */
+ 	if ((mac->opmode == NL80211_IFTYPE_ADHOC) ||
++	    (mac->opmode == NL80211_IFTYPE_MESH_POINT) ||
+ 	    (mac->opmode == NL80211_IFTYPE_AP)) {
+ 		rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x50);
+ 		rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x50);
+-- 
+2.2.2
+
diff --git a/package/kernel/mac80211/patches/680-0051-rtlwifi-rtl8192cu-Set-fw_ready-flag.patch b/package/kernel/mac80211/patches/680-0051-rtlwifi-rtl8192cu-Set-fw_ready-flag.patch
new file mode 100644
index 0000000..35074be
--- /dev/null
+++ b/package/kernel/mac80211/patches/680-0051-rtlwifi-rtl8192cu-Set-fw_ready-flag.patch
@@ -0,0 +1,38 @@
+From 314112e0023acddaae1b43d549bc03be29a146ce Mon Sep 17 00:00:00 2001
+From: Taehee Yoo <ap420073 at gmail.com>
+Date: Sat, 24 Jan 2015 20:55:40 +0900
+Subject: [PATCH 51/51] rtlwifi: rtl8192cu: Set fw_ready flag
+
+After rtl8192cu download firmware routine, set fw_ready flag.
+
+Signed-off-by: Taehee Yoo <ap420073 at gmail.com>
+Acked-by: Larry Finger <Larry.Finger at lwfinger.net>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+index e5a7c4f..fe4b699 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+@@ -1000,6 +1000,7 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)
+ 	local_save_flags(flags);
+ 	local_irq_enable();
+ 
++	rtlhal->fw_ready = false;
+ 	rtlhal->hw_type = HARDWARE_TYPE_RTL8192CU;
+ 	err = _rtl92cu_init_mac(hw);
+ 	if (err) {
+@@ -1013,6 +1014,8 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)
+ 		err = 1;
+ 		goto exit;
+ 	}
++
++	rtlhal->fw_ready = true;
+ 	rtlhal->last_hmeboxnum = 0; /* h2c */
+ 	_rtl92cu_phy_param_tab_init(hw);
+ 	rtl92cu_phy_mac_config(hw);
+-- 
+2.2.2
+
-- 
2.2.2

_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list