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