2 * This file contains the initialization for FW and HW
4 #include <linux/firmware.h>
14 * @brief This function checks the validity of Boot2/FW image.
16 * @param data pointer to image
20 static int check_fwfile_format(u8
*data
, u32 totlen
)
23 u32 blksize
, offset
, len
;
31 blksize
= *(u32
*)(data
+ offsetof(struct fwheader
, datalength
));
33 case FW_HAS_DATA_TO_RECV
:
34 offset
= sizeof(struct fwheader
) + blksize
;
40 case FW_HAS_LAST_BLOCK
:
51 lbs_pr_err("firmware file format check FAIL\n");
53 lbs_deb_fw("firmware file format check PASS\n");
59 * @brief This function downloads firmware image, gets
60 * HW spec from firmware and set basic parameters to
63 * @param priv A pointer to wlan_private structure
66 static int wlan_setup_station_hw(wlan_private
* priv
, char *fw_name
)
69 wlan_adapter
*adapter
= priv
->adapter
;
71 lbs_deb_enter(LBS_DEB_FW
);
73 if ((ret
= request_firmware(&priv
->firmware
, fw_name
,
74 priv
->hotplug_device
)) < 0) {
75 lbs_pr_err("request_firmware() failed with %#x\n",
77 lbs_pr_err("firmware %s not found\n", fw_name
);
81 if(check_fwfile_format(priv
->firmware
->data
, priv
->firmware
->size
)) {
82 release_firmware(priv
->firmware
);
86 ret
= priv
->hw_prog_firmware(priv
);
88 release_firmware(priv
->firmware
);
91 lbs_deb_fw("bootloader in invalid state\n");
97 * Read MAC address from HW
99 memset(adapter
->current_addr
, 0xff, ETH_ALEN
);
101 ret
= libertas_prepare_and_send_command(priv
, cmd_get_hw_spec
,
102 0, cmd_option_waitforrsp
, 0, NULL
);
109 libertas_set_mac_packet_filter(priv
);
111 /* Get the supported Data rates */
112 ret
= libertas_prepare_and_send_command(priv
, cmd_802_11_data_rate
,
114 cmd_option_waitforrsp
, 0, NULL
);
123 lbs_deb_leave_args(LBS_DEB_FW
, "ret %d", ret
);
127 static int wlan_allocate_adapter(wlan_private
* priv
)
130 wlan_adapter
*adapter
= priv
->adapter
;
132 /* Allocate buffer to store the BSSID list */
133 bufsize
= MAX_NETWORK_COUNT
* sizeof(struct bss_descriptor
);
134 adapter
->networks
= kzalloc(bufsize
, GFP_KERNEL
);
135 if (!adapter
->networks
) {
136 lbs_pr_err("Out of memory allocating beacons\n");
137 libertas_free_adapter(priv
);
141 /* Allocate the command buffers */
142 libertas_allocate_cmd_buffer(priv
);
144 memset(&adapter
->libertas_ps_confirm_sleep
, 0, sizeof(struct PS_CMD_ConfirmSleep
));
145 adapter
->libertas_ps_confirm_sleep
.seqnum
= cpu_to_le16(++adapter
->seqnum
);
146 adapter
->libertas_ps_confirm_sleep
.command
=
147 cpu_to_le16(cmd_802_11_ps_mode
);
148 adapter
->libertas_ps_confirm_sleep
.size
=
149 cpu_to_le16(sizeof(struct PS_CMD_ConfirmSleep
));
150 adapter
->libertas_ps_confirm_sleep
.result
= 0;
151 adapter
->libertas_ps_confirm_sleep
.action
=
152 cpu_to_le16(cmd_subcmd_sleep_confirmed
);
157 static void wlan_init_adapter(wlan_private
* priv
)
159 wlan_adapter
*adapter
= priv
->adapter
;
162 adapter
->scanprobes
= 0;
164 adapter
->bcn_avg_factor
= DEFAULT_BCN_AVG_FACTOR
;
165 adapter
->data_avg_factor
= DEFAULT_DATA_AVG_FACTOR
;
168 adapter
->atimwindow
= 0;
170 adapter
->connect_status
= libertas_disconnected
;
171 memset(adapter
->current_addr
, 0xff, ETH_ALEN
);
174 adapter
->scantype
= cmd_scan_type_active
;
177 adapter
->scanmode
= cmd_bss_type_any
;
179 /* 802.11 specific */
180 adapter
->secinfo
.wep_enabled
= 0;
181 for (i
= 0; i
< sizeof(adapter
->wep_keys
) / sizeof(adapter
->wep_keys
[0]);
183 memset(&adapter
->wep_keys
[i
], 0, sizeof(struct WLAN_802_11_KEY
));
184 adapter
->wep_tx_keyidx
= 0;
185 adapter
->secinfo
.auth_mode
= IW_AUTH_ALG_OPEN_SYSTEM
;
186 adapter
->mode
= IW_MODE_INFRA
;
188 adapter
->assoc_req
= NULL
;
190 /* Initialize scan result lists */
191 INIT_LIST_HEAD(&adapter
->network_free_list
);
192 INIT_LIST_HEAD(&adapter
->network_list
);
193 for (i
= 0; i
< MAX_NETWORK_COUNT
; i
++) {
194 list_add_tail(&adapter
->networks
[i
].list
,
195 &adapter
->network_free_list
);
198 adapter
->pattemptedbssdesc
= NULL
;
199 mutex_init(&adapter
->lock
);
201 adapter
->prescan
= 1;
203 memset(&adapter
->curbssparams
, 0, sizeof(adapter
->curbssparams
));
205 /* PnP and power profile */
206 adapter
->surpriseremoved
= 0;
208 adapter
->currentpacketfilter
=
209 cmd_act_mac_rx_on
| cmd_act_mac_tx_on
;
211 adapter
->radioon
= RADIO_ON
;
212 adapter
->txantenna
= RF_ANTENNA_2
;
213 adapter
->rxantenna
= RF_ANTENNA_AUTO
;
215 adapter
->is_datarate_auto
= 1;
216 adapter
->beaconperiod
= MRVDRV_BEACON_INTERVAL
;
218 // set default value of capinfo.
219 #define SHORT_PREAMBLE_ALLOWED 1
220 memset(&adapter
->capinfo
, 0, sizeof(adapter
->capinfo
));
221 adapter
->capinfo
.shortpreamble
= SHORT_PREAMBLE_ALLOWED
;
223 adapter
->adhocchannel
= DEFAULT_AD_HOC_CHANNEL
;
225 adapter
->psmode
= wlan802_11powermodecam
;
226 adapter
->multipledtim
= MRVDRV_DEFAULT_MULTIPLE_DTIM
;
228 adapter
->listeninterval
= MRVDRV_DEFAULT_LISTEN_INTERVAL
;
230 adapter
->psstate
= PS_STATE_FULL_POWER
;
231 adapter
->needtowakeup
= 0;
232 adapter
->locallisteninterval
= 0; /* default value in firmware will be used */
234 adapter
->datarate
= 0; // Initially indicate the rate as auto
236 adapter
->adhoc_grate_enabled
= 0;
238 adapter
->intcounter
= 0;
240 adapter
->currenttxskb
= NULL
;
241 adapter
->pkttxctrl
= 0;
243 memset(&adapter
->tx_queue_ps
, 0, NR_TX_QUEUE
*sizeof(struct sk_buff
*));
244 adapter
->tx_queue_idx
= 0;
245 spin_lock_init(&adapter
->txqueue_lock
);
250 static void command_timer_fn(unsigned long data
);
252 int libertas_init_fw(wlan_private
* priv
, char *fw_name
)
255 wlan_adapter
*adapter
= priv
->adapter
;
257 lbs_deb_enter(LBS_DEB_FW
);
259 /* Allocate adapter structure */
260 if ((ret
= wlan_allocate_adapter(priv
)) != 0)
263 /* init adapter structure */
264 wlan_init_adapter(priv
);
266 /* init timer etc. */
267 setup_timer(&adapter
->command_timer
, command_timer_fn
,
268 (unsigned long)priv
);
270 /* download fimrware etc. */
271 if ((ret
= wlan_setup_station_hw(priv
, fw_name
)) != 0) {
272 del_timer_sync(&adapter
->command_timer
);
277 libertas_init_11d(priv
);
281 lbs_deb_leave_args(LBS_DEB_FW
, "ret %d", ret
);
285 void libertas_free_adapter(wlan_private
* priv
)
287 wlan_adapter
*adapter
= priv
->adapter
;
290 lbs_deb_fw("why double free adapter?\n");
294 lbs_deb_fw("free command buffer\n");
295 libertas_free_cmd_buffer(priv
);
297 lbs_deb_fw("free command_timer\n");
298 del_timer(&adapter
->command_timer
);
300 lbs_deb_fw("free scan results table\n");
301 kfree(adapter
->networks
);
302 adapter
->networks
= NULL
;
304 /* Free the adapter object itself */
305 lbs_deb_fw("free adapter\n");
307 priv
->adapter
= NULL
;
311 * This function handles the timeout of command sending.
312 * It will re-send the same command again.
314 static void command_timer_fn(unsigned long data
)
316 wlan_private
*priv
= (wlan_private
*)data
;
317 wlan_adapter
*adapter
= priv
->adapter
;
318 struct cmd_ctrl_node
*ptempnode
;
319 struct cmd_ds_command
*cmd
;
322 ptempnode
= adapter
->cur_cmd
;
323 if (ptempnode
== NULL
) {
324 lbs_deb_fw("ptempnode empty\n");
328 cmd
= (struct cmd_ds_command
*)ptempnode
->bufvirtualaddr
;
330 lbs_deb_fw("cmd is NULL\n");
334 lbs_deb_fw("command_timer_fn fired, cmd %x\n", cmd
->command
);
336 if (!adapter
->fw_ready
)
339 spin_lock_irqsave(&adapter
->driver_lock
, flags
);
340 adapter
->cur_cmd
= NULL
;
341 spin_unlock_irqrestore(&adapter
->driver_lock
, flags
);
343 lbs_deb_fw("re-sending same command because of timeout\n");
344 libertas_queue_cmd(adapter
, ptempnode
, 0);
346 wake_up_interruptible(&priv
->mainthread
.waitq
);