]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/net/wireless/mwifiex/pcie.c
Merge remote-tracking branch 'regulator/topic/max8997' into regulator-next
[karo-tx-linux.git] / drivers / net / wireless / mwifiex / pcie.c
1 /*
2  * Marvell Wireless LAN device driver: PCIE specific handling
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 <linux/firmware.h>
21
22 #include "decl.h"
23 #include "ioctl.h"
24 #include "util.h"
25 #include "fw.h"
26 #include "main.h"
27 #include "wmm.h"
28 #include "11n.h"
29 #include "pcie.h"
30
31 #define PCIE_VERSION    "1.0"
32 #define DRV_NAME        "Marvell mwifiex PCIe"
33
34 static u8 user_rmmod;
35
36 static struct mwifiex_if_ops pcie_ops;
37
38 static struct semaphore add_remove_card_sem;
39 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter);
40 static int mwifiex_pcie_resume(struct pci_dev *pdev);
41
42 /*
43  * This function is called after skb allocation to update
44  * "skb->cb" with physical address of data pointer.
45  */
46 static phys_addr_t *mwifiex_update_sk_buff_pa(struct sk_buff *skb)
47 {
48         phys_addr_t *buf_pa = MWIFIEX_SKB_PACB(skb);
49
50         *buf_pa = (phys_addr_t)virt_to_phys(skb->data);
51
52         return buf_pa;
53 }
54
55 /*
56  * This function reads sleep cookie and checks if FW is ready
57  */
58 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
59 {
60         u32 *cookie_addr;
61         struct pcie_service_card *card = adapter->card;
62
63         if (card->sleep_cookie) {
64                 cookie_addr = (u32 *)card->sleep_cookie->data;
65                 dev_dbg(adapter->dev, "info: ACCESS_HW: sleep cookie=0x%x\n",
66                         *cookie_addr);
67                 if (*cookie_addr == FW_AWAKE_COOKIE)
68                         return true;
69         }
70
71         return false;
72 }
73
74 /*
75  * This function probes an mwifiex device and registers it. It allocates
76  * the card structure, enables PCIE function number and initiates the
77  * device registration and initialization procedure by adding a logical
78  * interface.
79  */
80 static int mwifiex_pcie_probe(struct pci_dev *pdev,
81                                         const struct pci_device_id *ent)
82 {
83         struct pcie_service_card *card;
84
85         pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
86                  pdev->vendor, pdev->device, pdev->revision);
87
88         card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
89         if (!card)
90                 return -ENOMEM;
91
92         card->dev = pdev;
93
94         if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
95                              MWIFIEX_PCIE)) {
96                 pr_err("%s failed\n", __func__);
97                 kfree(card);
98                 return -1;
99         }
100
101         return 0;
102 }
103
104 /*
105  * This function removes the interface and frees up the card structure.
106  */
107 static void mwifiex_pcie_remove(struct pci_dev *pdev)
108 {
109         struct pcie_service_card *card;
110         struct mwifiex_adapter *adapter;
111         struct mwifiex_private *priv;
112         int i;
113
114         card = pci_get_drvdata(pdev);
115         if (!card)
116                 return;
117
118         adapter = card->adapter;
119         if (!adapter || !adapter->priv_num)
120                 return;
121
122         /* In case driver is removed when asynchronous FW load is in progress */
123         wait_for_completion(&adapter->fw_load);
124
125         if (user_rmmod) {
126 #ifdef CONFIG_PM
127                 if (adapter->is_suspended)
128                         mwifiex_pcie_resume(pdev);
129 #endif
130
131                 for (i = 0; i < adapter->priv_num; i++)
132                         if ((GET_BSS_ROLE(adapter->priv[i]) ==
133                              MWIFIEX_BSS_ROLE_STA) &&
134                             adapter->priv[i]->media_connected)
135                                 mwifiex_deauthenticate(adapter->priv[i], NULL);
136
137                 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
138
139                 mwifiex_disable_auto_ds(priv);
140
141                 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
142         }
143
144         mwifiex_remove_card(card->adapter, &add_remove_card_sem);
145         kfree(card);
146 }
147
148 /*
149  * Kernel needs to suspend all functions separately. Therefore all
150  * registered functions must have drivers with suspend and resume
151  * methods. Failing that the kernel simply removes the whole card.
152  *
153  * If already not suspended, this function allocates and sends a host
154  * sleep activate request to the firmware and turns off the traffic.
155  */
156 static int mwifiex_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
157 {
158         struct mwifiex_adapter *adapter;
159         struct pcie_service_card *card;
160         int hs_actived, i;
161
162         if (pdev) {
163                 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
164                 if (!card || !card->adapter) {
165                         pr_err("Card or adapter structure is not valid\n");
166                         return 0;
167                 }
168         } else {
169                 pr_err("PCIE device is not specified\n");
170                 return 0;
171         }
172
173         adapter = card->adapter;
174
175         hs_actived = mwifiex_enable_hs(adapter);
176
177         /* Indicate device suspended */
178         adapter->is_suspended = true;
179
180         for (i = 0; i < adapter->priv_num; i++)
181                 netif_carrier_off(adapter->priv[i]->netdev);
182
183         return 0;
184 }
185
186 /*
187  * Kernel needs to suspend all functions separately. Therefore all
188  * registered functions must have drivers with suspend and resume
189  * methods. Failing that the kernel simply removes the whole card.
190  *
191  * If already not resumed, this function turns on the traffic and
192  * sends a host sleep cancel request to the firmware.
193  */
194 static int mwifiex_pcie_resume(struct pci_dev *pdev)
195 {
196         struct mwifiex_adapter *adapter;
197         struct pcie_service_card *card;
198         int i;
199
200         if (pdev) {
201                 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
202                 if (!card || !card->adapter) {
203                         pr_err("Card or adapter structure is not valid\n");
204                         return 0;
205                 }
206         } else {
207                 pr_err("PCIE device is not specified\n");
208                 return 0;
209         }
210
211         adapter = card->adapter;
212
213         if (!adapter->is_suspended) {
214                 dev_warn(adapter->dev, "Device already resumed\n");
215                 return 0;
216         }
217
218         adapter->is_suspended = false;
219
220         for (i = 0; i < adapter->priv_num; i++)
221                 if (adapter->priv[i]->media_connected)
222                         netif_carrier_on(adapter->priv[i]->netdev);
223
224         mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
225                           MWIFIEX_ASYNC_CMD);
226
227         return 0;
228 }
229
230 #define PCIE_VENDOR_ID_MARVELL              (0x11ab)
231 #define PCIE_DEVICE_ID_MARVELL_88W8766P         (0x2b30)
232
233 static DEFINE_PCI_DEVICE_TABLE(mwifiex_ids) = {
234         {
235                 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
236                 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
237         },
238         {},
239 };
240
241 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
242
243 /* PCI Device Driver */
244 static struct pci_driver __refdata mwifiex_pcie = {
245         .name     = "mwifiex_pcie",
246         .id_table = mwifiex_ids,
247         .probe    = mwifiex_pcie_probe,
248         .remove   = mwifiex_pcie_remove,
249 #ifdef CONFIG_PM
250         /* Power Management Hooks */
251         .suspend  = mwifiex_pcie_suspend,
252         .resume   = mwifiex_pcie_resume,
253 #endif
254 };
255
256 /*
257  * This function writes data into PCIE card register.
258  */
259 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
260 {
261         struct pcie_service_card *card = adapter->card;
262
263         iowrite32(data, card->pci_mmap1 + reg);
264
265         return 0;
266 }
267
268 /*
269  * This function reads data from PCIE card register.
270  */
271 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
272 {
273         struct pcie_service_card *card = adapter->card;
274
275         *data = ioread32(card->pci_mmap1 + reg);
276
277         return 0;
278 }
279
280 /*
281  * This function wakes up the card.
282  *
283  * A host power up command is written to the card configuration
284  * register to wake up the card.
285  */
286 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
287 {
288         int i = 0;
289
290         while (mwifiex_pcie_ok_to_access_hw(adapter)) {
291                 i++;
292                 usleep_range(10, 20);
293                 /* 50ms max wait */
294                 if (i == 50000)
295                         break;
296         }
297
298         dev_dbg(adapter->dev, "event: Wakeup device...\n");
299
300         /* Enable interrupts or any chip access will wakeup device */
301         if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK, HOST_INTR_MASK)) {
302                 dev_warn(adapter->dev, "Enable host interrupt failed\n");
303                 return -1;
304         }
305
306         dev_dbg(adapter->dev, "PCIE wakeup: Setting PS_STATE_AWAKE\n");
307         adapter->ps_state = PS_STATE_AWAKE;
308
309         return 0;
310 }
311
312 /*
313  * This function is called after the card has woken up.
314  *
315  * The card configuration register is reset.
316  */
317 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
318 {
319         dev_dbg(adapter->dev, "cmd: Wakeup device completed\n");
320
321         return 0;
322 }
323
324 /*
325  * This function disables the host interrupt.
326  *
327  * The host interrupt mask is read, the disable bit is reset and
328  * written back to the card host interrupt mask register.
329  */
330 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
331 {
332         if (mwifiex_pcie_ok_to_access_hw(adapter)) {
333                 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
334                                       0x00000000)) {
335                         dev_warn(adapter->dev, "Disable host interrupt failed\n");
336                         return -1;
337                 }
338         }
339
340         return 0;
341 }
342
343 /*
344  * This function enables the host interrupt.
345  *
346  * The host interrupt enable mask is written to the card
347  * host interrupt mask register.
348  */
349 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
350 {
351         if (mwifiex_pcie_ok_to_access_hw(adapter)) {
352                 /* Simply write the mask to the register */
353                 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
354                                       HOST_INTR_MASK)) {
355                         dev_warn(adapter->dev, "Enable host interrupt failed\n");
356                         return -1;
357                 }
358         }
359
360         return 0;
361 }
362
363 /*
364  * This function creates buffer descriptor ring for TX
365  */
366 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
367 {
368         struct pcie_service_card *card = adapter->card;
369         struct sk_buff *skb;
370         int i;
371         phys_addr_t *buf_pa;
372
373         /*
374          * driver maintaines the write pointer and firmware maintaines the read
375          * pointer. The write pointer starts at 0 (zero) while the read pointer
376          * starts at zero with rollover bit set
377          */
378         card->txbd_wrptr = 0;
379         card->txbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
380
381         /* allocate shared memory for the BD ring and divide the same in to
382            several descriptors */
383         card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
384                                                         MWIFIEX_MAX_TXRX_BD;
385         dev_dbg(adapter->dev, "info: txbd_ring: Allocating %d bytes\n",
386                 card->txbd_ring_size);
387         card->txbd_ring_vbase = kzalloc(card->txbd_ring_size, GFP_KERNEL);
388         if (!card->txbd_ring_vbase) {
389                 dev_err(adapter->dev, "Unable to alloc buffer for txbd ring\n");
390                 return -ENOMEM;
391         }
392         card->txbd_ring_pbase = virt_to_phys(card->txbd_ring_vbase);
393
394         dev_dbg(adapter->dev,
395                 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
396                 card->txbd_ring_vbase, (u32)card->txbd_ring_pbase,
397                 (u32)((u64)card->txbd_ring_pbase >> 32), card->txbd_ring_size);
398
399         for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
400                 card->txbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
401                                      (card->txbd_ring_vbase +
402                                       (sizeof(struct mwifiex_pcie_buf_desc)
403                                        * i));
404
405                 /* Allocate buffer here so that firmware can DMA data from it */
406                 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
407                 if (!skb) {
408                         dev_err(adapter->dev, "Unable to allocate skb for TX ring.\n");
409                         kfree(card->txbd_ring_vbase);
410                         return -ENOMEM;
411                 }
412                 buf_pa = mwifiex_update_sk_buff_pa(skb);
413
414                 skb_put(skb, MWIFIEX_RX_DATA_BUF_SIZE);
415                 dev_dbg(adapter->dev, "info: TX ring: add new skb base: %p, "
416                         "buf_base: %p, buf_pbase: %#x:%x, buf_len: %#x\n",
417                         skb, skb->data, (u32)*buf_pa,
418                         (u32)(((u64)*buf_pa >> 32)), skb->len);
419
420                 card->tx_buf_list[i] = skb;
421                 card->txbd_ring[i]->paddr = *buf_pa;
422                 card->txbd_ring[i]->len = (u16)skb->len;
423                 card->txbd_ring[i]->flags = 0;
424         }
425
426         return 0;
427 }
428
429 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
430 {
431         struct pcie_service_card *card = adapter->card;
432         int i;
433
434         for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
435                 if (card->tx_buf_list[i])
436                         dev_kfree_skb_any(card->tx_buf_list[i]);
437                 card->tx_buf_list[i] = NULL;
438                 card->txbd_ring[i]->paddr = 0;
439                 card->txbd_ring[i]->len = 0;
440                 card->txbd_ring[i]->flags = 0;
441                 card->txbd_ring[i] = NULL;
442         }
443
444         kfree(card->txbd_ring_vbase);
445         card->txbd_ring_size = 0;
446         card->txbd_wrptr = 0;
447         card->txbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
448         card->txbd_ring_vbase = NULL;
449
450         return 0;
451 }
452
453 /*
454  * This function creates buffer descriptor ring for RX
455  */
456 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
457 {
458         struct pcie_service_card *card = adapter->card;
459         struct sk_buff *skb;
460         int i;
461         phys_addr_t *buf_pa;
462
463         /*
464          * driver maintaines the read pointer and firmware maintaines the write
465          * pointer. The write pointer starts at 0 (zero) while the read pointer
466          * starts at zero with rollover bit set
467          */
468         card->rxbd_wrptr = 0;
469         card->rxbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
470
471         card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
472                                                         MWIFIEX_MAX_TXRX_BD;
473         dev_dbg(adapter->dev, "info: rxbd_ring: Allocating %d bytes\n",
474                 card->rxbd_ring_size);
475         card->rxbd_ring_vbase = kzalloc(card->rxbd_ring_size, GFP_KERNEL);
476         if (!card->rxbd_ring_vbase) {
477                 dev_err(adapter->dev, "Unable to allocate buffer for "
478                                 "rxbd_ring.\n");
479                 return -ENOMEM;
480         }
481         card->rxbd_ring_pbase = virt_to_phys(card->rxbd_ring_vbase);
482
483         dev_dbg(adapter->dev,
484                 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
485                 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
486                 (u32)((u64)card->rxbd_ring_pbase >> 32),
487                 card->rxbd_ring_size);
488
489         for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
490                 card->rxbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
491                                      (card->rxbd_ring_vbase +
492                                       (sizeof(struct mwifiex_pcie_buf_desc)
493                                        * i));
494
495                 /* Allocate skb here so that firmware can DMA data from it */
496                 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
497                 if (!skb) {
498                         dev_err(adapter->dev,
499                                 "Unable to allocate skb for RX ring.\n");
500                         kfree(card->rxbd_ring_vbase);
501                         return -ENOMEM;
502                 }
503                 buf_pa = mwifiex_update_sk_buff_pa(skb);
504                 skb_put(skb, MWIFIEX_RX_DATA_BUF_SIZE);
505
506                 dev_dbg(adapter->dev, "info: RX ring: add new skb base: %p, "
507                         "buf_base: %p, buf_pbase: %#x:%x, buf_len: %#x\n",
508                         skb, skb->data, (u32)*buf_pa, (u32)((u64)*buf_pa >> 32),
509                         skb->len);
510
511                 card->rx_buf_list[i] = skb;
512                 card->rxbd_ring[i]->paddr = *buf_pa;
513                 card->rxbd_ring[i]->len = (u16)skb->len;
514                 card->rxbd_ring[i]->flags = 0;
515         }
516
517         return 0;
518 }
519
520 /*
521  * This function deletes Buffer descriptor ring for RX
522  */
523 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
524 {
525         struct pcie_service_card *card = adapter->card;
526         int i;
527
528         for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
529                 if (card->rx_buf_list[i])
530                         dev_kfree_skb_any(card->rx_buf_list[i]);
531                 card->rx_buf_list[i] = NULL;
532                 card->rxbd_ring[i]->paddr = 0;
533                 card->rxbd_ring[i]->len = 0;
534                 card->rxbd_ring[i]->flags = 0;
535                 card->rxbd_ring[i] = NULL;
536         }
537
538         kfree(card->rxbd_ring_vbase);
539         card->rxbd_ring_size = 0;
540         card->rxbd_wrptr = 0;
541         card->rxbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
542         card->rxbd_ring_vbase = NULL;
543
544         return 0;
545 }
546
547 /*
548  * This function creates buffer descriptor ring for Events
549  */
550 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
551 {
552         struct pcie_service_card *card = adapter->card;
553         struct sk_buff *skb;
554         int i;
555         phys_addr_t *buf_pa;
556
557         /*
558          * driver maintaines the read pointer and firmware maintaines the write
559          * pointer. The write pointer starts at 0 (zero) while the read pointer
560          * starts at zero with rollover bit set
561          */
562         card->evtbd_wrptr = 0;
563         card->evtbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
564
565         card->evtbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
566                                                         MWIFIEX_MAX_EVT_BD;
567         dev_dbg(adapter->dev, "info: evtbd_ring: Allocating %d bytes\n",
568                 card->evtbd_ring_size);
569         card->evtbd_ring_vbase = kzalloc(card->evtbd_ring_size, GFP_KERNEL);
570         if (!card->evtbd_ring_vbase) {
571                 dev_err(adapter->dev,
572                         "Unable to allocate buffer. Terminating download\n");
573                 return -ENOMEM;
574         }
575         card->evtbd_ring_pbase = virt_to_phys(card->evtbd_ring_vbase);
576
577         dev_dbg(adapter->dev,
578                 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
579                 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
580                 (u32)((u64)card->evtbd_ring_pbase >> 32),
581                 card->evtbd_ring_size);
582
583         for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
584                 card->evtbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
585                                       (card->evtbd_ring_vbase +
586                                        (sizeof(struct mwifiex_pcie_buf_desc)
587                                         * i));
588
589                 /* Allocate skb here so that firmware can DMA data from it */
590                 skb = dev_alloc_skb(MAX_EVENT_SIZE);
591                 if (!skb) {
592                         dev_err(adapter->dev,
593                                 "Unable to allocate skb for EVENT buf.\n");
594                         kfree(card->evtbd_ring_vbase);
595                         return -ENOMEM;
596                 }
597                 buf_pa = mwifiex_update_sk_buff_pa(skb);
598                 skb_put(skb, MAX_EVENT_SIZE);
599
600                 dev_dbg(adapter->dev, "info: Evt ring: add new skb. base: %p, "
601                         "buf_base: %p, buf_pbase: %#x:%x, buf_len: %#x\n",
602                         skb, skb->data, (u32)*buf_pa, (u32)((u64)*buf_pa >> 32),
603                         skb->len);
604
605                 card->evt_buf_list[i] = skb;
606                 card->evtbd_ring[i]->paddr = *buf_pa;
607                 card->evtbd_ring[i]->len = (u16)skb->len;
608                 card->evtbd_ring[i]->flags = 0;
609         }
610
611         return 0;
612 }
613
614 /*
615  * This function deletes Buffer descriptor ring for Events
616  */
617 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
618 {
619         struct pcie_service_card *card = adapter->card;
620         int i;
621
622         for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
623                 if (card->evt_buf_list[i])
624                         dev_kfree_skb_any(card->evt_buf_list[i]);
625                 card->evt_buf_list[i] = NULL;
626                 card->evtbd_ring[i]->paddr = 0;
627                 card->evtbd_ring[i]->len = 0;
628                 card->evtbd_ring[i]->flags = 0;
629                 card->evtbd_ring[i] = NULL;
630         }
631
632         kfree(card->evtbd_ring_vbase);
633         card->evtbd_wrptr = 0;
634         card->evtbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
635         card->evtbd_ring_size = 0;
636         card->evtbd_ring_vbase = NULL;
637
638         return 0;
639 }
640
641 /*
642  * This function allocates a buffer for CMDRSP
643  */
644 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
645 {
646         struct pcie_service_card *card = adapter->card;
647         struct sk_buff *skb;
648
649         /* Allocate memory for receiving command response data */
650         skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
651         if (!skb) {
652                 dev_err(adapter->dev,
653                         "Unable to allocate skb for command response data.\n");
654                 return -ENOMEM;
655         }
656         mwifiex_update_sk_buff_pa(skb);
657         skb_put(skb, MWIFIEX_UPLD_SIZE);
658         card->cmdrsp_buf = skb;
659
660         skb = NULL;
661         /* Allocate memory for sending command to firmware */
662         skb = dev_alloc_skb(MWIFIEX_SIZE_OF_CMD_BUFFER);
663         if (!skb) {
664                 dev_err(adapter->dev,
665                         "Unable to allocate skb for command data.\n");
666                 return -ENOMEM;
667         }
668         mwifiex_update_sk_buff_pa(skb);
669         skb_put(skb, MWIFIEX_SIZE_OF_CMD_BUFFER);
670         card->cmd_buf = skb;
671
672         return 0;
673 }
674
675 /*
676  * This function deletes a buffer for CMDRSP
677  */
678 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
679 {
680         struct pcie_service_card *card;
681
682         if (!adapter)
683                 return 0;
684
685         card = adapter->card;
686
687         if (card && card->cmdrsp_buf)
688                 dev_kfree_skb_any(card->cmdrsp_buf);
689
690         if (card && card->cmd_buf)
691                 dev_kfree_skb_any(card->cmd_buf);
692
693         return 0;
694 }
695
696 /*
697  * This function allocates a buffer for sleep cookie
698  */
699 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
700 {
701         struct sk_buff *skb;
702         struct pcie_service_card *card = adapter->card;
703
704         /* Allocate memory for sleep cookie */
705         skb = dev_alloc_skb(sizeof(u32));
706         if (!skb) {
707                 dev_err(adapter->dev,
708                         "Unable to allocate skb for sleep cookie!\n");
709                 return -ENOMEM;
710         }
711         mwifiex_update_sk_buff_pa(skb);
712         skb_put(skb, sizeof(u32));
713
714         /* Init val of Sleep Cookie */
715         *(u32 *)skb->data = FW_AWAKE_COOKIE;
716
717         dev_dbg(adapter->dev, "alloc_scook: sleep cookie=0x%x\n",
718                 *((u32 *)skb->data));
719
720         /* Save the sleep cookie */
721         card->sleep_cookie = skb;
722
723         return 0;
724 }
725
726 /*
727  * This function deletes buffer for sleep cookie
728  */
729 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
730 {
731         struct pcie_service_card *card;
732
733         if (!adapter)
734                 return 0;
735
736         card = adapter->card;
737
738         if (card && card->sleep_cookie) {
739                 dev_kfree_skb_any(card->sleep_cookie);
740                 card->sleep_cookie = NULL;
741         }
742
743         return 0;
744 }
745
746 /*
747  * This function sends data buffer to device
748  */
749 static int
750 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb)
751 {
752         struct pcie_service_card *card = adapter->card;
753         u32 wrindx, rdptr;
754         phys_addr_t *buf_pa;
755         __le16 *tmp;
756
757         if (!mwifiex_pcie_ok_to_access_hw(adapter))
758                 mwifiex_pm_wakeup_card(adapter);
759
760         /* Read the TX ring read pointer set by firmware */
761         if (mwifiex_read_reg(adapter, REG_TXBD_RDPTR, &rdptr)) {
762                 dev_err(adapter->dev,
763                         "SEND DATA: failed to read REG_TXBD_RDPTR\n");
764                 return -1;
765         }
766
767         wrindx = card->txbd_wrptr & MWIFIEX_TXBD_MASK;
768
769         dev_dbg(adapter->dev, "info: SEND DATA: <Rd: %#x, Wr: %#x>\n", rdptr,
770                 card->txbd_wrptr);
771         if (((card->txbd_wrptr & MWIFIEX_TXBD_MASK) !=
772                         (rdptr & MWIFIEX_TXBD_MASK)) ||
773             ((card->txbd_wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) !=
774                         (rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
775                 struct sk_buff *skb_data;
776                 u8 *payload;
777
778                 adapter->data_sent = true;
779                 skb_data = card->tx_buf_list[wrindx];
780                 memcpy(skb_data->data, skb->data, skb->len);
781                 payload = skb_data->data;
782                 tmp = (__le16 *)&payload[0];
783                 *tmp = cpu_to_le16((u16)skb->len);
784                 tmp = (__le16 *)&payload[2];
785                 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
786                 skb_put(skb_data, MWIFIEX_RX_DATA_BUF_SIZE - skb_data->len);
787                 skb_trim(skb_data, skb->len);
788                 buf_pa = MWIFIEX_SKB_PACB(skb_data);
789                 card->txbd_ring[wrindx]->paddr = *buf_pa;
790                 card->txbd_ring[wrindx]->len = (u16)skb_data->len;
791                 card->txbd_ring[wrindx]->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
792                                                 MWIFIEX_BD_FLAG_LAST_DESC;
793
794                 if ((++card->txbd_wrptr & MWIFIEX_TXBD_MASK) ==
795                                                         MWIFIEX_MAX_TXRX_BD)
796                         card->txbd_wrptr = ((card->txbd_wrptr &
797                                                 MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
798                                                 MWIFIEX_BD_FLAG_ROLLOVER_IND);
799
800                 /* Write the TX ring write pointer in to REG_TXBD_WRPTR */
801                 if (mwifiex_write_reg(adapter, REG_TXBD_WRPTR,
802                                       card->txbd_wrptr)) {
803                         dev_err(adapter->dev,
804                                 "SEND DATA: failed to write REG_TXBD_WRPTR\n");
805                         return 0;
806                 }
807
808                 /* Send the TX ready interrupt */
809                 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
810                                       CPU_INTR_DNLD_RDY)) {
811                         dev_err(adapter->dev,
812                                 "SEND DATA: failed to assert door-bell intr\n");
813                         return -1;
814                 }
815                 dev_dbg(adapter->dev, "info: SEND DATA: Updated <Rd: %#x, Wr: "
816                         "%#x> and sent packet to firmware successfully\n",
817                         rdptr, card->txbd_wrptr);
818         } else {
819                 dev_dbg(adapter->dev,
820                         "info: TX Ring full, can't send packets to fw\n");
821                 adapter->data_sent = true;
822                 /* Send the TX ready interrupt */
823                 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
824                                       CPU_INTR_DNLD_RDY))
825                         dev_err(adapter->dev,
826                                 "SEND DATA: failed to assert door-bell intr\n");
827                 return -EBUSY;
828         }
829
830         return 0;
831 }
832
833 /*
834  * This function handles received buffer ring and
835  * dispatches packets to upper
836  */
837 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
838 {
839         struct pcie_service_card *card = adapter->card;
840         u32 wrptr, rd_index;
841         int ret = 0;
842         struct sk_buff *skb_tmp = NULL;
843
844         /* Read the RX ring Write pointer set by firmware */
845         if (mwifiex_read_reg(adapter, REG_RXBD_WRPTR, &wrptr)) {
846                 dev_err(adapter->dev,
847                         "RECV DATA: failed to read REG_TXBD_RDPTR\n");
848                 ret = -1;
849                 goto done;
850         }
851
852         while (((wrptr & MWIFIEX_RXBD_MASK) !=
853                 (card->rxbd_rdptr & MWIFIEX_RXBD_MASK)) ||
854                ((wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) ==
855                 (card->rxbd_rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
856                 struct sk_buff *skb_data;
857                 u16 rx_len;
858
859                 rd_index = card->rxbd_rdptr & MWIFIEX_RXBD_MASK;
860                 skb_data = card->rx_buf_list[rd_index];
861
862                 /* Get data length from interface header -
863                    first byte is len, second byte is type */
864                 rx_len = *((u16 *)skb_data->data);
865                 dev_dbg(adapter->dev,
866                         "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
867                         card->rxbd_rdptr, wrptr, rx_len);
868                 skb_tmp = dev_alloc_skb(rx_len);
869                 if (!skb_tmp) {
870                         dev_dbg(adapter->dev,
871                                 "info: Failed to alloc skb for RX\n");
872                         ret = -EBUSY;
873                         goto done;
874                 }
875
876                 skb_put(skb_tmp, rx_len);
877
878                 memcpy(skb_tmp->data, skb_data->data + INTF_HEADER_LEN, rx_len);
879                 if ((++card->rxbd_rdptr & MWIFIEX_RXBD_MASK) ==
880                                                         MWIFIEX_MAX_TXRX_BD) {
881                         card->rxbd_rdptr = ((card->rxbd_rdptr &
882                                              MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
883                                             MWIFIEX_BD_FLAG_ROLLOVER_IND);
884                 }
885                 dev_dbg(adapter->dev, "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
886                         card->rxbd_rdptr, wrptr);
887
888                 /* Write the RX ring read pointer in to REG_RXBD_RDPTR */
889                 if (mwifiex_write_reg(adapter, REG_RXBD_RDPTR,
890                                       card->rxbd_rdptr)) {
891                         dev_err(adapter->dev,
892                                 "RECV DATA: failed to write REG_RXBD_RDPTR\n");
893                         ret = -1;
894                         goto done;
895                 }
896
897                 /* Read the RX ring Write pointer set by firmware */
898                 if (mwifiex_read_reg(adapter, REG_RXBD_WRPTR, &wrptr)) {
899                         dev_err(adapter->dev,
900                                 "RECV DATA: failed to read REG_TXBD_RDPTR\n");
901                         ret = -1;
902                         goto done;
903                 }
904                 dev_dbg(adapter->dev,
905                         "info: RECV DATA: Rcvd packet from fw successfully\n");
906                 mwifiex_handle_rx_packet(adapter, skb_tmp);
907         }
908
909 done:
910         if (ret && skb_tmp)
911                 dev_kfree_skb_any(skb_tmp);
912         return ret;
913 }
914
915 /*
916  * This function downloads the boot command to device
917  */
918 static int
919 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
920 {
921         phys_addr_t *buf_pa = MWIFIEX_SKB_PACB(skb);
922
923         if (!(skb->data && skb->len && *buf_pa)) {
924                 dev_err(adapter->dev,
925                         "Invalid parameter in %s <%p, %#x:%x, %x>\n",
926                         __func__, skb->data, skb->len,
927                         (u32)*buf_pa, (u32)((u64)*buf_pa >> 32));
928                 return -1;
929         }
930
931         /* Write the lower 32bits of the physical address to scratch
932          * register 0 */
933         if (mwifiex_write_reg(adapter, PCIE_SCRATCH_0_REG, (u32)*buf_pa)) {
934                 dev_err(adapter->dev,
935                         "%s: failed to write download command to boot code.\n",
936                         __func__);
937                 return -1;
938         }
939
940         /* Write the upper 32bits of the physical address to scratch
941          * register 1 */
942         if (mwifiex_write_reg(adapter, PCIE_SCRATCH_1_REG,
943                               (u32)((u64)*buf_pa >> 32))) {
944                 dev_err(adapter->dev,
945                         "%s: failed to write download command to boot code.\n",
946                         __func__);
947                 return -1;
948         }
949
950         /* Write the command length to scratch register 2 */
951         if (mwifiex_write_reg(adapter, PCIE_SCRATCH_2_REG, skb->len)) {
952                 dev_err(adapter->dev,
953                         "%s: failed to write command len to scratch reg 2\n",
954                         __func__);
955                 return -1;
956         }
957
958         /* Ring the door bell */
959         if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
960                               CPU_INTR_DOOR_BELL)) {
961                 dev_err(adapter->dev,
962                         "%s: failed to assert door-bell intr\n", __func__);
963                 return -1;
964         }
965
966         return 0;
967 }
968
969 /*
970  * This function downloads commands to the device
971  */
972 static int
973 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
974 {
975         struct pcie_service_card *card = adapter->card;
976         int ret = 0;
977         phys_addr_t *cmd_buf_pa;
978         phys_addr_t *cmdrsp_buf_pa;
979
980         if (!(skb->data && skb->len)) {
981                 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
982                         __func__, skb->data, skb->len);
983                 return -1;
984         }
985
986         /* Make sure a command response buffer is available */
987         if (!card->cmdrsp_buf) {
988                 dev_err(adapter->dev,
989                         "No response buffer available, send command failed\n");
990                 return -EBUSY;
991         }
992
993         /* Make sure a command buffer is available */
994         if (!card->cmd_buf) {
995                 dev_err(adapter->dev, "Command buffer not available\n");
996                 return -EBUSY;
997         }
998
999         adapter->cmd_sent = true;
1000         /* Copy the given skb in to DMA accessable shared buffer */
1001         skb_put(card->cmd_buf, MWIFIEX_SIZE_OF_CMD_BUFFER - card->cmd_buf->len);
1002         skb_trim(card->cmd_buf, skb->len);
1003         memcpy(card->cmd_buf->data, skb->data, skb->len);
1004
1005         /* To send a command, the driver will:
1006                 1. Write the 64bit physical address of the data buffer to
1007                    SCRATCH1 + SCRATCH0
1008                 2. Ring the door bell (i.e. set the door bell interrupt)
1009
1010                 In response to door bell interrupt, the firmware will perform
1011                 the DMA of the command packet (first header to obtain the total
1012                 length and then rest of the command).
1013         */
1014
1015         if (card->cmdrsp_buf) {
1016                 cmdrsp_buf_pa = MWIFIEX_SKB_PACB(card->cmdrsp_buf);
1017                 /* Write the lower 32bits of the cmdrsp buffer physical
1018                    address */
1019                 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_LO,
1020                                       (u32)*cmdrsp_buf_pa)) {
1021                         dev_err(adapter->dev,
1022                                 "Failed to write download cmd to boot code.\n");
1023                         ret = -1;
1024                         goto done;
1025                 }
1026                 /* Write the upper 32bits of the cmdrsp buffer physical
1027                    address */
1028                 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_HI,
1029                                       (u32)((u64)*cmdrsp_buf_pa >> 32))) {
1030                         dev_err(adapter->dev,
1031                                 "Failed to write download cmd to boot code.\n");
1032                         ret = -1;
1033                         goto done;
1034                 }
1035         }
1036
1037         cmd_buf_pa = MWIFIEX_SKB_PACB(card->cmd_buf);
1038         /* Write the lower 32bits of the physical address to REG_CMD_ADDR_LO */
1039         if (mwifiex_write_reg(adapter, REG_CMD_ADDR_LO, (u32)*cmd_buf_pa)) {
1040                 dev_err(adapter->dev,
1041                         "Failed to write download cmd to boot code.\n");
1042                 ret = -1;
1043                 goto done;
1044         }
1045         /* Write the upper 32bits of the physical address to REG_CMD_ADDR_HI */
1046         if (mwifiex_write_reg(adapter, REG_CMD_ADDR_HI,
1047                               (u32)((u64)*cmd_buf_pa >> 32))) {
1048                 dev_err(adapter->dev,
1049                         "Failed to write download cmd to boot code.\n");
1050                 ret = -1;
1051                 goto done;
1052         }
1053
1054         /* Write the command length to REG_CMD_SIZE */
1055         if (mwifiex_write_reg(adapter, REG_CMD_SIZE, card->cmd_buf->len)) {
1056                 dev_err(adapter->dev,
1057                         "Failed to write cmd len to REG_CMD_SIZE\n");
1058                 ret = -1;
1059                 goto done;
1060         }
1061
1062         /* Ring the door bell */
1063         if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1064                               CPU_INTR_DOOR_BELL)) {
1065                 dev_err(adapter->dev,
1066                         "Failed to assert door-bell intr\n");
1067                 ret = -1;
1068                 goto done;
1069         }
1070
1071 done:
1072         if (ret)
1073                 adapter->cmd_sent = false;
1074
1075         return 0;
1076 }
1077
1078 /*
1079  * This function handles command complete interrupt
1080  */
1081 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1082 {
1083         struct pcie_service_card *card = adapter->card;
1084         struct sk_buff *skb = card->cmdrsp_buf;
1085         int count = 0;
1086
1087         dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1088
1089         if (!adapter->curr_cmd) {
1090                 skb_pull(skb, INTF_HEADER_LEN);
1091                 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1092                         mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1093                                                            skb->len);
1094                         while (mwifiex_pcie_ok_to_access_hw(adapter) &&
1095                                                         (count++ < 10))
1096                                 usleep_range(50, 60);
1097                 } else {
1098                         dev_err(adapter->dev,
1099                                 "There is no command but got cmdrsp\n");
1100                 }
1101                 memcpy(adapter->upld_buf, skb->data,
1102                        min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1103                 skb_push(skb, INTF_HEADER_LEN);
1104         } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1105                 skb_pull(skb, INTF_HEADER_LEN);
1106                 adapter->curr_cmd->resp_skb = skb;
1107                 adapter->cmd_resp_received = true;
1108                 /* Take the pointer and set it to CMD node and will
1109                    return in the response complete callback */
1110                 card->cmdrsp_buf = NULL;
1111
1112                 /* Clear the cmd-rsp buffer address in scratch registers. This
1113                    will prevent firmware from writing to the same response
1114                    buffer again. */
1115                 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_LO, 0)) {
1116                         dev_err(adapter->dev,
1117                                 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1118                         return -1;
1119                 }
1120                 /* Write the upper 32bits of the cmdrsp buffer physical
1121                    address */
1122                 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_HI, 0)) {
1123                         dev_err(adapter->dev,
1124                                 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1125                         return -1;
1126                 }
1127         }
1128
1129         return 0;
1130 }
1131
1132 /*
1133  * Command Response processing complete handler
1134  */
1135 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1136                                         struct sk_buff *skb)
1137 {
1138         struct pcie_service_card *card = adapter->card;
1139
1140         if (skb) {
1141                 card->cmdrsp_buf = skb;
1142                 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1143         }
1144
1145         return 0;
1146 }
1147
1148 /*
1149  * This function handles firmware event ready interrupt
1150  */
1151 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1152 {
1153         struct pcie_service_card *card = adapter->card;
1154         u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1155         u32 wrptr, event;
1156
1157         if (adapter->event_received) {
1158                 dev_dbg(adapter->dev, "info: Event being processed, "
1159                         "do not process this interrupt just yet\n");
1160                 return 0;
1161         }
1162
1163         if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1164                 dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
1165                 return -1;
1166         }
1167
1168         /* Read the event ring write pointer set by firmware */
1169         if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
1170                 dev_err(adapter->dev,
1171                         "EventReady: failed to read REG_EVTBD_WRPTR\n");
1172                 return -1;
1173         }
1174
1175         dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1176                 card->evtbd_rdptr, wrptr);
1177         if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1178                                               & MWIFIEX_EVTBD_MASK)) ||
1179             ((wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) ==
1180              (card->evtbd_rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
1181                 struct sk_buff *skb_cmd;
1182                 __le16 data_len = 0;
1183                 u16 evt_len;
1184
1185                 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1186                 skb_cmd = card->evt_buf_list[rdptr];
1187                 /* Take the pointer and set it to event pointer in adapter
1188                    and will return back after event handling callback */
1189                 card->evt_buf_list[rdptr] = NULL;
1190                 card->evtbd_ring[rdptr]->paddr = 0;
1191                 card->evtbd_ring[rdptr]->len = 0;
1192                 card->evtbd_ring[rdptr]->flags = 0;
1193
1194                 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1195                 adapter->event_cause = event;
1196                 /* The first 4bytes will be the event transfer header
1197                    len is 2 bytes followed by type which is 2 bytes */
1198                 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1199                 evt_len = le16_to_cpu(data_len);
1200
1201                 skb_pull(skb_cmd, INTF_HEADER_LEN);
1202                 dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
1203
1204                 if ((evt_len > 0) && (evt_len  < MAX_EVENT_SIZE))
1205                         memcpy(adapter->event_body, skb_cmd->data +
1206                                MWIFIEX_EVENT_HEADER_LEN, evt_len -
1207                                MWIFIEX_EVENT_HEADER_LEN);
1208
1209                 adapter->event_received = true;
1210                 adapter->event_skb = skb_cmd;
1211
1212                 /* Do not update the event read pointer here, wait till the
1213                    buffer is released. This is just to make things simpler,
1214                    we need to find a better method of managing these buffers.
1215                 */
1216         }
1217
1218         return 0;
1219 }
1220
1221 /*
1222  * Event processing complete handler
1223  */
1224 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1225                                        struct sk_buff *skb)
1226 {
1227         struct pcie_service_card *card = adapter->card;
1228         int ret = 0;
1229         u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1230         u32 wrptr;
1231         phys_addr_t *buf_pa;
1232
1233         if (!skb)
1234                 return 0;
1235
1236         if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1237                 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
1238                         rdptr);
1239                 return -EINVAL;
1240         }
1241
1242         /* Read the event ring write pointer set by firmware */
1243         if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
1244                 dev_err(adapter->dev,
1245                         "event_complete: failed to read REG_EVTBD_WRPTR\n");
1246                 return -1;
1247         }
1248
1249         if (!card->evt_buf_list[rdptr]) {
1250                 skb_push(skb, INTF_HEADER_LEN);
1251                 card->evt_buf_list[rdptr] = skb;
1252                 buf_pa = MWIFIEX_SKB_PACB(skb);
1253                 card->evtbd_ring[rdptr]->paddr = *buf_pa;
1254                 card->evtbd_ring[rdptr]->len = (u16)skb->len;
1255                 card->evtbd_ring[rdptr]->flags = 0;
1256                 skb = NULL;
1257         } else {
1258                 dev_dbg(adapter->dev,
1259                         "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1260                         rdptr, card->evt_buf_list[rdptr], skb);
1261         }
1262
1263         if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1264                 card->evtbd_rdptr = ((card->evtbd_rdptr &
1265                                         MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
1266                                         MWIFIEX_BD_FLAG_ROLLOVER_IND);
1267         }
1268
1269         dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1270                 card->evtbd_rdptr, wrptr);
1271
1272         /* Write the event ring read pointer in to REG_EVTBD_RDPTR */
1273         if (mwifiex_write_reg(adapter, REG_EVTBD_RDPTR, card->evtbd_rdptr)) {
1274                 dev_err(adapter->dev,
1275                         "event_complete: failed to read REG_EVTBD_RDPTR\n");
1276                 return -1;
1277         }
1278
1279         dev_dbg(adapter->dev, "info: Check Events Again\n");
1280         ret = mwifiex_pcie_process_event_ready(adapter);
1281
1282         return ret;
1283 }
1284
1285 /*
1286  * This function downloads the firmware to the card.
1287  *
1288  * Firmware is downloaded to the card in blocks. Every block download
1289  * is tested for CRC errors, and retried a number of times before
1290  * returning failure.
1291  */
1292 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1293                                     struct mwifiex_fw_image *fw)
1294 {
1295         int ret;
1296         u8 *firmware = fw->fw_buf;
1297         u32 firmware_len = fw->fw_len;
1298         u32 offset = 0;
1299         struct sk_buff *skb;
1300         u32 txlen, tx_blocks = 0, tries, len;
1301         u32 block_retry_cnt = 0;
1302
1303         if (!adapter) {
1304                 pr_err("adapter structure is not valid\n");
1305                 return -1;
1306         }
1307
1308         if (!firmware || !firmware_len) {
1309                 dev_err(adapter->dev,
1310                         "No firmware image found! Terminating download\n");
1311                 return -1;
1312         }
1313
1314         dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
1315                 firmware_len);
1316
1317         if (mwifiex_pcie_disable_host_int(adapter)) {
1318                 dev_err(adapter->dev,
1319                         "%s: Disabling interrupts failed.\n", __func__);
1320                 return -1;
1321         }
1322
1323         skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1324         if (!skb) {
1325                 ret = -ENOMEM;
1326                 goto done;
1327         }
1328         mwifiex_update_sk_buff_pa(skb);
1329
1330         /* Perform firmware data transfer */
1331         do {
1332                 u32 ireg_intr = 0;
1333
1334                 /* More data? */
1335                 if (offset >= firmware_len)
1336                         break;
1337
1338                 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1339                         ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_2_REG,
1340                                                &len);
1341                         if (ret) {
1342                                 dev_warn(adapter->dev,
1343                                          "Failed reading len from boot code\n");
1344                                 goto done;
1345                         }
1346                         if (len)
1347                                 break;
1348                         usleep_range(10, 20);
1349                 }
1350
1351                 if (!len) {
1352                         break;
1353                 } else if (len > MWIFIEX_UPLD_SIZE) {
1354                         pr_err("FW download failure @ %d, invalid length %d\n",
1355                                offset, len);
1356                         ret = -1;
1357                         goto done;
1358                 }
1359
1360                 txlen = len;
1361
1362                 if (len & BIT(0)) {
1363                         block_retry_cnt++;
1364                         if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1365                                 pr_err("FW download failure @ %d, over max "
1366                                        "retry count\n", offset);
1367                                 ret = -1;
1368                                 goto done;
1369                         }
1370                         dev_err(adapter->dev, "FW CRC error indicated by the "
1371                                 "helper: len = 0x%04X, txlen = %d\n",
1372                                 len, txlen);
1373                         len &= ~BIT(0);
1374                         /* Setting this to 0 to resend from same offset */
1375                         txlen = 0;
1376                 } else {
1377                         block_retry_cnt = 0;
1378                         /* Set blocksize to transfer - checking for
1379                            last block */
1380                         if (firmware_len - offset < txlen)
1381                                 txlen = firmware_len - offset;
1382
1383                         dev_dbg(adapter->dev, ".");
1384
1385                         tx_blocks = (txlen +
1386                                      MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD - 1) /
1387                                      MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD;
1388
1389                         /* Copy payload to buffer */
1390                         memmove(skb->data, &firmware[offset], txlen);
1391                 }
1392
1393                 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1394                 skb_trim(skb, tx_blocks * MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD);
1395
1396                 /* Send the boot command to device */
1397                 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
1398                         dev_err(adapter->dev,
1399                                 "Failed to send firmware download command\n");
1400                         ret = -1;
1401                         goto done;
1402                 }
1403                 /* Wait for the command done interrupt */
1404                 do {
1405                         if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1406                                              &ireg_intr)) {
1407                                 dev_err(adapter->dev, "%s: Failed to read "
1408                                         "interrupt status during fw dnld.\n",
1409                                         __func__);
1410                                 ret = -1;
1411                                 goto done;
1412                         }
1413                 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1414                          CPU_INTR_DOOR_BELL);
1415                 offset += txlen;
1416         } while (true);
1417
1418         dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
1419                 offset);
1420
1421         ret = 0;
1422
1423 done:
1424         dev_kfree_skb_any(skb);
1425         return ret;
1426 }
1427
1428 /*
1429  * This function checks the firmware status in card.
1430  *
1431  * The winner interface is also determined by this function.
1432  */
1433 static int
1434 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
1435 {
1436         int ret = 0;
1437         u32 firmware_stat, winner_status;
1438         u32 tries;
1439
1440         /* Mask spurios interrupts */
1441         if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
1442                               HOST_INTR_MASK)) {
1443                 dev_warn(adapter->dev, "Write register failed\n");
1444                 return -1;
1445         }
1446
1447         dev_dbg(adapter->dev, "Setting driver ready signature\n");
1448         if (mwifiex_write_reg(adapter, REG_DRV_READY, FIRMWARE_READY_PCIE)) {
1449                 dev_err(adapter->dev,
1450                         "Failed to write driver ready signature\n");
1451                 return -1;
1452         }
1453
1454         /* Wait for firmware initialization event */
1455         for (tries = 0; tries < poll_num; tries++) {
1456                 if (mwifiex_read_reg(adapter, PCIE_SCRATCH_3_REG,
1457                                      &firmware_stat))
1458                         ret = -1;
1459                 else
1460                         ret = 0;
1461                 if (ret)
1462                         continue;
1463                 if (firmware_stat == FIRMWARE_READY_PCIE) {
1464                         ret = 0;
1465                         break;
1466                 } else {
1467                         mdelay(100);
1468                         ret = -1;
1469                 }
1470         }
1471
1472         if (ret) {
1473                 if (mwifiex_read_reg(adapter, PCIE_SCRATCH_3_REG,
1474                                      &winner_status))
1475                         ret = -1;
1476                 else if (!winner_status) {
1477                         dev_err(adapter->dev, "PCI-E is the winner\n");
1478                         adapter->winner = 1;
1479                         ret = -1;
1480                 } else {
1481                         dev_err(adapter->dev,
1482                                 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
1483                                 ret, adapter->winner);
1484                         ret = 0;
1485                 }
1486         }
1487
1488         return ret;
1489 }
1490
1491 /*
1492  * This function reads the interrupt status from card.
1493  */
1494 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
1495 {
1496         u32 pcie_ireg;
1497         unsigned long flags;
1498
1499         if (!mwifiex_pcie_ok_to_access_hw(adapter))
1500                 return;
1501
1502         if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
1503                 dev_warn(adapter->dev, "Read register failed\n");
1504                 return;
1505         }
1506
1507         if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1508
1509                 mwifiex_pcie_disable_host_int(adapter);
1510
1511                 /* Clear the pending interrupts */
1512                 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
1513                                       ~pcie_ireg)) {
1514                         dev_warn(adapter->dev, "Write register failed\n");
1515                         return;
1516                 }
1517                 spin_lock_irqsave(&adapter->int_lock, flags);
1518                 adapter->int_status |= pcie_ireg;
1519                 spin_unlock_irqrestore(&adapter->int_lock, flags);
1520
1521                 if (pcie_ireg & HOST_INTR_CMD_DONE) {
1522                         if ((adapter->ps_state == PS_STATE_SLEEP_CFM) ||
1523                             (adapter->ps_state == PS_STATE_SLEEP)) {
1524                                 mwifiex_pcie_enable_host_int(adapter);
1525                                 if (mwifiex_write_reg(adapter,
1526                                                       PCIE_CPU_INT_EVENT,
1527                                                       CPU_INTR_SLEEP_CFM_DONE)
1528                                                       ) {
1529                                         dev_warn(adapter->dev,
1530                                                  "Write register failed\n");
1531                                         return;
1532
1533                                 }
1534                         }
1535                 } else if (!adapter->pps_uapsd_mode &&
1536                            adapter->ps_state == PS_STATE_SLEEP) {
1537                                 /* Potentially for PCIe we could get other
1538                                  * interrupts like shared. Don't change power
1539                                  * state until cookie is set */
1540                                 if (mwifiex_pcie_ok_to_access_hw(adapter))
1541                                         adapter->ps_state = PS_STATE_AWAKE;
1542                 }
1543         }
1544 }
1545
1546 /*
1547  * Interrupt handler for PCIe root port
1548  *
1549  * This function reads the interrupt status from firmware and assigns
1550  * the main process in workqueue which will handle the interrupt.
1551  */
1552 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
1553 {
1554         struct pci_dev *pdev = (struct pci_dev *)context;
1555         struct pcie_service_card *card;
1556         struct mwifiex_adapter *adapter;
1557
1558         if (!pdev) {
1559                 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
1560                 goto exit;
1561         }
1562
1563         card = (struct pcie_service_card *) pci_get_drvdata(pdev);
1564         if (!card || !card->adapter) {
1565                 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
1566                          card ? card->adapter : NULL);
1567                 goto exit;
1568         }
1569         adapter = card->adapter;
1570
1571         if (adapter->surprise_removed)
1572                 goto exit;
1573
1574         mwifiex_interrupt_status(adapter);
1575         queue_work(adapter->workqueue, &adapter->main_work);
1576
1577 exit:
1578         return IRQ_HANDLED;
1579 }
1580
1581 /*
1582  * This function checks the current interrupt status.
1583  *
1584  * The following interrupts are checked and handled by this function -
1585  *      - Data sent
1586  *      - Command sent
1587  *      - Command received
1588  *      - Packets received
1589  *      - Events received
1590  *
1591  * In case of Rx packets received, the packets are uploaded from card to
1592  * host and processed accordingly.
1593  */
1594 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1595 {
1596         int ret;
1597         u32 pcie_ireg = 0;
1598         unsigned long flags;
1599
1600         spin_lock_irqsave(&adapter->int_lock, flags);
1601         /* Clear out unused interrupts */
1602         adapter->int_status &= HOST_INTR_MASK;
1603         spin_unlock_irqrestore(&adapter->int_lock, flags);
1604
1605         while (adapter->int_status & HOST_INTR_MASK) {
1606                 if (adapter->int_status & HOST_INTR_DNLD_DONE) {
1607                         adapter->int_status &= ~HOST_INTR_DNLD_DONE;
1608                         if (adapter->data_sent) {
1609                                 dev_dbg(adapter->dev, "info: DATA sent intr\n");
1610                                 adapter->data_sent = false;
1611                         }
1612                 }
1613                 if (adapter->int_status & HOST_INTR_UPLD_RDY) {
1614                         adapter->int_status &= ~HOST_INTR_UPLD_RDY;
1615                         dev_dbg(adapter->dev, "info: Rx DATA\n");
1616                         ret = mwifiex_pcie_process_recv_data(adapter);
1617                         if (ret)
1618                                 return ret;
1619                 }
1620                 if (adapter->int_status & HOST_INTR_EVENT_RDY) {
1621                         adapter->int_status &= ~HOST_INTR_EVENT_RDY;
1622                         dev_dbg(adapter->dev, "info: Rx EVENT\n");
1623                         ret = mwifiex_pcie_process_event_ready(adapter);
1624                         if (ret)
1625                                 return ret;
1626                 }
1627
1628                 if (adapter->int_status & HOST_INTR_CMD_DONE) {
1629                         adapter->int_status &= ~HOST_INTR_CMD_DONE;
1630                         if (adapter->cmd_sent) {
1631                                 dev_dbg(adapter->dev,
1632                                         "info: CMD sent Interrupt\n");
1633                                 adapter->cmd_sent = false;
1634                         }
1635                         /* Handle command response */
1636                         ret = mwifiex_pcie_process_cmd_complete(adapter);
1637                         if (ret)
1638                                 return ret;
1639                 }
1640
1641                 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1642                         if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
1643                                              &pcie_ireg)) {
1644                                 dev_warn(adapter->dev,
1645                                          "Read register failed\n");
1646                                 return -1;
1647                         }
1648
1649                         if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1650                                 if (mwifiex_write_reg(adapter,
1651                                                       PCIE_HOST_INT_STATUS,
1652                                                       ~pcie_ireg)) {
1653                                         dev_warn(adapter->dev,
1654                                                  "Write register failed\n");
1655                                         return -1;
1656                                 }
1657                                 adapter->int_status |= pcie_ireg;
1658                                 adapter->int_status &= HOST_INTR_MASK;
1659                         }
1660
1661                 }
1662         }
1663         dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
1664                 adapter->cmd_sent, adapter->data_sent);
1665         mwifiex_pcie_enable_host_int(adapter);
1666
1667         return 0;
1668 }
1669
1670 /*
1671  * This function downloads data from driver to card.
1672  *
1673  * Both commands and data packets are transferred to the card by this
1674  * function.
1675  *
1676  * This function adds the PCIE specific header to the front of the buffer
1677  * before transferring. The header contains the length of the packet and
1678  * the type. The firmware handles the packets based upon this set type.
1679  */
1680 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
1681                                      struct sk_buff *skb,
1682                                      struct mwifiex_tx_param *tx_param)
1683 {
1684         if (!skb) {
1685                 dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
1686                 return -1;
1687         }
1688
1689         if (type == MWIFIEX_TYPE_DATA)
1690                 return mwifiex_pcie_send_data(adapter, skb);
1691         else if (type == MWIFIEX_TYPE_CMD)
1692                 return mwifiex_pcie_send_cmd(adapter, skb);
1693
1694         return 0;
1695 }
1696
1697 /*
1698  * This function initializes the PCI-E host memory space, WCB rings, etc.
1699  *
1700  * The following initializations steps are followed -
1701  *      - Allocate TXBD ring buffers
1702  *      - Allocate RXBD ring buffers
1703  *      - Allocate event BD ring buffers
1704  *      - Allocate command response ring buffer
1705  *      - Allocate sleep cookie buffer
1706  */
1707 static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
1708 {
1709         struct pcie_service_card *card = adapter->card;
1710         int ret;
1711         struct pci_dev *pdev = card->dev;
1712
1713         pci_set_drvdata(pdev, card);
1714
1715         ret = pci_enable_device(pdev);
1716         if (ret)
1717                 goto err_enable_dev;
1718
1719         pci_set_master(pdev);
1720
1721         dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
1722         ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
1723         if (ret) {
1724                 dev_err(adapter->dev, "set_dma_mask(32) failed\n");
1725                 goto err_set_dma_mask;
1726         }
1727
1728         ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
1729         if (ret) {
1730                 dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
1731                 goto err_set_dma_mask;
1732         }
1733
1734         ret = pci_request_region(pdev, 0, DRV_NAME);
1735         if (ret) {
1736                 dev_err(adapter->dev, "req_reg(0) error\n");
1737                 goto err_req_region0;
1738         }
1739         card->pci_mmap = pci_iomap(pdev, 0, 0);
1740         if (!card->pci_mmap) {
1741                 dev_err(adapter->dev, "iomap(0) error\n");
1742                 goto err_iomap0;
1743         }
1744         ret = pci_request_region(pdev, 2, DRV_NAME);
1745         if (ret) {
1746                 dev_err(adapter->dev, "req_reg(2) error\n");
1747                 goto err_req_region2;
1748         }
1749         card->pci_mmap1 = pci_iomap(pdev, 2, 0);
1750         if (!card->pci_mmap1) {
1751                 dev_err(adapter->dev, "iomap(2) error\n");
1752                 goto err_iomap2;
1753         }
1754
1755         dev_dbg(adapter->dev,
1756                 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
1757                 card->pci_mmap, card->pci_mmap1);
1758
1759         card->cmdrsp_buf = NULL;
1760         ret = mwifiex_pcie_create_txbd_ring(adapter);
1761         if (ret)
1762                 goto err_cre_txbd;
1763         ret = mwifiex_pcie_create_rxbd_ring(adapter);
1764         if (ret)
1765                 goto err_cre_rxbd;
1766         ret = mwifiex_pcie_create_evtbd_ring(adapter);
1767         if (ret)
1768                 goto err_cre_evtbd;
1769         ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
1770         if (ret)
1771                 goto err_alloc_cmdbuf;
1772         ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
1773         if (ret)
1774                 goto err_alloc_cookie;
1775
1776         return ret;
1777
1778 err_alloc_cookie:
1779         mwifiex_pcie_delete_cmdrsp_buf(adapter);
1780 err_alloc_cmdbuf:
1781         mwifiex_pcie_delete_evtbd_ring(adapter);
1782 err_cre_evtbd:
1783         mwifiex_pcie_delete_rxbd_ring(adapter);
1784 err_cre_rxbd:
1785         mwifiex_pcie_delete_txbd_ring(adapter);
1786 err_cre_txbd:
1787         pci_iounmap(pdev, card->pci_mmap1);
1788 err_iomap2:
1789         pci_release_region(pdev, 2);
1790 err_req_region2:
1791         pci_iounmap(pdev, card->pci_mmap);
1792 err_iomap0:
1793         pci_release_region(pdev, 0);
1794 err_req_region0:
1795 err_set_dma_mask:
1796         pci_disable_device(pdev);
1797 err_enable_dev:
1798         pci_set_drvdata(pdev, NULL);
1799         return ret;
1800 }
1801
1802 /*
1803  * This function cleans up the allocated card buffers.
1804  *
1805  * The following are freed by this function -
1806  *      - TXBD ring buffers
1807  *      - RXBD ring buffers
1808  *      - Event BD ring buffers
1809  *      - Command response ring buffer
1810  *      - Sleep cookie buffer
1811  */
1812 static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
1813 {
1814         struct pcie_service_card *card = adapter->card;
1815         struct pci_dev *pdev = card->dev;
1816
1817         mwifiex_pcie_delete_sleep_cookie_buf(adapter);
1818         mwifiex_pcie_delete_cmdrsp_buf(adapter);
1819         mwifiex_pcie_delete_evtbd_ring(adapter);
1820         mwifiex_pcie_delete_rxbd_ring(adapter);
1821         mwifiex_pcie_delete_txbd_ring(adapter);
1822         card->cmdrsp_buf = NULL;
1823
1824         dev_dbg(adapter->dev, "Clearing driver ready signature\n");
1825         if (user_rmmod) {
1826                 if (mwifiex_write_reg(adapter, REG_DRV_READY, 0x00000000))
1827                         dev_err(adapter->dev,
1828                                 "Failed to write driver not-ready signature\n");
1829         }
1830
1831         if (pdev) {
1832                 pci_iounmap(pdev, card->pci_mmap);
1833                 pci_iounmap(pdev, card->pci_mmap1);
1834
1835                 pci_release_regions(pdev);
1836                 pci_disable_device(pdev);
1837                 pci_set_drvdata(pdev, NULL);
1838         }
1839 }
1840
1841 /*
1842  * This function registers the PCIE device.
1843  *
1844  * PCIE IRQ is claimed, block size is set and driver data is initialized.
1845  */
1846 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
1847 {
1848         int ret;
1849         struct pcie_service_card *card = adapter->card;
1850         struct pci_dev *pdev = card->dev;
1851
1852         /* save adapter pointer in card */
1853         card->adapter = adapter;
1854
1855         ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
1856                           "MRVL_PCIE", pdev);
1857         if (ret) {
1858                 pr_err("request_irq failed: ret=%d\n", ret);
1859                 adapter->card = NULL;
1860                 return -1;
1861         }
1862
1863         adapter->dev = &pdev->dev;
1864         strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
1865
1866         return 0;
1867 }
1868
1869 /*
1870  * This function unregisters the PCIE device.
1871  *
1872  * The PCIE IRQ is released, the function is disabled and driver
1873  * data is set to null.
1874  */
1875 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
1876 {
1877         struct pcie_service_card *card = adapter->card;
1878
1879         if (card) {
1880                 dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
1881                 free_irq(card->dev->irq, card->dev);
1882         }
1883 }
1884
1885 static struct mwifiex_if_ops pcie_ops = {
1886         .init_if =                      mwifiex_pcie_init,
1887         .cleanup_if =                   mwifiex_pcie_cleanup,
1888         .check_fw_status =              mwifiex_check_fw_status,
1889         .prog_fw =                      mwifiex_prog_fw_w_helper,
1890         .register_dev =                 mwifiex_register_dev,
1891         .unregister_dev =               mwifiex_unregister_dev,
1892         .enable_int =                   mwifiex_pcie_enable_host_int,
1893         .process_int_status =           mwifiex_process_int_status,
1894         .host_to_card =                 mwifiex_pcie_host_to_card,
1895         .wakeup =                       mwifiex_pm_wakeup_card,
1896         .wakeup_complete =              mwifiex_pm_wakeup_card_complete,
1897
1898         /* PCIE specific */
1899         .cmdrsp_complete =              mwifiex_pcie_cmdrsp_complete,
1900         .event_complete =               mwifiex_pcie_event_complete,
1901         .update_mp_end_port =           NULL,
1902         .cleanup_mpa_buf =              NULL,
1903 };
1904
1905 /*
1906  * This function initializes the PCIE driver module.
1907  *
1908  * This initiates the semaphore and registers the device with
1909  * PCIE bus.
1910  */
1911 static int mwifiex_pcie_init_module(void)
1912 {
1913         int ret;
1914
1915         pr_debug("Marvell 8766 PCIe Driver\n");
1916
1917         sema_init(&add_remove_card_sem, 1);
1918
1919         /* Clear the flag in case user removes the card. */
1920         user_rmmod = 0;
1921
1922         ret = pci_register_driver(&mwifiex_pcie);
1923         if (ret)
1924                 pr_err("Driver register failed!\n");
1925         else
1926                 pr_debug("info: Driver registered successfully!\n");
1927
1928         return ret;
1929 }
1930
1931 /*
1932  * This function cleans up the PCIE driver.
1933  *
1934  * The following major steps are followed for cleanup -
1935  *      - Resume the device if its suspended
1936  *      - Disconnect the device if connected
1937  *      - Shutdown the firmware
1938  *      - Unregister the device from PCIE bus.
1939  */
1940 static void mwifiex_pcie_cleanup_module(void)
1941 {
1942         if (!down_interruptible(&add_remove_card_sem))
1943                 up(&add_remove_card_sem);
1944
1945         /* Set the flag as user is removing this module. */
1946         user_rmmod = 1;
1947
1948         pci_unregister_driver(&mwifiex_pcie);
1949 }
1950
1951 module_init(mwifiex_pcie_init_module);
1952 module_exit(mwifiex_pcie_cleanup_module);
1953
1954 MODULE_AUTHOR("Marvell International Ltd.");
1955 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
1956 MODULE_VERSION(PCIE_VERSION);
1957 MODULE_LICENSE("GPL v2");
1958 MODULE_FIRMWARE("mrvl/pcie8766_uapsta.bin");