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