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