[PATCH 1/6] libertas: remove fw.c

Dan Williams dcbw at redhat.com
Tue Jun 19 13:27:14 EDT 2007


On Tue, 2007-06-19 at 13:54 +0200, Holger Schurig wrote:
> From: Holger Schurig <hs4233 at mail.mn-solutions.de>
> 
> Firmware download is quite different for different hardware. The SDIO and CF
> cards have two flat files that need to be downloaded, whereas the USB driver
> needs only one file, but with an internal structure.
> 
> The code that handles this (USB only) structured file is currently in fw.c.
> This patch moves this code into if_usb.c. The remaining functions in fw.c
> have not much to do with firmware, they are various card- and network-stack
> initialisation functions. I've moved them into main.c.
> 
> Signed-off-by: Holger Schurig <hs4233 at mail.mn-solutions.de>
> ---

Committed, thanks.


>  drivers/net/wireless/libertas/Makefile |    2 
>  drivers/net/wireless/libertas/decl.h   |    7 -
>  drivers/net/wireless/libertas/fw.c     |  349 --------------------------------
>  drivers/net/wireless/libertas/if_usb.c |   88 ++++++++
>  drivers/net/wireless/libertas/main.c   |  276 +++++++++++++++++++++++++
>  5 files changed, 361 insertions(+), 361 deletions(-)
> 
> diff --git a/drivers/net/wireless/libertas/Makefile b/drivers/net/wireless/libertas/Makefile
> index a1097f5..567fd49 100644
> --- a/drivers/net/wireless/libertas/Makefile
> +++ b/drivers/net/wireless/libertas/Makefile
> @@ -1,4 +1,4 @@
> -libertas-objs := main.o fw.o wext.o \
> +libertas-objs := main.o wext.o \
>  		rx.o tx.o cmd.o 	  \
>  		cmdresp.o scan.o	  \
>  		join.o 11d.o 		  \
> diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
> index 40f56bb..e94490d 100644
> --- a/drivers/net/wireless/libertas/decl.h
> +++ b/drivers/net/wireless/libertas/decl.h
> @@ -15,8 +15,6 @@ struct wlan_private;
>  struct sk_buff;
>  struct net_device;
>  
> -extern char *libertas_fw_name;
> -
>  void libertas_free_adapter(wlan_private * priv);
>  int libertas_set_mac_packet_filter(wlan_private * priv);
>  
> @@ -75,14 +73,11 @@ 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, 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, struct device *dmdev);
> -int libertas_activate_card(wlan_private *priv, char *fw_name);
> +int libertas_activate_card(wlan_private *priv);
>  int libertas_remove_card(wlan_private *priv);
>  int libertas_add_mesh(wlan_private *priv, struct device *dev);
>  void libertas_remove_mesh(wlan_private *priv);
> diff --git a/drivers/net/wireless/libertas/fw.c b/drivers/net/wireless/libertas/fw.c
> deleted file mode 100644
> index 2dc84ff..0000000
> --- a/drivers/net/wireless/libertas/fw.c
> +++ /dev/null
> @@ -1,349 +0,0 @@
> -/**
> -  * This file contains the initialization for FW and HW
> -  */
> -#include <linux/firmware.h>
> -
> -#include "host.h"
> -#include "defs.h"
> -#include "decl.h"
> -#include "dev.h"
> -#include "wext.h"
> -#include "if_usb.h"
> -
> -/**
> - *  @brief This function checks the validity of Boot2/FW image.
> - *
> - *  @param data              pointer to image
> - *         len               image length
> - *  @return     0 or -1
> - */
> -static int check_fwfile_format(u8 *data, u32 totlen)
> -{
> -	u32 bincmd, exit;
> -	u32 blksize, offset, len;
> -	int ret;
> -
> -	ret = 1;
> -	exit = len = 0;
> -
> -	do {
> -		struct fwheader *fwh = (void *)data;
> -
> -		bincmd = le32_to_cpu(fwh->dnldcmd);
> -		blksize = le32_to_cpu(fwh->datalength);
> -		switch (bincmd) {
> -		case FW_HAS_DATA_TO_RECV:
> -			offset = sizeof(struct fwheader) + blksize;
> -			data += offset;
> -			len += offset;
> -			if (len >= totlen)
> -				exit = 1;
> -			break;
> -		case FW_HAS_LAST_BLOCK:
> -			exit = 1;
> -			ret = 0;
> -			break;
> -		default:
> -			exit = 1;
> -			break;
> -		}
> -	} while (!exit);
> -
> -	if (ret)
> -		lbs_pr_err("firmware file format check FAIL\n");
> -	else
> -		lbs_deb_fw("firmware file format check PASS\n");
> -
> -	return ret;
> -}
> -
> -/**
> - *  @brief This function downloads firmware image, gets
> - *  HW spec from firmware and set basic parameters to
> - *  firmware.
> - *
> - *  @param priv    A pointer to wlan_private structure
> - *  @return 	   0 or -1
> - */
> -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, fw_name,
> -				    priv->hotplug_device)) < 0) {
> -		lbs_pr_err("request_firmware() failed with %#x\n", ret);
> -		lbs_pr_err("firmware %s not found\n", fw_name);
> -		goto done;
> -	}
> -
> -	if (check_fwfile_format(priv->firmware->data, priv->firmware->size)) {
> -		release_firmware(priv->firmware);
> -		goto done;
> -	}
> -
> -	ret = priv->hw_prog_firmware(priv);
> -
> -	release_firmware(priv->firmware);
> -
> -	if (ret) {
> -		lbs_deb_fw("bootloader in invalid state\n");
> -		ret = -1;
> -		goto done;
> -	}
> -
> -	/*
> -	 * Read MAC address from HW
> -	 */
> -	memset(adapter->current_addr, 0xff, ETH_ALEN);
> -
> -	ret = libertas_prepare_and_send_command(priv, cmd_get_hw_spec,
> -				    0, cmd_option_waitforrsp, 0, NULL);
> -
> -	if (ret) {
> -		ret = -1;
> -		goto done;
> -	}
> -
> -	libertas_set_mac_packet_filter(priv);
> -
> -	/* Get the supported Data rates */
> -	ret = libertas_prepare_and_send_command(priv, cmd_802_11_data_rate,
> -				    cmd_act_get_tx_rate,
> -				    cmd_option_waitforrsp, 0, NULL);
> -
> -	if (ret) {
> -		ret = -1;
> -		goto done;
> -	}
> -
> -	ret = 0;
> -done:
> -	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
> -	return ret;
> -}
> -
> -static int wlan_allocate_adapter(wlan_private * priv)
> -{
> -	size_t bufsize;
> -	wlan_adapter *adapter = priv->adapter;
> -
> -	/* Allocate buffer to store the BSSID list */
> -	bufsize = MAX_NETWORK_COUNT * sizeof(struct bss_descriptor);
> -	adapter->networks = kzalloc(bufsize, GFP_KERNEL);
> -	if (!adapter->networks) {
> -		lbs_pr_err("Out of memory allocating beacons\n");
> -		libertas_free_adapter(priv);
> -		return -ENOMEM;
> -	}
> -
> -	/* Allocate the command buffers */
> -	libertas_allocate_cmd_buffer(priv);
> -
> -	memset(&adapter->libertas_ps_confirm_sleep, 0, sizeof(struct PS_CMD_ConfirmSleep));
> -	adapter->libertas_ps_confirm_sleep.seqnum = cpu_to_le16(++adapter->seqnum);
> -	adapter->libertas_ps_confirm_sleep.command =
> -	    cpu_to_le16(cmd_802_11_ps_mode);
> -	adapter->libertas_ps_confirm_sleep.size =
> -	    cpu_to_le16(sizeof(struct PS_CMD_ConfirmSleep));
> -	adapter->libertas_ps_confirm_sleep.result = 0;
> -	adapter->libertas_ps_confirm_sleep.action =
> -	    cpu_to_le16(cmd_subcmd_sleep_confirmed);
> -
> -	return 0;
> -}
> -
> -static void wlan_init_adapter(wlan_private * priv)
> -{
> -	wlan_adapter *adapter = priv->adapter;
> -	int i;
> -
> -	adapter->scanprobes = 0;
> -
> -	adapter->bcn_avg_factor = DEFAULT_BCN_AVG_FACTOR;
> -	adapter->data_avg_factor = DEFAULT_DATA_AVG_FACTOR;
> -
> -	/* ATIM params */
> -	adapter->atimwindow = 0;
> -
> -	adapter->connect_status = libertas_disconnected;
> -	memset(adapter->current_addr, 0xff, ETH_ALEN);
> -
> -	/* scan type */
> -	adapter->scantype = cmd_scan_type_active;
> -
> -	/* scan mode */
> -	adapter->scanmode = cmd_bss_type_any;
> -
> -	/* 802.11 specific */
> -	adapter->secinfo.wep_enabled = 0;
> -	for (i = 0; i < sizeof(adapter->wep_keys) / sizeof(adapter->wep_keys[0]);
> -	     i++)
> -		memset(&adapter->wep_keys[i], 0, sizeof(struct WLAN_802_11_KEY));
> -	adapter->wep_tx_keyidx = 0;
> -	adapter->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM;
> -	adapter->mode = IW_MODE_INFRA;
> -
> -	adapter->pending_assoc_req = NULL;
> -	adapter->in_progress_assoc_req = NULL;
> -
> -	/* Initialize scan result lists */
> -	INIT_LIST_HEAD(&adapter->network_free_list);
> -	INIT_LIST_HEAD(&adapter->network_list);
> -	for (i = 0; i < MAX_NETWORK_COUNT; i++) {
> -		list_add_tail(&adapter->networks[i].list,
> -			      &adapter->network_free_list);
> -	}
> -
> -	mutex_init(&adapter->lock);
> -
> -	adapter->prescan = 1;
> -
> -	memset(&adapter->curbssparams, 0, sizeof(adapter->curbssparams));
> -	adapter->curbssparams.channel = DEFAULT_AD_HOC_CHANNEL;
> -
> -	/* PnP and power profile */
> -	adapter->surpriseremoved = 0;
> -
> -	adapter->currentpacketfilter =
> -	    cmd_act_mac_rx_on | cmd_act_mac_tx_on;
> -
> -	adapter->radioon = RADIO_ON;
> -	adapter->txantenna = RF_ANTENNA_2;
> -	adapter->rxantenna = RF_ANTENNA_AUTO;
> -
> -	adapter->is_datarate_auto = 1;
> -	adapter->beaconperiod = MRVDRV_BEACON_INTERVAL;
> -
> -	// set default value of capinfo.
> -#define SHORT_PREAMBLE_ALLOWED		1
> -	memset(&adapter->capinfo, 0, sizeof(adapter->capinfo));
> -	adapter->capinfo.shortpreamble = SHORT_PREAMBLE_ALLOWED;
> -
> -	adapter->psmode = wlan802_11powermodecam;
> -	adapter->multipledtim = MRVDRV_DEFAULT_MULTIPLE_DTIM;
> -
> -	adapter->listeninterval = MRVDRV_DEFAULT_LISTEN_INTERVAL;
> -
> -	adapter->psstate = PS_STATE_FULL_POWER;
> -	adapter->needtowakeup = 0;
> -	adapter->locallisteninterval = 0;	/* default value in firmware will be used */
> -
> -	adapter->datarate = 0;	// Initially indicate the rate as auto
> -
> -	adapter->adhoc_grate_enabled = 0;
> -
> -	adapter->intcounter = 0;
> -
> -	adapter->currenttxskb = NULL;
> -	adapter->pkttxctrl = 0;
> -
> -	memset(&adapter->tx_queue_ps, 0, NR_TX_QUEUE*sizeof(struct sk_buff*));
> -	adapter->tx_queue_idx = 0;
> -	spin_lock_init(&adapter->txqueue_lock);
> -
> -	return;
> -}
> -
> -static void command_timer_fn(unsigned long data);
> -
> -int libertas_init_fw(wlan_private * priv, char *fw_name)
> -{
> -	int ret = -1;
> -	wlan_adapter *adapter = priv->adapter;
> -
> -	lbs_deb_enter(LBS_DEB_FW);
> -
> -	/* Allocate adapter structure */
> -	if ((ret = wlan_allocate_adapter(priv)) != 0)
> -		goto done;
> -
> -	/* init adapter structure */
> -	wlan_init_adapter(priv);
> -
> -	/* init timer etc. */
> -	setup_timer(&adapter->command_timer, command_timer_fn,
> -			(unsigned long)priv);
> -
> -	/* download fimrware etc. */
> -	if ((ret = wlan_setup_station_hw(priv, fw_name)) != 0) {
> -		del_timer_sync(&adapter->command_timer);
> -		goto done;
> -	}
> -
> -	/* init 802.11d */
> -	libertas_init_11d(priv);
> -
> -	ret = 0;
> -done:
> -	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
> -	return ret;
> -}
> -
> -void libertas_free_adapter(wlan_private * priv)
> -{
> -	wlan_adapter *adapter = priv->adapter;
> -
> -	if (!adapter) {
> -		lbs_deb_fw("why double free adapter?\n");
> -		return;
> -	}
> -
> -	lbs_deb_fw("free command buffer\n");
> -	libertas_free_cmd_buffer(priv);
> -
> -	lbs_deb_fw("free command_timer\n");
> -	del_timer(&adapter->command_timer);
> -
> -	lbs_deb_fw("free scan results table\n");
> -	kfree(adapter->networks);
> -	adapter->networks = NULL;
> -
> -	/* Free the adapter object itself */
> -	lbs_deb_fw("free adapter\n");
> -	kfree(adapter);
> -	priv->adapter = NULL;
> -}
> -
> -/**
> - *  This function handles the timeout of command sending.
> - *  It will re-send the same command again.
> - */
> -static void command_timer_fn(unsigned long data)
> -{
> -	wlan_private *priv = (wlan_private *)data;
> -	wlan_adapter *adapter = priv->adapter;
> -	struct cmd_ctrl_node *ptempnode;
> -	struct cmd_ds_command *cmd;
> -	unsigned long flags;
> -
> -	ptempnode = adapter->cur_cmd;
> -	if (ptempnode == NULL) {
> -		lbs_deb_fw("ptempnode empty\n");
> -		return;
> -	}
> -
> -	cmd = (struct cmd_ds_command *)ptempnode->bufvirtualaddr;
> -	if (!cmd) {
> -		lbs_deb_fw("cmd is NULL\n");
> -		return;
> -	}
> -
> -	lbs_deb_fw("command_timer_fn fired, cmd %x\n", cmd->command);
> -
> -	if (!adapter->fw_ready)
> -		return;
> -
> -	spin_lock_irqsave(&adapter->driver_lock, flags);
> -	adapter->cur_cmd = NULL;
> -	spin_unlock_irqrestore(&adapter->driver_lock, flags);
> -
> -	lbs_deb_fw("re-sending same command because of timeout\n");
> -	libertas_queue_cmd(adapter, ptempnode, 0);
> -
> -	wake_up_interruptible(&priv->mainthread.waitq);
> -
> -	return;
> -}
> diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
> index 9983175..87d9a8b 100644
> --- a/drivers/net/wireless/libertas/if_usb.c
> +++ b/drivers/net/wireless/libertas/if_usb.c
> @@ -21,7 +21,7 @@
>  static const char usbdriver_name[] = "usb8xxx";
>  static u8 *default_fw_name = "usb8388.bin";
>  
> -char *libertas_fw_name = NULL;
> +static char *libertas_fw_name = NULL;
>  module_param_named(fw_name, libertas_fw_name, charp, 0644);
>  
>  /*
> @@ -216,7 +216,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, libertas_fw_name))
> +	if (libertas_activate_card(priv))
>  		goto err_activate_card;
>  
>  	list_add_tail(&cardp->list, &usb_devices);
> @@ -805,7 +805,7 @@ static int if_usb_register_dev(wlan_private * priv)
>  
> 
> 
> -static int if_usb_prog_firmware(wlan_private * priv)
> +static int if_usb_do_prog_firmware(wlan_private * priv)
>  {
>  	struct usb_card_rec *cardp = priv->card;
>  	int i = 0;
> @@ -889,6 +889,88 @@ done:
>  	return ret;
>  }
>  
> +/**
> + *  @brief This function checks the validity of Boot2/FW image.
> + *
> + *  @param data              pointer to image
> + *         len               image length
> + *  @return     0 or -1
> + */
> +static int check_fwfile_format(u8 *data, u32 totlen)
> +{
> +	u32 bincmd, exit;
> +	u32 blksize, offset, len;
> +	int ret;
> +
> +	ret = 1;
> +	exit = len = 0;
> +
> +	do {
> +		struct fwheader *fwh = (void *)data;
> +
> +		bincmd = le32_to_cpu(fwh->dnldcmd);
> +		blksize = le32_to_cpu(fwh->datalength);
> +		switch (bincmd) {
> +		case FW_HAS_DATA_TO_RECV:
> +			offset = sizeof(struct fwheader) + blksize;
> +			data += offset;
> +			len += offset;
> +			if (len >= totlen)
> +				exit = 1;
> +			break;
> +		case FW_HAS_LAST_BLOCK:
> +			exit = 1;
> +			ret = 0;
> +			break;
> +		default:
> +			exit = 1;
> +			break;
> +		}
> +	} while (!exit);
> +
> +	if (ret)
> +		lbs_pr_err("firmware file format check FAIL\n");
> +	else
> +		lbs_deb_fw("firmware file format check PASS\n");
> +
> +	return ret;
> +}
> +
> +/**
> + *  @brief This function downloads firmware image, gets
> + *  HW spec from firmware and set basic parameters to
> + *  firmware.
> + *
> + *  @param priv    A pointer to wlan_private structure
> + *  @return 	   0 or -1
> + */
> +static int if_usb_prog_firmware(wlan_private * priv)
> +{
> +	int ret = -1;
> +
> +	lbs_deb_enter(LBS_DEB_FW);
> +
> +	if ((ret = request_firmware(&priv->firmware, libertas_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);
> +		goto done;
> +	}
> +
> +	if (check_fwfile_format(priv->firmware->data, priv->firmware->size)) {
> +		release_firmware(priv->firmware);
> +		goto done;
> +	}
> +
> +	ret = if_usb_do_prog_firmware(priv);
> +
> +	release_firmware(priv->firmware);
> +
> +done:
> +	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
> +	return ret;
> +}
> +
>  #ifdef CONFIG_PM
>  static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
>  {
> diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
> index 623ab4b..6b18afe 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -762,6 +762,278 @@ static int wlan_service_main_thread(void *data)
>  }
>  
>  /**
> + *  @brief This function gets HW spec from firmware and set
> + *  basic parameters to firmware.
> + *
> + *  @param priv    A pointer to wlan_private structure
> + *  @return 	   0 or -1
> + */
> +static int wlan_setup_station_hw(wlan_private * priv)
> +{
> +	int ret = -1;
> +	wlan_adapter *adapter = priv->adapter;
> +
> +	lbs_deb_enter(LBS_DEB_FW);
> +
> +	ret = priv->hw_prog_firmware(priv);
> +
> +	if (ret) {
> +		lbs_deb_main("bootloader in invalid state\n");
> +		ret = -1;
> +		goto done;
> +	}
> +
> +	/*
> +	 * Read MAC address from HW
> +	 */
> +	memset(adapter->current_addr, 0xff, ETH_ALEN);
> +
> +	ret = libertas_prepare_and_send_command(priv, cmd_get_hw_spec,
> +				    0, cmd_option_waitforrsp, 0, NULL);
> +
> +	if (ret) {
> +		ret = -1;
> +		goto done;
> +	}
> +
> +	libertas_set_mac_packet_filter(priv);
> +
> +	/* Get the supported Data rates */
> +	ret = libertas_prepare_and_send_command(priv, cmd_802_11_data_rate,
> +				    cmd_act_get_tx_rate,
> +				    cmd_option_waitforrsp, 0, NULL);
> +
> +	if (ret) {
> +		ret = -1;
> +		goto done;
> +	}
> +
> +	ret = 0;
> +done:
> +	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
> +	return ret;
> +}
> +
> +/**
> + *  This function handles the timeout of command sending.
> + *  It will re-send the same command again.
> + */
> +static void command_timer_fn(unsigned long data)
> +{
> +	wlan_private *priv = (wlan_private *)data;
> +	wlan_adapter *adapter = priv->adapter;
> +	struct cmd_ctrl_node *ptempnode;
> +	struct cmd_ds_command *cmd;
> +	unsigned long flags;
> +
> +	ptempnode = adapter->cur_cmd;
> +	if (ptempnode == NULL) {
> +		lbs_deb_fw("ptempnode empty\n");
> +		return;
> +	}
> +
> +	cmd = (struct cmd_ds_command *)ptempnode->bufvirtualaddr;
> +	if (!cmd) {
> +		lbs_deb_fw("cmd is NULL\n");
> +		return;
> +	}
> +
> +	lbs_deb_fw("command_timer_fn fired, cmd %x\n", cmd->command);
> +
> +	if (!adapter->fw_ready)
> +		return;
> +
> +	spin_lock_irqsave(&adapter->driver_lock, flags);
> +	adapter->cur_cmd = NULL;
> +	spin_unlock_irqrestore(&adapter->driver_lock, flags);
> +
> +	lbs_deb_fw("re-sending same command because of timeout\n");
> +	libertas_queue_cmd(adapter, ptempnode, 0);
> +
> +	wake_up_interruptible(&priv->mainthread.waitq);
> +}
> +
> +static int wlan_allocate_adapter(wlan_private * priv)
> +{
> +	size_t bufsize;
> +	wlan_adapter *adapter = priv->adapter;
> +
> +	/* Allocate buffer to store the BSSID list */
> +	bufsize = MAX_NETWORK_COUNT * sizeof(struct bss_descriptor);
> +	adapter->networks = kzalloc(bufsize, GFP_KERNEL);
> +	if (!adapter->networks) {
> +		lbs_pr_err("Out of memory allocating beacons\n");
> +		libertas_free_adapter(priv);
> +		return -ENOMEM;
> +	}
> +
> +	/* Allocate the command buffers */
> +	libertas_allocate_cmd_buffer(priv);
> +
> +	memset(&adapter->libertas_ps_confirm_sleep, 0, sizeof(struct PS_CMD_ConfirmSleep));
> +	adapter->libertas_ps_confirm_sleep.seqnum = cpu_to_le16(++adapter->seqnum);
> +	adapter->libertas_ps_confirm_sleep.command =
> +	    cpu_to_le16(cmd_802_11_ps_mode);
> +	adapter->libertas_ps_confirm_sleep.size =
> +	    cpu_to_le16(sizeof(struct PS_CMD_ConfirmSleep));
> +	adapter->libertas_ps_confirm_sleep.result = 0;
> +	adapter->libertas_ps_confirm_sleep.action =
> +	    cpu_to_le16(cmd_subcmd_sleep_confirmed);
> +
> +	return 0;
> +}
> +
> +static void wlan_init_adapter(wlan_private * priv)
> +{
> +	wlan_adapter *adapter = priv->adapter;
> +	int i;
> +
> +	adapter->scanprobes = 0;
> +
> +	adapter->bcn_avg_factor = DEFAULT_BCN_AVG_FACTOR;
> +	adapter->data_avg_factor = DEFAULT_DATA_AVG_FACTOR;
> +
> +	/* ATIM params */
> +	adapter->atimwindow = 0;
> +
> +	adapter->connect_status = libertas_disconnected;
> +	memset(adapter->current_addr, 0xff, ETH_ALEN);
> +
> +	/* scan type */
> +	adapter->scantype = cmd_scan_type_active;
> +
> +	/* scan mode */
> +	adapter->scanmode = cmd_bss_type_any;
> +
> +	/* 802.11 specific */
> +	adapter->secinfo.wep_enabled = 0;
> +	for (i = 0; i < sizeof(adapter->wep_keys) / sizeof(adapter->wep_keys[0]);
> +	     i++)
> +		memset(&adapter->wep_keys[i], 0, sizeof(struct WLAN_802_11_KEY));
> +	adapter->wep_tx_keyidx = 0;
> +	adapter->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM;
> +	adapter->mode = IW_MODE_INFRA;
> +
> +	adapter->pending_assoc_req = NULL;
> +	adapter->in_progress_assoc_req = NULL;
> +
> +	/* Initialize scan result lists */
> +	INIT_LIST_HEAD(&adapter->network_free_list);
> +	INIT_LIST_HEAD(&adapter->network_list);
> +	for (i = 0; i < MAX_NETWORK_COUNT; i++) {
> +		list_add_tail(&adapter->networks[i].list,
> +			      &adapter->network_free_list);
> +	}
> +
> +	mutex_init(&adapter->lock);
> +
> +	adapter->prescan = 1;
> +
> +	memset(&adapter->curbssparams, 0, sizeof(adapter->curbssparams));
> +	adapter->curbssparams.channel = DEFAULT_AD_HOC_CHANNEL;
> +
> +	/* PnP and power profile */
> +	adapter->surpriseremoved = 0;
> +
> +	adapter->currentpacketfilter =
> +	    cmd_act_mac_rx_on | cmd_act_mac_tx_on;
> +
> +	adapter->radioon = RADIO_ON;
> +	adapter->txantenna = RF_ANTENNA_2;
> +	adapter->rxantenna = RF_ANTENNA_AUTO;
> +
> +	adapter->is_datarate_auto = 1;
> +	adapter->beaconperiod = MRVDRV_BEACON_INTERVAL;
> +
> +	// set default value of capinfo.
> +#define SHORT_PREAMBLE_ALLOWED		1
> +	memset(&adapter->capinfo, 0, sizeof(adapter->capinfo));
> +	adapter->capinfo.shortpreamble = SHORT_PREAMBLE_ALLOWED;
> +
> +	adapter->psmode = wlan802_11powermodecam;
> +	adapter->multipledtim = MRVDRV_DEFAULT_MULTIPLE_DTIM;
> +
> +	adapter->listeninterval = MRVDRV_DEFAULT_LISTEN_INTERVAL;
> +
> +	adapter->psstate = PS_STATE_FULL_POWER;
> +	adapter->needtowakeup = 0;
> +	adapter->locallisteninterval = 0;	/* default value in firmware will be used */
> +
> +	adapter->datarate = 0;	// Initially indicate the rate as auto
> +
> +	adapter->adhoc_grate_enabled = 0;
> +
> +	adapter->intcounter = 0;
> +
> +	adapter->currenttxskb = NULL;
> +	adapter->pkttxctrl = 0;
> +
> +	memset(&adapter->tx_queue_ps, 0, NR_TX_QUEUE*sizeof(struct sk_buff*));
> +	adapter->tx_queue_idx = 0;
> +	spin_lock_init(&adapter->txqueue_lock);
> +
> +	return;
> +}
> +
> +static int libertas_init_fw(wlan_private * priv)
> +{
> +	int ret = -1;
> +	wlan_adapter *adapter = priv->adapter;
> +
> +	lbs_deb_enter(LBS_DEB_FW);
> +
> +	/* Allocate adapter structure */
> +	if ((ret = wlan_allocate_adapter(priv)) != 0)
> +		goto done;
> +
> +	/* init adapter structure */
> +	wlan_init_adapter(priv);
> +
> +	/* init timer etc. */
> +	setup_timer(&adapter->command_timer, command_timer_fn,
> +			(unsigned long)priv);
> +
> +	/* download fimrware etc. */
> +	if ((ret = wlan_setup_station_hw(priv)) != 0) {
> +		del_timer_sync(&adapter->command_timer);
> +		goto done;
> +	}
> +
> +	/* init 802.11d */
> +	libertas_init_11d(priv);
> +
> +	ret = 0;
> +done:
> +	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
> +	return ret;
> +}
> +
> +void libertas_free_adapter(wlan_private * priv)
> +{
> +	wlan_adapter *adapter = priv->adapter;
> +
> +	if (!adapter) {
> +		lbs_deb_fw("why double free adapter?\n");
> +		return;
> +	}
> +
> +	lbs_deb_fw("free command buffer\n");
> +	libertas_free_cmd_buffer(priv);
> +
> +	lbs_deb_fw("free command_timer\n");
> +	del_timer(&adapter->command_timer);
> +
> +	lbs_deb_fw("free scan results table\n");
> +	kfree(adapter->networks);
> +	adapter->networks = NULL;
> +
> +	/* Free the adapter object itself */
> +	lbs_deb_fw("free adapter\n");
> +	kfree(adapter);
> +	priv->adapter = NULL;
> +}
> +
> +/**
>   * @brief This function adds the card. it will probe the
>   * card, allocate the wlan_priv and initialize the device.
>   *
> @@ -832,7 +1104,7 @@ done:
>  }
>  EXPORT_SYMBOL_GPL(libertas_add_card);
>  
> -int libertas_activate_card(wlan_private *priv, char *fw_name)
> +int libertas_activate_card(wlan_private *priv)
>  {
>  	struct net_device *dev = priv->dev;
>  	int ret = -1;
> @@ -860,7 +1132,7 @@ int libertas_activate_card(wlan_private *priv, char *fw_name)
>  	}
>  
>  	/* init FW and HW */
> -	if (fw_name && libertas_init_fw(priv, fw_name)) {
> +	if (libertas_init_fw(priv)) {
>  		lbs_pr_err("firmware init failed\n");
>  		goto err_registerdev;
>  	}
> 
> _______________________________________________
> libertas-dev mailing list
> libertas-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/libertas-dev




More information about the libertas-dev mailing list