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/Kconfig4
-rw-r--r--drivers/net/wireless/rtlwifi/base.c10
-rw-r--r--drivers/net/wireless/rtlwifi/base.h2
-rw-r--r--drivers/net/wireless/rtlwifi/cam.c1
-rw-r--r--drivers/net/wireless/rtlwifi/efuse.c1
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c37
-rw-r--r--drivers/net/wireless/rtlwifi/ps.c21
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c63
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h23
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/main.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/phy.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/sw.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/hw.c9
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/mac.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/phy.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/sw.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/trx.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/phy.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/sw.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/phy.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/sw.c1
-rw-r--r--drivers/net/wireless/rtlwifi/usb.c56
-rw-r--r--drivers/net/wireless/rtlwifi/wifi.h13
25 files changed, 177 insertions, 81 deletions
diff --git a/drivers/net/wireless/rtlwifi/Kconfig b/drivers/net/wireless/rtlwifi/Kconfig
index 45e14760c16e..d6c42e69bdbd 100644
--- a/drivers/net/wireless/rtlwifi/Kconfig
+++ b/drivers/net/wireless/rtlwifi/Kconfig
@@ -12,7 +12,7 @@ config RTL8192CE
12 12
13config RTL8192SE 13config RTL8192SE
14 tristate "Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter" 14 tristate "Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter"
15 depends on MAC80211 && EXPERIMENTAL 15 depends on MAC80211 && EXPERIMENTAL && PCI
16 select FW_LOADER 16 select FW_LOADER
17 select RTLWIFI 17 select RTLWIFI
18 ---help--- 18 ---help---
@@ -23,7 +23,7 @@ config RTL8192SE
23 23
24config RTL8192DE 24config RTL8192DE
25 tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter" 25 tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter"
26 depends on MAC80211 && EXPERIMENTAL 26 depends on MAC80211 && EXPERIMENTAL && PCI
27 select FW_LOADER 27 select FW_LOADER
28 select RTLWIFI 28 select RTLWIFI
29 ---help--- 29 ---help---
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
index d4fdd2a5a739..d81a6021a30f 100644
--- a/drivers/net/wireless/rtlwifi/base.c
+++ b/drivers/net/wireless/rtlwifi/base.c
@@ -30,6 +30,7 @@
30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 31
32#include <linux/ip.h> 32#include <linux/ip.h>
33#include <linux/module.h>
33#include "wifi.h" 34#include "wifi.h"
34#include "rc.h" 35#include "rc.h"
35#include "base.h" 36#include "base.h"
@@ -344,9 +345,9 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
344 if (is_valid_ether_addr(rtlefuse->dev_addr)) { 345 if (is_valid_ether_addr(rtlefuse->dev_addr)) {
345 SET_IEEE80211_PERM_ADDR(hw, rtlefuse->dev_addr); 346 SET_IEEE80211_PERM_ADDR(hw, rtlefuse->dev_addr);
346 } else { 347 } else {
347 u8 rtlmac[] = { 0x00, 0xe0, 0x4c, 0x81, 0x92, 0x00 }; 348 u8 rtlmac1[] = { 0x00, 0xe0, 0x4c, 0x81, 0x92, 0x00 };
348 get_random_bytes((rtlmac + (ETH_ALEN - 1)), 1); 349 get_random_bytes((rtlmac1 + (ETH_ALEN - 1)), 1);
349 SET_IEEE80211_PERM_ADDR(hw, rtlmac); 350 SET_IEEE80211_PERM_ADDR(hw, rtlmac1);
350 } 351 }
351 352
352} 353}
@@ -447,12 +448,11 @@ int rtl_init_core(struct ieee80211_hw *hw)
447 448
448 /* <4> locks */ 449 /* <4> locks */
449 mutex_init(&rtlpriv->locks.conf_mutex); 450 mutex_init(&rtlpriv->locks.conf_mutex);
450 spin_lock_init(&rtlpriv->locks.ips_lock); 451 mutex_init(&rtlpriv->locks.ps_mutex);
451 spin_lock_init(&rtlpriv->locks.irq_th_lock); 452 spin_lock_init(&rtlpriv->locks.irq_th_lock);
452 spin_lock_init(&rtlpriv->locks.h2c_lock); 453 spin_lock_init(&rtlpriv->locks.h2c_lock);
453 spin_lock_init(&rtlpriv->locks.rf_ps_lock); 454 spin_lock_init(&rtlpriv->locks.rf_ps_lock);
454 spin_lock_init(&rtlpriv->locks.rf_lock); 455 spin_lock_init(&rtlpriv->locks.rf_lock);
455 spin_lock_init(&rtlpriv->locks.lps_lock);
456 spin_lock_init(&rtlpriv->locks.waitq_lock); 456 spin_lock_init(&rtlpriv->locks.waitq_lock);
457 spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock); 457 spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock);
458 458
diff --git a/drivers/net/wireless/rtlwifi/base.h b/drivers/net/wireless/rtlwifi/base.h
index 4ae905983d0d..f66b5757f6b9 100644
--- a/drivers/net/wireless/rtlwifi/base.h
+++ b/drivers/net/wireless/rtlwifi/base.h
@@ -76,7 +76,7 @@ enum ap_peer {
76 SET_BITS_TO_LE_2BYTE(_hdr, 8, 1, _val) 76 SET_BITS_TO_LE_2BYTE(_hdr, 8, 1, _val)
77 77
78#define SET_80211_PS_POLL_AID(_hdr, _val) \ 78#define SET_80211_PS_POLL_AID(_hdr, _val) \
79 (*(u16 *)((u8 *)(_hdr) + 2) = le16_to_cpu(_val)) 79 (*(u16 *)((u8 *)(_hdr) + 2) = _val)
80#define SET_80211_PS_POLL_BSSID(_hdr, _val) \ 80#define SET_80211_PS_POLL_BSSID(_hdr, _val) \
81 memcpy(((u8 *)(_hdr)) + 4, (u8 *)(_val), ETH_ALEN) 81 memcpy(((u8 *)(_hdr)) + 4, (u8 *)(_val), ETH_ALEN)
82#define SET_80211_PS_POLL_TA(_hdr, _val) \ 82#define SET_80211_PS_POLL_TA(_hdr, _val) \
diff --git a/drivers/net/wireless/rtlwifi/cam.c b/drivers/net/wireless/rtlwifi/cam.c
index 7babb6acd957..dc36d7461caa 100644
--- a/drivers/net/wireless/rtlwifi/cam.c
+++ b/drivers/net/wireless/rtlwifi/cam.c
@@ -29,6 +29,7 @@
29 29
30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 31
32#include <linux/export.h>
32#include "wifi.h" 33#include "wifi.h"
33#include "cam.h" 34#include "cam.h"
34 35
diff --git a/drivers/net/wireless/rtlwifi/efuse.c b/drivers/net/wireless/rtlwifi/efuse.c
index 3fc21f60bb04..ed1058b71587 100644
--- a/drivers/net/wireless/rtlwifi/efuse.c
+++ b/drivers/net/wireless/rtlwifi/efuse.c
@@ -27,6 +27,7 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include <linux/export.h>
30#include "wifi.h" 31#include "wifi.h"
31#include "efuse.h" 32#include "efuse.h"
32 33
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 177a8e669241..0d4d242849b4 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -27,6 +27,7 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include <linux/export.h>
30#include "core.h" 31#include "core.h"
31#include "wifi.h" 32#include "wifi.h"
32#include "pci.h" 33#include "pci.h"
@@ -609,7 +610,7 @@ tx_status_ok:
609 if (((rtlpriv->link_info.num_rx_inperiod + 610 if (((rtlpriv->link_info.num_rx_inperiod +
610 rtlpriv->link_info.num_tx_inperiod) > 8) || 611 rtlpriv->link_info.num_tx_inperiod) > 8) ||
611 (rtlpriv->link_info.num_rx_inperiod > 2)) { 612 (rtlpriv->link_info.num_rx_inperiod > 2)) {
612 tasklet_schedule(&rtlpriv->works.ips_leave_tasklet); 613 schedule_work(&rtlpriv->works.lps_leave_work);
613 } 614 }
614} 615}
615 616
@@ -735,7 +736,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
735 if (((rtlpriv->link_info.num_rx_inperiod + 736 if (((rtlpriv->link_info.num_rx_inperiod +
736 rtlpriv->link_info.num_tx_inperiod) > 8) || 737 rtlpriv->link_info.num_tx_inperiod) > 8) ||
737 (rtlpriv->link_info.num_rx_inperiod > 2)) { 738 (rtlpriv->link_info.num_rx_inperiod > 2)) {
738 tasklet_schedule(&rtlpriv->works.ips_leave_tasklet); 739 schedule_work(&rtlpriv->works.lps_leave_work);
739 } 740 }
740 741
741 dev_kfree_skb_any(skb); 742 dev_kfree_skb_any(skb);
@@ -779,6 +780,7 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
779 unsigned long flags; 780 unsigned long flags;
780 u32 inta = 0; 781 u32 inta = 0;
781 u32 intb = 0; 782 u32 intb = 0;
783 irqreturn_t ret = IRQ_HANDLED;
782 784
783 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 785 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
784 786
@@ -786,8 +788,10 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
786 rtlpriv->cfg->ops->interrupt_recognized(hw, &inta, &intb); 788 rtlpriv->cfg->ops->interrupt_recognized(hw, &inta, &intb);
787 789
788 /*Shared IRQ or HW disappared */ 790 /*Shared IRQ or HW disappared */
789 if (!inta || inta == 0xffff) 791 if (!inta || inta == 0xffff) {
792 ret = IRQ_NONE;
790 goto done; 793 goto done;
794 }
791 795
792 /*<1> beacon related */ 796 /*<1> beacon related */
793 if (inta & rtlpriv->cfg->maps[RTL_IMR_TBDOK]) { 797 if (inta & rtlpriv->cfg->maps[RTL_IMR_TBDOK]) {
@@ -889,12 +893,9 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
889 if (rtlpriv->rtlhal.earlymode_enable) 893 if (rtlpriv->rtlhal.earlymode_enable)
890 tasklet_schedule(&rtlpriv->works.irq_tasklet); 894 tasklet_schedule(&rtlpriv->works.irq_tasklet);
891 895
892 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
893 return IRQ_HANDLED;
894
895done: 896done:
896 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 897 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
897 return IRQ_HANDLED; 898 return ret;
898} 899}
899 900
900static void _rtl_pci_irq_tasklet(struct ieee80211_hw *hw) 901static void _rtl_pci_irq_tasklet(struct ieee80211_hw *hw)
@@ -902,11 +903,6 @@ static void _rtl_pci_irq_tasklet(struct ieee80211_hw *hw)
902 _rtl_pci_tx_chk_waitq(hw); 903 _rtl_pci_tx_chk_waitq(hw);
903} 904}
904 905
905static void _rtl_pci_ips_leave_tasklet(struct ieee80211_hw *hw)
906{
907 rtl_lps_leave(hw);
908}
909
910static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) 906static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
911{ 907{
912 struct rtl_priv *rtlpriv = rtl_priv(hw); 908 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -944,6 +940,15 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
944 return; 940 return;
945} 941}
946 942
943static void rtl_lps_leave_work_callback(struct work_struct *work)
944{
945 struct rtl_works *rtlworks =
946 container_of(work, struct rtl_works, lps_leave_work);
947 struct ieee80211_hw *hw = rtlworks->hw;
948
949 rtl_lps_leave(hw);
950}
951
947static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw) 952static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
948{ 953{
949 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 954 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -1005,9 +1010,7 @@ static void _rtl_pci_init_struct(struct ieee80211_hw *hw,
1005 tasklet_init(&rtlpriv->works.irq_prepare_bcn_tasklet, 1010 tasklet_init(&rtlpriv->works.irq_prepare_bcn_tasklet,
1006 (void (*)(unsigned long))_rtl_pci_prepare_bcn_tasklet, 1011 (void (*)(unsigned long))_rtl_pci_prepare_bcn_tasklet,
1007 (unsigned long)hw); 1012 (unsigned long)hw);
1008 tasklet_init(&rtlpriv->works.ips_leave_tasklet, 1013 INIT_WORK(&rtlpriv->works.lps_leave_work, rtl_lps_leave_work_callback);
1009 (void (*)(unsigned long))_rtl_pci_ips_leave_tasklet,
1010 (unsigned long)hw);
1011} 1014}
1012 1015
1013static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw, 1016static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw,
@@ -1477,7 +1480,7 @@ static void rtl_pci_deinit(struct ieee80211_hw *hw)
1477 1480
1478 synchronize_irq(rtlpci->pdev->irq); 1481 synchronize_irq(rtlpci->pdev->irq);
1479 tasklet_kill(&rtlpriv->works.irq_tasklet); 1482 tasklet_kill(&rtlpriv->works.irq_tasklet);
1480 tasklet_kill(&rtlpriv->works.ips_leave_tasklet); 1483 cancel_work_sync(&rtlpriv->works.lps_leave_work);
1481 1484
1482 flush_workqueue(rtlpriv->works.rtl_wq); 1485 flush_workqueue(rtlpriv->works.rtl_wq);
1483 destroy_workqueue(rtlpriv->works.rtl_wq); 1486 destroy_workqueue(rtlpriv->works.rtl_wq);
@@ -1552,7 +1555,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
1552 set_hal_stop(rtlhal); 1555 set_hal_stop(rtlhal);
1553 1556
1554 rtlpriv->cfg->ops->disable_interrupt(hw); 1557 rtlpriv->cfg->ops->disable_interrupt(hw);
1555 tasklet_kill(&rtlpriv->works.ips_leave_tasklet); 1558 cancel_work_sync(&rtlpriv->works.lps_leave_work);
1556 1559
1557 spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flags); 1560 spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flags);
1558 while (ppsc->rfchange_inprogress) { 1561 while (ppsc->rfchange_inprogress) {
diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c
index a693feffbe72..a14a68b24635 100644
--- a/drivers/net/wireless/rtlwifi/ps.c
+++ b/drivers/net/wireless/rtlwifi/ps.c
@@ -27,6 +27,7 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include <linux/export.h>
30#include "wifi.h" 31#include "wifi.h"
31#include "base.h" 32#include "base.h"
32#include "ps.h" 33#include "ps.h"
@@ -240,7 +241,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
240 if (mac->opmode != NL80211_IFTYPE_STATION) 241 if (mac->opmode != NL80211_IFTYPE_STATION)
241 return; 242 return;
242 243
243 spin_lock(&rtlpriv->locks.ips_lock); 244 mutex_lock(&rtlpriv->locks.ps_mutex);
244 245
245 if (ppsc->inactiveps) { 246 if (ppsc->inactiveps) {
246 rtstate = ppsc->rfpwr_state; 247 rtstate = ppsc->rfpwr_state;
@@ -256,7 +257,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
256 } 257 }
257 } 258 }
258 259
259 spin_unlock(&rtlpriv->locks.ips_lock); 260 mutex_unlock(&rtlpriv->locks.ps_mutex);
260} 261}
261 262
262/*for FW LPS*/ 263/*for FW LPS*/
@@ -394,7 +395,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
394 if (mac->link_state != MAC80211_LINKED) 395 if (mac->link_state != MAC80211_LINKED)
395 return; 396 return;
396 397
397 spin_lock(&rtlpriv->locks.lps_lock); 398 mutex_lock(&rtlpriv->locks.ps_mutex);
398 399
399 /* Idle for a while if we connect to AP a while ago. */ 400 /* Idle for a while if we connect to AP a while ago. */
400 if (mac->cnt_after_linked >= 2) { 401 if (mac->cnt_after_linked >= 2) {
@@ -406,7 +407,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
406 } 407 }
407 } 408 }
408 409
409 spin_unlock(&rtlpriv->locks.lps_lock); 410 mutex_unlock(&rtlpriv->locks.ps_mutex);
410} 411}
411 412
412/*Leave the leisure power save mode.*/ 413/*Leave the leisure power save mode.*/
@@ -416,7 +417,7 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
416 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 417 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
417 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 418 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
418 419
419 spin_lock(&rtlpriv->locks.lps_lock); 420 mutex_lock(&rtlpriv->locks.ps_mutex);
420 421
421 if (ppsc->fwctrl_lps) { 422 if (ppsc->fwctrl_lps) {
422 if (ppsc->dot11_psmode != EACTIVE) { 423 if (ppsc->dot11_psmode != EACTIVE) {
@@ -437,7 +438,7 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
437 rtl_lps_set_psmode(hw, EACTIVE); 438 rtl_lps_set_psmode(hw, EACTIVE);
438 } 439 }
439 } 440 }
440 spin_unlock(&rtlpriv->locks.lps_lock); 441 mutex_unlock(&rtlpriv->locks.ps_mutex);
441} 442}
442 443
443/* For sw LPS*/ 444/* For sw LPS*/
@@ -538,9 +539,9 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
538 RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM); 539 RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
539 } 540 }
540 541
541 spin_lock(&rtlpriv->locks.lps_lock); 542 mutex_lock(&rtlpriv->locks.ps_mutex);
542 rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS); 543 rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS);
543 spin_unlock(&rtlpriv->locks.lps_lock); 544 mutex_unlock(&rtlpriv->locks.ps_mutex);
544} 545}
545 546
546void rtl_swlps_rfon_wq_callback(void *data) 547void rtl_swlps_rfon_wq_callback(void *data)
@@ -573,9 +574,9 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
573 if (rtlpriv->link_info.busytraffic) 574 if (rtlpriv->link_info.busytraffic)
574 return; 575 return;
575 576
576 spin_lock(&rtlpriv->locks.lps_lock); 577 mutex_lock(&rtlpriv->locks.ps_mutex);
577 rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS); 578 rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS);
578 spin_unlock(&rtlpriv->locks.lps_lock); 579 mutex_unlock(&rtlpriv->locks.ps_mutex);
579 580
580 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM && 581 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM &&
581 !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) { 582 !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
index a00774e7090d..72a98cab6f69 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
@@ -27,6 +27,7 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include <linux/export.h>
30#include "dm_common.h" 31#include "dm_common.h"
31#include "phy_common.h" 32#include "phy_common.h"
32#include "../pci.h" 33#include "../pci.h"
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
index 49a064bdbce6..931d97979b04 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
@@ -30,6 +30,7 @@
30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 31
32#include <linux/firmware.h> 32#include <linux/firmware.h>
33#include <linux/export.h>
33#include "../wifi.h" 34#include "../wifi.h"
34#include "../pci.h" 35#include "../pci.h"
35#include "../base.h" 36#include "../base.h"
@@ -72,6 +73,34 @@ static void _rtl92c_enable_fw_download(struct ieee80211_hw *hw, bool enable)
72 } 73 }
73} 74}
74 75
76static void rtl_block_fw_writeN(struct ieee80211_hw *hw, const u8 *buffer,
77 u32 size)
78{
79 struct rtl_priv *rtlpriv = rtl_priv(hw);
80 u32 blockSize = REALTEK_USB_VENQT_MAX_BUF_SIZE - 20;
81 u8 *bufferPtr = (u8 *) buffer;
82 u32 i, offset, blockCount, remainSize;
83
84 blockCount = size / blockSize;
85 remainSize = size % blockSize;
86
87 for (i = 0; i < blockCount; i++) {
88 offset = i * blockSize;
89 rtlpriv->io.writeN_sync(rtlpriv,
90 (FW_8192C_START_ADDRESS + offset),
91 (void *)(bufferPtr + offset),
92 blockSize);
93 }
94
95 if (remainSize) {
96 offset = blockCount * blockSize;
97 rtlpriv->io.writeN_sync(rtlpriv,
98 (FW_8192C_START_ADDRESS + offset),
99 (void *)(bufferPtr + offset),
100 remainSize);
101 }
102}
103
75static void _rtl92c_fw_block_write(struct ieee80211_hw *hw, 104static void _rtl92c_fw_block_write(struct ieee80211_hw *hw,
76 const u8 *buffer, u32 size) 105 const u8 *buffer, u32 size)
77{ 106{
@@ -80,23 +109,30 @@ static void _rtl92c_fw_block_write(struct ieee80211_hw *hw,
80 u8 *bufferPtr = (u8 *) buffer; 109 u8 *bufferPtr = (u8 *) buffer;
81 u32 *pu4BytePtr = (u32 *) buffer; 110 u32 *pu4BytePtr = (u32 *) buffer;
82 u32 i, offset, blockCount, remainSize; 111 u32 i, offset, blockCount, remainSize;
112 u32 data;
83 113
114 if (rtlpriv->io.writeN_sync) {
115 rtl_block_fw_writeN(hw, buffer, size);
116 return;
117 }
84 blockCount = size / blockSize; 118 blockCount = size / blockSize;
85 remainSize = size % blockSize; 119 remainSize = size % blockSize;
120 if (remainSize) {
121 /* the last word is < 4 bytes - pad it with zeros */
122 for (i = 0; i < 4 - remainSize; i++)
123 *(bufferPtr + size + i) = 0;
124 blockCount++;
125 }
86 126
87 for (i = 0; i < blockCount; i++) { 127 for (i = 0; i < blockCount; i++) {
88 offset = i * blockSize; 128 offset = i * blockSize;
129 /* for big-endian platforms, the firmware data need to be byte
130 * swapped as it was read as a byte string and will be written
131 * as 32-bit dwords and byte swapped when written
132 */
133 data = le32_to_cpu(*(__le32 *)(pu4BytePtr + i));
89 rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset), 134 rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset),
90 *(pu4BytePtr + i)); 135 data);
91 }
92
93 if (remainSize) {
94 offset = blockCount * blockSize;
95 bufferPtr += offset;
96 for (i = 0; i < remainSize; i++) {
97 rtl_write_byte(rtlpriv, (FW_8192C_START_ADDRESS +
98 offset + i), *(bufferPtr + i));
99 }
100 } 136 }
101} 137}
102 138
@@ -226,10 +262,10 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
226 u32 fwsize; 262 u32 fwsize;
227 enum version_8192c version = rtlhal->version; 263 enum version_8192c version = rtlhal->version;
228 264
229 pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
230 if (!rtlhal->pfirmware) 265 if (!rtlhal->pfirmware)
231 return 1; 266 return 1;
232 267
268 pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
233 pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware; 269 pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware;
234 pfwdata = (u8 *) rtlhal->pfirmware; 270 pfwdata = (u8 *) rtlhal->pfirmware;
235 fwsize = rtlhal->fwsize; 271 fwsize = rtlhal->fwsize;
@@ -237,8 +273,9 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
237 if (IS_FW_HEADER_EXIST(pfwheader)) { 273 if (IS_FW_HEADER_EXIST(pfwheader)) {
238 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, 274 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
239 ("Firmware Version(%d), Signature(%#x),Size(%d)\n", 275 ("Firmware Version(%d), Signature(%#x),Size(%d)\n",
240 pfwheader->version, pfwheader->signature, 276 le16_to_cpu(pfwheader->version),
241 (uint)sizeof(struct rtl92c_firmware_header))); 277 le16_to_cpu(pfwheader->signature),
278 (uint)sizeof(struct rtl92c_firmware_header)));
242 279
243 pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header); 280 pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header);
244 fwsize = fwsize - sizeof(struct rtl92c_firmware_header); 281 fwsize = fwsize - sizeof(struct rtl92c_firmware_header);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
index 3d5823c12621..cec5a3a1cc53 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
@@ -32,32 +32,32 @@
32 32
33#define FW_8192C_SIZE 0x3000 33#define FW_8192C_SIZE 0x3000
34#define FW_8192C_START_ADDRESS 0x1000 34#define FW_8192C_START_ADDRESS 0x1000
35#define FW_8192C_END_ADDRESS 0x3FFF 35#define FW_8192C_END_ADDRESS 0x1FFF
36#define FW_8192C_PAGE_SIZE 4096 36#define FW_8192C_PAGE_SIZE 4096
37#define FW_8192C_POLLING_DELAY 5 37#define FW_8192C_POLLING_DELAY 5
38#define FW_8192C_POLLING_TIMEOUT_COUNT 100 38#define FW_8192C_POLLING_TIMEOUT_COUNT 100
39 39
40#define IS_FW_HEADER_EXIST(_pfwhdr) \ 40#define IS_FW_HEADER_EXIST(_pfwhdr) \
41 ((_pfwhdr->signature&0xFFF0) == 0x92C0 ||\ 41 ((le16_to_cpu(_pfwhdr->signature)&0xFFF0) == 0x92C0 ||\
42 (_pfwhdr->signature&0xFFF0) == 0x88C0) 42 (le16_to_cpu(_pfwhdr->signature)&0xFFF0) == 0x88C0)
43 43
44struct rtl92c_firmware_header { 44struct rtl92c_firmware_header {
45 u16 signature; 45 __le16 signature;
46 u8 category; 46 u8 category;
47 u8 function; 47 u8 function;
48 u16 version; 48 __le16 version;
49 u8 subversion; 49 u8 subversion;
50 u8 rsvd1; 50 u8 rsvd1;
51 u8 month; 51 u8 month;
52 u8 date; 52 u8 date;
53 u8 hour; 53 u8 hour;
54 u8 minute; 54 u8 minute;
55 u16 ramcodeSize; 55 __le16 ramcodeSize;
56 u16 rsvd2; 56 __le16 rsvd2;
57 u32 svnindex; 57 __le32 svnindex;
58 u32 rsvd3; 58 __le32 rsvd3;
59 u32 rsvd4; 59 __le32 rsvd4;
60 u32 rsvd5; 60 __le32 rsvd5;
61}; 61};
62 62
63enum rtl8192c_h2c_cmd { 63enum rtl8192c_h2c_cmd {
@@ -94,5 +94,6 @@ void rtl92c_firmware_selfreset(struct ieee80211_hw *hw);
94void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); 94void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
95void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); 95void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
96void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); 96void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);
97void usb_writeN_async(struct rtl_priv *rtlpriv, u32 addr, void *data, u16 len);
97 98
98#endif 99#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/main.c b/drivers/net/wireless/rtlwifi/rtl8192c/main.c
index 2f624fc27499..605ff191aeb7 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/main.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/main.c
@@ -27,6 +27,7 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include <linux/module.h>
30#include "../wifi.h" 31#include "../wifi.h"
31 32
32 33
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
index 3b11642d3f7d..1f07558debf2 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
@@ -27,6 +27,7 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include <linux/export.h>
30#include "../wifi.h" 31#include "../wifi.h"
31#include "../rtl8192ce/reg.h" 32#include "../rtl8192ce/reg.h"
32#include "../rtl8192ce/def.h" 33#include "../rtl8192ce/def.h"
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
index 592a10ac5929..3b585aadabfc 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
@@ -569,7 +569,7 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
569 } 569 }
570 case ERFSLEEP:{ 570 case ERFSLEEP:{
571 if (ppsc->rfpwr_state == ERFOFF) 571 if (ppsc->rfpwr_state == ERFOFF)
572 break; 572 return false;
573 for (queue_id = 0, i = 0; 573 for (queue_id = 0, i = 0;
574 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 574 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
575 ring = &pcipriv->dev.tx_ring[queue_id]; 575 ring = &pcipriv->dev.tx_ring[queue_id];
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
index a48404cc2b96..f2aa33dc4d78 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
@@ -28,6 +28,7 @@
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include <linux/vmalloc.h> 30#include <linux/vmalloc.h>
31#include <linux/module.h>
31 32
32#include "../wifi.h" 33#include "../wifi.h"
33#include "../core.h" 34#include "../core.h"
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
index 814c05df51e8..4ed973a3aa17 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
@@ -498,7 +498,7 @@ static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)
498 } 498 }
499 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD, ("MAP\n"), 499 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD, ("MAP\n"),
500 hwinfo, HWSET_MAX_SIZE); 500 hwinfo, HWSET_MAX_SIZE);
501 eeprom_id = *((u16 *)&hwinfo[0]); 501 eeprom_id = le16_to_cpu(*((__le16 *)&hwinfo[0]));
502 if (eeprom_id != RTL8190_EEPROM_ID) { 502 if (eeprom_id != RTL8190_EEPROM_ID) {
503 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 503 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
504 ("EEPROM ID(%#x) is invalid!!\n", eeprom_id)); 504 ("EEPROM ID(%#x) is invalid!!\n", eeprom_id));
@@ -516,13 +516,14 @@ static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)
516 pr_info("MAC address: %pM\n", rtlefuse->dev_addr); 516 pr_info("MAC address: %pM\n", rtlefuse->dev_addr);
517 _rtl92cu_read_txpower_info_from_hwpg(hw, 517 _rtl92cu_read_txpower_info_from_hwpg(hw,
518 rtlefuse->autoload_failflag, hwinfo); 518 rtlefuse->autoload_failflag, hwinfo);
519 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID]; 519 rtlefuse->eeprom_vid = le16_to_cpu(*(__le16 *)&hwinfo[EEPROM_VID]);
520 rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID]; 520 rtlefuse->eeprom_did = le16_to_cpu(*(__le16 *)&hwinfo[EEPROM_DID]);
521 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 521 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
522 (" VID = 0x%02x PID = 0x%02x\n", 522 (" VID = 0x%02x PID = 0x%02x\n",
523 rtlefuse->eeprom_vid, rtlefuse->eeprom_did)); 523 rtlefuse->eeprom_vid, rtlefuse->eeprom_did));
524 rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN]; 524 rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
525 rtlefuse->eeprom_version = *(u16 *)&hwinfo[EEPROM_VERSION]; 525 rtlefuse->eeprom_version =
526 le16_to_cpu(*(__le16 *)&hwinfo[EEPROM_VERSION]);
526 rtlefuse->txpwr_fromeprom = true; 527 rtlefuse->txpwr_fromeprom = true;
527 rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID]; 528 rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
528 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 529 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
index 060a06f4a885..9e0c8fcdf90f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
@@ -84,6 +84,7 @@ void rtl92c_read_chip_version(struct ieee80211_hw *hw)
84 } 84 }
85 } 85 }
86 rtlhal->version = (enum version_8192c)chip_version; 86 rtlhal->version = (enum version_8192c)chip_version;
87 pr_info("rtl8192cu: Chip version 0x%x\n", chip_version);
87 switch (rtlhal->version) { 88 switch (rtlhal->version) {
88 case VERSION_NORMAL_TSMC_CHIP_92C_1T2R: 89 case VERSION_NORMAL_TSMC_CHIP_92C_1T2R:
89 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 90 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
index 72852900df84..e49cf2244c75 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
@@ -548,7 +548,7 @@ static bool _rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw,
548 break; 548 break;
549 case ERFSLEEP: 549 case ERFSLEEP:
550 if (ppsc->rfpwr_state == ERFOFF) 550 if (ppsc->rfpwr_state == ERFOFF)
551 break; 551 return false;
552 for (queue_id = 0, i = 0; 552 for (queue_id = 0, i = 0;
553 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 553 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
554 ring = &pcipriv->dev.tx_ring[queue_id]; 554 ring = &pcipriv->dev.tx_ring[queue_id];
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
index b9a158e5eb0e..94a3e1706158 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
@@ -42,6 +42,7 @@
42#include "led.h" 42#include "led.h"
43#include "hw.h" 43#include "hw.h"
44#include <linux/vmalloc.h> 44#include <linux/vmalloc.h>
45#include <linux/module.h>
45 46
46MODULE_AUTHOR("Georgia <georgia@realtek.com>"); 47MODULE_AUTHOR("Georgia <georgia@realtek.com>");
47MODULE_AUTHOR("Ziv Huang <ziv_huang@realtek.com>"); 48MODULE_AUTHOR("Ziv Huang <ziv_huang@realtek.com>");
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
index bc33b147f44f..b3cc7b949992 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
@@ -491,7 +491,7 @@ static void _rtl_tx_desc_checksum(u8 *txdesc)
491 SET_TX_DESC_TX_DESC_CHECKSUM(txdesc, 0); 491 SET_TX_DESC_TX_DESC_CHECKSUM(txdesc, 0);
492 for (index = 0; index < 16; index++) 492 for (index = 0; index < 16; index++)
493 checksum = checksum ^ (*(ptr + index)); 493 checksum = checksum ^ (*(ptr + index));
494 SET_TX_DESC_TX_DESC_CHECKSUM(txdesc, checksum); 494 SET_TX_DESC_TX_DESC_CHECKSUM(txdesc, cpu_to_le16(checksum));
495} 495}
496 496
497void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw, 497void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
index 3ac7af1c5509..0883349e1c83 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
@@ -3374,7 +3374,7 @@ bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3374 break; 3374 break;
3375 case ERFSLEEP: 3375 case ERFSLEEP:
3376 if (ppsc->rfpwr_state == ERFOFF) 3376 if (ppsc->rfpwr_state == ERFOFF)
3377 break; 3377 return false;
3378 3378
3379 for (queue_id = 0, i = 0; 3379 for (queue_id = 0, i = 0;
3380 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 3380 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
index 691f80092185..149493f4c25c 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c
@@ -30,6 +30,7 @@
30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 31
32#include <linux/vmalloc.h> 32#include <linux/vmalloc.h>
33#include <linux/module.h>
33 34
34#include "../wifi.h" 35#include "../wifi.h"
35#include "../core.h" 36#include "../core.h"
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
index f27171af979c..f10ac1ad9087 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
@@ -602,7 +602,7 @@ bool rtl92s_phy_set_rf_power_state(struct ieee80211_hw *hw,
602 } 602 }
603 case ERFSLEEP: 603 case ERFSLEEP:
604 if (ppsc->rfpwr_state == ERFOFF) 604 if (ppsc->rfpwr_state == ERFOFF)
605 break; 605 return false;
606 606
607 for (queue_id = 0, i = 0; 607 for (queue_id = 0, i = 0;
608 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 608 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
index 3ec9a0d41baf..92f49d522c56 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
@@ -30,6 +30,7 @@
30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 31
32#include <linux/vmalloc.h> 32#include <linux/vmalloc.h>
33#include <linux/module.h>
33 34
34#include "../wifi.h" 35#include "../wifi.h"
35#include "../core.h" 36#include "../core.h"
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index b42c2e2b2055..e956fa71d040 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -28,18 +28,20 @@
28#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 28#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
29 29
30#include <linux/usb.h> 30#include <linux/usb.h>
31#include <linux/export.h>
31#include "core.h" 32#include "core.h"
32#include "wifi.h" 33#include "wifi.h"
33#include "usb.h" 34#include "usb.h"
34#include "base.h" 35#include "base.h"
35#include "ps.h" 36#include "ps.h"
37#include "rtl8192c/fw_common.h"
36 38
37#define REALTEK_USB_VENQT_READ 0xC0 39#define REALTEK_USB_VENQT_READ 0xC0
38#define REALTEK_USB_VENQT_WRITE 0x40 40#define REALTEK_USB_VENQT_WRITE 0x40
39#define REALTEK_USB_VENQT_CMD_REQ 0x05 41#define REALTEK_USB_VENQT_CMD_REQ 0x05
40#define REALTEK_USB_VENQT_CMD_IDX 0x00 42#define REALTEK_USB_VENQT_CMD_IDX 0x00
41 43
42#define REALTEK_USB_VENQT_MAX_BUF_SIZE 254 44#define MAX_USBCTRL_VENDORREQ_TIMES 10
43 45
44static void usbctrl_async_callback(struct urb *urb) 46static void usbctrl_async_callback(struct urb *urb)
45{ 47{
@@ -81,6 +83,7 @@ static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
81 dr->wValue = cpu_to_le16(value); 83 dr->wValue = cpu_to_le16(value);
82 dr->wIndex = cpu_to_le16(index); 84 dr->wIndex = cpu_to_le16(index);
83 dr->wLength = cpu_to_le16(len); 85 dr->wLength = cpu_to_le16(len);
86 /* data are already in little-endian order */
84 memcpy(buf, pdata, len); 87 memcpy(buf, pdata, len);
85 usb_fill_control_urb(urb, udev, pipe, 88 usb_fill_control_urb(urb, udev, pipe,
86 (unsigned char *)dr, buf, len, 89 (unsigned char *)dr, buf, len,
@@ -99,16 +102,28 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request,
99 unsigned int pipe; 102 unsigned int pipe;
100 int status; 103 int status;
101 u8 reqtype; 104 u8 reqtype;
105 int vendorreq_times = 0;
106 static int count;
102 107
103 pipe = usb_rcvctrlpipe(udev, 0); /* read_in */ 108 pipe = usb_rcvctrlpipe(udev, 0); /* read_in */
104 reqtype = REALTEK_USB_VENQT_READ; 109 reqtype = REALTEK_USB_VENQT_READ;
105 110
106 status = usb_control_msg(udev, pipe, request, reqtype, value, index, 111 do {
107 pdata, len, 0); /* max. timeout */ 112 status = usb_control_msg(udev, pipe, request, reqtype, value,
113 index, pdata, len, 0); /*max. timeout*/
114 if (status < 0) {
115 /* firmware download is checksumed, don't retry */
116 if ((value >= FW_8192C_START_ADDRESS &&
117 value <= FW_8192C_END_ADDRESS))
118 break;
119 } else {
120 break;
121 }
122 } while (++vendorreq_times < MAX_USBCTRL_VENDORREQ_TIMES);
108 123
109 if (status < 0) 124 if (status < 0 && count++ < 4)
110 pr_err("reg 0x%x, usbctrl_vendorreq TimeOut! status:0x%x value=0x%x\n", 125 pr_err("reg 0x%x, usbctrl_vendorreq TimeOut! status:0x%x value=0x%x\n",
111 value, status, *(u32 *)pdata); 126 value, status, le32_to_cpu(*(u32 *)pdata));
112 return status; 127 return status;
113} 128}
114 129
@@ -128,7 +143,7 @@ static u32 _usb_read_sync(struct usb_device *udev, u32 addr, u16 len)
128 143
129 wvalue = (u16)addr; 144 wvalue = (u16)addr;
130 _usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len); 145 _usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len);
131 ret = *data; 146 ret = le32_to_cpu(*data);
132 kfree(data); 147 kfree(data);
133 return ret; 148 return ret;
134} 149}
@@ -160,12 +175,12 @@ static void _usb_write_async(struct usb_device *udev, u32 addr, u32 val,
160 u8 request; 175 u8 request;
161 u16 wvalue; 176 u16 wvalue;
162 u16 index; 177 u16 index;
163 u32 data; 178 __le32 data;
164 179
165 request = REALTEK_USB_VENQT_CMD_REQ; 180 request = REALTEK_USB_VENQT_CMD_REQ;
166 index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */ 181 index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */
167 wvalue = (u16)(addr&0x0000ffff); 182 wvalue = (u16)(addr&0x0000ffff);
168 data = val; 183 data = cpu_to_le32(val);
169 _usbctrl_vendorreq_async_write(udev, request, wvalue, index, &data, 184 _usbctrl_vendorreq_async_write(udev, request, wvalue, index, &data,
170 len); 185 len);
171} 186}
@@ -191,6 +206,30 @@ static void _usb_write32_async(struct rtl_priv *rtlpriv, u32 addr, u32 val)
191 _usb_write_async(to_usb_device(dev), addr, val, 4); 206 _usb_write_async(to_usb_device(dev), addr, val, 4);
192} 207}
193 208
209static void _usb_writeN_sync(struct rtl_priv *rtlpriv, u32 addr, void *data,
210 u16 len)
211{
212 struct device *dev = rtlpriv->io.dev;
213 struct usb_device *udev = to_usb_device(dev);
214 u8 request = REALTEK_USB_VENQT_CMD_REQ;
215 u8 reqtype = REALTEK_USB_VENQT_WRITE;
216 u16 wvalue;
217 u16 index = REALTEK_USB_VENQT_CMD_IDX;
218 int pipe = usb_sndctrlpipe(udev, 0); /* write_out */
219 u8 *buffer;
220 dma_addr_t dma_addr;
221
222 wvalue = (u16)(addr&0x0000ffff);
223 buffer = usb_alloc_coherent(udev, (size_t)len, GFP_ATOMIC, &dma_addr);
224 if (!buffer)
225 return;
226 memcpy(buffer, data, len);
227 usb_control_msg(udev, pipe, request, reqtype, wvalue,
228 index, buffer, len, 50);
229
230 usb_free_coherent(udev, (size_t)len, buffer, dma_addr);
231}
232
194static void _rtl_usb_io_handler_init(struct device *dev, 233static void _rtl_usb_io_handler_init(struct device *dev,
195 struct ieee80211_hw *hw) 234 struct ieee80211_hw *hw)
196{ 235{
@@ -204,6 +243,7 @@ static void _rtl_usb_io_handler_init(struct device *dev,
204 rtlpriv->io.read8_sync = _usb_read8_sync; 243 rtlpriv->io.read8_sync = _usb_read8_sync;
205 rtlpriv->io.read16_sync = _usb_read16_sync; 244 rtlpriv->io.read16_sync = _usb_read16_sync;
206 rtlpriv->io.read32_sync = _usb_read32_sync; 245 rtlpriv->io.read32_sync = _usb_read32_sync;
246 rtlpriv->io.writeN_sync = _usb_writeN_sync;
207} 247}
208 248
209static void _rtl_usb_io_handler_release(struct ieee80211_hw *hw) 249static void _rtl_usb_io_handler_release(struct ieee80211_hw *hw)
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
index 713c7ddba8eb..085dccdbd1b6 100644
--- a/drivers/net/wireless/rtlwifi/wifi.h
+++ b/drivers/net/wireless/rtlwifi/wifi.h
@@ -63,6 +63,7 @@
63#define AC_MAX 4 63#define AC_MAX 4
64#define QOS_QUEUE_NUM 4 64#define QOS_QUEUE_NUM 4
65#define RTL_MAC80211_NUM_QUEUE 5 65#define RTL_MAC80211_NUM_QUEUE 5
66#define REALTEK_USB_VENQT_MAX_BUF_SIZE 254
66 67
67#define QBSS_LOAD_SIZE 5 68#define QBSS_LOAD_SIZE 5
68#define MAX_WMMELE_LENGTH 64 69#define MAX_WMMELE_LENGTH 64
@@ -943,8 +944,10 @@ struct rtl_io {
943 unsigned long pci_base_addr; /*device I/O address */ 944 unsigned long pci_base_addr; /*device I/O address */
944 945
945 void (*write8_async) (struct rtl_priv *rtlpriv, u32 addr, u8 val); 946 void (*write8_async) (struct rtl_priv *rtlpriv, u32 addr, u8 val);
946 void (*write16_async) (struct rtl_priv *rtlpriv, u32 addr, __le16 val); 947 void (*write16_async) (struct rtl_priv *rtlpriv, u32 addr, u16 val);
947 void (*write32_async) (struct rtl_priv *rtlpriv, u32 addr, __le32 val); 948 void (*write32_async) (struct rtl_priv *rtlpriv, u32 addr, u32 val);
949 void (*writeN_sync) (struct rtl_priv *rtlpriv, u32 addr, void *buf,
950 u16 len);
948 951
949 u8(*read8_sync) (struct rtl_priv *rtlpriv, u32 addr); 952 u8(*read8_sync) (struct rtl_priv *rtlpriv, u32 addr);
950 u16(*read16_sync) (struct rtl_priv *rtlpriv, u32 addr); 953 u16(*read16_sync) (struct rtl_priv *rtlpriv, u32 addr);
@@ -1541,14 +1544,13 @@ struct rtl_hal_cfg {
1541struct rtl_locks { 1544struct rtl_locks {
1542 /* mutex */ 1545 /* mutex */
1543 struct mutex conf_mutex; 1546 struct mutex conf_mutex;
1547 struct mutex ps_mutex;
1544 1548
1545 /*spin lock */ 1549 /*spin lock */
1546 spinlock_t ips_lock;
1547 spinlock_t irq_th_lock; 1550 spinlock_t irq_th_lock;
1548 spinlock_t h2c_lock; 1551 spinlock_t h2c_lock;
1549 spinlock_t rf_ps_lock; 1552 spinlock_t rf_ps_lock;
1550 spinlock_t rf_lock; 1553 spinlock_t rf_lock;
1551 spinlock_t lps_lock;
1552 spinlock_t waitq_lock; 1554 spinlock_t waitq_lock;
1553 1555
1554 /*Dual mac*/ 1556 /*Dual mac*/
@@ -1573,7 +1575,8 @@ struct rtl_works {
1573 /* For SW LPS */ 1575 /* For SW LPS */
1574 struct delayed_work ps_work; 1576 struct delayed_work ps_work;
1575 struct delayed_work ps_rfon_wq; 1577 struct delayed_work ps_rfon_wq;
1576 struct tasklet_struct ips_leave_tasklet; 1578
1579 struct work_struct lps_leave_work;
1577}; 1580};
1578 1581
1579struct rtl_debug { 1582struct rtl_debug {