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