~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/net/wireless/mwifiex/main.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

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