Search Linux Wireless

Re: Please pull libertas-2.6

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2007-06-12 at 08:43 +0200, Holger Schurig wrote:
> > for bugfixes.  Otherwise I can give you a list of commit IDs
> > to cherry-pick or something like that.
> 
> If we're going to cherry-pick, maybe you can look (and possible
> integrate) my get-rid-of-fw.c-patch that is necessary for
> Compact-Flash (and possibly SDIO based) 83xx cards?

Well; I'm going to commit that one really soon to libertas-2.6, but I
don't think it's 2.6.22 material mainly because there's no code for CF
cards in libertas-2.6 yet anyway...

Dan

> 
> 
> From 605d5440d0a2ff442d0506aa15d4d9f8ebe8e630 Mon Sep 17 00:00:00 2001
> From: Holger Schurig <schurig@xxxxxxxxxxxxxxxxxxxxx>
> Date: Tue, 5 Jun 2007 22:37:04 +0200
> Subject: [PATCH] [libertas] change firmware downlaod logic
> 
> 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.
> 
> This patch moves the firmware downloading code from fw.c into if_usb.c. The
> other code that used to be in fw.c has been moved to main.c.
> 
> Signed-off-by: Holger Schurig <h4233@xxxxxxxxxxxxxxxxxxxx>
> 
> ---
>  drivers/net/wireless/libertas/Makefile |    2 +-
>  drivers/net/wireless/libertas/decl.h   |    5 +-
>  drivers/net/wireless/libertas/fw.c     |  346 --------------------------------
>  drivers/net/wireless/libertas/if_usb.c |   78 +++++++-
>  drivers/net/wireless/libertas/main.c   |  278 +++++++++++++++++++++++++-
>  5 files changed, 354 insertions(+), 355 deletions(-)
>  delete mode 100644 drivers/net/wireless/libertas/fw.c
> 
> diff --git a/drivers/net/wireless/libertas/Makefile b/drivers/net/wireless/libertas/Makefile
> index fdda0f0..4d120c3 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 129b021..113cfc1 100644
> --- a/drivers/net/wireless/libertas/decl.h
> +++ b/drivers/net/wireless/libertas/decl.h
> @@ -75,14 +75,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 6c25987..0000000
> --- a/drivers/net/wireless/libertas/fw.c
> +++ /dev/null
> @@ -1,346 +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 enc_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->auto_rate = 1;
> -	adapter->cur_rate = 0;
> -	adapter->adhoc_grate_enabled = 0;
> -
> -	adapter->beaconperiod = MRVDRV_BEACON_INTERVAL;
> -
> -	// set default capabilities
> -	adapter->capability = WLAN_CAPABILITY_SHORT_PREAMBLE;
> -
> -	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->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->waitq);
> -
> -	return;
> -}
> diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
> index e38fce7..ac1cfc2 100644
> --- a/drivers/net/wireless/libertas/if_usb.c
> +++ b/drivers/net/wireless/libertas/if_usb.c
> @@ -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);
> @@ -819,7 +819,7 @@ static int if_usb_issue_boot_command(wlan_private *priv, int ivalue)
>  }
>  
> 
> -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;
> @@ -903,6 +903,80 @@ 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;
> +}
> +
> +
> +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:
> +	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 4760b01..3835979 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -792,6 +792,280 @@ static int libertas_thread(void *data)
>  }
>  
>  /**
> + *  @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)
> +{
> +	int ret = -1;
> +	wlan_adapter *adapter = priv->adapter;
> +
> +	lbs_deb_enter(LBS_DEB_FW);
> +
> +	ret = priv->hw_prog_firmware(priv);
> +
> +	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 void command_timer_fn(unsigned long data);
> +
> +/**
> + *  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->waitq);
> +
> +	return;
> +}
> +
> +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 enc_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->auto_rate = 1;
> +	adapter->cur_rate = 0;
> +	adapter->adhoc_grate_enabled = 0;
> +
> +	adapter->beaconperiod = MRVDRV_BEACON_INTERVAL;
> +
> +	// set default capabilities
> +	adapter->capability = WLAN_CAPABILITY_SHORT_PREAMBLE;
> +
> +	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->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;
> +}
> +
> +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;
> +}
> +
> +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;
> +}
> +
> +/**
>   * @brief This function adds the card. it will probe the
>   * card, allocate the wlan_priv and initialize the device.
>   *
> @@ -862,7 +1136,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;
> @@ -893,7 +1167,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;
>  	}

-
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux