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