aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-07-20 20:01:40 -0400
committerDavid S. Miller <davem@davemloft.net>2013-07-20 20:01:40 -0400
commitf5f7ab6785ec15b8b95750c0dd590ca3aeb49248 (patch)
treea8d735c3d786cab13d703e33a28805e51f84de45
parent8d716c7a09e0db7458dc072dd518c991c922931f (diff)
parent876fbb5d3ebab01685fef3839d245481c30eab5f (diff)
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
John W. Linville says: ==================== Please accept this batch of fixes intended for the 3.11 tree... Alexey Khoroshilov fixes a suspend-related race in ath9k_htc. Arnd Bergmann corrects the alignment of a structure in the ssb code to be compatible with ARM devices. Bob Copeland provides an ath5k fix that corrects a mistaken variable initialization. Felix Fietkau corrects some frame accounting for dropped frames in ath9k. Geert Uytterhoeven brings a Kconfig fix to indicate the DMA requirements for rt2x00. Larry Finger offers two rtlwifi fixes: one that properly initializes a callback; and, a scattered collection of Kconfig, Makefile, and EXPORT_SYMBOL changes that correct some build problems. Finally, Sujith Manoharan provides an ath9k fix to disable a feature on a specific hardware device. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/wireless/ath/ath5k/mac80211-ops.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/ar5008_phy.c10
-rw-r--r--drivers/net/wireless/ath/ath9k/hif_usb.c9
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c44
-rw-r--r--drivers/net/wireless/rt2x00/Kconfig2
-rw-r--r--drivers/net/wireless/rtlwifi/Kconfig72
-rw-r--r--drivers/net/wireless/rtlwifi/Makefile10
-rw-r--r--drivers/net/wireless/rtlwifi/base.c19
-rw-r--r--drivers/net/wireless/rtlwifi/base.h2
-rw-r--r--drivers/net/wireless/rtlwifi/core.c1
-rw-r--r--drivers/net/wireless/rtlwifi/debug.c1
-rw-r--r--drivers/net/wireless/rtlwifi/efuse.c1
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c22
-rw-r--r--drivers/net/wireless/rtlwifi/ps.c16
-rw-r--r--drivers/net/wireless/rtlwifi/ps.h1
-rw-r--r--drivers/net/wireless/rtlwifi/usb.c9
-rw-r--r--include/linux/mod_devicetable.h5
17 files changed, 154 insertions, 72 deletions
diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
index 81b686c6a376..40825d43322e 100644
--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
@@ -325,7 +325,7 @@ ath5k_prepare_multicast(struct ieee80211_hw *hw,
325 struct netdev_hw_addr *ha; 325 struct netdev_hw_addr *ha;
326 326
327 mfilt[0] = 0; 327 mfilt[0] = 0;
328 mfilt[1] = 1; 328 mfilt[1] = 0;
329 329
330 netdev_hw_addr_list_for_each(ha, mc_list) { 330 netdev_hw_addr_list_for_each(ha, mc_list) {
331 /* calculate XOR of eight 6-bit values */ 331 /* calculate XOR of eight 6-bit values */
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
index d1acfe98918a..1576d58291d4 100644
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
@@ -610,7 +610,15 @@ static void ar5008_hw_override_ini(struct ath_hw *ah,
610 REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); 610 REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
611 611
612 if (AR_SREV_9280_20_OR_LATER(ah)) { 612 if (AR_SREV_9280_20_OR_LATER(ah)) {
613 val = REG_READ(ah, AR_PCU_MISC_MODE2); 613 /*
614 * For AR9280 and above, there is a new feature that allows
615 * Multicast search based on both MAC Address and Key ID.
616 * By default, this feature is enabled. But since the driver
617 * is not using this feature, we switch it off; otherwise
618 * multicast search based on MAC addr only will fail.
619 */
620 val = REG_READ(ah, AR_PCU_MISC_MODE2) &
621 (~AR_ADHOC_MCAST_KEYID_ENABLE);
614 622
615 if (!AR_SREV_9271(ah)) 623 if (!AR_SREV_9271(ah))
616 val &= ~AR_PCU_MISC_MODE2_HWWAR1; 624 val &= ~AR_PCU_MISC_MODE2_HWWAR1;
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
index 9e582e14da74..2469db5a5bb1 100644
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
@@ -1082,7 +1082,7 @@ static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev)
1082 struct device *dev = &hif_dev->udev->dev; 1082 struct device *dev = &hif_dev->udev->dev;
1083 struct device *parent = dev->parent; 1083 struct device *parent = dev->parent;
1084 1084
1085 complete(&hif_dev->fw_done); 1085 complete_all(&hif_dev->fw_done);
1086 1086
1087 if (parent) 1087 if (parent)
1088 device_lock(parent); 1088 device_lock(parent);
@@ -1131,7 +1131,7 @@ static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context)
1131 1131
1132 release_firmware(fw); 1132 release_firmware(fw);
1133 hif_dev->flags |= HIF_USB_READY; 1133 hif_dev->flags |= HIF_USB_READY;
1134 complete(&hif_dev->fw_done); 1134 complete_all(&hif_dev->fw_done);
1135 1135
1136 return; 1136 return;
1137 1137
@@ -1316,7 +1316,10 @@ static int ath9k_hif_usb_suspend(struct usb_interface *interface,
1316 if (!(hif_dev->flags & HIF_USB_START)) 1316 if (!(hif_dev->flags & HIF_USB_START))
1317 ath9k_htc_suspend(hif_dev->htc_handle); 1317 ath9k_htc_suspend(hif_dev->htc_handle);
1318 1318
1319 ath9k_hif_usb_dealloc_urbs(hif_dev); 1319 wait_for_completion(&hif_dev->fw_done);
1320
1321 if (hif_dev->flags & HIF_USB_READY)
1322 ath9k_hif_usb_dealloc_urbs(hif_dev);
1320 1323
1321 return 0; 1324 return 0;
1322} 1325}
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index c59ae43b9b35..927992732620 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -146,6 +146,28 @@ static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
146 ARRAY_SIZE(bf->rates)); 146 ARRAY_SIZE(bf->rates));
147} 147}
148 148
149static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
150 struct sk_buff *skb)
151{
152 int q;
153
154 q = skb_get_queue_mapping(skb);
155 if (txq == sc->tx.uapsdq)
156 txq = sc->tx.txq_map[q];
157
158 if (txq != sc->tx.txq_map[q])
159 return;
160
161 if (WARN_ON(--txq->pending_frames < 0))
162 txq->pending_frames = 0;
163
164 if (txq->stopped &&
165 txq->pending_frames < sc->tx.txq_max_pending[q]) {
166 ieee80211_wake_queue(sc->hw, q);
167 txq->stopped = false;
168 }
169}
170
149static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) 171static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
150{ 172{
151 struct ath_txq *txq = tid->ac->txq; 173 struct ath_txq *txq = tid->ac->txq;
@@ -167,6 +189,7 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
167 if (!bf) { 189 if (!bf) {
168 bf = ath_tx_setup_buffer(sc, txq, tid, skb); 190 bf = ath_tx_setup_buffer(sc, txq, tid, skb);
169 if (!bf) { 191 if (!bf) {
192 ath_txq_skb_done(sc, txq, skb);
170 ieee80211_free_txskb(sc->hw, skb); 193 ieee80211_free_txskb(sc->hw, skb);
171 continue; 194 continue;
172 } 195 }
@@ -811,6 +834,7 @@ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq,
811 834
812 if (!bf) { 835 if (!bf) {
813 __skb_unlink(skb, &tid->buf_q); 836 __skb_unlink(skb, &tid->buf_q);
837 ath_txq_skb_done(sc, txq, skb);
814 ieee80211_free_txskb(sc->hw, skb); 838 ieee80211_free_txskb(sc->hw, skb);
815 continue; 839 continue;
816 } 840 }
@@ -1824,6 +1848,7 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_txq *txq,
1824 1848
1825 bf = ath_tx_setup_buffer(sc, txq, tid, skb); 1849 bf = ath_tx_setup_buffer(sc, txq, tid, skb);
1826 if (!bf) { 1850 if (!bf) {
1851 ath_txq_skb_done(sc, txq, skb);
1827 ieee80211_free_txskb(sc->hw, skb); 1852 ieee80211_free_txskb(sc->hw, skb);
1828 return; 1853 return;
1829 } 1854 }
@@ -2090,6 +2115,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
2090 2115
2091 bf = ath_tx_setup_buffer(sc, txq, tid, skb); 2116 bf = ath_tx_setup_buffer(sc, txq, tid, skb);
2092 if (!bf) { 2117 if (!bf) {
2118 ath_txq_skb_done(sc, txq, skb);
2093 if (txctl->paprd) 2119 if (txctl->paprd)
2094 dev_kfree_skb_any(skb); 2120 dev_kfree_skb_any(skb);
2095 else 2121 else
@@ -2189,7 +2215,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
2189 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 2215 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
2190 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 2216 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2191 struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data; 2217 struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;
2192 int q, padpos, padsize; 2218 int padpos, padsize;
2193 unsigned long flags; 2219 unsigned long flags;
2194 2220
2195 ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); 2221 ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb);
@@ -2225,21 +2251,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
2225 spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 2251 spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
2226 2252
2227 __skb_queue_tail(&txq->complete_q, skb); 2253 __skb_queue_tail(&txq->complete_q, skb);
2228 2254 ath_txq_skb_done(sc, txq, skb);
2229 q = skb_get_queue_mapping(skb);
2230 if (txq == sc->tx.uapsdq)
2231 txq = sc->tx.txq_map[q];
2232
2233 if (txq == sc->tx.txq_map[q]) {
2234 if (WARN_ON(--txq->pending_frames < 0))
2235 txq->pending_frames = 0;
2236
2237 if (txq->stopped &&
2238 txq->pending_frames < sc->tx.txq_max_pending[q]) {
2239 ieee80211_wake_queue(sc->hw, q);
2240 txq->stopped = false;
2241 }
2242 }
2243} 2255}
2244 2256
2245static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, 2257static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig
index 9b915d3a44be..3e60a31582f8 100644
--- a/drivers/net/wireless/rt2x00/Kconfig
+++ b/drivers/net/wireless/rt2x00/Kconfig
@@ -1,6 +1,6 @@
1menuconfig RT2X00 1menuconfig RT2X00
2 tristate "Ralink driver support" 2 tristate "Ralink driver support"
3 depends on MAC80211 3 depends on MAC80211 && HAS_DMA
4 ---help--- 4 ---help---
5 This will enable the support for the Ralink drivers, 5 This will enable the support for the Ralink drivers,
6 developed in the rt2x00 project <http://rt2x00.serialmonkey.com>. 6 developed in the rt2x00 project <http://rt2x00.serialmonkey.com>.
diff --git a/drivers/net/wireless/rtlwifi/Kconfig b/drivers/net/wireless/rtlwifi/Kconfig
index 7253de3d8c66..c2ffce7a907c 100644
--- a/drivers/net/wireless/rtlwifi/Kconfig
+++ b/drivers/net/wireless/rtlwifi/Kconfig
@@ -1,27 +1,20 @@
1config RTLWIFI 1menuconfig RTL_CARDS
2 tristate "Realtek wireless card support" 2 tristate "Realtek rtlwifi family of devices"
3 depends on MAC80211 3 depends on MAC80211 && (PCI || USB)
4 select FW_LOADER
5 ---help---
6 This is common code for RTL8192CE/RTL8192CU/RTL8192SE/RTL8723AE
7 drivers. This module does nothing by itself - the various front-end
8 drivers need to be enabled to support any desired devices.
9
10 If you choose to build as a module, it'll be called rtlwifi.
11
12config RTLWIFI_DEBUG
13 bool "Debugging output for rtlwifi driver family"
14 depends on RTLWIFI
15 default y 4 default y
16 ---help--- 5 ---help---
17 To use the module option that sets the dynamic-debugging level for, 6 This option will enable support for the Realtek mac80211-based
18 the front-end driver, this parameter must be "Y". For memory-limited 7 wireless drivers. Drivers rtl8192ce, rtl8192cu, rtl8192se, rtl8192de,
19 systems, choose "N". If in doubt, choose "Y". 8 rtl8723eu, and rtl8188eu share some common code.
9
10if RTL_CARDS
20 11
21config RTL8192CE 12config RTL8192CE
22 tristate "Realtek RTL8192CE/RTL8188CE Wireless Network Adapter" 13 tristate "Realtek RTL8192CE/RTL8188CE Wireless Network Adapter"
23 depends on RTLWIFI && PCI 14 depends on PCI
24 select RTL8192C_COMMON 15 select RTL8192C_COMMON
16 select RTLWIFI
17 select RTLWIFI_PCI
25 ---help--- 18 ---help---
26 This is the driver for Realtek RTL8192CE/RTL8188CE 802.11n PCIe 19 This is the driver for Realtek RTL8192CE/RTL8188CE 802.11n PCIe
27 wireless network adapters. 20 wireless network adapters.
@@ -30,7 +23,9 @@ config RTL8192CE
30 23
31config RTL8192SE 24config RTL8192SE
32 tristate "Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter" 25 tristate "Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter"
33 depends on RTLWIFI && PCI 26 depends on PCI
27 select RTLWIFI
28 select RTLWIFI_PCI
34 ---help--- 29 ---help---
35 This is the driver for Realtek RTL8192SE/RTL8191SE 802.11n PCIe 30 This is the driver for Realtek RTL8192SE/RTL8191SE 802.11n PCIe
36 wireless network adapters. 31 wireless network adapters.
@@ -39,7 +34,9 @@ config RTL8192SE
39 34
40config RTL8192DE 35config RTL8192DE
41 tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter" 36 tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter"
42 depends on RTLWIFI && PCI 37 depends on PCI
38 select RTLWIFI
39 select RTLWIFI_PCI
43 ---help--- 40 ---help---
44 This is the driver for Realtek RTL8192DE/RTL8188DE 802.11n PCIe 41 This is the driver for Realtek RTL8192DE/RTL8188DE 802.11n PCIe
45 wireless network adapters. 42 wireless network adapters.
@@ -48,7 +45,9 @@ config RTL8192DE
48 45
49config RTL8723AE 46config RTL8723AE
50 tristate "Realtek RTL8723AE PCIe Wireless Network Adapter" 47 tristate "Realtek RTL8723AE PCIe Wireless Network Adapter"
51 depends on RTLWIFI && PCI 48 depends on PCI
49 select RTLWIFI
50 select RTLWIFI_PCI
52 ---help--- 51 ---help---
53 This is the driver for Realtek RTL8723AE 802.11n PCIe 52 This is the driver for Realtek RTL8723AE 802.11n PCIe
54 wireless network adapters. 53 wireless network adapters.
@@ -57,7 +56,9 @@ config RTL8723AE
57 56
58config RTL8188EE 57config RTL8188EE
59 tristate "Realtek RTL8188EE Wireless Network Adapter" 58 tristate "Realtek RTL8188EE Wireless Network Adapter"
60 depends on RTLWIFI && PCI 59 depends on PCI
60 select RTLWIFI
61 select RTLWIFI_PCI
61 ---help--- 62 ---help---
62 This is the driver for Realtek RTL8188EE 802.11n PCIe 63 This is the driver for Realtek RTL8188EE 802.11n PCIe
63 wireless network adapters. 64 wireless network adapters.
@@ -66,7 +67,9 @@ config RTL8188EE
66 67
67config RTL8192CU 68config RTL8192CU
68 tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter" 69 tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter"
69 depends on RTLWIFI && USB 70 depends on USB
71 select RTLWIFI
72 select RTLWIFI_USB
70 select RTL8192C_COMMON 73 select RTL8192C_COMMON
71 ---help--- 74 ---help---
72 This is the driver for Realtek RTL8192CU/RTL8188CU 802.11n USB 75 This is the driver for Realtek RTL8192CU/RTL8188CU 802.11n USB
@@ -74,7 +77,28 @@ config RTL8192CU
74 77
75 If you choose to build it as a module, it will be called rtl8192cu 78 If you choose to build it as a module, it will be called rtl8192cu
76 79
80config RTLWIFI
81 tristate
82 select FW_LOADER
83
84config RTLWIFI_PCI
85 tristate
86
87config RTLWIFI_USB
88 tristate
89
90config RTLWIFI_DEBUG
91 bool "Debugging output for rtlwifi driver family"
92 depends on RTLWIFI
93 default y
94 ---help---
95 To use the module option that sets the dynamic-debugging level for,
96 the front-end driver, this parameter must be "Y". For memory-limited
97 systems, choose "N". If in doubt, choose "Y".
98
77config RTL8192C_COMMON 99config RTL8192C_COMMON
78 tristate 100 tristate
79 depends on RTL8192CE || RTL8192CU 101 depends on RTL8192CE || RTL8192CU
80 default m 102 default y
103
104endif
diff --git a/drivers/net/wireless/rtlwifi/Makefile b/drivers/net/wireless/rtlwifi/Makefile
index ff02b874f8d8..d56f023a4b90 100644
--- a/drivers/net/wireless/rtlwifi/Makefile
+++ b/drivers/net/wireless/rtlwifi/Makefile
@@ -12,13 +12,11 @@ rtlwifi-objs := \
12 12
13rtl8192c_common-objs += \ 13rtl8192c_common-objs += \
14 14
15ifneq ($(CONFIG_PCI),) 15obj-$(CONFIG_RTLWIFI_PCI) += rtl_pci.o
16rtlwifi-objs += pci.o 16rtl_pci-objs := pci.o
17endif
18 17
19ifneq ($(CONFIG_USB),) 18obj-$(CONFIG_RTLWIFI_USB) += rtl_usb.o
20rtlwifi-objs += usb.o 19rtl_usb-objs := usb.o
21endif
22 20
23obj-$(CONFIG_RTL8192C_COMMON) += rtl8192c/ 21obj-$(CONFIG_RTL8192C_COMMON) += rtl8192c/
24obj-$(CONFIG_RTL8192CE) += rtl8192ce/ 22obj-$(CONFIG_RTL8192CE) += rtl8192ce/
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
index 9d558ac77b0c..7651f5acc14b 100644
--- a/drivers/net/wireless/rtlwifi/base.c
+++ b/drivers/net/wireless/rtlwifi/base.c
@@ -172,6 +172,7 @@ u8 rtl_tid_to_ac(u8 tid)
172{ 172{
173 return tid_to_ac[tid]; 173 return tid_to_ac[tid];
174} 174}
175EXPORT_SYMBOL_GPL(rtl_tid_to_ac);
175 176
176static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw, 177static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
177 struct ieee80211_sta_ht_cap *ht_cap) 178 struct ieee80211_sta_ht_cap *ht_cap)
@@ -406,6 +407,7 @@ void rtl_deinit_deferred_work(struct ieee80211_hw *hw)
406 cancel_delayed_work(&rtlpriv->works.ps_rfon_wq); 407 cancel_delayed_work(&rtlpriv->works.ps_rfon_wq);
407 cancel_delayed_work(&rtlpriv->works.fwevt_wq); 408 cancel_delayed_work(&rtlpriv->works.fwevt_wq);
408} 409}
410EXPORT_SYMBOL_GPL(rtl_deinit_deferred_work);
409 411
410void rtl_init_rfkill(struct ieee80211_hw *hw) 412void rtl_init_rfkill(struct ieee80211_hw *hw)
411{ 413{
@@ -439,6 +441,7 @@ void rtl_deinit_rfkill(struct ieee80211_hw *hw)
439{ 441{
440 wiphy_rfkill_stop_polling(hw->wiphy); 442 wiphy_rfkill_stop_polling(hw->wiphy);
441} 443}
444EXPORT_SYMBOL_GPL(rtl_deinit_rfkill);
442 445
443int rtl_init_core(struct ieee80211_hw *hw) 446int rtl_init_core(struct ieee80211_hw *hw)
444{ 447{
@@ -489,10 +492,12 @@ int rtl_init_core(struct ieee80211_hw *hw)
489 492
490 return 0; 493 return 0;
491} 494}
495EXPORT_SYMBOL_GPL(rtl_init_core);
492 496
493void rtl_deinit_core(struct ieee80211_hw *hw) 497void rtl_deinit_core(struct ieee80211_hw *hw)
494{ 498{
495} 499}
500EXPORT_SYMBOL_GPL(rtl_deinit_core);
496 501
497void rtl_init_rx_config(struct ieee80211_hw *hw) 502void rtl_init_rx_config(struct ieee80211_hw *hw)
498{ 503{
@@ -501,6 +506,7 @@ void rtl_init_rx_config(struct ieee80211_hw *hw)
501 506
502 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf)); 507 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf));
503} 508}
509EXPORT_SYMBOL_GPL(rtl_init_rx_config);
504 510
505/********************************************************* 511/*********************************************************
506 * 512 *
@@ -879,6 +885,7 @@ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb)
879 885
880 return true; 886 return true;
881} 887}
888EXPORT_SYMBOL_GPL(rtl_tx_mgmt_proc);
882 889
883void rtl_get_tcb_desc(struct ieee80211_hw *hw, 890void rtl_get_tcb_desc(struct ieee80211_hw *hw,
884 struct ieee80211_tx_info *info, 891 struct ieee80211_tx_info *info,
@@ -1052,6 +1059,7 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1052 1059
1053 return true; 1060 return true;
1054} 1061}
1062EXPORT_SYMBOL_GPL(rtl_action_proc);
1055 1063
1056/*should call before software enc*/ 1064/*should call before software enc*/
1057u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) 1065u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
@@ -1125,6 +1133,7 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1125 1133
1126 return false; 1134 return false;
1127} 1135}
1136EXPORT_SYMBOL_GPL(rtl_is_special_data);
1128 1137
1129/********************************************************* 1138/*********************************************************
1130 * 1139 *
@@ -1300,6 +1309,7 @@ void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb)
1300 1309
1301 rtlpriv->link_info.bcn_rx_inperiod++; 1310 rtlpriv->link_info.bcn_rx_inperiod++;
1302} 1311}
1312EXPORT_SYMBOL_GPL(rtl_beacon_statistic);
1303 1313
1304void rtl_watchdog_wq_callback(void *data) 1314void rtl_watchdog_wq_callback(void *data)
1305{ 1315{
@@ -1793,6 +1803,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len)
1793 1803
1794 mac->vendor = vendor; 1804 mac->vendor = vendor;
1795} 1805}
1806EXPORT_SYMBOL_GPL(rtl_recognize_peer);
1796 1807
1797/********************************************************* 1808/*********************************************************
1798 * 1809 *
@@ -1849,6 +1860,7 @@ struct attribute_group rtl_attribute_group = {
1849 .name = "rtlsysfs", 1860 .name = "rtlsysfs",
1850 .attrs = rtl_sysfs_entries, 1861 .attrs = rtl_sysfs_entries,
1851}; 1862};
1863EXPORT_SYMBOL_GPL(rtl_attribute_group);
1852 1864
1853MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>"); 1865MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
1854MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>"); 1866MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
@@ -1856,7 +1868,8 @@ MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
1856MODULE_LICENSE("GPL"); 1868MODULE_LICENSE("GPL");
1857MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core"); 1869MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core");
1858 1870
1859struct rtl_global_var global_var = {}; 1871struct rtl_global_var rtl_global_var = {};
1872EXPORT_SYMBOL_GPL(rtl_global_var);
1860 1873
1861static int __init rtl_core_module_init(void) 1874static int __init rtl_core_module_init(void)
1862{ 1875{
@@ -1864,8 +1877,8 @@ static int __init rtl_core_module_init(void)
1864 pr_err("Unable to register rtl_rc, use default RC !!\n"); 1877 pr_err("Unable to register rtl_rc, use default RC !!\n");
1865 1878
1866 /* init some global vars */ 1879 /* init some global vars */
1867 INIT_LIST_HEAD(&global_var.glb_priv_list); 1880 INIT_LIST_HEAD(&rtl_global_var.glb_priv_list);
1868 spin_lock_init(&global_var.glb_list_lock); 1881 spin_lock_init(&rtl_global_var.glb_list_lock);
1869 1882
1870 return 0; 1883 return 0;
1871} 1884}
diff --git a/drivers/net/wireless/rtlwifi/base.h b/drivers/net/wireless/rtlwifi/base.h
index 8576bc34b032..0e5fe0902daf 100644
--- a/drivers/net/wireless/rtlwifi/base.h
+++ b/drivers/net/wireless/rtlwifi/base.h
@@ -147,7 +147,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len);
147u8 rtl_tid_to_ac(u8 tid); 147u8 rtl_tid_to_ac(u8 tid);
148extern struct attribute_group rtl_attribute_group; 148extern struct attribute_group rtl_attribute_group;
149void rtl_easy_concurrent_retrytimer_callback(unsigned long data); 149void rtl_easy_concurrent_retrytimer_callback(unsigned long data);
150extern struct rtl_global_var global_var; 150extern struct rtl_global_var rtl_global_var;
151int rtlwifi_rate_mapping(struct ieee80211_hw *hw, 151int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
152 bool isht, u8 desc_rate, bool first_ampdu); 152 bool isht, u8 desc_rate, bool first_ampdu);
153bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb); 153bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index ee84844be008..733b7ce7f0e2 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -1330,3 +1330,4 @@ const struct ieee80211_ops rtl_ops = {
1330 .rfkill_poll = rtl_op_rfkill_poll, 1330 .rfkill_poll = rtl_op_rfkill_poll,
1331 .flush = rtl_op_flush, 1331 .flush = rtl_op_flush,
1332}; 1332};
1333EXPORT_SYMBOL_GPL(rtl_ops);
diff --git a/drivers/net/wireless/rtlwifi/debug.c b/drivers/net/wireless/rtlwifi/debug.c
index 7d52d3d7769f..76e2086e137e 100644
--- a/drivers/net/wireless/rtlwifi/debug.c
+++ b/drivers/net/wireless/rtlwifi/debug.c
@@ -51,3 +51,4 @@ void rtl_dbgp_flag_init(struct ieee80211_hw *hw)
51 51
52 /*Init Debug flag enable condition */ 52 /*Init Debug flag enable condition */
53} 53}
54EXPORT_SYMBOL_GPL(rtl_dbgp_flag_init);
diff --git a/drivers/net/wireless/rtlwifi/efuse.c b/drivers/net/wireless/rtlwifi/efuse.c
index 9e3894178e77..838a1ed3f194 100644
--- a/drivers/net/wireless/rtlwifi/efuse.c
+++ b/drivers/net/wireless/rtlwifi/efuse.c
@@ -229,6 +229,7 @@ void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf)
229 229
230 *pbuf = (u8) (value32 & 0xff); 230 *pbuf = (u8) (value32 & 0xff);
231} 231}
232EXPORT_SYMBOL_GPL(read_efuse_byte);
232 233
233void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf) 234void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
234{ 235{
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index c97e9d327331..703f839af6ca 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -35,6 +35,13 @@
35#include "efuse.h" 35#include "efuse.h"
36#include <linux/export.h> 36#include <linux/export.h>
37#include <linux/kmemleak.h> 37#include <linux/kmemleak.h>
38#include <linux/module.h>
39
40MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
41MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
42MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
43MODULE_LICENSE("GPL");
44MODULE_DESCRIPTION("PCI basic driver for rtlwifi");
38 45
39static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = { 46static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = {
40 PCI_VENDOR_ID_INTEL, 47 PCI_VENDOR_ID_INTEL,
@@ -1008,19 +1015,6 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
1008 return; 1015 return;
1009} 1016}
1010 1017
1011static void rtl_lps_change_work_callback(struct work_struct *work)
1012{
1013 struct rtl_works *rtlworks =
1014 container_of(work, struct rtl_works, lps_change_work);
1015 struct ieee80211_hw *hw = rtlworks->hw;
1016 struct rtl_priv *rtlpriv = rtl_priv(hw);
1017
1018 if (rtlpriv->enter_ps)
1019 rtl_lps_enter(hw);
1020 else
1021 rtl_lps_leave(hw);
1022}
1023
1024static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw) 1018static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
1025{ 1019{
1026 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1020 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -1899,7 +1893,7 @@ int rtl_pci_probe(struct pci_dev *pdev,
1899 rtlpriv->rtlhal.interface = INTF_PCI; 1893 rtlpriv->rtlhal.interface = INTF_PCI;
1900 rtlpriv->cfg = (struct rtl_hal_cfg *)(id->driver_data); 1894 rtlpriv->cfg = (struct rtl_hal_cfg *)(id->driver_data);
1901 rtlpriv->intf_ops = &rtl_pci_ops; 1895 rtlpriv->intf_ops = &rtl_pci_ops;
1902 rtlpriv->glb_var = &global_var; 1896 rtlpriv->glb_var = &rtl_global_var;
1903 1897
1904 /* 1898 /*
1905 *init dbgp flags before all 1899 *init dbgp flags before all
diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c
index 884bceae38a9..298b615964e8 100644
--- a/drivers/net/wireless/rtlwifi/ps.c
+++ b/drivers/net/wireless/rtlwifi/ps.c
@@ -269,6 +269,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
269 269
270 spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags); 270 spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags);
271} 271}
272EXPORT_SYMBOL_GPL(rtl_ips_nic_on);
272 273
273/*for FW LPS*/ 274/*for FW LPS*/
274 275
@@ -518,6 +519,7 @@ void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
518 "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed); 519 "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed);
519 } 520 }
520} 521}
522EXPORT_SYMBOL_GPL(rtl_swlps_beacon);
521 523
522void rtl_swlps_rf_awake(struct ieee80211_hw *hw) 524void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
523{ 525{
@@ -611,6 +613,19 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
611 MSECS(sleep_intv * mac->vif->bss_conf.beacon_int - 40)); 613 MSECS(sleep_intv * mac->vif->bss_conf.beacon_int - 40));
612} 614}
613 615
616void rtl_lps_change_work_callback(struct work_struct *work)
617{
618 struct rtl_works *rtlworks =
619 container_of(work, struct rtl_works, lps_change_work);
620 struct ieee80211_hw *hw = rtlworks->hw;
621 struct rtl_priv *rtlpriv = rtl_priv(hw);
622
623 if (rtlpriv->enter_ps)
624 rtl_lps_enter(hw);
625 else
626 rtl_lps_leave(hw);
627}
628EXPORT_SYMBOL_GPL(rtl_lps_change_work_callback);
614 629
615void rtl_swlps_wq_callback(void *data) 630void rtl_swlps_wq_callback(void *data)
616{ 631{
@@ -922,3 +937,4 @@ void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len)
922 else 937 else
923 rtl_p2p_noa_ie(hw, data, len - FCS_LEN); 938 rtl_p2p_noa_ie(hw, data, len - FCS_LEN);
924} 939}
940EXPORT_SYMBOL_GPL(rtl_p2p_info);
diff --git a/drivers/net/wireless/rtlwifi/ps.h b/drivers/net/wireless/rtlwifi/ps.h
index 4d682b753f50..88bd76ea88f7 100644
--- a/drivers/net/wireless/rtlwifi/ps.h
+++ b/drivers/net/wireless/rtlwifi/ps.h
@@ -49,5 +49,6 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw);
49void rtl_swlps_rf_sleep(struct ieee80211_hw *hw); 49void rtl_swlps_rf_sleep(struct ieee80211_hw *hw);
50void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); 50void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
51void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len); 51void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len);
52void rtl_lps_change_work_callback(struct work_struct *work);
52 53
53#endif 54#endif
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index a3532e077871..e56778cac9bf 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -32,6 +32,13 @@
32#include "ps.h" 32#include "ps.h"
33#include "rtl8192c/fw_common.h" 33#include "rtl8192c/fw_common.h"
34#include <linux/export.h> 34#include <linux/export.h>
35#include <linux/module.h>
36
37MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
38MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
39MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
40MODULE_LICENSE("GPL");
41MODULE_DESCRIPTION("USB basic driver for rtlwifi");
35 42
36#define REALTEK_USB_VENQT_READ 0xC0 43#define REALTEK_USB_VENQT_READ 0xC0
37#define REALTEK_USB_VENQT_WRITE 0x40 44#define REALTEK_USB_VENQT_WRITE 0x40
@@ -1070,6 +1077,8 @@ int rtl_usb_probe(struct usb_interface *intf,
1070 spin_lock_init(&rtlpriv->locks.usb_lock); 1077 spin_lock_init(&rtlpriv->locks.usb_lock);
1071 INIT_WORK(&rtlpriv->works.fill_h2c_cmd, 1078 INIT_WORK(&rtlpriv->works.fill_h2c_cmd,
1072 rtl_fill_h2c_cmd_work_callback); 1079 rtl_fill_h2c_cmd_work_callback);
1080 INIT_WORK(&rtlpriv->works.lps_change_work,
1081 rtl_lps_change_work_callback);
1073 1082
1074 rtlpriv->usb_data_index = 0; 1083 rtlpriv->usb_data_index = 0;
1075 init_completion(&rtlpriv->firmware_loading_complete); 1084 init_completion(&rtlpriv->firmware_loading_complete);
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
index b62d4af6c667..45e921401b06 100644
--- a/include/linux/mod_devicetable.h
+++ b/include/linux/mod_devicetable.h
@@ -361,7 +361,8 @@ struct ssb_device_id {
361 __u16 vendor; 361 __u16 vendor;
362 __u16 coreid; 362 __u16 coreid;
363 __u8 revision; 363 __u8 revision;
364}; 364 __u8 __pad;
365} __attribute__((packed, aligned(2)));
365#define SSB_DEVICE(_vendor, _coreid, _revision) \ 366#define SSB_DEVICE(_vendor, _coreid, _revision) \
366 { .vendor = _vendor, .coreid = _coreid, .revision = _revision, } 367 { .vendor = _vendor, .coreid = _coreid, .revision = _revision, }
367#define SSB_DEVTABLE_END \ 368#define SSB_DEVTABLE_END \
@@ -377,7 +378,7 @@ struct bcma_device_id {
377 __u16 id; 378 __u16 id;
378 __u8 rev; 379 __u8 rev;
379 __u8 class; 380 __u8 class;
380}; 381} __attribute__((packed,aligned(2)));
381#define BCMA_CORE(_manuf, _id, _rev, _class) \ 382#define BCMA_CORE(_manuf, _id, _rev, _class) \
382 { .manuf = _manuf, .id = _id, .rev = _rev, .class = _class, } 383 { .manuf = _manuf, .id = _id, .rev = _rev, .class = _class, }
383#define BCMA_CORETABLE_END \ 384#define BCMA_CORETABLE_END \