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