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>
31 #define PCIE_VERSION "1.0"
32 #define DRV_NAME "Marvell mwifiex PCIe"
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},
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 mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n");
64 mwifiex_store_mapping(skb, &mapping);
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)
84 struct pcie_service_card *card = adapter->card;
85 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
87 if (!reg->sleep_cookie)
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",
95 if (*cookie_addr == FW_AWAKE_COOKIE)
102 #ifdef CONFIG_PM_SLEEP
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.
108 * If already not suspended, this function allocates and sends a host
109 * sleep activate request to the firmware and turns off the traffic.
111 static int mwifiex_pcie_suspend(struct device *dev)
113 struct mwifiex_adapter *adapter;
114 struct pcie_service_card *card;
116 struct pci_dev *pdev = to_pci_dev(dev);
119 card = pci_get_drvdata(pdev);
120 if (!card || !card->adapter) {
121 pr_err("Card or adapter structure is not valid\n");
125 pr_err("PCIE device is not specified\n");
129 adapter = card->adapter;
131 hs_actived = mwifiex_enable_hs(adapter);
133 /* Indicate device suspended */
134 adapter->is_suspended = true;
135 adapter->hs_enabling = false;
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.
145 * If already not resumed, this function turns on the traffic and
146 * sends a host sleep cancel request to the firmware.
148 static int mwifiex_pcie_resume(struct device *dev)
150 struct mwifiex_adapter *adapter;
151 struct pcie_service_card *card;
152 struct pci_dev *pdev = to_pci_dev(dev);
155 card = pci_get_drvdata(pdev);
156 if (!card || !card->adapter) {
157 pr_err("Card or adapter structure is not valid\n");
161 pr_err("PCIE device is not specified\n");
165 adapter = card->adapter;
167 if (!adapter->is_suspended) {
168 mwifiex_dbg(adapter, WARN,
169 "Device already resumed\n");
173 adapter->is_suspended = false;
175 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
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
188 static int mwifiex_pcie_probe(struct pci_dev *pdev,
189 const struct pci_device_id *ent)
191 struct pcie_service_card *card;
193 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
194 pdev->vendor, pdev->device, pdev->revision);
196 card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
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;
212 if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
214 pr_err("%s failed\n", __func__);
223 * This function removes the interface and frees up the card structure.
225 static void mwifiex_pcie_remove(struct pci_dev *pdev)
227 struct pcie_service_card *card;
228 struct mwifiex_adapter *adapter;
229 struct mwifiex_private *priv;
231 card = pci_get_drvdata(pdev);
235 adapter = card->adapter;
236 if (!adapter || !adapter->priv_num)
240 #ifdef CONFIG_PM_SLEEP
241 if (adapter->is_suspended)
242 mwifiex_pcie_resume(&pdev->dev);
245 mwifiex_deauthenticate_all(adapter);
247 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
249 mwifiex_disable_auto_ds(priv);
251 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
254 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
257 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
260 mwifiex_pcie_remove(pdev);
265 static const struct pci_device_id mwifiex_ids[] = {
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,
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,
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,
284 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
286 #ifdef CONFIG_PM_SLEEP
287 /* Power Management Hooks */
288 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
289 mwifiex_pcie_resume);
292 /* PCI Device Driver */
293 static 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
300 .pm = &mwifiex_pcie_pm_ops,
303 .shutdown = mwifiex_pcie_shutdown,
307 * This function writes data into PCIE card register.
309 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
311 struct pcie_service_card *card = adapter->card;
313 iowrite32(data, card->pci_mmap1 + reg);
319 * This function reads data from PCIE card register.
321 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
323 struct pcie_service_card *card = adapter->card;
325 *data = ioread32(card->pci_mmap1 + reg);
330 /* This function reads u8 data from PCIE card register. */
331 static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter,
334 struct pcie_service_card *card = adapter->card;
336 *data = ioread8(card->pci_mmap1 + reg);
342 * This function adds delay loop to ensure FW is awake before proceeding.
344 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
348 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
350 usleep_range(10, 20);
359 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
360 u32 max_delay_loop_cnt)
362 struct pcie_service_card *card = adapter->card;
364 u32 sleep_cookie, count;
366 for (count = 0; count < max_delay_loop_cnt; count++) {
367 buffer = card->cmdrsp_buf->data - INTF_HEADER_LEN;
368 sleep_cookie = *(u32 *)buffer;
370 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
371 mwifiex_dbg(adapter, INFO,
372 "sleep cookie found at count %d\n", count);
375 usleep_range(20, 30);
378 if (count >= max_delay_loop_cnt)
379 mwifiex_dbg(adapter, INFO,
380 "max count reached while accessing sleep cookie\n");
383 /* This function wakes up the card by reading fw_status register. */
384 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
387 struct pcie_service_card *card = adapter->card;
388 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
390 mwifiex_dbg(adapter, EVENT,
391 "event: Wakeup device...\n");
393 if (reg->sleep_cookie)
394 mwifiex_pcie_dev_wakeup_delay(adapter);
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");
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;
414 * This function is called after the card has woken up.
416 * The card configuration register is reset.
418 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
420 mwifiex_dbg(adapter, CMD,
421 "cmd: Wakeup device completed\n");
427 * This function disables the host interrupt.
429 * The host interrupt mask is read, the disable bit is reset and
430 * written back to the card host interrupt mask register.
432 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
434 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
435 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
437 mwifiex_dbg(adapter, ERROR,
438 "Disable host interrupt failed\n");
447 * This function enables the host interrupt.
449 * The host interrupt enable mask is written to the card
450 * host interrupt mask register.
452 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
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,
458 mwifiex_dbg(adapter, ERROR,
459 "Enable host interrupt failed\n");
468 * This function initializes TX buffer ring descriptors
470 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
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;
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));
486 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
488 desc = card->txbd_ring[i];
489 memset(desc, 0, sizeof(*desc));
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.
500 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
502 struct pcie_service_card *card = adapter->card;
503 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
505 struct mwifiex_pcie_buf_desc *desc;
506 struct mwifiex_pfu_buf_desc *desc2;
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);
515 mwifiex_dbg(adapter, ERROR,
516 "Unable to allocate skb for RX ring.\n");
517 kfree(card->rxbd_ring_vbase);
521 if (mwifiex_map_pci_memory(adapter, skb,
522 MWIFIEX_RX_DATA_BUF_SIZE,
526 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
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));
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;
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;
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
560 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
562 struct pcie_service_card *card = adapter->card;
563 struct mwifiex_evt_buf_desc *desc;
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);
572 mwifiex_dbg(adapter, ERROR,
573 "Unable to allocate skb for EVENT buf.\n");
574 kfree(card->evtbd_ring_vbase);
577 skb_put(skb, MAX_EVENT_SIZE);
579 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
580 PCI_DMA_FROMDEVICE)) {
582 kfree(card->evtbd_ring_vbase);
586 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
588 mwifiex_dbg(adapter, EVENT,
589 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
590 skb, skb->len, skb->data, (u32)buf_pa,
591 (u32)((u64)buf_pa >> 32));
593 card->evt_buf_list[i] = skb;
594 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
595 (sizeof(*desc) * i));
596 desc = card->evtbd_ring[i];
597 desc->paddr = buf_pa;
598 desc->len = (u16)skb->len;
605 /* This function cleans up TX buffer rings. If any of the buffer list has valid
606 * SKB address, associated SKB is freed.
608 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
610 struct pcie_service_card *card = adapter->card;
611 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
613 struct mwifiex_pcie_buf_desc *desc;
614 struct mwifiex_pfu_buf_desc *desc2;
617 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
618 if (reg->pfu_enabled) {
619 desc2 = card->txbd_ring[i];
620 if (card->tx_buf_list[i]) {
621 skb = card->tx_buf_list[i];
622 mwifiex_unmap_pci_memory(adapter, skb,
624 dev_kfree_skb_any(skb);
626 memset(desc2, 0, sizeof(*desc2));
628 desc = card->txbd_ring[i];
629 if (card->tx_buf_list[i]) {
630 skb = card->tx_buf_list[i];
631 mwifiex_unmap_pci_memory(adapter, skb,
633 dev_kfree_skb_any(skb);
635 memset(desc, 0, sizeof(*desc));
637 card->tx_buf_list[i] = NULL;
643 /* This function cleans up RX buffer rings. If any of the buffer list has valid
644 * SKB address, associated SKB is freed.
646 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
648 struct pcie_service_card *card = adapter->card;
649 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
650 struct mwifiex_pcie_buf_desc *desc;
651 struct mwifiex_pfu_buf_desc *desc2;
655 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
656 if (reg->pfu_enabled) {
657 desc2 = card->rxbd_ring[i];
658 if (card->rx_buf_list[i]) {
659 skb = card->rx_buf_list[i];
660 mwifiex_unmap_pci_memory(adapter, skb,
662 dev_kfree_skb_any(skb);
664 memset(desc2, 0, sizeof(*desc2));
666 desc = card->rxbd_ring[i];
667 if (card->rx_buf_list[i]) {
668 skb = card->rx_buf_list[i];
669 mwifiex_unmap_pci_memory(adapter, skb,
671 dev_kfree_skb_any(skb);
673 memset(desc, 0, sizeof(*desc));
675 card->rx_buf_list[i] = NULL;
681 /* This function cleans up event buffer rings. If any of the buffer list has
682 * valid SKB address, associated SKB is freed.
684 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
686 struct pcie_service_card *card = adapter->card;
687 struct mwifiex_evt_buf_desc *desc;
691 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
692 desc = card->evtbd_ring[i];
693 if (card->evt_buf_list[i]) {
694 skb = card->evt_buf_list[i];
695 mwifiex_unmap_pci_memory(adapter, skb,
697 dev_kfree_skb_any(skb);
699 card->evt_buf_list[i] = NULL;
700 memset(desc, 0, sizeof(*desc));
706 /* This function creates buffer descriptor ring for TX
708 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
710 struct pcie_service_card *card = adapter->card;
711 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
714 * driver maintaines the write pointer and firmware maintaines the read
715 * pointer. The write pointer starts at 0 (zero) while the read pointer
716 * starts at zero with rollover bit set
718 card->txbd_wrptr = 0;
720 if (reg->pfu_enabled)
721 card->txbd_rdptr = 0;
723 card->txbd_rdptr |= reg->tx_rollover_ind;
725 /* allocate shared memory for the BD ring and divide the same in to
726 several descriptors */
727 if (reg->pfu_enabled)
728 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
731 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
734 mwifiex_dbg(adapter, INFO,
735 "info: txbd_ring: Allocating %d bytes\n",
736 card->txbd_ring_size);
737 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
738 card->txbd_ring_size,
739 &card->txbd_ring_pbase);
740 if (!card->txbd_ring_vbase) {
741 mwifiex_dbg(adapter, ERROR,
742 "allocate consistent memory (%d bytes) failed!\n",
743 card->txbd_ring_size);
746 mwifiex_dbg(adapter, DATA,
747 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
748 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
749 (u32)((u64)card->txbd_ring_pbase >> 32),
750 card->txbd_ring_size);
752 return mwifiex_init_txq_ring(adapter);
755 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
757 struct pcie_service_card *card = adapter->card;
758 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
760 mwifiex_cleanup_txq_ring(adapter);
762 if (card->txbd_ring_vbase)
763 pci_free_consistent(card->dev, card->txbd_ring_size,
764 card->txbd_ring_vbase,
765 card->txbd_ring_pbase);
766 card->txbd_ring_size = 0;
767 card->txbd_wrptr = 0;
768 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
769 card->txbd_ring_vbase = NULL;
770 card->txbd_ring_pbase = 0;
776 * This function creates buffer descriptor ring for RX
778 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
780 struct pcie_service_card *card = adapter->card;
781 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
784 * driver maintaines the read pointer and firmware maintaines the write
785 * pointer. The write pointer starts at 0 (zero) while the read pointer
786 * starts at zero with rollover bit set
788 card->rxbd_wrptr = 0;
789 card->rxbd_rdptr = reg->rx_rollover_ind;
791 if (reg->pfu_enabled)
792 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
795 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
798 mwifiex_dbg(adapter, INFO,
799 "info: rxbd_ring: Allocating %d bytes\n",
800 card->rxbd_ring_size);
801 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
802 card->rxbd_ring_size,
803 &card->rxbd_ring_pbase);
804 if (!card->rxbd_ring_vbase) {
805 mwifiex_dbg(adapter, ERROR,
806 "allocate consistent memory (%d bytes) failed!\n",
807 card->rxbd_ring_size);
811 mwifiex_dbg(adapter, DATA,
812 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
813 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
814 (u32)((u64)card->rxbd_ring_pbase >> 32),
815 card->rxbd_ring_size);
817 return mwifiex_init_rxq_ring(adapter);
821 * This function deletes Buffer descriptor ring for RX
823 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
825 struct pcie_service_card *card = adapter->card;
826 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
828 mwifiex_cleanup_rxq_ring(adapter);
830 if (card->rxbd_ring_vbase)
831 pci_free_consistent(card->dev, card->rxbd_ring_size,
832 card->rxbd_ring_vbase,
833 card->rxbd_ring_pbase);
834 card->rxbd_ring_size = 0;
835 card->rxbd_wrptr = 0;
836 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
837 card->rxbd_ring_vbase = NULL;
838 card->rxbd_ring_pbase = 0;
844 * This function creates buffer descriptor ring for Events
846 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
848 struct pcie_service_card *card = adapter->card;
849 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
852 * driver maintaines the read pointer and firmware maintaines the write
853 * pointer. The write pointer starts at 0 (zero) while the read pointer
854 * starts at zero with rollover bit set
856 card->evtbd_wrptr = 0;
857 card->evtbd_rdptr = reg->evt_rollover_ind;
859 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
862 mwifiex_dbg(adapter, INFO,
863 "info: evtbd_ring: Allocating %d bytes\n",
864 card->evtbd_ring_size);
865 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
866 card->evtbd_ring_size,
867 &card->evtbd_ring_pbase);
868 if (!card->evtbd_ring_vbase) {
869 mwifiex_dbg(adapter, ERROR,
870 "allocate consistent memory (%d bytes) failed!\n",
871 card->evtbd_ring_size);
875 mwifiex_dbg(adapter, EVENT,
876 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
877 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
878 (u32)((u64)card->evtbd_ring_pbase >> 32),
879 card->evtbd_ring_size);
881 return mwifiex_pcie_init_evt_ring(adapter);
885 * This function deletes Buffer descriptor ring for Events
887 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
889 struct pcie_service_card *card = adapter->card;
890 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
892 mwifiex_cleanup_evt_ring(adapter);
894 if (card->evtbd_ring_vbase)
895 pci_free_consistent(card->dev, card->evtbd_ring_size,
896 card->evtbd_ring_vbase,
897 card->evtbd_ring_pbase);
898 card->evtbd_wrptr = 0;
899 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
900 card->evtbd_ring_size = 0;
901 card->evtbd_ring_vbase = NULL;
902 card->evtbd_ring_pbase = 0;
908 * This function allocates a buffer for CMDRSP
910 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
912 struct pcie_service_card *card = adapter->card;
915 /* Allocate memory for receiving command response data */
916 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
918 mwifiex_dbg(adapter, ERROR,
919 "Unable to allocate skb for command response data.\n");
922 skb_put(skb, MWIFIEX_UPLD_SIZE);
923 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
924 PCI_DMA_FROMDEVICE)) {
929 card->cmdrsp_buf = skb;
935 * This function deletes a buffer for CMDRSP
937 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
939 struct pcie_service_card *card;
944 card = adapter->card;
946 if (card && card->cmdrsp_buf) {
947 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
949 dev_kfree_skb_any(card->cmdrsp_buf);
952 if (card && card->cmd_buf) {
953 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
955 dev_kfree_skb_any(card->cmd_buf);
961 * This function allocates a buffer for sleep cookie
963 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
965 struct pcie_service_card *card = adapter->card;
967 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
968 &card->sleep_cookie_pbase);
969 if (!card->sleep_cookie_vbase) {
970 mwifiex_dbg(adapter, ERROR,
971 "pci_alloc_consistent failed!\n");
974 /* Init val of Sleep Cookie */
975 *(u32 *)card->sleep_cookie_vbase = FW_AWAKE_COOKIE;
977 mwifiex_dbg(adapter, INFO,
978 "alloc_scook: sleep cookie=0x%x\n",
979 *((u32 *)card->sleep_cookie_vbase));
985 * This function deletes buffer for sleep cookie
987 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
989 struct pcie_service_card *card;
994 card = adapter->card;
996 if (card && card->sleep_cookie_vbase) {
997 pci_free_consistent(card->dev, sizeof(u32),
998 card->sleep_cookie_vbase,
999 card->sleep_cookie_pbase);
1000 card->sleep_cookie_vbase = NULL;
1006 /* This function flushes the TX buffer descriptor ring
1007 * This function defined as handler is also called while cleaning TXRX
1008 * during disconnect/ bss stop.
1010 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1012 struct pcie_service_card *card = adapter->card;
1014 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1015 card->txbd_flush = 1;
1016 /* write pointer already set at last send
1017 * send dnld-rdy intr again, wait for completion.
1019 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1020 CPU_INTR_DNLD_RDY)) {
1021 mwifiex_dbg(adapter, ERROR,
1022 "failed to assert dnld-rdy interrupt.\n");
1030 * This function unmaps and frees downloaded data buffer
1032 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1034 struct sk_buff *skb;
1035 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1036 struct mwifiex_pcie_buf_desc *desc;
1037 struct mwifiex_pfu_buf_desc *desc2;
1038 struct pcie_service_card *card = adapter->card;
1039 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1041 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1042 mwifiex_pm_wakeup_card(adapter);
1044 /* Read the TX ring read pointer set by firmware */
1045 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1046 mwifiex_dbg(adapter, ERROR,
1047 "SEND COMP: failed to read reg->tx_rdptr\n");
1051 mwifiex_dbg(adapter, DATA,
1052 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1053 card->txbd_rdptr, rdptr);
1055 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1056 /* free from previous txbd_rdptr to current txbd_rdptr */
1057 while (((card->txbd_rdptr & reg->tx_mask) !=
1058 (rdptr & reg->tx_mask)) ||
1059 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1060 (rdptr & reg->tx_rollover_ind))) {
1061 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1064 skb = card->tx_buf_list[wrdoneidx];
1067 mwifiex_dbg(adapter, DATA,
1068 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1070 mwifiex_unmap_pci_memory(adapter, skb,
1075 if (card->txbd_flush)
1076 mwifiex_write_data_complete(adapter, skb, 0,
1079 mwifiex_write_data_complete(adapter, skb, 0, 0);
1082 card->tx_buf_list[wrdoneidx] = NULL;
1084 if (reg->pfu_enabled) {
1085 desc2 = card->txbd_ring[wrdoneidx];
1086 memset(desc2, 0, sizeof(*desc2));
1088 desc = card->txbd_ring[wrdoneidx];
1089 memset(desc, 0, sizeof(*desc));
1091 switch (card->dev->device) {
1092 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1095 case PCIE_DEVICE_ID_MARVELL_88W8897:
1096 case PCIE_DEVICE_ID_MARVELL_88W8997:
1097 card->txbd_rdptr += reg->ring_tx_start_ptr;
1102 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1103 card->txbd_rdptr = ((card->txbd_rdptr &
1104 reg->tx_rollover_ind) ^
1105 reg->tx_rollover_ind);
1109 adapter->data_sent = false;
1111 if (card->txbd_flush) {
1112 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1113 card->txbd_flush = 0;
1115 mwifiex_clean_pcie_ring_buf(adapter);
1121 /* This function sends data buffer to device. First 4 bytes of payload
1122 * are filled with payload length and payload type. Then this payload
1123 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1124 * Download ready interrupt to FW is deffered if Tx ring is not full and
1125 * additional payload can be accomodated.
1126 * Caller must ensure tx_param parameter to this function is not NULL.
1129 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1130 struct mwifiex_tx_param *tx_param)
1132 struct pcie_service_card *card = adapter->card;
1133 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1134 u32 wrindx, num_tx_buffs, rx_val;
1137 struct mwifiex_pcie_buf_desc *desc = NULL;
1138 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1141 if (!(skb->data && skb->len)) {
1142 mwifiex_dbg(adapter, ERROR,
1143 "%s(): invalid parameter <%p, %#x>\n",
1144 __func__, skb->data, skb->len);
1148 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1149 mwifiex_pm_wakeup_card(adapter);
1151 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1152 mwifiex_dbg(adapter, DATA,
1153 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1154 card->txbd_rdptr, card->txbd_wrptr);
1155 if (mwifiex_pcie_txbd_not_full(card)) {
1158 adapter->data_sent = true;
1159 payload = skb->data;
1160 tmp = (__le16 *)&payload[0];
1161 *tmp = cpu_to_le16((u16)skb->len);
1162 tmp = (__le16 *)&payload[2];
1163 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
1165 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1169 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1170 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1171 card->tx_buf_list[wrindx] = skb;
1173 if (reg->pfu_enabled) {
1174 desc2 = card->txbd_ring[wrindx];
1175 desc2->paddr = buf_pa;
1176 desc2->len = (u16)skb->len;
1177 desc2->frag_len = (u16)skb->len;
1179 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1180 MWIFIEX_BD_FLAG_LAST_DESC;
1182 desc = card->txbd_ring[wrindx];
1183 desc->paddr = buf_pa;
1184 desc->len = (u16)skb->len;
1185 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1186 MWIFIEX_BD_FLAG_LAST_DESC;
1189 switch (card->dev->device) {
1190 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1193 case PCIE_DEVICE_ID_MARVELL_88W8897:
1194 case PCIE_DEVICE_ID_MARVELL_88W8997:
1195 card->txbd_wrptr += reg->ring_tx_start_ptr;
1199 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1200 card->txbd_wrptr = ((card->txbd_wrptr &
1201 reg->tx_rollover_ind) ^
1202 reg->tx_rollover_ind);
1204 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1205 /* Write the TX ring write pointer in to reg->tx_wrptr */
1206 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1207 card->txbd_wrptr | rx_val)) {
1208 mwifiex_dbg(adapter, ERROR,
1209 "SEND DATA: failed to write reg->tx_wrptr\n");
1213 if ((mwifiex_pcie_txbd_not_full(card)) &&
1214 tx_param->next_pkt_len) {
1215 /* have more packets and TxBD still can hold more */
1216 mwifiex_dbg(adapter, DATA,
1217 "SEND DATA: delay dnld-rdy interrupt.\n");
1218 adapter->data_sent = false;
1220 /* Send the TX ready interrupt */
1221 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1222 CPU_INTR_DNLD_RDY)) {
1223 mwifiex_dbg(adapter, ERROR,
1224 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1229 mwifiex_dbg(adapter, DATA,
1230 "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1231 "%#x> and sent packet to firmware successfully\n",
1232 card->txbd_rdptr, card->txbd_wrptr);
1234 mwifiex_dbg(adapter, DATA,
1235 "info: TX Ring full, can't send packets to fw\n");
1236 adapter->data_sent = true;
1237 /* Send the TX ready interrupt */
1238 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1240 mwifiex_dbg(adapter, ERROR,
1241 "SEND DATA: failed to assert door-bell intr\n");
1245 return -EINPROGRESS;
1247 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1248 card->tx_buf_list[wrindx] = NULL;
1249 if (reg->pfu_enabled)
1250 memset(desc2, 0, sizeof(*desc2));
1252 memset(desc, 0, sizeof(*desc));
1258 * This function handles received buffer ring and
1259 * dispatches packets to upper
1261 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1263 struct pcie_service_card *card = adapter->card;
1264 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1265 u32 wrptr, rd_index, tx_val;
1268 struct sk_buff *skb_tmp = NULL;
1269 struct mwifiex_pcie_buf_desc *desc;
1270 struct mwifiex_pfu_buf_desc *desc2;
1272 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1273 mwifiex_pm_wakeup_card(adapter);
1275 /* Read the RX ring Write pointer set by firmware */
1276 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1277 mwifiex_dbg(adapter, ERROR,
1278 "RECV DATA: failed to read reg->rx_wrptr\n");
1282 card->rxbd_wrptr = wrptr;
1284 while (((wrptr & reg->rx_mask) !=
1285 (card->rxbd_rdptr & reg->rx_mask)) ||
1286 ((wrptr & reg->rx_rollover_ind) ==
1287 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1288 struct sk_buff *skb_data;
1292 rd_index = card->rxbd_rdptr & reg->rx_mask;
1293 skb_data = card->rx_buf_list[rd_index];
1295 /* If skb allocation was failed earlier for Rx packet,
1296 * rx_buf_list[rd_index] would have been left with a NULL.
1301 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1302 card->rx_buf_list[rd_index] = NULL;
1304 /* Get data length from interface header -
1305 * first 2 bytes for len, next 2 bytes is for type
1307 pkt_len = *((__le16 *)skb_data->data);
1308 rx_len = le16_to_cpu(pkt_len);
1309 if (WARN_ON(rx_len <= INTF_HEADER_LEN ||
1310 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1311 mwifiex_dbg(adapter, ERROR,
1312 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1313 rx_len, card->rxbd_rdptr, wrptr);
1314 dev_kfree_skb_any(skb_data);
1316 skb_put(skb_data, rx_len);
1317 mwifiex_dbg(adapter, DATA,
1318 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1319 card->rxbd_rdptr, wrptr, rx_len);
1320 skb_pull(skb_data, INTF_HEADER_LEN);
1321 if (adapter->rx_work_enabled) {
1322 skb_queue_tail(&adapter->rx_data_q, skb_data);
1323 adapter->data_received = true;
1324 atomic_inc(&adapter->rx_pending);
1326 mwifiex_handle_rx_packet(adapter, skb_data);
1330 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1331 GFP_KERNEL | GFP_DMA);
1333 mwifiex_dbg(adapter, ERROR,
1334 "Unable to allocate skb.\n");
1338 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1339 MWIFIEX_RX_DATA_BUF_SIZE,
1340 PCI_DMA_FROMDEVICE))
1343 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1345 mwifiex_dbg(adapter, INFO,
1346 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1348 card->rx_buf_list[rd_index] = skb_tmp;
1350 if (reg->pfu_enabled) {
1351 desc2 = card->rxbd_ring[rd_index];
1352 desc2->paddr = buf_pa;
1353 desc2->len = skb_tmp->len;
1354 desc2->frag_len = skb_tmp->len;
1356 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1358 desc = card->rxbd_ring[rd_index];
1359 desc->paddr = buf_pa;
1360 desc->len = skb_tmp->len;
1364 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1365 MWIFIEX_MAX_TXRX_BD) {
1366 card->rxbd_rdptr = ((card->rxbd_rdptr &
1367 reg->rx_rollover_ind) ^
1368 reg->rx_rollover_ind);
1370 mwifiex_dbg(adapter, DATA,
1371 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1372 card->rxbd_rdptr, wrptr);
1374 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1375 /* Write the RX ring read pointer in to reg->rx_rdptr */
1376 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1377 card->rxbd_rdptr | tx_val)) {
1378 mwifiex_dbg(adapter, DATA,
1379 "RECV DATA: failed to write reg->rx_rdptr\n");
1384 /* Read the RX ring Write pointer set by firmware */
1385 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1386 mwifiex_dbg(adapter, ERROR,
1387 "RECV DATA: failed to read reg->rx_wrptr\n");
1391 mwifiex_dbg(adapter, DATA,
1392 "info: RECV DATA: Rcvd packet from fw successfully\n");
1393 card->rxbd_wrptr = wrptr;
1401 * This function downloads the boot command to device
1404 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1407 struct pcie_service_card *card = adapter->card;
1408 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1410 if (!(skb->data && skb->len)) {
1411 mwifiex_dbg(adapter, ERROR,
1412 "Invalid parameter in %s <%p. len %d>\n",
1413 __func__, skb->data, skb->len);
1417 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE))
1420 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1422 /* Write the lower 32bits of the physical address to low command
1423 * address scratch register
1425 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1426 mwifiex_dbg(adapter, ERROR,
1427 "%s: failed to write download command to boot code.\n",
1429 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1433 /* Write the upper 32bits of the physical address to high command
1434 * address scratch register
1436 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1437 (u32)((u64)buf_pa >> 32))) {
1438 mwifiex_dbg(adapter, ERROR,
1439 "%s: failed to write download command to boot code.\n",
1441 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1445 /* Write the command length to cmd_size scratch register */
1446 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1447 mwifiex_dbg(adapter, ERROR,
1448 "%s: failed to write command len to cmd_size scratch reg\n",
1450 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1454 /* Ring the door bell */
1455 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1456 CPU_INTR_DOOR_BELL)) {
1457 mwifiex_dbg(adapter, ERROR,
1458 "%s: failed to assert door-bell intr\n", __func__);
1459 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1466 /* This function init rx port in firmware which in turn enables to receive data
1467 * from device before transmitting any packet.
1469 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1471 struct pcie_service_card *card = adapter->card;
1472 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1473 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1475 /* Write the RX ring read pointer in to reg->rx_rdptr */
1476 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1478 mwifiex_dbg(adapter, ERROR,
1479 "RECV DATA: failed to write reg->rx_rdptr\n");
1485 /* This function downloads commands to the device
1488 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1490 struct pcie_service_card *card = adapter->card;
1491 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1493 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1494 u8 *payload = (u8 *)skb->data;
1496 if (!(skb->data && skb->len)) {
1497 mwifiex_dbg(adapter, ERROR,
1498 "Invalid parameter in %s <%p, %#x>\n",
1499 __func__, skb->data, skb->len);
1503 /* Make sure a command response buffer is available */
1504 if (!card->cmdrsp_buf) {
1505 mwifiex_dbg(adapter, ERROR,
1506 "No response buffer available, send command failed\n");
1510 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1511 mwifiex_pm_wakeup_card(adapter);
1513 adapter->cmd_sent = true;
1515 *(__le16 *)&payload[0] = cpu_to_le16((u16)skb->len);
1516 *(__le16 *)&payload[2] = cpu_to_le16(MWIFIEX_TYPE_CMD);
1518 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1521 card->cmd_buf = skb;
1523 * Need to keep a reference, since core driver might free up this
1524 * buffer before we've unmapped it.
1528 /* To send a command, the driver will:
1529 1. Write the 64bit physical address of the data buffer to
1530 cmd response address low + cmd response address high
1531 2. Ring the door bell (i.e. set the door bell interrupt)
1533 In response to door bell interrupt, the firmware will perform
1534 the DMA of the command packet (first header to obtain the total
1535 length and then rest of the command).
1538 if (card->cmdrsp_buf) {
1539 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1540 /* Write the lower 32bits of the cmdrsp buffer physical
1542 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1543 (u32)cmdrsp_buf_pa)) {
1544 mwifiex_dbg(adapter, ERROR,
1545 "Failed to write download cmd to boot code.\n");
1549 /* Write the upper 32bits of the cmdrsp buffer physical
1551 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1552 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1553 mwifiex_dbg(adapter, ERROR,
1554 "Failed to write download cmd to boot code.\n");
1560 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1561 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1562 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1564 mwifiex_dbg(adapter, ERROR,
1565 "Failed to write download cmd to boot code.\n");
1569 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1570 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1571 (u32)((u64)cmd_buf_pa >> 32))) {
1572 mwifiex_dbg(adapter, ERROR,
1573 "Failed to write download cmd to boot code.\n");
1578 /* Write the command length to reg->cmd_size */
1579 if (mwifiex_write_reg(adapter, reg->cmd_size,
1580 card->cmd_buf->len)) {
1581 mwifiex_dbg(adapter, ERROR,
1582 "Failed to write cmd len to reg->cmd_size\n");
1587 /* Ring the door bell */
1588 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1589 CPU_INTR_DOOR_BELL)) {
1590 mwifiex_dbg(adapter, ERROR,
1591 "Failed to assert door-bell intr\n");
1598 adapter->cmd_sent = false;
1604 * This function handles command complete interrupt
1606 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1608 struct pcie_service_card *card = adapter->card;
1609 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1610 struct sk_buff *skb = card->cmdrsp_buf;
1615 mwifiex_dbg(adapter, CMD,
1616 "info: Rx CMD Response\n");
1618 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1620 /* Unmap the command as a response has been received. */
1621 if (card->cmd_buf) {
1622 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1624 dev_kfree_skb_any(card->cmd_buf);
1625 card->cmd_buf = NULL;
1628 pkt_len = *((__le16 *)skb->data);
1629 rx_len = le16_to_cpu(pkt_len);
1630 skb_trim(skb, rx_len);
1631 skb_pull(skb, INTF_HEADER_LEN);
1633 if (!adapter->curr_cmd) {
1634 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1635 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1637 mwifiex_pcie_enable_host_int(adapter);
1638 if (mwifiex_write_reg(adapter,
1640 CPU_INTR_SLEEP_CFM_DONE)) {
1641 mwifiex_dbg(adapter, ERROR,
1642 "Write register failed\n");
1645 mwifiex_delay_for_sleep_cookie(adapter,
1646 MWIFIEX_MAX_DELAY_COUNT);
1647 while (reg->sleep_cookie && (count++ < 10) &&
1648 mwifiex_pcie_ok_to_access_hw(adapter))
1649 usleep_range(50, 60);
1651 mwifiex_dbg(adapter, ERROR,
1652 "There is no command but got cmdrsp\n");
1654 memcpy(adapter->upld_buf, skb->data,
1655 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1656 skb_push(skb, INTF_HEADER_LEN);
1657 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1658 PCI_DMA_FROMDEVICE))
1660 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1661 adapter->curr_cmd->resp_skb = skb;
1662 adapter->cmd_resp_received = true;
1663 /* Take the pointer and set it to CMD node and will
1664 return in the response complete callback */
1665 card->cmdrsp_buf = NULL;
1667 /* Clear the cmd-rsp buffer address in scratch registers. This
1668 will prevent firmware from writing to the same response
1670 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1671 mwifiex_dbg(adapter, ERROR,
1672 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1675 /* Write the upper 32bits of the cmdrsp buffer physical
1677 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1678 mwifiex_dbg(adapter, ERROR,
1679 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1688 * Command Response processing complete handler
1690 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1691 struct sk_buff *skb)
1693 struct pcie_service_card *card = adapter->card;
1696 card->cmdrsp_buf = skb;
1697 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1698 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1699 PCI_DMA_FROMDEVICE))
1707 * This function handles firmware event ready interrupt
1709 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1711 struct pcie_service_card *card = adapter->card;
1712 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1713 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1715 struct mwifiex_evt_buf_desc *desc;
1717 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1718 mwifiex_pm_wakeup_card(adapter);
1720 if (adapter->event_received) {
1721 mwifiex_dbg(adapter, EVENT,
1722 "info: Event being processed,\t"
1723 "do not process this interrupt just yet\n");
1727 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1728 mwifiex_dbg(adapter, ERROR,
1729 "info: Invalid read pointer...\n");
1733 /* Read the event ring write pointer set by firmware */
1734 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1735 mwifiex_dbg(adapter, ERROR,
1736 "EventReady: failed to read reg->evt_wrptr\n");
1740 mwifiex_dbg(adapter, EVENT,
1741 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1742 card->evtbd_rdptr, wrptr);
1743 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1744 & MWIFIEX_EVTBD_MASK)) ||
1745 ((wrptr & reg->evt_rollover_ind) ==
1746 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1747 struct sk_buff *skb_cmd;
1748 __le16 data_len = 0;
1751 mwifiex_dbg(adapter, INFO,
1752 "info: Read Index: %d\n", rdptr);
1753 skb_cmd = card->evt_buf_list[rdptr];
1754 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1756 /* Take the pointer and set it to event pointer in adapter
1757 and will return back after event handling callback */
1758 card->evt_buf_list[rdptr] = NULL;
1759 desc = card->evtbd_ring[rdptr];
1760 memset(desc, 0, sizeof(*desc));
1762 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1763 adapter->event_cause = event;
1764 /* The first 4bytes will be the event transfer header
1765 len is 2 bytes followed by type which is 2 bytes */
1766 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1767 evt_len = le16_to_cpu(data_len);
1768 skb_trim(skb_cmd, evt_len);
1769 skb_pull(skb_cmd, INTF_HEADER_LEN);
1770 mwifiex_dbg(adapter, EVENT,
1771 "info: Event length: %d\n", evt_len);
1773 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1774 memcpy(adapter->event_body, skb_cmd->data +
1775 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1776 MWIFIEX_EVENT_HEADER_LEN);
1778 adapter->event_received = true;
1779 adapter->event_skb = skb_cmd;
1781 /* Do not update the event read pointer here, wait till the
1782 buffer is released. This is just to make things simpler,
1783 we need to find a better method of managing these buffers.
1786 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1787 CPU_INTR_EVENT_DONE)) {
1788 mwifiex_dbg(adapter, ERROR,
1789 "Write register failed\n");
1798 * Event processing complete handler
1800 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1801 struct sk_buff *skb)
1803 struct pcie_service_card *card = adapter->card;
1804 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1806 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1808 struct mwifiex_evt_buf_desc *desc;
1813 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1814 mwifiex_dbg(adapter, ERROR,
1815 "event_complete: Invalid rdptr 0x%x\n",
1820 /* Read the event ring write pointer set by firmware */
1821 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1822 mwifiex_dbg(adapter, ERROR,
1823 "event_complete: failed to read reg->evt_wrptr\n");
1827 if (!card->evt_buf_list[rdptr]) {
1828 skb_push(skb, INTF_HEADER_LEN);
1829 skb_put(skb, MAX_EVENT_SIZE - skb->len);
1830 if (mwifiex_map_pci_memory(adapter, skb,
1832 PCI_DMA_FROMDEVICE))
1834 card->evt_buf_list[rdptr] = skb;
1835 desc = card->evtbd_ring[rdptr];
1836 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1837 desc->len = (u16)skb->len;
1841 mwifiex_dbg(adapter, ERROR,
1842 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1843 rdptr, card->evt_buf_list[rdptr], skb);
1846 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1847 card->evtbd_rdptr = ((card->evtbd_rdptr &
1848 reg->evt_rollover_ind) ^
1849 reg->evt_rollover_ind);
1852 mwifiex_dbg(adapter, EVENT,
1853 "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1854 card->evtbd_rdptr, wrptr);
1856 /* Write the event ring read pointer in to reg->evt_rdptr */
1857 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1858 card->evtbd_rdptr)) {
1859 mwifiex_dbg(adapter, ERROR,
1860 "event_complete: failed to read reg->evt_rdptr\n");
1864 mwifiex_dbg(adapter, EVENT,
1865 "info: Check Events Again\n");
1866 ret = mwifiex_pcie_process_event_ready(adapter);
1872 * This function downloads the firmware to the card.
1874 * Firmware is downloaded to the card in blocks. Every block download
1875 * is tested for CRC errors, and retried a number of times before
1876 * returning failure.
1878 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1879 struct mwifiex_fw_image *fw)
1882 u8 *firmware = fw->fw_buf;
1883 u32 firmware_len = fw->fw_len;
1885 struct sk_buff *skb;
1886 u32 txlen, tx_blocks = 0, tries, len;
1887 u32 block_retry_cnt = 0;
1888 struct pcie_service_card *card = adapter->card;
1889 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1891 if (!firmware || !firmware_len) {
1892 mwifiex_dbg(adapter, ERROR,
1893 "No firmware image found! Terminating download\n");
1897 mwifiex_dbg(adapter, INFO,
1898 "info: Downloading FW image (%d bytes)\n",
1901 if (mwifiex_pcie_disable_host_int(adapter)) {
1902 mwifiex_dbg(adapter, ERROR,
1903 "%s: Disabling interrupts failed.\n", __func__);
1907 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1913 /* Perform firmware data transfer */
1918 if (offset >= firmware_len)
1921 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1922 ret = mwifiex_read_reg(adapter, reg->cmd_size,
1925 mwifiex_dbg(adapter, FATAL,
1926 "Failed reading len from boot code\n");
1931 usleep_range(10, 20);
1936 } else if (len > MWIFIEX_UPLD_SIZE) {
1937 mwifiex_dbg(adapter, ERROR,
1938 "FW download failure @ %d, invalid length %d\n",
1948 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1949 mwifiex_dbg(adapter, ERROR,
1950 "FW download failure @ %d, over max\t"
1951 "retry count\n", offset);
1955 mwifiex_dbg(adapter, ERROR,
1956 "FW CRC error indicated by the\t"
1957 "helper: len = 0x%04X, txlen = %d\n",
1960 /* Setting this to 0 to resend from same offset */
1963 block_retry_cnt = 0;
1964 /* Set blocksize to transfer - checking for
1966 if (firmware_len - offset < txlen)
1967 txlen = firmware_len - offset;
1969 mwifiex_dbg(adapter, INFO, ".");
1971 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
1972 card->pcie.blksz_fw_dl;
1974 /* Copy payload to buffer */
1975 memmove(skb->data, &firmware[offset], txlen);
1978 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1979 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
1981 /* Send the boot command to device */
1982 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
1983 mwifiex_dbg(adapter, ERROR,
1984 "Failed to send firmware download command\n");
1989 /* Wait for the command done interrupt */
1991 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1993 mwifiex_dbg(adapter, ERROR,
1994 "%s: Failed to read\t"
1995 "interrupt status during fw dnld.\n",
1997 mwifiex_unmap_pci_memory(adapter, skb,
2002 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
2003 CPU_INTR_DOOR_BELL);
2005 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
2010 mwifiex_dbg(adapter, MSG,
2011 "info: FW download over, size %d bytes\n", offset);
2016 dev_kfree_skb_any(skb);
2021 * This function checks the firmware status in card.
2023 * The winner interface is also determined by this function.
2026 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2029 u32 firmware_stat, winner_status;
2030 struct pcie_service_card *card = adapter->card;
2031 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2034 /* Mask spurios interrupts */
2035 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2037 mwifiex_dbg(adapter, ERROR,
2038 "Write register failed\n");
2042 mwifiex_dbg(adapter, INFO,
2043 "Setting driver ready signature\n");
2044 if (mwifiex_write_reg(adapter, reg->drv_rdy,
2045 FIRMWARE_READY_PCIE)) {
2046 mwifiex_dbg(adapter, ERROR,
2047 "Failed to write driver ready signature\n");
2051 /* Wait for firmware initialization event */
2052 for (tries = 0; tries < poll_num; tries++) {
2053 if (mwifiex_read_reg(adapter, reg->fw_status,
2060 if (firmware_stat == FIRMWARE_READY_PCIE) {
2070 if (mwifiex_read_reg(adapter, reg->fw_status,
2073 else if (!winner_status) {
2074 mwifiex_dbg(adapter, INFO,
2075 "PCI-E is the winner\n");
2076 adapter->winner = 1;
2078 mwifiex_dbg(adapter, ERROR,
2079 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
2080 ret, adapter->winner);
2088 * This function reads the interrupt status from card.
2090 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
2093 unsigned long flags;
2095 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2098 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
2099 mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2103 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2105 mwifiex_pcie_disable_host_int(adapter);
2107 /* Clear the pending interrupts */
2108 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2110 mwifiex_dbg(adapter, ERROR,
2111 "Write register failed\n");
2114 spin_lock_irqsave(&adapter->int_lock, flags);
2115 adapter->int_status |= pcie_ireg;
2116 spin_unlock_irqrestore(&adapter->int_lock, flags);
2118 if (!adapter->pps_uapsd_mode &&
2119 adapter->ps_state == PS_STATE_SLEEP &&
2120 mwifiex_pcie_ok_to_access_hw(adapter)) {
2121 /* Potentially for PCIe we could get other
2122 * interrupts like shared. Don't change power
2123 * state until cookie is set */
2124 adapter->ps_state = PS_STATE_AWAKE;
2125 adapter->pm_wakeup_fw_try = false;
2126 del_timer(&adapter->wakeup_timer);
2132 * Interrupt handler for PCIe root port
2134 * This function reads the interrupt status from firmware and assigns
2135 * the main process in workqueue which will handle the interrupt.
2137 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2139 struct pci_dev *pdev = (struct pci_dev *)context;
2140 struct pcie_service_card *card;
2141 struct mwifiex_adapter *adapter;
2144 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
2148 card = pci_get_drvdata(pdev);
2149 if (!card || !card->adapter) {
2150 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
2151 card ? card->adapter : NULL);
2154 adapter = card->adapter;
2156 if (adapter->surprise_removed)
2159 mwifiex_interrupt_status(adapter);
2160 mwifiex_queue_main_work(adapter);
2167 * This function checks the current interrupt status.
2169 * The following interrupts are checked and handled by this function -
2172 * - Command received
2173 * - Packets received
2176 * In case of Rx packets received, the packets are uploaded from card to
2177 * host and processed accordingly.
2179 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2183 unsigned long flags;
2185 spin_lock_irqsave(&adapter->int_lock, flags);
2186 /* Clear out unused interrupts */
2187 pcie_ireg = adapter->int_status;
2188 adapter->int_status = 0;
2189 spin_unlock_irqrestore(&adapter->int_lock, flags);
2191 while (pcie_ireg & HOST_INTR_MASK) {
2192 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2193 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
2194 mwifiex_dbg(adapter, INTR,
2195 "info: TX DNLD Done\n");
2196 ret = mwifiex_pcie_send_data_complete(adapter);
2200 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2201 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
2202 mwifiex_dbg(adapter, INTR,
2204 ret = mwifiex_pcie_process_recv_data(adapter);
2208 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2209 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
2210 mwifiex_dbg(adapter, INTR,
2211 "info: Rx EVENT\n");
2212 ret = mwifiex_pcie_process_event_ready(adapter);
2217 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2218 pcie_ireg &= ~HOST_INTR_CMD_DONE;
2219 if (adapter->cmd_sent) {
2220 mwifiex_dbg(adapter, INTR,
2221 "info: CMD sent Interrupt\n");
2222 adapter->cmd_sent = false;
2224 /* Handle command response */
2225 ret = mwifiex_pcie_process_cmd_complete(adapter);
2230 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2231 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2233 mwifiex_dbg(adapter, ERROR,
2234 "Read register failed\n");
2238 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2239 if (mwifiex_write_reg(adapter,
2240 PCIE_HOST_INT_STATUS,
2242 mwifiex_dbg(adapter, ERROR,
2243 "Write register failed\n");
2250 mwifiex_dbg(adapter, INTR,
2251 "info: cmd_sent=%d data_sent=%d\n",
2252 adapter->cmd_sent, adapter->data_sent);
2253 if (adapter->ps_state != PS_STATE_SLEEP)
2254 mwifiex_pcie_enable_host_int(adapter);
2260 * This function downloads data from driver to card.
2262 * Both commands and data packets are transferred to the card by this
2265 * This function adds the PCIE specific header to the front of the buffer
2266 * before transferring. The header contains the length of the packet and
2267 * the type. The firmware handles the packets based upon this set type.
2269 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2270 struct sk_buff *skb,
2271 struct mwifiex_tx_param *tx_param)
2274 mwifiex_dbg(adapter, ERROR,
2275 "Passed NULL skb to %s\n", __func__);
2279 if (type == MWIFIEX_TYPE_DATA)
2280 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2281 else if (type == MWIFIEX_TYPE_CMD)
2282 return mwifiex_pcie_send_cmd(adapter, skb);
2287 /* This function read/write firmware */
2288 static enum rdwr_status
2289 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2293 struct pcie_service_card *card = adapter->card;
2294 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2296 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl, FW_DUMP_HOST_READY);
2298 mwifiex_dbg(adapter, ERROR,
2299 "PCIE write err\n");
2300 return RDWR_STATUS_FAILURE;
2303 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2304 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2305 if (ctrl_data == FW_DUMP_DONE)
2306 return RDWR_STATUS_SUCCESS;
2307 if (doneflag && ctrl_data == doneflag)
2308 return RDWR_STATUS_DONE;
2309 if (ctrl_data != FW_DUMP_HOST_READY) {
2310 mwifiex_dbg(adapter, WARN,
2311 "The ctrl reg was changed, re-try again!\n");
2312 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2313 FW_DUMP_HOST_READY);
2315 mwifiex_dbg(adapter, ERROR,
2316 "PCIE write err\n");
2317 return RDWR_STATUS_FAILURE;
2320 usleep_range(100, 200);
2323 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2324 return RDWR_STATUS_FAILURE;
2327 /* This function dump firmware memory to file */
2328 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2330 struct pcie_service_card *card = adapter->card;
2331 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2332 unsigned int reg, reg_start, reg_end;
2333 u8 *dbg_ptr, *end_ptr, dump_num, idx, i, read_reg, doneflag = 0;
2334 enum rdwr_status stat;
2338 if (!card->pcie.can_dump_fw)
2341 for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) {
2342 struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
2344 if (entry->mem_ptr) {
2345 vfree(entry->mem_ptr);
2346 entry->mem_ptr = NULL;
2348 entry->mem_size = 0;
2351 mwifiex_dbg(adapter, DUMP, "== mwifiex firmware dump start ==\n");
2353 /* Read the number of the memories which will dump */
2354 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2355 if (stat == RDWR_STATUS_FAILURE)
2358 reg = creg->fw_dump_start;
2359 mwifiex_read_reg_byte(adapter, reg, &dump_num);
2361 /* Read the length of every memory which will dump */
2362 for (idx = 0; idx < dump_num; idx++) {
2363 struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
2365 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2366 if (stat == RDWR_STATUS_FAILURE)
2370 reg = creg->fw_dump_start;
2371 for (i = 0; i < 4; i++) {
2372 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2373 memory_size |= (read_reg << (i * 8));
2377 if (memory_size == 0) {
2378 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2379 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2382 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2388 mwifiex_dbg(adapter, DUMP,
2389 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2390 entry->mem_ptr = vmalloc(memory_size + 1);
2391 entry->mem_size = memory_size;
2392 if (!entry->mem_ptr) {
2393 mwifiex_dbg(adapter, ERROR,
2394 "Vmalloc %s failed\n", entry->mem_name);
2397 dbg_ptr = entry->mem_ptr;
2398 end_ptr = dbg_ptr + memory_size;
2400 doneflag = entry->done_flag;
2401 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2405 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2406 if (RDWR_STATUS_FAILURE == stat)
2409 reg_start = creg->fw_dump_start;
2410 reg_end = creg->fw_dump_end;
2411 for (reg = reg_start; reg <= reg_end; reg++) {
2412 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2413 if (dbg_ptr < end_ptr) {
2416 mwifiex_dbg(adapter, ERROR,
2417 "Allocated buf not enough\n");
2422 if (stat != RDWR_STATUS_DONE)
2425 mwifiex_dbg(adapter, DUMP,
2426 "%s done: size=0x%tx\n",
2427 entry->mem_name, dbg_ptr - entry->mem_ptr);
2431 mwifiex_dbg(adapter, DUMP, "== mwifiex firmware dump end ==\n");
2434 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2436 mwifiex_drv_info_dump(adapter);
2437 mwifiex_pcie_fw_dump(adapter);
2438 mwifiex_upload_device_dump(adapter);
2441 static unsigned long iface_work_flags;
2442 static struct mwifiex_adapter *save_adapter;
2443 static void mwifiex_pcie_work(struct work_struct *work)
2445 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2447 mwifiex_pcie_device_dump_work(save_adapter);
2450 static DECLARE_WORK(pcie_work, mwifiex_pcie_work);
2451 /* This function dumps FW information */
2452 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2454 save_adapter = adapter;
2455 if (test_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &iface_work_flags))
2458 set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &iface_work_flags);
2460 schedule_work(&pcie_work);
2464 * This function initializes the PCI-E host memory space, WCB rings, etc.
2466 * The following initializations steps are followed -
2467 * - Allocate TXBD ring buffers
2468 * - Allocate RXBD ring buffers
2469 * - Allocate event BD ring buffers
2470 * - Allocate command response ring buffer
2471 * - Allocate sleep cookie buffer
2473 static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
2475 struct pcie_service_card *card = adapter->card;
2477 struct pci_dev *pdev = card->dev;
2478 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2480 pci_set_drvdata(pdev, card);
2482 ret = pci_enable_device(pdev);
2484 goto err_enable_dev;
2486 pci_set_master(pdev);
2488 mwifiex_dbg(adapter, INFO,
2489 "try set_consistent_dma_mask(32)\n");
2490 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2492 mwifiex_dbg(adapter, ERROR,
2493 "set_dma_mask(32) failed\n");
2494 goto err_set_dma_mask;
2497 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2499 mwifiex_dbg(adapter, ERROR,
2500 "set_consistent_dma_mask(64) failed\n");
2501 goto err_set_dma_mask;
2504 ret = pci_request_region(pdev, 0, DRV_NAME);
2506 mwifiex_dbg(adapter, ERROR,
2507 "req_reg(0) error\n");
2508 goto err_req_region0;
2510 card->pci_mmap = pci_iomap(pdev, 0, 0);
2511 if (!card->pci_mmap) {
2512 mwifiex_dbg(adapter, ERROR, "iomap(0) error\n");
2516 ret = pci_request_region(pdev, 2, DRV_NAME);
2518 mwifiex_dbg(adapter, ERROR, "req_reg(2) error\n");
2519 goto err_req_region2;
2521 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2522 if (!card->pci_mmap1) {
2523 mwifiex_dbg(adapter, ERROR,
2524 "iomap(2) error\n");
2529 mwifiex_dbg(adapter, INFO,
2530 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2531 card->pci_mmap, card->pci_mmap1);
2533 card->cmdrsp_buf = NULL;
2534 ret = mwifiex_pcie_create_txbd_ring(adapter);
2537 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2540 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2543 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2545 goto err_alloc_cmdbuf;
2546 if (reg->sleep_cookie) {
2547 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2549 goto err_alloc_cookie;
2551 card->sleep_cookie_vbase = NULL;
2556 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2558 mwifiex_pcie_delete_evtbd_ring(adapter);
2560 mwifiex_pcie_delete_rxbd_ring(adapter);
2562 mwifiex_pcie_delete_txbd_ring(adapter);
2564 pci_iounmap(pdev, card->pci_mmap1);
2566 pci_release_region(pdev, 2);
2568 pci_iounmap(pdev, card->pci_mmap);
2570 pci_release_region(pdev, 0);
2573 pci_disable_device(pdev);
2575 pci_set_drvdata(pdev, NULL);
2580 * This function cleans up the allocated card buffers.
2582 * The following are freed by this function -
2583 * - TXBD ring buffers
2584 * - RXBD ring buffers
2585 * - Event BD ring buffers
2586 * - Command response ring buffer
2587 * - Sleep cookie buffer
2589 static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
2591 struct pcie_service_card *card = adapter->card;
2592 struct pci_dev *pdev = card->dev;
2593 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2596 mwifiex_dbg(adapter, INFO,
2597 "Clearing driver ready signature\n");
2598 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
2599 mwifiex_dbg(adapter, ERROR,
2600 "Failed to write driver not-ready signature\n");
2604 pci_iounmap(pdev, card->pci_mmap);
2605 pci_iounmap(pdev, card->pci_mmap1);
2606 pci_disable_device(pdev);
2607 pci_release_region(pdev, 2);
2608 pci_release_region(pdev, 0);
2609 pci_set_drvdata(pdev, NULL);
2615 * This function registers the PCIE device.
2617 * PCIE IRQ is claimed, block size is set and driver data is initialized.
2619 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
2622 struct pcie_service_card *card = adapter->card;
2623 struct pci_dev *pdev = card->dev;
2625 /* save adapter pointer in card */
2626 card->adapter = adapter;
2628 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
2631 mwifiex_dbg(adapter, ERROR,
2632 "request_irq failed: ret=%d\n", ret);
2633 adapter->card = NULL;
2637 adapter->dev = &pdev->dev;
2638 adapter->tx_buf_size = card->pcie.tx_buf_size;
2639 adapter->mem_type_mapping_tbl = mem_type_mapping_tbl;
2640 adapter->num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl);
2641 strcpy(adapter->fw_name, card->pcie.firmware);
2642 adapter->ext_scan = card->pcie.can_ext_scan;
2648 * This function unregisters the PCIE device.
2650 * The PCIE IRQ is released, the function is disabled and driver
2651 * data is set to null.
2653 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
2655 struct pcie_service_card *card = adapter->card;
2656 const struct mwifiex_pcie_card_reg *reg;
2659 mwifiex_dbg(adapter, INFO,
2660 "%s(): calling free_irq()\n", __func__);
2661 free_irq(card->dev->irq, card->dev);
2663 reg = card->pcie.reg;
2664 if (reg->sleep_cookie)
2665 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2667 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2668 mwifiex_pcie_delete_evtbd_ring(adapter);
2669 mwifiex_pcie_delete_rxbd_ring(adapter);
2670 mwifiex_pcie_delete_txbd_ring(adapter);
2671 card->cmdrsp_buf = NULL;
2675 static struct mwifiex_if_ops pcie_ops = {
2676 .init_if = mwifiex_pcie_init,
2677 .cleanup_if = mwifiex_pcie_cleanup,
2678 .check_fw_status = mwifiex_check_fw_status,
2679 .prog_fw = mwifiex_prog_fw_w_helper,
2680 .register_dev = mwifiex_register_dev,
2681 .unregister_dev = mwifiex_unregister_dev,
2682 .enable_int = mwifiex_pcie_enable_host_int,
2683 .process_int_status = mwifiex_process_int_status,
2684 .host_to_card = mwifiex_pcie_host_to_card,
2685 .wakeup = mwifiex_pm_wakeup_card,
2686 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
2689 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
2690 .event_complete = mwifiex_pcie_event_complete,
2691 .update_mp_end_port = NULL,
2692 .cleanup_mpa_buf = NULL,
2693 .init_fw_port = mwifiex_pcie_init_fw_port,
2694 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
2695 .device_dump = mwifiex_pcie_device_dump,
2699 * This function initializes the PCIE driver module.
2701 * This initiates the semaphore and registers the device with
2704 static int mwifiex_pcie_init_module(void)
2708 pr_debug("Marvell PCIe Driver\n");
2710 sema_init(&add_remove_card_sem, 1);
2712 /* Clear the flag in case user removes the card. */
2715 ret = pci_register_driver(&mwifiex_pcie);
2717 pr_err("Driver register failed!\n");
2719 pr_debug("info: Driver registered successfully!\n");
2725 * This function cleans up the PCIE driver.
2727 * The following major steps are followed for cleanup -
2728 * - Resume the device if its suspended
2729 * - Disconnect the device if connected
2730 * - Shutdown the firmware
2731 * - Unregister the device from PCIE bus.
2733 static void mwifiex_pcie_cleanup_module(void)
2735 if (!down_interruptible(&add_remove_card_sem))
2736 up(&add_remove_card_sem);
2738 /* Set the flag as user is removing this module. */
2741 cancel_work_sync(&pcie_work);
2742 pci_unregister_driver(&mwifiex_pcie);
2745 module_init(mwifiex_pcie_init_module);
2746 module_exit(mwifiex_pcie_cleanup_module);
2748 MODULE_AUTHOR("Marvell International Ltd.");
2749 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
2750 MODULE_VERSION(PCIE_VERSION);
2751 MODULE_LICENSE("GPL v2");