[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