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