mwifiex: remove global user_scan_cfg variable
[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         init_completion(&adapter->fw_load);
381         ret = request_firmware_nowait(THIS_MODULE, 1, adapter->fw_name,
382                                       adapter->dev, GFP_KERNEL, adapter,
383                                       mwifiex_fw_dpc);
384         if (ret < 0)
385                 dev_err(adapter->dev,
386                         "request_firmware_nowait() returned error %d\n", ret);
387         return ret;
388 }
389
390 /*
391  * CFG802.11 network device handler for open.
392  *
393  * Starts the data queue.
394  */
395 static int
396 mwifiex_open(struct net_device *dev)
397 {
398         netif_tx_start_all_queues(dev);
399         return 0;
400 }
401
402 /*
403  * CFG802.11 network device handler for close.
404  */
405 static int
406 mwifiex_close(struct net_device *dev)
407 {
408         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
409
410         if (priv->scan_request) {
411                 dev_dbg(priv->adapter->dev, "aborting scan on ndo_stop\n");
412                 cfg80211_scan_done(priv->scan_request, 1);
413                 priv->scan_request = NULL;
414                 priv->scan_aborting = true;
415         }
416
417         return 0;
418 }
419
420 /*
421  * Add buffer into wmm tx queue and queue work to transmit it.
422  */
423 int mwifiex_queue_tx_pkt(struct mwifiex_private *priv, struct sk_buff *skb)
424 {
425         struct netdev_queue *txq;
426         int index = mwifiex_1d_to_wmm_queue[skb->priority];
427
428         if (atomic_inc_return(&priv->wmm_tx_pending[index]) >= MAX_TX_PENDING) {
429                 txq = netdev_get_tx_queue(priv->netdev, index);
430                 if (!netif_tx_queue_stopped(txq)) {
431                         netif_tx_stop_queue(txq);
432                         dev_dbg(priv->adapter->dev, "stop queue: %d\n", index);
433                 }
434         }
435
436         atomic_inc(&priv->adapter->tx_pending);
437         mwifiex_wmm_add_buf_txqueue(priv, skb);
438
439         if (priv->adapter->scan_delay_cnt)
440                 atomic_set(&priv->adapter->is_tx_received, true);
441
442         queue_work(priv->adapter->workqueue, &priv->adapter->main_work);
443
444         return 0;
445 }
446
447 /*
448  * CFG802.11 network device handler for data transmission.
449  */
450 static int
451 mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
452 {
453         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
454         struct sk_buff *new_skb;
455         struct mwifiex_txinfo *tx_info;
456         struct timeval tv;
457
458         dev_dbg(priv->adapter->dev, "data: %lu BSS(%d-%d): Data <= kernel\n",
459                 jiffies, priv->bss_type, priv->bss_num);
460
461         if (priv->adapter->surprise_removed) {
462                 kfree_skb(skb);
463                 priv->stats.tx_dropped++;
464                 return 0;
465         }
466         if (!skb->len || (skb->len > ETH_FRAME_LEN)) {
467                 dev_err(priv->adapter->dev, "Tx: bad skb len %d\n", skb->len);
468                 kfree_skb(skb);
469                 priv->stats.tx_dropped++;
470                 return 0;
471         }
472         if (skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN) {
473                 dev_dbg(priv->adapter->dev,
474                         "data: Tx: insufficient skb headroom %d\n",
475                         skb_headroom(skb));
476                 /* Insufficient skb headroom - allocate a new skb */
477                 new_skb =
478                         skb_realloc_headroom(skb, MWIFIEX_MIN_DATA_HEADER_LEN);
479                 if (unlikely(!new_skb)) {
480                         dev_err(priv->adapter->dev, "Tx: cannot alloca new_skb\n");
481                         kfree_skb(skb);
482                         priv->stats.tx_dropped++;
483                         return 0;
484                 }
485                 kfree_skb(skb);
486                 skb = new_skb;
487                 dev_dbg(priv->adapter->dev, "info: new skb headroomd %d\n",
488                         skb_headroom(skb));
489         }
490
491         tx_info = MWIFIEX_SKB_TXCB(skb);
492         tx_info->bss_num = priv->bss_num;
493         tx_info->bss_type = priv->bss_type;
494
495         /* Record the current time the packet was queued; used to
496          * determine the amount of time the packet was queued in
497          * the driver before it was sent to the firmware.
498          * The delay is then sent along with the packet to the
499          * firmware for aggregate delay calculation for stats and
500          * MSDU lifetime expiry.
501          */
502         do_gettimeofday(&tv);
503         skb->tstamp = timeval_to_ktime(tv);
504
505         mwifiex_queue_tx_pkt(priv, skb);
506
507         return 0;
508 }
509
510 /*
511  * CFG802.11 network device handler for setting MAC address.
512  */
513 static int
514 mwifiex_set_mac_address(struct net_device *dev, void *addr)
515 {
516         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
517         struct sockaddr *hw_addr = addr;
518         int ret;
519
520         memcpy(priv->curr_addr, hw_addr->sa_data, ETH_ALEN);
521
522         /* Send request to firmware */
523         ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_MAC_ADDRESS,
524                                     HostCmd_ACT_GEN_SET, 0, NULL);
525
526         if (!ret)
527                 memcpy(priv->netdev->dev_addr, priv->curr_addr, ETH_ALEN);
528         else
529                 dev_err(priv->adapter->dev,
530                         "set mac address failed: ret=%d\n", ret);
531
532         memcpy(dev->dev_addr, priv->curr_addr, ETH_ALEN);
533
534         return ret;
535 }
536
537 /*
538  * CFG802.11 network device handler for setting multicast list.
539  */
540 static void mwifiex_set_multicast_list(struct net_device *dev)
541 {
542         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
543         struct mwifiex_multicast_list mcast_list;
544
545         if (dev->flags & IFF_PROMISC) {
546                 mcast_list.mode = MWIFIEX_PROMISC_MODE;
547         } else if (dev->flags & IFF_ALLMULTI ||
548                    netdev_mc_count(dev) > MWIFIEX_MAX_MULTICAST_LIST_SIZE) {
549                 mcast_list.mode = MWIFIEX_ALL_MULTI_MODE;
550         } else {
551                 mcast_list.mode = MWIFIEX_MULTICAST_MODE;
552                 if (netdev_mc_count(dev))
553                         mcast_list.num_multicast_addr =
554                                 mwifiex_copy_mcast_addr(&mcast_list, dev);
555         }
556         mwifiex_request_set_multicast_list(priv, &mcast_list);
557 }
558
559 /*
560  * CFG802.11 network device handler for transmission timeout.
561  */
562 static void
563 mwifiex_tx_timeout(struct net_device *dev)
564 {
565         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
566
567         priv->num_tx_timeout++;
568         priv->tx_timeout_cnt++;
569         dev_err(priv->adapter->dev,
570                 "%lu : Tx timeout(#%d), bss_type-num = %d-%d\n",
571                 jiffies, priv->tx_timeout_cnt, priv->bss_type, priv->bss_num);
572         mwifiex_set_trans_start(dev);
573
574         if (priv->adapter->if_ops.reg_dbg)
575                 priv->adapter->if_ops.reg_dbg(priv->adapter);
576
577         if (priv->tx_timeout_cnt > TX_TIMEOUT_THRESHOLD &&
578             priv->adapter->if_ops.card_reset) {
579                 dev_err(priv->adapter->dev, "tx_timeout_cnt exceeds threshold. "
580                         "Triggering card reset!\n");
581                 priv->adapter->if_ops.card_reset(priv->adapter);
582         }
583 }
584
585 /*
586  * CFG802.11 network device handler for statistics retrieval.
587  */
588 static struct net_device_stats *mwifiex_get_stats(struct net_device *dev)
589 {
590         struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
591
592         return &priv->stats;
593 }
594
595 static u16
596 mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb)
597 {
598         skb->priority = cfg80211_classify8021d(skb);
599         return mwifiex_1d_to_wmm_queue[skb->priority];
600 }
601
602 /* Network device handlers */
603 static const struct net_device_ops mwifiex_netdev_ops = {
604         .ndo_open = mwifiex_open,
605         .ndo_stop = mwifiex_close,
606         .ndo_start_xmit = mwifiex_hard_start_xmit,
607         .ndo_set_mac_address = mwifiex_set_mac_address,
608         .ndo_tx_timeout = mwifiex_tx_timeout,
609         .ndo_get_stats = mwifiex_get_stats,
610         .ndo_set_rx_mode = mwifiex_set_multicast_list,
611         .ndo_select_queue = mwifiex_netdev_select_wmm_queue,
612 };
613
614 /*
615  * This function initializes the private structure parameters.
616  *
617  * The following wait queues are initialized -
618  *      - IOCTL wait queue
619  *      - Command wait queue
620  *      - Statistics wait queue
621  *
622  * ...and the following default parameters are set -
623  *      - Current key index     : Set to 0
624  *      - Rate index            : Set to auto
625  *      - Media connected       : Set to disconnected
626  *      - Adhoc link sensed     : Set to false
627  *      - Nick name             : Set to null
628  *      - Number of Tx timeout  : Set to 0
629  *      - Device address        : Set to current address
630  *
631  * In addition, the CFG80211 work queue is also created.
632  */
633 void mwifiex_init_priv_params(struct mwifiex_private *priv,
634                                                 struct net_device *dev)
635 {
636         dev->netdev_ops = &mwifiex_netdev_ops;
637         dev->destructor = free_netdev;
638         /* Initialize private structure */
639         priv->current_key_index = 0;
640         priv->media_connected = false;
641         memset(&priv->nick_name, 0, sizeof(priv->nick_name));
642         priv->num_tx_timeout = 0;
643         memcpy(dev->dev_addr, priv->curr_addr, ETH_ALEN);
644 }
645
646 /*
647  * This function check if command is pending.
648  */
649 int is_command_pending(struct mwifiex_adapter *adapter)
650 {
651         unsigned long flags;
652         int is_cmd_pend_q_empty;
653
654         spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
655         is_cmd_pend_q_empty = list_empty(&adapter->cmd_pending_q);
656         spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags);
657
658         return !is_cmd_pend_q_empty;
659 }
660
661 /*
662  * This is the main work queue function.
663  *
664  * It handles the main process, which in turn handles the complete
665  * driver operations.
666  */
667 static void mwifiex_main_work_queue(struct work_struct *work)
668 {
669         struct mwifiex_adapter *adapter =
670                 container_of(work, struct mwifiex_adapter, main_work);
671
672         if (adapter->surprise_removed)
673                 return;
674         mwifiex_main_process(adapter);
675 }
676
677 /*
678  * This function cancels all works in the queue and destroys
679  * the main workqueue.
680  */
681 static void
682 mwifiex_terminate_workqueue(struct mwifiex_adapter *adapter)
683 {
684         flush_workqueue(adapter->workqueue);
685         destroy_workqueue(adapter->workqueue);
686         adapter->workqueue = NULL;
687 }
688
689 /*
690  * This function adds the card.
691  *
692  * This function follows the following major steps to set up the device -
693  *      - Initialize software. This includes probing the card, registering
694  *        the interface operations table, and allocating/initializing the
695  *        adapter structure
696  *      - Set up the netlink socket
697  *      - Create and start the main work queue
698  *      - Register the device
699  *      - Initialize firmware and hardware
700  *      - Add logical interfaces
701  */
702 int
703 mwifiex_add_card(void *card, struct semaphore *sem,
704                  struct mwifiex_if_ops *if_ops, u8 iface_type)
705 {
706         struct mwifiex_adapter *adapter;
707
708         if (down_interruptible(sem))
709                 goto exit_sem_err;
710
711         if (mwifiex_register(card, if_ops, (void **)&adapter)) {
712                 pr_err("%s: software init failed\n", __func__);
713                 goto err_init_sw;
714         }
715
716         adapter->iface_type = iface_type;
717
718         adapter->hw_status = MWIFIEX_HW_STATUS_INITIALIZING;
719         adapter->surprise_removed = false;
720         init_waitqueue_head(&adapter->init_wait_q);
721         adapter->is_suspended = false;
722         adapter->hs_activated = false;
723         init_waitqueue_head(&adapter->hs_activate_wait_q);
724         adapter->cmd_wait_q_required = false;
725         init_waitqueue_head(&adapter->cmd_wait_q.wait);
726         adapter->cmd_wait_q.status = 0;
727         adapter->scan_wait_q_woken = false;
728
729         adapter->workqueue = create_workqueue("MWIFIEX_WORK_QUEUE");
730         if (!adapter->workqueue)
731                 goto err_kmalloc;
732
733         INIT_WORK(&adapter->main_work, mwifiex_main_work_queue);
734
735         /* Register the device. Fill up the private data structure with relevant
736            information from the card and request for the required IRQ. */
737         if (adapter->if_ops.register_dev(adapter)) {
738                 pr_err("%s: failed to register mwifiex device\n", __func__);
739                 goto err_registerdev;
740         }
741
742         if (mwifiex_init_hw_fw(adapter)) {
743                 pr_err("%s: firmware init failed\n", __func__);
744                 goto err_init_fw;
745         }
746
747         up(sem);
748         return 0;
749
750 err_init_fw:
751         pr_debug("info: %s: unregister device\n", __func__);
752         adapter->if_ops.unregister_dev(adapter);
753 err_registerdev:
754         adapter->surprise_removed = true;
755         mwifiex_terminate_workqueue(adapter);
756 err_kmalloc:
757         if ((adapter->hw_status == MWIFIEX_HW_STATUS_FW_READY) ||
758             (adapter->hw_status == MWIFIEX_HW_STATUS_READY)) {
759                 pr_debug("info: %s: shutdown mwifiex\n", __func__);
760                 adapter->init_wait_q_woken = false;
761
762                 if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
763                         wait_event_interruptible(adapter->init_wait_q,
764                                                  adapter->init_wait_q_woken);
765         }
766
767         mwifiex_free_adapter(adapter);
768
769 err_init_sw:
770         up(sem);
771
772 exit_sem_err:
773         return -1;
774 }
775 EXPORT_SYMBOL_GPL(mwifiex_add_card);
776
777 /*
778  * This function removes the card.
779  *
780  * This function follows the following major steps to remove the device -
781  *      - Stop data traffic
782  *      - Shutdown firmware
783  *      - Remove the logical interfaces
784  *      - Terminate the work queue
785  *      - Unregister the device
786  *      - Free the adapter structure
787  */
788 int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
789 {
790         struct mwifiex_private *priv = NULL;
791         int i;
792
793         if (down_interruptible(sem))
794                 goto exit_sem_err;
795
796         if (!adapter)
797                 goto exit_remove;
798
799         adapter->surprise_removed = true;
800
801         /* Stop data */
802         for (i = 0; i < adapter->priv_num; i++) {
803                 priv = adapter->priv[i];
804                 if (priv && priv->netdev) {
805                         mwifiex_stop_net_dev_queue(priv->netdev, adapter);
806                         if (netif_carrier_ok(priv->netdev))
807                                 netif_carrier_off(priv->netdev);
808                 }
809         }
810
811         dev_dbg(adapter->dev, "cmd: calling mwifiex_shutdown_drv...\n");
812         adapter->init_wait_q_woken = false;
813
814         if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS)
815                 wait_event_interruptible(adapter->init_wait_q,
816                                          adapter->init_wait_q_woken);
817         dev_dbg(adapter->dev, "cmd: mwifiex_shutdown_drv done\n");
818         if (atomic_read(&adapter->rx_pending) ||
819             atomic_read(&adapter->tx_pending) ||
820             atomic_read(&adapter->cmd_pending)) {
821                 dev_err(adapter->dev, "rx_pending=%d, tx_pending=%d, "
822                        "cmd_pending=%d\n",
823                        atomic_read(&adapter->rx_pending),
824                        atomic_read(&adapter->tx_pending),
825                        atomic_read(&adapter->cmd_pending));
826         }
827
828         for (i = 0; i < adapter->priv_num; i++) {
829                 priv = adapter->priv[i];
830
831                 if (!priv)
832                         continue;
833
834                 rtnl_lock();
835                 if (priv->wdev && priv->netdev)
836                         mwifiex_del_virtual_intf(priv->wdev->wiphy,
837                                                  priv->netdev);
838                 rtnl_unlock();
839         }
840
841         priv = adapter->priv[0];
842         if (!priv)
843                 goto exit_remove;
844
845         if (priv->wdev) {
846                 wiphy_unregister(priv->wdev->wiphy);
847                 wiphy_free(priv->wdev->wiphy);
848                 kfree(priv->wdev);
849         }
850
851         mwifiex_terminate_workqueue(adapter);
852
853         /* Unregister device */
854         dev_dbg(adapter->dev, "info: unregister device\n");
855         adapter->if_ops.unregister_dev(adapter);
856         /* Free adapter structure */
857         dev_dbg(adapter->dev, "info: free adapter\n");
858         mwifiex_free_adapter(adapter);
859
860 exit_remove:
861         up(sem);
862 exit_sem_err:
863         return 0;
864 }
865 EXPORT_SYMBOL_GPL(mwifiex_remove_card);
866
867 /*
868  * This function initializes the module.
869  *
870  * The debug FS is also initialized if configured.
871  */
872 static int
873 mwifiex_init_module(void)
874 {
875 #ifdef CONFIG_DEBUG_FS
876         mwifiex_debugfs_init();
877 #endif
878         return 0;
879 }
880
881 /*
882  * This function cleans up the module.
883  *
884  * The debug FS is removed if available.
885  */
886 static void
887 mwifiex_cleanup_module(void)
888 {
889 #ifdef CONFIG_DEBUG_FS
890         mwifiex_debugfs_remove();
891 #endif
892 }
893
894 module_init(mwifiex_init_module);
895 module_exit(mwifiex_cleanup_module);
896
897 MODULE_AUTHOR("Marvell International Ltd.");
898 MODULE_DESCRIPTION("Marvell WiFi-Ex Driver version " VERSION);
899 MODULE_VERSION(VERSION);
900 MODULE_LICENSE("GPL v2");