2 * This file contains the initialization for FW and HW
4 #include <linux/moduleparam.h>
5 #include <linux/firmware.h>
14 char *libertas_fw_name
= NULL
;
15 module_param_named(fw_name
, libertas_fw_name
, charp
, 0644);
18 * @brief This function checks the validity of Boot2/FW image.
20 * @param data pointer to image
24 static int check_fwfile_format(u8
*data
, u32 totlen
)
27 u32 blksize
, offset
, len
;
35 blksize
= *(u32
*)(data
+ offsetof(struct fwheader
, datalength
));
37 case FW_HAS_DATA_TO_RECV
:
38 offset
= sizeof(struct fwheader
) + blksize
;
44 case FW_HAS_LAST_BLOCK
:
55 lbs_pr_err("firmware file format check FAIL\n");
57 lbs_deb_fw("firmware file format check PASS\n");
63 * @brief This function downloads firmware image, gets
64 * HW spec from firmware and set basic parameters to
67 * @param priv A pointer to wlan_private structure
70 static int wlan_setup_station_hw(wlan_private
* priv
)
73 wlan_adapter
*adapter
= priv
->adapter
;
75 lbs_deb_enter(LBS_DEB_FW
);
77 if ((ret
= request_firmware(&priv
->firmware
, libertas_fw_name
,
78 priv
->hotplug_device
)) < 0) {
79 lbs_pr_err("request_firmware() failed with %#x\n",
81 lbs_pr_err("firmware %s not found\n", libertas_fw_name
);
85 if(check_fwfile_format(priv
->firmware
->data
, priv
->firmware
->size
)) {
86 release_firmware(priv
->firmware
);
90 ret
= priv
->hw_prog_firmware(priv
);
92 release_firmware(priv
->firmware
);
95 lbs_deb_fw("bootloader in invalid state\n");
101 * Read MAC address from HW
103 memset(adapter
->current_addr
, 0xff, ETH_ALEN
);
105 ret
= libertas_prepare_and_send_command(priv
, cmd_get_hw_spec
,
106 0, cmd_option_waitforrsp
, 0, NULL
);
113 libertas_set_mac_packet_filter(priv
);
115 /* Get the supported Data rates */
116 ret
= libertas_prepare_and_send_command(priv
, cmd_802_11_data_rate
,
118 cmd_option_waitforrsp
, 0, NULL
);
127 lbs_deb_leave_args(LBS_DEB_FW
, "ret %d", ret
);
131 static int wlan_allocate_adapter(wlan_private
* priv
)
134 wlan_adapter
*adapter
= priv
->adapter
;
136 struct bss_descriptor
*ptempscantable
;
138 /* Allocate buffer to store the BSSID list */
139 ulbufsize
= sizeof(struct bss_descriptor
) * MRVDRV_MAX_BSSID_LIST
;
140 if (!(ptempscantable
= kzalloc(ulbufsize
, GFP_KERNEL
))) {
141 libertas_free_adapter(priv
);
144 adapter
->scantable
= ptempscantable
;
146 /* Allocate the command buffers */
147 libertas_allocate_cmd_buffer(priv
);
149 memset(&adapter
->libertas_ps_confirm_sleep
, 0, sizeof(struct PS_CMD_ConfirmSleep
));
150 adapter
->libertas_ps_confirm_sleep
.seqnum
= cpu_to_le16(++adapter
->seqnum
);
151 adapter
->libertas_ps_confirm_sleep
.command
=
152 cpu_to_le16(cmd_802_11_ps_mode
);
153 adapter
->libertas_ps_confirm_sleep
.size
=
154 cpu_to_le16(sizeof(struct PS_CMD_ConfirmSleep
));
155 adapter
->libertas_ps_confirm_sleep
.result
= 0;
156 adapter
->libertas_ps_confirm_sleep
.action
=
157 cpu_to_le16(cmd_subcmd_sleep_confirmed
);
162 static void wlan_init_adapter(wlan_private
* priv
)
164 wlan_adapter
*adapter
= priv
->adapter
;
167 adapter
->scanprobes
= 0;
169 adapter
->bcn_avg_factor
= DEFAULT_BCN_AVG_FACTOR
;
170 adapter
->data_avg_factor
= DEFAULT_DATA_AVG_FACTOR
;
173 adapter
->atimwindow
= 0;
175 adapter
->connect_status
= libertas_disconnected
;
176 memset(adapter
->current_addr
, 0xff, ETH_ALEN
);
179 adapter
->scantype
= cmd_scan_type_active
;
182 adapter
->scanmode
= cmd_bss_type_any
;
184 /* 802.11 specific */
185 adapter
->secinfo
.wep_enabled
= 0;
186 for (i
= 0; i
< sizeof(adapter
->wep_keys
) / sizeof(adapter
->wep_keys
[0]);
188 memset(&adapter
->wep_keys
[i
], 0, sizeof(struct WLAN_802_11_KEY
));
189 adapter
->wep_tx_keyidx
= 0;
190 adapter
->secinfo
.auth_mode
= IW_AUTH_ALG_OPEN_SYSTEM
;
191 adapter
->mode
= IW_MODE_INFRA
;
193 adapter
->assoc_req
= NULL
;
195 adapter
->numinscantable
= 0;
196 adapter
->pattemptedbssdesc
= NULL
;
197 mutex_init(&adapter
->lock
);
199 adapter
->prescan
= 1;
201 memset(&adapter
->curbssparams
, 0, sizeof(adapter
->curbssparams
));
203 /* PnP and power profile */
204 adapter
->surpriseremoved
= 0;
206 adapter
->currentpacketfilter
=
207 cmd_act_mac_rx_on
| cmd_act_mac_tx_on
;
209 adapter
->radioon
= RADIO_ON
;
210 adapter
->txantenna
= RF_ANTENNA_2
;
211 adapter
->rxantenna
= RF_ANTENNA_AUTO
;
213 adapter
->is_datarate_auto
= 1;
214 adapter
->beaconperiod
= MRVDRV_BEACON_INTERVAL
;
216 // set default value of capinfo.
217 #define SHORT_PREAMBLE_ALLOWED 1
218 memset(&adapter
->capinfo
, 0, sizeof(adapter
->capinfo
));
219 adapter
->capinfo
.shortpreamble
= SHORT_PREAMBLE_ALLOWED
;
221 adapter
->adhocchannel
= DEFAULT_AD_HOC_CHANNEL
;
223 adapter
->psmode
= wlan802_11powermodecam
;
224 adapter
->multipledtim
= MRVDRV_DEFAULT_MULTIPLE_DTIM
;
226 adapter
->listeninterval
= MRVDRV_DEFAULT_LISTEN_INTERVAL
;
228 adapter
->psstate
= PS_STATE_FULL_POWER
;
229 adapter
->needtowakeup
= 0;
230 adapter
->locallisteninterval
= 0; /* default value in firmware will be used */
232 adapter
->datarate
= 0; // Initially indicate the rate as auto
234 adapter
->adhoc_grate_enabled
= 0;
236 adapter
->intcounter
= 0;
238 adapter
->currenttxskb
= NULL
;
239 adapter
->pkttxctrl
= 0;
241 memset(&adapter
->tx_queue_ps
, 0, NR_TX_QUEUE
*sizeof(struct sk_buff
*));
242 adapter
->tx_queue_idx
= 0;
243 spin_lock_init(&adapter
->txqueue_lock
);
248 static void command_timer_fn(unsigned long data
);
250 int libertas_init_fw(wlan_private
* priv
)
253 wlan_adapter
*adapter
= priv
->adapter
;
255 lbs_deb_enter(LBS_DEB_FW
);
257 /* Allocate adapter structure */
258 if ((ret
= wlan_allocate_adapter(priv
)) != 0)
261 /* init adapter structure */
262 wlan_init_adapter(priv
);
264 /* init timer etc. */
265 setup_timer(&adapter
->command_timer
, command_timer_fn
,
266 (unsigned long)priv
);
268 /* download fimrware etc. */
269 if ((ret
= wlan_setup_station_hw(priv
)) != 0) {
270 del_timer_sync(&adapter
->command_timer
);
275 libertas_init_11d(priv
);
279 lbs_deb_leave_args(LBS_DEB_FW
, "ret %d", ret
);
283 void libertas_free_adapter(wlan_private
* priv
)
285 wlan_adapter
*adapter
= priv
->adapter
;
288 lbs_deb_fw("why double free adapter?\n");
292 lbs_deb_fw("free command buffer\n");
293 libertas_free_cmd_buffer(priv
);
295 lbs_deb_fw("free command_timer\n");
296 del_timer(&adapter
->command_timer
);
298 lbs_deb_fw("free scantable\n");
299 if (adapter
->scantable
) {
300 kfree(adapter
->scantable
);
301 adapter
->scantable
= 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
);