mwifiex: wait for firmware
[cascardo/linux.git] / drivers / net / wireless / mwifiex / main.c
1 /*
2  * Marvell Wireless LAN device driver: major functions
3  *
4  * Copyright (C) 2011, Marvell International Ltd.
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
27 const char driver_version[] = "mwifiex " VERSION " (%s) ";
28
29 /*
30  * This function registers the device and performs all the necessary
31  * initializations.
32  *
33  * The following initialization operations are performed -
34  *      - Allocate adapter structure
35  *      - Save interface specific operations table in adapter
36  *      - Call interface specific initialization routine
37  *      - Allocate private structures
38  *      - Set default adapter structure parameters
39  *      - Initialize locks
40  *
41  * In case of any errors during inittialization, this function also ensures
42  * proper cleanup before exiting.
43  */
44 static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
45                             void **padapter)
46 {
47         struct mwifiex_adapter *adapter;
48         int i;
49
50         adapter = kzalloc(sizeof(struct mwifiex_adapter), GFP_KERNEL);
51         if (!adapter)
52                 return -ENOMEM;
53
54         *padapter = adapter;
55         adapter->card = card;
56
57         /* Save interface specific operations in adapter */
58         memmove(&adapter->if_ops, if_ops, sizeof(struct mwifiex_if_ops));
59
60         /* card specific initialization has been deferred until now .. */
61         if (adapter->if_ops.init_if(adapter))
62                 goto error;
63
64         adapter->priv_num = 0;
65
66         /* Allocate memory for private structure */
67         adapter->priv[0] = kzalloc(sizeof(struct mwifiex_private), GFP_KERNEL);
68         if (!adapter->priv[0]) {
69                 dev_err(adapter->dev,
70                         "%s: failed to alloc priv[0]\n", __func__);
71                 goto error;
72         }
73
74         adapter->priv_num++;
75
76         adapter->priv[0]->adapter = adapter;
77         mwifiex_init_lock_list(adapter);
78
79         init_timer(&adapter->cmd_timer);
80         adapter->cmd_timer.function = mwifiex_cmd_timeout_func;
81         adapter->cmd_timer.data = (unsigned long) adapter;
82
83         return 0;
84
85 error:
86         dev_dbg(adapter->dev, "info: leave mwifiex_register with error\n");
87
88         for (i = 0; i < adapter->priv_num; i++)
89                 kfree(adapter->priv[i]);
90
91         kfree(adapter);
92
93         return -1;
94 }
95
96 /*
97  * This function unregisters the device and performs all the necessary
98  * cleanups.
99  *
100  * The following cleanup operations are performed -
101  *      - Free the timers
102  *      - Free beacon buffers
103  *      - Free private structures
104  *      - Free adapter structure
105  */
106 static int mwifiex_unregister(struct mwifiex_adapter *adapter)
107 {
108         s32 i;
109
110         del_timer(&adapter->cmd_timer);
111
112         /* Free private structures */
113         for (i = 0; i < adapter->priv_num; i++) {
114                 if (adapter->priv[i]) {
115                         mwifiex_free_curr_bcn(adapter->priv[i]);
116                         kfree(adapter->priv[i]);
117                 }
118         }
119
120         kfree(adapter);
121         return 0;
122 }
123
124 /*
125  * The main process.
126  *
127  * This function is the main procedure of the driver and handles various driver
128  * operations. It runs in a loop and provides the core functionalities.
129  *
130  * The main responsibilities of this function are -
131  *      - Ensure concurrency control
132  *      - Handle pending interrupts and call interrupt handlers
133  *      - Wake up the card if required
134  *      - Handle command responses and call response handlers
135  *      - Handle events and call event handlers
136  *      - Execute pending commands
137  *      - Transmit pending data packets
138  */
139 int mwifiex_main_process(struct mwifiex_adapter *adapter)
140 {
141         int ret = 0;
142         unsigned long flags;
143
144         spin_lock_irqsave(&adapter->main_proc_lock, flags);
145
146         /* Check if already processing */
147         if (adapter->mwifiex_processing) {
148                 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
149                 goto exit_main_proc;
150         } else {
151                 adapter->mwifiex_processing = true;
152                 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
153         }
154 process_start:
155         do {
156                 if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) ||
157                     (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY))
158                         break;
159
160                 /* Handle pending interrupt if any */
161                 if (adapter->int_status) {
162                         if (adapter->hs_activated)
163                                 mwifiex_process_hs_config(adapter);
164                         adapter->if_ops.process_int_status(adapter);
165                 }
166
167                 /* Need to wake up the card ? */
168                 if ((adapter->ps_state == PS_STATE_SLEEP) &&
169                     (adapter->pm_wakeup_card_req &&
170                      !adapter->pm_wakeup_fw_try) &&
171                     (is_command_pending(adapter) ||
172                      !mwifiex_wmm_lists_empty(adapter))) {
173                         adapter->pm_wakeup_fw_try = true;
174                         adapter->if_ops.wakeup(adapter);
175                         continue;
176                 }
177                 if (IS_CARD_RX_RCVD(adapter)) {
178                         adapter->pm_wakeup_fw_try = false;
179                         if (adapter->ps_state == PS_STATE_SLEEP)
180                                 adapter->ps_state = PS_STATE_AWAKE;
181                 } else {
182                         /* We have tried to wakeup the card already */
183                         if (adapter->pm_wakeup_fw_try)
184                                 break;
185                         if (adapter->ps_state != PS_STATE_AWAKE ||
186                             adapter->tx_lock_flag)
187                                 break;
188
189                         if ((adapter->scan_processing &&
190                              !adapter->scan_delay_cnt) || adapter->data_sent ||
191                             mwifiex_wmm_lists_empty(adapter)) {
192                                 if (adapter->cmd_sent || adapter->curr_cmd ||
193                                     (!is_command_pending(adapter)))
194                                         break;
195                         }
196                 }
197
198                 /* Check for Cmd Resp */
199                 if (adapter->cmd_resp_received) {
200                         adapter->cmd_resp_received = false;
201                         mwifiex_process_cmdresp(adapter);
202
203                         /* call mwifiex back when init_fw is done */
204                         if (adapter->hw_status == MWIFIEX_HW_STATUS_INIT_DONE) {
205                                 adapter->hw_status = MWIFIEX_HW_STATUS_READY;
206                                 mwifiex_init_fw_complete(adapter);
207                         }
208                 }
209
210                 /* Check for event */
211                 if (adapter->event_received) {
212                         adapter->event_received = false;
213                         mwifiex_process_event(adapter);
214                 }
215
216                 /* Check if we need to confirm Sleep Request
217                    received previously */
218                 if (adapter->ps_state == PS_STATE_PRE_SLEEP) {
219                         if (!adapter->cmd_sent && !adapter->curr_cmd)
220                                 mwifiex_check_ps_cond(adapter);
221                 }
222
223                 /* * The ps_state may have been changed during processing of
224                  * Sleep Request event.
225                  */
226                 if ((adapter->ps_state == PS_STATE_SLEEP) ||
227                     (adapter->ps_state == PS_STATE_PRE_SLEEP) ||
228                     (adapter->ps_state == PS_STATE_SLEEP_CFM) ||
229                     adapter->tx_lock_flag)
230                         continue;
231
232                 if (!adapter->cmd_sent && !adapter->curr_cmd) {
233                         if (mwifiex_exec_next_cmd(adapter) == -1) {
234                                 ret = -1;
235                                 break;
236                         }
237                 }
238
239                 if ((!adapter->scan_processing || adapter->scan_delay_cnt) &&
240                     !adapter->data_sent && !mwifiex_wmm_lists_empty(adapter)) {
241                         mwifiex_wmm_process_tx(adapter);
242                         if (adapter->hs_activated) {
243                                 adapter->is_hs_configured = false;
244                                 mwifiex_hs_activated_event
245                                         (mwifiex_get_priv
246                                          (adapter, MWIFIEX_BSS_ROLE_ANY),
247                                          false);
248                         }
249                 }
250
251                 if (adapter->delay_null_pkt && !adapter->cmd_sent &&
252                     !adapter->curr_cmd && !is_command_pending(adapter) &&
253                     mwifiex_wmm_lists_empty(adapter)) {
254                         if (!mwifiex_send_null_packet
255                             (mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
256                              MWIFIEX_TxPD_POWER_MGMT_NULL_PACKET |
257                              MWIFIEX_TxPD_POWER_MGMT_LAST_PACKET)) {
258                                 adapter->delay_null_pkt = false;
259                                 adapter->ps_state = PS_STATE_SLEEP;
260                         }
261                         break;
262                 }
263         } while (true);
264
265         if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter))
266                 goto process_start;
267
268         spin_lock_irqsave(&adapter->main_proc_lock, flags);
269         adapter->mwifiex_processing = false;
270         spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
271
272 exit_main_proc:
273         if (adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING)
274                 mwifiex_shutdown_drv(adapter);
275         return ret;
276 }
277 EXPORT_SYMBOL_GPL(mwifiex_main_process);
278
279 /*
280  * This function frees the adapter structure.
281  *
282  * Additionally, this closes the netlink socket, frees the timers
283  * and private structures.
284  */
285 static void mwifiex_free_adapter(struct mwifiex_adapter *adapter)
286 {
287         if (!adapter) {
288                 pr_err("%s: adapter is NULL\n", __func__);
289                 return;
290         }
291
292         mwifiex_unregister(adapter);
293         pr_debug("info: %s: free adapter\n", __func__);
294 }
295
296 /*
297  * This function gets firmware and initializes it.
298  *
299  * The main initialization steps followed are -
300  *      - Download the correct firmware to card
301  *      - Issue the init commands to firmware
302  */
303 static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
304 {
305         int ret;
306         char fmt[64];
307         struct mwifiex_private *priv;
308         struct mwifiex_adapter *adapter = context;
309         struct mwifiex_fw_image fw;
310
311         if (!firmware) {
312                 dev_err(adapter->dev,
313                         "Failed to get firmware %s\n", adapter->fw_name);
314                 goto done;
315         }
316
317         memset(&fw, 0, sizeof(struct mwifiex_fw_image));
318         adapter->firmware = firmware;
319         fw.fw_buf = (u8 *) adapter->firmware->data;
320         fw.fw_len = adapter->firmware->size;
321
322         ret = mwifiex_dnld_fw(adapter, &fw);
323         if (ret == -1)
324                 goto done;
325
326         dev_notice(adapter->dev, "WLAN FW is active\n");
327
328         adapter->init_wait_q_woken = false;
329         ret = mwifiex_init_fw(adapter);
330         if (ret == -1) {
331                 goto done;
332         } else if (!ret) {
333                 adapter->hw_status = MWIFIEX_HW_STATUS_READY;
334                 goto done;
335         }
336         /* Wait for mwifiex_init to complete */
337         wait_event_interruptible(adapter->init_wait_q,
338                                  adapter->init_wait_q_woken);
339         if (adapter->hw_status != MWIFIEX_HW_STATUS_READY)
340                 goto done;
341
342         priv = adapter->priv[0];
343         if (mwifiex_register_cfg80211(priv) != 0) {
344                 dev_err(adapter->dev, "cannot register with cfg80211\n");
345                 goto err_init_fw;
346         }
347
348         rtnl_lock();
349         /* Create station interface by default */
350         if (!mwifiex_add_virtual_intf(priv->wdev->wiphy, "mlan%d",
351                                       NL80211_IFTYPE_STATION, NULL, NULL)) {
352                 dev_err(adapter->dev, "cannot create default STA interface\n");
353                 goto err_add_intf;
354         }
355         rtnl_unlock();
356
357         mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1);
358         dev_notice(adapter->dev, "driver_version = %s\n", fmt);
359         goto done;
360
361 err_add_intf:
362         mwifiex_del_virtual_intf(priv->wdev->wiphy, priv->netdev);
363         rtnl_unlock();
364 err_init_fw:
365         pr_debug("info: %s: unregister device\n", __func__);
366         adapter->if_ops.unregister_dev(adapter);
367 done:
368         release_firmware(adapter->firmware);
369         complete(&adapter->fw_load);
370         return;
371 }
372
373 /*
374  * This function initializes the hardware and gets firmware.
375  */
376 static int mwifiex_init_hw_fw(struct mwifiex_adapter *adapter)
377 {
378         int ret;
379
380         const struct firmware *fw;
381
382         init_completion(&adapter->fw_load);
383         ret = request_firmware(&fw, adapter->fw_name, adapter->dev);
384         if (ret < 0)
385                 dev_err(adapter->dev,
386                         "request_firmware() returned error %d\n", ret);
387         else
388                 mwifiex_fw_dpc(fw, adapter);
389         return ret;
390 }
391
392 /*
393  * CFG802.11 network device handler for open.
394  *
395  * Starts the data queue.
396  */
397 static int
398 mwifiex_open(struct net_device *dev)
399 {
400         netif_tx_start_all_queues(dev);
401         return 0;
402 }
403
404 /*
405  * CFG802.11 network device handler for close.
406  */
407 static int
408 mwifiex_close(struct net_device *dev)
409 {
410         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
411
412         if (priv->scan_request) {
413                 dev_dbg(priv->adapter->dev, "aborting scan on ndo_stop\n");
414                 cfg80211_scan_done(priv->scan_request, 1);
415                 priv->scan_request = NULL;
416                 priv->scan_aborting = true;
417         }
418
419         return 0;
420 }
421
422 /*
423  * Add buffer into wmm tx queue and queue work to transmit it.
424  */
425 int mwifiex_queue_tx_pkt(struct mwifiex_private *priv, struct sk_buff *skb)
426 {
427         struct netdev_queue *txq;
428         int index = mwifiex_1d_to_wmm_queue[skb->priority];
429
430         if (atomic_inc_return(&priv->wmm_tx_pending[index]) >= MAX_TX_PENDING) {
431                 txq = netdev_get_tx_queue(priv->netdev, index);
432                 if (!netif_tx_queue_stopped(txq)) {
433                         netif_tx_stop_queue(txq);
434                         dev_dbg(priv->adapter->dev, "stop queue: %d\n", index);
435                 }
436         }
437
438         atomic_inc(&priv->adapter->tx_pending);
439         mwifiex_wmm_add_buf_txqueue(priv, skb);
440
441         if (priv->adapter->scan_delay_cnt)
442                 atomic_set(&priv->adapter->is_tx_received, true);
443
444         queue_work(priv->adapter->workqueue, &priv->adapter->main_work);
445
446         return 0;
447 }
448
449 /*
450  * CFG802.11 network device handler for data transmission.
451  */
452 static int
453 mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
454 {
455         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
456         struct sk_buff *new_skb;
457         struct mwifiex_txinfo *tx_info;
458         struct timeval tv;
459
460         dev_dbg(priv->adapter->dev, "data: %lu BSS(%d-%d): Data <= kernel\n",
461                 jiffies, priv->bss_type, priv->bss_num);
462
463         if (priv->adapter->surprise_removed) {
464                 kfree_skb(skb);
465                 priv->stats.tx_dropped++;
466                 return 0;
467         }
468         if (!skb->len || (skb->len > ETH_FRAME_LEN)) {
469                 dev_err(priv->adapter->dev, "Tx: bad skb len %d\n", skb->len);
470                 kfree_skb(skb);
471                 priv->stats.tx_dropped++;
472                 return 0;
473         }
474         if (skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN) {
475                 dev_dbg(priv->adapter->dev,
476                         "data: Tx: insufficient skb headroom %d\n",
477                         skb_headroom(skb));
478                 /* Insufficient skb headroom - allocate a new skb */
479                 new_skb =
480                         skb_realloc_headroom(skb, MWIFIEX_MIN_DATA_HEADER_LEN);
481                 if (unlikely(!new_skb)) {
482                         dev_err(priv->adapter->dev, "Tx: cannot alloca new_skb\n");
483                         kfree_skb(skb);
484                         priv->stats.tx_dropped++;
485                         return 0;
486                 }
487                 kfree_skb(skb);
488                 skb = new_skb;
489                 dev_dbg(priv->adapter->dev, "info: new skb headroomd %d\n",
490                         skb_headroom(skb));
491         }
492
493         tx_info = MWIFIEX_SKB_TXCB(skb);
494         tx_info->bss_num = priv->bss_num;
495         tx_info->bss_type = priv->bss_type;
496
497         /* Record the current time the packet was queued; used to
498          * determine the amount of time the packet was queued in
499          * the driver before it was sent to the firmware.
500          * The delay is then sent along with the packet to the
501          * firmware for aggregate delay calculation for stats and
502          * MSDU lifetime expiry.
503          */
504         do_gettimeofday(&tv);
505         skb->tstamp = timeval_to_ktime(tv);
506
507         mwifiex_queue_tx_pkt(priv, skb);
508
509         return 0;
510 }
511
512 /*
513  * CFG802.11 network device handler for setting MAC address.
514  */
515 static int
516 mwifiex_set_mac_address(struct net_device *dev, void *addr)
517 {
518         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
519         struct sockaddr *hw_addr = addr;
520         int ret;
521
522         memcpy(priv->curr_addr, hw_addr->sa_data, ETH_ALEN);
523
524         /* Send request to firmware */
525         ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_MAC_ADDRESS,
526                                     HostCmd_ACT_GEN_SET, 0, NULL);
527
528         if (!ret)
529                 memcpy(priv->netdev->dev_addr, priv->curr_addr, ETH_ALEN);
530         else
531                 dev_err(priv->adapter->dev,
532                         "set mac address failed: ret=%d\n", ret);
533
534         memcpy(dev->dev_addr, priv->curr_addr, ETH_ALEN);
535
536         return ret;
537 }
538
539 /*
540  * CFG802.11 network device handler for setting multicast list.
541  */
542 static void mwifiex_set_multicast_list(struct net_device *dev)
543 {
544         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
545         struct mwifiex_multicast_list mcast_list;
546
547         if (dev->flags & IFF_PROMISC) {
548                 mcast_list.mode = MWIFIEX_PROMISC_MODE;
549         } else if (dev->flags & IFF_ALLMULTI ||
550                    netdev_mc_count(dev) > MWIFIEX_MAX_MULTICAST_LIST_SIZE) {
551                 mcast_list.mode = MWIFIEX_ALL_MULTI_MODE;
552         } else {
553                 mcast_list.mode = MWIFIEX_MULTICAST_MODE;
554                 if (netdev_mc_count(dev))
555                         mcast_list.num_multicast_addr =
556                                 mwifiex_copy_mcast_addr(&mcast_list, dev);
557         }
558         mwifiex_request_set_multicast_list(priv, &mcast_list);
559 }
560
561 /*
562  * CFG802.11 network device handler for transmission timeout.
563  */
564 static void
565 mwifiex_tx_timeout(struct net_device *dev)
566 {
567         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
568
569         priv->num_tx_timeout++;
570         priv->tx_timeout_cnt++;
571         dev_err(priv->adapter->dev,
572                 "%lu : Tx timeout(#%d), bss_type-num = %d-%d\n",
573                 jiffies, priv->tx_timeout_cnt, priv->bss_type, priv->bss_num);
574         mwifiex_set_trans_start(dev);
575
576         if (priv->adapter->if_ops.reg_dbg)
577                 priv->adapter->if_ops.reg_dbg(priv->adapter);
578
579         if (priv->tx_timeout_cnt > TX_TIMEOUT_THRESHOLD &&
580             priv->adapter->if_ops.card_reset) {
581                 dev_err(priv->adapter->dev, "tx_timeout_cnt exceeds threshold. "
582                         "Triggering card reset!\n");
583                 priv->adapter->if_ops.card_reset(priv->adapter);
584         }
585 }
586
587 /*
588  * CFG802.11 network device handler for statistics retrieval.
589  */
590 static struct net_device_stats *mwifiex_get_stats(struct net_device *dev)
591 {
592         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
593
594         return &priv->stats;
595 }
596
597 static u16
598 mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb)
599 {
600         skb->priority = cfg80211_classify8021d(skb);
601         return mwifiex_1d_to_wmm_queue[skb->priority];
602 }
603
604 /* Network device handlers */
605 static const struct net_device_ops mwifiex_netdev_ops = {
606         .ndo_open = mwifiex_open,
607         .ndo_stop = mwifiex_close,
608         .ndo_start_xmit = mwifiex_hard_start_xmit,
609         .ndo_set_mac_address = mwifiex_set_mac_address,
610         .ndo_tx_timeout = mwifiex_tx_timeout,
611         .ndo_get_stats = mwifiex_get_stats,
612         .ndo_set_rx_mode = mwifiex_set_multicast_list,
613         .ndo_select_queue = mwifiex_netdev_select_wmm_queue,
614 };
615
616 /*
617  * This function initializes the private structure parameters.
618  *
619  * The following wait queues are initialized -
620  *      - IOCTL wait queue
621  *      - Command wait queue
622  *      - Statistics wait queue
623  *
624  * ...and the following default parameters are set -
625  *      - Current key index     : Set to 0
626  *      - Rate index            : Set to auto
627  *      - Media connected       : Set to disconnected
628  *      - Adhoc link sensed     : Set to false
629  *      - Nick name             : Set to null
630  *      - Number of Tx timeout  : Set to 0
631  *      - Device address        : Set to current address
632  *
633  * In addition, the CFG80211 work queue is also created.
634  */
635 void mwifiex_init_priv_params(struct mwifiex_private *priv,
636                                                 struct net_device *dev)
637 {
638         dev->netdev_ops = &mwifiex_netdev_ops;
639         dev->destructor = free_netdev;
640         /* Initialize private structure */
641         priv->current_key_index = 0;
642         priv->media_connected = false;
643         memset(&priv->nick_name, 0, sizeof(priv->nick_name));
644         priv->num_tx_timeout = 0;
645         memcpy(dev->dev_addr, priv->curr_addr, ETH_ALEN);
646 }
647
648 /*
649  * This function check if command is pending.
650  */
651 int is_command_pending(struct mwifiex_adapter *adapter)
652 {
653         unsigned long flags;
654         int is_cmd_pend_q_empty;
655
656         spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
657         is_cmd_pend_q_empty = list_empty(&adapter->cmd_pending_q);
658         spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags);
659
660         return !is_cmd_pend_q_empty;
661 }
662
663 /*
664  * This is the main work queue function.
665  *
666  * It handles the main process, which in turn handles the complete
667  * driver operations.
668  */
669 static void mwifiex_main_work_queue(struct work_struct *work)
670 {
671         struct mwifiex_adapter *adapter =
672                 container_of(work, struct mwifiex_adapter, main_work);
673
674         if (adapter->surprise_removed)
675                 return;
676         mwifiex_main_process(adapter);
677 }
678
679 /*
680  * This function cancels all works in the queue and destroys
681  * the main workqueue.
682  */
683 static void
684 mwifiex_terminate_workqueue(struct mwifiex_adapter *adapter)
685 {
686         flush_workqueue(adapter->workqueue);
687         destroy_workqueue(adapter->workqueue);
688         adapter->workqueue = NULL;
689 }
690
691 /*
692  * This function adds the card.
693  *
694  * This function follows the following major steps to set up the device -
695  *      - Initialize software. This includes probing the card, registering
696  *        the interface operations table, and allocating/initializing the
697  *        adapter structure
698  *      - Set up the netlink socket
699  *      - Create and start the main work queue
700  *      - Register the device
701  *      - Initialize firmware and hardware
702  *      - Add logical interfaces
703  */
704 int
705 mwifiex_add_card(void *card, struct semaphore *sem,
706                  struct mwifiex_if_ops *if_ops, u8 iface_type)
707 {
708         struct mwifiex_adapter *adapter;
709
710         if (down_interruptible(sem))
711                 goto exit_sem_err;
712
713         if (mwifiex_register(card, if_ops, (void **)&adapter)) {
714                 pr_err("%s: software init failed\n", __func__);
715                 goto err_init_sw;
716         }
717
718         adapter->iface_type = iface_type;
719
720         adapter->hw_status = MWIFIEX_HW_STATUS_INITIALIZING;
721         adapter->surprise_removed = false;
722         init_waitqueue_head(&adapter->init_wait_q);
723         adapter->is_suspended = false;
724         adapter->hs_activated = false;
725         init_waitqueue_head(&adapter->hs_activate_wait_q);
726         adapter->cmd_wait_q_required = false;
727         init_waitqueue_head(&adapter->cmd_wait_q.wait);
728         adapter->cmd_wait_q.status = 0;
729         adapter->scan_wait_q_woken = false;
730
731         adapter->workqueue = create_workqueue("MWIFIEX_WORK_QUEUE");
732         if (!adapter->workqueue)
733                 goto err_kmalloc;
734
735         INIT_WORK(&adapter->main_work, mwifiex_main_work_queue);
736
737         /* Register the device. Fill up the private data structure with relevant
738            information from the card and request for the required IRQ. */
739         if (adapter->if_ops.register_dev(adapter)) {
740                 pr_err("%s: failed to register mwifiex device\n", __func__);
741                 goto err_registerdev;
742         }
743
744         if (mwifiex_init_hw_fw(adapter)) {
745                 pr_err("%s: firmware init failed\n", __func__);
746                 goto err_init_fw;
747         }
748
749         up(sem);
750         return 0;
751
752 err_init_fw:
753         pr_debug("info: %s: unregister device\n", __func__);
754         adapter->if_ops.unregister_dev(adapter);
755 err_registerdev:
756         adapter->surprise_removed = true;
757         mwifiex_terminate_workqueue(adapter);
758 err_kmalloc:
759         if ((adapter->hw_status == MWIFIEX_HW_STATUS_FW_READY) ||
760             (adapter->hw_status == MWIFIEX_HW_STATUS_READY)) {
761                 pr_debug("info: %s: shutdown mwifiex\n", __func__);
762                 adapter->init_wait_q_woken = false;
763
764                 if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
765                         wait_event_interruptible(adapter->init_wait_q,
766                                                  adapter->init_wait_q_woken);
767         }
768
769         mwifiex_free_adapter(adapter);
770
771 err_init_sw:
772         up(sem);
773
774 exit_sem_err:
775         return -1;
776 }
777 EXPORT_SYMBOL_GPL(mwifiex_add_card);
778
779 /*
780  * This function removes the card.
781  *
782  * This function follows the following major steps to remove the device -
783  *      - Stop data traffic
784  *      - Shutdown firmware
785  *      - Remove the logical interfaces
786  *      - Terminate the work queue
787  *      - Unregister the device
788  *      - Free the adapter structure
789  */
790 int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
791 {
792         struct mwifiex_private *priv = NULL;
793         int i;
794
795         if (down_interruptible(sem))
796                 goto exit_sem_err;
797
798         if (!adapter)
799                 goto exit_remove;
800
801         adapter->surprise_removed = true;
802
803         /* Stop data */
804         for (i = 0; i < adapter->priv_num; i++) {
805                 priv = adapter->priv[i];
806                 if (priv && priv->netdev) {
807                         mwifiex_stop_net_dev_queue(priv->netdev, adapter);
808                         if (netif_carrier_ok(priv->netdev))
809                                 netif_carrier_off(priv->netdev);
810                 }
811         }
812
813         dev_dbg(adapter->dev, "cmd: calling mwifiex_shutdown_drv...\n");
814         adapter->init_wait_q_woken = false;
815
816         if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
817                 wait_event_interruptible(adapter->init_wait_q,
818                                          adapter->init_wait_q_woken);
819         dev_dbg(adapter->dev, "cmd: mwifiex_shutdown_drv done\n");
820         if (atomic_read(&adapter->rx_pending) ||
821             atomic_read(&adapter->tx_pending) ||
822             atomic_read(&adapter->cmd_pending)) {
823                 dev_err(adapter->dev, "rx_pending=%d, tx_pending=%d, "
824                        "cmd_pending=%d\n",
825                        atomic_read(&adapter->rx_pending),
826                        atomic_read(&adapter->tx_pending),
827                        atomic_read(&adapter->cmd_pending));
828         }
829
830         for (i = 0; i < adapter->priv_num; i++) {
831                 priv = adapter->priv[i];
832
833                 if (!priv)
834                         continue;
835
836                 rtnl_lock();
837                 if (priv->wdev && priv->netdev)
838                         mwifiex_del_virtual_intf(priv->wdev->wiphy,
839                                                  priv->netdev);
840                 rtnl_unlock();
841         }
842
843         priv = adapter->priv[0];
844         if (!priv)
845                 goto exit_remove;
846
847         if (priv->wdev) {
848                 wiphy_unregister(priv->wdev->wiphy);
849                 wiphy_free(priv->wdev->wiphy);
850                 kfree(priv->wdev);
851         }
852
853         mwifiex_terminate_workqueue(adapter);
854
855         /* Unregister device */
856         dev_dbg(adapter->dev, "info: unregister device\n");
857         adapter->if_ops.unregister_dev(adapter);
858         /* Free adapter structure */
859         dev_dbg(adapter->dev, "info: free adapter\n");
860         mwifiex_free_adapter(adapter);
861
862 exit_remove:
863         up(sem);
864 exit_sem_err:
865         return 0;
866 }
867 EXPORT_SYMBOL_GPL(mwifiex_remove_card);
868
869 /*
870  * This function initializes the module.
871  *
872  * The debug FS is also initialized if configured.
873  */
874 static int
875 mwifiex_init_module(void)
876 {
877 #ifdef CONFIG_DEBUG_FS
878         mwifiex_debugfs_init();
879 #endif
880         return 0;
881 }
882
883 /*
884  * This function cleans up the module.
885  *
886  * The debug FS is removed if available.
887  */
888 static void
889 mwifiex_cleanup_module(void)
890 {
891 #ifdef CONFIG_DEBUG_FS
892         mwifiex_debugfs_remove();
893 #endif
894 }
895
896 module_init(mwifiex_init_module);
897 module_exit(mwifiex_cleanup_module);
898
899 MODULE_AUTHOR("Marvell International Ltd.");
900 MODULE_DESCRIPTION("Marvell WiFi-Ex Driver version " VERSION);
901 MODULE_VERSION(VERSION);
902 MODULE_LICENSE("GPL v2");