aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
-rw-r--r--drivers/net/wireless/rtlwifi/base.c6
-rw-r--r--drivers/net/wireless/rtlwifi/debug.c6
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c19
-rw-r--r--drivers/net/wireless/rtlwifi/pci.h4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/def.h14
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/sw.c35
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/def.h4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/sw.c7
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/def.h135
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/hw.c15
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/sw.c21
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/hw.c22
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/reg.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/sw.c22
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/trx.c55
-rw-r--r--drivers/net/wireless/rtlwifi/wifi.h5
16 files changed, 233 insertions, 138 deletions
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
index 098fc557a88d..d4fdd2a5a739 100644
--- a/drivers/net/wireless/rtlwifi/base.c
+++ b/drivers/net/wireless/rtlwifi/base.c
@@ -311,6 +311,8 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
311 IEEE80211_HW_RX_INCLUDES_FCS | 311 IEEE80211_HW_RX_INCLUDES_FCS |
312 IEEE80211_HW_BEACON_FILTER | 312 IEEE80211_HW_BEACON_FILTER |
313 IEEE80211_HW_AMPDU_AGGREGATION | 313 IEEE80211_HW_AMPDU_AGGREGATION |
314 IEEE80211_HW_CONNECTION_MONITOR |
315 /* IEEE80211_HW_SUPPORTS_CQM_RSSI | */
314 IEEE80211_HW_REPORTS_TX_ACK_STATUS | 0; 316 IEEE80211_HW_REPORTS_TX_ACK_STATUS | 0;
315 317
316 /* swlps or hwlps has been set in diff chip in init_sw_vars */ 318 /* swlps or hwlps has been set in diff chip in init_sw_vars */
@@ -850,7 +852,7 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw,
850 *So tcb_desc->hw_rate is just used for 852 *So tcb_desc->hw_rate is just used for
851 *special data and mgt frames 853 *special data and mgt frames
852 */ 854 */
853 if (info->control.rates[0].idx == 0 && 855 if (info->control.rates[0].idx == 0 ||
854 ieee80211_is_nullfunc(fc)) { 856 ieee80211_is_nullfunc(fc)) {
855 tcb_desc->use_driver_rate = true; 857 tcb_desc->use_driver_rate = true;
856 tcb_desc->ratr_index = RATR_INX_WIRELESS_MC; 858 tcb_desc->ratr_index = RATR_INX_WIRELESS_MC;
@@ -1138,7 +1140,7 @@ void rtl_watchdog_wq_callback(void *data)
1138 } 1140 }
1139 1141
1140 /* 1142 /*
1141 *<3> to check if traffic busy, if 1143 *<2> to check if traffic busy, if
1142 * busytraffic we don't change channel 1144 * busytraffic we don't change channel
1143 */ 1145 */
1144 if (mac->link_state >= MAC80211_LINKED) { 1146 if (mac->link_state >= MAC80211_LINKED) {
diff --git a/drivers/net/wireless/rtlwifi/debug.c b/drivers/net/wireless/rtlwifi/debug.c
index b2f897acb238..1b5cb7153a52 100644
--- a/drivers/net/wireless/rtlwifi/debug.c
+++ b/drivers/net/wireless/rtlwifi/debug.c
@@ -28,17 +28,11 @@
28 28
29#include "wifi.h" 29#include "wifi.h"
30 30
31static unsigned int debug = DBG_EMERG;
32module_param(debug, uint, 0);
33MODULE_PARM_DESC(debug, "Set global debug level for rtlwifi (0,2-5)");
34
35void rtl_dbgp_flag_init(struct ieee80211_hw *hw) 31void rtl_dbgp_flag_init(struct ieee80211_hw *hw)
36{ 32{
37 struct rtl_priv *rtlpriv = rtl_priv(hw); 33 struct rtl_priv *rtlpriv = rtl_priv(hw);
38 u8 i; 34 u8 i;
39 35
40 rtlpriv->dbg.global_debuglevel = debug;
41
42 rtlpriv->dbg.global_debugcomponents = 36 rtlpriv->dbg.global_debugcomponents =
43 COMP_ERR | COMP_FW | COMP_INIT | COMP_RECV | COMP_SEND | 37 COMP_ERR | COMP_FW | COMP_INIT | COMP_RECV | COMP_SEND |
44 COMP_MLME | COMP_SCAN | COMP_INTR | COMP_LED | COMP_SEC | 38 COMP_MLME | COMP_SCAN | COMP_INTR | COMP_LED | COMP_SEC |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 9983fa18065a..5380f3b040ac 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -1993,36 +1993,25 @@ call rtl_mac_stop() from the mac80211
1993suspend function first, So there is 1993suspend function first, So there is
1994no need to call hw_disable here. 1994no need to call hw_disable here.
1995****************************************/ 1995****************************************/
1996int rtl_pci_suspend(struct pci_dev *pdev, pm_message_t state) 1996int rtl_pci_suspend(struct device *dev)
1997{ 1997{
1998 struct pci_dev *pdev = to_pci_dev(dev);
1998 struct ieee80211_hw *hw = pci_get_drvdata(pdev); 1999 struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1999 struct rtl_priv *rtlpriv = rtl_priv(hw); 2000 struct rtl_priv *rtlpriv = rtl_priv(hw);
2000 2001
2001 rtlpriv->cfg->ops->hw_suspend(hw); 2002 rtlpriv->cfg->ops->hw_suspend(hw);
2002 rtl_deinit_rfkill(hw); 2003 rtl_deinit_rfkill(hw);
2003 2004
2004 pci_save_state(pdev);
2005 pci_disable_device(pdev);
2006 pci_set_power_state(pdev, PCI_D3hot);
2007 return 0; 2005 return 0;
2008} 2006}
2009EXPORT_SYMBOL(rtl_pci_suspend); 2007EXPORT_SYMBOL(rtl_pci_suspend);
2010 2008
2011int rtl_pci_resume(struct pci_dev *pdev) 2009int rtl_pci_resume(struct device *dev)
2012{ 2010{
2013 int ret; 2011 struct pci_dev *pdev = to_pci_dev(dev);
2014 struct ieee80211_hw *hw = pci_get_drvdata(pdev); 2012 struct ieee80211_hw *hw = pci_get_drvdata(pdev);
2015 struct rtl_priv *rtlpriv = rtl_priv(hw); 2013 struct rtl_priv *rtlpriv = rtl_priv(hw);
2016 2014
2017 pci_set_power_state(pdev, PCI_D0);
2018 ret = pci_enable_device(pdev);
2019 if (ret) {
2020 RT_ASSERT(false, ("ERR: <======\n"));
2021 return ret;
2022 }
2023
2024 pci_restore_state(pdev);
2025
2026 rtlpriv->cfg->ops->hw_resume(hw); 2015 rtlpriv->cfg->ops->hw_resume(hw);
2027 rtl_init_rfkill(hw); 2016 rtl_init_rfkill(hw);
2028 return 0; 2017 return 0;
diff --git a/drivers/net/wireless/rtlwifi/pci.h b/drivers/net/wireless/rtlwifi/pci.h
index a24e505b202b..ebe0b42c0518 100644
--- a/drivers/net/wireless/rtlwifi/pci.h
+++ b/drivers/net/wireless/rtlwifi/pci.h
@@ -237,8 +237,8 @@ extern struct rtl_intf_ops rtl_pci_ops;
237int __devinit rtl_pci_probe(struct pci_dev *pdev, 237int __devinit rtl_pci_probe(struct pci_dev *pdev,
238 const struct pci_device_id *id); 238 const struct pci_device_id *id);
239void rtl_pci_disconnect(struct pci_dev *pdev); 239void rtl_pci_disconnect(struct pci_dev *pdev);
240int rtl_pci_suspend(struct pci_dev *pdev, pm_message_t state); 240int rtl_pci_suspend(struct device *dev);
241int rtl_pci_resume(struct pci_dev *pdev); 241int rtl_pci_resume(struct device *dev);
242 242
243static inline u8 pci_read8_sync(struct rtl_priv *rtlpriv, u32 addr) 243static inline u8 pci_read8_sync(struct rtl_priv *rtlpriv, u32 addr)
244{ 244{
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
index 11f43196e61d..9fc804d89d65 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
@@ -142,8 +142,22 @@ enum version_8192c {
142 VERSION_UNKNOWN = 0x88, 142 VERSION_UNKNOWN = 0x88,
143}; 143};
144 144
145#define CUT_VERSION_MASK (BIT(6)|BIT(7))
146#define CHIP_VENDOR_UMC BIT(5)
147#define CHIP_VENDOR_UMC_B_CUT BIT(6) /* Chip version for ECO */
148#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? \
149 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false)
145#define IS_CHIP_VER_B(version) ((version & CHIP_VER_B) ? true : false) 150#define IS_CHIP_VER_B(version) ((version & CHIP_VER_B) ? true : false)
151#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? \
152 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false)
146#define IS_92C_SERIAL(version) ((version & CHIP_92C_BITMASK) ? true : false) 153#define IS_92C_SERIAL(version) ((version & CHIP_92C_BITMASK) ? true : false)
154#define IS_CHIP_VENDOR_UMC(version) \
155 ((version & CHIP_VENDOR_UMC) ? true : false)
156#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
157#define IS_81xxC_VENDOR_UMC_B_CUT(version) \
158 ((IS_CHIP_VENDOR_UMC(version)) ? \
159 ((GET_CVID_CUT_VERSION(version) == CHIP_VENDOR_UMC_B_CUT) ? \
160 true : false) : false)
147 161
148enum rtl819x_loopback_e { 162enum rtl819x_loopback_e {
149 RTL819X_NO_LOOPBACK = 0, 163 RTL819X_NO_LOOPBACK = 0,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
index b7ecb9e44aa9..a48404cc2b96 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
@@ -92,6 +92,8 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
92 struct rtl_priv *rtlpriv = rtl_priv(hw); 92 struct rtl_priv *rtlpriv = rtl_priv(hw);
93 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 93 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
94 const struct firmware *firmware; 94 const struct firmware *firmware;
95 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
96 char *fw_name = NULL;
95 97
96 rtl8192ce_bt_reg_init(hw); 98 rtl8192ce_bt_reg_init(hw);
97 99
@@ -129,6 +131,8 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
129 131
130 rtlpci->irq_mask[1] = (u32) (IMR_CPWM | IMR_C2HCMD | 0); 132 rtlpci->irq_mask[1] = (u32) (IMR_CPWM | IMR_C2HCMD | 0);
131 133
134 /* for debug level */
135 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
132 /* for LPS & IPS */ 136 /* for LPS & IPS */
133 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; 137 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
134 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; 138 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
@@ -159,8 +163,14 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
159 } 163 }
160 164
161 /* request fw */ 165 /* request fw */
162 err = request_firmware(&firmware, rtlpriv->cfg->fw_name, 166 if (IS_VENDOR_UMC_A_CUT(rtlhal->version) &&
163 rtlpriv->io.dev); 167 !IS_92C_SERIAL(rtlhal->version))
168 fw_name = "rtlwifi/rtl8192cfwU.bin";
169 else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version))
170 fw_name = "rtlwifi/rtl8192cfwU_B.bin";
171 else
172 fw_name = rtlpriv->cfg->fw_name;
173 err = request_firmware(&firmware, fw_name, rtlpriv->io.dev);
164 if (err) { 174 if (err) {
165 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 175 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
166 ("Failed to request firmware!\n")); 176 ("Failed to request firmware!\n"));
@@ -245,6 +255,7 @@ static struct rtl_mod_params rtl92ce_mod_params = {
245 .inactiveps = true, 255 .inactiveps = true,
246 .swctrl_lps = false, 256 .swctrl_lps = false,
247 .fwctrl_lps = true, 257 .fwctrl_lps = true,
258 .debug = DBG_EMERG,
248}; 259};
249 260
250static struct rtl_hal_cfg rtl92ce_hal_cfg = { 261static struct rtl_hal_cfg rtl92ce_hal_cfg = {
@@ -355,8 +366,11 @@ MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
355MODULE_LICENSE("GPL"); 366MODULE_LICENSE("GPL");
356MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n PCI wireless"); 367MODULE_DESCRIPTION("Realtek 8192C/8188C 802.11n PCI wireless");
357MODULE_FIRMWARE("rtlwifi/rtl8192cfw.bin"); 368MODULE_FIRMWARE("rtlwifi/rtl8192cfw.bin");
369MODULE_FIRMWARE("rtlwifi/rtl8192cfwU.bin");
370MODULE_FIRMWARE("rtlwifi/rtl8192cfwU_B.bin");
358 371
359module_param_named(swenc, rtl92ce_mod_params.sw_crypto, bool, 0444); 372module_param_named(swenc, rtl92ce_mod_params.sw_crypto, bool, 0444);
373module_param_named(debug, rtl92ce_mod_params.debug, int, 0444);
360module_param_named(ips, rtl92ce_mod_params.inactiveps, bool, 0444); 374module_param_named(ips, rtl92ce_mod_params.inactiveps, bool, 0444);
361module_param_named(swlps, rtl92ce_mod_params.swctrl_lps, bool, 0444); 375module_param_named(swlps, rtl92ce_mod_params.swctrl_lps, bool, 0444);
362module_param_named(fwlps, rtl92ce_mod_params.fwctrl_lps, bool, 0444); 376module_param_named(fwlps, rtl92ce_mod_params.fwctrl_lps, bool, 0444);
@@ -364,18 +378,23 @@ MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
364MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); 378MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
365MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); 379MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
366MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n"); 380MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
381MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
382
383static const struct dev_pm_ops rtlwifi_pm_ops = {
384 .suspend = rtl_pci_suspend,
385 .resume = rtl_pci_resume,
386 .freeze = rtl_pci_suspend,
387 .thaw = rtl_pci_resume,
388 .poweroff = rtl_pci_suspend,
389 .restore = rtl_pci_resume,
390};
367 391
368static struct pci_driver rtl92ce_driver = { 392static struct pci_driver rtl92ce_driver = {
369 .name = KBUILD_MODNAME, 393 .name = KBUILD_MODNAME,
370 .id_table = rtl92ce_pci_ids, 394 .id_table = rtl92ce_pci_ids,
371 .probe = rtl_pci_probe, 395 .probe = rtl_pci_probe,
372 .remove = rtl_pci_disconnect, 396 .remove = rtl_pci_disconnect,
373 397 .driver.pm = &rtlwifi_pm_ops,
374#ifdef CONFIG_PM
375 .suspend = rtl_pci_suspend,
376 .resume = rtl_pci_resume,
377#endif
378
379}; 398};
380 399
381static int __init rtl92ce_module_init(void) 400static int __init rtl92ce_module_init(void)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/def.h b/drivers/net/wireless/rtlwifi/rtl8192cu/def.h
index c54940ea72fe..d097efb1e717 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/def.h
@@ -50,10 +50,6 @@
50#define IS_VENDOR_UMC(version) \ 50#define IS_VENDOR_UMC(version) \
51 (((version) & CHIP_VENDOR_UMC) ? true : false) 51 (((version) & CHIP_VENDOR_UMC) ? true : false)
52 52
53#define IS_VENDOR_UMC_A_CUT(version) \
54 (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT(6) | BIT(7))) ? \
55 false : true) : false)
56
57#define IS_VENDOR_8723_A_CUT(version) \ 53#define IS_VENDOR_8723_A_CUT(version) \
58 (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT(6))) ? \ 54 (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT(6))) ? \
59 false : true) : false) 55 false : true) : false)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
index 424b8a0323e2..feed1ed8d9b6 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
@@ -60,6 +60,7 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
60 rtlpriv->dm.dm_flag = 0; 60 rtlpriv->dm.dm_flag = 0;
61 rtlpriv->dm.disable_framebursting = 0; 61 rtlpriv->dm.disable_framebursting = 0;
62 rtlpriv->dm.thermalvalue = 0; 62 rtlpriv->dm.thermalvalue = 0;
63 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
63 rtlpriv->rtlhal.pfirmware = vmalloc(0x4000); 64 rtlpriv->rtlhal.pfirmware = vmalloc(0x4000);
64 if (!rtlpriv->rtlhal.pfirmware) { 65 if (!rtlpriv->rtlhal.pfirmware) {
65 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 66 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
@@ -149,8 +150,14 @@ static struct rtl_hal_ops rtl8192cu_hal_ops = {
149 150
150static struct rtl_mod_params rtl92cu_mod_params = { 151static struct rtl_mod_params rtl92cu_mod_params = {
151 .sw_crypto = 0, 152 .sw_crypto = 0,
153 .debug = DBG_EMERG,
152}; 154};
153 155
156module_param_named(swenc, rtl92cu_mod_params.sw_crypto, bool, 0444);
157module_param_named(debug, rtl92cu_mod_params.debug, int, 0444);
158MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
159MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
160
154static struct rtl_hal_usbint_cfg rtl92cu_interface_cfg = { 161static struct rtl_hal_usbint_cfg rtl92cu_interface_cfg = {
155 /* rx */ 162 /* rx */
156 .in_ep_num = RTL92C_USB_BULK_IN_NUM, 163 .in_ep_num = RTL92C_USB_BULK_IN_NUM,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/def.h b/drivers/net/wireless/rtlwifi/rtl8192de/def.h
index aff7e19714ff..946304771748 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/def.h
@@ -122,59 +122,98 @@
122#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \ 122#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
123 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12) 123 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
124 124
125/* 125enum version_8192d {
126 * 92D chip ver: 126 VERSION_TEST_CHIP_88C = 0x0000,
127 * BIT8: IS 92D 127 VERSION_TEST_CHIP_92C = 0x0020,
128 * BIT9: single phy 128 VERSION_TEST_UMC_CHIP_8723 = 0x0081,
129 * BIT10: C-cut 129 VERSION_NORMAL_TSMC_CHIP_88C = 0x0008,
130 * BIT11: D-cut 130 VERSION_NORMAL_TSMC_CHIP_92C = 0x0028,
131 */ 131 VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x0018,
132 132 VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x0088,
133/* Chip specific */ 133 VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x00a8,
134#define CHIP_92C BIT(0) 134 VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x0098,
135#define CHIP_92C_1T2R BIT(1) 135 VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x0089,
136#define CHIP_8723 BIT(2) /* RTL8723 With BT feature */ 136 VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x1089,
137#define CHIP_8723_DRV_REV BIT(3) /* RTL8723 Driver Revised */ 137 VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x1088,
138#define NORMAL_CHIP BIT(4) 138 VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x10a8,
139#define CHIP_VENDOR_UMC BIT(5) 139 VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x1090,
140#define CHIP_VENDOR_UMC_B_CUT BIT(6) /* Chip version for ECO */ 140 VERSION_TEST_CHIP_92D_SINGLEPHY = 0x0022,
141 VERSION_TEST_CHIP_92D_DUALPHY = 0x0002,
142 VERSION_NORMAL_CHIP_92D_SINGLEPHY = 0x002a,
143 VERSION_NORMAL_CHIP_92D_DUALPHY = 0x000a,
144 VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x202a,
145 VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x200a,
146 VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0x302a,
147 VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x300a,
148 VERSION_NORMAL_CHIP_92D_E_CUT_SINGLEPHY = 0x402a,
149 VERSION_NORMAL_CHIP_92D_E_CUT_DUALPHY = 0x400a,
150};
141 151
142/* for 92D */ 152/* for 92D */
143#define CHIP_92D BIT(8)
144#define CHIP_92D_SINGLEPHY BIT(9) 153#define CHIP_92D_SINGLEPHY BIT(9)
145#define CHIP_92D_C_CUT BIT(10) 154#define C_CUT_VERSION BIT(13)
146#define CHIP_92D_D_CUT BIT(11) 155#define D_CUT_VERSION ((BIT(12)|BIT(13)))
156#define E_CUT_VERSION BIT(14)
157
158/* Chip specific */
159#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
160#define CHIP_BONDING_92C_1T2R 0x1
161#define CHIP_BONDING_88C_USB_MCARD 0x2
162#define CHIP_BONDING_88C_USB_HP 0x1
163
164/* [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3 */
165/* [7] Manufacturer: TSMC=0, UMC=1 */
166/* [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2 */
167/* [3] Chip type: TEST=0, NORMAL=1 */
168/* [2:0] IC type: 81xxC=0, 8723=1, 92D=2 */
169#define CHIP_8723 BIT(0)
170#define CHIP_92D BIT(1)
171#define NORMAL_CHIP BIT(3)
172#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6)))
173#define RF_TYPE_1T2R BIT(4)
174#define RF_TYPE_2T2R BIT(5)
175#define CHIP_VENDOR_UMC BIT(7)
176#define B_CUT_VERSION BIT(12)
177
178/* MASK */
179#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2))
180#define CHIP_TYPE_MASK BIT(3)
181#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6))
182#define MANUFACTUER_MASK BIT(7)
183#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8))
184#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12))
147 185
148enum version_8192d {
149 VERSION_TEST_CHIP_88C = 0x00,
150 VERSION_TEST_CHIP_92C = 0x01,
151 VERSION_NORMAL_TSMC_CHIP_88C = 0x10,
152 VERSION_NORMAL_TSMC_CHIP_92C = 0x11,
153 VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x13,
154 VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x30,
155 VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x31,
156 VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x33,
157 VERSION_NORMA_UMC_CHIP_8723_1T1R_A_CUT = 0x34,
158 VERSION_NORMA_UMC_CHIP_8723_1T1R_B_CUT = 0x3c,
159 VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x70,
160 VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x71,
161 VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x73,
162 VERSION_TEST_CHIP_92D_SINGLEPHY = 0x300,
163 VERSION_TEST_CHIP_92D_DUALPHY = 0x100,
164 VERSION_NORMAL_CHIP_92D_SINGLEPHY = 0x310,
165 VERSION_NORMAL_CHIP_92D_DUALPHY = 0x110,
166 VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x710,
167 VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x510,
168 VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0xB10,
169 VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x910,
170};
171 186
172#define IS_92D_SINGLEPHY(version) \ 187/* Get element */
173 ((version & CHIP_92D_SINGLEPHY) ? true : false) 188#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK)
174#define IS_92D_C_CUT(version) \ 189#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK)
175 ((version & CHIP_92D_C_CUT) ? true : false) 190#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK)
176#define IS_92D_D_CUT(version) \ 191#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK)
177 ((version & CHIP_92D_D_CUT) ? true : false) 192#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
193#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
194
195#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version)) ? \
196 false : true)
197#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == \
198 RF_TYPE_1T2R) ? true : false)
199#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == \
200 RF_TYPE_2T2R) ? true : false)
201
202#define IS_92D_SINGLEPHY(version) ((IS_92D(version)) ? \
203 (IS_2T2R(version) ? true : false) : false)
204#define IS_92D(version) ((GET_CVID_IC_TYPE(version) == \
205 CHIP_92D) ? true : false)
206#define IS_92D_C_CUT(version) ((IS_92D(version)) ? \
207 ((GET_CVID_CUT_VERSION(version) == \
208 0x2000) ? true : false) : false)
209#define IS_92D_D_CUT(version) ((IS_92D(version)) ? \
210 ((GET_CVID_CUT_VERSION(version) == \
211 0x3000) ? true : false) : false)
212#define IS_92D_E_CUT(version) ((IS_92D(version)) ? \
213 ((GET_CVID_CUT_VERSION(version) == \
214 0x4000) ? true : false) : false)
215#define CHIP_92D_C_CUT BIT(10)
216#define CHIP_92D_D_CUT BIT(11)
178 217
179enum rf_optype { 218enum rf_optype {
180 RF_OP_BY_SW_3WIRE = 0, 219 RF_OP_BY_SW_3WIRE = 0,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/hw.c b/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
index 0073cf106af2..f5bd3a3cd34a 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
@@ -1608,17 +1608,16 @@ static void _rtl92de_read_txpower_info(struct ieee80211_hw *hw,
1608 tempval[0] = hwinfo[EEPROM_IQK_DELTA] & 0x03; 1608 tempval[0] = hwinfo[EEPROM_IQK_DELTA] & 0x03;
1609 tempval[1] = (hwinfo[EEPROM_LCK_DELTA] & 0x0C) >> 2; 1609 tempval[1] = (hwinfo[EEPROM_LCK_DELTA] & 0x0C) >> 2;
1610 rtlefuse->txpwr_fromeprom = true; 1610 rtlefuse->txpwr_fromeprom = true;
1611 if (IS_92D_D_CUT(rtlpriv->rtlhal.version)) { 1611 if (IS_92D_D_CUT(rtlpriv->rtlhal.version) ||
1612 IS_92D_E_CUT(rtlpriv->rtlhal.version)) {
1612 rtlefuse->internal_pa_5g[0] = 1613 rtlefuse->internal_pa_5g[0] =
1613 !((hwinfo[EEPROM_TSSI_A_5G] & 1614 !((hwinfo[EEPROM_TSSI_A_5G] & BIT(6)) >> 6);
1614 BIT(6)) >> 6);
1615 rtlefuse->internal_pa_5g[1] = 1615 rtlefuse->internal_pa_5g[1] =
1616 !((hwinfo[EEPROM_TSSI_B_5G] & 1616 !((hwinfo[EEPROM_TSSI_B_5G] & BIT(6)) >> 6);
1617 BIT(6)) >> 6); 1617 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1618 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1619 ("Is D cut,Internal PA0 %d Internal PA1 %d\n", 1618 ("Is D cut,Internal PA0 %d Internal PA1 %d\n",
1620 rtlefuse->internal_pa_5g[0], 1619 rtlefuse->internal_pa_5g[0],
1621 rtlefuse->internal_pa_5g[1])) 1620 rtlefuse->internal_pa_5g[1]))
1622 } 1621 }
1623 rtlefuse->eeprom_c9 = hwinfo[EEPROM_RF_OPT6]; 1622 rtlefuse->eeprom_c9 = hwinfo[EEPROM_RF_OPT6];
1624 rtlefuse->eeprom_cc = hwinfo[EEPROM_RF_OPT7]; 1623 rtlefuse->eeprom_cc = hwinfo[EEPROM_RF_OPT7];
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
index c681597c7f20..691f80092185 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
@@ -146,6 +146,8 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
146 146
147 rtlpci->irq_mask[1] = (u32) (IMR_CPWM | IMR_C2HCMD); 147 rtlpci->irq_mask[1] = (u32) (IMR_CPWM | IMR_C2HCMD);
148 148
149 /* for debug level */
150 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
149 /* for LPS & IPS */ 151 /* for LPS & IPS */
150 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; 152 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
151 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; 153 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
@@ -267,6 +269,7 @@ static struct rtl_mod_params rtl92de_mod_params = {
267 .inactiveps = true, 269 .inactiveps = true,
268 .swctrl_lps = true, 270 .swctrl_lps = true,
269 .fwctrl_lps = false, 271 .fwctrl_lps = false,
272 .debug = DBG_EMERG,
270}; 273};
271 274
272static struct rtl_hal_cfg rtl92de_hal_cfg = { 275static struct rtl_hal_cfg rtl92de_hal_cfg = {
@@ -377,6 +380,7 @@ MODULE_DESCRIPTION("Realtek 8192DE 802.11n Dual Mac PCI wireless");
377MODULE_FIRMWARE("rtlwifi/rtl8192defw.bin"); 380MODULE_FIRMWARE("rtlwifi/rtl8192defw.bin");
378 381
379module_param_named(swenc, rtl92de_mod_params.sw_crypto, bool, 0444); 382module_param_named(swenc, rtl92de_mod_params.sw_crypto, bool, 0444);
383module_param_named(debug, rtl92de_mod_params.debug, int, 0444);
380module_param_named(ips, rtl92de_mod_params.inactiveps, bool, 0444); 384module_param_named(ips, rtl92de_mod_params.inactiveps, bool, 0444);
381module_param_named(swlps, rtl92de_mod_params.swctrl_lps, bool, 0444); 385module_param_named(swlps, rtl92de_mod_params.swctrl_lps, bool, 0444);
382module_param_named(fwlps, rtl92de_mod_params.fwctrl_lps, bool, 0444); 386module_param_named(fwlps, rtl92de_mod_params.fwctrl_lps, bool, 0444);
@@ -384,18 +388,23 @@ MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
384MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); 388MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
385MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); 389MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
386MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n"); 390MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
391MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
392
393static const struct dev_pm_ops rtlwifi_pm_ops = {
394 .suspend = rtl_pci_suspend,
395 .resume = rtl_pci_resume,
396 .freeze = rtl_pci_suspend,
397 .thaw = rtl_pci_resume,
398 .poweroff = rtl_pci_suspend,
399 .restore = rtl_pci_resume,
400};
387 401
388static struct pci_driver rtl92de_driver = { 402static struct pci_driver rtl92de_driver = {
389 .name = KBUILD_MODNAME, 403 .name = KBUILD_MODNAME,
390 .id_table = rtl92de_pci_ids, 404 .id_table = rtl92de_pci_ids,
391 .probe = rtl_pci_probe, 405 .probe = rtl_pci_probe,
392 .remove = rtl_pci_disconnect, 406 .remove = rtl_pci_disconnect,
393 407 .driver.pm = &rtlwifi_pm_ops,
394#ifdef CONFIG_PM
395 .suspend = rtl_pci_suspend,
396 .resume = rtl_pci_resume,
397#endif
398
399}; 408};
400 409
401/* add global spin lock to solve the problem that 410/* add global spin lock to solve the problem that
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
index d59f66cb7768..c474486e3911 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
@@ -1382,7 +1382,7 @@ static void _rtl92se_power_domain_init(struct ieee80211_hw *hw)
1382 rtl_write_byte(rtlpriv, LDOA15_CTRL, 0x34); 1382 rtl_write_byte(rtlpriv, LDOA15_CTRL, 0x34);
1383 1383
1384 /* Reset MAC-IO and CPU and Core Digital BIT10/11/15 */ 1384 /* Reset MAC-IO and CPU and Core Digital BIT10/11/15 */
1385 tmpu1b = rtl_read_byte(rtlpriv, SYS_FUNC_EN + 1); 1385 tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1386 1386
1387 /* If IPS we need to turn LED on. So we not 1387 /* If IPS we need to turn LED on. So we not
1388 * not disable BIT 3/7 of reg3. */ 1388 * not disable BIT 3/7 of reg3. */
@@ -1391,7 +1391,7 @@ static void _rtl92se_power_domain_init(struct ieee80211_hw *hw)
1391 else 1391 else
1392 tmpu1b &= 0x73; 1392 tmpu1b &= 0x73;
1393 1393
1394 rtl_write_byte(rtlpriv, SYS_FUNC_EN + 1, tmpu1b); 1394 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmpu1b);
1395 /* wait for BIT 10/11/15 to pull high automatically!! */ 1395 /* wait for BIT 10/11/15 to pull high automatically!! */
1396 mdelay(1); 1396 mdelay(1);
1397 1397
@@ -1428,15 +1428,15 @@ static void _rtl92se_power_domain_init(struct ieee80211_hw *hw)
1428 rtl_write_byte(rtlpriv, LDOA15_CTRL, (tmpu1b | BIT(0))); 1428 rtl_write_byte(rtlpriv, LDOA15_CTRL, (tmpu1b | BIT(0)));
1429 1429
1430 /* Set Digital Vdd to Retention isolation Path. */ 1430 /* Set Digital Vdd to Retention isolation Path. */
1431 tmpu2b = rtl_read_word(rtlpriv, SYS_ISO_CTRL); 1431 tmpu2b = rtl_read_word(rtlpriv, REG_SYS_ISO_CTRL);
1432 rtl_write_word(rtlpriv, SYS_ISO_CTRL, (tmpu2b | BIT(11))); 1432 rtl_write_word(rtlpriv, REG_SYS_ISO_CTRL, (tmpu2b | BIT(11)));
1433 1433
1434 1434
1435 /* For warm reboot NIC disappera bug. */ 1435 /* For warm reboot NIC disappera bug. */
1436 tmpu2b = rtl_read_word(rtlpriv, SYS_FUNC_EN); 1436 tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
1437 rtl_write_word(rtlpriv, SYS_FUNC_EN, (tmpu2b | BIT(13))); 1437 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(13)));
1438 1438
1439 rtl_write_byte(rtlpriv, SYS_ISO_CTRL + 1, 0x68); 1439 rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL + 1, 0x68);
1440 1440
1441 /* Enable AFE PLL Macro Block */ 1441 /* Enable AFE PLL Macro Block */
1442 tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL); 1442 tmpu1b = rtl_read_byte(rtlpriv, AFE_PLL_CTRL);
@@ -1447,17 +1447,17 @@ static void _rtl92se_power_domain_init(struct ieee80211_hw *hw)
1447 mdelay(1); 1447 mdelay(1);
1448 1448
1449 /* Release isolation AFE PLL & MD */ 1449 /* Release isolation AFE PLL & MD */
1450 rtl_write_byte(rtlpriv, SYS_ISO_CTRL, 0xA6); 1450 rtl_write_byte(rtlpriv, REG_SYS_ISO_CTRL, 0xA6);
1451 1451
1452 /* Enable MAC clock */ 1452 /* Enable MAC clock */
1453 tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR); 1453 tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
1454 rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b | BIT(12) | BIT(11))); 1454 rtl_write_word(rtlpriv, SYS_CLKR, (tmpu2b | BIT(12) | BIT(11)));
1455 1455
1456 /* Enable Core digital and enable IOREG R/W */ 1456 /* Enable Core digital and enable IOREG R/W */
1457 tmpu2b = rtl_read_word(rtlpriv, SYS_FUNC_EN); 1457 tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
1458 rtl_write_word(rtlpriv, SYS_FUNC_EN, (tmpu2b | BIT(11))); 1458 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11)));
1459 /* enable REG_EN */ 1459 /* enable REG_EN */
1460 rtl_write_word(rtlpriv, SYS_FUNC_EN, (tmpu2b | BIT(11) | BIT(15))); 1460 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | BIT(11) | BIT(15)));
1461 1461
1462 /* Switch the control path. */ 1462 /* Switch the control path. */
1463 tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR); 1463 tmpu2b = rtl_read_word(rtlpriv, SYS_CLKR);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/reg.h b/drivers/net/wireless/rtlwifi/rtl8192se/reg.h
index ea32ef2d4098..11f125c030ce 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/reg.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/reg.h
@@ -735,6 +735,7 @@
735#define HWSET_MAX_SIZE_92S 128 735#define HWSET_MAX_SIZE_92S 128
736#define EFUSE_MAX_SECTION 16 736#define EFUSE_MAX_SECTION 16
737#define EFUSE_REAL_CONTENT_LEN 512 737#define EFUSE_REAL_CONTENT_LEN 512
738#define EFUSE_OOB_PROTECT_BYTES 15
738 739
739#define RTL8190_EEPROM_ID 0x8129 740#define RTL8190_EEPROM_ID 0x8129
740#define EEPROM_HPON 0x02 741#define EEPROM_HPON 0x02
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
index 24bd331a5484..3ec9a0d41baf 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
@@ -160,6 +160,8 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
160 160
161 rtlpci->first_init = true; 161 rtlpci->first_init = true;
162 162
163 /* for debug level */
164 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
163 /* for LPS & IPS */ 165 /* for LPS & IPS */
164 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; 166 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
165 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; 167 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
@@ -272,6 +274,7 @@ static struct rtl_mod_params rtl92se_mod_params = {
272 .inactiveps = true, 274 .inactiveps = true,
273 .swctrl_lps = true, 275 .swctrl_lps = true,
274 .fwctrl_lps = false, 276 .fwctrl_lps = false,
277 .debug = DBG_EMERG,
275}; 278};
276 279
277/* Because memory R/W bursting will cause system hang/crash 280/* Because memory R/W bursting will cause system hang/crash
@@ -304,6 +307,7 @@ static struct rtl_hal_cfg rtl92se_hal_cfg = {
304 .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE_92S, 307 .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE_92S,
305 .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION, 308 .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION,
306 .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN, 309 .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN,
310 .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES,
307 311
308 .maps[RWCAM] = REG_RWCAM, 312 .maps[RWCAM] = REG_RWCAM,
309 .maps[WCAMI] = REG_WCAMI, 313 .maps[WCAMI] = REG_WCAMI,
@@ -388,6 +392,7 @@ MODULE_DESCRIPTION("Realtek 8192S/8191S 802.11n PCI wireless");
388MODULE_FIRMWARE("rtlwifi/rtl8192sefw.bin"); 392MODULE_FIRMWARE("rtlwifi/rtl8192sefw.bin");
389 393
390module_param_named(swenc, rtl92se_mod_params.sw_crypto, bool, 0444); 394module_param_named(swenc, rtl92se_mod_params.sw_crypto, bool, 0444);
395module_param_named(debug, rtl92se_mod_params.debug, int, 0444);
391module_param_named(ips, rtl92se_mod_params.inactiveps, bool, 0444); 396module_param_named(ips, rtl92se_mod_params.inactiveps, bool, 0444);
392module_param_named(swlps, rtl92se_mod_params.swctrl_lps, bool, 0444); 397module_param_named(swlps, rtl92se_mod_params.swctrl_lps, bool, 0444);
393module_param_named(fwlps, rtl92se_mod_params.fwctrl_lps, bool, 0444); 398module_param_named(fwlps, rtl92se_mod_params.fwctrl_lps, bool, 0444);
@@ -395,18 +400,23 @@ MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
395MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); 400MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
396MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); 401MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
397MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n"); 402MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
403MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
404
405static const struct dev_pm_ops rtlwifi_pm_ops = {
406 .suspend = rtl_pci_suspend,
407 .resume = rtl_pci_resume,
408 .freeze = rtl_pci_suspend,
409 .thaw = rtl_pci_resume,
410 .poweroff = rtl_pci_suspend,
411 .restore = rtl_pci_resume,
412};
398 413
399static struct pci_driver rtl92se_driver = { 414static struct pci_driver rtl92se_driver = {
400 .name = KBUILD_MODNAME, 415 .name = KBUILD_MODNAME,
401 .id_table = rtl92se_pci_ids, 416 .id_table = rtl92se_pci_ids,
402 .probe = rtl_pci_probe, 417 .probe = rtl_pci_probe,
403 .remove = rtl_pci_disconnect, 418 .remove = rtl_pci_disconnect,
404 419 .driver.pm = &rtlwifi_pm_ops,
405#ifdef CONFIG_PM
406 .suspend = rtl_pci_suspend,
407 .resume = rtl_pci_resume,
408#endif
409
410}; 420};
411 421
412static int __init rtl92se_module_init(void) 422static int __init rtl92se_module_init(void)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
index ba137da082b5..fbebe3ea0a22 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
@@ -124,18 +124,15 @@ static void _rtl92se_query_rxphystatus(struct ieee80211_hw *hw,
124 u8 i, max_spatial_stream; 124 u8 i, max_spatial_stream;
125 u32 rssi, total_rssi = 0; 125 u32 rssi, total_rssi = 0;
126 bool in_powersavemode = false; 126 bool in_powersavemode = false;
127 bool is_cck_rate; 127 bool is_cck = pstats->is_cck;
128 128
129 is_cck_rate = SE_RX_HAL_IS_CCK_RATE(pdesc);
130 pstats->packet_matchbssid = packet_match_bssid; 129 pstats->packet_matchbssid = packet_match_bssid;
131 pstats->packet_toself = packet_toself; 130 pstats->packet_toself = packet_toself;
132 pstats->is_cck = is_cck_rate;
133 pstats->packet_beacon = packet_beacon; 131 pstats->packet_beacon = packet_beacon;
134 pstats->is_cck = is_cck_rate;
135 pstats->rx_mimo_signalquality[0] = -1; 132 pstats->rx_mimo_signalquality[0] = -1;
136 pstats->rx_mimo_signalquality[1] = -1; 133 pstats->rx_mimo_signalquality[1] = -1;
137 134
138 if (is_cck_rate) { 135 if (is_cck) {
139 u8 report, cck_highpwr; 136 u8 report, cck_highpwr;
140 cck_buf = (struct phy_sts_cck_8192s_t *)p_drvinfo; 137 cck_buf = (struct phy_sts_cck_8192s_t *)p_drvinfo;
141 138
@@ -246,9 +243,8 @@ static void _rtl92se_query_rxphystatus(struct ieee80211_hw *hw,
246 pstats->rxpower = rx_pwr_all; 243 pstats->rxpower = rx_pwr_all;
247 pstats->recvsignalpower = rx_pwr_all; 244 pstats->recvsignalpower = rx_pwr_all;
248 245
249 if (GET_RX_STATUS_DESC_RX_HT(pdesc) && 246 if (pstats->is_ht && pstats->rate >= DESC92_RATEMCS8 &&
250 GET_RX_STATUS_DESC_RX_MCS(pdesc) >= DESC92_RATEMCS8 && 247 pstats->rate <= DESC92_RATEMCS15)
251 GET_RX_STATUS_DESC_RX_MCS(pdesc) <= DESC92_RATEMCS15)
252 max_spatial_stream = 2; 248 max_spatial_stream = 2;
253 else 249 else
254 max_spatial_stream = 1; 250 max_spatial_stream = 1;
@@ -266,7 +262,7 @@ static void _rtl92se_query_rxphystatus(struct ieee80211_hw *hw,
266 } 262 }
267 } 263 }
268 264
269 if (is_cck_rate) 265 if (is_cck)
270 pstats->signalstrength = (u8)(_rtl92se_signal_scale_mapping(hw, 266 pstats->signalstrength = (u8)(_rtl92se_signal_scale_mapping(hw,
271 pwdb_all)); 267 pwdb_all));
272 else if (rf_rx_num != 0) 268 else if (rf_rx_num != 0)
@@ -518,6 +514,8 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
518{ 514{
519 struct rx_fwinfo *p_drvinfo; 515 struct rx_fwinfo *p_drvinfo;
520 u32 phystatus = (u32)GET_RX_STATUS_DESC_PHY_STATUS(pdesc); 516 u32 phystatus = (u32)GET_RX_STATUS_DESC_PHY_STATUS(pdesc);
517 struct ieee80211_hdr *hdr;
518 bool first_ampdu = false;
521 519
522 stats->length = (u16)GET_RX_STATUS_DESC_PKT_LEN(pdesc); 520 stats->length = (u16)GET_RX_STATUS_DESC_PKT_LEN(pdesc);
523 stats->rx_drvinfo_size = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE(pdesc) * 8; 521 stats->rx_drvinfo_size = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE(pdesc) * 8;
@@ -530,8 +528,12 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
530 stats->rate = (u8)GET_RX_STATUS_DESC_RX_MCS(pdesc); 528 stats->rate = (u8)GET_RX_STATUS_DESC_RX_MCS(pdesc);
531 stats->shortpreamble = (u16)GET_RX_STATUS_DESC_SPLCP(pdesc); 529 stats->shortpreamble = (u16)GET_RX_STATUS_DESC_SPLCP(pdesc);
532 stats->isampdu = (bool)(GET_RX_STATUS_DESC_PAGGR(pdesc) == 1); 530 stats->isampdu = (bool)(GET_RX_STATUS_DESC_PAGGR(pdesc) == 1);
531 stats->isfirst_ampdu = (bool) ((GET_RX_STATUS_DESC_PAGGR(pdesc) == 1)
532 && (GET_RX_STATUS_DESC_FAGGR(pdesc) == 1));
533 stats->timestamp_low = GET_RX_STATUS_DESC_TSFL(pdesc); 533 stats->timestamp_low = GET_RX_STATUS_DESC_TSFL(pdesc);
534 stats->rx_is40Mhzpacket = (bool)GET_RX_STATUS_DESC_BW(pdesc); 534 stats->rx_is40Mhzpacket = (bool)GET_RX_STATUS_DESC_BW(pdesc);
535 stats->is_ht = (bool)GET_RX_STATUS_DESC_RX_HT(pdesc);
536 stats->is_cck = SE_RX_HAL_IS_CCK_RATE(pdesc);
535 537
536 if (stats->hwerror) 538 if (stats->hwerror)
537 return false; 539 return false;
@@ -539,30 +541,39 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
539 rx_status->freq = hw->conf.channel->center_freq; 541 rx_status->freq = hw->conf.channel->center_freq;
540 rx_status->band = hw->conf.channel->band; 542 rx_status->band = hw->conf.channel->band;
541 543
542 if (GET_RX_STATUS_DESC_CRC32(pdesc)) 544 hdr = (struct ieee80211_hdr *)(skb->data + stats->rx_drvinfo_size
543 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; 545 + stats->rx_bufshift);
544 546
545 if (!GET_RX_STATUS_DESC_SWDEC(pdesc)) 547 if (stats->crc)
546 rx_status->flag |= RX_FLAG_DECRYPTED; 548 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
547 549
548 if (GET_RX_STATUS_DESC_BW(pdesc)) 550 if (stats->rx_is40Mhzpacket)
549 rx_status->flag |= RX_FLAG_40MHZ; 551 rx_status->flag |= RX_FLAG_40MHZ;
550 552
551 if (GET_RX_STATUS_DESC_RX_HT(pdesc)) 553 if (stats->is_ht)
552 rx_status->flag |= RX_FLAG_HT; 554 rx_status->flag |= RX_FLAG_HT;
553 555
554 rx_status->flag |= RX_FLAG_MACTIME_MPDU; 556 rx_status->flag |= RX_FLAG_MACTIME_MPDU;
555 557
556 if (stats->decrypted) 558 /* hw will set stats->decrypted true, if it finds the
557 rx_status->flag |= RX_FLAG_DECRYPTED; 559 * frame is open data frame or mgmt frame,
560 * hw will not decrypt robust managment frame
561 * for IEEE80211w but still set stats->decrypted
562 * true, so here we should set it back to undecrypted
563 * for IEEE80211w frame, and mac80211 sw will help
564 * to decrypt it */
565 if (stats->decrypted) {
566 if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
567 (ieee80211_has_protected(hdr->frame_control)))
568 rx_status->flag &= ~RX_FLAG_DECRYPTED;
569 else
570 rx_status->flag |= RX_FLAG_DECRYPTED;
571 }
558 572
559 rx_status->rate_idx = rtlwifi_rate_mapping(hw, 573 rx_status->rate_idx = rtlwifi_rate_mapping(hw,
560 (bool)GET_RX_STATUS_DESC_RX_HT(pdesc), 574 stats->is_ht, stats->rate, first_ampdu);
561 (u8)GET_RX_STATUS_DESC_RX_MCS(pdesc),
562 (bool)GET_RX_STATUS_DESC_PAGGR(pdesc));
563
564 575
565 rx_status->mactime = GET_RX_STATUS_DESC_TSFL(pdesc); 576 rx_status->mactime = stats->timestamp_low;
566 if (phystatus) { 577 if (phystatus) {
567 p_drvinfo = (struct rx_fwinfo *)(skb->data + 578 p_drvinfo = (struct rx_fwinfo *)(skb->data +
568 stats->rx_bufshift); 579 stats->rx_bufshift);
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
index 3126485393d9..713c7ddba8eb 100644
--- a/drivers/net/wireless/rtlwifi/wifi.h
+++ b/drivers/net/wireless/rtlwifi/wifi.h
@@ -450,6 +450,7 @@ enum rtl_var_map {
450 EFUSE_HWSET_MAX_SIZE, 450 EFUSE_HWSET_MAX_SIZE,
451 EFUSE_MAX_SECTION_MAP, 451 EFUSE_MAX_SECTION_MAP,
452 EFUSE_REAL_CONTENT_SIZE, 452 EFUSE_REAL_CONTENT_SIZE,
453 EFUSE_OOB_PROTECT_BYTES_LEN,
453 454
454 /*CAM map */ 455 /*CAM map */
455 RWCAM, 456 RWCAM,
@@ -1324,6 +1325,7 @@ struct rtl_stats {
1324 s8 rx_mimo_signalquality[2]; 1325 s8 rx_mimo_signalquality[2];
1325 bool packet_matchbssid; 1326 bool packet_matchbssid;
1326 bool is_cck; 1327 bool is_cck;
1328 bool is_ht;
1327 bool packet_toself; 1329 bool packet_toself;
1328 bool packet_beacon; /*for rssi */ 1330 bool packet_beacon; /*for rssi */
1329 char cck_adc_pwdb[4]; /*for rx path selection */ 1331 char cck_adc_pwdb[4]; /*for rx path selection */
@@ -1485,6 +1487,9 @@ struct rtl_mod_params {
1485 /* default: 0 = using hardware encryption */ 1487 /* default: 0 = using hardware encryption */
1486 int sw_crypto; 1488 int sw_crypto;
1487 1489
1490 /* default: 0 = DBG_EMERG (0)*/
1491 int debug;
1492
1488 /* default: 1 = using no linked power save */ 1493 /* default: 1 = using no linked power save */
1489 bool inactiveps; 1494 bool inactiveps;
1490 1495