2 * This file contains the initialization for FW and HW
4 #include <linux/moduleparam.h>
5 #include <linux/firmware.h>
16 char *libertas_fw_name
= NULL
;
17 module_param_named(fw_name
, libertas_fw_name
, charp
, 0644);
20 * @brief This function checks the validity of Boot2/FW image.
22 * @param data pointer to image
26 static int check_fwfile_format(u8
*data
, u32 totlen
)
29 u32 blksize
, offset
, len
;
37 blksize
= *(u32
*)(data
+ offsetof(struct fwheader
, datalength
));
39 case FW_HAS_DATA_TO_RECV
:
40 offset
= sizeof(struct fwheader
) + blksize
;
46 case FW_HAS_LAST_BLOCK
:
57 lbs_pr_err("firmware file format check FAIL\n");
59 lbs_deb_fw("firmware file format check PASS\n");
65 * @brief This function downloads firmware image, gets
66 * HW spec from firmware and set basic parameters to
69 * @param priv A pointer to wlan_private structure
72 static int wlan_setup_station_hw(wlan_private
* priv
)
75 wlan_adapter
*adapter
= priv
->adapter
;
77 lbs_deb_enter(LBS_DEB_FW
);
79 if ((ret
= request_firmware(&priv
->firmware
, libertas_fw_name
,
80 priv
->hotplug_device
)) < 0) {
81 lbs_pr_err("request_firmware() failed with %#x\n",
83 lbs_pr_err("firmware %s not found\n", libertas_fw_name
);
87 if(check_fwfile_format(priv
->firmware
->data
, priv
->firmware
->size
)) {
88 release_firmware(priv
->firmware
);
92 ret
= libertas_sbi_prog_firmware(priv
);
94 release_firmware(priv
->firmware
);
97 lbs_deb_fw("bootloader in invalid state\n");
103 * Read MAC address from HW
105 memset(adapter
->current_addr
, 0xff, ETH_ALEN
);
107 ret
= libertas_prepare_and_send_command(priv
, cmd_get_hw_spec
,
108 0, cmd_option_waitforrsp
, 0, NULL
);
115 libertas_set_mac_packet_filter(priv
);
117 /* Get the supported Data rates */
118 ret
= libertas_prepare_and_send_command(priv
, cmd_802_11_data_rate
,
120 cmd_option_waitforrsp
, 0, NULL
);
129 lbs_deb_leave_args(LBS_DEB_FW
, "ret %d", ret
);
133 static int wlan_allocate_adapter(wlan_private
* priv
)
136 wlan_adapter
*adapter
= priv
->adapter
;
138 struct bss_descriptor
*ptempscantable
;
140 /* Allocate buffer to store the BSSID list */
141 ulbufsize
= sizeof(struct bss_descriptor
) * MRVDRV_MAX_BSSID_LIST
;
142 if (!(ptempscantable
= kzalloc(ulbufsize
, GFP_KERNEL
))) {
143 libertas_free_adapter(priv
);
146 adapter
->scantable
= ptempscantable
;
148 /* Allocate the command buffers */
149 libertas_allocate_cmd_buffer(priv
);
151 memset(&adapter
->libertas_ps_confirm_sleep
, 0, sizeof(struct PS_CMD_ConfirmSleep
));
152 adapter
->libertas_ps_confirm_sleep
.seqnum
= cpu_to_le16(++adapter
->seqnum
);
153 adapter
->libertas_ps_confirm_sleep
.command
=
154 cpu_to_le16(cmd_802_11_ps_mode
);
155 adapter
->libertas_ps_confirm_sleep
.size
=
156 cpu_to_le16(sizeof(struct PS_CMD_ConfirmSleep
));
157 adapter
->libertas_ps_confirm_sleep
.result
= 0;
158 adapter
->libertas_ps_confirm_sleep
.action
=
159 cpu_to_le16(cmd_subcmd_sleep_confirmed
);
164 static void wlan_init_adapter(wlan_private
* priv
)
166 wlan_adapter
*adapter
= priv
->adapter
;
169 adapter
->scanprobes
= 0;
171 adapter
->bcn_avg_factor
= DEFAULT_BCN_AVG_FACTOR
;
172 adapter
->data_avg_factor
= DEFAULT_DATA_AVG_FACTOR
;
175 adapter
->atimwindow
= 0;
177 adapter
->connect_status
= libertas_disconnected
;
178 memset(adapter
->current_addr
, 0xff, ETH_ALEN
);
181 adapter
->scantype
= cmd_scan_type_active
;
184 adapter
->scanmode
= cmd_bss_type_any
;
186 /* 802.11 specific */
187 adapter
->secinfo
.wep_enabled
= 0;
188 for (i
= 0; i
< sizeof(adapter
->wep_keys
) / sizeof(adapter
->wep_keys
[0]);
190 memset(&adapter
->wep_keys
[i
], 0, sizeof(struct WLAN_802_11_KEY
));
191 adapter
->wep_tx_keyidx
= 0;
192 adapter
->secinfo
.auth_mode
= IW_AUTH_ALG_OPEN_SYSTEM
;
193 adapter
->mode
= IW_MODE_INFRA
;
195 adapter
->assoc_req
= NULL
;
197 adapter
->numinscantable
= 0;
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
)
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
)) != 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 scantable\n");
301 if (adapter
->scantable
) {
302 kfree(adapter
->scantable
);
303 adapter
->scantable
= NULL
;
306 /* Free the adapter object itself */
307 lbs_deb_fw("free adapter\n");
309 priv
->adapter
= NULL
;
313 * This function handles the timeout of command sending.
314 * It will re-send the same command again.
316 static void command_timer_fn(unsigned long data
)
318 wlan_private
*priv
= (wlan_private
*)data
;
319 wlan_adapter
*adapter
= priv
->adapter
;
320 struct cmd_ctrl_node
*ptempnode
;
321 struct cmd_ds_command
*cmd
;
324 ptempnode
= adapter
->cur_cmd
;
325 if (ptempnode
== NULL
) {
326 lbs_deb_fw("ptempnode empty\n");
330 cmd
= (struct cmd_ds_command
*)ptempnode
->bufvirtualaddr
;
332 lbs_deb_fw("cmd is NULL\n");
336 lbs_deb_fw("command_timer_fn fired, cmd %x\n", cmd
->command
);
338 if (!adapter
->fw_ready
)
341 spin_lock_irqsave(&adapter
->driver_lock
, flags
);
342 adapter
->cur_cmd
= NULL
;
343 spin_unlock_irqrestore(&adapter
->driver_lock
, flags
);
345 lbs_deb_fw("re-sending same command because of timeout\n");
346 libertas_queue_cmd(adapter
, ptempnode
, 0);
348 wake_up_interruptible(&priv
->mainthread
.waitq
);