2 * NXP Wireless LAN device driver: PCIE specific handling
4 * Copyright 2011-2020 NXP
6 * This software file (the "File") is distributed by NXP
7 * 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"
34 static struct mwifiex_if_ops pcie_ops;
36 static const struct of_device_id mwifiex_pcie_of_match_table[] = {
37 { .compatible = "pci11ab,2b42" },
38 { .compatible = "pci1b4b,2b42" },
42 static int mwifiex_pcie_probe_of(struct device *dev)
44 if (!of_match_node(mwifiex_pcie_of_match_table, dev->of_node)) {
45 dev_err(dev, "required compatible string missing\n");
52 static void mwifiex_pcie_work(struct work_struct *work);
55 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
56 size_t size, int flags)
58 struct pcie_service_card *card = adapter->card;
59 struct mwifiex_dma_mapping mapping;
61 mapping.addr = dma_map_single(&card->dev->dev, skb->data, size, flags);
62 if (dma_mapping_error(&card->dev->dev, mapping.addr)) {
63 mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n");
67 mwifiex_store_mapping(skb, &mapping);
71 static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter,
72 struct sk_buff *skb, int flags)
74 struct pcie_service_card *card = adapter->card;
75 struct mwifiex_dma_mapping mapping;
77 mwifiex_get_mapping(skb, &mapping);
78 dma_unmap_single(&card->dev->dev, mapping.addr, mapping.len, flags);
82 * This function writes data into PCIE card register.
84 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
86 struct pcie_service_card *card = adapter->card;
88 iowrite32(data, card->pci_mmap1 + reg);
93 /* This function reads data from PCIE card register.
95 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
97 struct pcie_service_card *card = adapter->card;
99 *data = ioread32(card->pci_mmap1 + reg);
100 if (*data == 0xffffffff)
106 /* This function reads u8 data from PCIE card register. */
107 static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter,
110 struct pcie_service_card *card = adapter->card;
112 *data = ioread8(card->pci_mmap1 + reg);
118 * This function reads sleep cookie and checks if FW is ready
120 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
123 struct pcie_service_card *card = adapter->card;
124 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
126 if (!reg->sleep_cookie)
129 if (card->sleep_cookie_vbase) {
130 cookie_value = get_unaligned_le32(card->sleep_cookie_vbase);
131 mwifiex_dbg(adapter, INFO,
132 "info: ACCESS_HW: sleep cookie=0x%x\n",
134 if (cookie_value == FW_AWAKE_COOKIE)
141 #ifdef CONFIG_PM_SLEEP
143 * Kernel needs to suspend all functions separately. Therefore all
144 * registered functions must have drivers with suspend and resume
145 * methods. Failing that the kernel simply removes the whole card.
147 * If already not suspended, this function allocates and sends a host
148 * sleep activate request to the firmware and turns off the traffic.
150 static int mwifiex_pcie_suspend(struct device *dev)
152 struct mwifiex_adapter *adapter;
153 struct pcie_service_card *card = dev_get_drvdata(dev);
156 /* Might still be loading firmware */
157 wait_for_completion(&card->fw_done);
159 adapter = card->adapter;
161 dev_err(dev, "adapter is not valid\n");
165 mwifiex_enable_wake(adapter);
167 /* Enable the Host Sleep */
168 if (!mwifiex_enable_hs(adapter)) {
169 mwifiex_dbg(adapter, ERROR,
170 "cmd: failed to suspend\n");
171 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
172 mwifiex_disable_wake(adapter);
176 flush_workqueue(adapter->workqueue);
178 /* Indicate device suspended */
179 set_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
180 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
186 * Kernel needs to suspend all functions separately. Therefore all
187 * registered functions must have drivers with suspend and resume
188 * methods. Failing that the kernel simply removes the whole card.
190 * If already not resumed, this function turns on the traffic and
191 * sends a host sleep cancel request to the firmware.
193 static int mwifiex_pcie_resume(struct device *dev)
195 struct mwifiex_adapter *adapter;
196 struct pcie_service_card *card = dev_get_drvdata(dev);
199 if (!card->adapter) {
200 dev_err(dev, "adapter structure is not valid\n");
204 adapter = card->adapter;
206 if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) {
207 mwifiex_dbg(adapter, WARN,
208 "Device already resumed\n");
212 clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
214 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
216 mwifiex_disable_wake(adapter);
223 * This function probes an mwifiex device and registers it. It allocates
224 * the card structure, enables PCIE function number and initiates the
225 * device registration and initialization procedure by adding a logical
228 static int mwifiex_pcie_probe(struct pci_dev *pdev,
229 const struct pci_device_id *ent)
231 struct pcie_service_card *card;
234 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
235 pdev->vendor, pdev->device, pdev->revision);
237 card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
241 init_completion(&card->fw_done);
245 if (ent->driver_data) {
246 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
247 card->pcie.reg = data->reg;
248 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
249 card->pcie.tx_buf_size = data->tx_buf_size;
250 card->pcie.can_dump_fw = data->can_dump_fw;
251 card->pcie.mem_type_mapping_tbl = data->mem_type_mapping_tbl;
252 card->pcie.num_mem_types = data->num_mem_types;
253 card->pcie.can_ext_scan = data->can_ext_scan;
254 INIT_WORK(&card->work, mwifiex_pcie_work);
257 /* device tree node parsing and platform specific configuration*/
258 if (pdev->dev.of_node) {
259 ret = mwifiex_pcie_probe_of(&pdev->dev);
264 if (mwifiex_add_card(card, &card->fw_done, &pcie_ops,
265 MWIFIEX_PCIE, &pdev->dev)) {
266 pr_err("%s failed\n", __func__);
274 * This function removes the interface and frees up the card structure.
276 static void mwifiex_pcie_remove(struct pci_dev *pdev)
278 struct pcie_service_card *card;
279 struct mwifiex_adapter *adapter;
280 struct mwifiex_private *priv;
281 const struct mwifiex_pcie_card_reg *reg;
285 card = pci_get_drvdata(pdev);
287 wait_for_completion(&card->fw_done);
289 adapter = card->adapter;
290 if (!adapter || !adapter->priv_num)
293 reg = card->pcie.reg;
295 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
299 if (fw_status == FIRMWARE_READY_PCIE && !adapter->mfg_mode) {
300 mwifiex_deauthenticate_all(adapter);
302 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
304 mwifiex_disable_auto_ds(priv);
306 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
309 mwifiex_remove_card(adapter);
312 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
314 mwifiex_pcie_remove(pdev);
319 static void mwifiex_pcie_coredump(struct device *dev)
321 struct pci_dev *pdev;
322 struct pcie_service_card *card;
324 pdev = container_of(dev, struct pci_dev, dev);
325 card = pci_get_drvdata(pdev);
327 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
329 schedule_work(&card->work);
332 static const struct pci_device_id mwifiex_ids[] = {
334 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
335 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
336 .driver_data = (unsigned long)&mwifiex_pcie8766,
339 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
340 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
341 .driver_data = (unsigned long)&mwifiex_pcie8897,
344 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
345 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
346 .driver_data = (unsigned long)&mwifiex_pcie8997,
349 PCIE_VENDOR_ID_V2_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
350 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
351 .driver_data = (unsigned long)&mwifiex_pcie8997,
356 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
359 * Cleanup all software without cleaning anything related to PCIe and HW.
361 static void mwifiex_pcie_reset_prepare(struct pci_dev *pdev)
363 struct pcie_service_card *card = pci_get_drvdata(pdev);
364 struct mwifiex_adapter *adapter = card->adapter;
367 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
372 mwifiex_dbg(adapter, INFO,
373 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Pre-FLR\n",
374 __func__, pdev->vendor, pdev->device, pdev->revision);
376 mwifiex_shutdown_sw(adapter);
377 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
378 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
379 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
383 * Kernel stores and restores PCIe function context before and after performing
384 * FLR respectively. Reconfigure the software and firmware including firmware
387 static void mwifiex_pcie_reset_done(struct pci_dev *pdev)
389 struct pcie_service_card *card = pci_get_drvdata(pdev);
390 struct mwifiex_adapter *adapter = card->adapter;
394 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
399 mwifiex_dbg(adapter, INFO,
400 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Post-FLR\n",
401 __func__, pdev->vendor, pdev->device, pdev->revision);
403 ret = mwifiex_reinit_sw(adapter);
405 dev_err(&pdev->dev, "reinit failed: %d\n", ret);
407 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
410 static const struct pci_error_handlers mwifiex_pcie_err_handler = {
411 .reset_prepare = mwifiex_pcie_reset_prepare,
412 .reset_done = mwifiex_pcie_reset_done,
415 #ifdef CONFIG_PM_SLEEP
416 /* Power Management Hooks */
417 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
418 mwifiex_pcie_resume);
421 /* PCI Device Driver */
422 static struct pci_driver __refdata mwifiex_pcie = {
423 .name = "mwifiex_pcie",
424 .id_table = mwifiex_ids,
425 .probe = mwifiex_pcie_probe,
426 .remove = mwifiex_pcie_remove,
428 .coredump = mwifiex_pcie_coredump,
429 #ifdef CONFIG_PM_SLEEP
430 .pm = &mwifiex_pcie_pm_ops,
433 .shutdown = mwifiex_pcie_shutdown,
434 .err_handler = &mwifiex_pcie_err_handler,
438 * This function adds delay loop to ensure FW is awake before proceeding.
440 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
444 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
446 usleep_range(10, 20);
455 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
456 u32 max_delay_loop_cnt)
458 struct pcie_service_card *card = adapter->card;
460 u32 sleep_cookie, count;
461 struct sk_buff *cmdrsp = card->cmdrsp_buf;
463 for (count = 0; count < max_delay_loop_cnt; count++) {
464 dma_sync_single_for_cpu(&card->dev->dev,
465 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
466 sizeof(sleep_cookie), DMA_FROM_DEVICE);
467 buffer = cmdrsp->data;
468 sleep_cookie = get_unaligned_le32(buffer);
470 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
471 mwifiex_dbg(adapter, INFO,
472 "sleep cookie found at count %d\n", count);
475 dma_sync_single_for_device(&card->dev->dev,
476 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
477 sizeof(sleep_cookie),
479 usleep_range(20, 30);
482 if (count >= max_delay_loop_cnt)
483 mwifiex_dbg(adapter, INFO,
484 "max count reached while accessing sleep cookie\n");
487 /* This function wakes up the card by reading fw_status register. */
488 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
490 struct pcie_service_card *card = adapter->card;
491 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
493 mwifiex_dbg(adapter, EVENT,
494 "event: Wakeup device...\n");
496 if (reg->sleep_cookie)
497 mwifiex_pcie_dev_wakeup_delay(adapter);
499 /* Accessing fw_status register will wakeup device */
500 if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
501 mwifiex_dbg(adapter, ERROR,
502 "Writing fw_status register failed\n");
506 if (reg->sleep_cookie) {
507 mwifiex_pcie_dev_wakeup_delay(adapter);
508 mwifiex_dbg(adapter, INFO,
509 "PCIE wakeup: Setting PS_STATE_AWAKE\n");
510 adapter->ps_state = PS_STATE_AWAKE;
517 * This function is called after the card has woken up.
519 * The card configuration register is reset.
521 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
523 mwifiex_dbg(adapter, CMD,
524 "cmd: Wakeup device completed\n");
530 * This function disables the host interrupt.
532 * The host interrupt mask is read, the disable bit is reset and
533 * written back to the card host interrupt mask register.
535 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
537 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
538 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
540 mwifiex_dbg(adapter, ERROR,
541 "Disable host interrupt failed\n");
546 atomic_set(&adapter->tx_hw_pending, 0);
550 static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter)
552 WARN_ON(mwifiex_pcie_disable_host_int(adapter));
556 * This function enables the host interrupt.
558 * The host interrupt enable mask is written to the card
559 * host interrupt mask register.
561 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
563 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
564 /* Simply write the mask to the register */
565 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
567 mwifiex_dbg(adapter, ERROR,
568 "Enable host interrupt failed\n");
577 * This function initializes TX buffer ring descriptors
579 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
581 struct pcie_service_card *card = adapter->card;
582 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
583 struct mwifiex_pcie_buf_desc *desc;
584 struct mwifiex_pfu_buf_desc *desc2;
587 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
588 card->tx_buf_list[i] = NULL;
589 if (reg->pfu_enabled) {
590 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
591 (sizeof(*desc2) * i);
592 desc2 = card->txbd_ring[i];
593 memset(desc2, 0, sizeof(*desc2));
595 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
597 desc = card->txbd_ring[i];
598 memset(desc, 0, sizeof(*desc));
605 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
606 * here and after mapping PCI memory, its physical address is assigned to
607 * PCIE Rx buffer descriptor's physical address.
609 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
611 struct pcie_service_card *card = adapter->card;
612 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
614 struct mwifiex_pcie_buf_desc *desc;
615 struct mwifiex_pfu_buf_desc *desc2;
619 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
620 /* Allocate skb here so that firmware can DMA data from it */
621 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
624 mwifiex_dbg(adapter, ERROR,
625 "Unable to allocate skb for RX ring.\n");
626 kfree(card->rxbd_ring_vbase);
630 if (mwifiex_map_pci_memory(adapter, skb,
631 MWIFIEX_RX_DATA_BUF_SIZE,
635 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
637 mwifiex_dbg(adapter, INFO,
638 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
639 skb, skb->len, skb->data, (u32)buf_pa,
640 (u32)((u64)buf_pa >> 32));
642 card->rx_buf_list[i] = skb;
643 if (reg->pfu_enabled) {
644 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
645 (sizeof(*desc2) * i);
646 desc2 = card->rxbd_ring[i];
647 desc2->paddr = buf_pa;
648 desc2->len = (u16)skb->len;
649 desc2->frag_len = (u16)skb->len;
650 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
653 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
654 (sizeof(*desc) * i));
655 desc = card->rxbd_ring[i];
656 desc->paddr = buf_pa;
657 desc->len = (u16)skb->len;
665 /* This function initializes event buffer ring descriptors. Each SKB is
666 * allocated here and after mapping PCI memory, its physical address is assigned
667 * to PCIE Rx buffer descriptor's physical address
669 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
671 struct pcie_service_card *card = adapter->card;
672 struct mwifiex_evt_buf_desc *desc;
677 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
678 /* Allocate skb here so that firmware can DMA data from it */
679 skb = dev_alloc_skb(MAX_EVENT_SIZE);
681 mwifiex_dbg(adapter, ERROR,
682 "Unable to allocate skb for EVENT buf.\n");
683 kfree(card->evtbd_ring_vbase);
686 skb_put(skb, MAX_EVENT_SIZE);
688 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
691 kfree(card->evtbd_ring_vbase);
695 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
697 mwifiex_dbg(adapter, EVENT,
698 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
699 skb, skb->len, skb->data, (u32)buf_pa,
700 (u32)((u64)buf_pa >> 32));
702 card->evt_buf_list[i] = skb;
703 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
704 (sizeof(*desc) * i));
705 desc = card->evtbd_ring[i];
706 desc->paddr = buf_pa;
707 desc->len = (u16)skb->len;
714 /* This function cleans up TX buffer rings. If any of the buffer list has valid
715 * SKB address, associated SKB is freed.
717 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
719 struct pcie_service_card *card = adapter->card;
720 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
722 struct mwifiex_pcie_buf_desc *desc;
723 struct mwifiex_pfu_buf_desc *desc2;
726 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
727 if (reg->pfu_enabled) {
728 desc2 = card->txbd_ring[i];
729 if (card->tx_buf_list[i]) {
730 skb = card->tx_buf_list[i];
731 mwifiex_unmap_pci_memory(adapter, skb,
733 dev_kfree_skb_any(skb);
735 memset(desc2, 0, sizeof(*desc2));
737 desc = card->txbd_ring[i];
738 if (card->tx_buf_list[i]) {
739 skb = card->tx_buf_list[i];
740 mwifiex_unmap_pci_memory(adapter, skb,
742 dev_kfree_skb_any(skb);
744 memset(desc, 0, sizeof(*desc));
746 card->tx_buf_list[i] = NULL;
749 atomic_set(&adapter->tx_hw_pending, 0);
753 /* This function cleans up RX buffer rings. If any of the buffer list has valid
754 * SKB address, associated SKB is freed.
756 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
758 struct pcie_service_card *card = adapter->card;
759 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
760 struct mwifiex_pcie_buf_desc *desc;
761 struct mwifiex_pfu_buf_desc *desc2;
765 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
766 if (reg->pfu_enabled) {
767 desc2 = card->rxbd_ring[i];
768 if (card->rx_buf_list[i]) {
769 skb = card->rx_buf_list[i];
770 mwifiex_unmap_pci_memory(adapter, skb,
772 dev_kfree_skb_any(skb);
774 memset(desc2, 0, sizeof(*desc2));
776 desc = card->rxbd_ring[i];
777 if (card->rx_buf_list[i]) {
778 skb = card->rx_buf_list[i];
779 mwifiex_unmap_pci_memory(adapter, skb,
781 dev_kfree_skb_any(skb);
783 memset(desc, 0, sizeof(*desc));
785 card->rx_buf_list[i] = NULL;
791 /* This function cleans up event buffer rings. If any of the buffer list has
792 * valid SKB address, associated SKB is freed.
794 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
796 struct pcie_service_card *card = adapter->card;
797 struct mwifiex_evt_buf_desc *desc;
801 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
802 desc = card->evtbd_ring[i];
803 if (card->evt_buf_list[i]) {
804 skb = card->evt_buf_list[i];
805 mwifiex_unmap_pci_memory(adapter, skb,
807 dev_kfree_skb_any(skb);
809 card->evt_buf_list[i] = NULL;
810 memset(desc, 0, sizeof(*desc));
816 /* This function creates buffer descriptor ring for TX
818 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
820 struct pcie_service_card *card = adapter->card;
821 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
824 * driver maintaines the write pointer and firmware maintaines the read
825 * pointer. The write pointer starts at 0 (zero) while the read pointer
826 * starts at zero with rollover bit set
828 card->txbd_wrptr = 0;
830 if (reg->pfu_enabled)
831 card->txbd_rdptr = 0;
833 card->txbd_rdptr |= reg->tx_rollover_ind;
835 /* allocate shared memory for the BD ring and divide the same in to
836 several descriptors */
837 if (reg->pfu_enabled)
838 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
841 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
844 mwifiex_dbg(adapter, INFO,
845 "info: txbd_ring: Allocating %d bytes\n",
846 card->txbd_ring_size);
847 card->txbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
848 card->txbd_ring_size,
849 &card->txbd_ring_pbase,
851 if (!card->txbd_ring_vbase) {
852 mwifiex_dbg(adapter, ERROR,
853 "allocate coherent memory (%d bytes) failed!\n",
854 card->txbd_ring_size);
858 mwifiex_dbg(adapter, DATA,
859 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
860 card->txbd_ring_vbase, (u32)card->txbd_ring_pbase,
861 (u32)((u64)card->txbd_ring_pbase >> 32),
862 card->txbd_ring_size);
864 return mwifiex_init_txq_ring(adapter);
867 static int mwifiex_pcie_delete_txbd_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_txq_ring(adapter);
874 if (card->txbd_ring_vbase)
875 dma_free_coherent(&card->dev->dev, card->txbd_ring_size,
876 card->txbd_ring_vbase,
877 card->txbd_ring_pbase);
878 card->txbd_ring_size = 0;
879 card->txbd_wrptr = 0;
880 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
881 card->txbd_ring_vbase = NULL;
882 card->txbd_ring_pbase = 0;
888 * This function creates buffer descriptor ring for RX
890 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
892 struct pcie_service_card *card = adapter->card;
893 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
896 * driver maintaines the read pointer and firmware maintaines the write
897 * pointer. The write pointer starts at 0 (zero) while the read pointer
898 * starts at zero with rollover bit set
900 card->rxbd_wrptr = 0;
901 card->rxbd_rdptr = reg->rx_rollover_ind;
903 if (reg->pfu_enabled)
904 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
907 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
910 mwifiex_dbg(adapter, INFO,
911 "info: rxbd_ring: Allocating %d bytes\n",
912 card->rxbd_ring_size);
913 card->rxbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
914 card->rxbd_ring_size,
915 &card->rxbd_ring_pbase,
917 if (!card->rxbd_ring_vbase) {
918 mwifiex_dbg(adapter, ERROR,
919 "allocate coherent memory (%d bytes) failed!\n",
920 card->rxbd_ring_size);
924 mwifiex_dbg(adapter, DATA,
925 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
926 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
927 (u32)((u64)card->rxbd_ring_pbase >> 32),
928 card->rxbd_ring_size);
930 return mwifiex_init_rxq_ring(adapter);
934 * This function deletes Buffer descriptor ring for RX
936 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
938 struct pcie_service_card *card = adapter->card;
939 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
941 mwifiex_cleanup_rxq_ring(adapter);
943 if (card->rxbd_ring_vbase)
944 dma_free_coherent(&card->dev->dev, card->rxbd_ring_size,
945 card->rxbd_ring_vbase,
946 card->rxbd_ring_pbase);
947 card->rxbd_ring_size = 0;
948 card->rxbd_wrptr = 0;
949 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
950 card->rxbd_ring_vbase = NULL;
951 card->rxbd_ring_pbase = 0;
957 * This function creates buffer descriptor ring for Events
959 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
961 struct pcie_service_card *card = adapter->card;
962 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
965 * driver maintaines the read pointer and firmware maintaines the write
966 * pointer. The write pointer starts at 0 (zero) while the read pointer
967 * starts at zero with rollover bit set
969 card->evtbd_wrptr = 0;
970 card->evtbd_rdptr = reg->evt_rollover_ind;
972 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
975 mwifiex_dbg(adapter, INFO,
976 "info: evtbd_ring: Allocating %d bytes\n",
977 card->evtbd_ring_size);
978 card->evtbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
979 card->evtbd_ring_size,
980 &card->evtbd_ring_pbase,
982 if (!card->evtbd_ring_vbase) {
983 mwifiex_dbg(adapter, ERROR,
984 "allocate coherent memory (%d bytes) failed!\n",
985 card->evtbd_ring_size);
989 mwifiex_dbg(adapter, EVENT,
990 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
991 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
992 (u32)((u64)card->evtbd_ring_pbase >> 32),
993 card->evtbd_ring_size);
995 return mwifiex_pcie_init_evt_ring(adapter);
999 * This function deletes Buffer descriptor ring for Events
1001 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
1003 struct pcie_service_card *card = adapter->card;
1004 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1006 mwifiex_cleanup_evt_ring(adapter);
1008 if (card->evtbd_ring_vbase)
1009 dma_free_coherent(&card->dev->dev, card->evtbd_ring_size,
1010 card->evtbd_ring_vbase,
1011 card->evtbd_ring_pbase);
1012 card->evtbd_wrptr = 0;
1013 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
1014 card->evtbd_ring_size = 0;
1015 card->evtbd_ring_vbase = NULL;
1016 card->evtbd_ring_pbase = 0;
1022 * This function allocates a buffer for CMDRSP
1024 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
1026 struct pcie_service_card *card = adapter->card;
1027 struct sk_buff *skb;
1029 /* Allocate memory for receiving command response data */
1030 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1032 mwifiex_dbg(adapter, ERROR,
1033 "Unable to allocate skb for command response data.\n");
1036 skb_put(skb, MWIFIEX_UPLD_SIZE);
1037 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1043 card->cmdrsp_buf = skb;
1049 * This function deletes a buffer for CMDRSP
1051 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
1053 struct pcie_service_card *card;
1058 card = adapter->card;
1060 if (card && card->cmdrsp_buf) {
1061 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
1063 dev_kfree_skb_any(card->cmdrsp_buf);
1064 card->cmdrsp_buf = NULL;
1067 if (card && card->cmd_buf) {
1068 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1070 dev_kfree_skb_any(card->cmd_buf);
1071 card->cmd_buf = NULL;
1077 * This function allocates a buffer for sleep cookie
1079 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1081 struct pcie_service_card *card = adapter->card;
1084 card->sleep_cookie_vbase = dma_alloc_coherent(&card->dev->dev,
1086 &card->sleep_cookie_pbase,
1088 if (!card->sleep_cookie_vbase) {
1089 mwifiex_dbg(adapter, ERROR,
1090 "dma_alloc_coherent failed!\n");
1093 /* Init val of Sleep Cookie */
1094 tmp = FW_AWAKE_COOKIE;
1095 put_unaligned(tmp, card->sleep_cookie_vbase);
1097 mwifiex_dbg(adapter, INFO,
1098 "alloc_scook: sleep cookie=0x%x\n",
1099 get_unaligned(card->sleep_cookie_vbase));
1105 * This function deletes buffer for sleep cookie
1107 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1109 struct pcie_service_card *card;
1114 card = adapter->card;
1116 if (card && card->sleep_cookie_vbase) {
1117 dma_free_coherent(&card->dev->dev, sizeof(u32),
1118 card->sleep_cookie_vbase,
1119 card->sleep_cookie_pbase);
1120 card->sleep_cookie_vbase = NULL;
1126 /* This function flushes the TX buffer descriptor ring
1127 * This function defined as handler is also called while cleaning TXRX
1128 * during disconnect/ bss stop.
1130 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1132 struct pcie_service_card *card = adapter->card;
1134 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1135 card->txbd_flush = 1;
1136 /* write pointer already set at last send
1137 * send dnld-rdy intr again, wait for completion.
1139 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1140 CPU_INTR_DNLD_RDY)) {
1141 mwifiex_dbg(adapter, ERROR,
1142 "failed to assert dnld-rdy interrupt.\n");
1150 * This function unmaps and frees downloaded data buffer
1152 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1154 struct sk_buff *skb;
1155 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1156 struct mwifiex_pcie_buf_desc *desc;
1157 struct mwifiex_pfu_buf_desc *desc2;
1158 struct pcie_service_card *card = adapter->card;
1159 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1161 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1162 mwifiex_pm_wakeup_card(adapter);
1164 /* Read the TX ring read pointer set by firmware */
1165 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1166 mwifiex_dbg(adapter, ERROR,
1167 "SEND COMP: failed to read reg->tx_rdptr\n");
1171 mwifiex_dbg(adapter, DATA,
1172 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1173 card->txbd_rdptr, rdptr);
1175 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1176 /* free from previous txbd_rdptr to current txbd_rdptr */
1177 while (((card->txbd_rdptr & reg->tx_mask) !=
1178 (rdptr & reg->tx_mask)) ||
1179 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1180 (rdptr & reg->tx_rollover_ind))) {
1181 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1184 skb = card->tx_buf_list[wrdoneidx];
1187 mwifiex_dbg(adapter, DATA,
1188 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1190 mwifiex_unmap_pci_memory(adapter, skb,
1195 if (card->txbd_flush)
1196 mwifiex_write_data_complete(adapter, skb, 0,
1199 mwifiex_write_data_complete(adapter, skb, 0, 0);
1200 atomic_dec(&adapter->tx_hw_pending);
1203 card->tx_buf_list[wrdoneidx] = NULL;
1205 if (reg->pfu_enabled) {
1206 desc2 = card->txbd_ring[wrdoneidx];
1207 memset(desc2, 0, sizeof(*desc2));
1209 desc = card->txbd_ring[wrdoneidx];
1210 memset(desc, 0, sizeof(*desc));
1212 switch (card->dev->device) {
1213 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1216 case PCIE_DEVICE_ID_MARVELL_88W8897:
1217 case PCIE_DEVICE_ID_MARVELL_88W8997:
1218 card->txbd_rdptr += reg->ring_tx_start_ptr;
1223 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1224 card->txbd_rdptr = ((card->txbd_rdptr &
1225 reg->tx_rollover_ind) ^
1226 reg->tx_rollover_ind);
1230 adapter->data_sent = false;
1232 if (card->txbd_flush) {
1233 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1234 card->txbd_flush = 0;
1236 mwifiex_clean_pcie_ring_buf(adapter);
1242 /* This function sends data buffer to device. First 4 bytes of payload
1243 * are filled with payload length and payload type. Then this payload
1244 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1245 * Download ready interrupt to FW is deffered if Tx ring is not full and
1246 * additional payload can be accomodated.
1247 * Caller must ensure tx_param parameter to this function is not NULL.
1250 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1251 struct mwifiex_tx_param *tx_param)
1253 struct pcie_service_card *card = adapter->card;
1254 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1255 u32 wrindx, num_tx_buffs, rx_val;
1258 struct mwifiex_pcie_buf_desc *desc = NULL;
1259 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1261 if (!(skb->data && skb->len)) {
1262 mwifiex_dbg(adapter, ERROR,
1263 "%s(): invalid parameter <%p, %#x>\n",
1264 __func__, skb->data, skb->len);
1268 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1269 mwifiex_pm_wakeup_card(adapter);
1271 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1272 mwifiex_dbg(adapter, DATA,
1273 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1274 card->txbd_rdptr, card->txbd_wrptr);
1275 if (mwifiex_pcie_txbd_not_full(card)) {
1278 adapter->data_sent = true;
1279 payload = skb->data;
1280 put_unaligned_le16((u16)skb->len, payload + 0);
1281 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
1283 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1287 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1288 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1289 card->tx_buf_list[wrindx] = skb;
1290 atomic_inc(&adapter->tx_hw_pending);
1292 if (reg->pfu_enabled) {
1293 desc2 = card->txbd_ring[wrindx];
1294 desc2->paddr = buf_pa;
1295 desc2->len = (u16)skb->len;
1296 desc2->frag_len = (u16)skb->len;
1298 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1299 MWIFIEX_BD_FLAG_LAST_DESC;
1301 desc = card->txbd_ring[wrindx];
1302 desc->paddr = buf_pa;
1303 desc->len = (u16)skb->len;
1304 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1305 MWIFIEX_BD_FLAG_LAST_DESC;
1308 switch (card->dev->device) {
1309 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1312 case PCIE_DEVICE_ID_MARVELL_88W8897:
1313 case PCIE_DEVICE_ID_MARVELL_88W8997:
1314 card->txbd_wrptr += reg->ring_tx_start_ptr;
1318 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1319 card->txbd_wrptr = ((card->txbd_wrptr &
1320 reg->tx_rollover_ind) ^
1321 reg->tx_rollover_ind);
1323 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1324 /* Write the TX ring write pointer in to reg->tx_wrptr */
1325 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1326 card->txbd_wrptr | rx_val)) {
1327 mwifiex_dbg(adapter, ERROR,
1328 "SEND DATA: failed to write reg->tx_wrptr\n");
1332 if ((mwifiex_pcie_txbd_not_full(card)) &&
1333 tx_param->next_pkt_len) {
1334 /* have more packets and TxBD still can hold more */
1335 mwifiex_dbg(adapter, DATA,
1336 "SEND DATA: delay dnld-rdy interrupt.\n");
1337 adapter->data_sent = false;
1339 /* Send the TX ready interrupt */
1340 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1341 CPU_INTR_DNLD_RDY)) {
1342 mwifiex_dbg(adapter, ERROR,
1343 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1348 mwifiex_dbg(adapter, DATA,
1349 "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1350 "%#x> and sent packet to firmware successfully\n",
1351 card->txbd_rdptr, card->txbd_wrptr);
1353 mwifiex_dbg(adapter, DATA,
1354 "info: TX Ring full, can't send packets to fw\n");
1355 adapter->data_sent = true;
1356 /* Send the TX ready interrupt */
1357 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1359 mwifiex_dbg(adapter, ERROR,
1360 "SEND DATA: failed to assert door-bell intr\n");
1364 return -EINPROGRESS;
1366 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1367 card->tx_buf_list[wrindx] = NULL;
1368 atomic_dec(&adapter->tx_hw_pending);
1369 if (reg->pfu_enabled)
1370 memset(desc2, 0, sizeof(*desc2));
1372 memset(desc, 0, sizeof(*desc));
1378 * This function handles received buffer ring and
1379 * dispatches packets to upper
1381 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1383 struct pcie_service_card *card = adapter->card;
1384 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1385 u32 wrptr, rd_index, tx_val;
1388 struct sk_buff *skb_tmp = NULL;
1389 struct mwifiex_pcie_buf_desc *desc;
1390 struct mwifiex_pfu_buf_desc *desc2;
1392 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1393 mwifiex_pm_wakeup_card(adapter);
1395 /* Read the RX ring Write pointer set by firmware */
1396 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1397 mwifiex_dbg(adapter, ERROR,
1398 "RECV DATA: failed to read reg->rx_wrptr\n");
1402 card->rxbd_wrptr = wrptr;
1404 while (((wrptr & reg->rx_mask) !=
1405 (card->rxbd_rdptr & reg->rx_mask)) ||
1406 ((wrptr & reg->rx_rollover_ind) ==
1407 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1408 struct sk_buff *skb_data;
1411 rd_index = card->rxbd_rdptr & reg->rx_mask;
1412 skb_data = card->rx_buf_list[rd_index];
1414 /* If skb allocation was failed earlier for Rx packet,
1415 * rx_buf_list[rd_index] would have been left with a NULL.
1420 mwifiex_unmap_pci_memory(adapter, skb_data, DMA_FROM_DEVICE);
1421 card->rx_buf_list[rd_index] = NULL;
1423 /* Get data length from interface header -
1424 * first 2 bytes for len, next 2 bytes is for type
1426 rx_len = get_unaligned_le16(skb_data->data);
1427 if (WARN_ON(rx_len <= adapter->intf_hdr_len ||
1428 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1429 mwifiex_dbg(adapter, ERROR,
1430 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1431 rx_len, card->rxbd_rdptr, wrptr);
1432 dev_kfree_skb_any(skb_data);
1434 skb_put(skb_data, rx_len);
1435 mwifiex_dbg(adapter, DATA,
1436 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1437 card->rxbd_rdptr, wrptr, rx_len);
1438 skb_pull(skb_data, adapter->intf_hdr_len);
1439 if (adapter->rx_work_enabled) {
1440 skb_queue_tail(&adapter->rx_data_q, skb_data);
1441 adapter->data_received = true;
1442 atomic_inc(&adapter->rx_pending);
1444 mwifiex_handle_rx_packet(adapter, skb_data);
1448 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1451 mwifiex_dbg(adapter, ERROR,
1452 "Unable to allocate skb.\n");
1456 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1457 MWIFIEX_RX_DATA_BUF_SIZE,
1461 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1463 mwifiex_dbg(adapter, INFO,
1464 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1466 card->rx_buf_list[rd_index] = skb_tmp;
1468 if (reg->pfu_enabled) {
1469 desc2 = card->rxbd_ring[rd_index];
1470 desc2->paddr = buf_pa;
1471 desc2->len = skb_tmp->len;
1472 desc2->frag_len = skb_tmp->len;
1474 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1476 desc = card->rxbd_ring[rd_index];
1477 desc->paddr = buf_pa;
1478 desc->len = skb_tmp->len;
1482 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1483 MWIFIEX_MAX_TXRX_BD) {
1484 card->rxbd_rdptr = ((card->rxbd_rdptr &
1485 reg->rx_rollover_ind) ^
1486 reg->rx_rollover_ind);
1488 mwifiex_dbg(adapter, DATA,
1489 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1490 card->rxbd_rdptr, wrptr);
1492 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1493 /* Write the RX ring read pointer in to reg->rx_rdptr */
1494 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1495 card->rxbd_rdptr | tx_val)) {
1496 mwifiex_dbg(adapter, DATA,
1497 "RECV DATA: failed to write reg->rx_rdptr\n");
1502 /* Read the RX ring Write pointer set by firmware */
1503 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1504 mwifiex_dbg(adapter, ERROR,
1505 "RECV DATA: failed to read reg->rx_wrptr\n");
1509 mwifiex_dbg(adapter, DATA,
1510 "info: RECV DATA: Rcvd packet from fw successfully\n");
1511 card->rxbd_wrptr = wrptr;
1519 * This function downloads the boot command to device
1522 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1525 struct pcie_service_card *card = adapter->card;
1526 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1528 if (!(skb->data && skb->len)) {
1529 mwifiex_dbg(adapter, ERROR,
1530 "Invalid parameter in %s <%p. len %d>\n",
1531 __func__, skb->data, skb->len);
1535 if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE))
1538 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1540 /* Write the lower 32bits of the physical address to low command
1541 * address scratch register
1543 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1544 mwifiex_dbg(adapter, ERROR,
1545 "%s: failed to write download command to boot code.\n",
1547 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1551 /* Write the upper 32bits of the physical address to high command
1552 * address scratch register
1554 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1555 (u32)((u64)buf_pa >> 32))) {
1556 mwifiex_dbg(adapter, ERROR,
1557 "%s: failed to write download command to boot code.\n",
1559 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1563 /* Write the command length to cmd_size scratch register */
1564 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1565 mwifiex_dbg(adapter, ERROR,
1566 "%s: failed to write command len to cmd_size scratch reg\n",
1568 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1572 /* Ring the door bell */
1573 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1574 CPU_INTR_DOOR_BELL)) {
1575 mwifiex_dbg(adapter, ERROR,
1576 "%s: failed to assert door-bell intr\n", __func__);
1577 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1584 /* This function init rx port in firmware which in turn enables to receive data
1585 * from device before transmitting any packet.
1587 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1589 struct pcie_service_card *card = adapter->card;
1590 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1591 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1593 /* Write the RX ring read pointer in to reg->rx_rdptr */
1594 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1596 mwifiex_dbg(adapter, ERROR,
1597 "RECV DATA: failed to write reg->rx_rdptr\n");
1603 /* This function downloads commands to the device
1606 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1608 struct pcie_service_card *card = adapter->card;
1609 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1611 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1612 u8 *payload = (u8 *)skb->data;
1614 if (!(skb->data && skb->len)) {
1615 mwifiex_dbg(adapter, ERROR,
1616 "Invalid parameter in %s <%p, %#x>\n",
1617 __func__, skb->data, skb->len);
1621 /* Make sure a command response buffer is available */
1622 if (!card->cmdrsp_buf) {
1623 mwifiex_dbg(adapter, ERROR,
1624 "No response buffer available, send command failed\n");
1628 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1629 mwifiex_pm_wakeup_card(adapter);
1631 adapter->cmd_sent = true;
1633 put_unaligned_le16((u16)skb->len, &payload[0]);
1634 put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
1636 if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE))
1639 card->cmd_buf = skb;
1641 * Need to keep a reference, since core driver might free up this
1642 * buffer before we've unmapped it.
1646 /* To send a command, the driver will:
1647 1. Write the 64bit physical address of the data buffer to
1648 cmd response address low + cmd response address high
1649 2. Ring the door bell (i.e. set the door bell interrupt)
1651 In response to door bell interrupt, the firmware will perform
1652 the DMA of the command packet (first header to obtain the total
1653 length and then rest of the command).
1656 if (card->cmdrsp_buf) {
1657 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1658 /* Write the lower 32bits of the cmdrsp buffer physical
1660 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1661 (u32)cmdrsp_buf_pa)) {
1662 mwifiex_dbg(adapter, ERROR,
1663 "Failed to write download cmd to boot code.\n");
1667 /* Write the upper 32bits of the cmdrsp buffer physical
1669 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1670 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1671 mwifiex_dbg(adapter, ERROR,
1672 "Failed to write download cmd to boot code.\n");
1678 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1679 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1680 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1682 mwifiex_dbg(adapter, ERROR,
1683 "Failed to write download cmd to boot code.\n");
1687 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1688 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1689 (u32)((u64)cmd_buf_pa >> 32))) {
1690 mwifiex_dbg(adapter, ERROR,
1691 "Failed to write download cmd to boot code.\n");
1696 /* Write the command length to reg->cmd_size */
1697 if (mwifiex_write_reg(adapter, reg->cmd_size,
1698 card->cmd_buf->len)) {
1699 mwifiex_dbg(adapter, ERROR,
1700 "Failed to write cmd len to reg->cmd_size\n");
1705 /* Ring the door bell */
1706 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1707 CPU_INTR_DOOR_BELL)) {
1708 mwifiex_dbg(adapter, ERROR,
1709 "Failed to assert door-bell intr\n");
1716 adapter->cmd_sent = false;
1722 * This function handles command complete interrupt
1724 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1726 struct pcie_service_card *card = adapter->card;
1727 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1728 struct sk_buff *skb = card->cmdrsp_buf;
1732 mwifiex_dbg(adapter, CMD,
1733 "info: Rx CMD Response\n");
1735 if (adapter->curr_cmd)
1736 mwifiex_unmap_pci_memory(adapter, skb, DMA_FROM_DEVICE);
1738 dma_sync_single_for_cpu(&card->dev->dev,
1739 MWIFIEX_SKB_DMA_ADDR(skb),
1740 MWIFIEX_UPLD_SIZE, DMA_FROM_DEVICE);
1742 /* Unmap the command as a response has been received. */
1743 if (card->cmd_buf) {
1744 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1746 dev_kfree_skb_any(card->cmd_buf);
1747 card->cmd_buf = NULL;
1750 rx_len = get_unaligned_le16(skb->data);
1751 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1752 skb_trim(skb, rx_len);
1754 if (!adapter->curr_cmd) {
1755 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1756 dma_sync_single_for_device(&card->dev->dev,
1757 MWIFIEX_SKB_DMA_ADDR(skb),
1758 MWIFIEX_SLEEP_COOKIE_SIZE,
1760 if (mwifiex_write_reg(adapter,
1762 CPU_INTR_SLEEP_CFM_DONE)) {
1763 mwifiex_dbg(adapter, ERROR,
1764 "Write register failed\n");
1767 mwifiex_delay_for_sleep_cookie(adapter,
1768 MWIFIEX_MAX_DELAY_COUNT);
1769 mwifiex_unmap_pci_memory(adapter, skb,
1771 skb_pull(skb, adapter->intf_hdr_len);
1772 while (reg->sleep_cookie && (count++ < 10) &&
1773 mwifiex_pcie_ok_to_access_hw(adapter))
1774 usleep_range(50, 60);
1775 mwifiex_pcie_enable_host_int(adapter);
1776 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1779 mwifiex_dbg(adapter, ERROR,
1780 "There is no command but got cmdrsp\n");
1782 memcpy(adapter->upld_buf, skb->data,
1783 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1784 skb_push(skb, adapter->intf_hdr_len);
1785 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1788 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1789 skb_pull(skb, adapter->intf_hdr_len);
1790 adapter->curr_cmd->resp_skb = skb;
1791 adapter->cmd_resp_received = true;
1792 /* Take the pointer and set it to CMD node and will
1793 return in the response complete callback */
1794 card->cmdrsp_buf = NULL;
1796 /* Clear the cmd-rsp buffer address in scratch registers. This
1797 will prevent firmware from writing to the same response
1799 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1800 mwifiex_dbg(adapter, ERROR,
1801 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1804 /* Write the upper 32bits of the cmdrsp buffer physical
1806 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1807 mwifiex_dbg(adapter, ERROR,
1808 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1817 * Command Response processing complete handler
1819 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1820 struct sk_buff *skb)
1822 struct pcie_service_card *card = adapter->card;
1825 card->cmdrsp_buf = skb;
1826 skb_push(card->cmdrsp_buf, adapter->intf_hdr_len);
1827 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1836 * This function handles firmware event ready interrupt
1838 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1840 struct pcie_service_card *card = adapter->card;
1841 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1842 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1844 struct mwifiex_evt_buf_desc *desc;
1846 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1847 mwifiex_pm_wakeup_card(adapter);
1849 if (adapter->event_received) {
1850 mwifiex_dbg(adapter, EVENT,
1851 "info: Event being processed,\t"
1852 "do not process this interrupt just yet\n");
1856 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1857 mwifiex_dbg(adapter, ERROR,
1858 "info: Invalid read pointer...\n");
1862 /* Read the event ring write pointer set by firmware */
1863 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1864 mwifiex_dbg(adapter, ERROR,
1865 "EventReady: failed to read reg->evt_wrptr\n");
1869 mwifiex_dbg(adapter, EVENT,
1870 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1871 card->evtbd_rdptr, wrptr);
1872 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1873 & MWIFIEX_EVTBD_MASK)) ||
1874 ((wrptr & reg->evt_rollover_ind) ==
1875 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1876 struct sk_buff *skb_cmd;
1877 __le16 data_len = 0;
1880 mwifiex_dbg(adapter, INFO,
1881 "info: Read Index: %d\n", rdptr);
1882 skb_cmd = card->evt_buf_list[rdptr];
1883 mwifiex_unmap_pci_memory(adapter, skb_cmd, DMA_FROM_DEVICE);
1885 /* Take the pointer and set it to event pointer in adapter
1886 and will return back after event handling callback */
1887 card->evt_buf_list[rdptr] = NULL;
1888 desc = card->evtbd_ring[rdptr];
1889 memset(desc, 0, sizeof(*desc));
1891 event = get_unaligned_le32(
1892 &skb_cmd->data[adapter->intf_hdr_len]);
1893 adapter->event_cause = event;
1894 /* The first 4bytes will be the event transfer header
1895 len is 2 bytes followed by type which is 2 bytes */
1896 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1897 evt_len = le16_to_cpu(data_len);
1898 skb_trim(skb_cmd, evt_len);
1899 skb_pull(skb_cmd, adapter->intf_hdr_len);
1900 mwifiex_dbg(adapter, EVENT,
1901 "info: Event length: %d\n", evt_len);
1903 if (evt_len > MWIFIEX_EVENT_HEADER_LEN &&
1904 evt_len < MAX_EVENT_SIZE)
1905 memcpy(adapter->event_body, skb_cmd->data +
1906 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1907 MWIFIEX_EVENT_HEADER_LEN);
1909 adapter->event_received = true;
1910 adapter->event_skb = skb_cmd;
1912 /* Do not update the event read pointer here, wait till the
1913 buffer is released. This is just to make things simpler,
1914 we need to find a better method of managing these buffers.
1917 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1918 CPU_INTR_EVENT_DONE)) {
1919 mwifiex_dbg(adapter, ERROR,
1920 "Write register failed\n");
1929 * Event processing complete handler
1931 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1932 struct sk_buff *skb)
1934 struct pcie_service_card *card = adapter->card;
1935 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1937 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1939 struct mwifiex_evt_buf_desc *desc;
1944 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1945 mwifiex_dbg(adapter, ERROR,
1946 "event_complete: Invalid rdptr 0x%x\n",
1951 /* Read the event ring write pointer set by firmware */
1952 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1953 mwifiex_dbg(adapter, ERROR,
1954 "event_complete: failed to read reg->evt_wrptr\n");
1958 if (!card->evt_buf_list[rdptr]) {
1959 skb_push(skb, adapter->intf_hdr_len);
1960 skb_put(skb, MAX_EVENT_SIZE - skb->len);
1961 if (mwifiex_map_pci_memory(adapter, skb,
1965 card->evt_buf_list[rdptr] = skb;
1966 desc = card->evtbd_ring[rdptr];
1967 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1968 desc->len = (u16)skb->len;
1972 mwifiex_dbg(adapter, ERROR,
1973 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1974 rdptr, card->evt_buf_list[rdptr], skb);
1977 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1978 card->evtbd_rdptr = ((card->evtbd_rdptr &
1979 reg->evt_rollover_ind) ^
1980 reg->evt_rollover_ind);
1983 mwifiex_dbg(adapter, EVENT,
1984 "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1985 card->evtbd_rdptr, wrptr);
1987 /* Write the event ring read pointer in to reg->evt_rdptr */
1988 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1989 card->evtbd_rdptr)) {
1990 mwifiex_dbg(adapter, ERROR,
1991 "event_complete: failed to read reg->evt_rdptr\n");
1995 mwifiex_dbg(adapter, EVENT,
1996 "info: Check Events Again\n");
1997 ret = mwifiex_pcie_process_event_ready(adapter);
2002 /* Combo firmware image is a combination of
2003 * (1) combo crc heaer, start with CMD5
2004 * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1.
2007 * This function bypass the header and bluetooth part, return
2008 * the offset of tail wifi-only part. If the image is already wifi-only,
2009 * that is start with CMD1, return 0.
2012 static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
2013 const void *firmware, u32 firmware_len) {
2014 const struct mwifiex_fw_data *fwdata;
2015 u32 offset = 0, data_len, dnld_cmd;
2017 bool cmd7_before = false, first_cmd = false;
2020 /* Check for integer and buffer overflow */
2021 if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
2022 offset + sizeof(fwdata->header) >= firmware_len) {
2023 mwifiex_dbg(adapter, ERROR,
2024 "extract wifi-only fw failure!\n");
2029 fwdata = firmware + offset;
2030 dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
2031 data_len = le32_to_cpu(fwdata->header.data_length);
2033 /* Skip past header */
2034 offset += sizeof(fwdata->header);
2037 case MWIFIEX_FW_DNLD_CMD_1:
2038 if (offset + data_len < data_len) {
2039 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2044 /* Image start with cmd1, already wifi-only firmware */
2046 mwifiex_dbg(adapter, MSG,
2047 "input wifi-only firmware\n");
2052 mwifiex_dbg(adapter, ERROR,
2053 "no cmd7 before cmd1!\n");
2059 case MWIFIEX_FW_DNLD_CMD_5:
2061 /* Check for integer overflow */
2062 if (offset + data_len < data_len) {
2063 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2069 case MWIFIEX_FW_DNLD_CMD_6:
2071 /* Check for integer overflow */
2072 if (offset + data_len < data_len) {
2073 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2078 if (offset >= firmware_len) {
2079 mwifiex_dbg(adapter, ERROR,
2080 "extract wifi-only fw failure!\n");
2086 case MWIFIEX_FW_DNLD_CMD_7:
2091 mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n",
2103 * This function downloads the firmware to the card.
2105 * Firmware is downloaded to the card in blocks. Every block download
2106 * is tested for CRC errors, and retried a number of times before
2107 * returning failure.
2109 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
2110 struct mwifiex_fw_image *fw)
2113 u8 *firmware = fw->fw_buf;
2114 u32 firmware_len = fw->fw_len;
2116 struct sk_buff *skb;
2117 u32 txlen, tx_blocks = 0, tries, len, val;
2118 u32 block_retry_cnt = 0;
2119 struct pcie_service_card *card = adapter->card;
2120 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2122 if (!firmware || !firmware_len) {
2123 mwifiex_dbg(adapter, ERROR,
2124 "No firmware image found! Terminating download\n");
2128 mwifiex_dbg(adapter, INFO,
2129 "info: Downloading FW image (%d bytes)\n",
2132 if (mwifiex_pcie_disable_host_int(adapter)) {
2133 mwifiex_dbg(adapter, ERROR,
2134 "%s: Disabling interrupts failed.\n", __func__);
2138 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
2144 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val);
2146 mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n");
2150 /* PCIE FLR case: extract wifi part from combo firmware*/
2151 if (val == MWIFIEX_PCIE_FLR_HAPPENS) {
2152 ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len);
2154 mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n");
2158 mwifiex_dbg(adapter, MSG,
2159 "info: dnld wifi firmware from %d bytes\n", offset);
2162 /* Perform firmware data transfer */
2167 if (offset >= firmware_len)
2170 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2171 ret = mwifiex_read_reg(adapter, reg->cmd_size,
2174 mwifiex_dbg(adapter, FATAL,
2175 "Failed reading len from boot code\n");
2180 usleep_range(10, 20);
2185 } else if (len > MWIFIEX_UPLD_SIZE) {
2186 mwifiex_dbg(adapter, ERROR,
2187 "FW download failure @ %d, invalid length %d\n",
2197 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
2198 mwifiex_dbg(adapter, ERROR,
2199 "FW download failure @ %d, over max\t"
2200 "retry count\n", offset);
2204 mwifiex_dbg(adapter, ERROR,
2205 "FW CRC error indicated by the\t"
2206 "helper: len = 0x%04X, txlen = %d\n",
2209 /* Setting this to 0 to resend from same offset */
2212 block_retry_cnt = 0;
2213 /* Set blocksize to transfer - checking for
2215 if (firmware_len - offset < txlen)
2216 txlen = firmware_len - offset;
2218 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
2219 card->pcie.blksz_fw_dl;
2221 /* Copy payload to buffer */
2222 memmove(skb->data, &firmware[offset], txlen);
2225 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
2226 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
2228 /* Send the boot command to device */
2229 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
2230 mwifiex_dbg(adapter, ERROR,
2231 "Failed to send firmware download command\n");
2236 /* Wait for the command done interrupt */
2237 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2238 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
2240 mwifiex_dbg(adapter, ERROR,
2241 "%s: Failed to read\t"
2242 "interrupt status during fw dnld.\n",
2244 mwifiex_unmap_pci_memory(adapter, skb,
2249 if (!(ireg_intr & CPU_INTR_DOOR_BELL))
2251 usleep_range(10, 20);
2253 if (ireg_intr & CPU_INTR_DOOR_BELL) {
2254 mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
2256 mwifiex_unmap_pci_memory(adapter, skb,
2262 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
2267 mwifiex_dbg(adapter, MSG,
2268 "info: FW download over, size %d bytes\n", offset);
2273 dev_kfree_skb_any(skb);
2278 * This function checks the firmware status in card.
2281 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2285 struct pcie_service_card *card = adapter->card;
2286 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2289 /* Mask spurios interrupts */
2290 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2292 mwifiex_dbg(adapter, ERROR,
2293 "Write register failed\n");
2297 mwifiex_dbg(adapter, INFO,
2298 "Setting driver ready signature\n");
2299 if (mwifiex_write_reg(adapter, reg->drv_rdy,
2300 FIRMWARE_READY_PCIE)) {
2301 mwifiex_dbg(adapter, ERROR,
2302 "Failed to write driver ready signature\n");
2306 /* Wait for firmware initialization event */
2307 for (tries = 0; tries < poll_num; tries++) {
2308 if (mwifiex_read_reg(adapter, reg->fw_status,
2314 mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>",
2315 tries, ret, firmware_stat);
2319 if (firmware_stat == FIRMWARE_READY_PCIE) {
2331 /* This function checks if WLAN is the winner.
2334 mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
2338 struct pcie_service_card *card = adapter->card;
2339 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2341 if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) {
2343 } else if (!winner) {
2344 mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n");
2345 adapter->winner = 1;
2347 mwifiex_dbg(adapter, ERROR,
2348 "PCI-E is not the winner <%#x>", winner);
2355 * This function reads the interrupt status from card.
2357 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
2361 unsigned long flags;
2362 struct pcie_service_card *card = adapter->card;
2364 if (card->msi_enable) {
2365 spin_lock_irqsave(&adapter->int_lock, flags);
2366 adapter->int_status = 1;
2367 spin_unlock_irqrestore(&adapter->int_lock, flags);
2371 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2374 if (card->msix_enable && msg_id >= 0) {
2375 pcie_ireg = BIT(msg_id);
2377 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2379 mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2383 if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg)
2387 mwifiex_pcie_disable_host_int(adapter);
2389 /* Clear the pending interrupts */
2390 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2392 mwifiex_dbg(adapter, ERROR,
2393 "Write register failed\n");
2398 if (!adapter->pps_uapsd_mode &&
2399 adapter->ps_state == PS_STATE_SLEEP &&
2400 mwifiex_pcie_ok_to_access_hw(adapter)) {
2401 /* Potentially for PCIe we could get other
2402 * interrupts like shared. Don't change power
2403 * state until cookie is set
2405 adapter->ps_state = PS_STATE_AWAKE;
2406 adapter->pm_wakeup_fw_try = false;
2407 del_timer(&adapter->wakeup_timer);
2410 spin_lock_irqsave(&adapter->int_lock, flags);
2411 adapter->int_status |= pcie_ireg;
2412 spin_unlock_irqrestore(&adapter->int_lock, flags);
2413 mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
2417 * Interrupt handler for PCIe root port
2419 * This function reads the interrupt status from firmware and assigns
2420 * the main process in workqueue which will handle the interrupt.
2422 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2424 struct mwifiex_msix_context *ctx = context;
2425 struct pci_dev *pdev = ctx->dev;
2426 struct pcie_service_card *card;
2427 struct mwifiex_adapter *adapter;
2429 card = pci_get_drvdata(pdev);
2431 if (!card->adapter) {
2432 pr_err("info: %s: card=%p adapter=%p\n", __func__, card,
2433 card ? card->adapter : NULL);
2436 adapter = card->adapter;
2438 if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags))
2441 if (card->msix_enable)
2442 mwifiex_interrupt_status(adapter, ctx->msg_id);
2444 mwifiex_interrupt_status(adapter, -1);
2446 mwifiex_queue_main_work(adapter);
2453 * This function checks the current interrupt status.
2455 * The following interrupts are checked and handled by this function -
2458 * - Command received
2459 * - Packets received
2462 * In case of Rx packets received, the packets are uploaded from card to
2463 * host and processed accordingly.
2465 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2469 unsigned long flags;
2470 struct pcie_service_card *card = adapter->card;
2472 spin_lock_irqsave(&adapter->int_lock, flags);
2473 if (!card->msi_enable) {
2474 /* Clear out unused interrupts */
2475 pcie_ireg = adapter->int_status;
2477 adapter->int_status = 0;
2478 spin_unlock_irqrestore(&adapter->int_lock, flags);
2480 if (card->msi_enable) {
2481 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2482 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2484 mwifiex_dbg(adapter, ERROR,
2485 "Read register failed\n");
2489 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2490 if (mwifiex_write_reg(adapter,
2491 PCIE_HOST_INT_STATUS,
2493 mwifiex_dbg(adapter, ERROR,
2494 "Write register failed\n");
2497 if (!adapter->pps_uapsd_mode &&
2498 adapter->ps_state == PS_STATE_SLEEP) {
2499 adapter->ps_state = PS_STATE_AWAKE;
2500 adapter->pm_wakeup_fw_try = false;
2501 del_timer(&adapter->wakeup_timer);
2507 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2508 mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n");
2509 ret = mwifiex_pcie_send_data_complete(adapter);
2513 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2514 mwifiex_dbg(adapter, INTR, "info: Rx DATA\n");
2515 ret = mwifiex_pcie_process_recv_data(adapter);
2519 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2520 mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n");
2521 ret = mwifiex_pcie_process_event_ready(adapter);
2525 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2526 if (adapter->cmd_sent) {
2527 mwifiex_dbg(adapter, INTR,
2528 "info: CMD sent Interrupt\n");
2529 adapter->cmd_sent = false;
2531 /* Handle command response */
2532 ret = mwifiex_pcie_process_cmd_complete(adapter);
2537 mwifiex_dbg(adapter, INTR,
2538 "info: cmd_sent=%d data_sent=%d\n",
2539 adapter->cmd_sent, adapter->data_sent);
2540 if (!card->msi_enable && !card->msix_enable &&
2541 adapter->ps_state != PS_STATE_SLEEP)
2542 mwifiex_pcie_enable_host_int(adapter);
2548 * This function downloads data from driver to card.
2550 * Both commands and data packets are transferred to the card by this
2553 * This function adds the PCIE specific header to the front of the buffer
2554 * before transferring. The header contains the length of the packet and
2555 * the type. The firmware handles the packets based upon this set type.
2557 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2558 struct sk_buff *skb,
2559 struct mwifiex_tx_param *tx_param)
2562 mwifiex_dbg(adapter, ERROR,
2563 "Passed NULL skb to %s\n", __func__);
2567 if (type == MWIFIEX_TYPE_DATA)
2568 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2569 else if (type == MWIFIEX_TYPE_CMD)
2570 return mwifiex_pcie_send_cmd(adapter, skb);
2575 /* Function to dump PCIE scratch registers in case of FW crash
2578 mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
2581 char buf[256], *ptr;
2584 struct pcie_service_card *card = adapter->card;
2585 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2586 int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
2587 PCIE_SCRATCH_14_REG,
2588 PCIE_SCRATCH_15_REG};
2593 mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
2595 if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
2596 mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
2601 mwifiex_dbg(adapter, MSG, "pcie scratch register:");
2602 for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
2603 mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
2604 ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
2605 pcie_scratch_reg[i], value);
2608 mwifiex_dbg(adapter, MSG, "%s\n", buf);
2609 p += sprintf(p, "%s\n", buf);
2611 mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
2616 /* This function read/write firmware */
2617 static enum rdwr_status
2618 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2623 struct pcie_service_card *card = adapter->card;
2624 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2626 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
2627 return RDWR_STATUS_FAILURE;
2629 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2630 reg->fw_dump_host_ready);
2632 mwifiex_dbg(adapter, ERROR,
2633 "PCIE write err\n");
2634 return RDWR_STATUS_FAILURE;
2637 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2638 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2639 if (ctrl_data == FW_DUMP_DONE)
2640 return RDWR_STATUS_SUCCESS;
2641 if (doneflag && ctrl_data == doneflag)
2642 return RDWR_STATUS_DONE;
2643 if (ctrl_data != reg->fw_dump_host_ready) {
2644 mwifiex_dbg(adapter, WARN,
2645 "The ctrl reg was changed, re-try again!\n");
2646 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2647 reg->fw_dump_host_ready);
2649 mwifiex_dbg(adapter, ERROR,
2650 "PCIE write err\n");
2651 return RDWR_STATUS_FAILURE;
2654 usleep_range(100, 200);
2657 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2658 return RDWR_STATUS_FAILURE;
2661 /* This function dump firmware memory to file */
2662 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2664 struct pcie_service_card *card = adapter->card;
2665 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2666 unsigned int reg, reg_start, reg_end;
2667 u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
2668 u8 idx, i, read_reg, doneflag = 0;
2669 enum rdwr_status stat;
2673 if (!card->pcie.can_dump_fw)
2676 for (idx = 0; idx < adapter->num_mem_types; idx++) {
2677 struct memory_type_mapping *entry =
2678 &adapter->mem_type_mapping_tbl[idx];
2680 if (entry->mem_ptr) {
2681 vfree(entry->mem_ptr);
2682 entry->mem_ptr = NULL;
2684 entry->mem_size = 0;
2687 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
2689 /* Read the number of the memories which will dump */
2690 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2691 if (stat == RDWR_STATUS_FAILURE)
2694 reg = creg->fw_dump_start;
2695 mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
2697 /* W8997 chipset firmware dump will be restore in single region*/
2698 if (fw_dump_num == 0)
2701 dump_num = fw_dump_num;
2703 /* Read the length of every memory which will dump */
2704 for (idx = 0; idx < dump_num; idx++) {
2705 struct memory_type_mapping *entry =
2706 &adapter->mem_type_mapping_tbl[idx];
2708 if (fw_dump_num != 0) {
2709 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2710 if (stat == RDWR_STATUS_FAILURE)
2713 reg = creg->fw_dump_start;
2714 for (i = 0; i < 4; i++) {
2715 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2716 memory_size |= (read_reg << (i * 8));
2720 memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
2723 if (memory_size == 0) {
2724 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2725 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2726 creg->fw_dump_read_done);
2728 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2734 mwifiex_dbg(adapter, DUMP,
2735 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2736 entry->mem_ptr = vmalloc(memory_size + 1);
2737 entry->mem_size = memory_size;
2738 if (!entry->mem_ptr) {
2739 mwifiex_dbg(adapter, ERROR,
2740 "Vmalloc %s failed\n", entry->mem_name);
2743 dbg_ptr = entry->mem_ptr;
2744 end_ptr = dbg_ptr + memory_size;
2746 doneflag = entry->done_flag;
2747 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2751 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2752 if (RDWR_STATUS_FAILURE == stat)
2755 reg_start = creg->fw_dump_start;
2756 reg_end = creg->fw_dump_end;
2757 for (reg = reg_start; reg <= reg_end; reg++) {
2758 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2759 if (dbg_ptr < end_ptr) {
2763 mwifiex_dbg(adapter, ERROR,
2764 "pre-allocated buf not enough\n");
2766 vzalloc(memory_size + MWIFIEX_SIZE_4K);
2769 memcpy(tmp_ptr, entry->mem_ptr, memory_size);
2770 vfree(entry->mem_ptr);
2771 entry->mem_ptr = tmp_ptr;
2773 dbg_ptr = entry->mem_ptr + memory_size;
2774 memory_size += MWIFIEX_SIZE_4K;
2775 end_ptr = entry->mem_ptr + memory_size;
2778 if (stat != RDWR_STATUS_DONE)
2781 mwifiex_dbg(adapter, DUMP,
2782 "%s done: size=0x%tx\n",
2783 entry->mem_name, dbg_ptr - entry->mem_ptr);
2787 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
2790 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2792 adapter->devdump_data = vzalloc(MWIFIEX_FW_DUMP_SIZE);
2793 if (!adapter->devdump_data) {
2794 mwifiex_dbg(adapter, ERROR,
2795 "vzalloc devdump data failure!\n");
2799 mwifiex_drv_info_dump(adapter);
2800 mwifiex_pcie_fw_dump(adapter);
2801 mwifiex_prepare_fw_dump_info(adapter);
2802 mwifiex_upload_device_dump(adapter);
2805 static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter)
2807 struct pcie_service_card *card = adapter->card;
2809 /* We can't afford to wait here; remove() might be waiting on us. If we
2810 * can't grab the device lock, maybe we'll get another chance later.
2812 pci_try_reset_function(card->dev);
2815 static void mwifiex_pcie_work(struct work_struct *work)
2817 struct pcie_service_card *card =
2818 container_of(work, struct pcie_service_card, work);
2820 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2822 mwifiex_pcie_device_dump_work(card->adapter);
2823 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
2825 mwifiex_pcie_card_reset_work(card->adapter);
2828 /* This function dumps FW information */
2829 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2831 struct pcie_service_card *card = adapter->card;
2833 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2835 schedule_work(&card->work);
2838 static void mwifiex_pcie_card_reset(struct mwifiex_adapter *adapter)
2840 struct pcie_service_card *card = adapter->card;
2842 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags))
2843 schedule_work(&card->work);
2846 static int mwifiex_pcie_alloc_buffers(struct mwifiex_adapter *adapter)
2848 struct pcie_service_card *card = adapter->card;
2849 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2852 card->cmdrsp_buf = NULL;
2853 ret = mwifiex_pcie_create_txbd_ring(adapter);
2855 mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n");
2859 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2861 mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n");
2865 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2867 mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n");
2871 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2873 mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n");
2874 goto err_alloc_cmdbuf;
2877 if (reg->sleep_cookie) {
2878 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2880 mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n");
2881 goto err_alloc_cookie;
2884 card->sleep_cookie_vbase = NULL;
2890 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2892 mwifiex_pcie_delete_evtbd_ring(adapter);
2894 mwifiex_pcie_delete_rxbd_ring(adapter);
2896 mwifiex_pcie_delete_txbd_ring(adapter);
2901 static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter)
2903 struct pcie_service_card *card = adapter->card;
2904 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2906 if (reg->sleep_cookie)
2907 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2909 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2910 mwifiex_pcie_delete_evtbd_ring(adapter);
2911 mwifiex_pcie_delete_rxbd_ring(adapter);
2912 mwifiex_pcie_delete_txbd_ring(adapter);
2916 * This function initializes the PCI-E host memory space, WCB rings, etc.
2918 static int mwifiex_init_pcie(struct mwifiex_adapter *adapter)
2920 struct pcie_service_card *card = adapter->card;
2922 struct pci_dev *pdev = card->dev;
2924 pci_set_drvdata(pdev, card);
2926 ret = pci_enable_device(pdev);
2928 goto err_enable_dev;
2930 pci_set_master(pdev);
2932 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
2934 pr_err("dma_set_mask(32) failed: %d\n", ret);
2935 goto err_set_dma_mask;
2938 ret = pci_request_region(pdev, 0, DRV_NAME);
2940 pr_err("req_reg(0) error\n");
2941 goto err_req_region0;
2943 card->pci_mmap = pci_iomap(pdev, 0, 0);
2944 if (!card->pci_mmap) {
2945 pr_err("iomap(0) error\n");
2949 ret = pci_request_region(pdev, 2, DRV_NAME);
2951 pr_err("req_reg(2) error\n");
2952 goto err_req_region2;
2954 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2955 if (!card->pci_mmap1) {
2956 pr_err("iomap(2) error\n");
2961 pr_notice("PCI memory map Virt0: %pK PCI memory map Virt2: %pK\n",
2962 card->pci_mmap, card->pci_mmap1);
2964 ret = mwifiex_pcie_alloc_buffers(adapter);
2966 goto err_alloc_buffers;
2971 pci_iounmap(pdev, card->pci_mmap1);
2973 pci_release_region(pdev, 2);
2975 pci_iounmap(pdev, card->pci_mmap);
2977 pci_release_region(pdev, 0);
2980 pci_disable_device(pdev);
2986 * This function cleans up the allocated card buffers.
2988 static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter)
2990 struct pcie_service_card *card = adapter->card;
2991 struct pci_dev *pdev = card->dev;
2992 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2996 cancel_work_sync(&card->work);
2998 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
2999 if (fw_status == FIRMWARE_READY_PCIE) {
3000 mwifiex_dbg(adapter, INFO,
3001 "Clearing driver ready signature\n");
3002 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3003 mwifiex_dbg(adapter, ERROR,
3004 "Failed to write driver not-ready signature\n");
3007 pci_disable_device(pdev);
3009 pci_iounmap(pdev, card->pci_mmap);
3010 pci_iounmap(pdev, card->pci_mmap1);
3011 pci_release_region(pdev, 2);
3012 pci_release_region(pdev, 0);
3014 mwifiex_pcie_free_buffers(adapter);
3017 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
3020 struct pcie_service_card *card = adapter->card;
3021 struct pci_dev *pdev = card->dev;
3023 if (card->pcie.reg->msix_support) {
3024 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3025 card->msix_entries[i].entry = i;
3026 ret = pci_enable_msix_exact(pdev, card->msix_entries,
3027 MWIFIEX_NUM_MSIX_VECTORS);
3029 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) {
3030 card->msix_ctx[i].dev = pdev;
3031 card->msix_ctx[i].msg_id = i;
3033 ret = request_irq(card->msix_entries[i].vector,
3034 mwifiex_pcie_interrupt, 0,
3035 "MWIFIEX_PCIE_MSIX",
3036 &card->msix_ctx[i]);
3042 mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n",
3044 for (j = 0; j < i; j++)
3045 free_irq(card->msix_entries[j].vector,
3046 &card->msix_ctx[i]);
3047 pci_disable_msix(pdev);
3049 mwifiex_dbg(adapter, MSG, "MSIx enabled!");
3050 card->msix_enable = 1;
3056 if (pci_enable_msi(pdev) != 0)
3057 pci_disable_msi(pdev);
3059 card->msi_enable = 1;
3061 mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
3063 card->share_irq_ctx.dev = pdev;
3064 card->share_irq_ctx.msg_id = -1;
3065 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
3066 "MRVL_PCIE", &card->share_irq_ctx);
3068 pr_err("request_irq failed: ret=%d\n", ret);
3076 * This function gets the firmware name for downloading by revision id
3078 * Read revision id register to get revision id
3080 static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter)
3082 int revision_id = 0;
3084 struct pcie_service_card *card = adapter->card;
3086 switch (card->dev->device) {
3087 case PCIE_DEVICE_ID_MARVELL_88W8766P:
3088 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
3090 case PCIE_DEVICE_ID_MARVELL_88W8897:
3091 mwifiex_write_reg(adapter, 0x0c58, 0x80c00000);
3092 mwifiex_read_reg(adapter, 0x0c58, &revision_id);
3093 revision_id &= 0xff00;
3094 switch (revision_id) {
3096 strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME);
3099 strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME);
3102 strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME);
3107 case PCIE_DEVICE_ID_MARVELL_88W8997:
3108 mwifiex_read_reg(adapter, 0x8, &revision_id);
3109 mwifiex_read_reg(adapter, 0x0cd0, &version);
3110 mwifiex_read_reg(adapter, 0x0cd4, &magic);
3111 revision_id &= 0xff;
3114 if (revision_id == PCIE8997_A1 &&
3115 magic == CHIP_MAGIC_VALUE &&
3116 version == CHIP_VER_PCIEUART)
3117 strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4);
3119 strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4);
3127 * This function registers the PCIE device.
3129 * PCIE IRQ is claimed, block size is set and driver data is initialized.
3131 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
3133 struct pcie_service_card *card = adapter->card;
3135 /* save adapter pointer in card */
3136 card->adapter = adapter;
3138 if (mwifiex_pcie_request_irq(adapter))
3141 adapter->tx_buf_size = card->pcie.tx_buf_size;
3142 adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
3143 adapter->num_mem_types = card->pcie.num_mem_types;
3144 adapter->ext_scan = card->pcie.can_ext_scan;
3145 mwifiex_pcie_get_fw_name(adapter);
3151 * This function unregisters the PCIE device.
3153 * The PCIE IRQ is released, the function is disabled and driver
3154 * data is set to null.
3156 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
3158 struct pcie_service_card *card = adapter->card;
3159 struct pci_dev *pdev = card->dev;
3162 if (card->msix_enable) {
3163 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3164 synchronize_irq(card->msix_entries[i].vector);
3166 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3167 free_irq(card->msix_entries[i].vector,
3168 &card->msix_ctx[i]);
3170 card->msix_enable = 0;
3171 pci_disable_msix(pdev);
3173 mwifiex_dbg(adapter, INFO,
3174 "%s(): calling free_irq()\n", __func__);
3175 free_irq(card->dev->irq, &card->share_irq_ctx);
3177 if (card->msi_enable)
3178 pci_disable_msi(pdev);
3180 card->adapter = NULL;
3184 * This function initializes the PCI-E host memory space, WCB rings, etc.,
3185 * similar to mwifiex_init_pcie(), but without resetting PCI-E state.
3187 static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter)
3189 struct pcie_service_card *card = adapter->card;
3190 struct pci_dev *pdev = card->dev;
3192 /* tx_buf_size might be changed to 3584 by firmware during
3193 * data transfer, we should reset it to default size.
3195 adapter->tx_buf_size = card->pcie.tx_buf_size;
3197 mwifiex_pcie_alloc_buffers(adapter);
3199 pci_set_master(pdev);
3202 /* This function cleans up the PCI-E host memory space. */
3203 static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter)
3205 struct pcie_service_card *card = adapter->card;
3206 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3207 struct pci_dev *pdev = card->dev;
3209 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3210 mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n");
3212 pci_clear_master(pdev);
3214 adapter->seq_num = 0;
3216 mwifiex_pcie_free_buffers(adapter);
3219 static struct mwifiex_if_ops pcie_ops = {
3220 .init_if = mwifiex_init_pcie,
3221 .cleanup_if = mwifiex_cleanup_pcie,
3222 .check_fw_status = mwifiex_check_fw_status,
3223 .check_winner_status = mwifiex_check_winner_status,
3224 .prog_fw = mwifiex_prog_fw_w_helper,
3225 .register_dev = mwifiex_register_dev,
3226 .unregister_dev = mwifiex_unregister_dev,
3227 .enable_int = mwifiex_pcie_enable_host_int,
3228 .disable_int = mwifiex_pcie_disable_host_int_noerr,
3229 .process_int_status = mwifiex_process_int_status,
3230 .host_to_card = mwifiex_pcie_host_to_card,
3231 .wakeup = mwifiex_pm_wakeup_card,
3232 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
3235 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
3236 .event_complete = mwifiex_pcie_event_complete,
3237 .update_mp_end_port = NULL,
3238 .cleanup_mpa_buf = NULL,
3239 .init_fw_port = mwifiex_pcie_init_fw_port,
3240 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
3241 .card_reset = mwifiex_pcie_card_reset,
3242 .reg_dump = mwifiex_pcie_reg_dump,
3243 .device_dump = mwifiex_pcie_device_dump,
3244 .down_dev = mwifiex_pcie_down_dev,
3245 .up_dev = mwifiex_pcie_up_dev,
3248 module_pci_driver(mwifiex_pcie);
3250 MODULE_AUTHOR("Marvell International Ltd.");
3251 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
3252 MODULE_VERSION(PCIE_VERSION);
3253 MODULE_LICENSE("GPL v2");