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