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