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