Commit 6f334c2b authored by Larry Finger's avatar Larry Finger Committed by John W. Linville

rtlwifi: Fix build errors for unusual cases

The present build configuration for the rtlwifi family of drivers will
fail under two known conditions:

(1) If rtlwifi is selected without selecting any of the dependent drivers,
    there are errors in the build.
(2) If the PCI drivers are built into the kernel and the USB drivers are modules,
    or vice versa, there are missing globals.

The first condition is fixed by never building rtlwifi unless at least one
of the device drivers is selected. The second failure is fixed by splitting
the PCI and USB codes out of rtlwifi, and creating their own mini drivers.
If the drivers that use them are modules, they will also be modules.

Although a number of files are touched by this patch, only Makefile and Kconfig
have undergone significant changes. The only modifications to the other files
were to export entry points needed by the new rtl_pci and rtl_usb units, or to
rename two variables that had names that were likely to cause namespace collisions.

Reported-by: Fengguang Wu <fengguang.wu@intel.com>  [Condition 1]
Reported-by: Ben Hutchings <bhutchings@solarflare.com> [Condition 2]
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Cc: Ben Hutchings <bhutchings@solarflare.com>
Cc: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent f287cbd0
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,
...@@ -1886,7 +1893,7 @@ int rtl_pci_probe(struct pci_dev *pdev, ...@@ -1886,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)
{ {
...@@ -623,6 +625,7 @@ void rtl_lps_change_work_callback(struct work_struct *work) ...@@ -623,6 +625,7 @@ void rtl_lps_change_work_callback(struct work_struct *work)
else else
rtl_lps_leave(hw); 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)
{ {
...@@ -934,3 +937,4 @@ void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len) ...@@ -934,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);
...@@ -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
......
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