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