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"
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 = pci_map_single(card->dev, skb->data, size, flags);
62 if (pci_dma_mapping_error(card->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 pci_unmap_single(card->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 pci_dma_sync_single_for_cpu(card->dev,
465 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
466 sizeof(sleep_cookie),
468 buffer = cmdrsp->data;
469 sleep_cookie = get_unaligned_le32(buffer);
471 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
472 mwifiex_dbg(adapter, INFO,
473 "sleep cookie found at count %d\n", count);
476 pci_dma_sync_single_for_device(card->dev,
477 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
478 sizeof(sleep_cookie),
480 usleep_range(20, 30);
483 if (count >= max_delay_loop_cnt)
484 mwifiex_dbg(adapter, INFO,
485 "max count reached while accessing sleep cookie\n");
488 /* This function wakes up the card by reading fw_status register. */
489 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
491 struct pcie_service_card *card = adapter->card;
492 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
494 mwifiex_dbg(adapter, EVENT,
495 "event: Wakeup device...\n");
497 if (reg->sleep_cookie)
498 mwifiex_pcie_dev_wakeup_delay(adapter);
500 /* Accessing fw_status register will wakeup device */
501 if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
502 mwifiex_dbg(adapter, ERROR,
503 "Writing fw_status register failed\n");
507 if (reg->sleep_cookie) {
508 mwifiex_pcie_dev_wakeup_delay(adapter);
509 mwifiex_dbg(adapter, INFO,
510 "PCIE wakeup: Setting PS_STATE_AWAKE\n");
511 adapter->ps_state = PS_STATE_AWAKE;
518 * This function is called after the card has woken up.
520 * The card configuration register is reset.
522 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
524 mwifiex_dbg(adapter, CMD,
525 "cmd: Wakeup device completed\n");
531 * This function disables the host interrupt.
533 * The host interrupt mask is read, the disable bit is reset and
534 * written back to the card host interrupt mask register.
536 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
538 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
539 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
541 mwifiex_dbg(adapter, ERROR,
542 "Disable host interrupt failed\n");
547 atomic_set(&adapter->tx_hw_pending, 0);
551 static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter)
553 WARN_ON(mwifiex_pcie_disable_host_int(adapter));
557 * This function enables the host interrupt.
559 * The host interrupt enable mask is written to the card
560 * host interrupt mask register.
562 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
564 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
565 /* Simply write the mask to the register */
566 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
568 mwifiex_dbg(adapter, ERROR,
569 "Enable host interrupt failed\n");
578 * This function initializes TX buffer ring descriptors
580 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
582 struct pcie_service_card *card = adapter->card;
583 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
584 struct mwifiex_pcie_buf_desc *desc;
585 struct mwifiex_pfu_buf_desc *desc2;
588 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
589 card->tx_buf_list[i] = NULL;
590 if (reg->pfu_enabled) {
591 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
592 (sizeof(*desc2) * i);
593 desc2 = card->txbd_ring[i];
594 memset(desc2, 0, sizeof(*desc2));
596 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
598 desc = card->txbd_ring[i];
599 memset(desc, 0, sizeof(*desc));
606 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
607 * here and after mapping PCI memory, its physical address is assigned to
608 * PCIE Rx buffer descriptor's physical address.
610 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
612 struct pcie_service_card *card = adapter->card;
613 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
615 struct mwifiex_pcie_buf_desc *desc;
616 struct mwifiex_pfu_buf_desc *desc2;
620 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
621 /* Allocate skb here so that firmware can DMA data from it */
622 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
625 mwifiex_dbg(adapter, ERROR,
626 "Unable to allocate skb for RX ring.\n");
627 kfree(card->rxbd_ring_vbase);
631 if (mwifiex_map_pci_memory(adapter, skb,
632 MWIFIEX_RX_DATA_BUF_SIZE,
636 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
638 mwifiex_dbg(adapter, INFO,
639 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
640 skb, skb->len, skb->data, (u32)buf_pa,
641 (u32)((u64)buf_pa >> 32));
643 card->rx_buf_list[i] = skb;
644 if (reg->pfu_enabled) {
645 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
646 (sizeof(*desc2) * i);
647 desc2 = card->rxbd_ring[i];
648 desc2->paddr = buf_pa;
649 desc2->len = (u16)skb->len;
650 desc2->frag_len = (u16)skb->len;
651 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
654 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
655 (sizeof(*desc) * i));
656 desc = card->rxbd_ring[i];
657 desc->paddr = buf_pa;
658 desc->len = (u16)skb->len;
666 /* This function initializes event buffer ring descriptors. Each SKB is
667 * allocated here and after mapping PCI memory, its physical address is assigned
668 * to PCIE Rx buffer descriptor's physical address
670 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
672 struct pcie_service_card *card = adapter->card;
673 struct mwifiex_evt_buf_desc *desc;
678 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
679 /* Allocate skb here so that firmware can DMA data from it */
680 skb = dev_alloc_skb(MAX_EVENT_SIZE);
682 mwifiex_dbg(adapter, ERROR,
683 "Unable to allocate skb for EVENT buf.\n");
684 kfree(card->evtbd_ring_vbase);
687 skb_put(skb, MAX_EVENT_SIZE);
689 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
690 PCI_DMA_FROMDEVICE)) {
692 kfree(card->evtbd_ring_vbase);
696 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
698 mwifiex_dbg(adapter, EVENT,
699 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
700 skb, skb->len, skb->data, (u32)buf_pa,
701 (u32)((u64)buf_pa >> 32));
703 card->evt_buf_list[i] = skb;
704 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
705 (sizeof(*desc) * i));
706 desc = card->evtbd_ring[i];
707 desc->paddr = buf_pa;
708 desc->len = (u16)skb->len;
715 /* This function cleans up TX buffer rings. If any of the buffer list has valid
716 * SKB address, associated SKB is freed.
718 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
720 struct pcie_service_card *card = adapter->card;
721 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
723 struct mwifiex_pcie_buf_desc *desc;
724 struct mwifiex_pfu_buf_desc *desc2;
727 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
728 if (reg->pfu_enabled) {
729 desc2 = card->txbd_ring[i];
730 if (card->tx_buf_list[i]) {
731 skb = card->tx_buf_list[i];
732 mwifiex_unmap_pci_memory(adapter, skb,
734 dev_kfree_skb_any(skb);
736 memset(desc2, 0, sizeof(*desc2));
738 desc = card->txbd_ring[i];
739 if (card->tx_buf_list[i]) {
740 skb = card->tx_buf_list[i];
741 mwifiex_unmap_pci_memory(adapter, skb,
743 dev_kfree_skb_any(skb);
745 memset(desc, 0, sizeof(*desc));
747 card->tx_buf_list[i] = NULL;
750 atomic_set(&adapter->tx_hw_pending, 0);
754 /* This function cleans up RX buffer rings. If any of the buffer list has valid
755 * SKB address, associated SKB is freed.
757 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
759 struct pcie_service_card *card = adapter->card;
760 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
761 struct mwifiex_pcie_buf_desc *desc;
762 struct mwifiex_pfu_buf_desc *desc2;
766 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
767 if (reg->pfu_enabled) {
768 desc2 = card->rxbd_ring[i];
769 if (card->rx_buf_list[i]) {
770 skb = card->rx_buf_list[i];
771 mwifiex_unmap_pci_memory(adapter, skb,
773 dev_kfree_skb_any(skb);
775 memset(desc2, 0, sizeof(*desc2));
777 desc = card->rxbd_ring[i];
778 if (card->rx_buf_list[i]) {
779 skb = card->rx_buf_list[i];
780 mwifiex_unmap_pci_memory(adapter, skb,
782 dev_kfree_skb_any(skb);
784 memset(desc, 0, sizeof(*desc));
786 card->rx_buf_list[i] = NULL;
792 /* This function cleans up event buffer rings. If any of the buffer list has
793 * valid SKB address, associated SKB is freed.
795 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
797 struct pcie_service_card *card = adapter->card;
798 struct mwifiex_evt_buf_desc *desc;
802 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
803 desc = card->evtbd_ring[i];
804 if (card->evt_buf_list[i]) {
805 skb = card->evt_buf_list[i];
806 mwifiex_unmap_pci_memory(adapter, skb,
808 dev_kfree_skb_any(skb);
810 card->evt_buf_list[i] = NULL;
811 memset(desc, 0, sizeof(*desc));
817 /* This function creates buffer descriptor ring for TX
819 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
821 struct pcie_service_card *card = adapter->card;
822 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
825 * driver maintaines the write pointer and firmware maintaines the read
826 * pointer. The write pointer starts at 0 (zero) while the read pointer
827 * starts at zero with rollover bit set
829 card->txbd_wrptr = 0;
831 if (reg->pfu_enabled)
832 card->txbd_rdptr = 0;
834 card->txbd_rdptr |= reg->tx_rollover_ind;
836 /* allocate shared memory for the BD ring and divide the same in to
837 several descriptors */
838 if (reg->pfu_enabled)
839 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
842 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
845 mwifiex_dbg(adapter, INFO,
846 "info: txbd_ring: Allocating %d bytes\n",
847 card->txbd_ring_size);
848 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
849 card->txbd_ring_size,
850 &card->txbd_ring_pbase);
851 if (!card->txbd_ring_vbase) {
852 mwifiex_dbg(adapter, ERROR,
853 "allocate consistent memory (%d bytes) failed!\n",
854 card->txbd_ring_size);
857 mwifiex_dbg(adapter, DATA,
858 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
859 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
860 (u32)((u64)card->txbd_ring_pbase >> 32),
861 card->txbd_ring_size);
863 return mwifiex_init_txq_ring(adapter);
866 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
868 struct pcie_service_card *card = adapter->card;
869 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
871 mwifiex_cleanup_txq_ring(adapter);
873 if (card->txbd_ring_vbase)
874 pci_free_consistent(card->dev, card->txbd_ring_size,
875 card->txbd_ring_vbase,
876 card->txbd_ring_pbase);
877 card->txbd_ring_size = 0;
878 card->txbd_wrptr = 0;
879 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
880 card->txbd_ring_vbase = NULL;
881 card->txbd_ring_pbase = 0;
887 * This function creates buffer descriptor ring for RX
889 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
891 struct pcie_service_card *card = adapter->card;
892 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
895 * driver maintaines the read pointer and firmware maintaines the write
896 * pointer. The write pointer starts at 0 (zero) while the read pointer
897 * starts at zero with rollover bit set
899 card->rxbd_wrptr = 0;
900 card->rxbd_rdptr = reg->rx_rollover_ind;
902 if (reg->pfu_enabled)
903 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
906 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
909 mwifiex_dbg(adapter, INFO,
910 "info: rxbd_ring: Allocating %d bytes\n",
911 card->rxbd_ring_size);
912 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
913 card->rxbd_ring_size,
914 &card->rxbd_ring_pbase);
915 if (!card->rxbd_ring_vbase) {
916 mwifiex_dbg(adapter, ERROR,
917 "allocate consistent memory (%d bytes) failed!\n",
918 card->rxbd_ring_size);
922 mwifiex_dbg(adapter, DATA,
923 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
924 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
925 (u32)((u64)card->rxbd_ring_pbase >> 32),
926 card->rxbd_ring_size);
928 return mwifiex_init_rxq_ring(adapter);
932 * This function deletes Buffer descriptor ring for RX
934 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
936 struct pcie_service_card *card = adapter->card;
937 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
939 mwifiex_cleanup_rxq_ring(adapter);
941 if (card->rxbd_ring_vbase)
942 pci_free_consistent(card->dev, card->rxbd_ring_size,
943 card->rxbd_ring_vbase,
944 card->rxbd_ring_pbase);
945 card->rxbd_ring_size = 0;
946 card->rxbd_wrptr = 0;
947 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
948 card->rxbd_ring_vbase = NULL;
949 card->rxbd_ring_pbase = 0;
955 * This function creates buffer descriptor ring for Events
957 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
959 struct pcie_service_card *card = adapter->card;
960 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
963 * driver maintaines the read pointer and firmware maintaines the write
964 * pointer. The write pointer starts at 0 (zero) while the read pointer
965 * starts at zero with rollover bit set
967 card->evtbd_wrptr = 0;
968 card->evtbd_rdptr = reg->evt_rollover_ind;
970 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
973 mwifiex_dbg(adapter, INFO,
974 "info: evtbd_ring: Allocating %d bytes\n",
975 card->evtbd_ring_size);
976 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
977 card->evtbd_ring_size,
978 &card->evtbd_ring_pbase);
979 if (!card->evtbd_ring_vbase) {
980 mwifiex_dbg(adapter, ERROR,
981 "allocate consistent memory (%d bytes) failed!\n",
982 card->evtbd_ring_size);
986 mwifiex_dbg(adapter, EVENT,
987 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
988 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
989 (u32)((u64)card->evtbd_ring_pbase >> 32),
990 card->evtbd_ring_size);
992 return mwifiex_pcie_init_evt_ring(adapter);
996 * This function deletes Buffer descriptor ring for Events
998 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
1000 struct pcie_service_card *card = adapter->card;
1001 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1003 mwifiex_cleanup_evt_ring(adapter);
1005 if (card->evtbd_ring_vbase)
1006 pci_free_consistent(card->dev, card->evtbd_ring_size,
1007 card->evtbd_ring_vbase,
1008 card->evtbd_ring_pbase);
1009 card->evtbd_wrptr = 0;
1010 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
1011 card->evtbd_ring_size = 0;
1012 card->evtbd_ring_vbase = NULL;
1013 card->evtbd_ring_pbase = 0;
1019 * This function allocates a buffer for CMDRSP
1021 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
1023 struct pcie_service_card *card = adapter->card;
1024 struct sk_buff *skb;
1026 /* Allocate memory for receiving command response data */
1027 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1029 mwifiex_dbg(adapter, ERROR,
1030 "Unable to allocate skb for command response data.\n");
1033 skb_put(skb, MWIFIEX_UPLD_SIZE);
1034 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1035 PCI_DMA_FROMDEVICE)) {
1040 card->cmdrsp_buf = skb;
1046 * This function deletes a buffer for CMDRSP
1048 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
1050 struct pcie_service_card *card;
1055 card = adapter->card;
1057 if (card && card->cmdrsp_buf) {
1058 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
1059 PCI_DMA_FROMDEVICE);
1060 dev_kfree_skb_any(card->cmdrsp_buf);
1061 card->cmdrsp_buf = NULL;
1064 if (card && card->cmd_buf) {
1065 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1067 dev_kfree_skb_any(card->cmd_buf);
1068 card->cmd_buf = NULL;
1074 * This function allocates a buffer for sleep cookie
1076 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1078 struct pcie_service_card *card = adapter->card;
1081 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
1082 &card->sleep_cookie_pbase);
1083 if (!card->sleep_cookie_vbase) {
1084 mwifiex_dbg(adapter, ERROR,
1085 "pci_alloc_consistent failed!\n");
1088 /* Init val of Sleep Cookie */
1089 tmp = FW_AWAKE_COOKIE;
1090 put_unaligned(tmp, card->sleep_cookie_vbase);
1092 mwifiex_dbg(adapter, INFO,
1093 "alloc_scook: sleep cookie=0x%x\n",
1094 get_unaligned(card->sleep_cookie_vbase));
1100 * This function deletes buffer for sleep cookie
1102 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1104 struct pcie_service_card *card;
1109 card = adapter->card;
1111 if (card && card->sleep_cookie_vbase) {
1112 pci_free_consistent(card->dev, sizeof(u32),
1113 card->sleep_cookie_vbase,
1114 card->sleep_cookie_pbase);
1115 card->sleep_cookie_vbase = NULL;
1121 /* This function flushes the TX buffer descriptor ring
1122 * This function defined as handler is also called while cleaning TXRX
1123 * during disconnect/ bss stop.
1125 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1127 struct pcie_service_card *card = adapter->card;
1129 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1130 card->txbd_flush = 1;
1131 /* write pointer already set at last send
1132 * send dnld-rdy intr again, wait for completion.
1134 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1135 CPU_INTR_DNLD_RDY)) {
1136 mwifiex_dbg(adapter, ERROR,
1137 "failed to assert dnld-rdy interrupt.\n");
1145 * This function unmaps and frees downloaded data buffer
1147 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1149 struct sk_buff *skb;
1150 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1151 struct mwifiex_pcie_buf_desc *desc;
1152 struct mwifiex_pfu_buf_desc *desc2;
1153 struct pcie_service_card *card = adapter->card;
1154 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1156 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1157 mwifiex_pm_wakeup_card(adapter);
1159 /* Read the TX ring read pointer set by firmware */
1160 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1161 mwifiex_dbg(adapter, ERROR,
1162 "SEND COMP: failed to read reg->tx_rdptr\n");
1166 mwifiex_dbg(adapter, DATA,
1167 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1168 card->txbd_rdptr, rdptr);
1170 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1171 /* free from previous txbd_rdptr to current txbd_rdptr */
1172 while (((card->txbd_rdptr & reg->tx_mask) !=
1173 (rdptr & reg->tx_mask)) ||
1174 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1175 (rdptr & reg->tx_rollover_ind))) {
1176 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1179 skb = card->tx_buf_list[wrdoneidx];
1182 mwifiex_dbg(adapter, DATA,
1183 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1185 mwifiex_unmap_pci_memory(adapter, skb,
1190 if (card->txbd_flush)
1191 mwifiex_write_data_complete(adapter, skb, 0,
1194 mwifiex_write_data_complete(adapter, skb, 0, 0);
1195 atomic_dec(&adapter->tx_hw_pending);
1198 card->tx_buf_list[wrdoneidx] = NULL;
1200 if (reg->pfu_enabled) {
1201 desc2 = card->txbd_ring[wrdoneidx];
1202 memset(desc2, 0, sizeof(*desc2));
1204 desc = card->txbd_ring[wrdoneidx];
1205 memset(desc, 0, sizeof(*desc));
1207 switch (card->dev->device) {
1208 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1211 case PCIE_DEVICE_ID_MARVELL_88W8897:
1212 case PCIE_DEVICE_ID_MARVELL_88W8997:
1213 card->txbd_rdptr += reg->ring_tx_start_ptr;
1218 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1219 card->txbd_rdptr = ((card->txbd_rdptr &
1220 reg->tx_rollover_ind) ^
1221 reg->tx_rollover_ind);
1225 adapter->data_sent = false;
1227 if (card->txbd_flush) {
1228 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1229 card->txbd_flush = 0;
1231 mwifiex_clean_pcie_ring_buf(adapter);
1237 /* This function sends data buffer to device. First 4 bytes of payload
1238 * are filled with payload length and payload type. Then this payload
1239 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1240 * Download ready interrupt to FW is deffered if Tx ring is not full and
1241 * additional payload can be accomodated.
1242 * Caller must ensure tx_param parameter to this function is not NULL.
1245 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1246 struct mwifiex_tx_param *tx_param)
1248 struct pcie_service_card *card = adapter->card;
1249 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1250 u32 wrindx, num_tx_buffs, rx_val;
1253 struct mwifiex_pcie_buf_desc *desc = NULL;
1254 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1256 if (!(skb->data && skb->len)) {
1257 mwifiex_dbg(adapter, ERROR,
1258 "%s(): invalid parameter <%p, %#x>\n",
1259 __func__, skb->data, skb->len);
1263 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1264 mwifiex_pm_wakeup_card(adapter);
1266 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1267 mwifiex_dbg(adapter, DATA,
1268 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1269 card->txbd_rdptr, card->txbd_wrptr);
1270 if (mwifiex_pcie_txbd_not_full(card)) {
1273 adapter->data_sent = true;
1274 payload = skb->data;
1275 put_unaligned_le16((u16)skb->len, payload + 0);
1276 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
1278 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1282 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1283 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1284 card->tx_buf_list[wrindx] = skb;
1285 atomic_inc(&adapter->tx_hw_pending);
1287 if (reg->pfu_enabled) {
1288 desc2 = card->txbd_ring[wrindx];
1289 desc2->paddr = buf_pa;
1290 desc2->len = (u16)skb->len;
1291 desc2->frag_len = (u16)skb->len;
1293 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1294 MWIFIEX_BD_FLAG_LAST_DESC;
1296 desc = card->txbd_ring[wrindx];
1297 desc->paddr = buf_pa;
1298 desc->len = (u16)skb->len;
1299 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1300 MWIFIEX_BD_FLAG_LAST_DESC;
1303 switch (card->dev->device) {
1304 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1307 case PCIE_DEVICE_ID_MARVELL_88W8897:
1308 case PCIE_DEVICE_ID_MARVELL_88W8997:
1309 card->txbd_wrptr += reg->ring_tx_start_ptr;
1313 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1314 card->txbd_wrptr = ((card->txbd_wrptr &
1315 reg->tx_rollover_ind) ^
1316 reg->tx_rollover_ind);
1318 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1319 /* Write the TX ring write pointer in to reg->tx_wrptr */
1320 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1321 card->txbd_wrptr | rx_val)) {
1322 mwifiex_dbg(adapter, ERROR,
1323 "SEND DATA: failed to write reg->tx_wrptr\n");
1327 if ((mwifiex_pcie_txbd_not_full(card)) &&
1328 tx_param->next_pkt_len) {
1329 /* have more packets and TxBD still can hold more */
1330 mwifiex_dbg(adapter, DATA,
1331 "SEND DATA: delay dnld-rdy interrupt.\n");
1332 adapter->data_sent = false;
1334 /* Send the TX ready interrupt */
1335 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1336 CPU_INTR_DNLD_RDY)) {
1337 mwifiex_dbg(adapter, ERROR,
1338 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1343 mwifiex_dbg(adapter, DATA,
1344 "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1345 "%#x> and sent packet to firmware successfully\n",
1346 card->txbd_rdptr, card->txbd_wrptr);
1348 mwifiex_dbg(adapter, DATA,
1349 "info: TX Ring full, can't send packets to fw\n");
1350 adapter->data_sent = true;
1351 /* Send the TX ready interrupt */
1352 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1354 mwifiex_dbg(adapter, ERROR,
1355 "SEND DATA: failed to assert door-bell intr\n");
1359 return -EINPROGRESS;
1361 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1362 card->tx_buf_list[wrindx] = NULL;
1363 atomic_dec(&adapter->tx_hw_pending);
1364 if (reg->pfu_enabled)
1365 memset(desc2, 0, sizeof(*desc2));
1367 memset(desc, 0, sizeof(*desc));
1373 * This function handles received buffer ring and
1374 * dispatches packets to upper
1376 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1378 struct pcie_service_card *card = adapter->card;
1379 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1380 u32 wrptr, rd_index, tx_val;
1383 struct sk_buff *skb_tmp = NULL;
1384 struct mwifiex_pcie_buf_desc *desc;
1385 struct mwifiex_pfu_buf_desc *desc2;
1387 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1388 mwifiex_pm_wakeup_card(adapter);
1390 /* Read the RX ring Write pointer set by firmware */
1391 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1392 mwifiex_dbg(adapter, ERROR,
1393 "RECV DATA: failed to read reg->rx_wrptr\n");
1397 card->rxbd_wrptr = wrptr;
1399 while (((wrptr & reg->rx_mask) !=
1400 (card->rxbd_rdptr & reg->rx_mask)) ||
1401 ((wrptr & reg->rx_rollover_ind) ==
1402 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1403 struct sk_buff *skb_data;
1406 rd_index = card->rxbd_rdptr & reg->rx_mask;
1407 skb_data = card->rx_buf_list[rd_index];
1409 /* If skb allocation was failed earlier for Rx packet,
1410 * rx_buf_list[rd_index] would have been left with a NULL.
1415 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1416 card->rx_buf_list[rd_index] = NULL;
1418 /* Get data length from interface header -
1419 * first 2 bytes for len, next 2 bytes is for type
1421 rx_len = get_unaligned_le16(skb_data->data);
1422 if (WARN_ON(rx_len <= adapter->intf_hdr_len ||
1423 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1424 mwifiex_dbg(adapter, ERROR,
1425 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1426 rx_len, card->rxbd_rdptr, wrptr);
1427 dev_kfree_skb_any(skb_data);
1429 skb_put(skb_data, rx_len);
1430 mwifiex_dbg(adapter, DATA,
1431 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1432 card->rxbd_rdptr, wrptr, rx_len);
1433 skb_pull(skb_data, adapter->intf_hdr_len);
1434 if (adapter->rx_work_enabled) {
1435 skb_queue_tail(&adapter->rx_data_q, skb_data);
1436 adapter->data_received = true;
1437 atomic_inc(&adapter->rx_pending);
1439 mwifiex_handle_rx_packet(adapter, skb_data);
1443 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1446 mwifiex_dbg(adapter, ERROR,
1447 "Unable to allocate skb.\n");
1451 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1452 MWIFIEX_RX_DATA_BUF_SIZE,
1453 PCI_DMA_FROMDEVICE))
1456 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1458 mwifiex_dbg(adapter, INFO,
1459 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1461 card->rx_buf_list[rd_index] = skb_tmp;
1463 if (reg->pfu_enabled) {
1464 desc2 = card->rxbd_ring[rd_index];
1465 desc2->paddr = buf_pa;
1466 desc2->len = skb_tmp->len;
1467 desc2->frag_len = skb_tmp->len;
1469 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1471 desc = card->rxbd_ring[rd_index];
1472 desc->paddr = buf_pa;
1473 desc->len = skb_tmp->len;
1477 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1478 MWIFIEX_MAX_TXRX_BD) {
1479 card->rxbd_rdptr = ((card->rxbd_rdptr &
1480 reg->rx_rollover_ind) ^
1481 reg->rx_rollover_ind);
1483 mwifiex_dbg(adapter, DATA,
1484 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1485 card->rxbd_rdptr, wrptr);
1487 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1488 /* Write the RX ring read pointer in to reg->rx_rdptr */
1489 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1490 card->rxbd_rdptr | tx_val)) {
1491 mwifiex_dbg(adapter, DATA,
1492 "RECV DATA: failed to write reg->rx_rdptr\n");
1497 /* Read the RX ring Write pointer set by firmware */
1498 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1499 mwifiex_dbg(adapter, ERROR,
1500 "RECV DATA: failed to read reg->rx_wrptr\n");
1504 mwifiex_dbg(adapter, DATA,
1505 "info: RECV DATA: Rcvd packet from fw successfully\n");
1506 card->rxbd_wrptr = wrptr;
1514 * This function downloads the boot command to device
1517 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1520 struct pcie_service_card *card = adapter->card;
1521 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1523 if (!(skb->data && skb->len)) {
1524 mwifiex_dbg(adapter, ERROR,
1525 "Invalid parameter in %s <%p. len %d>\n",
1526 __func__, skb->data, skb->len);
1530 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1533 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1535 /* Write the lower 32bits of the physical address to low command
1536 * address scratch register
1538 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1539 mwifiex_dbg(adapter, ERROR,
1540 "%s: failed to write download command to boot code.\n",
1542 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1546 /* Write the upper 32bits of the physical address to high command
1547 * address scratch register
1549 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1550 (u32)((u64)buf_pa >> 32))) {
1551 mwifiex_dbg(adapter, ERROR,
1552 "%s: failed to write download command to boot code.\n",
1554 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1558 /* Write the command length to cmd_size scratch register */
1559 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1560 mwifiex_dbg(adapter, ERROR,
1561 "%s: failed to write command len to cmd_size scratch reg\n",
1563 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1567 /* Ring the door bell */
1568 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1569 CPU_INTR_DOOR_BELL)) {
1570 mwifiex_dbg(adapter, ERROR,
1571 "%s: failed to assert door-bell intr\n", __func__);
1572 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1579 /* This function init rx port in firmware which in turn enables to receive data
1580 * from device before transmitting any packet.
1582 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1584 struct pcie_service_card *card = adapter->card;
1585 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1586 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1588 /* Write the RX ring read pointer in to reg->rx_rdptr */
1589 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1591 mwifiex_dbg(adapter, ERROR,
1592 "RECV DATA: failed to write reg->rx_rdptr\n");
1598 /* This function downloads commands to the device
1601 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1603 struct pcie_service_card *card = adapter->card;
1604 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1606 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1607 u8 *payload = (u8 *)skb->data;
1609 if (!(skb->data && skb->len)) {
1610 mwifiex_dbg(adapter, ERROR,
1611 "Invalid parameter in %s <%p, %#x>\n",
1612 __func__, skb->data, skb->len);
1616 /* Make sure a command response buffer is available */
1617 if (!card->cmdrsp_buf) {
1618 mwifiex_dbg(adapter, ERROR,
1619 "No response buffer available, send command failed\n");
1623 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1624 mwifiex_pm_wakeup_card(adapter);
1626 adapter->cmd_sent = true;
1628 put_unaligned_le16((u16)skb->len, &payload[0]);
1629 put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
1631 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1634 card->cmd_buf = skb;
1636 * Need to keep a reference, since core driver might free up this
1637 * buffer before we've unmapped it.
1641 /* To send a command, the driver will:
1642 1. Write the 64bit physical address of the data buffer to
1643 cmd response address low + cmd response address high
1644 2. Ring the door bell (i.e. set the door bell interrupt)
1646 In response to door bell interrupt, the firmware will perform
1647 the DMA of the command packet (first header to obtain the total
1648 length and then rest of the command).
1651 if (card->cmdrsp_buf) {
1652 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1653 /* Write the lower 32bits of the cmdrsp buffer physical
1655 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1656 (u32)cmdrsp_buf_pa)) {
1657 mwifiex_dbg(adapter, ERROR,
1658 "Failed to write download cmd to boot code.\n");
1662 /* Write the upper 32bits of the cmdrsp buffer physical
1664 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1665 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1666 mwifiex_dbg(adapter, ERROR,
1667 "Failed to write download cmd to boot code.\n");
1673 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1674 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1675 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1677 mwifiex_dbg(adapter, ERROR,
1678 "Failed to write download cmd to boot code.\n");
1682 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1683 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1684 (u32)((u64)cmd_buf_pa >> 32))) {
1685 mwifiex_dbg(adapter, ERROR,
1686 "Failed to write download cmd to boot code.\n");
1691 /* Write the command length to reg->cmd_size */
1692 if (mwifiex_write_reg(adapter, reg->cmd_size,
1693 card->cmd_buf->len)) {
1694 mwifiex_dbg(adapter, ERROR,
1695 "Failed to write cmd len to reg->cmd_size\n");
1700 /* Ring the door bell */
1701 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1702 CPU_INTR_DOOR_BELL)) {
1703 mwifiex_dbg(adapter, ERROR,
1704 "Failed to assert door-bell intr\n");
1711 adapter->cmd_sent = false;
1717 * This function handles command complete interrupt
1719 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1721 struct pcie_service_card *card = adapter->card;
1722 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1723 struct sk_buff *skb = card->cmdrsp_buf;
1727 mwifiex_dbg(adapter, CMD,
1728 "info: Rx CMD Response\n");
1730 if (adapter->curr_cmd)
1731 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1733 pci_dma_sync_single_for_cpu(card->dev,
1734 MWIFIEX_SKB_DMA_ADDR(skb),
1736 PCI_DMA_FROMDEVICE);
1738 /* Unmap the command as a response has been received. */
1739 if (card->cmd_buf) {
1740 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1742 dev_kfree_skb_any(card->cmd_buf);
1743 card->cmd_buf = NULL;
1746 rx_len = get_unaligned_le16(skb->data);
1747 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1748 skb_trim(skb, rx_len);
1750 if (!adapter->curr_cmd) {
1751 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1752 pci_dma_sync_single_for_device(card->dev,
1753 MWIFIEX_SKB_DMA_ADDR(skb),
1754 MWIFIEX_SLEEP_COOKIE_SIZE,
1755 PCI_DMA_FROMDEVICE);
1756 if (mwifiex_write_reg(adapter,
1758 CPU_INTR_SLEEP_CFM_DONE)) {
1759 mwifiex_dbg(adapter, ERROR,
1760 "Write register failed\n");
1763 mwifiex_delay_for_sleep_cookie(adapter,
1764 MWIFIEX_MAX_DELAY_COUNT);
1765 mwifiex_unmap_pci_memory(adapter, skb,
1766 PCI_DMA_FROMDEVICE);
1767 skb_pull(skb, adapter->intf_hdr_len);
1768 while (reg->sleep_cookie && (count++ < 10) &&
1769 mwifiex_pcie_ok_to_access_hw(adapter))
1770 usleep_range(50, 60);
1771 mwifiex_pcie_enable_host_int(adapter);
1772 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1775 mwifiex_dbg(adapter, ERROR,
1776 "There is no command but got cmdrsp\n");
1778 memcpy(adapter->upld_buf, skb->data,
1779 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1780 skb_push(skb, adapter->intf_hdr_len);
1781 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1782 PCI_DMA_FROMDEVICE))
1784 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1785 skb_pull(skb, adapter->intf_hdr_len);
1786 adapter->curr_cmd->resp_skb = skb;
1787 adapter->cmd_resp_received = true;
1788 /* Take the pointer and set it to CMD node and will
1789 return in the response complete callback */
1790 card->cmdrsp_buf = NULL;
1792 /* Clear the cmd-rsp buffer address in scratch registers. This
1793 will prevent firmware from writing to the same response
1795 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1796 mwifiex_dbg(adapter, ERROR,
1797 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1800 /* Write the upper 32bits of the cmdrsp buffer physical
1802 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1803 mwifiex_dbg(adapter, ERROR,
1804 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1813 * Command Response processing complete handler
1815 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1816 struct sk_buff *skb)
1818 struct pcie_service_card *card = adapter->card;
1821 card->cmdrsp_buf = skb;
1822 skb_push(card->cmdrsp_buf, adapter->intf_hdr_len);
1823 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1824 PCI_DMA_FROMDEVICE))
1832 * This function handles firmware event ready interrupt
1834 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1836 struct pcie_service_card *card = adapter->card;
1837 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1838 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1840 struct mwifiex_evt_buf_desc *desc;
1842 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1843 mwifiex_pm_wakeup_card(adapter);
1845 if (adapter->event_received) {
1846 mwifiex_dbg(adapter, EVENT,
1847 "info: Event being processed,\t"
1848 "do not process this interrupt just yet\n");
1852 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1853 mwifiex_dbg(adapter, ERROR,
1854 "info: Invalid read pointer...\n");
1858 /* Read the event ring write pointer set by firmware */
1859 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1860 mwifiex_dbg(adapter, ERROR,
1861 "EventReady: failed to read reg->evt_wrptr\n");
1865 mwifiex_dbg(adapter, EVENT,
1866 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1867 card->evtbd_rdptr, wrptr);
1868 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1869 & MWIFIEX_EVTBD_MASK)) ||
1870 ((wrptr & reg->evt_rollover_ind) ==
1871 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1872 struct sk_buff *skb_cmd;
1873 __le16 data_len = 0;
1876 mwifiex_dbg(adapter, INFO,
1877 "info: Read Index: %d\n", rdptr);
1878 skb_cmd = card->evt_buf_list[rdptr];
1879 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1881 /* Take the pointer and set it to event pointer in adapter
1882 and will return back after event handling callback */
1883 card->evt_buf_list[rdptr] = NULL;
1884 desc = card->evtbd_ring[rdptr];
1885 memset(desc, 0, sizeof(*desc));
1887 event = get_unaligned_le32(
1888 &skb_cmd->data[adapter->intf_hdr_len]);
1889 adapter->event_cause = event;
1890 /* The first 4bytes will be the event transfer header
1891 len is 2 bytes followed by type which is 2 bytes */
1892 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1893 evt_len = le16_to_cpu(data_len);
1894 skb_trim(skb_cmd, evt_len);
1895 skb_pull(skb_cmd, adapter->intf_hdr_len);
1896 mwifiex_dbg(adapter, EVENT,
1897 "info: Event length: %d\n", evt_len);
1899 if (evt_len > MWIFIEX_EVENT_HEADER_LEN &&
1900 evt_len < MAX_EVENT_SIZE)
1901 memcpy(adapter->event_body, skb_cmd->data +
1902 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1903 MWIFIEX_EVENT_HEADER_LEN);
1905 adapter->event_received = true;
1906 adapter->event_skb = skb_cmd;
1908 /* Do not update the event read pointer here, wait till the
1909 buffer is released. This is just to make things simpler,
1910 we need to find a better method of managing these buffers.
1913 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1914 CPU_INTR_EVENT_DONE)) {
1915 mwifiex_dbg(adapter, ERROR,
1916 "Write register failed\n");
1925 * Event processing complete handler
1927 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1928 struct sk_buff *skb)
1930 struct pcie_service_card *card = adapter->card;
1931 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1933 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1935 struct mwifiex_evt_buf_desc *desc;
1940 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1941 mwifiex_dbg(adapter, ERROR,
1942 "event_complete: Invalid rdptr 0x%x\n",
1947 /* Read the event ring write pointer set by firmware */
1948 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1949 mwifiex_dbg(adapter, ERROR,
1950 "event_complete: failed to read reg->evt_wrptr\n");
1954 if (!card->evt_buf_list[rdptr]) {
1955 skb_push(skb, adapter->intf_hdr_len);
1956 skb_put(skb, MAX_EVENT_SIZE - skb->len);
1957 if (mwifiex_map_pci_memory(adapter, skb,
1959 PCI_DMA_FROMDEVICE))
1961 card->evt_buf_list[rdptr] = skb;
1962 desc = card->evtbd_ring[rdptr];
1963 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1964 desc->len = (u16)skb->len;
1968 mwifiex_dbg(adapter, ERROR,
1969 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1970 rdptr, card->evt_buf_list[rdptr], skb);
1973 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1974 card->evtbd_rdptr = ((card->evtbd_rdptr &
1975 reg->evt_rollover_ind) ^
1976 reg->evt_rollover_ind);
1979 mwifiex_dbg(adapter, EVENT,
1980 "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1981 card->evtbd_rdptr, wrptr);
1983 /* Write the event ring read pointer in to reg->evt_rdptr */
1984 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1985 card->evtbd_rdptr)) {
1986 mwifiex_dbg(adapter, ERROR,
1987 "event_complete: failed to read reg->evt_rdptr\n");
1991 mwifiex_dbg(adapter, EVENT,
1992 "info: Check Events Again\n");
1993 ret = mwifiex_pcie_process_event_ready(adapter);
1998 /* Combo firmware image is a combination of
1999 * (1) combo crc heaer, start with CMD5
2000 * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1.
2003 * This function bypass the header and bluetooth part, return
2004 * the offset of tail wifi-only part. If the image is already wifi-only,
2005 * that is start with CMD1, return 0.
2008 static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
2009 const void *firmware, u32 firmware_len) {
2010 const struct mwifiex_fw_data *fwdata;
2011 u32 offset = 0, data_len, dnld_cmd;
2013 bool cmd7_before = false, first_cmd = false;
2016 /* Check for integer and buffer overflow */
2017 if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
2018 offset + sizeof(fwdata->header) >= firmware_len) {
2019 mwifiex_dbg(adapter, ERROR,
2020 "extract wifi-only fw failure!\n");
2025 fwdata = firmware + offset;
2026 dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
2027 data_len = le32_to_cpu(fwdata->header.data_length);
2029 /* Skip past header */
2030 offset += sizeof(fwdata->header);
2033 case MWIFIEX_FW_DNLD_CMD_1:
2034 if (offset + data_len < data_len) {
2035 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2040 /* Image start with cmd1, already wifi-only firmware */
2042 mwifiex_dbg(adapter, MSG,
2043 "input wifi-only firmware\n");
2048 mwifiex_dbg(adapter, ERROR,
2049 "no cmd7 before cmd1!\n");
2055 case MWIFIEX_FW_DNLD_CMD_5:
2057 /* Check for integer overflow */
2058 if (offset + data_len < data_len) {
2059 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2065 case MWIFIEX_FW_DNLD_CMD_6:
2067 /* Check for integer overflow */
2068 if (offset + data_len < data_len) {
2069 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2074 if (offset >= firmware_len) {
2075 mwifiex_dbg(adapter, ERROR,
2076 "extract wifi-only fw failure!\n");
2082 case MWIFIEX_FW_DNLD_CMD_7:
2087 mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n",
2099 * This function downloads the firmware to the card.
2101 * Firmware is downloaded to the card in blocks. Every block download
2102 * is tested for CRC errors, and retried a number of times before
2103 * returning failure.
2105 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
2106 struct mwifiex_fw_image *fw)
2109 u8 *firmware = fw->fw_buf;
2110 u32 firmware_len = fw->fw_len;
2112 struct sk_buff *skb;
2113 u32 txlen, tx_blocks = 0, tries, len, val;
2114 u32 block_retry_cnt = 0;
2115 struct pcie_service_card *card = adapter->card;
2116 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2118 if (!firmware || !firmware_len) {
2119 mwifiex_dbg(adapter, ERROR,
2120 "No firmware image found! Terminating download\n");
2124 mwifiex_dbg(adapter, INFO,
2125 "info: Downloading FW image (%d bytes)\n",
2128 if (mwifiex_pcie_disable_host_int(adapter)) {
2129 mwifiex_dbg(adapter, ERROR,
2130 "%s: Disabling interrupts failed.\n", __func__);
2134 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
2140 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val);
2142 mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n");
2146 /* PCIE FLR case: extract wifi part from combo firmware*/
2147 if (val == MWIFIEX_PCIE_FLR_HAPPENS) {
2148 ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len);
2150 mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n");
2154 mwifiex_dbg(adapter, MSG,
2155 "info: dnld wifi firmware from %d bytes\n", offset);
2158 /* Perform firmware data transfer */
2163 if (offset >= firmware_len)
2166 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2167 ret = mwifiex_read_reg(adapter, reg->cmd_size,
2170 mwifiex_dbg(adapter, FATAL,
2171 "Failed reading len from boot code\n");
2176 usleep_range(10, 20);
2181 } else if (len > MWIFIEX_UPLD_SIZE) {
2182 mwifiex_dbg(adapter, ERROR,
2183 "FW download failure @ %d, invalid length %d\n",
2193 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
2194 mwifiex_dbg(adapter, ERROR,
2195 "FW download failure @ %d, over max\t"
2196 "retry count\n", offset);
2200 mwifiex_dbg(adapter, ERROR,
2201 "FW CRC error indicated by the\t"
2202 "helper: len = 0x%04X, txlen = %d\n",
2205 /* Setting this to 0 to resend from same offset */
2208 block_retry_cnt = 0;
2209 /* Set blocksize to transfer - checking for
2211 if (firmware_len - offset < txlen)
2212 txlen = firmware_len - offset;
2214 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
2215 card->pcie.blksz_fw_dl;
2217 /* Copy payload to buffer */
2218 memmove(skb->data, &firmware[offset], txlen);
2221 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
2222 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
2224 /* Send the boot command to device */
2225 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
2226 mwifiex_dbg(adapter, ERROR,
2227 "Failed to send firmware download command\n");
2232 /* Wait for the command done interrupt */
2233 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2234 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
2236 mwifiex_dbg(adapter, ERROR,
2237 "%s: Failed to read\t"
2238 "interrupt status during fw dnld.\n",
2240 mwifiex_unmap_pci_memory(adapter, skb,
2245 if (!(ireg_intr & CPU_INTR_DOOR_BELL))
2247 usleep_range(10, 20);
2249 if (ireg_intr & CPU_INTR_DOOR_BELL) {
2250 mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
2252 mwifiex_unmap_pci_memory(adapter, skb,
2258 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
2263 mwifiex_dbg(adapter, MSG,
2264 "info: FW download over, size %d bytes\n", offset);
2269 dev_kfree_skb_any(skb);
2274 * This function checks the firmware status in card.
2277 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2281 struct pcie_service_card *card = adapter->card;
2282 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2285 /* Mask spurios interrupts */
2286 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2288 mwifiex_dbg(adapter, ERROR,
2289 "Write register failed\n");
2293 mwifiex_dbg(adapter, INFO,
2294 "Setting driver ready signature\n");
2295 if (mwifiex_write_reg(adapter, reg->drv_rdy,
2296 FIRMWARE_READY_PCIE)) {
2297 mwifiex_dbg(adapter, ERROR,
2298 "Failed to write driver ready signature\n");
2302 /* Wait for firmware initialization event */
2303 for (tries = 0; tries < poll_num; tries++) {
2304 if (mwifiex_read_reg(adapter, reg->fw_status,
2310 mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>",
2311 tries, ret, firmware_stat);
2315 if (firmware_stat == FIRMWARE_READY_PCIE) {
2327 /* This function checks if WLAN is the winner.
2330 mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
2334 struct pcie_service_card *card = adapter->card;
2335 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2337 if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) {
2339 } else if (!winner) {
2340 mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n");
2341 adapter->winner = 1;
2343 mwifiex_dbg(adapter, ERROR,
2344 "PCI-E is not the winner <%#x>", winner);
2351 * This function reads the interrupt status from card.
2353 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
2357 unsigned long flags;
2358 struct pcie_service_card *card = adapter->card;
2360 if (card->msi_enable) {
2361 spin_lock_irqsave(&adapter->int_lock, flags);
2362 adapter->int_status = 1;
2363 spin_unlock_irqrestore(&adapter->int_lock, flags);
2367 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2370 if (card->msix_enable && msg_id >= 0) {
2371 pcie_ireg = BIT(msg_id);
2373 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2375 mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2379 if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg)
2383 mwifiex_pcie_disable_host_int(adapter);
2385 /* Clear the pending interrupts */
2386 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2388 mwifiex_dbg(adapter, ERROR,
2389 "Write register failed\n");
2394 if (!adapter->pps_uapsd_mode &&
2395 adapter->ps_state == PS_STATE_SLEEP &&
2396 mwifiex_pcie_ok_to_access_hw(adapter)) {
2397 /* Potentially for PCIe we could get other
2398 * interrupts like shared. Don't change power
2399 * state until cookie is set
2401 adapter->ps_state = PS_STATE_AWAKE;
2402 adapter->pm_wakeup_fw_try = false;
2403 del_timer(&adapter->wakeup_timer);
2406 spin_lock_irqsave(&adapter->int_lock, flags);
2407 adapter->int_status |= pcie_ireg;
2408 spin_unlock_irqrestore(&adapter->int_lock, flags);
2409 mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
2413 * Interrupt handler for PCIe root port
2415 * This function reads the interrupt status from firmware and assigns
2416 * the main process in workqueue which will handle the interrupt.
2418 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2420 struct mwifiex_msix_context *ctx = context;
2421 struct pci_dev *pdev = ctx->dev;
2422 struct pcie_service_card *card;
2423 struct mwifiex_adapter *adapter;
2425 card = pci_get_drvdata(pdev);
2427 if (!card->adapter) {
2428 pr_err("info: %s: card=%p adapter=%p\n", __func__, card,
2429 card ? card->adapter : NULL);
2432 adapter = card->adapter;
2434 if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags))
2437 if (card->msix_enable)
2438 mwifiex_interrupt_status(adapter, ctx->msg_id);
2440 mwifiex_interrupt_status(adapter, -1);
2442 mwifiex_queue_main_work(adapter);
2449 * This function checks the current interrupt status.
2451 * The following interrupts are checked and handled by this function -
2454 * - Command received
2455 * - Packets received
2458 * In case of Rx packets received, the packets are uploaded from card to
2459 * host and processed accordingly.
2461 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2465 unsigned long flags;
2466 struct pcie_service_card *card = adapter->card;
2468 spin_lock_irqsave(&adapter->int_lock, flags);
2469 if (!card->msi_enable) {
2470 /* Clear out unused interrupts */
2471 pcie_ireg = adapter->int_status;
2473 adapter->int_status = 0;
2474 spin_unlock_irqrestore(&adapter->int_lock, flags);
2476 if (card->msi_enable) {
2477 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2478 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2480 mwifiex_dbg(adapter, ERROR,
2481 "Read register failed\n");
2485 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2486 if (mwifiex_write_reg(adapter,
2487 PCIE_HOST_INT_STATUS,
2489 mwifiex_dbg(adapter, ERROR,
2490 "Write register failed\n");
2493 if (!adapter->pps_uapsd_mode &&
2494 adapter->ps_state == PS_STATE_SLEEP) {
2495 adapter->ps_state = PS_STATE_AWAKE;
2496 adapter->pm_wakeup_fw_try = false;
2497 del_timer(&adapter->wakeup_timer);
2503 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2504 mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n");
2505 ret = mwifiex_pcie_send_data_complete(adapter);
2509 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2510 mwifiex_dbg(adapter, INTR, "info: Rx DATA\n");
2511 ret = mwifiex_pcie_process_recv_data(adapter);
2515 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2516 mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n");
2517 ret = mwifiex_pcie_process_event_ready(adapter);
2521 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2522 if (adapter->cmd_sent) {
2523 mwifiex_dbg(adapter, INTR,
2524 "info: CMD sent Interrupt\n");
2525 adapter->cmd_sent = false;
2527 /* Handle command response */
2528 ret = mwifiex_pcie_process_cmd_complete(adapter);
2533 mwifiex_dbg(adapter, INTR,
2534 "info: cmd_sent=%d data_sent=%d\n",
2535 adapter->cmd_sent, adapter->data_sent);
2536 if (!card->msi_enable && !card->msix_enable &&
2537 adapter->ps_state != PS_STATE_SLEEP)
2538 mwifiex_pcie_enable_host_int(adapter);
2544 * This function downloads data from driver to card.
2546 * Both commands and data packets are transferred to the card by this
2549 * This function adds the PCIE specific header to the front of the buffer
2550 * before transferring. The header contains the length of the packet and
2551 * the type. The firmware handles the packets based upon this set type.
2553 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2554 struct sk_buff *skb,
2555 struct mwifiex_tx_param *tx_param)
2558 mwifiex_dbg(adapter, ERROR,
2559 "Passed NULL skb to %s\n", __func__);
2563 if (type == MWIFIEX_TYPE_DATA)
2564 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2565 else if (type == MWIFIEX_TYPE_CMD)
2566 return mwifiex_pcie_send_cmd(adapter, skb);
2571 /* Function to dump PCIE scratch registers in case of FW crash
2574 mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
2577 char buf[256], *ptr;
2580 struct pcie_service_card *card = adapter->card;
2581 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2582 int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
2583 PCIE_SCRATCH_14_REG,
2584 PCIE_SCRATCH_15_REG};
2589 mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
2591 if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
2592 mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
2597 mwifiex_dbg(adapter, MSG, "pcie scratch register:");
2598 for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
2599 mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
2600 ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
2601 pcie_scratch_reg[i], value);
2604 mwifiex_dbg(adapter, MSG, "%s\n", buf);
2605 p += sprintf(p, "%s\n", buf);
2607 mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
2612 /* This function read/write firmware */
2613 static enum rdwr_status
2614 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2619 struct pcie_service_card *card = adapter->card;
2620 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2622 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
2623 return RDWR_STATUS_FAILURE;
2625 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2626 reg->fw_dump_host_ready);
2628 mwifiex_dbg(adapter, ERROR,
2629 "PCIE write err\n");
2630 return RDWR_STATUS_FAILURE;
2633 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2634 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2635 if (ctrl_data == FW_DUMP_DONE)
2636 return RDWR_STATUS_SUCCESS;
2637 if (doneflag && ctrl_data == doneflag)
2638 return RDWR_STATUS_DONE;
2639 if (ctrl_data != reg->fw_dump_host_ready) {
2640 mwifiex_dbg(adapter, WARN,
2641 "The ctrl reg was changed, re-try again!\n");
2642 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2643 reg->fw_dump_host_ready);
2645 mwifiex_dbg(adapter, ERROR,
2646 "PCIE write err\n");
2647 return RDWR_STATUS_FAILURE;
2650 usleep_range(100, 200);
2653 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2654 return RDWR_STATUS_FAILURE;
2657 /* This function dump firmware memory to file */
2658 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2660 struct pcie_service_card *card = adapter->card;
2661 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2662 unsigned int reg, reg_start, reg_end;
2663 u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
2664 u8 idx, i, read_reg, doneflag = 0;
2665 enum rdwr_status stat;
2669 if (!card->pcie.can_dump_fw)
2672 for (idx = 0; idx < adapter->num_mem_types; idx++) {
2673 struct memory_type_mapping *entry =
2674 &adapter->mem_type_mapping_tbl[idx];
2676 if (entry->mem_ptr) {
2677 vfree(entry->mem_ptr);
2678 entry->mem_ptr = NULL;
2680 entry->mem_size = 0;
2683 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
2685 /* Read the number of the memories which will dump */
2686 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2687 if (stat == RDWR_STATUS_FAILURE)
2690 reg = creg->fw_dump_start;
2691 mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
2693 /* W8997 chipset firmware dump will be restore in single region*/
2694 if (fw_dump_num == 0)
2697 dump_num = fw_dump_num;
2699 /* Read the length of every memory which will dump */
2700 for (idx = 0; idx < dump_num; idx++) {
2701 struct memory_type_mapping *entry =
2702 &adapter->mem_type_mapping_tbl[idx];
2704 if (fw_dump_num != 0) {
2705 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2706 if (stat == RDWR_STATUS_FAILURE)
2709 reg = creg->fw_dump_start;
2710 for (i = 0; i < 4; i++) {
2711 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2712 memory_size |= (read_reg << (i * 8));
2716 memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
2719 if (memory_size == 0) {
2720 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2721 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2722 creg->fw_dump_read_done);
2724 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2730 mwifiex_dbg(adapter, DUMP,
2731 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2732 entry->mem_ptr = vmalloc(memory_size + 1);
2733 entry->mem_size = memory_size;
2734 if (!entry->mem_ptr) {
2735 mwifiex_dbg(adapter, ERROR,
2736 "Vmalloc %s failed\n", entry->mem_name);
2739 dbg_ptr = entry->mem_ptr;
2740 end_ptr = dbg_ptr + memory_size;
2742 doneflag = entry->done_flag;
2743 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2747 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2748 if (RDWR_STATUS_FAILURE == stat)
2751 reg_start = creg->fw_dump_start;
2752 reg_end = creg->fw_dump_end;
2753 for (reg = reg_start; reg <= reg_end; reg++) {
2754 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2755 if (dbg_ptr < end_ptr) {
2759 mwifiex_dbg(adapter, ERROR,
2760 "pre-allocated buf not enough\n");
2762 vzalloc(memory_size + MWIFIEX_SIZE_4K);
2765 memcpy(tmp_ptr, entry->mem_ptr, memory_size);
2766 vfree(entry->mem_ptr);
2767 entry->mem_ptr = tmp_ptr;
2769 dbg_ptr = entry->mem_ptr + memory_size;
2770 memory_size += MWIFIEX_SIZE_4K;
2771 end_ptr = entry->mem_ptr + memory_size;
2774 if (stat != RDWR_STATUS_DONE)
2777 mwifiex_dbg(adapter, DUMP,
2778 "%s done: size=0x%tx\n",
2779 entry->mem_name, dbg_ptr - entry->mem_ptr);
2783 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
2786 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2788 adapter->devdump_data = vzalloc(MWIFIEX_FW_DUMP_SIZE);
2789 if (!adapter->devdump_data) {
2790 mwifiex_dbg(adapter, ERROR,
2791 "vzalloc devdump data failure!\n");
2795 mwifiex_drv_info_dump(adapter);
2796 mwifiex_pcie_fw_dump(adapter);
2797 mwifiex_prepare_fw_dump_info(adapter);
2798 mwifiex_upload_device_dump(adapter);
2801 static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter)
2803 struct pcie_service_card *card = adapter->card;
2805 /* We can't afford to wait here; remove() might be waiting on us. If we
2806 * can't grab the device lock, maybe we'll get another chance later.
2808 pci_try_reset_function(card->dev);
2811 static void mwifiex_pcie_work(struct work_struct *work)
2813 struct pcie_service_card *card =
2814 container_of(work, struct pcie_service_card, work);
2816 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2818 mwifiex_pcie_device_dump_work(card->adapter);
2819 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
2821 mwifiex_pcie_card_reset_work(card->adapter);
2824 /* This function dumps FW information */
2825 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2827 struct pcie_service_card *card = adapter->card;
2829 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2831 schedule_work(&card->work);
2834 static void mwifiex_pcie_card_reset(struct mwifiex_adapter *adapter)
2836 struct pcie_service_card *card = adapter->card;
2838 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags))
2839 schedule_work(&card->work);
2842 static int mwifiex_pcie_alloc_buffers(struct mwifiex_adapter *adapter)
2844 struct pcie_service_card *card = adapter->card;
2845 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2848 card->cmdrsp_buf = NULL;
2849 ret = mwifiex_pcie_create_txbd_ring(adapter);
2851 mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n");
2855 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2857 mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n");
2861 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2863 mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n");
2867 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2869 mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n");
2870 goto err_alloc_cmdbuf;
2873 if (reg->sleep_cookie) {
2874 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2876 mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n");
2877 goto err_alloc_cookie;
2880 card->sleep_cookie_vbase = NULL;
2886 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2888 mwifiex_pcie_delete_evtbd_ring(adapter);
2890 mwifiex_pcie_delete_rxbd_ring(adapter);
2892 mwifiex_pcie_delete_txbd_ring(adapter);
2897 static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter)
2899 struct pcie_service_card *card = adapter->card;
2900 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2902 if (reg->sleep_cookie)
2903 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2905 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2906 mwifiex_pcie_delete_evtbd_ring(adapter);
2907 mwifiex_pcie_delete_rxbd_ring(adapter);
2908 mwifiex_pcie_delete_txbd_ring(adapter);
2912 * This function initializes the PCI-E host memory space, WCB rings, etc.
2914 static int mwifiex_init_pcie(struct mwifiex_adapter *adapter)
2916 struct pcie_service_card *card = adapter->card;
2918 struct pci_dev *pdev = card->dev;
2920 pci_set_drvdata(pdev, card);
2922 ret = pci_enable_device(pdev);
2924 goto err_enable_dev;
2926 pci_set_master(pdev);
2928 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2930 pr_err("set_dma_mask(32) failed: %d\n", ret);
2931 goto err_set_dma_mask;
2934 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2936 pr_err("set_consistent_dma_mask(64) failed\n");
2937 goto err_set_dma_mask;
2940 ret = pci_request_region(pdev, 0, DRV_NAME);
2942 pr_err("req_reg(0) error\n");
2943 goto err_req_region0;
2945 card->pci_mmap = pci_iomap(pdev, 0, 0);
2946 if (!card->pci_mmap) {
2947 pr_err("iomap(0) error\n");
2951 ret = pci_request_region(pdev, 2, DRV_NAME);
2953 pr_err("req_reg(2) error\n");
2954 goto err_req_region2;
2956 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2957 if (!card->pci_mmap1) {
2958 pr_err("iomap(2) error\n");
2963 pr_notice("PCI memory map Virt0: %pK PCI memory map Virt2: %pK\n",
2964 card->pci_mmap, card->pci_mmap1);
2966 ret = mwifiex_pcie_alloc_buffers(adapter);
2968 goto err_alloc_buffers;
2973 pci_iounmap(pdev, card->pci_mmap1);
2975 pci_release_region(pdev, 2);
2977 pci_iounmap(pdev, card->pci_mmap);
2979 pci_release_region(pdev, 0);
2982 pci_disable_device(pdev);
2988 * This function cleans up the allocated card buffers.
2990 static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter)
2992 struct pcie_service_card *card = adapter->card;
2993 struct pci_dev *pdev = card->dev;
2994 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2998 cancel_work_sync(&card->work);
3000 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
3001 if (fw_status == FIRMWARE_READY_PCIE) {
3002 mwifiex_dbg(adapter, INFO,
3003 "Clearing driver ready signature\n");
3004 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3005 mwifiex_dbg(adapter, ERROR,
3006 "Failed to write driver not-ready signature\n");
3009 pci_disable_device(pdev);
3011 pci_iounmap(pdev, card->pci_mmap);
3012 pci_iounmap(pdev, card->pci_mmap1);
3013 pci_release_region(pdev, 2);
3014 pci_release_region(pdev, 0);
3016 mwifiex_pcie_free_buffers(adapter);
3019 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
3022 struct pcie_service_card *card = adapter->card;
3023 struct pci_dev *pdev = card->dev;
3025 if (card->pcie.reg->msix_support) {
3026 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3027 card->msix_entries[i].entry = i;
3028 ret = pci_enable_msix_exact(pdev, card->msix_entries,
3029 MWIFIEX_NUM_MSIX_VECTORS);
3031 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) {
3032 card->msix_ctx[i].dev = pdev;
3033 card->msix_ctx[i].msg_id = i;
3035 ret = request_irq(card->msix_entries[i].vector,
3036 mwifiex_pcie_interrupt, 0,
3037 "MWIFIEX_PCIE_MSIX",
3038 &card->msix_ctx[i]);
3044 mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n",
3046 for (j = 0; j < i; j++)
3047 free_irq(card->msix_entries[j].vector,
3048 &card->msix_ctx[i]);
3049 pci_disable_msix(pdev);
3051 mwifiex_dbg(adapter, MSG, "MSIx enabled!");
3052 card->msix_enable = 1;
3058 if (pci_enable_msi(pdev) != 0)
3059 pci_disable_msi(pdev);
3061 card->msi_enable = 1;
3063 mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
3065 card->share_irq_ctx.dev = pdev;
3066 card->share_irq_ctx.msg_id = -1;
3067 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
3068 "MRVL_PCIE", &card->share_irq_ctx);
3070 pr_err("request_irq failed: ret=%d\n", ret);
3078 * This function gets the firmware name for downloading by revision id
3080 * Read revision id register to get revision id
3082 static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter)
3084 int revision_id = 0;
3086 struct pcie_service_card *card = adapter->card;
3088 switch (card->dev->device) {
3089 case PCIE_DEVICE_ID_MARVELL_88W8766P:
3090 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
3092 case PCIE_DEVICE_ID_MARVELL_88W8897:
3093 mwifiex_write_reg(adapter, 0x0c58, 0x80c00000);
3094 mwifiex_read_reg(adapter, 0x0c58, &revision_id);
3095 revision_id &= 0xff00;
3096 switch (revision_id) {
3098 strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME);
3101 strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME);
3104 strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME);
3109 case PCIE_DEVICE_ID_MARVELL_88W8997:
3110 mwifiex_read_reg(adapter, 0x8, &revision_id);
3111 mwifiex_read_reg(adapter, 0x0cd0, &version);
3112 mwifiex_read_reg(adapter, 0x0cd4, &magic);
3113 revision_id &= 0xff;
3116 if (revision_id == PCIE8997_A1 &&
3117 magic == CHIP_MAGIC_VALUE &&
3118 version == CHIP_VER_PCIEUART)
3119 strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4);
3121 strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4);
3129 * This function registers the PCIE device.
3131 * PCIE IRQ is claimed, block size is set and driver data is initialized.
3133 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
3135 struct pcie_service_card *card = adapter->card;
3137 /* save adapter pointer in card */
3138 card->adapter = adapter;
3140 if (mwifiex_pcie_request_irq(adapter))
3143 adapter->tx_buf_size = card->pcie.tx_buf_size;
3144 adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
3145 adapter->num_mem_types = card->pcie.num_mem_types;
3146 adapter->ext_scan = card->pcie.can_ext_scan;
3147 mwifiex_pcie_get_fw_name(adapter);
3153 * This function unregisters the PCIE device.
3155 * The PCIE IRQ is released, the function is disabled and driver
3156 * data is set to null.
3158 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
3160 struct pcie_service_card *card = adapter->card;
3161 struct pci_dev *pdev = card->dev;
3164 if (card->msix_enable) {
3165 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3166 synchronize_irq(card->msix_entries[i].vector);
3168 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3169 free_irq(card->msix_entries[i].vector,
3170 &card->msix_ctx[i]);
3172 card->msix_enable = 0;
3173 pci_disable_msix(pdev);
3175 mwifiex_dbg(adapter, INFO,
3176 "%s(): calling free_irq()\n", __func__);
3177 free_irq(card->dev->irq, &card->share_irq_ctx);
3179 if (card->msi_enable)
3180 pci_disable_msi(pdev);
3182 card->adapter = NULL;
3186 * This function initializes the PCI-E host memory space, WCB rings, etc.,
3187 * similar to mwifiex_init_pcie(), but without resetting PCI-E state.
3189 static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter)
3191 struct pcie_service_card *card = adapter->card;
3192 struct pci_dev *pdev = card->dev;
3194 /* tx_buf_size might be changed to 3584 by firmware during
3195 * data transfer, we should reset it to default size.
3197 adapter->tx_buf_size = card->pcie.tx_buf_size;
3199 mwifiex_pcie_alloc_buffers(adapter);
3201 pci_set_master(pdev);
3204 /* This function cleans up the PCI-E host memory space. */
3205 static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter)
3207 struct pcie_service_card *card = adapter->card;
3208 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3209 struct pci_dev *pdev = card->dev;
3211 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3212 mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n");
3214 pci_clear_master(pdev);
3216 adapter->seq_num = 0;
3218 mwifiex_pcie_free_buffers(adapter);
3221 static struct mwifiex_if_ops pcie_ops = {
3222 .init_if = mwifiex_init_pcie,
3223 .cleanup_if = mwifiex_cleanup_pcie,
3224 .check_fw_status = mwifiex_check_fw_status,
3225 .check_winner_status = mwifiex_check_winner_status,
3226 .prog_fw = mwifiex_prog_fw_w_helper,
3227 .register_dev = mwifiex_register_dev,
3228 .unregister_dev = mwifiex_unregister_dev,
3229 .enable_int = mwifiex_pcie_enable_host_int,
3230 .disable_int = mwifiex_pcie_disable_host_int_noerr,
3231 .process_int_status = mwifiex_process_int_status,
3232 .host_to_card = mwifiex_pcie_host_to_card,
3233 .wakeup = mwifiex_pm_wakeup_card,
3234 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
3237 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
3238 .event_complete = mwifiex_pcie_event_complete,
3239 .update_mp_end_port = NULL,
3240 .cleanup_mpa_buf = NULL,
3241 .init_fw_port = mwifiex_pcie_init_fw_port,
3242 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
3243 .card_reset = mwifiex_pcie_card_reset,
3244 .reg_dump = mwifiex_pcie_reg_dump,
3245 .device_dump = mwifiex_pcie_device_dump,
3246 .down_dev = mwifiex_pcie_down_dev,
3247 .up_dev = mwifiex_pcie_up_dev,
3250 module_pci_driver(mwifiex_pcie);
3252 MODULE_AUTHOR("Marvell International Ltd.");
3253 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
3254 MODULE_VERSION(PCIE_VERSION);
3255 MODULE_LICENSE("GPL v2");