mwifiex: add dump data debug support
[deliverable/linux.git] / drivers / net / wireless / mwifiex / main.c
CommitLineData
5e6e3a92
BZ
1/*
2 * Marvell Wireless LAN device driver: major functions
3 *
65da33f5 4 * Copyright (C) 2011-2014, Marvell International Ltd.
5e6e3a92
BZ
5 *
6 * This software file (the "File") is distributed by Marvell International
7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8 * (the "License"). You may use, redistribute and/or modify this File in
9 * accordance with the terms and conditions of the License, a copy of which
10 * is available by writing to the Free Software Foundation, Inc.,
11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
13 *
14 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
16 * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
17 * this warranty disclaimer.
18 */
19
20#include "main.h"
21#include "wmm.h"
22#include "cfg80211.h"
23#include "11n.h"
24
25#define VERSION "1.0"
26
c687a007
ZL
27static unsigned int debug_mask = MWIFIEX_DEFAULT_DEBUG_MASK;
28module_param(debug_mask, uint, 0);
29MODULE_PARM_DESC(debug_mask, "bitmap for debug flags");
30
5e6e3a92 31const char driver_version[] = "mwifiex " VERSION " (%s) ";
388ec385
AK
32static char *cal_data_cfg;
33module_param(cal_data_cfg, charp, 0);
5e6e3a92 34
0013c7ce
AP
35static unsigned short driver_mode;
36module_param(driver_mode, ushort, 0);
37MODULE_PARM_DESC(driver_mode,
38 "station=0x1(default), ap-sta=0x3, station-p2p=0x5, ap-sta-p2p=0x7");
39
5e6e3a92
BZ
40/*
41 * This function registers the device and performs all the necessary
42 * initializations.
43 *
44 * The following initialization operations are performed -
45 * - Allocate adapter structure
46 * - Save interface specific operations table in adapter
47 * - Call interface specific initialization routine
48 * - Allocate private structures
49 * - Set default adapter structure parameters
50 * - Initialize locks
51 *
52 * In case of any errors during inittialization, this function also ensures
53 * proper cleanup before exiting.
54 */
55static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
287546df 56 void **padapter)
5e6e3a92 57{
2be7859f
AK
58 struct mwifiex_adapter *adapter;
59 int i;
5e6e3a92
BZ
60
61 adapter = kzalloc(sizeof(struct mwifiex_adapter), GFP_KERNEL);
5e6e3a92 62 if (!adapter)
b53575ec 63 return -ENOMEM;
5e6e3a92 64
287546df 65 *padapter = adapter;
5e6e3a92
BZ
66 adapter->card = card;
67
68 /* Save interface specific operations in adapter */
69 memmove(&adapter->if_ops, if_ops, sizeof(struct mwifiex_if_ops));
c687a007 70 adapter->debug_mask = debug_mask;
5e6e3a92
BZ
71
72 /* card specific initialization has been deferred until now .. */
4daffe35
AK
73 if (adapter->if_ops.init_if)
74 if (adapter->if_ops.init_if(adapter))
75 goto error;
5e6e3a92
BZ
76
77 adapter->priv_num = 0;
5e6e3a92 78
64b05e2f
AP
79 for (i = 0; i < MWIFIEX_MAX_BSS_NUM; i++) {
80 /* Allocate memory for private structure */
81 adapter->priv[i] =
82 kzalloc(sizeof(struct mwifiex_private), GFP_KERNEL);
83 if (!adapter->priv[i])
84 goto error;
93a1df48 85
64b05e2f 86 adapter->priv[i]->adapter = adapter;
64b05e2f
AP
87 adapter->priv_num++;
88 }
44b815c6 89 mwifiex_init_lock_list(adapter);
5e6e3a92 90
c6c33e77
JL
91 setup_timer(&adapter->cmd_timer, mwifiex_cmd_timeout_func,
92 (unsigned long)adapter);
5e6e3a92 93
5e6e3a92
BZ
94 return 0;
95
96error:
97 dev_dbg(adapter->dev, "info: leave mwifiex_register with error\n");
98
93a1df48 99 for (i = 0; i < adapter->priv_num; i++)
5e6e3a92 100 kfree(adapter->priv[i]);
93a1df48 101
5e6e3a92
BZ
102 kfree(adapter);
103
104 return -1;
105}
106
107/*
108 * This function unregisters the device and performs all the necessary
109 * cleanups.
110 *
111 * The following cleanup operations are performed -
112 * - Free the timers
113 * - Free beacon buffers
114 * - Free private structures
115 * - Free adapter structure
116 */
117static int mwifiex_unregister(struct mwifiex_adapter *adapter)
118{
270e58e8 119 s32 i;
5e6e3a92 120
4cfda67d
AK
121 if (adapter->if_ops.cleanup_if)
122 adapter->if_ops.cleanup_if(adapter);
123
629873f2 124 del_timer_sync(&adapter->cmd_timer);
5e6e3a92
BZ
125
126 /* Free private structures */
127 for (i = 0; i < adapter->priv_num; i++) {
128 if (adapter->priv[i]) {
129 mwifiex_free_curr_bcn(adapter->priv[i]);
130 kfree(adapter->priv[i]);
131 }
132 }
133
bf354433 134 vfree(adapter->chan_stats);
5e6e3a92
BZ
135 kfree(adapter);
136 return 0;
137}
138
b2713f67
SL
139void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
140{
141 unsigned long flags;
142
143 spin_lock_irqsave(&adapter->main_proc_lock, flags);
144 if (adapter->mwifiex_processing) {
145 adapter->more_task_flag = true;
146 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
147 } else {
148 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
149 queue_work(adapter->workqueue, &adapter->main_work);
150 }
151}
152EXPORT_SYMBOL_GPL(mwifiex_queue_main_work);
153
154static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
155{
156 unsigned long flags;
157
158 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
159 if (adapter->rx_processing) {
160 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
161 } else {
162 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
163 queue_work(adapter->rx_workqueue, &adapter->rx_work);
164 }
165}
166
6e251174
AP
167static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
168{
169 unsigned long flags;
170 struct sk_buff *skb;
92263a84 171 struct mwifiex_rxinfo *rx_info;
6e251174
AP
172
173 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
174 if (adapter->rx_processing || adapter->rx_locked) {
175 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
176 goto exit_rx_proc;
177 } else {
178 adapter->rx_processing = true;
179 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
180 }
181
182 /* Check for Rx data */
183 while ((skb = skb_dequeue(&adapter->rx_data_q))) {
184 atomic_dec(&adapter->rx_pending);
381e9fff
AK
185 if ((adapter->delay_main_work ||
186 adapter->iface_type == MWIFIEX_USB) &&
b43a0d9d 187 (atomic_read(&adapter->rx_pending) < LOW_RX_PENDING)) {
cf6a64fd
AK
188 if (adapter->if_ops.submit_rem_rx_urbs)
189 adapter->if_ops.submit_rem_rx_urbs(adapter);
6e251174 190 adapter->delay_main_work = false;
b2713f67 191 mwifiex_queue_main_work(adapter);
6e251174 192 }
92263a84
ZL
193 rx_info = MWIFIEX_SKB_RXCB(skb);
194 if (rx_info->buf_type == MWIFIEX_TYPE_AGGR_DATA) {
195 if (adapter->if_ops.deaggr_pkt)
196 adapter->if_ops.deaggr_pkt(adapter, skb);
197 dev_kfree_skb_any(skb);
198 } else {
199 mwifiex_handle_rx_packet(adapter, skb);
6e251174 200 }
6e251174
AP
201 }
202 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
203 adapter->rx_processing = false;
204 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
205
6e251174
AP
206exit_rx_proc:
207 return 0;
208}
209
5e6e3a92
BZ
210/*
211 * The main process.
212 *
213 * This function is the main procedure of the driver and handles various driver
214 * operations. It runs in a loop and provides the core functionalities.
215 *
216 * The main responsibilities of this function are -
217 * - Ensure concurrency control
218 * - Handle pending interrupts and call interrupt handlers
219 * - Wake up the card if required
220 * - Handle command responses and call response handlers
221 * - Handle events and call event handlers
222 * - Execute pending commands
223 * - Transmit pending data packets
224 */
225int mwifiex_main_process(struct mwifiex_adapter *adapter)
226{
227 int ret = 0;
228 unsigned long flags;
229
230 spin_lock_irqsave(&adapter->main_proc_lock, flags);
231
232 /* Check if already processing */
a9adbcb3 233 if (adapter->mwifiex_processing || adapter->main_locked) {
04c7b363 234 adapter->more_task_flag = true;
5e6e3a92
BZ
235 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
236 goto exit_main_proc;
237 } else {
238 adapter->mwifiex_processing = true;
91457eaa 239 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
5e6e3a92
BZ
240 }
241process_start:
242 do {
243 if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) ||
244 (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY))
245 break;
246
381e9fff
AK
247 /* For non-USB interfaces, If we process interrupts first, it
248 * would increase RX pending even further. Avoid this by
249 * checking if rx_pending has crossed high threshold and
250 * schedule rx work queue and then process interrupts.
251 * For USB interface, there are no interrupts. We already have
252 * HIGH_RX_PENDING check in usb.c
6e251174 253 */
381e9fff
AK
254 if (atomic_read(&adapter->rx_pending) >= HIGH_RX_PENDING &&
255 adapter->iface_type != MWIFIEX_USB) {
6e251174 256 adapter->delay_main_work = true;
b2713f67 257 mwifiex_queue_rx_work(adapter);
6e251174
AP
258 break;
259 }
260
5e6e3a92
BZ
261 /* Handle pending interrupt if any */
262 if (adapter->int_status) {
263 if (adapter->hs_activated)
264 mwifiex_process_hs_config(adapter);
4daffe35
AK
265 if (adapter->if_ops.process_int_status)
266 adapter->if_ops.process_int_status(adapter);
5e6e3a92
BZ
267 }
268
6e251174 269 if (adapter->rx_work_enabled && adapter->data_received)
b2713f67 270 mwifiex_queue_rx_work(adapter);
6e251174 271
5e6e3a92
BZ
272 /* Need to wake up the card ? */
273 if ((adapter->ps_state == PS_STATE_SLEEP) &&
274 (adapter->pm_wakeup_card_req &&
275 !adapter->pm_wakeup_fw_try) &&
f57c1edc 276 (is_command_pending(adapter) ||
e35000ea 277 !skb_queue_empty(&adapter->tx_data_q) ||
f57c1edc 278 !mwifiex_wmm_lists_empty(adapter))) {
5e6e3a92 279 adapter->pm_wakeup_fw_try = true;
4636187d 280 mod_timer(&adapter->wakeup_timer, jiffies + (HZ*3));
5e6e3a92
BZ
281 adapter->if_ops.wakeup(adapter);
282 continue;
283 }
4daffe35 284
5e6e3a92 285 if (IS_CARD_RX_RCVD(adapter)) {
6e251174 286 adapter->data_received = false;
5e6e3a92 287 adapter->pm_wakeup_fw_try = false;
6e9344fd 288 del_timer(&adapter->wakeup_timer);
5e6e3a92
BZ
289 if (adapter->ps_state == PS_STATE_SLEEP)
290 adapter->ps_state = PS_STATE_AWAKE;
291 } else {
292 /* We have tried to wakeup the card already */
293 if (adapter->pm_wakeup_fw_try)
294 break;
295 if (adapter->ps_state != PS_STATE_AWAKE ||
296 adapter->tx_lock_flag)
297 break;
298
5ec39efa 299 if ((!adapter->scan_chan_gap_enabled &&
5ec39efa 300 adapter->scan_processing) || adapter->data_sent ||
e35000ea
ZL
301 (mwifiex_wmm_lists_empty(adapter) &&
302 skb_queue_empty(&adapter->tx_data_q))) {
f57c1edc
YAP
303 if (adapter->cmd_sent || adapter->curr_cmd ||
304 (!is_command_pending(adapter)))
5e6e3a92
BZ
305 break;
306 }
307 }
308
20474129
AK
309 /* Check for event */
310 if (adapter->event_received) {
311 adapter->event_received = false;
312 mwifiex_process_event(adapter);
313 }
314
5e6e3a92
BZ
315 /* Check for Cmd Resp */
316 if (adapter->cmd_resp_received) {
317 adapter->cmd_resp_received = false;
318 mwifiex_process_cmdresp(adapter);
319
320 /* call mwifiex back when init_fw is done */
321 if (adapter->hw_status == MWIFIEX_HW_STATUS_INIT_DONE) {
322 adapter->hw_status = MWIFIEX_HW_STATUS_READY;
323 mwifiex_init_fw_complete(adapter);
324 }
325 }
326
5e6e3a92
BZ
327 /* Check if we need to confirm Sleep Request
328 received previously */
329 if (adapter->ps_state == PS_STATE_PRE_SLEEP) {
330 if (!adapter->cmd_sent && !adapter->curr_cmd)
331 mwifiex_check_ps_cond(adapter);
332 }
333
334 /* * The ps_state may have been changed during processing of
335 * Sleep Request event.
336 */
f57c1edc
YAP
337 if ((adapter->ps_state == PS_STATE_SLEEP) ||
338 (adapter->ps_state == PS_STATE_PRE_SLEEP) ||
339 (adapter->ps_state == PS_STATE_SLEEP_CFM) ||
04c7b363 340 adapter->tx_lock_flag){
5e6e3a92 341 continue;
04c7b363 342 }
5e6e3a92
BZ
343
344 if (!adapter->cmd_sent && !adapter->curr_cmd) {
345 if (mwifiex_exec_next_cmd(adapter) == -1) {
346 ret = -1;
347 break;
348 }
349 }
350
e35000ea
ZL
351 if ((adapter->scan_chan_gap_enabled ||
352 !adapter->scan_processing) &&
353 !adapter->data_sent &&
354 !skb_queue_empty(&adapter->tx_data_q)) {
355 mwifiex_process_tx_queue(adapter);
356 if (adapter->hs_activated) {
357 adapter->is_hs_configured = false;
358 mwifiex_hs_activated_event
359 (mwifiex_get_priv
360 (adapter, MWIFIEX_BSS_ROLE_ANY),
361 false);
362 }
363 }
364
5ec39efa 365 if ((adapter->scan_chan_gap_enabled ||
d8d91253 366 !adapter->scan_processing) &&
3249ba73 367 !adapter->data_sent && !mwifiex_wmm_lists_empty(adapter)) {
5e6e3a92
BZ
368 mwifiex_wmm_process_tx(adapter);
369 if (adapter->hs_activated) {
370 adapter->is_hs_configured = false;
371 mwifiex_hs_activated_event
372 (mwifiex_get_priv
373 (adapter, MWIFIEX_BSS_ROLE_ANY),
374 false);
375 }
376 }
377
378 if (adapter->delay_null_pkt && !adapter->cmd_sent &&
f57c1edc 379 !adapter->curr_cmd && !is_command_pending(adapter) &&
e35000ea
ZL
380 (mwifiex_wmm_lists_empty(adapter) &&
381 skb_queue_empty(&adapter->tx_data_q))) {
5e6e3a92
BZ
382 if (!mwifiex_send_null_packet
383 (mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
384 MWIFIEX_TxPD_POWER_MGMT_NULL_PACKET |
385 MWIFIEX_TxPD_POWER_MGMT_LAST_PACKET)) {
386 adapter->delay_null_pkt = false;
387 adapter->ps_state = PS_STATE_SLEEP;
388 }
389 break;
390 }
391 } while (true);
392
453b0c3f 393 spin_lock_irqsave(&adapter->main_proc_lock, flags);
91457eaa
CL
394 if (adapter->more_task_flag) {
395 adapter->more_task_flag = false;
396 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
5e6e3a92 397 goto process_start;
91457eaa 398 }
5e6e3a92
BZ
399 adapter->mwifiex_processing = false;
400 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
401
402exit_main_proc:
403 if (adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING)
404 mwifiex_shutdown_drv(adapter);
405 return ret;
406}
601216e1 407EXPORT_SYMBOL_GPL(mwifiex_main_process);
5e6e3a92 408
5e6e3a92
BZ
409/*
410 * This function frees the adapter structure.
411 *
412 * Additionally, this closes the netlink socket, frees the timers
413 * and private structures.
414 */
415static void mwifiex_free_adapter(struct mwifiex_adapter *adapter)
416{
417 if (!adapter) {
418 pr_err("%s: adapter is NULL\n", __func__);
419 return;
420 }
421
422 mwifiex_unregister(adapter);
423 pr_debug("info: %s: free adapter\n", __func__);
424}
425
6b41f941
AK
426/*
427 * This function cancels all works in the queue and destroys
428 * the main workqueue.
429 */
430static void mwifiex_terminate_workqueue(struct mwifiex_adapter *adapter)
431{
432 flush_workqueue(adapter->workqueue);
433 destroy_workqueue(adapter->workqueue);
434 adapter->workqueue = NULL;
6e251174
AP
435
436 if (adapter->rx_workqueue) {
437 flush_workqueue(adapter->rx_workqueue);
438 destroy_workqueue(adapter->rx_workqueue);
439 adapter->rx_workqueue = NULL;
440 }
6b41f941
AK
441}
442
5e6e3a92 443/*
59a4cc25 444 * This function gets firmware and initializes it.
5e6e3a92
BZ
445 *
446 * The main initialization steps followed are -
447 * - Download the correct firmware to card
5e6e3a92
BZ
448 * - Issue the init commands to firmware
449 */
59a4cc25 450static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
5e6e3a92 451{
bec568ff 452 int ret;
59a4cc25
AK
453 char fmt[64];
454 struct mwifiex_private *priv;
455 struct mwifiex_adapter *adapter = context;
5e6e3a92 456 struct mwifiex_fw_image fw;
c3afd99f
AK
457 struct semaphore *sem = adapter->card_sem;
458 bool init_failed = false;
68b76e99 459 struct wireless_dev *wdev;
5e6e3a92 460
59a4cc25
AK
461 if (!firmware) {
462 dev_err(adapter->dev,
463 "Failed to get firmware %s\n", adapter->fw_name);
6b41f941 464 goto err_dnld_fw;
5e6e3a92 465 }
59a4cc25
AK
466
467 memset(&fw, 0, sizeof(struct mwifiex_fw_image));
468 adapter->firmware = firmware;
5e6e3a92
BZ
469 fw.fw_buf = (u8 *) adapter->firmware->data;
470 fw.fw_len = adapter->firmware->size;
471
4daffe35
AK
472 if (adapter->if_ops.dnld_fw)
473 ret = adapter->if_ops.dnld_fw(adapter, &fw);
474 else
475 ret = mwifiex_dnld_fw(adapter, &fw);
5e6e3a92 476 if (ret == -1)
6b41f941 477 goto err_dnld_fw;
5e6e3a92
BZ
478
479 dev_notice(adapter->dev, "WLAN FW is active\n");
480
388ec385
AK
481 if (cal_data_cfg) {
482 if ((request_firmware(&adapter->cal_data, cal_data_cfg,
483 adapter->dev)) < 0)
484 dev_err(adapter->dev,
485 "Cal data request_firmware() failed\n");
486 }
487
232fde06 488 /* enable host interrupt after fw dnld is successful */
6b41f941
AK
489 if (adapter->if_ops.enable_int) {
490 if (adapter->if_ops.enable_int(adapter))
491 goto err_dnld_fw;
492 }
232fde06 493
5e6e3a92
BZ
494 adapter->init_wait_q_woken = false;
495 ret = mwifiex_init_fw(adapter);
496 if (ret == -1) {
6b41f941 497 goto err_init_fw;
5e6e3a92
BZ
498 } else if (!ret) {
499 adapter->hw_status = MWIFIEX_HW_STATUS_READY;
500 goto done;
501 }
502 /* Wait for mwifiex_init to complete */
503 wait_event_interruptible(adapter->init_wait_q,
504 adapter->init_wait_q_woken);
59a4cc25 505 if (adapter->hw_status != MWIFIEX_HW_STATUS_READY)
6b41f941 506 goto err_init_fw;
59a4cc25 507
d6bffe8b
AP
508 priv = adapter->priv[MWIFIEX_BSS_ROLE_STA];
509 if (mwifiex_register_cfg80211(adapter)) {
59a4cc25 510 dev_err(adapter->dev, "cannot register with cfg80211\n");
d1af2943 511 goto err_init_fw;
59a4cc25
AK
512 }
513
bf354433
AP
514 if (mwifiex_init_channel_scan_gap(adapter)) {
515 dev_err(adapter->dev, "could not init channel stats table\n");
516 goto err_init_fw;
517 }
518
0013c7ce
AP
519 if (driver_mode) {
520 driver_mode &= MWIFIEX_DRIVER_MODE_BITMASK;
521 driver_mode |= MWIFIEX_DRIVER_MODE_STA;
522 }
523
59a4cc25
AK
524 rtnl_lock();
525 /* Create station interface by default */
6bab2e19 526 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "mlan%d", NET_NAME_ENUM,
68b76e99
AK
527 NL80211_IFTYPE_STATION, NULL, NULL);
528 if (IS_ERR(wdev)) {
59a4cc25 529 dev_err(adapter->dev, "cannot create default STA interface\n");
bec568ff 530 rtnl_unlock();
59a4cc25 531 goto err_add_intf;
5e6e3a92 532 }
0013c7ce
AP
533
534 if (driver_mode & MWIFIEX_DRIVER_MODE_UAP) {
6bab2e19 535 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "uap%d", NET_NAME_ENUM,
0013c7ce
AP
536 NL80211_IFTYPE_AP, NULL, NULL);
537 if (IS_ERR(wdev)) {
538 dev_err(adapter->dev, "cannot create AP interface\n");
539 rtnl_unlock();
540 goto err_add_intf;
541 }
542 }
543
544 if (driver_mode & MWIFIEX_DRIVER_MODE_P2P) {
6bab2e19 545 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "p2p%d", NET_NAME_ENUM,
0013c7ce
AP
546 NL80211_IFTYPE_P2P_CLIENT, NULL,
547 NULL);
548 if (IS_ERR(wdev)) {
549 dev_err(adapter->dev,
550 "cannot create p2p client interface\n");
551 rtnl_unlock();
552 goto err_add_intf;
553 }
554 }
59a4cc25
AK
555 rtnl_unlock();
556
557 mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1);
558 dev_notice(adapter->dev, "driver_version = %s\n", fmt);
559 goto done;
5e6e3a92 560
59a4cc25 561err_add_intf:
6b41f941
AK
562 wiphy_unregister(adapter->wiphy);
563 wiphy_free(adapter->wiphy);
59a4cc25 564err_init_fw:
232fde06
DD
565 if (adapter->if_ops.disable_int)
566 adapter->if_ops.disable_int(adapter);
6b41f941 567err_dnld_fw:
59a4cc25 568 pr_debug("info: %s: unregister device\n", __func__);
6b41f941
AK
569 if (adapter->if_ops.unregister_dev)
570 adapter->if_ops.unregister_dev(adapter);
571
7197325b 572 if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) {
6b41f941
AK
573 pr_debug("info: %s: shutdown mwifiex\n", __func__);
574 adapter->init_wait_q_woken = false;
575
576 if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
577 wait_event_interruptible(adapter->init_wait_q,
578 adapter->init_wait_q_woken);
579 }
580 adapter->surprise_removed = true;
581 mwifiex_terminate_workqueue(adapter);
c3afd99f 582 init_failed = true;
5e6e3a92 583done:
388ec385
AK
584 if (adapter->cal_data) {
585 release_firmware(adapter->cal_data);
586 adapter->cal_data = NULL;
587 }
c3afd99f
AK
588 if (adapter->firmware) {
589 release_firmware(adapter->firmware);
590 adapter->firmware = NULL;
591 }
c3afd99f
AK
592 if (init_failed)
593 mwifiex_free_adapter(adapter);
594 up(sem);
59a4cc25
AK
595 return;
596}
597
598/*
599 * This function initializes the hardware and gets firmware.
600 */
601static int mwifiex_init_hw_fw(struct mwifiex_adapter *adapter)
602{
603 int ret;
604
59a4cc25
AK
605 ret = request_firmware_nowait(THIS_MODULE, 1, adapter->fw_name,
606 adapter->dev, GFP_KERNEL, adapter,
607 mwifiex_fw_dpc);
608 if (ret < 0)
609 dev_err(adapter->dev,
610 "request_firmware_nowait() returned error %d\n", ret);
5e6e3a92
BZ
611 return ret;
612}
613
5e6e3a92
BZ
614/*
615 * CFG802.11 network device handler for open.
616 *
617 * Starts the data queue.
618 */
619static int
620mwifiex_open(struct net_device *dev)
621{
ea2325b8
JB
622 netif_carrier_off(dev);
623
5e6e3a92
BZ
624 return 0;
625}
626
627/*
628 * CFG802.11 network device handler for close.
629 */
630static int
631mwifiex_close(struct net_device *dev)
632{
f162cac8
AK
633 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
634
635 if (priv->scan_request) {
636 dev_dbg(priv->adapter->dev, "aborting scan on ndo_stop\n");
637 cfg80211_scan_done(priv->scan_request, 1);
638 priv->scan_request = NULL;
75ab753d 639 priv->scan_aborting = true;
f162cac8
AK
640 }
641
5e6e3a92
BZ
642 return 0;
643}
644
e39faa73
SP
645/*
646 * Add buffer into wmm tx queue and queue work to transmit it.
647 */
648int mwifiex_queue_tx_pkt(struct mwifiex_private *priv, struct sk_buff *skb)
649{
47411a06
AP
650 struct netdev_queue *txq;
651 int index = mwifiex_1d_to_wmm_queue[skb->priority];
652
653 if (atomic_inc_return(&priv->wmm_tx_pending[index]) >= MAX_TX_PENDING) {
654 txq = netdev_get_tx_queue(priv->netdev, index);
655 if (!netif_tx_queue_stopped(txq)) {
656 netif_tx_stop_queue(txq);
657 dev_dbg(priv->adapter->dev, "stop queue: %d\n", index);
658 }
659 }
660
e39faa73 661 atomic_inc(&priv->adapter->tx_pending);
47411a06 662 mwifiex_wmm_add_buf_txqueue(priv, skb);
e39faa73 663
b2713f67 664 mwifiex_queue_main_work(priv->adapter);
e39faa73
SP
665
666 return 0;
667}
668
18ca4382 669struct sk_buff *
808bbebc 670mwifiex_clone_skb_for_tx_status(struct mwifiex_private *priv,
18ca4382 671 struct sk_buff *skb, u8 flag, u64 *cookie)
808bbebc
AK
672{
673 struct sk_buff *orig_skb = skb;
674 struct mwifiex_txinfo *tx_info, *orig_tx_info;
675
676 skb = skb_clone(skb, GFP_ATOMIC);
677 if (skb) {
678 unsigned long flags;
679 int id;
680
681 spin_lock_irqsave(&priv->ack_status_lock, flags);
682 id = idr_alloc(&priv->ack_status_frames, orig_skb,
683 1, 0xff, GFP_ATOMIC);
684 spin_unlock_irqrestore(&priv->ack_status_lock, flags);
685
686 if (id >= 0) {
687 tx_info = MWIFIEX_SKB_TXCB(skb);
688 tx_info->ack_frame_id = id;
689 tx_info->flags |= flag;
690 orig_tx_info = MWIFIEX_SKB_TXCB(orig_skb);
691 orig_tx_info->ack_frame_id = id;
692 orig_tx_info->flags |= flag;
18ca4382
AK
693
694 if (flag == MWIFIEX_BUF_FLAG_ACTION_TX_STATUS && cookie)
695 orig_tx_info->cookie = *cookie;
696
808bbebc
AK
697 } else if (skb_shared(skb)) {
698 kfree_skb(orig_skb);
699 } else {
700 kfree_skb(skb);
701 skb = orig_skb;
702 }
703 } else {
704 /* couldn't clone -- lose tx status ... */
705 skb = orig_skb;
706 }
707
708 return skb;
709}
710
5e6e3a92
BZ
711/*
712 * CFG802.11 network device handler for data transmission.
713 */
714static int
715mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
716{
717 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
270e58e8 718 struct sk_buff *new_skb;
5e6e3a92 719 struct mwifiex_txinfo *tx_info;
808bbebc 720 bool multicast;
5e6e3a92 721
9da9a3b2 722 dev_dbg(priv->adapter->dev, "data: %lu BSS(%d-%d): Data <= kernel\n",
f57c1edc 723 jiffies, priv->bss_type, priv->bss_num);
5e6e3a92
BZ
724
725 if (priv->adapter->surprise_removed) {
b53575ec 726 kfree_skb(skb);
5e6e3a92
BZ
727 priv->stats.tx_dropped++;
728 return 0;
729 }
730 if (!skb->len || (skb->len > ETH_FRAME_LEN)) {
731 dev_err(priv->adapter->dev, "Tx: bad skb len %d\n", skb->len);
b53575ec 732 kfree_skb(skb);
5e6e3a92
BZ
733 priv->stats.tx_dropped++;
734 return 0;
735 }
736 if (skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN) {
737 dev_dbg(priv->adapter->dev,
738 "data: Tx: insufficient skb headroom %d\n",
f57c1edc 739 skb_headroom(skb));
5e6e3a92
BZ
740 /* Insufficient skb headroom - allocate a new skb */
741 new_skb =
742 skb_realloc_headroom(skb, MWIFIEX_MIN_DATA_HEADER_LEN);
743 if (unlikely(!new_skb)) {
744 dev_err(priv->adapter->dev, "Tx: cannot alloca new_skb\n");
b53575ec 745 kfree_skb(skb);
5e6e3a92
BZ
746 priv->stats.tx_dropped++;
747 return 0;
748 }
749 kfree_skb(skb);
750 skb = new_skb;
751 dev_dbg(priv->adapter->dev, "info: new skb headroomd %d\n",
f57c1edc 752 skb_headroom(skb));
5e6e3a92
BZ
753 }
754
755 tx_info = MWIFIEX_SKB_TXCB(skb);
d76744a9 756 memset(tx_info, 0, sizeof(*tx_info));
9da9a3b2
YAP
757 tx_info->bss_num = priv->bss_num;
758 tx_info->bss_type = priv->bss_type;
a1ed4849 759 tx_info->pkt_len = skb->len;
47411a06 760
808bbebc
AK
761 multicast = is_multicast_ether_addr(skb->data);
762
763 if (unlikely(!multicast && skb->sk &&
764 skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS &&
765 priv->adapter->fw_api_ver == MWIFIEX_FW_V15))
766 skb = mwifiex_clone_skb_for_tx_status(priv,
767 skb,
18ca4382 768 MWIFIEX_BUF_FLAG_EAPOL_TX_STATUS, NULL);
808bbebc 769
47411a06
AP
770 /* Record the current time the packet was queued; used to
771 * determine the amount of time the packet was queued in
772 * the driver before it was sent to the firmware.
773 * The delay is then sent along with the packet to the
774 * firmware for aggregate delay calculation for stats and
775 * MSDU lifetime expiry.
776 */
c64800e7 777 __net_timestamp(skb);
5e6e3a92 778
9927baa3
AP
779 if (ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info) &&
780 priv->bss_type == MWIFIEX_BSS_TYPE_STA &&
781 !ether_addr_equal_unaligned(priv->cfg_bssid, skb->data)) {
782 if (priv->adapter->auto_tdls && priv->check_tdls_tx)
783 mwifiex_tdls_check_tx(priv, skb);
784 }
785
e39faa73 786 mwifiex_queue_tx_pkt(priv, skb);
5e6e3a92
BZ
787
788 return 0;
789}
790
791/*
792 * CFG802.11 network device handler for setting MAC address.
793 */
794static int
795mwifiex_set_mac_address(struct net_device *dev, void *addr)
796{
797 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
a5ffddb7 798 struct sockaddr *hw_addr = addr;
270e58e8 799 int ret;
5e6e3a92
BZ
800
801 memcpy(priv->curr_addr, hw_addr->sa_data, ETH_ALEN);
802
600f5d90 803 /* Send request to firmware */
fa0ecbb9
BZ
804 ret = mwifiex_send_cmd(priv, HostCmd_CMD_802_11_MAC_ADDRESS,
805 HostCmd_ACT_GEN_SET, 0, NULL, true);
600f5d90
AK
806
807 if (!ret)
808 memcpy(priv->netdev->dev_addr, priv->curr_addr, ETH_ALEN);
809 else
f57c1edc
YAP
810 dev_err(priv->adapter->dev,
811 "set mac address failed: ret=%d\n", ret);
600f5d90 812
5e6e3a92
BZ
813 memcpy(dev->dev_addr, priv->curr_addr, ETH_ALEN);
814
600f5d90 815 return ret;
5e6e3a92
BZ
816}
817
818/*
819 * CFG802.11 network device handler for setting multicast list.
820 */
821static void mwifiex_set_multicast_list(struct net_device *dev)
822{
823 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
600f5d90
AK
824 struct mwifiex_multicast_list mcast_list;
825
826 if (dev->flags & IFF_PROMISC) {
827 mcast_list.mode = MWIFIEX_PROMISC_MODE;
828 } else if (dev->flags & IFF_ALLMULTI ||
829 netdev_mc_count(dev) > MWIFIEX_MAX_MULTICAST_LIST_SIZE) {
830 mcast_list.mode = MWIFIEX_ALL_MULTI_MODE;
831 } else {
832 mcast_list.mode = MWIFIEX_MULTICAST_MODE;
6390d885
DD
833 mcast_list.num_multicast_addr =
834 mwifiex_copy_mcast_addr(&mcast_list, dev);
600f5d90
AK
835 }
836 mwifiex_request_set_multicast_list(priv, &mcast_list);
5e6e3a92
BZ
837}
838
839/*
840 * CFG802.11 network device handler for transmission timeout.
841 */
842static void
843mwifiex_tx_timeout(struct net_device *dev)
844{
845 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
846
5e6e3a92 847 priv->num_tx_timeout++;
8908c7d5
AN
848 priv->tx_timeout_cnt++;
849 dev_err(priv->adapter->dev,
850 "%lu : Tx timeout(#%d), bss_type-num = %d-%d\n",
851 jiffies, priv->tx_timeout_cnt, priv->bss_type, priv->bss_num);
852 mwifiex_set_trans_start(dev);
853
854 if (priv->tx_timeout_cnt > TX_TIMEOUT_THRESHOLD &&
855 priv->adapter->if_ops.card_reset) {
856 dev_err(priv->adapter->dev,
857 "tx_timeout_cnt exceeds threshold. Triggering card reset!\n");
858 priv->adapter->if_ops.card_reset(priv->adapter);
859 }
5e6e3a92
BZ
860}
861
11cd07a9
XH
862void mwifiex_dump_drv_info(struct mwifiex_adapter *adapter)
863{
864 void *p;
865 char drv_version[64];
866 struct usb_card_rec *cardp;
867 struct sdio_mmc_card *sdio_card;
868 struct mwifiex_private *priv;
869 int i, idx;
870 struct netdev_queue *txq;
871 struct mwifiex_debug_info *debug_info;
872
873 if (adapter->drv_info_dump) {
874 vfree(adapter->drv_info_dump);
875 adapter->drv_info_size = 0;
876 }
877
878 dev_info(adapter->dev, "=== DRIVER INFO DUMP START===\n");
879
880 adapter->drv_info_dump = vzalloc(MWIFIEX_DRV_INFO_SIZE_MAX);
881
882 if (!adapter->drv_info_dump)
883 return;
884
885 p = (char *)(adapter->drv_info_dump);
886 p += sprintf(p, "driver_name = " "\"mwifiex\"\n");
887
888 mwifiex_drv_get_driver_version(adapter, drv_version,
889 sizeof(drv_version) - 1);
890 p += sprintf(p, "driver_version = %s\n", drv_version);
891
892 if (adapter->iface_type == MWIFIEX_USB) {
893 cardp = (struct usb_card_rec *)adapter->card;
894 p += sprintf(p, "tx_cmd_urb_pending = %d\n",
895 atomic_read(&cardp->tx_cmd_urb_pending));
896 p += sprintf(p, "tx_data_urb_pending = %d\n",
897 atomic_read(&cardp->tx_data_urb_pending));
898 p += sprintf(p, "rx_cmd_urb_pending = %d\n",
899 atomic_read(&cardp->rx_cmd_urb_pending));
900 p += sprintf(p, "rx_data_urb_pending = %d\n",
901 atomic_read(&cardp->rx_data_urb_pending));
902 }
903
904 p += sprintf(p, "tx_pending = %d\n",
905 atomic_read(&adapter->tx_pending));
906 p += sprintf(p, "rx_pending = %d\n",
907 atomic_read(&adapter->rx_pending));
908
909 if (adapter->iface_type == MWIFIEX_SDIO) {
910 sdio_card = (struct sdio_mmc_card *)adapter->card;
911 p += sprintf(p, "\nmp_rd_bitmap=0x%x curr_rd_port=0x%x\n",
912 sdio_card->mp_rd_bitmap, sdio_card->curr_rd_port);
913 p += sprintf(p, "mp_wr_bitmap=0x%x curr_wr_port=0x%x\n",
914 sdio_card->mp_wr_bitmap, sdio_card->curr_wr_port);
915 }
916
917 for (i = 0; i < adapter->priv_num; i++) {
918 if (!adapter->priv[i] || !adapter->priv[i]->netdev)
919 continue;
920 priv = adapter->priv[i];
921 p += sprintf(p, "\n[interface : \"%s\"]\n",
922 priv->netdev->name);
923 p += sprintf(p, "wmm_tx_pending[0] = %d\n",
924 atomic_read(&priv->wmm_tx_pending[0]));
925 p += sprintf(p, "wmm_tx_pending[1] = %d\n",
926 atomic_read(&priv->wmm_tx_pending[1]));
927 p += sprintf(p, "wmm_tx_pending[2] = %d\n",
928 atomic_read(&priv->wmm_tx_pending[2]));
929 p += sprintf(p, "wmm_tx_pending[3] = %d\n",
930 atomic_read(&priv->wmm_tx_pending[3]));
931 p += sprintf(p, "media_state=\"%s\"\n", !priv->media_connected ?
932 "Disconnected" : "Connected");
933 p += sprintf(p, "carrier %s\n", (netif_carrier_ok(priv->netdev)
934 ? "on" : "off"));
935 for (idx = 0; idx < priv->netdev->num_tx_queues; idx++) {
936 txq = netdev_get_tx_queue(priv->netdev, idx);
937 p += sprintf(p, "tx queue %d:%s ", idx,
938 netif_tx_queue_stopped(txq) ?
939 "stopped" : "started");
940 }
941 p += sprintf(p, "\n%s: num_tx_timeout = %d\n",
942 priv->netdev->name, priv->num_tx_timeout);
943 }
944
809c6ea8
XH
945 if (adapter->iface_type == MWIFIEX_SDIO) {
946 p += sprintf(p, "\n=== SDIO register DUMP===\n");
947 if (adapter->if_ops.reg_dump)
948 p += adapter->if_ops.reg_dump(adapter, p);
949 }
950
11cd07a9
XH
951 p += sprintf(p, "\n=== MORE DEBUG INFORMATION\n");
952 debug_info = kzalloc(sizeof(*debug_info), GFP_KERNEL);
953 if (debug_info) {
954 for (i = 0; i < adapter->priv_num; i++) {
955 if (!adapter->priv[i] || !adapter->priv[i]->netdev)
956 continue;
957 priv = adapter->priv[i];
958 mwifiex_get_debug_info(priv, debug_info);
959 p += mwifiex_debug_info_to_buffer(priv, p, debug_info);
960 break;
961 }
962 kfree(debug_info);
963 }
964
965 adapter->drv_info_size = p - adapter->drv_info_dump;
966 dev_info(adapter->dev, "=== DRIVER INFO DUMP END===\n");
967}
968EXPORT_SYMBOL_GPL(mwifiex_dump_drv_info);
969
5e6e3a92
BZ
970/*
971 * CFG802.11 network device handler for statistics retrieval.
972 */
973static struct net_device_stats *mwifiex_get_stats(struct net_device *dev)
974{
975 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
976
977 return &priv->stats;
978}
979
47411a06 980static u16
f663dd9a 981mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb,
99932d4f 982 void *accel_priv, select_queue_fallback_t fallback)
47411a06 983{
fa9ffc74 984 skb->priority = cfg80211_classify8021d(skb, NULL);
47411a06
AP
985 return mwifiex_1d_to_wmm_queue[skb->priority];
986}
987
5e6e3a92
BZ
988/* Network device handlers */
989static const struct net_device_ops mwifiex_netdev_ops = {
990 .ndo_open = mwifiex_open,
991 .ndo_stop = mwifiex_close,
992 .ndo_start_xmit = mwifiex_hard_start_xmit,
993 .ndo_set_mac_address = mwifiex_set_mac_address,
994 .ndo_tx_timeout = mwifiex_tx_timeout,
995 .ndo_get_stats = mwifiex_get_stats,
afc4b13d 996 .ndo_set_rx_mode = mwifiex_set_multicast_list,
47411a06 997 .ndo_select_queue = mwifiex_netdev_select_wmm_queue,
5e6e3a92
BZ
998};
999
1000/*
1001 * This function initializes the private structure parameters.
1002 *
1003 * The following wait queues are initialized -
1004 * - IOCTL wait queue
1005 * - Command wait queue
1006 * - Statistics wait queue
1007 *
1008 * ...and the following default parameters are set -
1009 * - Current key index : Set to 0
1010 * - Rate index : Set to auto
1011 * - Media connected : Set to disconnected
1012 * - Adhoc link sensed : Set to false
1013 * - Nick name : Set to null
1014 * - Number of Tx timeout : Set to 0
1015 * - Device address : Set to current address
cbf6e055 1016 * - Rx histogram statistc : Set to 0
5e6e3a92
BZ
1017 *
1018 * In addition, the CFG80211 work queue is also created.
1019 */
93a1df48 1020void mwifiex_init_priv_params(struct mwifiex_private *priv,
047eaaf6 1021 struct net_device *dev)
5e6e3a92
BZ
1022{
1023 dev->netdev_ops = &mwifiex_netdev_ops;
f16fdc9d 1024 dev->destructor = free_netdev;
5e6e3a92 1025 /* Initialize private structure */
5e6e3a92
BZ
1026 priv->current_key_index = 0;
1027 priv->media_connected = false;
ede98bfa
AP
1028 memset(priv->mgmt_ie, 0,
1029 sizeof(struct mwifiex_ie) * MAX_MGMT_IE_INDEX);
f31acabe
AP
1030 priv->beacon_idx = MWIFIEX_AUTO_IDX_MASK;
1031 priv->proberesp_idx = MWIFIEX_AUTO_IDX_MASK;
1032 priv->assocresp_idx = MWIFIEX_AUTO_IDX_MASK;
2ade5667 1033 priv->gen_idx = MWIFIEX_AUTO_IDX_MASK;
5e6e3a92 1034 priv->num_tx_timeout = 0;
8d05eb22 1035 ether_addr_copy(priv->curr_addr, priv->adapter->perm_addr);
5e6e3a92 1036 memcpy(dev->dev_addr, priv->curr_addr, ETH_ALEN);
cbf6e055
XH
1037
1038 if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA ||
1039 GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) {
1040 priv->hist_data = kmalloc(sizeof(*priv->hist_data), GFP_KERNEL);
1041 if (priv->hist_data)
1042 mwifiex_hist_data_reset(priv);
1043 }
5e6e3a92
BZ
1044}
1045
5e6e3a92
BZ
1046/*
1047 * This function check if command is pending.
1048 */
1049int is_command_pending(struct mwifiex_adapter *adapter)
1050{
1051 unsigned long flags;
1052 int is_cmd_pend_q_empty;
1053
1054 spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
1055 is_cmd_pend_q_empty = list_empty(&adapter->cmd_pending_q);
1056 spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags);
1057
1058 return !is_cmd_pend_q_empty;
1059}
1060
6e251174
AP
1061/*
1062 * This is the RX work queue function.
1063 *
1064 * It handles the RX operations.
1065 */
1066static void mwifiex_rx_work_queue(struct work_struct *work)
1067{
1068 struct mwifiex_adapter *adapter =
1069 container_of(work, struct mwifiex_adapter, rx_work);
1070
1071 if (adapter->surprise_removed)
1072 return;
1073 mwifiex_process_rx(adapter);
1074}
1075
5e6e3a92
BZ
1076/*
1077 * This is the main work queue function.
1078 *
1079 * It handles the main process, which in turn handles the complete
1080 * driver operations.
1081 */
1082static void mwifiex_main_work_queue(struct work_struct *work)
1083{
1084 struct mwifiex_adapter *adapter =
1085 container_of(work, struct mwifiex_adapter, main_work);
1086
1087 if (adapter->surprise_removed)
1088 return;
1089 mwifiex_main_process(adapter);
1090}
1091
5e6e3a92
BZ
1092/*
1093 * This function adds the card.
1094 *
1095 * This function follows the following major steps to set up the device -
1096 * - Initialize software. This includes probing the card, registering
1097 * the interface operations table, and allocating/initializing the
1098 * adapter structure
1099 * - Set up the netlink socket
1100 * - Create and start the main work queue
1101 * - Register the device
1102 * - Initialize firmware and hardware
1103 * - Add logical interfaces
1104 */
1105int
1106mwifiex_add_card(void *card, struct semaphore *sem,
d930faee 1107 struct mwifiex_if_ops *if_ops, u8 iface_type)
5e6e3a92 1108{
2be7859f 1109 struct mwifiex_adapter *adapter;
5e6e3a92
BZ
1110
1111 if (down_interruptible(sem))
1112 goto exit_sem_err;
1113
93a1df48 1114 if (mwifiex_register(card, if_ops, (void **)&adapter)) {
5e6e3a92
BZ
1115 pr_err("%s: software init failed\n", __func__);
1116 goto err_init_sw;
1117 }
1118
d930faee 1119 adapter->iface_type = iface_type;
6b41f941 1120 adapter->card_sem = sem;
d930faee 1121
5e6e3a92 1122 adapter->hw_status = MWIFIEX_HW_STATUS_INITIALIZING;
5e6e3a92
BZ
1123 adapter->surprise_removed = false;
1124 init_waitqueue_head(&adapter->init_wait_q);
1125 adapter->is_suspended = false;
1126 adapter->hs_activated = false;
1127 init_waitqueue_head(&adapter->hs_activate_wait_q);
600f5d90 1128 init_waitqueue_head(&adapter->cmd_wait_q.wait);
600f5d90 1129 adapter->cmd_wait_q.status = 0;
efaaa8b8 1130 adapter->scan_wait_q_woken = false;
5e6e3a92 1131
ec4a16b4 1132 if ((num_possible_cpus() > 1) || adapter->iface_type == MWIFIEX_USB) {
6e251174
AP
1133 adapter->rx_work_enabled = true;
1134 pr_notice("rx work enabled, cpus %d\n", num_possible_cpus());
1135 }
1136
448a71cc
AK
1137 adapter->workqueue =
1138 alloc_workqueue("MWIFIEX_WORK_QUEUE",
1139 WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, 1);
5e6e3a92
BZ
1140 if (!adapter->workqueue)
1141 goto err_kmalloc;
1142
1143 INIT_WORK(&adapter->main_work, mwifiex_main_work_queue);
6e251174
AP
1144
1145 if (adapter->rx_work_enabled) {
1146 adapter->rx_workqueue = alloc_workqueue("MWIFIEX_RX_WORK_QUEUE",
1147 WQ_HIGHPRI |
1148 WQ_MEM_RECLAIM |
1149 WQ_UNBOUND, 1);
1150 if (!adapter->rx_workqueue)
1151 goto err_kmalloc;
1152
1153 INIT_WORK(&adapter->rx_work, mwifiex_rx_work_queue);
1154 }
1155
5e6e3a92 1156 /* Register the device. Fill up the private data structure with relevant
232fde06 1157 information from the card. */
5e6e3a92
BZ
1158 if (adapter->if_ops.register_dev(adapter)) {
1159 pr_err("%s: failed to register mwifiex device\n", __func__);
1160 goto err_registerdev;
1161 }
1162
5e6e3a92
BZ
1163 if (mwifiex_init_hw_fw(adapter)) {
1164 pr_err("%s: firmware init failed\n", __func__);
1165 goto err_init_fw;
1166 }
2be7859f 1167
5e6e3a92
BZ
1168 return 0;
1169
5e6e3a92 1170err_init_fw:
5e6e3a92 1171 pr_debug("info: %s: unregister device\n", __func__);
4daffe35
AK
1172 if (adapter->if_ops.unregister_dev)
1173 adapter->if_ops.unregister_dev(adapter);
7197325b 1174 if (adapter->hw_status == MWIFIEX_HW_STATUS_READY) {
5e6e3a92
BZ
1175 pr_debug("info: %s: shutdown mwifiex\n", __func__);
1176 adapter->init_wait_q_woken = false;
636c4598
YAP
1177
1178 if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
5e6e3a92
BZ
1179 wait_event_interruptible(adapter->init_wait_q,
1180 adapter->init_wait_q_woken);
1181 }
6b41f941
AK
1182err_registerdev:
1183 adapter->surprise_removed = true;
1184 mwifiex_terminate_workqueue(adapter);
1185err_kmalloc:
5e6e3a92
BZ
1186 mwifiex_free_adapter(adapter);
1187
1188err_init_sw:
1189 up(sem);
1190
1191exit_sem_err:
1192 return -1;
1193}
1194EXPORT_SYMBOL_GPL(mwifiex_add_card);
1195
1196/*
1197 * This function removes the card.
1198 *
1199 * This function follows the following major steps to remove the device -
1200 * - Stop data traffic
1201 * - Shutdown firmware
1202 * - Remove the logical interfaces
1203 * - Terminate the work queue
1204 * - Unregister the device
1205 * - Free the adapter structure
1206 */
1207int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
1208{
1209 struct mwifiex_private *priv = NULL;
5e6e3a92
BZ
1210 int i;
1211
1212 if (down_interruptible(sem))
1213 goto exit_sem_err;
1214
1215 if (!adapter)
1216 goto exit_remove;
1217
232fde06
DD
1218 /* We can no longer handle interrupts once we start doing the teardown
1219 * below. */
1220 if (adapter->if_ops.disable_int)
1221 adapter->if_ops.disable_int(adapter);
1222
5e6e3a92
BZ
1223 adapter->surprise_removed = true;
1224
9d2e85e0
MY
1225 mwifiex_terminate_workqueue(adapter);
1226
5e6e3a92
BZ
1227 /* Stop data */
1228 for (i = 0; i < adapter->priv_num; i++) {
1229 priv = adapter->priv[i];
93a1df48 1230 if (priv && priv->netdev) {
47411a06 1231 mwifiex_stop_net_dev_queue(priv->netdev, adapter);
5e6e3a92
BZ
1232 if (netif_carrier_ok(priv->netdev))
1233 netif_carrier_off(priv->netdev);
1234 }
1235 }
1236
1237 dev_dbg(adapter->dev, "cmd: calling mwifiex_shutdown_drv...\n");
1238 adapter->init_wait_q_woken = false;
636c4598
YAP
1239
1240 if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
5e6e3a92
BZ
1241 wait_event_interruptible(adapter->init_wait_q,
1242 adapter->init_wait_q_woken);
1243 dev_dbg(adapter->dev, "cmd: mwifiex_shutdown_drv done\n");
1244 if (atomic_read(&adapter->rx_pending) ||
1245 atomic_read(&adapter->tx_pending) ||
600f5d90 1246 atomic_read(&adapter->cmd_pending)) {
5e6e3a92 1247 dev_err(adapter->dev, "rx_pending=%d, tx_pending=%d, "
600f5d90 1248 "cmd_pending=%d\n",
5e6e3a92
BZ
1249 atomic_read(&adapter->rx_pending),
1250 atomic_read(&adapter->tx_pending),
600f5d90 1251 atomic_read(&adapter->cmd_pending));
5e6e3a92
BZ
1252 }
1253
93a1df48
YAP
1254 for (i = 0; i < adapter->priv_num; i++) {
1255 priv = adapter->priv[i];
1256
1257 if (!priv)
1258 continue;
1259
1260 rtnl_lock();
4facc34a
AP
1261 if (priv->netdev &&
1262 priv->wdev.iftype != NL80211_IFTYPE_UNSPECIFIED)
1263 mwifiex_del_virtual_intf(adapter->wiphy, &priv->wdev);
93a1df48
YAP
1264 rtnl_unlock();
1265 }
1266
c2868ade
AK
1267 wiphy_unregister(adapter->wiphy);
1268 wiphy_free(adapter->wiphy);
64b05e2f 1269
5e6e3a92
BZ
1270 /* Unregister device */
1271 dev_dbg(adapter->dev, "info: unregister device\n");
4daffe35
AK
1272 if (adapter->if_ops.unregister_dev)
1273 adapter->if_ops.unregister_dev(adapter);
5e6e3a92
BZ
1274 /* Free adapter structure */
1275 dev_dbg(adapter->dev, "info: free adapter\n");
1276 mwifiex_free_adapter(adapter);
1277
1278exit_remove:
1279 up(sem);
1280exit_sem_err:
1281 return 0;
1282}
1283EXPORT_SYMBOL_GPL(mwifiex_remove_card);
1284
1285/*
1286 * This function initializes the module.
1287 *
1288 * The debug FS is also initialized if configured.
1289 */
1290static int
1291mwifiex_init_module(void)
1292{
1293#ifdef CONFIG_DEBUG_FS
1294 mwifiex_debugfs_init();
1295#endif
1296 return 0;
1297}
1298
1299/*
1300 * This function cleans up the module.
1301 *
1302 * The debug FS is removed if available.
1303 */
1304static void
1305mwifiex_cleanup_module(void)
1306{
1307#ifdef CONFIG_DEBUG_FS
1308 mwifiex_debugfs_remove();
1309#endif
1310}
1311
1312module_init(mwifiex_init_module);
1313module_exit(mwifiex_cleanup_module);
1314
1315MODULE_AUTHOR("Marvell International Ltd.");
1316MODULE_DESCRIPTION("Marvell WiFi-Ex Driver version " VERSION);
1317MODULE_VERSION(VERSION);
1318MODULE_LICENSE("GPL v2");
This page took 0.408141 seconds and 5 git commands to generate.