Commit f5f7ab67 authored by David S. Miller's avatar David S. Miller

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: default avatarDavid S. Miller <davem@davemloft.net>
parents 8d716c7a 876fbb5d
...@@ -325,7 +325,7 @@ ath5k_prepare_multicast(struct ieee80211_hw *hw, ...@@ -325,7 +325,7 @@ ath5k_prepare_multicast(struct ieee80211_hw *hw,
struct netdev_hw_addr *ha; struct netdev_hw_addr *ha;
mfilt[0] = 0; mfilt[0] = 0;
mfilt[1] = 1; mfilt[1] = 0;
netdev_hw_addr_list_for_each(ha, mc_list) { netdev_hw_addr_list_for_each(ha, mc_list) {
/* calculate XOR of eight 6-bit values */ /* calculate XOR of eight 6-bit values */
......
...@@ -610,7 +610,15 @@ static void ar5008_hw_override_ini(struct ath_hw *ah, ...@@ -610,7 +610,15 @@ static void ar5008_hw_override_ini(struct ath_hw *ah,
REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
if (AR_SREV_9280_20_OR_LATER(ah)) { if (AR_SREV_9280_20_OR_LATER(ah)) {
val = REG_READ(ah, AR_PCU_MISC_MODE2); /*
* For AR9280 and above, there is a new feature that allows
* Multicast search based on both MAC Address and Key ID.
* By default, this feature is enabled. But since the driver
* is not using this feature, we switch it off; otherwise
* multicast search based on MAC addr only will fail.
*/
val = REG_READ(ah, AR_PCU_MISC_MODE2) &
(~AR_ADHOC_MCAST_KEYID_ENABLE);
if (!AR_SREV_9271(ah)) if (!AR_SREV_9271(ah))
val &= ~AR_PCU_MISC_MODE2_HWWAR1; val &= ~AR_PCU_MISC_MODE2_HWWAR1;
......
...@@ -1082,7 +1082,7 @@ static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev) ...@@ -1082,7 +1082,7 @@ static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev)
struct device *dev = &hif_dev->udev->dev; struct device *dev = &hif_dev->udev->dev;
struct device *parent = dev->parent; struct device *parent = dev->parent;
complete(&hif_dev->fw_done); complete_all(&hif_dev->fw_done);
if (parent) if (parent)
device_lock(parent); device_lock(parent);
...@@ -1131,7 +1131,7 @@ static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context) ...@@ -1131,7 +1131,7 @@ static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context)
release_firmware(fw); release_firmware(fw);
hif_dev->flags |= HIF_USB_READY; hif_dev->flags |= HIF_USB_READY;
complete(&hif_dev->fw_done); complete_all(&hif_dev->fw_done);
return; return;
...@@ -1316,7 +1316,10 @@ static int ath9k_hif_usb_suspend(struct usb_interface *interface, ...@@ -1316,7 +1316,10 @@ static int ath9k_hif_usb_suspend(struct usb_interface *interface,
if (!(hif_dev->flags & HIF_USB_START)) if (!(hif_dev->flags & HIF_USB_START))
ath9k_htc_suspend(hif_dev->htc_handle); ath9k_htc_suspend(hif_dev->htc_handle);
ath9k_hif_usb_dealloc_urbs(hif_dev); wait_for_completion(&hif_dev->fw_done);
if (hif_dev->flags & HIF_USB_READY)
ath9k_hif_usb_dealloc_urbs(hif_dev);
return 0; return 0;
} }
......
...@@ -146,6 +146,28 @@ static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta, ...@@ -146,6 +146,28 @@ static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
ARRAY_SIZE(bf->rates)); ARRAY_SIZE(bf->rates));
} }
static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
struct sk_buff *skb)
{
int q;
q = skb_get_queue_mapping(skb);
if (txq == sc->tx.uapsdq)
txq = sc->tx.txq_map[q];
if (txq != sc->tx.txq_map[q])
return;
if (WARN_ON(--txq->pending_frames < 0))
txq->pending_frames = 0;
if (txq->stopped &&
txq->pending_frames < sc->tx.txq_max_pending[q]) {
ieee80211_wake_queue(sc->hw, q);
txq->stopped = false;
}
}
static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
{ {
struct ath_txq *txq = tid->ac->txq; 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,6 +189,7 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
if (!bf) { if (!bf) {
bf = ath_tx_setup_buffer(sc, txq, tid, skb); bf = ath_tx_setup_buffer(sc, txq, tid, skb);
if (!bf) { if (!bf) {
ath_txq_skb_done(sc, txq, skb);
ieee80211_free_txskb(sc->hw, skb); ieee80211_free_txskb(sc->hw, skb);
continue; continue;
} }
...@@ -811,6 +834,7 @@ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq, ...@@ -811,6 +834,7 @@ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq,
if (!bf) { if (!bf) {
__skb_unlink(skb, &tid->buf_q); __skb_unlink(skb, &tid->buf_q);
ath_txq_skb_done(sc, txq, skb);
ieee80211_free_txskb(sc->hw, skb); ieee80211_free_txskb(sc->hw, skb);
continue; continue;
} }
...@@ -1824,6 +1848,7 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_txq *txq, ...@@ -1824,6 +1848,7 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_txq *txq,
bf = ath_tx_setup_buffer(sc, txq, tid, skb); bf = ath_tx_setup_buffer(sc, txq, tid, skb);
if (!bf) { if (!bf) {
ath_txq_skb_done(sc, txq, skb);
ieee80211_free_txskb(sc->hw, skb); ieee80211_free_txskb(sc->hw, skb);
return; return;
} }
...@@ -2090,6 +2115,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -2090,6 +2115,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
bf = ath_tx_setup_buffer(sc, txq, tid, skb); bf = ath_tx_setup_buffer(sc, txq, tid, skb);
if (!bf) { if (!bf) {
ath_txq_skb_done(sc, txq, skb);
if (txctl->paprd) if (txctl->paprd)
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
else else
...@@ -2189,7 +2215,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, ...@@ -2189,7 +2215,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
struct ath_common *common = ath9k_hw_common(sc->sc_ah); struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;
int q, padpos, padsize; int padpos, padsize;
unsigned long flags; unsigned long flags;
ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); 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,21 +2251,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
spin_unlock_irqrestore(&sc->sc_pm_lock, flags); spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
__skb_queue_tail(&txq->complete_q, skb); __skb_queue_tail(&txq->complete_q, skb);
ath_txq_skb_done(sc, txq, skb);
q = skb_get_queue_mapping(skb);
if (txq == sc->tx.uapsdq)
txq = sc->tx.txq_map[q];
if (txq == sc->tx.txq_map[q]) {
if (WARN_ON(--txq->pending_frames < 0))
txq->pending_frames = 0;
if (txq->stopped &&
txq->pending_frames < sc->tx.txq_max_pending[q]) {
ieee80211_wake_queue(sc->hw, q);
txq->stopped = false;
}
}
} }
static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
......
menuconfig RT2X00 menuconfig RT2X00
tristate "Ralink driver support" tristate "Ralink driver support"
depends on MAC80211 depends on MAC80211 && HAS_DMA
---help--- ---help---
This will enable the support for the Ralink drivers, This will enable the support for the Ralink drivers,
developed in the rt2x00 project <http://rt2x00.serialmonkey.com>. developed in the rt2x00 project <http://rt2x00.serialmonkey.com>.
......
config RTLWIFI menuconfig RTL_CARDS
tristate "Realtek wireless card support" tristate "Realtek rtlwifi family of devices"
depends on MAC80211 depends on MAC80211 && (PCI || USB)
select FW_LOADER
---help---
This is common code for RTL8192CE/RTL8192CU/RTL8192SE/RTL8723AE
drivers. This module does nothing by itself - the various front-end
drivers need to be enabled to support any desired devices.
If you choose to build as a module, it'll be called rtlwifi.
config RTLWIFI_DEBUG
bool "Debugging output for rtlwifi driver family"
depends on RTLWIFI
default y default y
---help--- ---help---
To use the module option that sets the dynamic-debugging level for, This option will enable support for the Realtek mac80211-based
the front-end driver, this parameter must be "Y". For memory-limited wireless drivers. Drivers rtl8192ce, rtl8192cu, rtl8192se, rtl8192de,
systems, choose "N". If in doubt, choose "Y". rtl8723eu, and rtl8188eu share some common code.
if RTL_CARDS
config RTL8192CE config RTL8192CE
tristate "Realtek RTL8192CE/RTL8188CE Wireless Network Adapter" tristate "Realtek RTL8192CE/RTL8188CE Wireless Network Adapter"
depends on RTLWIFI && PCI depends on PCI
select RTL8192C_COMMON select RTL8192C_COMMON
select RTLWIFI
select RTLWIFI_PCI
---help--- ---help---
This is the driver for Realtek RTL8192CE/RTL8188CE 802.11n PCIe This is the driver for Realtek RTL8192CE/RTL8188CE 802.11n PCIe
wireless network adapters. wireless network adapters.
...@@ -30,7 +23,9 @@ config RTL8192CE ...@@ -30,7 +23,9 @@ config RTL8192CE
config RTL8192SE config RTL8192SE
tristate "Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter" tristate "Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter"
depends on RTLWIFI && PCI depends on PCI
select RTLWIFI
select RTLWIFI_PCI
---help--- ---help---
This is the driver for Realtek RTL8192SE/RTL8191SE 802.11n PCIe This is the driver for Realtek RTL8192SE/RTL8191SE 802.11n PCIe
wireless network adapters. wireless network adapters.
...@@ -39,7 +34,9 @@ config RTL8192SE ...@@ -39,7 +34,9 @@ config RTL8192SE
config RTL8192DE config RTL8192DE
tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter" tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter"
depends on RTLWIFI && PCI depends on PCI
select RTLWIFI
select RTLWIFI_PCI
---help--- ---help---
This is the driver for Realtek RTL8192DE/RTL8188DE 802.11n PCIe This is the driver for Realtek RTL8192DE/RTL8188DE 802.11n PCIe
wireless network adapters. wireless network adapters.
...@@ -48,7 +45,9 @@ config RTL8192DE ...@@ -48,7 +45,9 @@ config RTL8192DE
config RTL8723AE config RTL8723AE
tristate "Realtek RTL8723AE PCIe Wireless Network Adapter" tristate "Realtek RTL8723AE PCIe Wireless Network Adapter"
depends on RTLWIFI && PCI depends on PCI
select RTLWIFI
select RTLWIFI_PCI
---help--- ---help---
This is the driver for Realtek RTL8723AE 802.11n PCIe This is the driver for Realtek RTL8723AE 802.11n PCIe
wireless network adapters. wireless network adapters.
...@@ -57,7 +56,9 @@ config RTL8723AE ...@@ -57,7 +56,9 @@ config RTL8723AE
config RTL8188EE config RTL8188EE
tristate "Realtek RTL8188EE Wireless Network Adapter" tristate "Realtek RTL8188EE Wireless Network Adapter"
depends on RTLWIFI && PCI depends on PCI
select RTLWIFI
select RTLWIFI_PCI
---help--- ---help---
This is the driver for Realtek RTL8188EE 802.11n PCIe This is the driver for Realtek RTL8188EE 802.11n PCIe
wireless network adapters. wireless network adapters.
...@@ -66,7 +67,9 @@ config RTL8188EE ...@@ -66,7 +67,9 @@ config RTL8188EE
config RTL8192CU config RTL8192CU
tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter" tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter"
depends on RTLWIFI && USB depends on USB
select RTLWIFI
select RTLWIFI_USB
select RTL8192C_COMMON select RTL8192C_COMMON
---help--- ---help---
This is the driver for Realtek RTL8192CU/RTL8188CU 802.11n USB This is the driver for Realtek RTL8192CU/RTL8188CU 802.11n USB
...@@ -74,7 +77,28 @@ config RTL8192CU ...@@ -74,7 +77,28 @@ config RTL8192CU
If you choose to build it as a module, it will be called rtl8192cu If you choose to build it as a module, it will be called rtl8192cu
config RTLWIFI
tristate
select FW_LOADER
config RTLWIFI_PCI
tristate
config RTLWIFI_USB
tristate
config RTLWIFI_DEBUG
bool "Debugging output for rtlwifi driver family"
depends on RTLWIFI
default y
---help---
To use the module option that sets the dynamic-debugging level for,
the front-end driver, this parameter must be "Y". For memory-limited
systems, choose "N". If in doubt, choose "Y".
config RTL8192C_COMMON config RTL8192C_COMMON
tristate tristate
depends on RTL8192CE || RTL8192CU depends on RTL8192CE || RTL8192CU
default m default y
endif
...@@ -12,13 +12,11 @@ rtlwifi-objs := \ ...@@ -12,13 +12,11 @@ rtlwifi-objs := \
rtl8192c_common-objs += \ rtl8192c_common-objs += \
ifneq ($(CONFIG_PCI),) obj-$(CONFIG_RTLWIFI_PCI) += rtl_pci.o
rtlwifi-objs += pci.o rtl_pci-objs := pci.o
endif
ifneq ($(CONFIG_USB),) obj-$(CONFIG_RTLWIFI_USB) += rtl_usb.o
rtlwifi-objs += usb.o rtl_usb-objs := usb.o
endif
obj-$(CONFIG_RTL8192C_COMMON) += rtl8192c/ obj-$(CONFIG_RTL8192C_COMMON) += rtl8192c/
obj-$(CONFIG_RTL8192CE) += rtl8192ce/ obj-$(CONFIG_RTL8192CE) += rtl8192ce/
......
...@@ -172,6 +172,7 @@ u8 rtl_tid_to_ac(u8 tid) ...@@ -172,6 +172,7 @@ u8 rtl_tid_to_ac(u8 tid)
{ {
return tid_to_ac[tid]; return tid_to_ac[tid];
} }
EXPORT_SYMBOL_GPL(rtl_tid_to_ac);
static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw, static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
struct ieee80211_sta_ht_cap *ht_cap) struct ieee80211_sta_ht_cap *ht_cap)
...@@ -406,6 +407,7 @@ void rtl_deinit_deferred_work(struct ieee80211_hw *hw) ...@@ -406,6 +407,7 @@ void rtl_deinit_deferred_work(struct ieee80211_hw *hw)
cancel_delayed_work(&rtlpriv->works.ps_rfon_wq); cancel_delayed_work(&rtlpriv->works.ps_rfon_wq);
cancel_delayed_work(&rtlpriv->works.fwevt_wq); cancel_delayed_work(&rtlpriv->works.fwevt_wq);
} }
EXPORT_SYMBOL_GPL(rtl_deinit_deferred_work);
void rtl_init_rfkill(struct ieee80211_hw *hw) void rtl_init_rfkill(struct ieee80211_hw *hw)
{ {
...@@ -439,6 +441,7 @@ void rtl_deinit_rfkill(struct ieee80211_hw *hw) ...@@ -439,6 +441,7 @@ void rtl_deinit_rfkill(struct ieee80211_hw *hw)
{ {
wiphy_rfkill_stop_polling(hw->wiphy); wiphy_rfkill_stop_polling(hw->wiphy);
} }
EXPORT_SYMBOL_GPL(rtl_deinit_rfkill);
int rtl_init_core(struct ieee80211_hw *hw) int rtl_init_core(struct ieee80211_hw *hw)
{ {
...@@ -489,10 +492,12 @@ int rtl_init_core(struct ieee80211_hw *hw) ...@@ -489,10 +492,12 @@ int rtl_init_core(struct ieee80211_hw *hw)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(rtl_init_core);
void rtl_deinit_core(struct ieee80211_hw *hw) void rtl_deinit_core(struct ieee80211_hw *hw)
{ {
} }
EXPORT_SYMBOL_GPL(rtl_deinit_core);
void rtl_init_rx_config(struct ieee80211_hw *hw) void rtl_init_rx_config(struct ieee80211_hw *hw)
{ {
...@@ -501,6 +506,7 @@ void rtl_init_rx_config(struct ieee80211_hw *hw) ...@@ -501,6 +506,7 @@ void rtl_init_rx_config(struct ieee80211_hw *hw)
rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf)); rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf));
} }
EXPORT_SYMBOL_GPL(rtl_init_rx_config);
/********************************************************* /*********************************************************
* *
...@@ -879,6 +885,7 @@ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -879,6 +885,7 @@ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb)
return true; return true;
} }
EXPORT_SYMBOL_GPL(rtl_tx_mgmt_proc);
void rtl_get_tcb_desc(struct ieee80211_hw *hw, void rtl_get_tcb_desc(struct ieee80211_hw *hw,
struct ieee80211_tx_info *info, 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,6 +1059,7 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
return true; return true;
} }
EXPORT_SYMBOL_GPL(rtl_action_proc);
/*should call before software enc*/ /*should call before software enc*/
u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) u8 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,6 +1133,7 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
return false; return false;
} }
EXPORT_SYMBOL_GPL(rtl_is_special_data);
/********************************************************* /*********************************************************
* *
...@@ -1300,6 +1309,7 @@ void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb) ...@@ -1300,6 +1309,7 @@ void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb)
rtlpriv->link_info.bcn_rx_inperiod++; rtlpriv->link_info.bcn_rx_inperiod++;
} }
EXPORT_SYMBOL_GPL(rtl_beacon_statistic);
void rtl_watchdog_wq_callback(void *data) void rtl_watchdog_wq_callback(void *data)
{ {
...@@ -1793,6 +1803,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len) ...@@ -1793,6 +1803,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len)
mac->vendor = vendor; mac->vendor = vendor;
} }
EXPORT_SYMBOL_GPL(rtl_recognize_peer);
/********************************************************* /*********************************************************
* *
...@@ -1849,6 +1860,7 @@ struct attribute_group rtl_attribute_group = { ...@@ -1849,6 +1860,7 @@ struct attribute_group rtl_attribute_group = {
.name = "rtlsysfs", .name = "rtlsysfs",
.attrs = rtl_sysfs_entries, .attrs = rtl_sysfs_entries,
}; };
EXPORT_SYMBOL_GPL(rtl_attribute_group);
MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>"); MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>"); MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
...@@ -1856,7 +1868,8 @@ MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>"); ...@@ -1856,7 +1868,8 @@ MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core"); MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core");
struct rtl_global_var global_var = {}; struct rtl_global_var rtl_global_var = {};
EXPORT_SYMBOL_GPL(rtl_global_var);
static int __init rtl_core_module_init(void) static int __init rtl_core_module_init(void)
{ {
...@@ -1864,8 +1877,8 @@ static int __init rtl_core_module_init(void) ...@@ -1864,8 +1877,8 @@ static int __init rtl_core_module_init(void)
pr_err("Unable to register rtl_rc, use default RC !!\n"); pr_err("Unable to register rtl_rc, use default RC !!\n");
/* init some global vars */ /* init some global vars */
INIT_LIST_HEAD(&global_var.glb_priv_list); INIT_LIST_HEAD(&rtl_global_var.glb_priv_list);
spin_lock_init(&global_var.glb_list_lock); spin_lock_init(&rtl_global_var.glb_list_lock);
return 0; return 0;
} }
......
...@@ -147,7 +147,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len); ...@@ -147,7 +147,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len);
u8 rtl_tid_to_ac(u8 tid); u8 rtl_tid_to_ac(u8 tid);
extern struct attribute_group rtl_attribute_group; extern struct attribute_group rtl_attribute_group;
void rtl_easy_concurrent_retrytimer_callback(unsigned long data); void rtl_easy_concurrent_retrytimer_callback(unsigned long data);
extern struct rtl_global_var global_var; extern struct rtl_global_var rtl_global_var;
int rtlwifi_rate_mapping(struct ieee80211_hw *hw, int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
bool isht, u8 desc_rate, bool first_ampdu); bool isht, u8 desc_rate, bool first_ampdu);
bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb); bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
......
...@@ -1330,3 +1330,4 @@ const struct ieee80211_ops rtl_ops = { ...@@ -1330,3 +1330,4 @@ const struct ieee80211_ops rtl_ops = {
.rfkill_poll = rtl_op_rfkill_poll, .rfkill_poll = rtl_op_rfkill_poll,
.flush = rtl_op_flush, .flush = rtl_op_flush,
}; };
EXPORT_SYMBOL_GPL(rtl_ops);
...@@ -51,3 +51,4 @@ void rtl_dbgp_flag_init(struct ieee80211_hw *hw) ...@@ -51,3 +51,4 @@ void rtl_dbgp_flag_init(struct ieee80211_hw *hw)
/*Init Debug flag enable condition */ /*Init Debug flag enable condition */
} }
EXPORT_SYMBOL_GPL(rtl_dbgp_flag_init);
...@@ -229,6 +229,7 @@ void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf) ...@@ -229,6 +229,7 @@ void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf)
*pbuf = (u8) (value32 & 0xff); *pbuf = (u8) (value32 & 0xff);
} }
EXPORT_SYMBOL_GPL(read_efuse_byte);
void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf) void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
{ {
......
...@@ -35,6 +35,13 @@ ...@@ -35,6 +35,13 @@
#include "efuse.h" #include "efuse.h"
#include <linux/export.h> #include <linux/export.h>
#include <linux/kmemleak.h> #include <linux/kmemleak.h>
#include <linux/module.h>
MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("PCI basic driver for rtlwifi");
static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = { static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = {
PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_INTEL,
...@@ -1008,19 +1015,6 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) ...@@ -1008,19 +1015,6 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
return; return;
} }
static void rtl_lps_change_work_callback(struct work_struct *work)
{
struct rtl_works *rtlworks =
container_of(work, struct rtl_works, lps_change_work);
struct ieee80211_hw *hw = rtlworks->hw;
struct rtl_priv *rtlpriv = rtl_priv(hw);
if (rtlpriv->enter_ps)
rtl_lps_enter(hw);
else
rtl_lps_leave(hw);
}
static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw) static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
{ {
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
...@@ -1899,7 +1893,7 @@ int rtl_pci_probe(struct pci_dev *pdev, ...@@ -1899,7 +1893,7 @@ int rtl_pci_probe(struct pci_dev *pdev,
rtlpriv->rtlhal.interface = INTF_PCI; rtlpriv->rtlhal.interface = INTF_PCI;
rtlpriv->cfg = (struct rtl_hal_cfg *)(id->driver_data); rtlpriv->cfg = (struct rtl_hal_cfg *)(id->driver_data);
rtlpriv->intf_ops = &rtl_pci_ops; rtlpriv->intf_ops = &rtl_pci_ops;
rtlpriv->glb_var = &global_var; rtlpriv->glb_var = &rtl_global_var;
/* /*
*init dbgp flags before all *init dbgp flags before all
......
...@@ -269,6 +269,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw) ...@@ -269,6 +269,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags); spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags);
} }
EXPORT_SYMBOL_GPL(rtl_ips_nic_on);
/*for FW LPS*/ /*for FW LPS*/
...@@ -518,6 +519,7 @@ void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len) ...@@ -518,6 +519,7 @@ void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
"u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed); "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed);
} }
} }
EXPORT_SYMBOL_GPL(rtl_swlps_beacon);
void rtl_swlps_rf_awake(struct ieee80211_hw *hw) void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
{ {
...@@ -611,6 +613,19 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw) ...@@ -611,6 +613,19 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
MSECS(sleep_intv * mac->vif->bss_conf.beacon_int - 40)); MSECS(sleep_intv * mac->vif->bss_conf.beacon_int - 40));
} }
void rtl_lps_change_work_callback(struct work_struct *work)
{
struct rtl_works *rtlworks =
container_of(work, struct rtl_works, lps_change_work);
struct ieee80211_hw *hw = rtlworks->hw;
struct rtl_priv *rtlpriv = rtl_priv(hw);
if (rtlpriv->enter_ps)
rtl_lps_enter(hw);
else
rtl_lps_leave(hw);
}
EXPORT_SYMBOL_GPL(rtl_lps_change_work_callback);
void rtl_swlps_wq_callback(void *data) void rtl_swlps_wq_callback(void *data)
{ {
...@@ -922,3 +937,4 @@ void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len) ...@@ -922,3 +937,4 @@ void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len)
else else
rtl_p2p_noa_ie(hw, data, len - FCS_LEN); rtl_p2p_noa_ie(hw, data, len - FCS_LEN);
} }
EXPORT_SYMBOL_GPL(rtl_p2p_info);
...@@ -49,5 +49,6 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw); ...@@ -49,5 +49,6 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw);
void rtl_swlps_rf_sleep(struct ieee80211_hw *hw); void rtl_swlps_rf_sleep(struct ieee80211_hw *hw);
void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len); void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len);
void rtl_lps_change_work_callback(struct work_struct *work);
#endif #endif
...@@ -32,6 +32,13 @@ ...@@ -32,6 +32,13 @@
#include "ps.h" #include "ps.h"
#include "rtl8192c/fw_common.h" #include "rtl8192c/fw_common.h"
#include <linux/export.h> #include <linux/export.h>
#include <linux/module.h>
MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("USB basic driver for rtlwifi");
#define REALTEK_USB_VENQT_READ 0xC0 #define REALTEK_USB_VENQT_READ 0xC0
#define REALTEK_USB_VENQT_WRITE 0x40 #define REALTEK_USB_VENQT_WRITE 0x40
...@@ -1070,6 +1077,8 @@ int rtl_usb_probe(struct usb_interface *intf, ...@@ -1070,6 +1077,8 @@ int rtl_usb_probe(struct usb_interface *intf,
spin_lock_init(&rtlpriv->locks.usb_lock); spin_lock_init(&rtlpriv->locks.usb_lock);
INIT_WORK(&rtlpriv->works.fill_h2c_cmd, INIT_WORK(&rtlpriv->works.fill_h2c_cmd,
rtl_fill_h2c_cmd_work_callback); rtl_fill_h2c_cmd_work_callback);
INIT_WORK(&rtlpriv->works.lps_change_work,
rtl_lps_change_work_callback);
rtlpriv->usb_data_index = 0; rtlpriv->usb_data_index = 0;
init_completion(&rtlpriv->firmware_loading_complete); init_completion(&rtlpriv->firmware_loading_complete);
......
...@@ -361,7 +361,8 @@ struct ssb_device_id { ...@@ -361,7 +361,8 @@ struct ssb_device_id {
__u16 vendor; __u16 vendor;
__u16 coreid; __u16 coreid;
__u8 revision; __u8 revision;
}; __u8 __pad;
} __attribute__((packed, aligned(2)));
#define SSB_DEVICE(_vendor, _coreid, _revision) \ #define SSB_DEVICE(_vendor, _coreid, _revision) \
{ .vendor = _vendor, .coreid = _coreid, .revision = _revision, } { .vendor = _vendor, .coreid = _coreid, .revision = _revision, }
#define SSB_DEVTABLE_END \ #define SSB_DEVTABLE_END \
...@@ -377,7 +378,7 @@ struct bcma_device_id { ...@@ -377,7 +378,7 @@ struct bcma_device_id {
__u16 id; __u16 id;
__u8 rev; __u8 rev;
__u8 class; __u8 class;
}; } __attribute__((packed,aligned(2)));
#define BCMA_CORE(_manuf, _id, _rev, _class) \ #define BCMA_CORE(_manuf, _id, _rev, _class) \
{ .manuf = _manuf, .id = _id, .rev = _rev, .class = _class, } { .manuf = _manuf, .id = _id, .rev = _rev, .class = _class, }
#define BCMA_CORETABLE_END \ #define BCMA_CORETABLE_END \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment