mm/zsmalloc: allocate exactly size of struct zs_pool
[linux/fpc-iii.git] / drivers / net / wireless / mwifiex / pcie.c
blobc3a20f94f3c99f86fbbfdc6b23faba01b54ee5e5
1 /*
2 * Marvell Wireless LAN device driver: PCIE specific handling
4 * Copyright (C) 2011-2014, Marvell International Ltd.
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.
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.
20 #include <linux/firmware.h>
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"
31 #define PCIE_VERSION "1.0"
32 #define DRV_NAME "Marvell mwifiex PCIe"
34 static u8 user_rmmod;
36 static struct mwifiex_if_ops pcie_ops;
38 static struct semaphore add_remove_card_sem;
40 static 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},
51 static int
52 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
53 size_t size, int flags)
55 struct pcie_service_card *card = adapter->card;
56 struct mwifiex_dma_mapping mapping;
58 mapping.addr = pci_map_single(card->dev, skb->data, size, flags);
59 if (pci_dma_mapping_error(card->dev, mapping.addr)) {
60 dev_err(adapter->dev, "failed to map pci memory!\n");
61 return -1;
63 mapping.len = size;
64 mwifiex_store_mapping(skb, &mapping);
65 return 0;
68 static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter,
69 struct sk_buff *skb, int flags)
71 struct pcie_service_card *card = adapter->card;
72 struct mwifiex_dma_mapping mapping;
74 mwifiex_get_mapping(skb, &mapping);
75 pci_unmap_single(card->dev, mapping.addr, mapping.len, flags);
79 * This function reads sleep cookie and checks if FW is ready
81 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
83 u32 *cookie_addr;
84 struct pcie_service_card *card = adapter->card;
85 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
87 if (!reg->sleep_cookie)
88 return true;
90 if (card->sleep_cookie_vbase) {
91 cookie_addr = (u32 *)card->sleep_cookie_vbase;
92 dev_dbg(adapter->dev, "info: ACCESS_HW: sleep cookie=0x%x\n",
93 *cookie_addr);
94 if (*cookie_addr == FW_AWAKE_COOKIE)
95 return true;
98 return false;
101 #ifdef CONFIG_PM_SLEEP
103 * Kernel needs to suspend all functions separately. Therefore all
104 * registered functions must have drivers with suspend and resume
105 * methods. Failing that the kernel simply removes the whole card.
107 * If already not suspended, this function allocates and sends a host
108 * sleep activate request to the firmware and turns off the traffic.
110 static int mwifiex_pcie_suspend(struct device *dev)
112 struct mwifiex_adapter *adapter;
113 struct pcie_service_card *card;
114 int hs_actived;
115 struct pci_dev *pdev = to_pci_dev(dev);
117 if (pdev) {
118 card = pci_get_drvdata(pdev);
119 if (!card || !card->adapter) {
120 pr_err("Card or adapter structure is not valid\n");
121 return 0;
123 } else {
124 pr_err("PCIE device is not specified\n");
125 return 0;
128 adapter = card->adapter;
130 hs_actived = mwifiex_enable_hs(adapter);
132 /* Indicate device suspended */
133 adapter->is_suspended = true;
134 adapter->hs_enabling = false;
136 return 0;
140 * Kernel needs to suspend all functions separately. Therefore all
141 * registered functions must have drivers with suspend and resume
142 * methods. Failing that the kernel simply removes the whole card.
144 * If already not resumed, this function turns on the traffic and
145 * sends a host sleep cancel request to the firmware.
147 static int mwifiex_pcie_resume(struct device *dev)
149 struct mwifiex_adapter *adapter;
150 struct pcie_service_card *card;
151 struct pci_dev *pdev = to_pci_dev(dev);
153 if (pdev) {
154 card = pci_get_drvdata(pdev);
155 if (!card || !card->adapter) {
156 pr_err("Card or adapter structure is not valid\n");
157 return 0;
159 } else {
160 pr_err("PCIE device is not specified\n");
161 return 0;
164 adapter = card->adapter;
166 if (!adapter->is_suspended) {
167 dev_warn(adapter->dev, "Device already resumed\n");
168 return 0;
171 adapter->is_suspended = false;
173 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
174 MWIFIEX_ASYNC_CMD);
176 return 0;
178 #endif
181 * This function probes an mwifiex device and registers it. It allocates
182 * the card structure, enables PCIE function number and initiates the
183 * device registration and initialization procedure by adding a logical
184 * interface.
186 static int mwifiex_pcie_probe(struct pci_dev *pdev,
187 const struct pci_device_id *ent)
189 struct pcie_service_card *card;
191 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
192 pdev->vendor, pdev->device, pdev->revision);
194 card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
195 if (!card)
196 return -ENOMEM;
198 card->dev = pdev;
200 if (ent->driver_data) {
201 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
202 card->pcie.firmware = data->firmware;
203 card->pcie.reg = data->reg;
204 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
205 card->pcie.tx_buf_size = data->tx_buf_size;
206 card->pcie.supports_fw_dump = data->supports_fw_dump;
209 if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
210 MWIFIEX_PCIE)) {
211 pr_err("%s failed\n", __func__);
212 kfree(card);
213 return -1;
216 return 0;
220 * This function removes the interface and frees up the card structure.
222 static void mwifiex_pcie_remove(struct pci_dev *pdev)
224 struct pcie_service_card *card;
225 struct mwifiex_adapter *adapter;
226 struct mwifiex_private *priv;
228 card = pci_get_drvdata(pdev);
229 if (!card)
230 return;
232 adapter = card->adapter;
233 if (!adapter || !adapter->priv_num)
234 return;
236 cancel_work_sync(&adapter->iface_work);
238 if (user_rmmod) {
239 #ifdef CONFIG_PM_SLEEP
240 if (adapter->is_suspended)
241 mwifiex_pcie_resume(&pdev->dev);
242 #endif
244 mwifiex_deauthenticate_all(adapter);
246 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
248 mwifiex_disable_auto_ds(priv);
250 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
253 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
256 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
258 user_rmmod = 1;
259 mwifiex_pcie_remove(pdev);
261 return;
264 static const struct pci_device_id mwifiex_ids[] = {
266 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
267 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
268 .driver_data = (unsigned long) &mwifiex_pcie8766,
271 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
272 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
273 .driver_data = (unsigned long) &mwifiex_pcie8897,
278 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
280 #ifdef CONFIG_PM_SLEEP
281 /* Power Management Hooks */
282 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
283 mwifiex_pcie_resume);
284 #endif
286 /* PCI Device Driver */
287 static struct pci_driver __refdata mwifiex_pcie = {
288 .name = "mwifiex_pcie",
289 .id_table = mwifiex_ids,
290 .probe = mwifiex_pcie_probe,
291 .remove = mwifiex_pcie_remove,
292 #ifdef CONFIG_PM_SLEEP
293 .driver = {
294 .pm = &mwifiex_pcie_pm_ops,
296 #endif
297 .shutdown = mwifiex_pcie_shutdown,
301 * This function writes data into PCIE card register.
303 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
305 struct pcie_service_card *card = adapter->card;
307 iowrite32(data, card->pci_mmap1 + reg);
309 return 0;
313 * This function reads data from PCIE card register.
315 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
317 struct pcie_service_card *card = adapter->card;
319 *data = ioread32(card->pci_mmap1 + reg);
321 return 0;
324 /* This function reads u8 data from PCIE card register. */
325 static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter,
326 int reg, u8 *data)
328 struct pcie_service_card *card = adapter->card;
330 *data = ioread8(card->pci_mmap1 + reg);
332 return 0;
336 * This function adds delay loop to ensure FW is awake before proceeding.
338 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
340 int i = 0;
342 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
343 i++;
344 usleep_range(10, 20);
345 /* 50ms max wait */
346 if (i == 5000)
347 break;
350 return;
353 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
354 u32 max_delay_loop_cnt)
356 struct pcie_service_card *card = adapter->card;
357 u8 *buffer;
358 u32 sleep_cookie, count;
360 for (count = 0; count < max_delay_loop_cnt; count++) {
361 buffer = card->cmdrsp_buf->data - INTF_HEADER_LEN;
362 sleep_cookie = *(u32 *)buffer;
364 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
365 dev_dbg(adapter->dev,
366 "sleep cookie found at count %d\n", count);
367 break;
369 usleep_range(20, 30);
372 if (count >= max_delay_loop_cnt)
373 dev_dbg(adapter->dev,
374 "max count reached while accessing sleep cookie\n");
377 /* This function wakes up the card by reading fw_status register. */
378 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
380 u32 fw_status;
381 struct pcie_service_card *card = adapter->card;
382 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
384 dev_dbg(adapter->dev, "event: Wakeup device...\n");
386 if (reg->sleep_cookie)
387 mwifiex_pcie_dev_wakeup_delay(adapter);
389 /* Reading fw_status register will wakeup device */
390 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status)) {
391 dev_warn(adapter->dev, "Reading fw_status register failed\n");
392 return -1;
395 if (reg->sleep_cookie) {
396 mwifiex_pcie_dev_wakeup_delay(adapter);
397 dev_dbg(adapter->dev, "PCIE wakeup: Setting PS_STATE_AWAKE\n");
398 adapter->ps_state = PS_STATE_AWAKE;
401 return 0;
405 * This function is called after the card has woken up.
407 * The card configuration register is reset.
409 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
411 dev_dbg(adapter->dev, "cmd: Wakeup device completed\n");
413 return 0;
417 * This function disables the host interrupt.
419 * The host interrupt mask is read, the disable bit is reset and
420 * written back to the card host interrupt mask register.
422 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
424 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
425 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
426 0x00000000)) {
427 dev_warn(adapter->dev, "Disable host interrupt failed\n");
428 return -1;
432 return 0;
436 * This function enables the host interrupt.
438 * The host interrupt enable mask is written to the card
439 * host interrupt mask register.
441 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
443 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
444 /* Simply write the mask to the register */
445 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
446 HOST_INTR_MASK)) {
447 dev_warn(adapter->dev, "Enable host interrupt failed\n");
448 return -1;
452 return 0;
456 * This function initializes TX buffer ring descriptors
458 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
460 struct pcie_service_card *card = adapter->card;
461 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
462 struct mwifiex_pcie_buf_desc *desc;
463 struct mwifiex_pfu_buf_desc *desc2;
464 int i;
466 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
467 card->tx_buf_list[i] = NULL;
468 if (reg->pfu_enabled) {
469 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
470 (sizeof(*desc2) * i);
471 desc2 = card->txbd_ring[i];
472 memset(desc2, 0, sizeof(*desc2));
473 } else {
474 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
475 (sizeof(*desc) * i);
476 desc = card->txbd_ring[i];
477 memset(desc, 0, sizeof(*desc));
481 return 0;
484 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
485 * here and after mapping PCI memory, its physical address is assigned to
486 * PCIE Rx buffer descriptor's physical address.
488 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
490 struct pcie_service_card *card = adapter->card;
491 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
492 struct sk_buff *skb;
493 struct mwifiex_pcie_buf_desc *desc;
494 struct mwifiex_pfu_buf_desc *desc2;
495 dma_addr_t buf_pa;
496 int i;
498 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
499 /* Allocate skb here so that firmware can DMA data from it */
500 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
501 if (!skb) {
502 dev_err(adapter->dev,
503 "Unable to allocate skb for RX ring.\n");
504 kfree(card->rxbd_ring_vbase);
505 return -ENOMEM;
508 if (mwifiex_map_pci_memory(adapter, skb,
509 MWIFIEX_RX_DATA_BUF_SIZE,
510 PCI_DMA_FROMDEVICE))
511 return -1;
513 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
515 dev_dbg(adapter->dev,
516 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
517 skb, skb->len, skb->data, (u32)buf_pa,
518 (u32)((u64)buf_pa >> 32));
520 card->rx_buf_list[i] = skb;
521 if (reg->pfu_enabled) {
522 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
523 (sizeof(*desc2) * i);
524 desc2 = card->rxbd_ring[i];
525 desc2->paddr = buf_pa;
526 desc2->len = (u16)skb->len;
527 desc2->frag_len = (u16)skb->len;
528 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
529 desc2->offset = 0;
530 } else {
531 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
532 (sizeof(*desc) * i));
533 desc = card->rxbd_ring[i];
534 desc->paddr = buf_pa;
535 desc->len = (u16)skb->len;
536 desc->flags = 0;
540 return 0;
543 /* This function initializes event buffer ring descriptors. Each SKB is
544 * allocated here and after mapping PCI memory, its physical address is assigned
545 * to PCIE Rx buffer descriptor's physical address
547 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
549 struct pcie_service_card *card = adapter->card;
550 struct mwifiex_evt_buf_desc *desc;
551 struct sk_buff *skb;
552 dma_addr_t buf_pa;
553 int i;
555 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
556 /* Allocate skb here so that firmware can DMA data from it */
557 skb = dev_alloc_skb(MAX_EVENT_SIZE);
558 if (!skb) {
559 dev_err(adapter->dev,
560 "Unable to allocate skb for EVENT buf.\n");
561 kfree(card->evtbd_ring_vbase);
562 return -ENOMEM;
564 skb_put(skb, MAX_EVENT_SIZE);
566 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
567 PCI_DMA_FROMDEVICE))
568 return -1;
570 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
572 dev_dbg(adapter->dev,
573 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
574 skb, skb->len, skb->data, (u32)buf_pa,
575 (u32)((u64)buf_pa >> 32));
577 card->evt_buf_list[i] = skb;
578 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
579 (sizeof(*desc) * i));
580 desc = card->evtbd_ring[i];
581 desc->paddr = buf_pa;
582 desc->len = (u16)skb->len;
583 desc->flags = 0;
586 return 0;
589 /* This function cleans up TX buffer rings. If any of the buffer list has valid
590 * SKB address, associated SKB is freed.
592 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
594 struct pcie_service_card *card = adapter->card;
595 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
596 struct sk_buff *skb;
597 struct mwifiex_pcie_buf_desc *desc;
598 struct mwifiex_pfu_buf_desc *desc2;
599 int i;
601 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
602 if (reg->pfu_enabled) {
603 desc2 = card->txbd_ring[i];
604 if (card->tx_buf_list[i]) {
605 skb = card->tx_buf_list[i];
606 mwifiex_unmap_pci_memory(adapter, skb,
607 PCI_DMA_TODEVICE);
608 dev_kfree_skb_any(skb);
610 memset(desc2, 0, sizeof(*desc2));
611 } else {
612 desc = card->txbd_ring[i];
613 if (card->tx_buf_list[i]) {
614 skb = card->tx_buf_list[i];
615 mwifiex_unmap_pci_memory(adapter, skb,
616 PCI_DMA_TODEVICE);
617 dev_kfree_skb_any(skb);
619 memset(desc, 0, sizeof(*desc));
621 card->tx_buf_list[i] = NULL;
624 return;
627 /* This function cleans up RX buffer rings. If any of the buffer list has valid
628 * SKB address, associated SKB is freed.
630 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
632 struct pcie_service_card *card = adapter->card;
633 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
634 struct mwifiex_pcie_buf_desc *desc;
635 struct mwifiex_pfu_buf_desc *desc2;
636 struct sk_buff *skb;
637 int i;
639 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
640 if (reg->pfu_enabled) {
641 desc2 = card->rxbd_ring[i];
642 if (card->rx_buf_list[i]) {
643 skb = card->rx_buf_list[i];
644 mwifiex_unmap_pci_memory(adapter, skb,
645 PCI_DMA_FROMDEVICE);
646 dev_kfree_skb_any(skb);
648 memset(desc2, 0, sizeof(*desc2));
649 } else {
650 desc = card->rxbd_ring[i];
651 if (card->rx_buf_list[i]) {
652 skb = card->rx_buf_list[i];
653 mwifiex_unmap_pci_memory(adapter, skb,
654 PCI_DMA_FROMDEVICE);
655 dev_kfree_skb_any(skb);
657 memset(desc, 0, sizeof(*desc));
659 card->rx_buf_list[i] = NULL;
662 return;
665 /* This function cleans up event buffer rings. If any of the buffer list has
666 * valid SKB address, associated SKB is freed.
668 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
670 struct pcie_service_card *card = adapter->card;
671 struct mwifiex_evt_buf_desc *desc;
672 struct sk_buff *skb;
673 int i;
675 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
676 desc = card->evtbd_ring[i];
677 if (card->evt_buf_list[i]) {
678 skb = card->evt_buf_list[i];
679 mwifiex_unmap_pci_memory(adapter, skb,
680 PCI_DMA_FROMDEVICE);
681 dev_kfree_skb_any(skb);
683 card->evt_buf_list[i] = NULL;
684 memset(desc, 0, sizeof(*desc));
687 return;
690 /* This function creates buffer descriptor ring for TX
692 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
694 struct pcie_service_card *card = adapter->card;
695 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
698 * driver maintaines the write pointer and firmware maintaines the read
699 * pointer. The write pointer starts at 0 (zero) while the read pointer
700 * starts at zero with rollover bit set
702 card->txbd_wrptr = 0;
704 if (reg->pfu_enabled)
705 card->txbd_rdptr = 0;
706 else
707 card->txbd_rdptr |= reg->tx_rollover_ind;
709 /* allocate shared memory for the BD ring and divide the same in to
710 several descriptors */
711 if (reg->pfu_enabled)
712 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
713 MWIFIEX_MAX_TXRX_BD;
714 else
715 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
716 MWIFIEX_MAX_TXRX_BD;
718 dev_dbg(adapter->dev, "info: txbd_ring: Allocating %d bytes\n",
719 card->txbd_ring_size);
720 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
721 card->txbd_ring_size,
722 &card->txbd_ring_pbase);
723 if (!card->txbd_ring_vbase) {
724 dev_err(adapter->dev,
725 "allocate consistent memory (%d bytes) failed!\n",
726 card->txbd_ring_size);
727 return -ENOMEM;
729 dev_dbg(adapter->dev,
730 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
731 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
732 (u32)((u64)card->txbd_ring_pbase >> 32), card->txbd_ring_size);
734 return mwifiex_init_txq_ring(adapter);
737 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
739 struct pcie_service_card *card = adapter->card;
740 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
742 mwifiex_cleanup_txq_ring(adapter);
744 if (card->txbd_ring_vbase)
745 pci_free_consistent(card->dev, card->txbd_ring_size,
746 card->txbd_ring_vbase,
747 card->txbd_ring_pbase);
748 card->txbd_ring_size = 0;
749 card->txbd_wrptr = 0;
750 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
751 card->txbd_ring_vbase = NULL;
752 card->txbd_ring_pbase = 0;
754 return 0;
758 * This function creates buffer descriptor ring for RX
760 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
762 struct pcie_service_card *card = adapter->card;
763 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
766 * driver maintaines the read pointer and firmware maintaines the write
767 * pointer. The write pointer starts at 0 (zero) while the read pointer
768 * starts at zero with rollover bit set
770 card->rxbd_wrptr = 0;
771 card->rxbd_rdptr = reg->rx_rollover_ind;
773 if (reg->pfu_enabled)
774 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
775 MWIFIEX_MAX_TXRX_BD;
776 else
777 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
778 MWIFIEX_MAX_TXRX_BD;
780 dev_dbg(adapter->dev, "info: rxbd_ring: Allocating %d bytes\n",
781 card->rxbd_ring_size);
782 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
783 card->rxbd_ring_size,
784 &card->rxbd_ring_pbase);
785 if (!card->rxbd_ring_vbase) {
786 dev_err(adapter->dev,
787 "allocate consistent memory (%d bytes) failed!\n",
788 card->rxbd_ring_size);
789 return -ENOMEM;
792 dev_dbg(adapter->dev,
793 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
794 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
795 (u32)((u64)card->rxbd_ring_pbase >> 32),
796 card->rxbd_ring_size);
798 return mwifiex_init_rxq_ring(adapter);
802 * This function deletes Buffer descriptor ring for RX
804 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
806 struct pcie_service_card *card = adapter->card;
807 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
809 mwifiex_cleanup_rxq_ring(adapter);
811 if (card->rxbd_ring_vbase)
812 pci_free_consistent(card->dev, card->rxbd_ring_size,
813 card->rxbd_ring_vbase,
814 card->rxbd_ring_pbase);
815 card->rxbd_ring_size = 0;
816 card->rxbd_wrptr = 0;
817 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
818 card->rxbd_ring_vbase = NULL;
819 card->rxbd_ring_pbase = 0;
821 return 0;
825 * This function creates buffer descriptor ring for Events
827 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
829 struct pcie_service_card *card = adapter->card;
830 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
833 * driver maintaines the read pointer and firmware maintaines the write
834 * pointer. The write pointer starts at 0 (zero) while the read pointer
835 * starts at zero with rollover bit set
837 card->evtbd_wrptr = 0;
838 card->evtbd_rdptr = reg->evt_rollover_ind;
840 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
841 MWIFIEX_MAX_EVT_BD;
843 dev_dbg(adapter->dev, "info: evtbd_ring: Allocating %d bytes\n",
844 card->evtbd_ring_size);
845 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
846 card->evtbd_ring_size,
847 &card->evtbd_ring_pbase);
848 if (!card->evtbd_ring_vbase) {
849 dev_err(adapter->dev,
850 "allocate consistent memory (%d bytes) failed!\n",
851 card->evtbd_ring_size);
852 return -ENOMEM;
855 dev_dbg(adapter->dev,
856 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
857 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
858 (u32)((u64)card->evtbd_ring_pbase >> 32),
859 card->evtbd_ring_size);
861 return mwifiex_pcie_init_evt_ring(adapter);
865 * This function deletes Buffer descriptor ring for Events
867 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
869 struct pcie_service_card *card = adapter->card;
870 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
872 mwifiex_cleanup_evt_ring(adapter);
874 if (card->evtbd_ring_vbase)
875 pci_free_consistent(card->dev, card->evtbd_ring_size,
876 card->evtbd_ring_vbase,
877 card->evtbd_ring_pbase);
878 card->evtbd_wrptr = 0;
879 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
880 card->evtbd_ring_size = 0;
881 card->evtbd_ring_vbase = NULL;
882 card->evtbd_ring_pbase = 0;
884 return 0;
888 * This function allocates a buffer for CMDRSP
890 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
892 struct pcie_service_card *card = adapter->card;
893 struct sk_buff *skb;
895 /* Allocate memory for receiving command response data */
896 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
897 if (!skb) {
898 dev_err(adapter->dev,
899 "Unable to allocate skb for command response data.\n");
900 return -ENOMEM;
902 skb_put(skb, MWIFIEX_UPLD_SIZE);
903 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
904 PCI_DMA_FROMDEVICE))
905 return -1;
907 card->cmdrsp_buf = skb;
909 return 0;
913 * This function deletes a buffer for CMDRSP
915 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
917 struct pcie_service_card *card;
919 if (!adapter)
920 return 0;
922 card = adapter->card;
924 if (card && card->cmdrsp_buf) {
925 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
926 PCI_DMA_FROMDEVICE);
927 dev_kfree_skb_any(card->cmdrsp_buf);
930 if (card && card->cmd_buf) {
931 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
932 PCI_DMA_TODEVICE);
934 return 0;
938 * This function allocates a buffer for sleep cookie
940 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
942 struct pcie_service_card *card = adapter->card;
944 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
945 &card->sleep_cookie_pbase);
946 if (!card->sleep_cookie_vbase) {
947 dev_err(adapter->dev, "pci_alloc_consistent failed!\n");
948 return -ENOMEM;
950 /* Init val of Sleep Cookie */
951 *(u32 *)card->sleep_cookie_vbase = FW_AWAKE_COOKIE;
953 dev_dbg(adapter->dev, "alloc_scook: sleep cookie=0x%x\n",
954 *((u32 *)card->sleep_cookie_vbase));
956 return 0;
960 * This function deletes buffer for sleep cookie
962 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
964 struct pcie_service_card *card;
966 if (!adapter)
967 return 0;
969 card = adapter->card;
971 if (card && card->sleep_cookie_vbase) {
972 pci_free_consistent(card->dev, sizeof(u32),
973 card->sleep_cookie_vbase,
974 card->sleep_cookie_pbase);
975 card->sleep_cookie_vbase = NULL;
978 return 0;
981 /* This function flushes the TX buffer descriptor ring
982 * This function defined as handler is also called while cleaning TXRX
983 * during disconnect/ bss stop.
985 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
987 struct pcie_service_card *card = adapter->card;
989 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
990 card->txbd_flush = 1;
991 /* write pointer already set at last send
992 * send dnld-rdy intr again, wait for completion.
994 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
995 CPU_INTR_DNLD_RDY)) {
996 dev_err(adapter->dev,
997 "failed to assert dnld-rdy interrupt.\n");
998 return -1;
1001 return 0;
1005 * This function unmaps and frees downloaded data buffer
1007 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1009 struct sk_buff *skb;
1010 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1011 struct mwifiex_pcie_buf_desc *desc;
1012 struct mwifiex_pfu_buf_desc *desc2;
1013 struct pcie_service_card *card = adapter->card;
1014 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1016 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1017 mwifiex_pm_wakeup_card(adapter);
1019 /* Read the TX ring read pointer set by firmware */
1020 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1021 dev_err(adapter->dev,
1022 "SEND COMP: failed to read reg->tx_rdptr\n");
1023 return -1;
1026 dev_dbg(adapter->dev, "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1027 card->txbd_rdptr, rdptr);
1029 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1030 /* free from previous txbd_rdptr to current txbd_rdptr */
1031 while (((card->txbd_rdptr & reg->tx_mask) !=
1032 (rdptr & reg->tx_mask)) ||
1033 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1034 (rdptr & reg->tx_rollover_ind))) {
1035 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1036 reg->tx_start_ptr;
1038 skb = card->tx_buf_list[wrdoneidx];
1040 if (skb) {
1041 dev_dbg(adapter->dev,
1042 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1043 skb, wrdoneidx);
1044 mwifiex_unmap_pci_memory(adapter, skb,
1045 PCI_DMA_TODEVICE);
1047 unmap_count++;
1049 if (card->txbd_flush)
1050 mwifiex_write_data_complete(adapter, skb, 0,
1051 -1);
1052 else
1053 mwifiex_write_data_complete(adapter, skb, 0, 0);
1056 card->tx_buf_list[wrdoneidx] = NULL;
1058 if (reg->pfu_enabled) {
1059 desc2 = card->txbd_ring[wrdoneidx];
1060 memset(desc2, 0, sizeof(*desc2));
1061 } else {
1062 desc = card->txbd_ring[wrdoneidx];
1063 memset(desc, 0, sizeof(*desc));
1065 switch (card->dev->device) {
1066 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1067 card->txbd_rdptr++;
1068 break;
1069 case PCIE_DEVICE_ID_MARVELL_88W8897:
1070 card->txbd_rdptr += reg->ring_tx_start_ptr;
1071 break;
1075 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1076 card->txbd_rdptr = ((card->txbd_rdptr &
1077 reg->tx_rollover_ind) ^
1078 reg->tx_rollover_ind);
1081 if (unmap_count)
1082 adapter->data_sent = false;
1084 if (card->txbd_flush) {
1085 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1086 card->txbd_flush = 0;
1087 else
1088 mwifiex_clean_pcie_ring_buf(adapter);
1091 return 0;
1094 /* This function sends data buffer to device. First 4 bytes of payload
1095 * are filled with payload length and payload type. Then this payload
1096 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1097 * Download ready interrupt to FW is deffered if Tx ring is not full and
1098 * additional payload can be accomodated.
1099 * Caller must ensure tx_param parameter to this function is not NULL.
1101 static int
1102 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1103 struct mwifiex_tx_param *tx_param)
1105 struct pcie_service_card *card = adapter->card;
1106 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1107 u32 wrindx, num_tx_buffs, rx_val;
1108 int ret;
1109 dma_addr_t buf_pa;
1110 struct mwifiex_pcie_buf_desc *desc = NULL;
1111 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1112 __le16 *tmp;
1114 if (!(skb->data && skb->len)) {
1115 dev_err(adapter->dev, "%s(): invalid parameter <%p, %#x>\n",
1116 __func__, skb->data, skb->len);
1117 return -1;
1120 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1121 mwifiex_pm_wakeup_card(adapter);
1123 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1124 dev_dbg(adapter->dev, "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1125 card->txbd_rdptr, card->txbd_wrptr);
1126 if (mwifiex_pcie_txbd_not_full(card)) {
1127 u8 *payload;
1129 adapter->data_sent = true;
1130 payload = skb->data;
1131 tmp = (__le16 *)&payload[0];
1132 *tmp = cpu_to_le16((u16)skb->len);
1133 tmp = (__le16 *)&payload[2];
1134 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
1136 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1137 PCI_DMA_TODEVICE))
1138 return -1;
1140 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1141 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1142 card->tx_buf_list[wrindx] = skb;
1144 if (reg->pfu_enabled) {
1145 desc2 = card->txbd_ring[wrindx];
1146 desc2->paddr = buf_pa;
1147 desc2->len = (u16)skb->len;
1148 desc2->frag_len = (u16)skb->len;
1149 desc2->offset = 0;
1150 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1151 MWIFIEX_BD_FLAG_LAST_DESC;
1152 } else {
1153 desc = card->txbd_ring[wrindx];
1154 desc->paddr = buf_pa;
1155 desc->len = (u16)skb->len;
1156 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1157 MWIFIEX_BD_FLAG_LAST_DESC;
1160 switch (card->dev->device) {
1161 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1162 card->txbd_wrptr++;
1163 break;
1164 case PCIE_DEVICE_ID_MARVELL_88W8897:
1165 card->txbd_wrptr += reg->ring_tx_start_ptr;
1166 break;
1169 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1170 card->txbd_wrptr = ((card->txbd_wrptr &
1171 reg->tx_rollover_ind) ^
1172 reg->tx_rollover_ind);
1174 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1175 /* Write the TX ring write pointer in to reg->tx_wrptr */
1176 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1177 card->txbd_wrptr | rx_val)) {
1178 dev_err(adapter->dev,
1179 "SEND DATA: failed to write reg->tx_wrptr\n");
1180 ret = -1;
1181 goto done_unmap;
1183 if ((mwifiex_pcie_txbd_not_full(card)) &&
1184 tx_param->next_pkt_len) {
1185 /* have more packets and TxBD still can hold more */
1186 dev_dbg(adapter->dev,
1187 "SEND DATA: delay dnld-rdy interrupt.\n");
1188 adapter->data_sent = false;
1189 } else {
1190 /* Send the TX ready interrupt */
1191 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1192 CPU_INTR_DNLD_RDY)) {
1193 dev_err(adapter->dev,
1194 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1195 ret = -1;
1196 goto done_unmap;
1199 dev_dbg(adapter->dev, "info: SEND DATA: Updated <Rd: %#x, Wr: "
1200 "%#x> and sent packet to firmware successfully\n",
1201 card->txbd_rdptr, card->txbd_wrptr);
1202 } else {
1203 dev_dbg(adapter->dev,
1204 "info: TX Ring full, can't send packets to fw\n");
1205 adapter->data_sent = true;
1206 /* Send the TX ready interrupt */
1207 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1208 CPU_INTR_DNLD_RDY))
1209 dev_err(adapter->dev,
1210 "SEND DATA: failed to assert door-bell intr\n");
1211 return -EBUSY;
1214 return -EINPROGRESS;
1215 done_unmap:
1216 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1217 card->tx_buf_list[wrindx] = NULL;
1218 if (reg->pfu_enabled)
1219 memset(desc2, 0, sizeof(*desc2));
1220 else
1221 memset(desc, 0, sizeof(*desc));
1223 return ret;
1227 * This function handles received buffer ring and
1228 * dispatches packets to upper
1230 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1232 struct pcie_service_card *card = adapter->card;
1233 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1234 u32 wrptr, rd_index, tx_val;
1235 dma_addr_t buf_pa;
1236 int ret = 0;
1237 struct sk_buff *skb_tmp = NULL;
1238 struct mwifiex_pcie_buf_desc *desc;
1239 struct mwifiex_pfu_buf_desc *desc2;
1241 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1242 mwifiex_pm_wakeup_card(adapter);
1244 /* Read the RX ring Write pointer set by firmware */
1245 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1246 dev_err(adapter->dev,
1247 "RECV DATA: failed to read reg->rx_wrptr\n");
1248 ret = -1;
1249 goto done;
1251 card->rxbd_wrptr = wrptr;
1253 while (((wrptr & reg->rx_mask) !=
1254 (card->rxbd_rdptr & reg->rx_mask)) ||
1255 ((wrptr & reg->rx_rollover_ind) ==
1256 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1257 struct sk_buff *skb_data;
1258 u16 rx_len;
1259 __le16 pkt_len;
1261 rd_index = card->rxbd_rdptr & reg->rx_mask;
1262 skb_data = card->rx_buf_list[rd_index];
1264 /* If skb allocation was failed earlier for Rx packet,
1265 * rx_buf_list[rd_index] would have been left with a NULL.
1267 if (!skb_data)
1268 return -ENOMEM;
1270 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1271 card->rx_buf_list[rd_index] = NULL;
1273 /* Get data length from interface header -
1274 * first 2 bytes for len, next 2 bytes is for type
1276 pkt_len = *((__le16 *)skb_data->data);
1277 rx_len = le16_to_cpu(pkt_len);
1278 if (WARN_ON(rx_len <= INTF_HEADER_LEN ||
1279 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1280 dev_err(adapter->dev,
1281 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1282 rx_len, card->rxbd_rdptr, wrptr);
1283 dev_kfree_skb_any(skb_data);
1284 } else {
1285 skb_put(skb_data, rx_len);
1286 dev_dbg(adapter->dev,
1287 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1288 card->rxbd_rdptr, wrptr, rx_len);
1289 skb_pull(skb_data, INTF_HEADER_LEN);
1290 if (adapter->rx_work_enabled) {
1291 skb_queue_tail(&adapter->rx_data_q, skb_data);
1292 adapter->data_received = true;
1293 atomic_inc(&adapter->rx_pending);
1294 } else {
1295 mwifiex_handle_rx_packet(adapter, skb_data);
1299 skb_tmp = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
1300 if (!skb_tmp) {
1301 dev_err(adapter->dev,
1302 "Unable to allocate skb.\n");
1303 return -ENOMEM;
1306 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1307 MWIFIEX_RX_DATA_BUF_SIZE,
1308 PCI_DMA_FROMDEVICE))
1309 return -1;
1311 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1313 dev_dbg(adapter->dev,
1314 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1315 skb_tmp, rd_index);
1316 card->rx_buf_list[rd_index] = skb_tmp;
1318 if (reg->pfu_enabled) {
1319 desc2 = card->rxbd_ring[rd_index];
1320 desc2->paddr = buf_pa;
1321 desc2->len = skb_tmp->len;
1322 desc2->frag_len = skb_tmp->len;
1323 desc2->offset = 0;
1324 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1325 } else {
1326 desc = card->rxbd_ring[rd_index];
1327 desc->paddr = buf_pa;
1328 desc->len = skb_tmp->len;
1329 desc->flags = 0;
1332 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1333 MWIFIEX_MAX_TXRX_BD) {
1334 card->rxbd_rdptr = ((card->rxbd_rdptr &
1335 reg->rx_rollover_ind) ^
1336 reg->rx_rollover_ind);
1338 dev_dbg(adapter->dev, "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1339 card->rxbd_rdptr, wrptr);
1341 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1342 /* Write the RX ring read pointer in to reg->rx_rdptr */
1343 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1344 card->rxbd_rdptr | tx_val)) {
1345 dev_err(adapter->dev,
1346 "RECV DATA: failed to write reg->rx_rdptr\n");
1347 ret = -1;
1348 goto done;
1351 /* Read the RX ring Write pointer set by firmware */
1352 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1353 dev_err(adapter->dev,
1354 "RECV DATA: failed to read reg->rx_wrptr\n");
1355 ret = -1;
1356 goto done;
1358 dev_dbg(adapter->dev,
1359 "info: RECV DATA: Rcvd packet from fw successfully\n");
1360 card->rxbd_wrptr = wrptr;
1363 done:
1364 return ret;
1368 * This function downloads the boot command to device
1370 static int
1371 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1373 dma_addr_t buf_pa;
1374 struct pcie_service_card *card = adapter->card;
1375 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1377 if (!(skb->data && skb->len)) {
1378 dev_err(adapter->dev,
1379 "Invalid parameter in %s <%p. len %d>\n",
1380 __func__, skb->data, skb->len);
1381 return -1;
1384 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE))
1385 return -1;
1387 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1389 /* Write the lower 32bits of the physical address to low command
1390 * address scratch register
1392 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1393 dev_err(adapter->dev,
1394 "%s: failed to write download command to boot code.\n",
1395 __func__);
1396 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1397 return -1;
1400 /* Write the upper 32bits of the physical address to high command
1401 * address scratch register
1403 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1404 (u32)((u64)buf_pa >> 32))) {
1405 dev_err(adapter->dev,
1406 "%s: failed to write download command to boot code.\n",
1407 __func__);
1408 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1409 return -1;
1412 /* Write the command length to cmd_size scratch register */
1413 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1414 dev_err(adapter->dev,
1415 "%s: failed to write command len to cmd_size scratch reg\n",
1416 __func__);
1417 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1418 return -1;
1421 /* Ring the door bell */
1422 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1423 CPU_INTR_DOOR_BELL)) {
1424 dev_err(adapter->dev,
1425 "%s: failed to assert door-bell intr\n", __func__);
1426 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1427 return -1;
1430 return 0;
1433 /* This function init rx port in firmware which in turn enables to receive data
1434 * from device before transmitting any packet.
1436 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1438 struct pcie_service_card *card = adapter->card;
1439 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1440 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1442 /* Write the RX ring read pointer in to reg->rx_rdptr */
1443 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1444 tx_wrap)) {
1445 dev_err(adapter->dev,
1446 "RECV DATA: failed to write reg->rx_rdptr\n");
1447 return -1;
1449 return 0;
1452 /* This function downloads commands to the device
1454 static int
1455 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1457 struct pcie_service_card *card = adapter->card;
1458 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1459 int ret = 0;
1460 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1461 u8 *payload = (u8 *)skb->data;
1463 if (!(skb->data && skb->len)) {
1464 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
1465 __func__, skb->data, skb->len);
1466 return -1;
1469 /* Make sure a command response buffer is available */
1470 if (!card->cmdrsp_buf) {
1471 dev_err(adapter->dev,
1472 "No response buffer available, send command failed\n");
1473 return -EBUSY;
1476 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1477 mwifiex_pm_wakeup_card(adapter);
1479 adapter->cmd_sent = true;
1481 *(__le16 *)&payload[0] = cpu_to_le16((u16)skb->len);
1482 *(__le16 *)&payload[2] = cpu_to_le16(MWIFIEX_TYPE_CMD);
1484 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1485 return -1;
1487 card->cmd_buf = skb;
1489 /* To send a command, the driver will:
1490 1. Write the 64bit physical address of the data buffer to
1491 cmd response address low + cmd response address high
1492 2. Ring the door bell (i.e. set the door bell interrupt)
1494 In response to door bell interrupt, the firmware will perform
1495 the DMA of the command packet (first header to obtain the total
1496 length and then rest of the command).
1499 if (card->cmdrsp_buf) {
1500 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1501 /* Write the lower 32bits of the cmdrsp buffer physical
1502 address */
1503 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1504 (u32)cmdrsp_buf_pa)) {
1505 dev_err(adapter->dev,
1506 "Failed to write download cmd to boot code.\n");
1507 ret = -1;
1508 goto done;
1510 /* Write the upper 32bits of the cmdrsp buffer physical
1511 address */
1512 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1513 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1514 dev_err(adapter->dev,
1515 "Failed to write download cmd to boot code.\n");
1516 ret = -1;
1517 goto done;
1521 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1522 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1523 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1524 (u32)cmd_buf_pa)) {
1525 dev_err(adapter->dev,
1526 "Failed to write download cmd to boot code.\n");
1527 ret = -1;
1528 goto done;
1530 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1531 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1532 (u32)((u64)cmd_buf_pa >> 32))) {
1533 dev_err(adapter->dev,
1534 "Failed to write download cmd to boot code.\n");
1535 ret = -1;
1536 goto done;
1539 /* Write the command length to reg->cmd_size */
1540 if (mwifiex_write_reg(adapter, reg->cmd_size,
1541 card->cmd_buf->len)) {
1542 dev_err(adapter->dev,
1543 "Failed to write cmd len to reg->cmd_size\n");
1544 ret = -1;
1545 goto done;
1548 /* Ring the door bell */
1549 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1550 CPU_INTR_DOOR_BELL)) {
1551 dev_err(adapter->dev,
1552 "Failed to assert door-bell intr\n");
1553 ret = -1;
1554 goto done;
1557 done:
1558 if (ret)
1559 adapter->cmd_sent = false;
1561 return 0;
1565 * This function handles command complete interrupt
1567 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1569 struct pcie_service_card *card = adapter->card;
1570 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1571 struct sk_buff *skb = card->cmdrsp_buf;
1572 int count = 0;
1573 u16 rx_len;
1574 __le16 pkt_len;
1576 dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1578 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1580 /* Unmap the command as a response has been received. */
1581 if (card->cmd_buf) {
1582 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1583 PCI_DMA_TODEVICE);
1584 card->cmd_buf = NULL;
1587 pkt_len = *((__le16 *)skb->data);
1588 rx_len = le16_to_cpu(pkt_len);
1589 skb_trim(skb, rx_len);
1590 skb_pull(skb, INTF_HEADER_LEN);
1592 if (!adapter->curr_cmd) {
1593 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1594 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1595 skb->len);
1596 mwifiex_pcie_enable_host_int(adapter);
1597 if (mwifiex_write_reg(adapter,
1598 PCIE_CPU_INT_EVENT,
1599 CPU_INTR_SLEEP_CFM_DONE)) {
1600 dev_warn(adapter->dev,
1601 "Write register failed\n");
1602 return -1;
1604 mwifiex_delay_for_sleep_cookie(adapter,
1605 MWIFIEX_MAX_DELAY_COUNT);
1606 while (reg->sleep_cookie && (count++ < 10) &&
1607 mwifiex_pcie_ok_to_access_hw(adapter))
1608 usleep_range(50, 60);
1609 } else {
1610 dev_err(adapter->dev,
1611 "There is no command but got cmdrsp\n");
1613 memcpy(adapter->upld_buf, skb->data,
1614 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1615 skb_push(skb, INTF_HEADER_LEN);
1616 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1617 PCI_DMA_FROMDEVICE))
1618 return -1;
1619 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1620 adapter->curr_cmd->resp_skb = skb;
1621 adapter->cmd_resp_received = true;
1622 /* Take the pointer and set it to CMD node and will
1623 return in the response complete callback */
1624 card->cmdrsp_buf = NULL;
1626 /* Clear the cmd-rsp buffer address in scratch registers. This
1627 will prevent firmware from writing to the same response
1628 buffer again. */
1629 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1630 dev_err(adapter->dev,
1631 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1632 return -1;
1634 /* Write the upper 32bits of the cmdrsp buffer physical
1635 address */
1636 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1637 dev_err(adapter->dev,
1638 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1639 return -1;
1643 return 0;
1647 * Command Response processing complete handler
1649 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1650 struct sk_buff *skb)
1652 struct pcie_service_card *card = adapter->card;
1654 if (skb) {
1655 card->cmdrsp_buf = skb;
1656 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1657 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1658 PCI_DMA_FROMDEVICE))
1659 return -1;
1662 return 0;
1666 * This function handles firmware event ready interrupt
1668 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1670 struct pcie_service_card *card = adapter->card;
1671 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1672 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1673 u32 wrptr, event;
1674 struct mwifiex_evt_buf_desc *desc;
1676 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1677 mwifiex_pm_wakeup_card(adapter);
1679 if (adapter->event_received) {
1680 dev_dbg(adapter->dev, "info: Event being processed, "
1681 "do not process this interrupt just yet\n");
1682 return 0;
1685 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1686 dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
1687 return -1;
1690 /* Read the event ring write pointer set by firmware */
1691 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1692 dev_err(adapter->dev,
1693 "EventReady: failed to read reg->evt_wrptr\n");
1694 return -1;
1697 dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1698 card->evtbd_rdptr, wrptr);
1699 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1700 & MWIFIEX_EVTBD_MASK)) ||
1701 ((wrptr & reg->evt_rollover_ind) ==
1702 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1703 struct sk_buff *skb_cmd;
1704 __le16 data_len = 0;
1705 u16 evt_len;
1707 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1708 skb_cmd = card->evt_buf_list[rdptr];
1709 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1711 /* Take the pointer and set it to event pointer in adapter
1712 and will return back after event handling callback */
1713 card->evt_buf_list[rdptr] = NULL;
1714 desc = card->evtbd_ring[rdptr];
1715 memset(desc, 0, sizeof(*desc));
1717 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1718 adapter->event_cause = event;
1719 /* The first 4bytes will be the event transfer header
1720 len is 2 bytes followed by type which is 2 bytes */
1721 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1722 evt_len = le16_to_cpu(data_len);
1724 skb_pull(skb_cmd, INTF_HEADER_LEN);
1725 dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
1727 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1728 memcpy(adapter->event_body, skb_cmd->data +
1729 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1730 MWIFIEX_EVENT_HEADER_LEN);
1732 adapter->event_received = true;
1733 adapter->event_skb = skb_cmd;
1735 /* Do not update the event read pointer here, wait till the
1736 buffer is released. This is just to make things simpler,
1737 we need to find a better method of managing these buffers.
1739 } else {
1740 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1741 CPU_INTR_EVENT_DONE)) {
1742 dev_warn(adapter->dev,
1743 "Write register failed\n");
1744 return -1;
1748 return 0;
1752 * Event processing complete handler
1754 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1755 struct sk_buff *skb)
1757 struct pcie_service_card *card = adapter->card;
1758 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1759 int ret = 0;
1760 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1761 u32 wrptr;
1762 struct mwifiex_evt_buf_desc *desc;
1764 if (!skb)
1765 return 0;
1767 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1768 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
1769 rdptr);
1770 return -EINVAL;
1773 /* Read the event ring write pointer set by firmware */
1774 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1775 dev_err(adapter->dev,
1776 "event_complete: failed to read reg->evt_wrptr\n");
1777 return -1;
1780 if (!card->evt_buf_list[rdptr]) {
1781 skb_push(skb, INTF_HEADER_LEN);
1782 if (mwifiex_map_pci_memory(adapter, skb,
1783 MAX_EVENT_SIZE,
1784 PCI_DMA_FROMDEVICE))
1785 return -1;
1786 card->evt_buf_list[rdptr] = skb;
1787 desc = card->evtbd_ring[rdptr];
1788 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1789 desc->len = (u16)skb->len;
1790 desc->flags = 0;
1791 skb = NULL;
1792 } else {
1793 dev_dbg(adapter->dev,
1794 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1795 rdptr, card->evt_buf_list[rdptr], skb);
1798 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1799 card->evtbd_rdptr = ((card->evtbd_rdptr &
1800 reg->evt_rollover_ind) ^
1801 reg->evt_rollover_ind);
1804 dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1805 card->evtbd_rdptr, wrptr);
1807 /* Write the event ring read pointer in to reg->evt_rdptr */
1808 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1809 card->evtbd_rdptr)) {
1810 dev_err(adapter->dev,
1811 "event_complete: failed to read reg->evt_rdptr\n");
1812 return -1;
1815 dev_dbg(adapter->dev, "info: Check Events Again\n");
1816 ret = mwifiex_pcie_process_event_ready(adapter);
1818 return ret;
1822 * This function downloads the firmware to the card.
1824 * Firmware is downloaded to the card in blocks. Every block download
1825 * is tested for CRC errors, and retried a number of times before
1826 * returning failure.
1828 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1829 struct mwifiex_fw_image *fw)
1831 int ret;
1832 u8 *firmware = fw->fw_buf;
1833 u32 firmware_len = fw->fw_len;
1834 u32 offset = 0;
1835 struct sk_buff *skb;
1836 u32 txlen, tx_blocks = 0, tries, len;
1837 u32 block_retry_cnt = 0;
1838 struct pcie_service_card *card = adapter->card;
1839 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1841 if (!firmware || !firmware_len) {
1842 dev_err(adapter->dev,
1843 "No firmware image found! Terminating download\n");
1844 return -1;
1847 dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
1848 firmware_len);
1850 if (mwifiex_pcie_disable_host_int(adapter)) {
1851 dev_err(adapter->dev,
1852 "%s: Disabling interrupts failed.\n", __func__);
1853 return -1;
1856 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1857 if (!skb) {
1858 ret = -ENOMEM;
1859 goto done;
1862 /* Perform firmware data transfer */
1863 do {
1864 u32 ireg_intr = 0;
1866 /* More data? */
1867 if (offset >= firmware_len)
1868 break;
1870 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1871 ret = mwifiex_read_reg(adapter, reg->cmd_size,
1872 &len);
1873 if (ret) {
1874 dev_warn(adapter->dev,
1875 "Failed reading len from boot code\n");
1876 goto done;
1878 if (len)
1879 break;
1880 usleep_range(10, 20);
1883 if (!len) {
1884 break;
1885 } else if (len > MWIFIEX_UPLD_SIZE) {
1886 pr_err("FW download failure @ %d, invalid length %d\n",
1887 offset, len);
1888 ret = -1;
1889 goto done;
1892 txlen = len;
1894 if (len & BIT(0)) {
1895 block_retry_cnt++;
1896 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1897 pr_err("FW download failure @ %d, over max "
1898 "retry count\n", offset);
1899 ret = -1;
1900 goto done;
1902 dev_err(adapter->dev, "FW CRC error indicated by the "
1903 "helper: len = 0x%04X, txlen = %d\n",
1904 len, txlen);
1905 len &= ~BIT(0);
1906 /* Setting this to 0 to resend from same offset */
1907 txlen = 0;
1908 } else {
1909 block_retry_cnt = 0;
1910 /* Set blocksize to transfer - checking for
1911 last block */
1912 if (firmware_len - offset < txlen)
1913 txlen = firmware_len - offset;
1915 dev_dbg(adapter->dev, ".");
1917 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
1918 card->pcie.blksz_fw_dl;
1920 /* Copy payload to buffer */
1921 memmove(skb->data, &firmware[offset], txlen);
1924 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1925 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
1927 /* Send the boot command to device */
1928 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
1929 dev_err(adapter->dev,
1930 "Failed to send firmware download command\n");
1931 ret = -1;
1932 goto done;
1935 /* Wait for the command done interrupt */
1936 do {
1937 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1938 &ireg_intr)) {
1939 dev_err(adapter->dev, "%s: Failed to read "
1940 "interrupt status during fw dnld.\n",
1941 __func__);
1942 mwifiex_unmap_pci_memory(adapter, skb,
1943 PCI_DMA_TODEVICE);
1944 ret = -1;
1945 goto done;
1947 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1948 CPU_INTR_DOOR_BELL);
1950 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1952 offset += txlen;
1953 } while (true);
1955 dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
1956 offset);
1958 ret = 0;
1960 done:
1961 dev_kfree_skb_any(skb);
1962 return ret;
1966 * This function checks the firmware status in card.
1968 * The winner interface is also determined by this function.
1970 static int
1971 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
1973 int ret = 0;
1974 u32 firmware_stat, winner_status;
1975 struct pcie_service_card *card = adapter->card;
1976 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1977 u32 tries;
1979 /* Mask spurios interrupts */
1980 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
1981 HOST_INTR_MASK)) {
1982 dev_warn(adapter->dev, "Write register failed\n");
1983 return -1;
1986 dev_dbg(adapter->dev, "Setting driver ready signature\n");
1987 if (mwifiex_write_reg(adapter, reg->drv_rdy,
1988 FIRMWARE_READY_PCIE)) {
1989 dev_err(adapter->dev,
1990 "Failed to write driver ready signature\n");
1991 return -1;
1994 /* Wait for firmware initialization event */
1995 for (tries = 0; tries < poll_num; tries++) {
1996 if (mwifiex_read_reg(adapter, reg->fw_status,
1997 &firmware_stat))
1998 ret = -1;
1999 else
2000 ret = 0;
2001 if (ret)
2002 continue;
2003 if (firmware_stat == FIRMWARE_READY_PCIE) {
2004 ret = 0;
2005 break;
2006 } else {
2007 msleep(100);
2008 ret = -1;
2012 if (ret) {
2013 if (mwifiex_read_reg(adapter, reg->fw_status,
2014 &winner_status))
2015 ret = -1;
2016 else if (!winner_status) {
2017 dev_err(adapter->dev, "PCI-E is the winner\n");
2018 adapter->winner = 1;
2019 } else {
2020 dev_err(adapter->dev,
2021 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
2022 ret, adapter->winner);
2026 return ret;
2030 * This function reads the interrupt status from card.
2032 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
2034 u32 pcie_ireg;
2035 unsigned long flags;
2037 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2038 return;
2040 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
2041 dev_warn(adapter->dev, "Read register failed\n");
2042 return;
2045 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2047 mwifiex_pcie_disable_host_int(adapter);
2049 /* Clear the pending interrupts */
2050 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2051 ~pcie_ireg)) {
2052 dev_warn(adapter->dev, "Write register failed\n");
2053 return;
2055 spin_lock_irqsave(&adapter->int_lock, flags);
2056 adapter->int_status |= pcie_ireg;
2057 spin_unlock_irqrestore(&adapter->int_lock, flags);
2059 if (!adapter->pps_uapsd_mode &&
2060 adapter->ps_state == PS_STATE_SLEEP &&
2061 mwifiex_pcie_ok_to_access_hw(adapter)) {
2062 /* Potentially for PCIe we could get other
2063 * interrupts like shared. Don't change power
2064 * state until cookie is set */
2065 adapter->ps_state = PS_STATE_AWAKE;
2066 adapter->pm_wakeup_fw_try = false;
2072 * Interrupt handler for PCIe root port
2074 * This function reads the interrupt status from firmware and assigns
2075 * the main process in workqueue which will handle the interrupt.
2077 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2079 struct pci_dev *pdev = (struct pci_dev *)context;
2080 struct pcie_service_card *card;
2081 struct mwifiex_adapter *adapter;
2083 if (!pdev) {
2084 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
2085 goto exit;
2088 card = pci_get_drvdata(pdev);
2089 if (!card || !card->adapter) {
2090 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
2091 card ? card->adapter : NULL);
2092 goto exit;
2094 adapter = card->adapter;
2096 if (adapter->surprise_removed)
2097 goto exit;
2099 mwifiex_interrupt_status(adapter);
2100 queue_work(adapter->workqueue, &adapter->main_work);
2102 exit:
2103 return IRQ_HANDLED;
2107 * This function checks the current interrupt status.
2109 * The following interrupts are checked and handled by this function -
2110 * - Data sent
2111 * - Command sent
2112 * - Command received
2113 * - Packets received
2114 * - Events received
2116 * In case of Rx packets received, the packets are uploaded from card to
2117 * host and processed accordingly.
2119 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2121 int ret;
2122 u32 pcie_ireg;
2123 unsigned long flags;
2125 spin_lock_irqsave(&adapter->int_lock, flags);
2126 /* Clear out unused interrupts */
2127 pcie_ireg = adapter->int_status;
2128 adapter->int_status = 0;
2129 spin_unlock_irqrestore(&adapter->int_lock, flags);
2131 while (pcie_ireg & HOST_INTR_MASK) {
2132 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2133 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
2134 dev_dbg(adapter->dev, "info: TX DNLD Done\n");
2135 ret = mwifiex_pcie_send_data_complete(adapter);
2136 if (ret)
2137 return ret;
2139 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2140 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
2141 dev_dbg(adapter->dev, "info: Rx DATA\n");
2142 ret = mwifiex_pcie_process_recv_data(adapter);
2143 if (ret)
2144 return ret;
2146 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2147 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
2148 dev_dbg(adapter->dev, "info: Rx EVENT\n");
2149 ret = mwifiex_pcie_process_event_ready(adapter);
2150 if (ret)
2151 return ret;
2154 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2155 pcie_ireg &= ~HOST_INTR_CMD_DONE;
2156 if (adapter->cmd_sent) {
2157 dev_dbg(adapter->dev,
2158 "info: CMD sent Interrupt\n");
2159 adapter->cmd_sent = false;
2161 /* Handle command response */
2162 ret = mwifiex_pcie_process_cmd_complete(adapter);
2163 if (ret)
2164 return ret;
2167 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2168 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2169 &pcie_ireg)) {
2170 dev_warn(adapter->dev,
2171 "Read register failed\n");
2172 return -1;
2175 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2176 if (mwifiex_write_reg(adapter,
2177 PCIE_HOST_INT_STATUS,
2178 ~pcie_ireg)) {
2179 dev_warn(adapter->dev,
2180 "Write register failed\n");
2181 return -1;
2187 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
2188 adapter->cmd_sent, adapter->data_sent);
2189 if (adapter->ps_state != PS_STATE_SLEEP)
2190 mwifiex_pcie_enable_host_int(adapter);
2192 return 0;
2196 * This function downloads data from driver to card.
2198 * Both commands and data packets are transferred to the card by this
2199 * function.
2201 * This function adds the PCIE specific header to the front of the buffer
2202 * before transferring. The header contains the length of the packet and
2203 * the type. The firmware handles the packets based upon this set type.
2205 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2206 struct sk_buff *skb,
2207 struct mwifiex_tx_param *tx_param)
2209 if (!skb) {
2210 dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
2211 return -1;
2214 if (type == MWIFIEX_TYPE_DATA)
2215 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2216 else if (type == MWIFIEX_TYPE_CMD)
2217 return mwifiex_pcie_send_cmd(adapter, skb);
2219 return 0;
2222 /* This function read/write firmware */
2223 static enum rdwr_status
2224 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2226 int ret, tries;
2227 u8 ctrl_data;
2228 struct pcie_service_card *card = adapter->card;
2229 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2231 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl, FW_DUMP_HOST_READY);
2232 if (ret) {
2233 dev_err(adapter->dev, "PCIE write err\n");
2234 return RDWR_STATUS_FAILURE;
2237 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2238 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2239 if (ctrl_data == FW_DUMP_DONE)
2240 return RDWR_STATUS_SUCCESS;
2241 if (doneflag && ctrl_data == doneflag)
2242 return RDWR_STATUS_DONE;
2243 if (ctrl_data != FW_DUMP_HOST_READY) {
2244 dev_info(adapter->dev,
2245 "The ctrl reg was changed, re-try again!\n");
2246 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2247 FW_DUMP_HOST_READY);
2248 if (ret) {
2249 dev_err(adapter->dev, "PCIE write err\n");
2250 return RDWR_STATUS_FAILURE;
2253 usleep_range(100, 200);
2256 dev_err(adapter->dev, "Fail to pull ctrl_data\n");
2257 return RDWR_STATUS_FAILURE;
2260 /* This function dump firmware memory to file */
2261 static void mwifiex_pcie_fw_dump_work(struct mwifiex_adapter *adapter)
2263 struct pcie_service_card *card = adapter->card;
2264 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2265 unsigned int reg, reg_start, reg_end;
2266 u8 *dbg_ptr, *end_ptr, dump_num, idx, i, read_reg, doneflag = 0;
2267 enum rdwr_status stat;
2268 u32 memory_size;
2269 int ret;
2270 static char *env[] = { "DRIVER=mwifiex_pcie", "EVENT=fw_dump", NULL };
2272 if (!card->pcie.supports_fw_dump)
2273 return;
2275 for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) {
2276 struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
2278 if (entry->mem_ptr) {
2279 vfree(entry->mem_ptr);
2280 entry->mem_ptr = NULL;
2282 entry->mem_size = 0;
2285 dev_info(adapter->dev, "== mwifiex firmware dump start ==\n");
2287 /* Read the number of the memories which will dump */
2288 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2289 if (stat == RDWR_STATUS_FAILURE)
2290 goto done;
2292 reg = creg->fw_dump_start;
2293 mwifiex_read_reg_byte(adapter, reg, &dump_num);
2295 /* Read the length of every memory which will dump */
2296 for (idx = 0; idx < dump_num; idx++) {
2297 struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
2299 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2300 if (stat == RDWR_STATUS_FAILURE)
2301 goto done;
2303 memory_size = 0;
2304 reg = creg->fw_dump_start;
2305 for (i = 0; i < 4; i++) {
2306 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2307 memory_size |= (read_reg << (i * 8));
2308 reg++;
2311 if (memory_size == 0) {
2312 dev_info(adapter->dev, "Firmware dump Finished!\n");
2313 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2314 FW_DUMP_READ_DONE);
2315 if (ret) {
2316 dev_err(adapter->dev, "PCIE write err\n");
2317 goto done;
2319 break;
2322 dev_info(adapter->dev,
2323 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2324 entry->mem_ptr = vmalloc(memory_size + 1);
2325 entry->mem_size = memory_size;
2326 if (!entry->mem_ptr) {
2327 dev_err(adapter->dev,
2328 "Vmalloc %s failed\n", entry->mem_name);
2329 goto done;
2331 dbg_ptr = entry->mem_ptr;
2332 end_ptr = dbg_ptr + memory_size;
2334 doneflag = entry->done_flag;
2335 dev_info(adapter->dev, "Start %s output, please wait...\n",
2336 entry->mem_name);
2338 do {
2339 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2340 if (RDWR_STATUS_FAILURE == stat)
2341 goto done;
2343 reg_start = creg->fw_dump_start;
2344 reg_end = creg->fw_dump_end;
2345 for (reg = reg_start; reg <= reg_end; reg++) {
2346 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2347 if (dbg_ptr < end_ptr) {
2348 dbg_ptr++;
2349 } else {
2350 dev_err(adapter->dev,
2351 "Allocated buf not enough\n");
2352 goto done;
2356 if (stat != RDWR_STATUS_DONE)
2357 continue;
2359 dev_info(adapter->dev, "%s done: size=0x%tx\n",
2360 entry->mem_name, dbg_ptr - entry->mem_ptr);
2361 break;
2362 } while (true);
2364 dev_info(adapter->dev, "== mwifiex firmware dump end ==\n");
2366 kobject_uevent_env(&adapter->wiphy->dev.kobj, KOBJ_CHANGE, env);
2368 done:
2369 adapter->curr_mem_idx = 0;
2372 static void mwifiex_pcie_work(struct work_struct *work)
2374 struct mwifiex_adapter *adapter =
2375 container_of(work, struct mwifiex_adapter, iface_work);
2377 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_FW_DUMP,
2378 &adapter->iface_work_flags))
2379 mwifiex_pcie_fw_dump_work(adapter);
2382 /* This function dumps FW information */
2383 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2385 if (test_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &adapter->iface_work_flags))
2386 return;
2388 set_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &adapter->iface_work_flags);
2390 schedule_work(&adapter->iface_work);
2394 * This function initializes the PCI-E host memory space, WCB rings, etc.
2396 * The following initializations steps are followed -
2397 * - Allocate TXBD ring buffers
2398 * - Allocate RXBD ring buffers
2399 * - Allocate event BD ring buffers
2400 * - Allocate command response ring buffer
2401 * - Allocate sleep cookie buffer
2403 static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
2405 struct pcie_service_card *card = adapter->card;
2406 int ret;
2407 struct pci_dev *pdev = card->dev;
2408 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2410 pci_set_drvdata(pdev, card);
2412 ret = pci_enable_device(pdev);
2413 if (ret)
2414 goto err_enable_dev;
2416 pci_set_master(pdev);
2418 dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
2419 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2420 if (ret) {
2421 dev_err(adapter->dev, "set_dma_mask(32) failed\n");
2422 goto err_set_dma_mask;
2425 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2426 if (ret) {
2427 dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
2428 goto err_set_dma_mask;
2431 ret = pci_request_region(pdev, 0, DRV_NAME);
2432 if (ret) {
2433 dev_err(adapter->dev, "req_reg(0) error\n");
2434 goto err_req_region0;
2436 card->pci_mmap = pci_iomap(pdev, 0, 0);
2437 if (!card->pci_mmap) {
2438 dev_err(adapter->dev, "iomap(0) error\n");
2439 ret = -EIO;
2440 goto err_iomap0;
2442 ret = pci_request_region(pdev, 2, DRV_NAME);
2443 if (ret) {
2444 dev_err(adapter->dev, "req_reg(2) error\n");
2445 goto err_req_region2;
2447 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2448 if (!card->pci_mmap1) {
2449 dev_err(adapter->dev, "iomap(2) error\n");
2450 ret = -EIO;
2451 goto err_iomap2;
2454 dev_dbg(adapter->dev,
2455 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2456 card->pci_mmap, card->pci_mmap1);
2458 card->cmdrsp_buf = NULL;
2459 ret = mwifiex_pcie_create_txbd_ring(adapter);
2460 if (ret)
2461 goto err_cre_txbd;
2462 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2463 if (ret)
2464 goto err_cre_rxbd;
2465 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2466 if (ret)
2467 goto err_cre_evtbd;
2468 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2469 if (ret)
2470 goto err_alloc_cmdbuf;
2471 if (reg->sleep_cookie) {
2472 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2473 if (ret)
2474 goto err_alloc_cookie;
2475 } else {
2476 card->sleep_cookie_vbase = NULL;
2478 return ret;
2480 err_alloc_cookie:
2481 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2482 err_alloc_cmdbuf:
2483 mwifiex_pcie_delete_evtbd_ring(adapter);
2484 err_cre_evtbd:
2485 mwifiex_pcie_delete_rxbd_ring(adapter);
2486 err_cre_rxbd:
2487 mwifiex_pcie_delete_txbd_ring(adapter);
2488 err_cre_txbd:
2489 pci_iounmap(pdev, card->pci_mmap1);
2490 err_iomap2:
2491 pci_release_region(pdev, 2);
2492 err_req_region2:
2493 pci_iounmap(pdev, card->pci_mmap);
2494 err_iomap0:
2495 pci_release_region(pdev, 0);
2496 err_req_region0:
2497 err_set_dma_mask:
2498 pci_disable_device(pdev);
2499 err_enable_dev:
2500 pci_set_drvdata(pdev, NULL);
2501 return ret;
2505 * This function cleans up the allocated card buffers.
2507 * The following are freed by this function -
2508 * - TXBD ring buffers
2509 * - RXBD ring buffers
2510 * - Event BD ring buffers
2511 * - Command response ring buffer
2512 * - Sleep cookie buffer
2514 static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
2516 struct pcie_service_card *card = adapter->card;
2517 struct pci_dev *pdev = card->dev;
2518 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2520 if (user_rmmod) {
2521 dev_dbg(adapter->dev, "Clearing driver ready signature\n");
2522 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
2523 dev_err(adapter->dev,
2524 "Failed to write driver not-ready signature\n");
2527 if (pdev) {
2528 pci_iounmap(pdev, card->pci_mmap);
2529 pci_iounmap(pdev, card->pci_mmap1);
2530 pci_disable_device(pdev);
2531 pci_release_region(pdev, 2);
2532 pci_release_region(pdev, 0);
2533 pci_set_drvdata(pdev, NULL);
2535 kfree(card);
2539 * This function registers the PCIE device.
2541 * PCIE IRQ is claimed, block size is set and driver data is initialized.
2543 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
2545 int ret;
2546 struct pcie_service_card *card = adapter->card;
2547 struct pci_dev *pdev = card->dev;
2549 /* save adapter pointer in card */
2550 card->adapter = adapter;
2552 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
2553 "MRVL_PCIE", pdev);
2554 if (ret) {
2555 pr_err("request_irq failed: ret=%d\n", ret);
2556 adapter->card = NULL;
2557 return -1;
2560 adapter->dev = &pdev->dev;
2561 adapter->tx_buf_size = card->pcie.tx_buf_size;
2562 adapter->mem_type_mapping_tbl = mem_type_mapping_tbl;
2563 adapter->num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl);
2564 strcpy(adapter->fw_name, card->pcie.firmware);
2566 return 0;
2570 * This function unregisters the PCIE device.
2572 * The PCIE IRQ is released, the function is disabled and driver
2573 * data is set to null.
2575 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
2577 struct pcie_service_card *card = adapter->card;
2578 const struct mwifiex_pcie_card_reg *reg;
2580 if (card) {
2581 dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
2582 free_irq(card->dev->irq, card->dev);
2584 reg = card->pcie.reg;
2585 if (reg->sleep_cookie)
2586 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2588 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2589 mwifiex_pcie_delete_evtbd_ring(adapter);
2590 mwifiex_pcie_delete_rxbd_ring(adapter);
2591 mwifiex_pcie_delete_txbd_ring(adapter);
2592 card->cmdrsp_buf = NULL;
2596 static struct mwifiex_if_ops pcie_ops = {
2597 .init_if = mwifiex_pcie_init,
2598 .cleanup_if = mwifiex_pcie_cleanup,
2599 .check_fw_status = mwifiex_check_fw_status,
2600 .prog_fw = mwifiex_prog_fw_w_helper,
2601 .register_dev = mwifiex_register_dev,
2602 .unregister_dev = mwifiex_unregister_dev,
2603 .enable_int = mwifiex_pcie_enable_host_int,
2604 .process_int_status = mwifiex_process_int_status,
2605 .host_to_card = mwifiex_pcie_host_to_card,
2606 .wakeup = mwifiex_pm_wakeup_card,
2607 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
2609 /* PCIE specific */
2610 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
2611 .event_complete = mwifiex_pcie_event_complete,
2612 .update_mp_end_port = NULL,
2613 .cleanup_mpa_buf = NULL,
2614 .init_fw_port = mwifiex_pcie_init_fw_port,
2615 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
2616 .fw_dump = mwifiex_pcie_fw_dump,
2617 .iface_work = mwifiex_pcie_work,
2621 * This function initializes the PCIE driver module.
2623 * This initiates the semaphore and registers the device with
2624 * PCIE bus.
2626 static int mwifiex_pcie_init_module(void)
2628 int ret;
2630 pr_debug("Marvell PCIe Driver\n");
2632 sema_init(&add_remove_card_sem, 1);
2634 /* Clear the flag in case user removes the card. */
2635 user_rmmod = 0;
2637 ret = pci_register_driver(&mwifiex_pcie);
2638 if (ret)
2639 pr_err("Driver register failed!\n");
2640 else
2641 pr_debug("info: Driver registered successfully!\n");
2643 return ret;
2647 * This function cleans up the PCIE driver.
2649 * The following major steps are followed for cleanup -
2650 * - Resume the device if its suspended
2651 * - Disconnect the device if connected
2652 * - Shutdown the firmware
2653 * - Unregister the device from PCIE bus.
2655 static void mwifiex_pcie_cleanup_module(void)
2657 if (!down_interruptible(&add_remove_card_sem))
2658 up(&add_remove_card_sem);
2660 /* Set the flag as user is removing this module. */
2661 user_rmmod = 1;
2663 pci_unregister_driver(&mwifiex_pcie);
2666 module_init(mwifiex_pcie_init_module);
2667 module_exit(mwifiex_pcie_cleanup_module);
2669 MODULE_AUTHOR("Marvell International Ltd.");
2670 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
2671 MODULE_VERSION(PCIE_VERSION);
2672 MODULE_LICENSE("GPL v2");
2673 MODULE_FIRMWARE(PCIE8766_DEFAULT_FW_NAME);
2674 MODULE_FIRMWARE(PCIE8897_DEFAULT_FW_NAME);