]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/net/wireless/marvell/mwifiex/pcie.c
Merge branch 'overlayfs-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszer...
[karo-tx-linux.git] / drivers / net / wireless / marvell / mwifiex / pcie.c
1 /*
2  * Marvell Wireless LAN device driver: PCIE specific handling
3  *
4  * Copyright (C) 2011-2014, 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 struct mwifiex_if_ops pcie_ops;
35
36 static const struct of_device_id mwifiex_pcie_of_match_table[] = {
37         { .compatible = "pci11ab,2b42" },
38         { .compatible = "pci1b4b,2b42" },
39         { }
40 };
41
42 static int mwifiex_pcie_probe_of(struct device *dev)
43 {
44         if (!of_match_node(mwifiex_pcie_of_match_table, dev->of_node)) {
45                 dev_err(dev, "required compatible string missing\n");
46                 return -EINVAL;
47         }
48
49         return 0;
50 }
51
52 static void mwifiex_pcie_work(struct work_struct *work);
53
54 static int
55 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
56                        size_t size, int flags)
57 {
58         struct pcie_service_card *card = adapter->card;
59         struct mwifiex_dma_mapping mapping;
60
61         mapping.addr = pci_map_single(card->dev, skb->data, size, flags);
62         if (pci_dma_mapping_error(card->dev, mapping.addr)) {
63                 mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n");
64                 return -1;
65         }
66         mapping.len = size;
67         mwifiex_store_mapping(skb, &mapping);
68         return 0;
69 }
70
71 static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter,
72                                      struct sk_buff *skb, int flags)
73 {
74         struct pcie_service_card *card = adapter->card;
75         struct mwifiex_dma_mapping mapping;
76
77         mwifiex_get_mapping(skb, &mapping);
78         pci_unmap_single(card->dev, mapping.addr, mapping.len, flags);
79 }
80
81 /*
82  * This function writes data into PCIE card register.
83  */
84 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
85 {
86         struct pcie_service_card *card = adapter->card;
87
88         iowrite32(data, card->pci_mmap1 + reg);
89
90         return 0;
91 }
92
93 /* This function reads data from PCIE card register.
94  */
95 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
96 {
97         struct pcie_service_card *card = adapter->card;
98
99         *data = ioread32(card->pci_mmap1 + reg);
100         if (*data == 0xffffffff)
101                 return 0xffffffff;
102
103         return 0;
104 }
105
106 /* This function reads u8 data from PCIE card register. */
107 static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter,
108                                  int reg, u8 *data)
109 {
110         struct pcie_service_card *card = adapter->card;
111
112         *data = ioread8(card->pci_mmap1 + reg);
113
114         return 0;
115 }
116
117 /*
118  * This function reads sleep cookie and checks if FW is ready
119  */
120 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
121 {
122         u32 cookie_value;
123         struct pcie_service_card *card = adapter->card;
124         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
125
126         if (!reg->sleep_cookie)
127                 return true;
128
129         if (card->sleep_cookie_vbase) {
130                 cookie_value = get_unaligned_le32(card->sleep_cookie_vbase);
131                 mwifiex_dbg(adapter, INFO,
132                             "info: ACCESS_HW: sleep cookie=0x%x\n",
133                             cookie_value);
134                 if (cookie_value == FW_AWAKE_COOKIE)
135                         return true;
136         }
137
138         return false;
139 }
140
141 #ifdef CONFIG_PM_SLEEP
142 /*
143  * Kernel needs to suspend all functions separately. Therefore all
144  * registered functions must have drivers with suspend and resume
145  * methods. Failing that the kernel simply removes the whole card.
146  *
147  * If already not suspended, this function allocates and sends a host
148  * sleep activate request to the firmware and turns off the traffic.
149  */
150 static int mwifiex_pcie_suspend(struct device *dev)
151 {
152         struct mwifiex_adapter *adapter;
153         struct pcie_service_card *card;
154         struct pci_dev *pdev = to_pci_dev(dev);
155
156         card = pci_get_drvdata(pdev);
157
158         /* Might still be loading firmware */
159         wait_for_completion(&card->fw_done);
160
161         adapter = card->adapter;
162         if (!adapter) {
163                 dev_err(dev, "adapter is not valid\n");
164                 return 0;
165         }
166
167         mwifiex_enable_wake(adapter);
168
169         /* Enable the Host Sleep */
170         if (!mwifiex_enable_hs(adapter)) {
171                 mwifiex_dbg(adapter, ERROR,
172                             "cmd: failed to suspend\n");
173                 adapter->hs_enabling = false;
174                 mwifiex_disable_wake(adapter);
175                 return -EFAULT;
176         }
177
178         flush_workqueue(adapter->workqueue);
179
180         /* Indicate device suspended */
181         adapter->is_suspended = true;
182         adapter->hs_enabling = false;
183
184         return 0;
185 }
186
187 /*
188  * Kernel needs to suspend all functions separately. Therefore all
189  * registered functions must have drivers with suspend and resume
190  * methods. Failing that the kernel simply removes the whole card.
191  *
192  * If already not resumed, this function turns on the traffic and
193  * sends a host sleep cancel request to the firmware.
194  */
195 static int mwifiex_pcie_resume(struct device *dev)
196 {
197         struct mwifiex_adapter *adapter;
198         struct pcie_service_card *card;
199         struct pci_dev *pdev = to_pci_dev(dev);
200
201         card = pci_get_drvdata(pdev);
202
203         if (!card->adapter) {
204                 dev_err(dev, "adapter structure is not valid\n");
205                 return 0;
206         }
207
208         adapter = card->adapter;
209
210         if (!adapter->is_suspended) {
211                 mwifiex_dbg(adapter, WARN,
212                             "Device already resumed\n");
213                 return 0;
214         }
215
216         adapter->is_suspended = false;
217
218         mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
219                           MWIFIEX_ASYNC_CMD);
220         mwifiex_disable_wake(adapter);
221
222         return 0;
223 }
224 #endif
225
226 /*
227  * This function probes an mwifiex device and registers it. It allocates
228  * the card structure, enables PCIE function number and initiates the
229  * device registration and initialization procedure by adding a logical
230  * interface.
231  */
232 static int mwifiex_pcie_probe(struct pci_dev *pdev,
233                                         const struct pci_device_id *ent)
234 {
235         struct pcie_service_card *card;
236         int ret;
237
238         pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
239                  pdev->vendor, pdev->device, pdev->revision);
240
241         card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
242         if (!card)
243                 return -ENOMEM;
244
245         init_completion(&card->fw_done);
246
247         card->dev = pdev;
248
249         if (ent->driver_data) {
250                 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
251                 card->pcie.reg = data->reg;
252                 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
253                 card->pcie.tx_buf_size = data->tx_buf_size;
254                 card->pcie.can_dump_fw = data->can_dump_fw;
255                 card->pcie.mem_type_mapping_tbl = data->mem_type_mapping_tbl;
256                 card->pcie.num_mem_types = data->num_mem_types;
257                 card->pcie.can_ext_scan = data->can_ext_scan;
258                 INIT_WORK(&card->work, mwifiex_pcie_work);
259         }
260
261         /* device tree node parsing and platform specific configuration*/
262         if (pdev->dev.of_node) {
263                 ret = mwifiex_pcie_probe_of(&pdev->dev);
264                 if (ret)
265                         return ret;
266         }
267
268         if (mwifiex_add_card(card, &card->fw_done, &pcie_ops,
269                              MWIFIEX_PCIE, &pdev->dev)) {
270                 pr_err("%s failed\n", __func__);
271                 return -1;
272         }
273
274         return 0;
275 }
276
277 /*
278  * This function removes the interface and frees up the card structure.
279  */
280 static void mwifiex_pcie_remove(struct pci_dev *pdev)
281 {
282         struct pcie_service_card *card;
283         struct mwifiex_adapter *adapter;
284         struct mwifiex_private *priv;
285         const struct mwifiex_pcie_card_reg *reg;
286         u32 fw_status;
287         int ret;
288
289         card = pci_get_drvdata(pdev);
290
291         wait_for_completion(&card->fw_done);
292
293         adapter = card->adapter;
294         if (!adapter || !adapter->priv_num)
295                 return;
296
297         reg = card->pcie.reg;
298         if (reg)
299                 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
300         else
301                 fw_status = -1;
302
303         if (fw_status == FIRMWARE_READY_PCIE && !adapter->mfg_mode) {
304                 mwifiex_deauthenticate_all(adapter);
305
306                 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
307
308                 mwifiex_disable_auto_ds(priv);
309
310                 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
311         }
312
313         mwifiex_remove_card(adapter);
314 }
315
316 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
317 {
318         mwifiex_pcie_remove(pdev);
319
320         return;
321 }
322
323 static const struct pci_device_id mwifiex_ids[] = {
324         {
325                 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
326                 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
327                 .driver_data = (unsigned long)&mwifiex_pcie8766,
328         },
329         {
330                 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
331                 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
332                 .driver_data = (unsigned long)&mwifiex_pcie8897,
333         },
334         {
335                 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
336                 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
337                 .driver_data = (unsigned long)&mwifiex_pcie8997,
338         },
339         {
340                 PCIE_VENDOR_ID_V2_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
341                 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
342                 .driver_data = (unsigned long)&mwifiex_pcie8997,
343         },
344         {},
345 };
346
347 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
348
349 static void mwifiex_pcie_reset_notify(struct pci_dev *pdev, bool prepare)
350 {
351         struct pcie_service_card *card = pci_get_drvdata(pdev);
352         struct mwifiex_adapter *adapter = card->adapter;
353         int ret;
354
355         if (!adapter) {
356                 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
357                         __func__);
358                 return;
359         }
360
361         mwifiex_dbg(adapter, INFO,
362                     "%s: vendor=0x%4.04x device=0x%4.04x rev=%d %s\n",
363                     __func__, pdev->vendor, pdev->device,
364                     pdev->revision,
365                     prepare ? "Pre-FLR" : "Post-FLR");
366
367         if (prepare) {
368                 /* Kernel would be performing FLR after this notification.
369                  * Cleanup all software without cleaning anything related to
370                  * PCIe and HW.
371                  */
372                 mwifiex_shutdown_sw(adapter);
373                 adapter->surprise_removed = true;
374                 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
375                 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
376         } else {
377                 /* Kernel stores and restores PCIe function context before and
378                  * after performing FLR respectively. Reconfigure the software
379                  * and firmware including firmware redownload
380                  */
381                 adapter->surprise_removed = false;
382                 ret = mwifiex_reinit_sw(adapter);
383                 if (ret) {
384                         dev_err(&pdev->dev, "reinit failed: %d\n", ret);
385                         return;
386                 }
387         }
388         mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
389 }
390
391 static const struct pci_error_handlers mwifiex_pcie_err_handler[] = {
392                 { .reset_notify = mwifiex_pcie_reset_notify, },
393 };
394
395 #ifdef CONFIG_PM_SLEEP
396 /* Power Management Hooks */
397 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
398                                 mwifiex_pcie_resume);
399 #endif
400
401 /* PCI Device Driver */
402 static struct pci_driver __refdata mwifiex_pcie = {
403         .name     = "mwifiex_pcie",
404         .id_table = mwifiex_ids,
405         .probe    = mwifiex_pcie_probe,
406         .remove   = mwifiex_pcie_remove,
407 #ifdef CONFIG_PM_SLEEP
408         .driver   = {
409                 .pm = &mwifiex_pcie_pm_ops,
410         },
411 #endif
412         .shutdown = mwifiex_pcie_shutdown,
413         .err_handler = mwifiex_pcie_err_handler,
414 };
415
416 /*
417  * This function adds delay loop to ensure FW is awake before proceeding.
418  */
419 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
420 {
421         int i = 0;
422
423         while (mwifiex_pcie_ok_to_access_hw(adapter)) {
424                 i++;
425                 usleep_range(10, 20);
426                 /* 50ms max wait */
427                 if (i == 5000)
428                         break;
429         }
430
431         return;
432 }
433
434 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
435                                            u32 max_delay_loop_cnt)
436 {
437         struct pcie_service_card *card = adapter->card;
438         u8 *buffer;
439         u32 sleep_cookie, count;
440         struct sk_buff *cmdrsp = card->cmdrsp_buf;
441
442         for (count = 0; count < max_delay_loop_cnt; count++) {
443                 pci_dma_sync_single_for_cpu(card->dev,
444                                             MWIFIEX_SKB_DMA_ADDR(cmdrsp),
445                                             sizeof(sleep_cookie),
446                                             PCI_DMA_FROMDEVICE);
447                 buffer = cmdrsp->data;
448                 sleep_cookie = get_unaligned_le32(buffer);
449
450                 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
451                         mwifiex_dbg(adapter, INFO,
452                                     "sleep cookie found at count %d\n", count);
453                         break;
454                 }
455                 pci_dma_sync_single_for_device(card->dev,
456                                                MWIFIEX_SKB_DMA_ADDR(cmdrsp),
457                                                sizeof(sleep_cookie),
458                                                PCI_DMA_FROMDEVICE);
459                 usleep_range(20, 30);
460         }
461
462         if (count >= max_delay_loop_cnt)
463                 mwifiex_dbg(adapter, INFO,
464                             "max count reached while accessing sleep cookie\n");
465 }
466
467 /* This function wakes up the card by reading fw_status register. */
468 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
469 {
470         struct pcie_service_card *card = adapter->card;
471         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
472
473         mwifiex_dbg(adapter, EVENT,
474                     "event: Wakeup device...\n");
475
476         if (reg->sleep_cookie)
477                 mwifiex_pcie_dev_wakeup_delay(adapter);
478
479         /* Accessing fw_status register will wakeup device */
480         if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
481                 mwifiex_dbg(adapter, ERROR,
482                             "Writing fw_status register failed\n");
483                 return -1;
484         }
485
486         if (reg->sleep_cookie) {
487                 mwifiex_pcie_dev_wakeup_delay(adapter);
488                 mwifiex_dbg(adapter, INFO,
489                             "PCIE wakeup: Setting PS_STATE_AWAKE\n");
490                 adapter->ps_state = PS_STATE_AWAKE;
491         }
492
493         return 0;
494 }
495
496 /*
497  * This function is called after the card has woken up.
498  *
499  * The card configuration register is reset.
500  */
501 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
502 {
503         mwifiex_dbg(adapter, CMD,
504                     "cmd: Wakeup device completed\n");
505
506         return 0;
507 }
508
509 /*
510  * This function disables the host interrupt.
511  *
512  * The host interrupt mask is read, the disable bit is reset and
513  * written back to the card host interrupt mask register.
514  */
515 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
516 {
517         if (mwifiex_pcie_ok_to_access_hw(adapter)) {
518                 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
519                                       0x00000000)) {
520                         mwifiex_dbg(adapter, ERROR,
521                                     "Disable host interrupt failed\n");
522                         return -1;
523                 }
524         }
525
526         atomic_set(&adapter->tx_hw_pending, 0);
527         return 0;
528 }
529
530 static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter)
531 {
532         WARN_ON(mwifiex_pcie_disable_host_int(adapter));
533 }
534
535 /*
536  * This function enables the host interrupt.
537  *
538  * The host interrupt enable mask is written to the card
539  * host interrupt mask register.
540  */
541 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
542 {
543         if (mwifiex_pcie_ok_to_access_hw(adapter)) {
544                 /* Simply write the mask to the register */
545                 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
546                                       HOST_INTR_MASK)) {
547                         mwifiex_dbg(adapter, ERROR,
548                                     "Enable host interrupt failed\n");
549                         return -1;
550                 }
551         }
552
553         return 0;
554 }
555
556 /*
557  * This function initializes TX buffer ring descriptors
558  */
559 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
560 {
561         struct pcie_service_card *card = adapter->card;
562         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
563         struct mwifiex_pcie_buf_desc *desc;
564         struct mwifiex_pfu_buf_desc *desc2;
565         int i;
566
567         for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
568                 card->tx_buf_list[i] = NULL;
569                 if (reg->pfu_enabled) {
570                         card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
571                                              (sizeof(*desc2) * i);
572                         desc2 = card->txbd_ring[i];
573                         memset(desc2, 0, sizeof(*desc2));
574                 } else {
575                         card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
576                                              (sizeof(*desc) * i);
577                         desc = card->txbd_ring[i];
578                         memset(desc, 0, sizeof(*desc));
579                 }
580         }
581
582         return 0;
583 }
584
585 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
586  * here and after mapping PCI memory, its physical address is assigned to
587  * PCIE Rx buffer descriptor's physical address.
588  */
589 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
590 {
591         struct pcie_service_card *card = adapter->card;
592         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
593         struct sk_buff *skb;
594         struct mwifiex_pcie_buf_desc *desc;
595         struct mwifiex_pfu_buf_desc *desc2;
596         dma_addr_t buf_pa;
597         int i;
598
599         for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
600                 /* Allocate skb here so that firmware can DMA data from it */
601                 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
602                                                   GFP_KERNEL);
603                 if (!skb) {
604                         mwifiex_dbg(adapter, ERROR,
605                                     "Unable to allocate skb for RX ring.\n");
606                         kfree(card->rxbd_ring_vbase);
607                         return -ENOMEM;
608                 }
609
610                 if (mwifiex_map_pci_memory(adapter, skb,
611                                            MWIFIEX_RX_DATA_BUF_SIZE,
612                                            PCI_DMA_FROMDEVICE))
613                         return -1;
614
615                 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
616
617                 mwifiex_dbg(adapter, INFO,
618                             "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
619                             skb, skb->len, skb->data, (u32)buf_pa,
620                             (u32)((u64)buf_pa >> 32));
621
622                 card->rx_buf_list[i] = skb;
623                 if (reg->pfu_enabled) {
624                         card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
625                                              (sizeof(*desc2) * i);
626                         desc2 = card->rxbd_ring[i];
627                         desc2->paddr = buf_pa;
628                         desc2->len = (u16)skb->len;
629                         desc2->frag_len = (u16)skb->len;
630                         desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
631                         desc2->offset = 0;
632                 } else {
633                         card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
634                                              (sizeof(*desc) * i));
635                         desc = card->rxbd_ring[i];
636                         desc->paddr = buf_pa;
637                         desc->len = (u16)skb->len;
638                         desc->flags = 0;
639                 }
640         }
641
642         return 0;
643 }
644
645 /* This function initializes event buffer ring descriptors. Each SKB is
646  * allocated here and after mapping PCI memory, its physical address is assigned
647  * to PCIE Rx buffer descriptor's physical address
648  */
649 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
650 {
651         struct pcie_service_card *card = adapter->card;
652         struct mwifiex_evt_buf_desc *desc;
653         struct sk_buff *skb;
654         dma_addr_t buf_pa;
655         int i;
656
657         for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
658                 /* Allocate skb here so that firmware can DMA data from it */
659                 skb = dev_alloc_skb(MAX_EVENT_SIZE);
660                 if (!skb) {
661                         mwifiex_dbg(adapter, ERROR,
662                                     "Unable to allocate skb for EVENT buf.\n");
663                         kfree(card->evtbd_ring_vbase);
664                         return -ENOMEM;
665                 }
666                 skb_put(skb, MAX_EVENT_SIZE);
667
668                 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
669                                            PCI_DMA_FROMDEVICE))
670                         return -1;
671
672                 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
673
674                 mwifiex_dbg(adapter, EVENT,
675                             "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
676                             skb, skb->len, skb->data, (u32)buf_pa,
677                             (u32)((u64)buf_pa >> 32));
678
679                 card->evt_buf_list[i] = skb;
680                 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
681                                       (sizeof(*desc) * i));
682                 desc = card->evtbd_ring[i];
683                 desc->paddr = buf_pa;
684                 desc->len = (u16)skb->len;
685                 desc->flags = 0;
686         }
687
688         return 0;
689 }
690
691 /* This function cleans up TX buffer rings. If any of the buffer list has valid
692  * SKB address, associated SKB is freed.
693  */
694 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
695 {
696         struct pcie_service_card *card = adapter->card;
697         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
698         struct sk_buff *skb;
699         struct mwifiex_pcie_buf_desc *desc;
700         struct mwifiex_pfu_buf_desc *desc2;
701         int i;
702
703         for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
704                 if (reg->pfu_enabled) {
705                         desc2 = card->txbd_ring[i];
706                         if (card->tx_buf_list[i]) {
707                                 skb = card->tx_buf_list[i];
708                                 mwifiex_unmap_pci_memory(adapter, skb,
709                                                          PCI_DMA_TODEVICE);
710                                 dev_kfree_skb_any(skb);
711                         }
712                         memset(desc2, 0, sizeof(*desc2));
713                 } else {
714                         desc = card->txbd_ring[i];
715                         if (card->tx_buf_list[i]) {
716                                 skb = card->tx_buf_list[i];
717                                 mwifiex_unmap_pci_memory(adapter, skb,
718                                                          PCI_DMA_TODEVICE);
719                                 dev_kfree_skb_any(skb);
720                         }
721                         memset(desc, 0, sizeof(*desc));
722                 }
723                 card->tx_buf_list[i] = NULL;
724         }
725
726         atomic_set(&adapter->tx_hw_pending, 0);
727         return;
728 }
729
730 /* This function cleans up RX buffer rings. If any of the buffer list has valid
731  * SKB address, associated SKB is freed.
732  */
733 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
734 {
735         struct pcie_service_card *card = adapter->card;
736         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
737         struct mwifiex_pcie_buf_desc *desc;
738         struct mwifiex_pfu_buf_desc *desc2;
739         struct sk_buff *skb;
740         int i;
741
742         for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
743                 if (reg->pfu_enabled) {
744                         desc2 = card->rxbd_ring[i];
745                         if (card->rx_buf_list[i]) {
746                                 skb = card->rx_buf_list[i];
747                                 mwifiex_unmap_pci_memory(adapter, skb,
748                                                          PCI_DMA_FROMDEVICE);
749                                 dev_kfree_skb_any(skb);
750                         }
751                         memset(desc2, 0, sizeof(*desc2));
752                 } else {
753                         desc = card->rxbd_ring[i];
754                         if (card->rx_buf_list[i]) {
755                                 skb = card->rx_buf_list[i];
756                                 mwifiex_unmap_pci_memory(adapter, skb,
757                                                          PCI_DMA_FROMDEVICE);
758                                 dev_kfree_skb_any(skb);
759                         }
760                         memset(desc, 0, sizeof(*desc));
761                 }
762                 card->rx_buf_list[i] = NULL;
763         }
764
765         return;
766 }
767
768 /* This function cleans up event buffer rings. If any of the buffer list has
769  * valid SKB address, associated SKB is freed.
770  */
771 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
772 {
773         struct pcie_service_card *card = adapter->card;
774         struct mwifiex_evt_buf_desc *desc;
775         struct sk_buff *skb;
776         int i;
777
778         for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
779                 desc = card->evtbd_ring[i];
780                 if (card->evt_buf_list[i]) {
781                         skb = card->evt_buf_list[i];
782                         mwifiex_unmap_pci_memory(adapter, skb,
783                                                  PCI_DMA_FROMDEVICE);
784                         dev_kfree_skb_any(skb);
785                 }
786                 card->evt_buf_list[i] = NULL;
787                 memset(desc, 0, sizeof(*desc));
788         }
789
790         return;
791 }
792
793 /* This function creates buffer descriptor ring for TX
794  */
795 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
796 {
797         struct pcie_service_card *card = adapter->card;
798         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
799
800         /*
801          * driver maintaines the write pointer and firmware maintaines the read
802          * pointer. The write pointer starts at 0 (zero) while the read pointer
803          * starts at zero with rollover bit set
804          */
805         card->txbd_wrptr = 0;
806
807         if (reg->pfu_enabled)
808                 card->txbd_rdptr = 0;
809         else
810                 card->txbd_rdptr |= reg->tx_rollover_ind;
811
812         /* allocate shared memory for the BD ring and divide the same in to
813            several descriptors */
814         if (reg->pfu_enabled)
815                 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
816                                        MWIFIEX_MAX_TXRX_BD;
817         else
818                 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
819                                        MWIFIEX_MAX_TXRX_BD;
820
821         mwifiex_dbg(adapter, INFO,
822                     "info: txbd_ring: Allocating %d bytes\n",
823                     card->txbd_ring_size);
824         card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
825                                                      card->txbd_ring_size,
826                                                      &card->txbd_ring_pbase);
827         if (!card->txbd_ring_vbase) {
828                 mwifiex_dbg(adapter, ERROR,
829                             "allocate consistent memory (%d bytes) failed!\n",
830                             card->txbd_ring_size);
831                 return -ENOMEM;
832         }
833         mwifiex_dbg(adapter, DATA,
834                     "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
835                     card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
836                     (u32)((u64)card->txbd_ring_pbase >> 32),
837                     card->txbd_ring_size);
838
839         return mwifiex_init_txq_ring(adapter);
840 }
841
842 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
843 {
844         struct pcie_service_card *card = adapter->card;
845         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
846
847         mwifiex_cleanup_txq_ring(adapter);
848
849         if (card->txbd_ring_vbase)
850                 pci_free_consistent(card->dev, card->txbd_ring_size,
851                                     card->txbd_ring_vbase,
852                                     card->txbd_ring_pbase);
853         card->txbd_ring_size = 0;
854         card->txbd_wrptr = 0;
855         card->txbd_rdptr = 0 | reg->tx_rollover_ind;
856         card->txbd_ring_vbase = NULL;
857         card->txbd_ring_pbase = 0;
858
859         return 0;
860 }
861
862 /*
863  * This function creates buffer descriptor ring for RX
864  */
865 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
866 {
867         struct pcie_service_card *card = adapter->card;
868         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
869
870         /*
871          * driver maintaines the read pointer and firmware maintaines the write
872          * pointer. The write pointer starts at 0 (zero) while the read pointer
873          * starts at zero with rollover bit set
874          */
875         card->rxbd_wrptr = 0;
876         card->rxbd_rdptr = reg->rx_rollover_ind;
877
878         if (reg->pfu_enabled)
879                 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
880                                        MWIFIEX_MAX_TXRX_BD;
881         else
882                 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
883                                        MWIFIEX_MAX_TXRX_BD;
884
885         mwifiex_dbg(adapter, INFO,
886                     "info: rxbd_ring: Allocating %d bytes\n",
887                     card->rxbd_ring_size);
888         card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
889                                                      card->rxbd_ring_size,
890                                                      &card->rxbd_ring_pbase);
891         if (!card->rxbd_ring_vbase) {
892                 mwifiex_dbg(adapter, ERROR,
893                             "allocate consistent memory (%d bytes) failed!\n",
894                             card->rxbd_ring_size);
895                 return -ENOMEM;
896         }
897
898         mwifiex_dbg(adapter, DATA,
899                     "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
900                     card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
901                     (u32)((u64)card->rxbd_ring_pbase >> 32),
902                     card->rxbd_ring_size);
903
904         return mwifiex_init_rxq_ring(adapter);
905 }
906
907 /*
908  * This function deletes Buffer descriptor ring for RX
909  */
910 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
911 {
912         struct pcie_service_card *card = adapter->card;
913         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
914
915         mwifiex_cleanup_rxq_ring(adapter);
916
917         if (card->rxbd_ring_vbase)
918                 pci_free_consistent(card->dev, card->rxbd_ring_size,
919                                     card->rxbd_ring_vbase,
920                                     card->rxbd_ring_pbase);
921         card->rxbd_ring_size = 0;
922         card->rxbd_wrptr = 0;
923         card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
924         card->rxbd_ring_vbase = NULL;
925         card->rxbd_ring_pbase = 0;
926
927         return 0;
928 }
929
930 /*
931  * This function creates buffer descriptor ring for Events
932  */
933 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
934 {
935         struct pcie_service_card *card = adapter->card;
936         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
937
938         /*
939          * driver maintaines the read pointer and firmware maintaines the write
940          * pointer. The write pointer starts at 0 (zero) while the read pointer
941          * starts at zero with rollover bit set
942          */
943         card->evtbd_wrptr = 0;
944         card->evtbd_rdptr = reg->evt_rollover_ind;
945
946         card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
947                                 MWIFIEX_MAX_EVT_BD;
948
949         mwifiex_dbg(adapter, INFO,
950                     "info: evtbd_ring: Allocating %d bytes\n",
951                 card->evtbd_ring_size);
952         card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
953                                                       card->evtbd_ring_size,
954                                                       &card->evtbd_ring_pbase);
955         if (!card->evtbd_ring_vbase) {
956                 mwifiex_dbg(adapter, ERROR,
957                             "allocate consistent memory (%d bytes) failed!\n",
958                             card->evtbd_ring_size);
959                 return -ENOMEM;
960         }
961
962         mwifiex_dbg(adapter, EVENT,
963                     "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
964                     card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
965                     (u32)((u64)card->evtbd_ring_pbase >> 32),
966                     card->evtbd_ring_size);
967
968         return mwifiex_pcie_init_evt_ring(adapter);
969 }
970
971 /*
972  * This function deletes Buffer descriptor ring for Events
973  */
974 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
975 {
976         struct pcie_service_card *card = adapter->card;
977         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
978
979         mwifiex_cleanup_evt_ring(adapter);
980
981         if (card->evtbd_ring_vbase)
982                 pci_free_consistent(card->dev, card->evtbd_ring_size,
983                                     card->evtbd_ring_vbase,
984                                     card->evtbd_ring_pbase);
985         card->evtbd_wrptr = 0;
986         card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
987         card->evtbd_ring_size = 0;
988         card->evtbd_ring_vbase = NULL;
989         card->evtbd_ring_pbase = 0;
990
991         return 0;
992 }
993
994 /*
995  * This function allocates a buffer for CMDRSP
996  */
997 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
998 {
999         struct pcie_service_card *card = adapter->card;
1000         struct sk_buff *skb;
1001
1002         /* Allocate memory for receiving command response data */
1003         skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1004         if (!skb) {
1005                 mwifiex_dbg(adapter, ERROR,
1006                             "Unable to allocate skb for command response data.\n");
1007                 return -ENOMEM;
1008         }
1009         skb_put(skb, MWIFIEX_UPLD_SIZE);
1010         if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1011                                    PCI_DMA_FROMDEVICE))
1012                 return -1;
1013
1014         card->cmdrsp_buf = skb;
1015
1016         return 0;
1017 }
1018
1019 /*
1020  * This function deletes a buffer for CMDRSP
1021  */
1022 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
1023 {
1024         struct pcie_service_card *card;
1025
1026         if (!adapter)
1027                 return 0;
1028
1029         card = adapter->card;
1030
1031         if (card && card->cmdrsp_buf) {
1032                 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
1033                                          PCI_DMA_FROMDEVICE);
1034                 dev_kfree_skb_any(card->cmdrsp_buf);
1035         }
1036
1037         if (card && card->cmd_buf) {
1038                 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1039                                          PCI_DMA_TODEVICE);
1040                 dev_kfree_skb_any(card->cmd_buf);
1041         }
1042         return 0;
1043 }
1044
1045 /*
1046  * This function allocates a buffer for sleep cookie
1047  */
1048 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1049 {
1050         struct pcie_service_card *card = adapter->card;
1051         u32 tmp;
1052
1053         card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
1054                                                      &card->sleep_cookie_pbase);
1055         if (!card->sleep_cookie_vbase) {
1056                 mwifiex_dbg(adapter, ERROR,
1057                             "pci_alloc_consistent failed!\n");
1058                 return -ENOMEM;
1059         }
1060         /* Init val of Sleep Cookie */
1061         tmp = FW_AWAKE_COOKIE;
1062         put_unaligned(tmp, card->sleep_cookie_vbase);
1063
1064         mwifiex_dbg(adapter, INFO,
1065                     "alloc_scook: sleep cookie=0x%x\n",
1066                     get_unaligned(card->sleep_cookie_vbase));
1067
1068         return 0;
1069 }
1070
1071 /*
1072  * This function deletes buffer for sleep cookie
1073  */
1074 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1075 {
1076         struct pcie_service_card *card;
1077
1078         if (!adapter)
1079                 return 0;
1080
1081         card = adapter->card;
1082
1083         if (card && card->sleep_cookie_vbase) {
1084                 pci_free_consistent(card->dev, sizeof(u32),
1085                                     card->sleep_cookie_vbase,
1086                                     card->sleep_cookie_pbase);
1087                 card->sleep_cookie_vbase = NULL;
1088         }
1089
1090         return 0;
1091 }
1092
1093 /* This function flushes the TX buffer descriptor ring
1094  * This function defined as handler is also called while cleaning TXRX
1095  * during disconnect/ bss stop.
1096  */
1097 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1098 {
1099         struct pcie_service_card *card = adapter->card;
1100
1101         if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1102                 card->txbd_flush = 1;
1103                 /* write pointer already set at last send
1104                  * send dnld-rdy intr again, wait for completion.
1105                  */
1106                 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1107                                       CPU_INTR_DNLD_RDY)) {
1108                         mwifiex_dbg(adapter, ERROR,
1109                                     "failed to assert dnld-rdy interrupt.\n");
1110                         return -1;
1111                 }
1112         }
1113         return 0;
1114 }
1115
1116 /*
1117  * This function unmaps and frees downloaded data buffer
1118  */
1119 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1120 {
1121         struct sk_buff *skb;
1122         u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1123         struct mwifiex_pcie_buf_desc *desc;
1124         struct mwifiex_pfu_buf_desc *desc2;
1125         struct pcie_service_card *card = adapter->card;
1126         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1127
1128         if (!mwifiex_pcie_ok_to_access_hw(adapter))
1129                 mwifiex_pm_wakeup_card(adapter);
1130
1131         /* Read the TX ring read pointer set by firmware */
1132         if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1133                 mwifiex_dbg(adapter, ERROR,
1134                             "SEND COMP: failed to read reg->tx_rdptr\n");
1135                 return -1;
1136         }
1137
1138         mwifiex_dbg(adapter, DATA,
1139                     "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1140                     card->txbd_rdptr, rdptr);
1141
1142         num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1143         /* free from previous txbd_rdptr to current txbd_rdptr */
1144         while (((card->txbd_rdptr & reg->tx_mask) !=
1145                 (rdptr & reg->tx_mask)) ||
1146                ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1147                 (rdptr & reg->tx_rollover_ind))) {
1148                 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1149                             reg->tx_start_ptr;
1150
1151                 skb = card->tx_buf_list[wrdoneidx];
1152
1153                 if (skb) {
1154                         mwifiex_dbg(adapter, DATA,
1155                                     "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1156                                     skb, wrdoneidx);
1157                         mwifiex_unmap_pci_memory(adapter, skb,
1158                                                  PCI_DMA_TODEVICE);
1159
1160                         unmap_count++;
1161
1162                         if (card->txbd_flush)
1163                                 mwifiex_write_data_complete(adapter, skb, 0,
1164                                                             -1);
1165                         else
1166                                 mwifiex_write_data_complete(adapter, skb, 0, 0);
1167                         atomic_dec(&adapter->tx_hw_pending);
1168                 }
1169
1170                 card->tx_buf_list[wrdoneidx] = NULL;
1171
1172                 if (reg->pfu_enabled) {
1173                         desc2 = card->txbd_ring[wrdoneidx];
1174                         memset(desc2, 0, sizeof(*desc2));
1175                 } else {
1176                         desc = card->txbd_ring[wrdoneidx];
1177                         memset(desc, 0, sizeof(*desc));
1178                 }
1179                 switch (card->dev->device) {
1180                 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1181                         card->txbd_rdptr++;
1182                         break;
1183                 case PCIE_DEVICE_ID_MARVELL_88W8897:
1184                 case PCIE_DEVICE_ID_MARVELL_88W8997:
1185                         card->txbd_rdptr += reg->ring_tx_start_ptr;
1186                         break;
1187                 }
1188
1189
1190                 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1191                         card->txbd_rdptr = ((card->txbd_rdptr &
1192                                              reg->tx_rollover_ind) ^
1193                                              reg->tx_rollover_ind);
1194         }
1195
1196         if (unmap_count)
1197                 adapter->data_sent = false;
1198
1199         if (card->txbd_flush) {
1200                 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1201                         card->txbd_flush = 0;
1202                 else
1203                         mwifiex_clean_pcie_ring_buf(adapter);
1204         }
1205
1206         return 0;
1207 }
1208
1209 /* This function sends data buffer to device. First 4 bytes of payload
1210  * are filled with payload length and payload type. Then this payload
1211  * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1212  * Download ready interrupt to FW is deffered if Tx ring is not full and
1213  * additional payload can be accomodated.
1214  * Caller must ensure tx_param parameter to this function is not NULL.
1215  */
1216 static int
1217 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1218                        struct mwifiex_tx_param *tx_param)
1219 {
1220         struct pcie_service_card *card = adapter->card;
1221         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1222         u32 wrindx, num_tx_buffs, rx_val;
1223         int ret;
1224         dma_addr_t buf_pa;
1225         struct mwifiex_pcie_buf_desc *desc = NULL;
1226         struct mwifiex_pfu_buf_desc *desc2 = NULL;
1227
1228         if (!(skb->data && skb->len)) {
1229                 mwifiex_dbg(adapter, ERROR,
1230                             "%s(): invalid parameter <%p, %#x>\n",
1231                             __func__, skb->data, skb->len);
1232                 return -1;
1233         }
1234
1235         if (!mwifiex_pcie_ok_to_access_hw(adapter))
1236                 mwifiex_pm_wakeup_card(adapter);
1237
1238         num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1239         mwifiex_dbg(adapter, DATA,
1240                     "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1241                 card->txbd_rdptr, card->txbd_wrptr);
1242         if (mwifiex_pcie_txbd_not_full(card)) {
1243                 u8 *payload;
1244
1245                 adapter->data_sent = true;
1246                 payload = skb->data;
1247                 put_unaligned_le16((u16)skb->len, payload + 0);
1248                 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
1249
1250                 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1251                                            PCI_DMA_TODEVICE))
1252                         return -1;
1253
1254                 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1255                 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1256                 card->tx_buf_list[wrindx] = skb;
1257                 atomic_inc(&adapter->tx_hw_pending);
1258
1259                 if (reg->pfu_enabled) {
1260                         desc2 = card->txbd_ring[wrindx];
1261                         desc2->paddr = buf_pa;
1262                         desc2->len = (u16)skb->len;
1263                         desc2->frag_len = (u16)skb->len;
1264                         desc2->offset = 0;
1265                         desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1266                                          MWIFIEX_BD_FLAG_LAST_DESC;
1267                 } else {
1268                         desc = card->txbd_ring[wrindx];
1269                         desc->paddr = buf_pa;
1270                         desc->len = (u16)skb->len;
1271                         desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1272                                       MWIFIEX_BD_FLAG_LAST_DESC;
1273                 }
1274
1275                 switch (card->dev->device) {
1276                 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1277                         card->txbd_wrptr++;
1278                         break;
1279                 case PCIE_DEVICE_ID_MARVELL_88W8897:
1280                 case PCIE_DEVICE_ID_MARVELL_88W8997:
1281                         card->txbd_wrptr += reg->ring_tx_start_ptr;
1282                         break;
1283                 }
1284
1285                 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1286                         card->txbd_wrptr = ((card->txbd_wrptr &
1287                                                 reg->tx_rollover_ind) ^
1288                                                 reg->tx_rollover_ind);
1289
1290                 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1291                 /* Write the TX ring write pointer in to reg->tx_wrptr */
1292                 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1293                                       card->txbd_wrptr | rx_val)) {
1294                         mwifiex_dbg(adapter, ERROR,
1295                                     "SEND DATA: failed to write reg->tx_wrptr\n");
1296                         ret = -1;
1297                         goto done_unmap;
1298                 }
1299                 if ((mwifiex_pcie_txbd_not_full(card)) &&
1300                     tx_param->next_pkt_len) {
1301                         /* have more packets and TxBD still can hold more */
1302                         mwifiex_dbg(adapter, DATA,
1303                                     "SEND DATA: delay dnld-rdy interrupt.\n");
1304                         adapter->data_sent = false;
1305                 } else {
1306                         /* Send the TX ready interrupt */
1307                         if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1308                                               CPU_INTR_DNLD_RDY)) {
1309                                 mwifiex_dbg(adapter, ERROR,
1310                                             "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1311                                 ret = -1;
1312                                 goto done_unmap;
1313                         }
1314                 }
1315                 mwifiex_dbg(adapter, DATA,
1316                             "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1317                             "%#x> and sent packet to firmware successfully\n",
1318                             card->txbd_rdptr, card->txbd_wrptr);
1319         } else {
1320                 mwifiex_dbg(adapter, DATA,
1321                             "info: TX Ring full, can't send packets to fw\n");
1322                 adapter->data_sent = true;
1323                 /* Send the TX ready interrupt */
1324                 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1325                                       CPU_INTR_DNLD_RDY))
1326                         mwifiex_dbg(adapter, ERROR,
1327                                     "SEND DATA: failed to assert door-bell intr\n");
1328                 return -EBUSY;
1329         }
1330
1331         return -EINPROGRESS;
1332 done_unmap:
1333         mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1334         card->tx_buf_list[wrindx] = NULL;
1335         atomic_dec(&adapter->tx_hw_pending);
1336         if (reg->pfu_enabled)
1337                 memset(desc2, 0, sizeof(*desc2));
1338         else
1339                 memset(desc, 0, sizeof(*desc));
1340
1341         return ret;
1342 }
1343
1344 /*
1345  * This function handles received buffer ring and
1346  * dispatches packets to upper
1347  */
1348 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1349 {
1350         struct pcie_service_card *card = adapter->card;
1351         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1352         u32 wrptr, rd_index, tx_val;
1353         dma_addr_t buf_pa;
1354         int ret = 0;
1355         struct sk_buff *skb_tmp = NULL;
1356         struct mwifiex_pcie_buf_desc *desc;
1357         struct mwifiex_pfu_buf_desc *desc2;
1358
1359         if (!mwifiex_pcie_ok_to_access_hw(adapter))
1360                 mwifiex_pm_wakeup_card(adapter);
1361
1362         /* Read the RX ring Write pointer set by firmware */
1363         if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1364                 mwifiex_dbg(adapter, ERROR,
1365                             "RECV DATA: failed to read reg->rx_wrptr\n");
1366                 ret = -1;
1367                 goto done;
1368         }
1369         card->rxbd_wrptr = wrptr;
1370
1371         while (((wrptr & reg->rx_mask) !=
1372                 (card->rxbd_rdptr & reg->rx_mask)) ||
1373                ((wrptr & reg->rx_rollover_ind) ==
1374                 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1375                 struct sk_buff *skb_data;
1376                 u16 rx_len;
1377
1378                 rd_index = card->rxbd_rdptr & reg->rx_mask;
1379                 skb_data = card->rx_buf_list[rd_index];
1380
1381                 /* If skb allocation was failed earlier for Rx packet,
1382                  * rx_buf_list[rd_index] would have been left with a NULL.
1383                  */
1384                 if (!skb_data)
1385                         return -ENOMEM;
1386
1387                 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1388                 card->rx_buf_list[rd_index] = NULL;
1389
1390                 /* Get data length from interface header -
1391                  * first 2 bytes for len, next 2 bytes is for type
1392                  */
1393                 rx_len = get_unaligned_le16(skb_data->data);
1394                 if (WARN_ON(rx_len <= INTF_HEADER_LEN ||
1395                             rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1396                         mwifiex_dbg(adapter, ERROR,
1397                                     "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1398                                     rx_len, card->rxbd_rdptr, wrptr);
1399                         dev_kfree_skb_any(skb_data);
1400                 } else {
1401                         skb_put(skb_data, rx_len);
1402                         mwifiex_dbg(adapter, DATA,
1403                                     "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1404                                     card->rxbd_rdptr, wrptr, rx_len);
1405                         skb_pull(skb_data, INTF_HEADER_LEN);
1406                         if (adapter->rx_work_enabled) {
1407                                 skb_queue_tail(&adapter->rx_data_q, skb_data);
1408                                 adapter->data_received = true;
1409                                 atomic_inc(&adapter->rx_pending);
1410                         } else {
1411                                 mwifiex_handle_rx_packet(adapter, skb_data);
1412                         }
1413                 }
1414
1415                 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1416                                                       GFP_KERNEL);
1417                 if (!skb_tmp) {
1418                         mwifiex_dbg(adapter, ERROR,
1419                                     "Unable to allocate skb.\n");
1420                         return -ENOMEM;
1421                 }
1422
1423                 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1424                                            MWIFIEX_RX_DATA_BUF_SIZE,
1425                                            PCI_DMA_FROMDEVICE))
1426                         return -1;
1427
1428                 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1429
1430                 mwifiex_dbg(adapter, INFO,
1431                             "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1432                             skb_tmp, rd_index);
1433                 card->rx_buf_list[rd_index] = skb_tmp;
1434
1435                 if (reg->pfu_enabled) {
1436                         desc2 = card->rxbd_ring[rd_index];
1437                         desc2->paddr = buf_pa;
1438                         desc2->len = skb_tmp->len;
1439                         desc2->frag_len = skb_tmp->len;
1440                         desc2->offset = 0;
1441                         desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1442                 } else {
1443                         desc = card->rxbd_ring[rd_index];
1444                         desc->paddr = buf_pa;
1445                         desc->len = skb_tmp->len;
1446                         desc->flags = 0;
1447                 }
1448
1449                 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1450                                                         MWIFIEX_MAX_TXRX_BD) {
1451                         card->rxbd_rdptr = ((card->rxbd_rdptr &
1452                                              reg->rx_rollover_ind) ^
1453                                              reg->rx_rollover_ind);
1454                 }
1455                 mwifiex_dbg(adapter, DATA,
1456                             "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1457                             card->rxbd_rdptr, wrptr);
1458
1459                 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1460                 /* Write the RX ring read pointer in to reg->rx_rdptr */
1461                 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1462                                       card->rxbd_rdptr | tx_val)) {
1463                         mwifiex_dbg(adapter, DATA,
1464                                     "RECV DATA: failed to write reg->rx_rdptr\n");
1465                         ret = -1;
1466                         goto done;
1467                 }
1468
1469                 /* Read the RX ring Write pointer set by firmware */
1470                 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1471                         mwifiex_dbg(adapter, ERROR,
1472                                     "RECV DATA: failed to read reg->rx_wrptr\n");
1473                         ret = -1;
1474                         goto done;
1475                 }
1476                 mwifiex_dbg(adapter, DATA,
1477                             "info: RECV DATA: Rcvd packet from fw successfully\n");
1478                 card->rxbd_wrptr = wrptr;
1479         }
1480
1481 done:
1482         return ret;
1483 }
1484
1485 /*
1486  * This function downloads the boot command to device
1487  */
1488 static int
1489 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1490 {
1491         dma_addr_t buf_pa;
1492         struct pcie_service_card *card = adapter->card;
1493         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1494
1495         if (!(skb->data && skb->len)) {
1496                 mwifiex_dbg(adapter, ERROR,
1497                             "Invalid parameter in %s <%p. len %d>\n",
1498                             __func__, skb->data, skb->len);
1499                 return -1;
1500         }
1501
1502         if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1503                 return -1;
1504
1505         buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1506
1507         /* Write the lower 32bits of the physical address to low command
1508          * address scratch register
1509          */
1510         if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1511                 mwifiex_dbg(adapter, ERROR,
1512                             "%s: failed to write download command to boot code.\n",
1513                             __func__);
1514                 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1515                 return -1;
1516         }
1517
1518         /* Write the upper 32bits of the physical address to high command
1519          * address scratch register
1520          */
1521         if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1522                               (u32)((u64)buf_pa >> 32))) {
1523                 mwifiex_dbg(adapter, ERROR,
1524                             "%s: failed to write download command to boot code.\n",
1525                             __func__);
1526                 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1527                 return -1;
1528         }
1529
1530         /* Write the command length to cmd_size scratch register */
1531         if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1532                 mwifiex_dbg(adapter, ERROR,
1533                             "%s: failed to write command len to cmd_size scratch reg\n",
1534                             __func__);
1535                 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1536                 return -1;
1537         }
1538
1539         /* Ring the door bell */
1540         if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1541                               CPU_INTR_DOOR_BELL)) {
1542                 mwifiex_dbg(adapter, ERROR,
1543                             "%s: failed to assert door-bell intr\n", __func__);
1544                 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1545                 return -1;
1546         }
1547
1548         return 0;
1549 }
1550
1551 /* This function init rx port in firmware which in turn enables to receive data
1552  * from device before transmitting any packet.
1553  */
1554 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1555 {
1556         struct pcie_service_card *card = adapter->card;
1557         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1558         int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1559
1560         /* Write the RX ring read pointer in to reg->rx_rdptr */
1561         if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1562                               tx_wrap)) {
1563                 mwifiex_dbg(adapter, ERROR,
1564                             "RECV DATA: failed to write reg->rx_rdptr\n");
1565                 return -1;
1566         }
1567         return 0;
1568 }
1569
1570 /* This function downloads commands to the device
1571  */
1572 static int
1573 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1574 {
1575         struct pcie_service_card *card = adapter->card;
1576         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1577         int ret = 0;
1578         dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1579         u8 *payload = (u8 *)skb->data;
1580
1581         if (!(skb->data && skb->len)) {
1582                 mwifiex_dbg(adapter, ERROR,
1583                             "Invalid parameter in %s <%p, %#x>\n",
1584                             __func__, skb->data, skb->len);
1585                 return -1;
1586         }
1587
1588         /* Make sure a command response buffer is available */
1589         if (!card->cmdrsp_buf) {
1590                 mwifiex_dbg(adapter, ERROR,
1591                             "No response buffer available, send command failed\n");
1592                 return -EBUSY;
1593         }
1594
1595         if (!mwifiex_pcie_ok_to_access_hw(adapter))
1596                 mwifiex_pm_wakeup_card(adapter);
1597
1598         adapter->cmd_sent = true;
1599
1600         put_unaligned_le16((u16)skb->len, &payload[0]);
1601         put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
1602
1603         if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1604                 return -1;
1605
1606         card->cmd_buf = skb;
1607         /*
1608          * Need to keep a reference, since core driver might free up this
1609          * buffer before we've unmapped it.
1610          */
1611         skb_get(skb);
1612
1613         /* To send a command, the driver will:
1614                 1. Write the 64bit physical address of the data buffer to
1615                    cmd response address low  + cmd response address high
1616                 2. Ring the door bell (i.e. set the door bell interrupt)
1617
1618                 In response to door bell interrupt, the firmware will perform
1619                 the DMA of the command packet (first header to obtain the total
1620                 length and then rest of the command).
1621         */
1622
1623         if (card->cmdrsp_buf) {
1624                 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1625                 /* Write the lower 32bits of the cmdrsp buffer physical
1626                    address */
1627                 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1628                                       (u32)cmdrsp_buf_pa)) {
1629                         mwifiex_dbg(adapter, ERROR,
1630                                     "Failed to write download cmd to boot code.\n");
1631                         ret = -1;
1632                         goto done;
1633                 }
1634                 /* Write the upper 32bits of the cmdrsp buffer physical
1635                    address */
1636                 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1637                                       (u32)((u64)cmdrsp_buf_pa >> 32))) {
1638                         mwifiex_dbg(adapter, ERROR,
1639                                     "Failed to write download cmd to boot code.\n");
1640                         ret = -1;
1641                         goto done;
1642                 }
1643         }
1644
1645         cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1646         /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1647         if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1648                               (u32)cmd_buf_pa)) {
1649                 mwifiex_dbg(adapter, ERROR,
1650                             "Failed to write download cmd to boot code.\n");
1651                 ret = -1;
1652                 goto done;
1653         }
1654         /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1655         if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1656                               (u32)((u64)cmd_buf_pa >> 32))) {
1657                 mwifiex_dbg(adapter, ERROR,
1658                             "Failed to write download cmd to boot code.\n");
1659                 ret = -1;
1660                 goto done;
1661         }
1662
1663         /* Write the command length to reg->cmd_size */
1664         if (mwifiex_write_reg(adapter, reg->cmd_size,
1665                               card->cmd_buf->len)) {
1666                 mwifiex_dbg(adapter, ERROR,
1667                             "Failed to write cmd len to reg->cmd_size\n");
1668                 ret = -1;
1669                 goto done;
1670         }
1671
1672         /* Ring the door bell */
1673         if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1674                               CPU_INTR_DOOR_BELL)) {
1675                 mwifiex_dbg(adapter, ERROR,
1676                             "Failed to assert door-bell intr\n");
1677                 ret = -1;
1678                 goto done;
1679         }
1680
1681 done:
1682         if (ret)
1683                 adapter->cmd_sent = false;
1684
1685         return 0;
1686 }
1687
1688 /*
1689  * This function handles command complete interrupt
1690  */
1691 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1692 {
1693         struct pcie_service_card *card = adapter->card;
1694         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1695         struct sk_buff *skb = card->cmdrsp_buf;
1696         int count = 0;
1697         u16 rx_len;
1698
1699         mwifiex_dbg(adapter, CMD,
1700                     "info: Rx CMD Response\n");
1701
1702         if (adapter->curr_cmd)
1703                 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1704         else
1705                 pci_dma_sync_single_for_cpu(card->dev,
1706                                             MWIFIEX_SKB_DMA_ADDR(skb),
1707                                             MWIFIEX_UPLD_SIZE,
1708                                             PCI_DMA_FROMDEVICE);
1709
1710         /* Unmap the command as a response has been received. */
1711         if (card->cmd_buf) {
1712                 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1713                                          PCI_DMA_TODEVICE);
1714                 dev_kfree_skb_any(card->cmd_buf);
1715                 card->cmd_buf = NULL;
1716         }
1717
1718         rx_len = get_unaligned_le16(skb->data);
1719         skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1720         skb_trim(skb, rx_len);
1721
1722         if (!adapter->curr_cmd) {
1723                 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1724                         pci_dma_sync_single_for_device(card->dev,
1725                                                 MWIFIEX_SKB_DMA_ADDR(skb),
1726                                                 MWIFIEX_SLEEP_COOKIE_SIZE,
1727                                                 PCI_DMA_FROMDEVICE);
1728                         if (mwifiex_write_reg(adapter,
1729                                               PCIE_CPU_INT_EVENT,
1730                                               CPU_INTR_SLEEP_CFM_DONE)) {
1731                                 mwifiex_dbg(adapter, ERROR,
1732                                             "Write register failed\n");
1733                                 return -1;
1734                         }
1735                         mwifiex_delay_for_sleep_cookie(adapter,
1736                                                        MWIFIEX_MAX_DELAY_COUNT);
1737                         mwifiex_unmap_pci_memory(adapter, skb,
1738                                                  PCI_DMA_FROMDEVICE);
1739                         skb_pull(skb, INTF_HEADER_LEN);
1740                         while (reg->sleep_cookie && (count++ < 10) &&
1741                                mwifiex_pcie_ok_to_access_hw(adapter))
1742                                 usleep_range(50, 60);
1743                         mwifiex_pcie_enable_host_int(adapter);
1744                         mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1745                                                            skb->len);
1746                 } else {
1747                         mwifiex_dbg(adapter, ERROR,
1748                                     "There is no command but got cmdrsp\n");
1749                 }
1750                 memcpy(adapter->upld_buf, skb->data,
1751                        min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1752                 skb_push(skb, INTF_HEADER_LEN);
1753                 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1754                                            PCI_DMA_FROMDEVICE))
1755                         return -1;
1756         } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1757                 skb_pull(skb, INTF_HEADER_LEN);
1758                 adapter->curr_cmd->resp_skb = skb;
1759                 adapter->cmd_resp_received = true;
1760                 /* Take the pointer and set it to CMD node and will
1761                    return in the response complete callback */
1762                 card->cmdrsp_buf = NULL;
1763
1764                 /* Clear the cmd-rsp buffer address in scratch registers. This
1765                    will prevent firmware from writing to the same response
1766                    buffer again. */
1767                 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1768                         mwifiex_dbg(adapter, ERROR,
1769                                     "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1770                         return -1;
1771                 }
1772                 /* Write the upper 32bits of the cmdrsp buffer physical
1773                    address */
1774                 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1775                         mwifiex_dbg(adapter, ERROR,
1776                                     "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1777                         return -1;
1778                 }
1779         }
1780
1781         return 0;
1782 }
1783
1784 /*
1785  * Command Response processing complete handler
1786  */
1787 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1788                                         struct sk_buff *skb)
1789 {
1790         struct pcie_service_card *card = adapter->card;
1791
1792         if (skb) {
1793                 card->cmdrsp_buf = skb;
1794                 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1795                 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1796                                            PCI_DMA_FROMDEVICE))
1797                         return -1;
1798         }
1799
1800         return 0;
1801 }
1802
1803 /*
1804  * This function handles firmware event ready interrupt
1805  */
1806 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1807 {
1808         struct pcie_service_card *card = adapter->card;
1809         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1810         u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1811         u32 wrptr, event;
1812         struct mwifiex_evt_buf_desc *desc;
1813
1814         if (!mwifiex_pcie_ok_to_access_hw(adapter))
1815                 mwifiex_pm_wakeup_card(adapter);
1816
1817         if (adapter->event_received) {
1818                 mwifiex_dbg(adapter, EVENT,
1819                             "info: Event being processed,\t"
1820                             "do not process this interrupt just yet\n");
1821                 return 0;
1822         }
1823
1824         if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1825                 mwifiex_dbg(adapter, ERROR,
1826                             "info: Invalid read pointer...\n");
1827                 return -1;
1828         }
1829
1830         /* Read the event ring write pointer set by firmware */
1831         if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1832                 mwifiex_dbg(adapter, ERROR,
1833                             "EventReady: failed to read reg->evt_wrptr\n");
1834                 return -1;
1835         }
1836
1837         mwifiex_dbg(adapter, EVENT,
1838                     "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1839                     card->evtbd_rdptr, wrptr);
1840         if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1841                                               & MWIFIEX_EVTBD_MASK)) ||
1842             ((wrptr & reg->evt_rollover_ind) ==
1843              (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1844                 struct sk_buff *skb_cmd;
1845                 __le16 data_len = 0;
1846                 u16 evt_len;
1847
1848                 mwifiex_dbg(adapter, INFO,
1849                             "info: Read Index: %d\n", rdptr);
1850                 skb_cmd = card->evt_buf_list[rdptr];
1851                 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1852
1853                 /* Take the pointer and set it to event pointer in adapter
1854                    and will return back after event handling callback */
1855                 card->evt_buf_list[rdptr] = NULL;
1856                 desc = card->evtbd_ring[rdptr];
1857                 memset(desc, 0, sizeof(*desc));
1858
1859                 event = get_unaligned_le32(&skb_cmd->data[INTF_HEADER_LEN]);
1860                 adapter->event_cause = event;
1861                 /* The first 4bytes will be the event transfer header
1862                    len is 2 bytes followed by type which is 2 bytes */
1863                 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1864                 evt_len = le16_to_cpu(data_len);
1865                 skb_trim(skb_cmd, evt_len);
1866                 skb_pull(skb_cmd, INTF_HEADER_LEN);
1867                 mwifiex_dbg(adapter, EVENT,
1868                             "info: Event length: %d\n", evt_len);
1869
1870                 if ((evt_len > 0) && (evt_len  < MAX_EVENT_SIZE))
1871                         memcpy(adapter->event_body, skb_cmd->data +
1872                                MWIFIEX_EVENT_HEADER_LEN, evt_len -
1873                                MWIFIEX_EVENT_HEADER_LEN);
1874
1875                 adapter->event_received = true;
1876                 adapter->event_skb = skb_cmd;
1877
1878                 /* Do not update the event read pointer here, wait till the
1879                    buffer is released. This is just to make things simpler,
1880                    we need to find a better method of managing these buffers.
1881                 */
1882         } else {
1883                 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1884                                       CPU_INTR_EVENT_DONE)) {
1885                         mwifiex_dbg(adapter, ERROR,
1886                                     "Write register failed\n");
1887                         return -1;
1888                 }
1889         }
1890
1891         return 0;
1892 }
1893
1894 /*
1895  * Event processing complete handler
1896  */
1897 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1898                                        struct sk_buff *skb)
1899 {
1900         struct pcie_service_card *card = adapter->card;
1901         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1902         int ret = 0;
1903         u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1904         u32 wrptr;
1905         struct mwifiex_evt_buf_desc *desc;
1906
1907         if (!skb)
1908                 return 0;
1909
1910         if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1911                 mwifiex_dbg(adapter, ERROR,
1912                             "event_complete: Invalid rdptr 0x%x\n",
1913                             rdptr);
1914                 return -EINVAL;
1915         }
1916
1917         /* Read the event ring write pointer set by firmware */
1918         if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1919                 mwifiex_dbg(adapter, ERROR,
1920                             "event_complete: failed to read reg->evt_wrptr\n");
1921                 return -1;
1922         }
1923
1924         if (!card->evt_buf_list[rdptr]) {
1925                 skb_push(skb, INTF_HEADER_LEN);
1926                 skb_put(skb, MAX_EVENT_SIZE - skb->len);
1927                 if (mwifiex_map_pci_memory(adapter, skb,
1928                                            MAX_EVENT_SIZE,
1929                                            PCI_DMA_FROMDEVICE))
1930                         return -1;
1931                 card->evt_buf_list[rdptr] = skb;
1932                 desc = card->evtbd_ring[rdptr];
1933                 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1934                 desc->len = (u16)skb->len;
1935                 desc->flags = 0;
1936                 skb = NULL;
1937         } else {
1938                 mwifiex_dbg(adapter, ERROR,
1939                             "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1940                             rdptr, card->evt_buf_list[rdptr], skb);
1941         }
1942
1943         if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1944                 card->evtbd_rdptr = ((card->evtbd_rdptr &
1945                                         reg->evt_rollover_ind) ^
1946                                         reg->evt_rollover_ind);
1947         }
1948
1949         mwifiex_dbg(adapter, EVENT,
1950                     "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1951                     card->evtbd_rdptr, wrptr);
1952
1953         /* Write the event ring read pointer in to reg->evt_rdptr */
1954         if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1955                               card->evtbd_rdptr)) {
1956                 mwifiex_dbg(adapter, ERROR,
1957                             "event_complete: failed to read reg->evt_rdptr\n");
1958                 return -1;
1959         }
1960
1961         mwifiex_dbg(adapter, EVENT,
1962                     "info: Check Events Again\n");
1963         ret = mwifiex_pcie_process_event_ready(adapter);
1964
1965         return ret;
1966 }
1967
1968 /* Combo firmware image is a combination of
1969  * (1) combo crc heaer, start with CMD5
1970  * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1.
1971  * (3) wifi image.
1972  *
1973  * This function bypass the header and bluetooth part, return
1974  * the offset of tail wifi-only part.
1975  */
1976
1977 static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
1978                                    const void *firmware, u32 firmware_len) {
1979         const struct mwifiex_fw_data *fwdata;
1980         u32 offset = 0, data_len, dnld_cmd;
1981         int ret = 0;
1982         bool cmd7_before = false;
1983
1984         while (1) {
1985                 /* Check for integer and buffer overflow */
1986                 if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
1987                     offset + sizeof(fwdata->header) >= firmware_len) {
1988                         mwifiex_dbg(adapter, ERROR,
1989                                     "extract wifi-only fw failure!\n");
1990                         ret = -1;
1991                         goto done;
1992                 }
1993
1994                 fwdata = firmware + offset;
1995                 dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
1996                 data_len = le32_to_cpu(fwdata->header.data_length);
1997
1998                 /* Skip past header */
1999                 offset += sizeof(fwdata->header);
2000
2001                 switch (dnld_cmd) {
2002                 case MWIFIEX_FW_DNLD_CMD_1:
2003                         if (!cmd7_before) {
2004                                 mwifiex_dbg(adapter, ERROR,
2005                                             "no cmd7 before cmd1!\n");
2006                                 ret = -1;
2007                                 goto done;
2008                         }
2009                         if (offset + data_len < data_len) {
2010                                 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2011                                 ret = -1;
2012                                 goto done;
2013                         }
2014                         offset += data_len;
2015                         break;
2016                 case MWIFIEX_FW_DNLD_CMD_5:
2017                         /* Check for integer overflow */
2018                         if (offset + data_len < data_len) {
2019                                 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2020                                 ret = -1;
2021                                 goto done;
2022                         }
2023                         offset += data_len;
2024                         break;
2025                 case MWIFIEX_FW_DNLD_CMD_6:
2026                         /* Check for integer overflow */
2027                         if (offset + data_len < data_len) {
2028                                 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2029                                 ret = -1;
2030                                 goto done;
2031                         }
2032                         offset += data_len;
2033                         if (offset >= firmware_len) {
2034                                 mwifiex_dbg(adapter, ERROR,
2035                                             "extract wifi-only fw failure!\n");
2036                                 ret = -1;
2037                         } else {
2038                                 ret = offset;
2039                         }
2040                         goto done;
2041                 case MWIFIEX_FW_DNLD_CMD_7:
2042                         cmd7_before = true;
2043                         break;
2044                 default:
2045                         mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n",
2046                                     dnld_cmd);
2047                         ret = -1;
2048                         goto done;
2049                 }
2050         }
2051
2052 done:
2053         return ret;
2054 }
2055
2056 /*
2057  * This function downloads the firmware to the card.
2058  *
2059  * Firmware is downloaded to the card in blocks. Every block download
2060  * is tested for CRC errors, and retried a number of times before
2061  * returning failure.
2062  */
2063 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
2064                                     struct mwifiex_fw_image *fw)
2065 {
2066         int ret;
2067         u8 *firmware = fw->fw_buf;
2068         u32 firmware_len = fw->fw_len;
2069         u32 offset = 0;
2070         struct sk_buff *skb;
2071         u32 txlen, tx_blocks = 0, tries, len, val;
2072         u32 block_retry_cnt = 0;
2073         struct pcie_service_card *card = adapter->card;
2074         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2075
2076         if (!firmware || !firmware_len) {
2077                 mwifiex_dbg(adapter, ERROR,
2078                             "No firmware image found! Terminating download\n");
2079                 return -1;
2080         }
2081
2082         mwifiex_dbg(adapter, INFO,
2083                     "info: Downloading FW image (%d bytes)\n",
2084                     firmware_len);
2085
2086         if (mwifiex_pcie_disable_host_int(adapter)) {
2087                 mwifiex_dbg(adapter, ERROR,
2088                             "%s: Disabling interrupts failed.\n", __func__);
2089                 return -1;
2090         }
2091
2092         skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
2093         if (!skb) {
2094                 ret = -ENOMEM;
2095                 goto done;
2096         }
2097
2098         ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val);
2099         if (ret) {
2100                 mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n");
2101                 goto done;
2102         }
2103
2104         /* PCIE FLR case: extract wifi part from combo firmware*/
2105         if (val == MWIFIEX_PCIE_FLR_HAPPENS) {
2106                 ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len);
2107                 if (ret < 0) {
2108                         mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n");
2109                         goto done;
2110                 }
2111                 offset = ret;
2112                 mwifiex_dbg(adapter, MSG,
2113                             "info: dnld wifi firmware from %d bytes\n", offset);
2114         }
2115
2116         /* Perform firmware data transfer */
2117         do {
2118                 u32 ireg_intr = 0;
2119
2120                 /* More data? */
2121                 if (offset >= firmware_len)
2122                         break;
2123
2124                 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2125                         ret = mwifiex_read_reg(adapter, reg->cmd_size,
2126                                                &len);
2127                         if (ret) {
2128                                 mwifiex_dbg(adapter, FATAL,
2129                                             "Failed reading len from boot code\n");
2130                                 goto done;
2131                         }
2132                         if (len)
2133                                 break;
2134                         usleep_range(10, 20);
2135                 }
2136
2137                 if (!len) {
2138                         break;
2139                 } else if (len > MWIFIEX_UPLD_SIZE) {
2140                         mwifiex_dbg(adapter, ERROR,
2141                                     "FW download failure @ %d, invalid length %d\n",
2142                                     offset, len);
2143                         ret = -1;
2144                         goto done;
2145                 }
2146
2147                 txlen = len;
2148
2149                 if (len & BIT(0)) {
2150                         block_retry_cnt++;
2151                         if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
2152                                 mwifiex_dbg(adapter, ERROR,
2153                                             "FW download failure @ %d, over max\t"
2154                                             "retry count\n", offset);
2155                                 ret = -1;
2156                                 goto done;
2157                         }
2158                         mwifiex_dbg(adapter, ERROR,
2159                                     "FW CRC error indicated by the\t"
2160                                     "helper: len = 0x%04X, txlen = %d\n",
2161                                     len, txlen);
2162                         len &= ~BIT(0);
2163                         /* Setting this to 0 to resend from same offset */
2164                         txlen = 0;
2165                 } else {
2166                         block_retry_cnt = 0;
2167                         /* Set blocksize to transfer - checking for
2168                            last block */
2169                         if (firmware_len - offset < txlen)
2170                                 txlen = firmware_len - offset;
2171
2172                         tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
2173                                     card->pcie.blksz_fw_dl;
2174
2175                         /* Copy payload to buffer */
2176                         memmove(skb->data, &firmware[offset], txlen);
2177                 }
2178
2179                 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
2180                 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
2181
2182                 /* Send the boot command to device */
2183                 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
2184                         mwifiex_dbg(adapter, ERROR,
2185                                     "Failed to send firmware download command\n");
2186                         ret = -1;
2187                         goto done;
2188                 }
2189
2190                 /* Wait for the command done interrupt */
2191                 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2192                         if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
2193                                              &ireg_intr)) {
2194                                 mwifiex_dbg(adapter, ERROR,
2195                                             "%s: Failed to read\t"
2196                                             "interrupt status during fw dnld.\n",
2197                                             __func__);
2198                                 mwifiex_unmap_pci_memory(adapter, skb,
2199                                                          PCI_DMA_TODEVICE);
2200                                 ret = -1;
2201                                 goto done;
2202                         }
2203                         if (!(ireg_intr & CPU_INTR_DOOR_BELL))
2204                                 break;
2205                         usleep_range(10, 20);
2206                 }
2207                 if (ireg_intr & CPU_INTR_DOOR_BELL) {
2208                         mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
2209                                     __func__);
2210                         mwifiex_unmap_pci_memory(adapter, skb,
2211                                                  PCI_DMA_TODEVICE);
2212                         ret = -1;
2213                         goto done;
2214                 }
2215
2216                 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
2217
2218                 offset += txlen;
2219         } while (true);
2220
2221         mwifiex_dbg(adapter, MSG,
2222                     "info: FW download over, size %d bytes\n", offset);
2223
2224         ret = 0;
2225
2226 done:
2227         dev_kfree_skb_any(skb);
2228         return ret;
2229 }
2230
2231 /*
2232  * This function checks the firmware status in card.
2233  */
2234 static int
2235 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2236 {
2237         int ret = 0;
2238         u32 firmware_stat;
2239         struct pcie_service_card *card = adapter->card;
2240         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2241         u32 tries;
2242
2243         /* Mask spurios interrupts */
2244         if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2245                               HOST_INTR_MASK)) {
2246                 mwifiex_dbg(adapter, ERROR,
2247                             "Write register failed\n");
2248                 return -1;
2249         }
2250
2251         mwifiex_dbg(adapter, INFO,
2252                     "Setting driver ready signature\n");
2253         if (mwifiex_write_reg(adapter, reg->drv_rdy,
2254                               FIRMWARE_READY_PCIE)) {
2255                 mwifiex_dbg(adapter, ERROR,
2256                             "Failed to write driver ready signature\n");
2257                 return -1;
2258         }
2259
2260         /* Wait for firmware initialization event */
2261         for (tries = 0; tries < poll_num; tries++) {
2262                 if (mwifiex_read_reg(adapter, reg->fw_status,
2263                                      &firmware_stat))
2264                         ret = -1;
2265                 else
2266                         ret = 0;
2267
2268                 mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>",
2269                             tries, ret, firmware_stat);
2270
2271                 if (ret)
2272                         continue;
2273                 if (firmware_stat == FIRMWARE_READY_PCIE) {
2274                         ret = 0;
2275                         break;
2276                 } else {
2277                         msleep(100);
2278                         ret = -1;
2279                 }
2280         }
2281
2282         return ret;
2283 }
2284
2285 /* This function checks if WLAN is the winner.
2286  */
2287 static int
2288 mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
2289 {
2290         u32 winner = 0;
2291         int ret = 0;
2292         struct pcie_service_card *card = adapter->card;
2293         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2294
2295         if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) {
2296                 ret = -1;
2297         } else if (!winner) {
2298                 mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n");
2299                 adapter->winner = 1;
2300         } else {
2301                 mwifiex_dbg(adapter, ERROR,
2302                             "PCI-E is not the winner <%#x>", winner);
2303         }
2304
2305         return ret;
2306 }
2307
2308 /*
2309  * This function reads the interrupt status from card.
2310  */
2311 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
2312                                      int msg_id)
2313 {
2314         u32 pcie_ireg;
2315         unsigned long flags;
2316         struct pcie_service_card *card = adapter->card;
2317
2318         if (card->msi_enable) {
2319                 spin_lock_irqsave(&adapter->int_lock, flags);
2320                 adapter->int_status = 1;
2321                 spin_unlock_irqrestore(&adapter->int_lock, flags);
2322                 return;
2323         }
2324
2325         if (!mwifiex_pcie_ok_to_access_hw(adapter))
2326                 return;
2327
2328         if (card->msix_enable && msg_id >= 0) {
2329                 pcie_ireg = BIT(msg_id);
2330         } else {
2331                 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2332                                      &pcie_ireg)) {
2333                         mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2334                         return;
2335                 }
2336
2337                 if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg)
2338                         return;
2339
2340
2341                 mwifiex_pcie_disable_host_int(adapter);
2342
2343                 /* Clear the pending interrupts */
2344                 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2345                                       ~pcie_ireg)) {
2346                         mwifiex_dbg(adapter, ERROR,
2347                                     "Write register failed\n");
2348                         return;
2349                 }
2350         }
2351
2352         if (!adapter->pps_uapsd_mode &&
2353             adapter->ps_state == PS_STATE_SLEEP &&
2354             mwifiex_pcie_ok_to_access_hw(adapter)) {
2355                 /* Potentially for PCIe we could get other
2356                  * interrupts like shared. Don't change power
2357                  * state until cookie is set
2358                  */
2359                 adapter->ps_state = PS_STATE_AWAKE;
2360                 adapter->pm_wakeup_fw_try = false;
2361                 del_timer(&adapter->wakeup_timer);
2362         }
2363
2364         spin_lock_irqsave(&adapter->int_lock, flags);
2365         adapter->int_status |= pcie_ireg;
2366         spin_unlock_irqrestore(&adapter->int_lock, flags);
2367         mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
2368 }
2369
2370 /*
2371  * Interrupt handler for PCIe root port
2372  *
2373  * This function reads the interrupt status from firmware and assigns
2374  * the main process in workqueue which will handle the interrupt.
2375  */
2376 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2377 {
2378         struct mwifiex_msix_context *ctx = context;
2379         struct pci_dev *pdev = ctx->dev;
2380         struct pcie_service_card *card;
2381         struct mwifiex_adapter *adapter;
2382
2383         if (!pdev) {
2384                 pr_err("info: %s: pdev is NULL\n", __func__);
2385                 goto exit;
2386         }
2387
2388         card = pci_get_drvdata(pdev);
2389
2390         if (!card->adapter) {
2391                 pr_err("info: %s: card=%p adapter=%p\n", __func__, card,
2392                        card ? card->adapter : NULL);
2393                 goto exit;
2394         }
2395         adapter = card->adapter;
2396
2397         if (adapter->surprise_removed)
2398                 goto exit;
2399
2400         if (card->msix_enable)
2401                 mwifiex_interrupt_status(adapter, ctx->msg_id);
2402         else
2403                 mwifiex_interrupt_status(adapter, -1);
2404
2405         mwifiex_queue_main_work(adapter);
2406
2407 exit:
2408         return IRQ_HANDLED;
2409 }
2410
2411 /*
2412  * This function checks the current interrupt status.
2413  *
2414  * The following interrupts are checked and handled by this function -
2415  *      - Data sent
2416  *      - Command sent
2417  *      - Command received
2418  *      - Packets received
2419  *      - Events received
2420  *
2421  * In case of Rx packets received, the packets are uploaded from card to
2422  * host and processed accordingly.
2423  */
2424 static int mwifiex_process_pcie_int(struct mwifiex_adapter *adapter)
2425 {
2426         int ret;
2427         u32 pcie_ireg = 0;
2428         unsigned long flags;
2429         struct pcie_service_card *card = adapter->card;
2430
2431         spin_lock_irqsave(&adapter->int_lock, flags);
2432         if (!card->msi_enable) {
2433                 /* Clear out unused interrupts */
2434                 pcie_ireg = adapter->int_status;
2435         }
2436         adapter->int_status = 0;
2437         spin_unlock_irqrestore(&adapter->int_lock, flags);
2438
2439         if (card->msi_enable) {
2440                 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2441                         if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2442                                              &pcie_ireg)) {
2443                                 mwifiex_dbg(adapter, ERROR,
2444                                             "Read register failed\n");
2445                                 return -1;
2446                         }
2447
2448                         if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2449                                 if (mwifiex_write_reg(adapter,
2450                                                       PCIE_HOST_INT_STATUS,
2451                                                       ~pcie_ireg)) {
2452                                         mwifiex_dbg(adapter, ERROR,
2453                                                     "Write register failed\n");
2454                                         return -1;
2455                                 }
2456                                 if (!adapter->pps_uapsd_mode &&
2457                                     adapter->ps_state == PS_STATE_SLEEP) {
2458                                         adapter->ps_state = PS_STATE_AWAKE;
2459                                         adapter->pm_wakeup_fw_try = false;
2460                                         del_timer(&adapter->wakeup_timer);
2461                                 }
2462                         }
2463                 }
2464         }
2465
2466         if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2467                 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
2468                 mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n");
2469                 ret = mwifiex_pcie_send_data_complete(adapter);
2470                 if (ret)
2471                         return ret;
2472         }
2473         if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2474                 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
2475                 mwifiex_dbg(adapter, INTR, "info: Rx DATA\n");
2476                 ret = mwifiex_pcie_process_recv_data(adapter);
2477                 if (ret)
2478                         return ret;
2479         }
2480         if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2481                 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
2482                 mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n");
2483                 ret = mwifiex_pcie_process_event_ready(adapter);
2484                 if (ret)
2485                         return ret;
2486         }
2487         if (pcie_ireg & HOST_INTR_CMD_DONE) {
2488                 pcie_ireg &= ~HOST_INTR_CMD_DONE;
2489                 if (adapter->cmd_sent) {
2490                         mwifiex_dbg(adapter, INTR,
2491                                     "info: CMD sent Interrupt\n");
2492                         adapter->cmd_sent = false;
2493                 }
2494                 /* Handle command response */
2495                 ret = mwifiex_pcie_process_cmd_complete(adapter);
2496                 if (ret)
2497                         return ret;
2498         }
2499
2500         mwifiex_dbg(adapter, INTR,
2501                     "info: cmd_sent=%d data_sent=%d\n",
2502                     adapter->cmd_sent, adapter->data_sent);
2503         if (!card->msi_enable && adapter->ps_state != PS_STATE_SLEEP)
2504                 mwifiex_pcie_enable_host_int(adapter);
2505
2506         return 0;
2507 }
2508
2509 static int mwifiex_process_msix_int(struct mwifiex_adapter *adapter)
2510 {
2511         int ret;
2512         u32 pcie_ireg;
2513         unsigned long flags;
2514
2515         spin_lock_irqsave(&adapter->int_lock, flags);
2516         /* Clear out unused interrupts */
2517         pcie_ireg = adapter->int_status;
2518         adapter->int_status = 0;
2519         spin_unlock_irqrestore(&adapter->int_lock, flags);
2520
2521         if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2522                 mwifiex_dbg(adapter, INTR,
2523                             "info: TX DNLD Done\n");
2524                 ret = mwifiex_pcie_send_data_complete(adapter);
2525                 if (ret)
2526                         return ret;
2527         }
2528         if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2529                 mwifiex_dbg(adapter, INTR,
2530                             "info: Rx DATA\n");
2531                 ret = mwifiex_pcie_process_recv_data(adapter);
2532                 if (ret)
2533                         return ret;
2534         }
2535         if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2536                 mwifiex_dbg(adapter, INTR,
2537                             "info: Rx EVENT\n");
2538                 ret = mwifiex_pcie_process_event_ready(adapter);
2539                 if (ret)
2540                         return ret;
2541         }
2542
2543         if (pcie_ireg & HOST_INTR_CMD_DONE) {
2544                 if (adapter->cmd_sent) {
2545                         mwifiex_dbg(adapter, INTR,
2546                                     "info: CMD sent Interrupt\n");
2547                         adapter->cmd_sent = false;
2548                 }
2549                 /* Handle command response */
2550                 ret = mwifiex_pcie_process_cmd_complete(adapter);
2551                 if (ret)
2552                         return ret;
2553         }
2554
2555         mwifiex_dbg(adapter, INTR,
2556                     "info: cmd_sent=%d data_sent=%d\n",
2557                     adapter->cmd_sent, adapter->data_sent);
2558
2559         return 0;
2560 }
2561
2562 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2563 {
2564         struct pcie_service_card *card = adapter->card;
2565
2566         if (card->msix_enable)
2567                 return mwifiex_process_msix_int(adapter);
2568         else
2569                 return mwifiex_process_pcie_int(adapter);
2570 }
2571
2572 /*
2573  * This function downloads data from driver to card.
2574  *
2575  * Both commands and data packets are transferred to the card by this
2576  * function.
2577  *
2578  * This function adds the PCIE specific header to the front of the buffer
2579  * before transferring. The header contains the length of the packet and
2580  * the type. The firmware handles the packets based upon this set type.
2581  */
2582 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2583                                      struct sk_buff *skb,
2584                                      struct mwifiex_tx_param *tx_param)
2585 {
2586         if (!skb) {
2587                 mwifiex_dbg(adapter, ERROR,
2588                             "Passed NULL skb to %s\n", __func__);
2589                 return -1;
2590         }
2591
2592         if (type == MWIFIEX_TYPE_DATA)
2593                 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2594         else if (type == MWIFIEX_TYPE_CMD)
2595                 return mwifiex_pcie_send_cmd(adapter, skb);
2596
2597         return 0;
2598 }
2599
2600 /* Function to dump PCIE scratch registers in case of FW crash
2601  */
2602 static int
2603 mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
2604 {
2605         char *p = drv_buf;
2606         char buf[256], *ptr;
2607         int i;
2608         u32 value;
2609         struct pcie_service_card *card = adapter->card;
2610         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2611         int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
2612                                   PCIE_SCRATCH_14_REG,
2613                                   PCIE_SCRATCH_15_REG};
2614
2615         if (!p)
2616                 return 0;
2617
2618         mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
2619
2620         if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
2621                 mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
2622                 return 0;
2623         }
2624
2625         ptr = buf;
2626         mwifiex_dbg(adapter, MSG, "pcie scratch register:");
2627         for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
2628                 mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
2629                 ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
2630                                pcie_scratch_reg[i], value);
2631         }
2632
2633         mwifiex_dbg(adapter, MSG, "%s\n", buf);
2634         p += sprintf(p, "%s\n", buf);
2635
2636         mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
2637
2638         return p - drv_buf;
2639 }
2640
2641 /* This function read/write firmware */
2642 static enum rdwr_status
2643 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2644 {
2645         int ret, tries;
2646         u8 ctrl_data;
2647         u32 fw_status;
2648         struct pcie_service_card *card = adapter->card;
2649         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2650
2651         if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
2652                 return RDWR_STATUS_FAILURE;
2653
2654         ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2655                                 reg->fw_dump_host_ready);
2656         if (ret) {
2657                 mwifiex_dbg(adapter, ERROR,
2658                             "PCIE write err\n");
2659                 return RDWR_STATUS_FAILURE;
2660         }
2661
2662         for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2663                 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2664                 if (ctrl_data == FW_DUMP_DONE)
2665                         return RDWR_STATUS_SUCCESS;
2666                 if (doneflag && ctrl_data == doneflag)
2667                         return RDWR_STATUS_DONE;
2668                 if (ctrl_data != reg->fw_dump_host_ready) {
2669                         mwifiex_dbg(adapter, WARN,
2670                                     "The ctrl reg was changed, re-try again!\n");
2671                         ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2672                                                 reg->fw_dump_host_ready);
2673                         if (ret) {
2674                                 mwifiex_dbg(adapter, ERROR,
2675                                             "PCIE write err\n");
2676                                 return RDWR_STATUS_FAILURE;
2677                         }
2678                 }
2679                 usleep_range(100, 200);
2680         }
2681
2682         mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2683         return RDWR_STATUS_FAILURE;
2684 }
2685
2686 /* This function dump firmware memory to file */
2687 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2688 {
2689         struct pcie_service_card *card = adapter->card;
2690         const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2691         unsigned int reg, reg_start, reg_end;
2692         u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
2693         u8 idx, i, read_reg, doneflag = 0;
2694         enum rdwr_status stat;
2695         u32 memory_size;
2696         int ret;
2697
2698         if (!card->pcie.can_dump_fw)
2699                 return;
2700
2701         for (idx = 0; idx < adapter->num_mem_types; idx++) {
2702                 struct memory_type_mapping *entry =
2703                                 &adapter->mem_type_mapping_tbl[idx];
2704
2705                 if (entry->mem_ptr) {
2706                         vfree(entry->mem_ptr);
2707                         entry->mem_ptr = NULL;
2708                 }
2709                 entry->mem_size = 0;
2710         }
2711
2712         mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
2713
2714         /* Read the number of the memories which will dump */
2715         stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2716         if (stat == RDWR_STATUS_FAILURE)
2717                 return;
2718
2719         reg = creg->fw_dump_start;
2720         mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
2721
2722         /* W8997 chipset firmware dump will be restore in single region*/
2723         if (fw_dump_num == 0)
2724                 dump_num = 1;
2725         else
2726                 dump_num = fw_dump_num;
2727
2728         /* Read the length of every memory which will dump */
2729         for (idx = 0; idx < dump_num; idx++) {
2730                 struct memory_type_mapping *entry =
2731                                 &adapter->mem_type_mapping_tbl[idx];
2732                 memory_size = 0;
2733                 if (fw_dump_num != 0) {
2734                         stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2735                         if (stat == RDWR_STATUS_FAILURE)
2736                                 return;
2737
2738                         reg = creg->fw_dump_start;
2739                         for (i = 0; i < 4; i++) {
2740                                 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2741                                 memory_size |= (read_reg << (i * 8));
2742                                 reg++;
2743                         }
2744                 } else {
2745                         memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
2746                 }
2747
2748                 if (memory_size == 0) {
2749                         mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2750                         ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2751                                                 creg->fw_dump_read_done);
2752                         if (ret) {
2753                                 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2754                                 return;
2755                         }
2756                         break;
2757                 }
2758
2759                 mwifiex_dbg(adapter, DUMP,
2760                             "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2761                 entry->mem_ptr = vmalloc(memory_size + 1);
2762                 entry->mem_size = memory_size;
2763                 if (!entry->mem_ptr) {
2764                         mwifiex_dbg(adapter, ERROR,
2765                                     "Vmalloc %s failed\n", entry->mem_name);
2766                         return;
2767                 }
2768                 dbg_ptr = entry->mem_ptr;
2769                 end_ptr = dbg_ptr + memory_size;
2770
2771                 doneflag = entry->done_flag;
2772                 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2773                             entry->mem_name);
2774
2775                 do {
2776                         stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2777                         if (RDWR_STATUS_FAILURE == stat)
2778                                 return;
2779
2780                         reg_start = creg->fw_dump_start;
2781                         reg_end = creg->fw_dump_end;
2782                         for (reg = reg_start; reg <= reg_end; reg++) {
2783                                 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2784                                 if (dbg_ptr < end_ptr) {
2785                                         dbg_ptr++;
2786                                         continue;
2787                                 }
2788                                 mwifiex_dbg(adapter, ERROR,
2789                                             "pre-allocated buf not enough\n");
2790                                 tmp_ptr =
2791                                         vzalloc(memory_size + MWIFIEX_SIZE_4K);
2792                                 if (!tmp_ptr)
2793                                         return;
2794                                 memcpy(tmp_ptr, entry->mem_ptr, memory_size);
2795                                 vfree(entry->mem_ptr);
2796                                 entry->mem_ptr = tmp_ptr;
2797                                 tmp_ptr = NULL;
2798                                 dbg_ptr = entry->mem_ptr + memory_size;
2799                                 memory_size += MWIFIEX_SIZE_4K;
2800                                 end_ptr = entry->mem_ptr + memory_size;
2801                         }
2802
2803                         if (stat != RDWR_STATUS_DONE)
2804                                 continue;
2805
2806                         mwifiex_dbg(adapter, DUMP,
2807                                     "%s done: size=0x%tx\n",
2808                                     entry->mem_name, dbg_ptr - entry->mem_ptr);
2809                         break;
2810                 } while (true);
2811         }
2812         mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
2813 }
2814
2815 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2816 {
2817         int drv_info_size;
2818         void *drv_info;
2819
2820         drv_info_size = mwifiex_drv_info_dump(adapter, &drv_info);
2821         mwifiex_pcie_fw_dump(adapter);
2822         mwifiex_upload_device_dump(adapter, drv_info, drv_info_size);
2823 }
2824
2825 static void mwifiex_pcie_work(struct work_struct *work)
2826 {
2827         struct pcie_service_card *card =
2828                 container_of(work, struct pcie_service_card, work);
2829
2830         if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2831                                &card->work_flags))
2832                 mwifiex_pcie_device_dump_work(card->adapter);
2833 }
2834
2835 /* This function dumps FW information */
2836 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2837 {
2838         struct pcie_service_card *card = adapter->card;
2839
2840         if (test_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags))
2841                 return;
2842
2843         set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
2844
2845         schedule_work(&card->work);
2846 }
2847
2848 static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter)
2849 {
2850         struct pcie_service_card *card = adapter->card;
2851         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2852
2853         if (reg->sleep_cookie)
2854                 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2855
2856         mwifiex_pcie_delete_cmdrsp_buf(adapter);
2857         mwifiex_pcie_delete_evtbd_ring(adapter);
2858         mwifiex_pcie_delete_rxbd_ring(adapter);
2859         mwifiex_pcie_delete_txbd_ring(adapter);
2860         card->cmdrsp_buf = NULL;
2861 }
2862
2863 /*
2864  * This function initializes the PCI-E host memory space, WCB rings, etc.
2865  *
2866  * The following initializations steps are followed -
2867  *      - Allocate TXBD ring buffers
2868  *      - Allocate RXBD ring buffers
2869  *      - Allocate event BD ring buffers
2870  *      - Allocate command response ring buffer
2871  *      - Allocate sleep cookie buffer
2872  */
2873 static int mwifiex_init_pcie(struct mwifiex_adapter *adapter)
2874 {
2875         struct pcie_service_card *card = adapter->card;
2876         int ret;
2877         struct pci_dev *pdev = card->dev;
2878         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2879
2880         pci_set_drvdata(pdev, card);
2881
2882         ret = pci_enable_device(pdev);
2883         if (ret)
2884                 goto err_enable_dev;
2885
2886         pci_set_master(pdev);
2887
2888         pr_notice("try set_consistent_dma_mask(32)\n");
2889         ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2890         if (ret) {
2891                 pr_err("set_dma_mask(32) failed\n");
2892                 goto err_set_dma_mask;
2893         }
2894
2895         ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2896         if (ret) {
2897                 pr_err("set_consistent_dma_mask(64) failed\n");
2898                 goto err_set_dma_mask;
2899         }
2900
2901         ret = pci_request_region(pdev, 0, DRV_NAME);
2902         if (ret) {
2903                 pr_err("req_reg(0) error\n");
2904                 goto err_req_region0;
2905         }
2906         card->pci_mmap = pci_iomap(pdev, 0, 0);
2907         if (!card->pci_mmap) {
2908                 pr_err("iomap(0) error\n");
2909                 ret = -EIO;
2910                 goto err_iomap0;
2911         }
2912         ret = pci_request_region(pdev, 2, DRV_NAME);
2913         if (ret) {
2914                 pr_err("req_reg(2) error\n");
2915                 goto err_req_region2;
2916         }
2917         card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2918         if (!card->pci_mmap1) {
2919                 pr_err("iomap(2) error\n");
2920                 ret = -EIO;
2921                 goto err_iomap2;
2922         }
2923
2924         pr_notice("PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2925                   card->pci_mmap, card->pci_mmap1);
2926
2927         card->cmdrsp_buf = NULL;
2928         ret = mwifiex_pcie_create_txbd_ring(adapter);
2929         if (ret)
2930                 goto err_cre_txbd;
2931         ret = mwifiex_pcie_create_rxbd_ring(adapter);
2932         if (ret)
2933                 goto err_cre_rxbd;
2934         ret = mwifiex_pcie_create_evtbd_ring(adapter);
2935         if (ret)
2936                 goto err_cre_evtbd;
2937         ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2938         if (ret)
2939                 goto err_alloc_cmdbuf;
2940         if (reg->sleep_cookie) {
2941                 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2942                 if (ret)
2943                         goto err_alloc_cookie;
2944         } else {
2945                 card->sleep_cookie_vbase = NULL;
2946         }
2947         return ret;
2948
2949 err_alloc_cookie:
2950         mwifiex_pcie_delete_cmdrsp_buf(adapter);
2951 err_alloc_cmdbuf:
2952         mwifiex_pcie_delete_evtbd_ring(adapter);
2953 err_cre_evtbd:
2954         mwifiex_pcie_delete_rxbd_ring(adapter);
2955 err_cre_rxbd:
2956         mwifiex_pcie_delete_txbd_ring(adapter);
2957 err_cre_txbd:
2958         pci_iounmap(pdev, card->pci_mmap1);
2959 err_iomap2:
2960         pci_release_region(pdev, 2);
2961 err_req_region2:
2962         pci_iounmap(pdev, card->pci_mmap);
2963 err_iomap0:
2964         pci_release_region(pdev, 0);
2965 err_req_region0:
2966 err_set_dma_mask:
2967         pci_disable_device(pdev);
2968 err_enable_dev:
2969         return ret;
2970 }
2971
2972 /*
2973  * This function cleans up the allocated card buffers.
2974  */
2975 static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter)
2976 {
2977         struct pcie_service_card *card = adapter->card;
2978         struct pci_dev *pdev = card->dev;
2979         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2980         int ret;
2981         u32 fw_status;
2982
2983         cancel_work_sync(&card->work);
2984
2985         ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
2986         if (fw_status == FIRMWARE_READY_PCIE) {
2987                 mwifiex_dbg(adapter, INFO,
2988                             "Clearing driver ready signature\n");
2989                 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
2990                         mwifiex_dbg(adapter, ERROR,
2991                                     "Failed to write driver not-ready signature\n");
2992         }
2993
2994         mwifiex_pcie_free_buffers(adapter);
2995
2996         if (pdev) {
2997                 pci_iounmap(pdev, card->pci_mmap);
2998                 pci_iounmap(pdev, card->pci_mmap1);
2999                 pci_disable_device(pdev);
3000                 pci_release_region(pdev, 2);
3001                 pci_release_region(pdev, 0);
3002         }
3003 }
3004
3005 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
3006 {
3007         int ret, i, j;
3008         struct pcie_service_card *card = adapter->card;
3009         struct pci_dev *pdev = card->dev;
3010
3011         if (card->pcie.reg->msix_support) {
3012                 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3013                         card->msix_entries[i].entry = i;
3014                 ret = pci_enable_msix_exact(pdev, card->msix_entries,
3015                                             MWIFIEX_NUM_MSIX_VECTORS);
3016                 if (!ret) {
3017                         for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) {
3018                                 card->msix_ctx[i].dev = pdev;
3019                                 card->msix_ctx[i].msg_id = i;
3020
3021                                 ret = request_irq(card->msix_entries[i].vector,
3022                                                   mwifiex_pcie_interrupt, 0,
3023                                                   "MWIFIEX_PCIE_MSIX",
3024                                                   &card->msix_ctx[i]);
3025                                 if (ret)
3026                                         break;
3027                         }
3028
3029                         if (ret) {
3030                                 mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n",
3031                                             ret);
3032                                 for (j = 0; j < i; j++)
3033                                         free_irq(card->msix_entries[j].vector,
3034                                                  &card->msix_ctx[i]);
3035                                 pci_disable_msix(pdev);
3036                         } else {
3037                                 mwifiex_dbg(adapter, MSG, "MSIx enabled!");
3038                                 card->msix_enable = 1;
3039                                 return 0;
3040                         }
3041                 }
3042         }
3043
3044         if (pci_enable_msi(pdev) != 0)
3045                 pci_disable_msi(pdev);
3046         else
3047                 card->msi_enable = 1;
3048
3049         mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
3050
3051         card->share_irq_ctx.dev = pdev;
3052         card->share_irq_ctx.msg_id = -1;
3053         ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
3054                           "MRVL_PCIE", &card->share_irq_ctx);
3055         if (ret) {
3056                 pr_err("request_irq failed: ret=%d\n", ret);
3057                 return -1;
3058         }
3059
3060         return 0;
3061 }
3062
3063 /*
3064  * This function gets the firmware name for downloading by revision id
3065  *
3066  * Read revision id register to get revision id
3067  */
3068 static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter)
3069 {
3070         int revision_id = 0;
3071         int version, magic;
3072         struct pcie_service_card *card = adapter->card;
3073
3074         switch (card->dev->device) {
3075         case PCIE_DEVICE_ID_MARVELL_88W8766P:
3076                 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
3077                 break;
3078         case PCIE_DEVICE_ID_MARVELL_88W8897:
3079                 mwifiex_write_reg(adapter, 0x0c58, 0x80c00000);
3080                 mwifiex_read_reg(adapter, 0x0c58, &revision_id);
3081                 revision_id &= 0xff00;
3082                 switch (revision_id) {
3083                 case PCIE8897_A0:
3084                         strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME);
3085                         break;
3086                 case PCIE8897_B0:
3087                         strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME);
3088                         break;
3089                 default:
3090                         strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME);
3091
3092                         break;
3093                 }
3094                 break;
3095         case PCIE_DEVICE_ID_MARVELL_88W8997:
3096                 mwifiex_read_reg(adapter, 0x8, &revision_id);
3097                 mwifiex_read_reg(adapter, 0x0cd0, &version);
3098                 mwifiex_read_reg(adapter, 0x0cd4, &magic);
3099                 revision_id &= 0xff;
3100                 version &= 0x7;
3101                 magic &= 0xff;
3102                 if (revision_id == PCIE8997_A1 &&
3103                     magic == CHIP_MAGIC_VALUE &&
3104                     version == CHIP_VER_PCIEUART)
3105                         strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4);
3106                 else
3107                         strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4);
3108                 break;
3109         default:
3110                 break;
3111         }
3112 }
3113
3114 /*
3115  * This function registers the PCIE device.
3116  *
3117  * PCIE IRQ is claimed, block size is set and driver data is initialized.
3118  */
3119 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
3120 {
3121         struct pcie_service_card *card = adapter->card;
3122
3123         /* save adapter pointer in card */
3124         card->adapter = adapter;
3125
3126         if (mwifiex_pcie_request_irq(adapter))
3127                 return -1;
3128
3129         adapter->tx_buf_size = card->pcie.tx_buf_size;
3130         adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
3131         adapter->num_mem_types = card->pcie.num_mem_types;
3132         adapter->ext_scan = card->pcie.can_ext_scan;
3133         mwifiex_pcie_get_fw_name(adapter);
3134
3135         return 0;
3136 }
3137
3138 /*
3139  * This function unregisters the PCIE device.
3140  *
3141  * The PCIE IRQ is released, the function is disabled and driver
3142  * data is set to null.
3143  */
3144 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
3145 {
3146         struct pcie_service_card *card = adapter->card;
3147         struct pci_dev *pdev = card->dev;
3148         int i;
3149
3150         if (card->msix_enable) {
3151                 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3152                         synchronize_irq(card->msix_entries[i].vector);
3153
3154                 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3155                         free_irq(card->msix_entries[i].vector,
3156                                  &card->msix_ctx[i]);
3157
3158                 card->msix_enable = 0;
3159                 pci_disable_msix(pdev);
3160         } else {
3161                 mwifiex_dbg(adapter, INFO,
3162                             "%s(): calling free_irq()\n", __func__);
3163                free_irq(card->dev->irq, &card->share_irq_ctx);
3164
3165                 if (card->msi_enable)
3166                         pci_disable_msi(pdev);
3167         }
3168         card->adapter = NULL;
3169 }
3170
3171 /* This function initializes the PCI-E host memory space, WCB rings, etc.
3172  *
3173  * The following initializations steps are followed -
3174  *      - Allocate TXBD ring buffers
3175  *      - Allocate RXBD ring buffers
3176  *      - Allocate event BD ring buffers
3177  *      - Allocate command response ring buffer
3178  *      - Allocate sleep cookie buffer
3179  * Part of mwifiex_init_pcie(), not reset the PCIE registers
3180  */
3181 static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter)
3182 {
3183         struct pcie_service_card *card = adapter->card;
3184         int ret;
3185         struct pci_dev *pdev = card->dev;
3186         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3187
3188         /* tx_buf_size might be changed to 3584 by firmware during
3189          * data transfer, we should reset it to default size.
3190          */
3191         adapter->tx_buf_size = card->pcie.tx_buf_size;
3192
3193         card->cmdrsp_buf = NULL;
3194         ret = mwifiex_pcie_create_txbd_ring(adapter);
3195         if (ret) {
3196                 mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n");
3197                 goto err_cre_txbd;
3198         }
3199
3200         ret = mwifiex_pcie_create_rxbd_ring(adapter);
3201         if (ret) {
3202                 mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n");
3203                 goto err_cre_rxbd;
3204         }
3205
3206         ret = mwifiex_pcie_create_evtbd_ring(adapter);
3207         if (ret) {
3208                 mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n");
3209                 goto err_cre_evtbd;
3210         }
3211
3212         ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
3213         if (ret) {
3214                 mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n");
3215                 goto err_alloc_cmdbuf;
3216         }
3217
3218         if (reg->sleep_cookie) {
3219                 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
3220                 if (ret) {
3221                         mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n");
3222                         goto err_alloc_cookie;
3223                 }
3224         } else {
3225                 card->sleep_cookie_vbase = NULL;
3226         }
3227         return;
3228
3229 err_alloc_cookie:
3230         mwifiex_pcie_delete_cmdrsp_buf(adapter);
3231 err_alloc_cmdbuf:
3232         mwifiex_pcie_delete_evtbd_ring(adapter);
3233 err_cre_evtbd:
3234         mwifiex_pcie_delete_rxbd_ring(adapter);
3235 err_cre_rxbd:
3236         mwifiex_pcie_delete_txbd_ring(adapter);
3237 err_cre_txbd:
3238         pci_iounmap(pdev, card->pci_mmap1);
3239 }
3240
3241 /* This function cleans up the PCI-E host memory space. */
3242 static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter)
3243 {
3244         struct pcie_service_card *card = adapter->card;
3245         const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3246
3247         if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3248                 mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n");
3249
3250         adapter->seq_num = 0;
3251
3252         mwifiex_pcie_free_buffers(adapter);
3253 }
3254
3255 static struct mwifiex_if_ops pcie_ops = {
3256         .init_if =                      mwifiex_init_pcie,
3257         .cleanup_if =                   mwifiex_cleanup_pcie,
3258         .check_fw_status =              mwifiex_check_fw_status,
3259         .check_winner_status =          mwifiex_check_winner_status,
3260         .prog_fw =                      mwifiex_prog_fw_w_helper,
3261         .register_dev =                 mwifiex_register_dev,
3262         .unregister_dev =               mwifiex_unregister_dev,
3263         .enable_int =                   mwifiex_pcie_enable_host_int,
3264         .disable_int =                  mwifiex_pcie_disable_host_int_noerr,
3265         .process_int_status =           mwifiex_process_int_status,
3266         .host_to_card =                 mwifiex_pcie_host_to_card,
3267         .wakeup =                       mwifiex_pm_wakeup_card,
3268         .wakeup_complete =              mwifiex_pm_wakeup_card_complete,
3269
3270         /* PCIE specific */
3271         .cmdrsp_complete =              mwifiex_pcie_cmdrsp_complete,
3272         .event_complete =               mwifiex_pcie_event_complete,
3273         .update_mp_end_port =           NULL,
3274         .cleanup_mpa_buf =              NULL,
3275         .init_fw_port =                 mwifiex_pcie_init_fw_port,
3276         .clean_pcie_ring =              mwifiex_clean_pcie_ring_buf,
3277         .reg_dump =                     mwifiex_pcie_reg_dump,
3278         .device_dump =                  mwifiex_pcie_device_dump,
3279         .down_dev =                     mwifiex_pcie_down_dev,
3280         .up_dev =                       mwifiex_pcie_up_dev,
3281 };
3282
3283 module_pci_driver(mwifiex_pcie);
3284
3285 MODULE_AUTHOR("Marvell International Ltd.");
3286 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
3287 MODULE_VERSION(PCIE_VERSION);
3288 MODULE_LICENSE("GPL v2");