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