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
;
30 struct fwheader
*fwh
= (void *)data
;
32 bincmd
= le32_to_cpu(fwh
->dnldcmd
);
33 blksize
= le32_to_cpu(fwh
->datalength
);
35 case FW_HAS_DATA_TO_RECV
:
36 offset
= sizeof(struct fwheader
) + blksize
;
42 case FW_HAS_LAST_BLOCK
:
53 lbs_pr_err("firmware file format check FAIL\n");
55 lbs_deb_fw("firmware file format check PASS\n");
61 * @brief This function downloads firmware image, gets
62 * HW spec from firmware and set basic parameters to
65 * @param priv A pointer to wlan_private structure
68 static int wlan_setup_station_hw(wlan_private
* priv
, char *fw_name
)
71 wlan_adapter
*adapter
= priv
->adapter
;
73 lbs_deb_enter(LBS_DEB_FW
);
75 if ((ret
= request_firmware(&priv
->firmware
, fw_name
,
76 priv
->hotplug_device
)) < 0) {
77 lbs_pr_err("request_firmware() failed with %#x\n", ret
);
78 lbs_pr_err("firmware %s not found\n", fw_name
);
82 if (check_fwfile_format(priv
->firmware
->data
, priv
->firmware
->size
)) {
83 release_firmware(priv
->firmware
);
87 ret
= priv
->hw_prog_firmware(priv
);
89 release_firmware(priv
->firmware
);
92 lbs_deb_fw("bootloader in invalid state\n");
98 * Read MAC address from HW
100 memset(adapter
->current_addr
, 0xff, ETH_ALEN
);
102 ret
= libertas_prepare_and_send_command(priv
, CMD_GET_HW_SPEC
,
103 0, CMD_OPTION_WAITFORRSP
, 0, NULL
);
110 libertas_set_mac_packet_filter(priv
);
112 /* Get the supported Data rates */
113 ret
= libertas_prepare_and_send_command(priv
, CMD_802_11_DATA_RATE
,
115 CMD_OPTION_WAITFORRSP
, 0, NULL
);
124 lbs_deb_leave_args(LBS_DEB_FW
, "ret %d", ret
);
128 static int wlan_allocate_adapter(wlan_private
* priv
)
131 wlan_adapter
*adapter
= priv
->adapter
;
133 /* Allocate buffer to store the BSSID list */
134 bufsize
= MAX_NETWORK_COUNT
* sizeof(struct bss_descriptor
);
135 adapter
->networks
= kzalloc(bufsize
, GFP_KERNEL
);
136 if (!adapter
->networks
) {
137 lbs_pr_err("Out of memory allocating beacons\n");
138 libertas_free_adapter(priv
);
142 /* Allocate the command buffers */
143 libertas_allocate_cmd_buffer(priv
);
145 memset(&adapter
->libertas_ps_confirm_sleep
, 0, sizeof(struct PS_CMD_ConfirmSleep
));
146 adapter
->libertas_ps_confirm_sleep
.seqnum
= cpu_to_le16(++adapter
->seqnum
);
147 adapter
->libertas_ps_confirm_sleep
.command
=
148 cpu_to_le16(CMD_802_11_PS_MODE
);
149 adapter
->libertas_ps_confirm_sleep
.size
=
150 cpu_to_le16(sizeof(struct PS_CMD_ConfirmSleep
));
151 adapter
->libertas_ps_confirm_sleep
.result
= 0;
152 adapter
->libertas_ps_confirm_sleep
.action
=
153 cpu_to_le16(CMD_SUBCMD_SLEEP_CONFIRMED
);
158 static void wlan_init_adapter(wlan_private
* priv
)
160 wlan_adapter
*adapter
= priv
->adapter
;
163 adapter
->scanprobes
= 0;
165 adapter
->bcn_avg_factor
= DEFAULT_BCN_AVG_FACTOR
;
166 adapter
->data_avg_factor
= DEFAULT_DATA_AVG_FACTOR
;
169 adapter
->atimwindow
= 0;
171 adapter
->connect_status
= LIBERTAS_DISCONNECTED
;
172 memset(adapter
->current_addr
, 0xff, ETH_ALEN
);
175 adapter
->scantype
= CMD_SCAN_TYPE_ACTIVE
;
178 adapter
->scanmode
= CMD_BSS_TYPE_ANY
;
180 /* 802.11 specific */
181 adapter
->secinfo
.wep_enabled
= 0;
182 for (i
= 0; i
< sizeof(adapter
->wep_keys
) / sizeof(adapter
->wep_keys
[0]);
184 memset(&adapter
->wep_keys
[i
], 0, sizeof(struct enc_key
));
185 adapter
->wep_tx_keyidx
= 0;
186 adapter
->secinfo
.auth_mode
= IW_AUTH_ALG_OPEN_SYSTEM
;
187 adapter
->mode
= IW_MODE_INFRA
;
189 adapter
->pending_assoc_req
= NULL
;
190 adapter
->in_progress_assoc_req
= NULL
;
192 /* Initialize scan result lists */
193 INIT_LIST_HEAD(&adapter
->network_free_list
);
194 INIT_LIST_HEAD(&adapter
->network_list
);
195 for (i
= 0; i
< MAX_NETWORK_COUNT
; i
++) {
196 list_add_tail(&adapter
->networks
[i
].list
,
197 &adapter
->network_free_list
);
200 mutex_init(&adapter
->lock
);
202 adapter
->prescan
= 1;
204 memset(&adapter
->curbssparams
, 0, sizeof(adapter
->curbssparams
));
205 adapter
->curbssparams
.channel
= DEFAULT_AD_HOC_CHANNEL
;
207 /* PnP and power profile */
208 adapter
->surpriseremoved
= 0;
210 adapter
->currentpacketfilter
=
211 CMD_ACT_MAC_RX_ON
| CMD_ACT_MAC_TX_ON
;
213 adapter
->radioon
= RADIO_ON
;
214 adapter
->txantenna
= RF_ANTENNA_2
;
215 adapter
->rxantenna
= RF_ANTENNA_AUTO
;
217 adapter
->is_datarate_auto
= 1;
218 adapter
->beaconperiod
= MRVDRV_BEACON_INTERVAL
;
220 // set default capabilities
221 adapter
->capability
= WLAN_CAPABILITY_SHORT_PREAMBLE
;
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
, char *fw_name
)
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
, fw_name
)) != 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 scan results table\n");
299 kfree(adapter
->networks
);
300 adapter
->networks
= NULL
;
302 /* Free the adapter object itself */
303 lbs_deb_fw("free adapter\n");
305 priv
->adapter
= NULL
;
309 * This function handles the timeout of command sending.
310 * It will re-send the same command again.
312 static void command_timer_fn(unsigned long data
)
314 wlan_private
*priv
= (wlan_private
*)data
;
315 wlan_adapter
*adapter
= priv
->adapter
;
316 struct cmd_ctrl_node
*ptempnode
;
317 struct cmd_ds_command
*cmd
;
320 ptempnode
= adapter
->cur_cmd
;
321 if (ptempnode
== NULL
) {
322 lbs_deb_fw("ptempnode empty\n");
326 cmd
= (struct cmd_ds_command
*)ptempnode
->bufvirtualaddr
;
328 lbs_deb_fw("cmd is NULL\n");
332 lbs_deb_fw("command_timer_fn fired, cmd %x\n", cmd
->command
);
334 if (!adapter
->fw_ready
)
337 spin_lock_irqsave(&adapter
->driver_lock
, flags
);
338 adapter
->cur_cmd
= NULL
;
339 spin_unlock_irqrestore(&adapter
->driver_lock
, flags
);
341 lbs_deb_fw("re-sending same command because of timeout\n");
342 libertas_queue_cmd(adapter
, ptempnode
, 0);
344 wake_up_interruptible(&priv
->waitq
);