[PATCH] libertas: split module into two (libertas.ko and usb8xxx.ko)
* add CONFIG_LIBERTAS to Kconfig
* remove global variable libertas_fw_name, the USB module might want to
use a different default FW name than the CF module, so libertas_fw_name
is now local to if_usb.c
* exported some symbols as GPL
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig
index e3f5bb0..89514f3 100644
--- a/drivers/net/wireless/Kconfig
+++ b/drivers/net/wireless/Kconfig
@@ -266,16 +266,22 @@
If you are not sure, say N here.
-config LIBERTAS_USB
- tristate "Marvell Libertas 8388 802.11a/b/g cards"
- depends on USB && WLAN_80211
+config LIBERTAS
+ tristate "Marvell 8xxx Libertas WLAN driver support"
+ depends on WLAN_80211
select FW_LOADER
---help---
+ A library for Marvell Libertas 8xxx devices.
+
+config LIBERTAS_USB
+ tristate "Marvell Libertas 8388 USB 802.11b/g cards"
+ depends on LIBERTAS && USB
+ ---help---
A driver for Marvell Libertas 8388 USB devices.
-config LIBERTAS_USB_DEBUG
- bool "Enable full debugging output in the Libertas USB module."
- depends on LIBERTAS_USB
+config LIBERTAS_DEBUG
+ bool "Enable full debugging output in the Libertas module."
+ depends on LIBERTAS
---help---
Debugging support.
diff --git a/drivers/net/wireless/libertas/Makefile b/drivers/net/wireless/libertas/Makefile
index 56a8ea1..a1097f5 100644
--- a/drivers/net/wireless/libertas/Makefile
+++ b/drivers/net/wireless/libertas/Makefile
@@ -1,4 +1,4 @@
-usb8xxx-objs := main.o fw.o wext.o \
+libertas-objs := main.o fw.o wext.o \
rx.o tx.o cmd.o \
cmdresp.o scan.o \
join.o 11d.o \
@@ -8,5 +8,5 @@
usb8xxx-objs += if_bootcmd.o
usb8xxx-objs += if_usb.o
+obj-$(CONFIG_LIBERTAS) += libertas.o
obj-$(CONFIG_LIBERTAS_USB) += usb8xxx.o
-
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 899b115..c6e5019 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1459,6 +1459,7 @@
lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
}
+EXPORT_SYMBOL_GPL(libertas_prepare_and_send_command);
/**
* @brief This function allocates the command buffer and link
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 8b34336..d6fcb33 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -74,20 +74,16 @@
void libertas_send_iwevcustom_event(wlan_private * priv, s8 * str);
/* fw.c */
-int libertas_init_fw(wlan_private * priv);
+int libertas_init_fw(wlan_private * priv, char *fw_name);
/* main.c */
struct chan_freq_power *libertas_get_region_cfp_table(u8 region, u8 band,
int *cfp_no);
-wlan_private *wlan_add_card(void *card);
-int libertas_activate_card(wlan_private *priv);
-int wlan_remove_card(wlan_private *priv);
-int wlan_add_mesh(wlan_private *priv);
-void wlan_remove_mesh(wlan_private *priv);
-
-/* preliminary here */
-int if_usb_register(void);
-void if_usb_unregister(void);
+wlan_private *libertas_add_card(void *card);
+int libertas_activate_card(wlan_private *priv, char *fw_name);
+int libertas_remove_card(wlan_private *priv);
+int libertas_add_mesh(wlan_private *priv);
+void libertas_remove_mesh(wlan_private *priv);
#endif /* _WLAN_DECL_H_ */
diff --git a/drivers/net/wireless/libertas/fw.c b/drivers/net/wireless/libertas/fw.c
index aa63a96..08c914b 100644
--- a/drivers/net/wireless/libertas/fw.c
+++ b/drivers/net/wireless/libertas/fw.c
@@ -1,7 +1,6 @@
/**
* This file contains the initialization for FW and HW
*/
-#include <linux/moduleparam.h>
#include <linux/firmware.h>
#include "host.h"
@@ -11,9 +10,6 @@
#include "wext.h"
#include "if_usb.h"
-char *libertas_fw_name = NULL;
-module_param_named(fw_name, libertas_fw_name, charp, 0644);
-
/**
* @brief This function checks the validity of Boot2/FW image.
*
@@ -67,18 +63,18 @@
* @param priv A pointer to wlan_private structure
* @return 0 or -1
*/
-static int wlan_setup_station_hw(wlan_private * priv)
+static int wlan_setup_station_hw(wlan_private * priv, char *fw_name)
{
int ret = -1;
wlan_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_FW);
- if ((ret = request_firmware(&priv->firmware, libertas_fw_name,
+ if ((ret = request_firmware(&priv->firmware, fw_name,
priv->hotplug_device)) < 0) {
lbs_pr_err("request_firmware() failed with %#x\n",
ret);
- lbs_pr_err("firmware %s not found\n", libertas_fw_name);
+ lbs_pr_err("firmware %s not found\n", fw_name);
goto done;
}
@@ -247,7 +243,7 @@
static void command_timer_fn(unsigned long data);
-int libertas_init_fw(wlan_private * priv)
+int libertas_init_fw(wlan_private * priv, char *fw_name)
{
int ret = -1;
wlan_adapter *adapter = priv->adapter;
@@ -266,7 +262,7 @@
(unsigned long)priv);
/* download fimrware etc. */
- if ((ret = wlan_setup_station_hw(priv)) != 0) {
+ if ((ret = wlan_setup_station_hw(priv, fw_name)) != 0) {
del_timer_sync(&adapter->command_timer);
goto done;
}
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 5b0e0f7..ca5d012 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -2,6 +2,7 @@
* This file contains functions used in USB interface module.
*/
#include <linux/delay.h>
+#include <linux/moduleparam.h>
#include <linux/firmware.h>
#include <linux/netdevice.h>
#include <linux/usb.h>
@@ -15,6 +16,11 @@
#define MESSAGE_HEADER_LEN 4
static const char usbdriver_name[] = "usb8xxx";
+static u8 *default_fw_name = "usb8388.bin";
+
+char *libertas_fw_name = NULL;
+module_param_named(fw_name, libertas_fw_name, charp, 0644);
+
#define MAX_DEVS 5
static struct net_device *libertas_devs[MAX_DEVS];
@@ -195,14 +201,14 @@
}
- /* At this point wlan_add_card() will be called. Don't worry
+ /* At this point libertas_add_card() will be called. Don't worry
* about keeping pwlanpriv around since it will be set on our
* usb device data in -> add() -> hw_register_dev() -> if_usb_register_dev.
*/
- if (!(priv = wlan_add_card(usb_cardp)))
+ if (!(priv = libertas_add_card(usb_cardp)))
goto dealloc;
- if (wlan_add_mesh(priv))
+ if (libertas_add_mesh(priv))
goto err_add_mesh;
priv->hw_register_dev = if_usb_register_dev;
@@ -212,7 +218,7 @@
priv->hw_get_int_status = if_usb_get_int_status;
priv->hw_read_event_cause = if_usb_read_event_cause;
- if (libertas_activate_card(priv))
+ if (libertas_activate_card(priv, libertas_fw_name))
goto err_activate_card;
if (libertas_found < MAX_DEVS) {
@@ -273,8 +279,8 @@
/* card is removed and we can call wlan_remove_card */
lbs_deb_usbd(&cardp->udev->dev, "call remove card\n");
- wlan_remove_mesh(priv);
- wlan_remove_card(priv);
+ libertas_remove_mesh(priv);
+ libertas_remove_card(priv);
/* Unlink and free urb */
if_usb_free(cardp);
@@ -964,33 +970,28 @@
.resume = if_usb_resume,
};
-/**
- * @brief This function registers driver.
- * @param add pointer to add_card callback function
- * @param remove pointer to remove card callback function
- * @param arg pointer to call back function parameter
- * @return dummy success variable
- */
-int if_usb_register(void)
+static int if_usb_init_module(void)
{
- /*
- * API registers the Marvell USB driver
- * to the USB system
- */
- usb_register(&if_usb_driver);
+ int ret = 0;
- /* Return success to wlan layer */
- return 0;
+ lbs_deb_enter(LBS_DEB_MAIN);
+
+ if (libertas_fw_name == NULL) {
+ libertas_fw_name = default_fw_name;
+ }
+
+ ret = usb_register(&if_usb_driver);
+
+ lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
+ return ret;
}
-/**
- * @brief This function removes usb driver.
- * @return N/A
- */
-void if_usb_unregister(void)
+static void if_usb_exit_module(void)
{
int i;
+ lbs_deb_enter(LBS_DEB_MAIN);
+
for (i = 0; i<libertas_found; i++) {
wlan_private *priv = libertas_devs[i]->priv;
reset_device(priv);
@@ -998,4 +999,13 @@
/* API unregisters the driver from USB subsystem */
usb_deregister(&if_usb_driver);
+
+ lbs_deb_leave(LBS_DEB_MAIN);
}
+
+module_init(if_usb_init_module);
+module_exit(if_usb_exit_module);
+
+MODULE_DESCRIPTION("8388 USB WLAN Driver");
+MODULE_AUTHOR("Marvell International Ltd.");
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index c9d155c..8c1f0e1 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -32,7 +32,7 @@
/* Module parameters */
unsigned int libertas_debug = 0;
module_param(libertas_debug, int, 0644);
-
+EXPORT_SYMBOL_GPL(libertas_debug);
#define WLAN_TX_PWR_DEFAULT 20 /*100mW */
@@ -173,8 +173,6 @@
u16 libertas_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
{ 0x10, 0x20, 0x30, 0x31, 0x32, 0x40 };
-static u8 *default_fw_name = "usb8388.bin";
-
/**
* Attributes exported through sysfs
*/
@@ -766,7 +764,7 @@
* @param card A pointer to card
* @return A pointer to wlan_private structure
*/
-wlan_private *wlan_add_card(void *card)
+wlan_private *libertas_add_card(void *card)
{
struct net_device *dev = NULL;
wlan_private *priv = NULL;
@@ -826,8 +824,9 @@
lbs_deb_leave_args(LBS_DEB_NET, "priv %p", priv);
return priv;
}
+EXPORT_SYMBOL_GPL(libertas_add_card);
-int libertas_activate_card(wlan_private *priv)
+int libertas_activate_card(wlan_private *priv, char *fw_name)
{
struct net_device *dev = priv->wlan_dev.netdev;
int ret = -1;
@@ -854,7 +853,7 @@
}
/* init FW and HW */
- if (libertas_init_fw(priv)) {
+ if (fw_name && libertas_init_fw(priv, fw_name)) {
lbs_pr_err("firmware init failed\n");
goto err_registerdev;
}
@@ -884,6 +883,8 @@
lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
return ret;
}
+EXPORT_SYMBOL_GPL(libertas_activate_card);
+
/**
* @brief This function adds mshX interface
@@ -891,7 +892,7 @@
* @param priv A pointer to the wlan_private structure
* @return 0 if successful, -X otherwise
*/
-int wlan_add_mesh(wlan_private *priv)
+int libertas_add_mesh(wlan_private *priv)
{
struct net_device *mesh_dev = NULL;
int ret = 0;
@@ -949,6 +950,7 @@
lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret);
return ret;
}
+EXPORT_SYMBOL_GPL(libertas_add_mesh);
static void wake_pending_cmdnodes(wlan_private *priv)
{
@@ -966,7 +968,7 @@
}
-int wlan_remove_card(wlan_private *priv)
+int libertas_remove_card(wlan_private *priv)
{
wlan_adapter *adapter;
struct net_device *dev;
@@ -1022,8 +1024,10 @@
lbs_deb_leave(LBS_DEB_NET);
return 0;
}
+EXPORT_SYMBOL_GPL(libertas_remove_card);
-void wlan_remove_mesh(wlan_private *priv)
+
+void libertas_remove_mesh(wlan_private *priv)
{
struct net_device *mesh_dev;
@@ -1046,6 +1050,7 @@
out:
lbs_deb_leave(LBS_DEB_NET);
}
+EXPORT_SYMBOL_GPL(libertas_remove_mesh);
/**
* @brief This function finds the CFP in
@@ -1141,41 +1146,28 @@
lbs_deb_leave(LBS_DEB_THREAD);
}
+EXPORT_SYMBOL_GPL(libertas_interrupt);
-static int wlan_init_module(void)
+static int libertas_init_module(void)
{
- int ret = 0;
-
lbs_deb_enter(LBS_DEB_MAIN);
-
- if (libertas_fw_name == NULL) {
- libertas_fw_name = default_fw_name;
- }
-
libertas_debugfs_init();
-
- if (if_usb_register()) {
- ret = -1;
- libertas_debugfs_remove();
- }
-
- lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
- return ret;
+ lbs_deb_leave(LBS_DEB_MAIN);
+ return 0;
}
-static void wlan_cleanup_module(void)
+static void libertas_exit_module(void)
{
lbs_deb_enter(LBS_DEB_MAIN);
- if_usb_unregister();
libertas_debugfs_remove();
lbs_deb_leave(LBS_DEB_MAIN);
}
-module_init(wlan_init_module);
-module_exit(wlan_cleanup_module);
+module_init(libertas_init_module);
+module_exit(libertas_exit_module);
-MODULE_DESCRIPTION("M-WLAN Driver");
+MODULE_DESCRIPTION("Libertas WLAN Driver Library");
MODULE_AUTHOR("Marvell International Ltd.");
MODULE_LICENSE("GPL");
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c
index a0779dc..0b7854d 100644
--- a/drivers/net/wireless/libertas/rx.c
+++ b/drivers/net/wireless/libertas/rx.c
@@ -277,6 +277,7 @@
lbs_deb_leave_args(LBS_DEB_RX, "ret %d", ret);
return ret;
}
+EXPORT_SYMBOL_GPL(libertas_process_rxed_packet);
/**
* @brief This function converts Tx/Rx rates from the Marvell WLAN format
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 1993e8e..138668e 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -287,3 +287,4 @@
netif_wake_queue(priv->mesh_dev);
}
}
+EXPORT_SYMBOL_GPL(libertas_send_tx_feedback);