diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
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 | ||
13 | config RTL8192SE | 13 | config 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 | ||
24 | config RTL8192DE | 24 | config 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 | |||
895 | done: | 896 | done: |
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 | ||
900 | static void _rtl_pci_irq_tasklet(struct ieee80211_hw *hw) | 901 | static 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 | ||
905 | static void _rtl_pci_ips_leave_tasklet(struct ieee80211_hw *hw) | ||
906 | { | ||
907 | rtl_lps_leave(hw); | ||
908 | } | ||
909 | |||
910 | static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) | 906 | static 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 | ||
943 | static 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 | |||
947 | static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw) | 952 | static 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 | ||
1013 | static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw, | 1016 | static 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 | ||
546 | void rtl_swlps_rfon_wq_callback(void *data) | 547 | void 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 | ||
76 | static 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 | |||
75 | static void _rtl92c_fw_block_write(struct ieee80211_hw *hw, | 104 | static 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 | ||
44 | struct rtl92c_firmware_header { | 44 | struct 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 | ||
63 | enum rtl8192c_h2c_cmd { | 63 | enum rtl8192c_h2c_cmd { |
@@ -94,5 +94,6 @@ void rtl92c_firmware_selfreset(struct ieee80211_hw *hw); | |||
94 | void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); | 94 | void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); |
95 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); | 95 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); |
96 | void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); | 96 | void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); |
97 | void 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 | ||
46 | MODULE_AUTHOR("Georgia <georgia@realtek.com>"); | 47 | MODULE_AUTHOR("Georgia <georgia@realtek.com>"); |
47 | MODULE_AUTHOR("Ziv Huang <ziv_huang@realtek.com>"); | 48 | MODULE_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 | ||
497 | void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw, | 497 | void 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 | ||
44 | static void usbctrl_async_callback(struct urb *urb) | 46 | static 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 | ||
209 | static 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 | |||
194 | static void _rtl_usb_io_handler_init(struct device *dev, | 233 | static 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 | ||
209 | static void _rtl_usb_io_handler_release(struct ieee80211_hw *hw) | 249 | static 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 { | |||
1541 | struct rtl_locks { | 1544 | struct 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 | ||
1579 | struct rtl_debug { | 1582 | struct rtl_debug { |