* 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>
---
 drivers/net/wireless/Kconfig           |   13 ++++++--
 drivers/net/wireless/libertas/Makefile |    4 +-
 drivers/net/wireless/libertas/cmd.c    |    1 +
 drivers/net/wireless/libertas/decl.h   |    8 +----
 drivers/net/wireless/libertas/fw.c     |   14 +++-----
 drivers/net/wireless/libertas/if_usb.c |   52 +++++++++++++++++++-------------
 drivers/net/wireless/libertas/main.c   |   44 +++++++++++----------------
 drivers/net/wireless/libertas/rx.c     |    1 +
 drivers/net/wireless/libertas/tx.c     |    1 +
 9 files changed, 71 insertions(+), 67 deletions(-)

diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig
index cee3297..1146f3d 100644
--- a/drivers/net/wireless/Kconfig
+++ b/drivers/net/wireless/Kconfig
@@ -280,16 +280,23 @@ config IPW2200_DEBUG
 
 	  If you are not sure, say N here.
 
+config LIBERTAS
+	tristate "Marvell 8xxx Libertas WLAN driver support"
+	depends on NET_RADIO
+	select FW_LOADER
+	---help---
+	  A library for Marvell Libertas 8xxx devices.
+
 config LIBERTAS_USB
-	tristate "Marvell Libertas 8388 802.11a/b/g cards"
-	depends on NET_RADIO && USB
+	tristate "Marvell Libertas 8388 USB 802.11b/g cards"
+	depends on LIBERTAS && USB
 	select FW_LOADER
 	---help---
 	  A driver for Marvell Libertas 8388 USB devices.
 
 config LIBERTAS_DEBUG
 	bool "Enable full debugging output in the Libertas module."
-	depends on LIBERTAS_USB
+	depends on LIBERTAS
 	---help---
 	  Debugging support.
 
diff --git a/drivers/net/wireless/libertas/Makefile b/drivers/net/wireless/libertas/Makefile
index a909e82..71c5a25 100644
--- a/drivers/net/wireless/libertas/Makefile
+++ b/drivers/net/wireless/libertas/Makefile
@@ -1,6 +1,6 @@
 # EXTRA_CFLAGS += -Wpacked
 
-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 		  \
@@ -16,5 +16,5 @@ endif
 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 ac9a982..32904a4 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1458,6 +1458,7 @@ done:
 	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 efb50a2..9c79054 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -74,20 +74,16 @@ void libertas_mac_event_disconnected(wlan_private * priv);
 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 *libertas_add_card(void *card);
-int libertas_activate_card(wlan_private *priv);
+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);
 
-/* preliminary here */
-int if_usb_register(void);
-void if_usb_unregister(void);
-
 
 #endif				/* _WLAN_DECL_H_ */
diff --git a/drivers/net/wireless/libertas/fw.c b/drivers/net/wireless/libertas/fw.c
index 04c2d47..2635ab5 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 @@ static int check_fwfile_format(u8 *data, u32 totlen)
  *  @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;
 	}
 
@@ -250,7 +246,7 @@ static void wlan_init_adapter(wlan_private * priv)
 
 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;
@@ -269,7 +265,7 @@ int libertas_init_fw(wlan_private * priv)
 			(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 7c23689..d19b390 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];
@@ -207,7 +213,7 @@ static int if_usb_probe(struct usb_interface *intf,
 	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 dealloc;
 
 	if (libertas_found < MAX_DEVS) {
@@ -953,33 +959,28 @@ static struct usb_driver if_usb_driver = {
 	.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);
@@ -987,4 +988,13 @@ void if_usb_unregister(void)
 
 	/* 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 5ade47e..6913280 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -25,7 +25,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 */
@@ -166,8 +166,6 @@ u8 libertas_adhoc_rates_b[4] = { 0x82, 0x84, 0x8b, 0x96 };
 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 
  */
@@ -813,6 +811,7 @@ done:
 	lbs_deb_leave_args(LBS_DEB_NET, "priv %p", priv);
 	return priv;
 }
+EXPORT_SYMBOL_GPL(libertas_add_card);
 
 /**
  * @brief This function starts the thread and other logic
@@ -826,7 +825,7 @@ done:
  * @param card    A pointer to card
  * @return 	  0 if successful, -X otherwise
  */
-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;
@@ -853,7 +852,7 @@ int libertas_activate_card(wlan_private *priv)
 	}
 
 	/* 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;
 	}
@@ -883,6 +882,8 @@ done:
 	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
 	return ret;
 }
+EXPORT_SYMBOL_GPL(libertas_activate_card);
+
 
 /**
  * @brief This function adds mshX interface
@@ -942,6 +943,7 @@ done:
 	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)
 {
@@ -1017,6 +1019,8 @@ out:
 	lbs_deb_leave(LBS_DEB_NET);
 	return 0;
 }
+EXPORT_SYMBOL_GPL(libertas_remove_card);
+
 
 void libertas_remove_mesh(wlan_private *priv)
 {
@@ -1041,6 +1045,7 @@ void libertas_remove_mesh(wlan_private *priv)
 out:
 	lbs_deb_leave(LBS_DEB_NET);
 }
+EXPORT_SYMBOL_GPL(libertas_remove_mesh);
 
 /** 
  *  @brief This function finds the CFP in 
@@ -1135,41 +1140,28 @@ void libertas_interrupt(struct net_device *dev)
 
 	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 6a8823f..ca16411 100644
--- a/drivers/net/wireless/libertas/rx.c
+++ b/drivers/net/wireless/libertas/rx.c
@@ -283,6 +283,7 @@ done:
 	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 106fb76..89bf76c 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -281,3 +281,4 @@ void libertas_send_tx_feedback(wlan_private * priv)
 	if (priv->adapter->connect_status == libertas_connected)
 		netif_wake_queue(priv->wlan_dev.netdev);
 }
+EXPORT_SYMBOL_GPL(libertas_send_tx_feedback);
-- 
1.4.4.4

