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 mwifiex_pcie_card_reg mwifiex_reg_8766 = {
37 .cmd_addr_lo = PCIE_SCRATCH_0_REG,
38 .cmd_addr_hi = PCIE_SCRATCH_1_REG,
39 .cmd_size = PCIE_SCRATCH_2_REG,
40 .fw_status = PCIE_SCRATCH_3_REG,
41 .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
42 .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
43 .tx_rdptr = PCIE_SCRATCH_6_REG,
44 .tx_wrptr = PCIE_SCRATCH_7_REG,
45 .rx_rdptr = PCIE_SCRATCH_8_REG,
46 .rx_wrptr = PCIE_SCRATCH_9_REG,
47 .evt_rdptr = PCIE_SCRATCH_10_REG,
48 .evt_wrptr = PCIE_SCRATCH_11_REG,
49 .drv_rdy = PCIE_SCRATCH_12_REG,
51 .tx_mask = MWIFIEX_TXBD_MASK,
53 .rx_mask = MWIFIEX_RXBD_MASK,
55 .tx_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
56 .rx_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
57 .evt_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
60 .ring_flag_xs_sop = 0,
61 .ring_flag_xs_eop = 0,
62 .ring_tx_start_ptr = 0,
68 static const struct mwifiex_pcie_card_reg mwifiex_reg_8897 = {
69 .cmd_addr_lo = PCIE_SCRATCH_0_REG,
70 .cmd_addr_hi = PCIE_SCRATCH_1_REG,
71 .cmd_size = PCIE_SCRATCH_2_REG,
72 .fw_status = PCIE_SCRATCH_3_REG,
73 .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
74 .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
75 .tx_rdptr = PCIE_RD_DATA_PTR_Q0_Q1,
76 .tx_wrptr = PCIE_WR_DATA_PTR_Q0_Q1,
77 .rx_rdptr = PCIE_WR_DATA_PTR_Q0_Q1,
78 .rx_wrptr = PCIE_RD_DATA_PTR_Q0_Q1,
79 .evt_rdptr = PCIE_SCRATCH_10_REG,
80 .evt_wrptr = PCIE_SCRATCH_11_REG,
81 .drv_rdy = PCIE_SCRATCH_12_REG,
83 .tx_mask = 0x03FF0000,
84 .tx_wrap_mask = 0x07FF0000,
85 .rx_mask = 0x000003FF,
86 .rx_wrap_mask = 0x000007FF,
87 .tx_rollover_ind = MWIFIEX_BD_FLAG_TX_ROLLOVER_IND,
88 .rx_rollover_ind = MWIFIEX_BD_FLAG_RX_ROLLOVER_IND,
89 .evt_rollover_ind = MWIFIEX_BD_FLAG_EVT_ROLLOVER_IND,
90 .ring_flag_sop = MWIFIEX_BD_FLAG_SOP,
91 .ring_flag_eop = MWIFIEX_BD_FLAG_EOP,
92 .ring_flag_xs_sop = MWIFIEX_BD_FLAG_XS_SOP,
93 .ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP,
94 .ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR,
97 .fw_dump_ctrl = PCIE_SCRATCH_13_REG,
98 .fw_dump_start = PCIE_SCRATCH_14_REG,
100 .fw_dump_host_ready = 0xee,
101 .fw_dump_read_done = 0xfe,
105 static const struct mwifiex_pcie_card_reg mwifiex_reg_8997 = {
106 .cmd_addr_lo = PCIE_SCRATCH_0_REG,
107 .cmd_addr_hi = PCIE_SCRATCH_1_REG,
108 .cmd_size = PCIE_SCRATCH_2_REG,
109 .fw_status = PCIE_SCRATCH_3_REG,
110 .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
111 .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
116 .evt_rdptr = PCIE_SCRATCH_10_REG,
117 .evt_wrptr = PCIE_SCRATCH_11_REG,
118 .drv_rdy = PCIE_SCRATCH_12_REG,
120 .tx_mask = 0x0FFF0000,
121 .tx_wrap_mask = 0x1FFF0000,
122 .rx_mask = 0x00000FFF,
123 .rx_wrap_mask = 0x00001FFF,
124 .tx_rollover_ind = BIT(28),
125 .rx_rollover_ind = BIT(12),
126 .evt_rollover_ind = MWIFIEX_BD_FLAG_EVT_ROLLOVER_IND,
127 .ring_flag_sop = MWIFIEX_BD_FLAG_SOP,
128 .ring_flag_eop = MWIFIEX_BD_FLAG_EOP,
129 .ring_flag_xs_sop = MWIFIEX_BD_FLAG_XS_SOP,
130 .ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP,
131 .ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR,
134 .fw_dump_ctrl = PCIE_SCRATCH_13_REG,
135 .fw_dump_start = PCIE_SCRATCH_14_REG,
136 .fw_dump_end = 0xcff,
137 .fw_dump_host_ready = 0xcc,
138 .fw_dump_read_done = 0xdd,
142 static struct memory_type_mapping mem_type_mapping_tbl_w8897[] = {
143 {"ITCM", NULL, 0, 0xF0},
144 {"DTCM", NULL, 0, 0xF1},
145 {"SQRAM", NULL, 0, 0xF2},
146 {"IRAM", NULL, 0, 0xF3},
147 {"APU", NULL, 0, 0xF4},
148 {"CIU", NULL, 0, 0xF5},
149 {"ICU", NULL, 0, 0xF6},
150 {"MAC", NULL, 0, 0xF7},
153 static struct memory_type_mapping mem_type_mapping_tbl_w8997[] = {
154 {"DUMP", NULL, 0, 0xDD},
157 static const struct mwifiex_pcie_device mwifiex_pcie8766 = {
158 .reg = &mwifiex_reg_8766,
159 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
160 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
161 .can_dump_fw = false,
162 .can_ext_scan = true,
165 static const struct mwifiex_pcie_device mwifiex_pcie8897 = {
166 .reg = &mwifiex_reg_8897,
167 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
168 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
170 .mem_type_mapping_tbl = mem_type_mapping_tbl_w8897,
171 .num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8897),
172 .can_ext_scan = true,
175 static const struct mwifiex_pcie_device mwifiex_pcie8997 = {
176 .reg = &mwifiex_reg_8997,
177 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
178 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
180 .mem_type_mapping_tbl = mem_type_mapping_tbl_w8997,
181 .num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8997),
182 .can_ext_scan = true,
185 static const struct of_device_id mwifiex_pcie_of_match_table[] = {
186 { .compatible = "pci11ab,2b42" },
187 { .compatible = "pci1b4b,2b42" },
191 static int mwifiex_pcie_probe_of(struct device *dev)
193 if (!of_match_node(mwifiex_pcie_of_match_table, dev->of_node)) {
194 dev_err(dev, "required compatible string missing\n");
201 static void mwifiex_pcie_work(struct work_struct *work);
204 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
205 size_t size, int flags)
207 struct pcie_service_card *card = adapter->card;
208 struct mwifiex_dma_mapping mapping;
210 mapping.addr = dma_map_single(&card->dev->dev, skb->data, size, flags);
211 if (dma_mapping_error(&card->dev->dev, mapping.addr)) {
212 mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n");
216 mwifiex_store_mapping(skb, &mapping);
220 static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter,
221 struct sk_buff *skb, int flags)
223 struct pcie_service_card *card = adapter->card;
224 struct mwifiex_dma_mapping mapping;
226 mwifiex_get_mapping(skb, &mapping);
227 dma_unmap_single(&card->dev->dev, mapping.addr, mapping.len, flags);
231 * This function writes data into PCIE card register.
233 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
235 struct pcie_service_card *card = adapter->card;
237 iowrite32(data, card->pci_mmap1 + reg);
242 /* This function reads data from PCIE card register.
244 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
246 struct pcie_service_card *card = adapter->card;
248 *data = ioread32(card->pci_mmap1 + reg);
249 if (*data == 0xffffffff)
255 /* This function reads u8 data from PCIE card register. */
256 static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter,
259 struct pcie_service_card *card = adapter->card;
261 *data = ioread8(card->pci_mmap1 + reg);
267 * This function reads sleep cookie and checks if FW is ready
269 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
272 struct pcie_service_card *card = adapter->card;
273 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
275 if (!reg->sleep_cookie)
278 if (card->sleep_cookie_vbase) {
279 cookie_value = get_unaligned_le32(card->sleep_cookie_vbase);
280 mwifiex_dbg(adapter, INFO,
281 "info: ACCESS_HW: sleep cookie=0x%x\n",
283 if (cookie_value == FW_AWAKE_COOKIE)
290 #ifdef CONFIG_PM_SLEEP
292 * Kernel needs to suspend all functions separately. Therefore all
293 * registered functions must have drivers with suspend and resume
294 * methods. Failing that the kernel simply removes the whole card.
296 * If already not suspended, this function allocates and sends a host
297 * sleep activate request to the firmware and turns off the traffic.
299 static int mwifiex_pcie_suspend(struct device *dev)
301 struct mwifiex_adapter *adapter;
302 struct pcie_service_card *card = dev_get_drvdata(dev);
305 /* Might still be loading firmware */
306 wait_for_completion(&card->fw_done);
308 adapter = card->adapter;
310 dev_err(dev, "adapter is not valid\n");
314 mwifiex_enable_wake(adapter);
316 /* Enable the Host Sleep */
317 if (!mwifiex_enable_hs(adapter)) {
318 mwifiex_dbg(adapter, ERROR,
319 "cmd: failed to suspend\n");
320 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
321 mwifiex_disable_wake(adapter);
325 flush_workqueue(adapter->workqueue);
327 /* Indicate device suspended */
328 set_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
329 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
335 * Kernel needs to suspend all functions separately. Therefore all
336 * registered functions must have drivers with suspend and resume
337 * methods. Failing that the kernel simply removes the whole card.
339 * If already not resumed, this function turns on the traffic and
340 * sends a host sleep cancel request to the firmware.
342 static int mwifiex_pcie_resume(struct device *dev)
344 struct mwifiex_adapter *adapter;
345 struct pcie_service_card *card = dev_get_drvdata(dev);
348 if (!card->adapter) {
349 dev_err(dev, "adapter structure is not valid\n");
353 adapter = card->adapter;
355 if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) {
356 mwifiex_dbg(adapter, WARN,
357 "Device already resumed\n");
361 clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
363 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
365 mwifiex_disable_wake(adapter);
372 * This function probes an mwifiex device and registers it. It allocates
373 * the card structure, enables PCIE function number and initiates the
374 * device registration and initialization procedure by adding a logical
377 static int mwifiex_pcie_probe(struct pci_dev *pdev,
378 const struct pci_device_id *ent)
380 struct pcie_service_card *card;
383 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
384 pdev->vendor, pdev->device, pdev->revision);
386 card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
390 init_completion(&card->fw_done);
394 if (ent->driver_data) {
395 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
396 card->pcie.reg = data->reg;
397 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
398 card->pcie.tx_buf_size = data->tx_buf_size;
399 card->pcie.can_dump_fw = data->can_dump_fw;
400 card->pcie.mem_type_mapping_tbl = data->mem_type_mapping_tbl;
401 card->pcie.num_mem_types = data->num_mem_types;
402 card->pcie.can_ext_scan = data->can_ext_scan;
403 INIT_WORK(&card->work, mwifiex_pcie_work);
406 /* device tree node parsing and platform specific configuration*/
407 if (pdev->dev.of_node) {
408 ret = mwifiex_pcie_probe_of(&pdev->dev);
413 if (mwifiex_add_card(card, &card->fw_done, &pcie_ops,
414 MWIFIEX_PCIE, &pdev->dev)) {
415 pr_err("%s failed\n", __func__);
423 * This function removes the interface and frees up the card structure.
425 static void mwifiex_pcie_remove(struct pci_dev *pdev)
427 struct pcie_service_card *card;
428 struct mwifiex_adapter *adapter;
429 struct mwifiex_private *priv;
430 const struct mwifiex_pcie_card_reg *reg;
433 card = pci_get_drvdata(pdev);
435 wait_for_completion(&card->fw_done);
437 adapter = card->adapter;
438 if (!adapter || !adapter->priv_num)
441 reg = card->pcie.reg;
443 mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
447 if (fw_status == FIRMWARE_READY_PCIE && !adapter->mfg_mode) {
448 mwifiex_deauthenticate_all(adapter);
450 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
452 mwifiex_disable_auto_ds(priv);
454 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
457 mwifiex_remove_card(adapter);
460 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
462 mwifiex_pcie_remove(pdev);
467 static void mwifiex_pcie_coredump(struct device *dev)
469 struct pci_dev *pdev;
470 struct pcie_service_card *card;
472 pdev = container_of(dev, struct pci_dev, dev);
473 card = pci_get_drvdata(pdev);
475 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
477 schedule_work(&card->work);
480 static const struct pci_device_id mwifiex_ids[] = {
482 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
483 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
484 .driver_data = (unsigned long)&mwifiex_pcie8766,
487 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
488 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
489 .driver_data = (unsigned long)&mwifiex_pcie8897,
492 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
493 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
494 .driver_data = (unsigned long)&mwifiex_pcie8997,
497 PCIE_VENDOR_ID_V2_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
498 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
499 .driver_data = (unsigned long)&mwifiex_pcie8997,
504 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
507 * Cleanup all software without cleaning anything related to PCIe and HW.
509 static void mwifiex_pcie_reset_prepare(struct pci_dev *pdev)
511 struct pcie_service_card *card = pci_get_drvdata(pdev);
512 struct mwifiex_adapter *adapter = card->adapter;
515 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
520 mwifiex_dbg(adapter, INFO,
521 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Pre-FLR\n",
522 __func__, pdev->vendor, pdev->device, pdev->revision);
524 mwifiex_shutdown_sw(adapter);
525 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
526 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
527 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
529 card->pci_reset_ongoing = true;
533 * Kernel stores and restores PCIe function context before and after performing
534 * FLR respectively. Reconfigure the software and firmware including firmware
537 static void mwifiex_pcie_reset_done(struct pci_dev *pdev)
539 struct pcie_service_card *card = pci_get_drvdata(pdev);
540 struct mwifiex_adapter *adapter = card->adapter;
544 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
549 mwifiex_dbg(adapter, INFO,
550 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Post-FLR\n",
551 __func__, pdev->vendor, pdev->device, pdev->revision);
553 ret = mwifiex_reinit_sw(adapter);
555 dev_err(&pdev->dev, "reinit failed: %d\n", ret);
557 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
559 card->pci_reset_ongoing = false;
562 static const struct pci_error_handlers mwifiex_pcie_err_handler = {
563 .reset_prepare = mwifiex_pcie_reset_prepare,
564 .reset_done = mwifiex_pcie_reset_done,
567 #ifdef CONFIG_PM_SLEEP
568 /* Power Management Hooks */
569 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
570 mwifiex_pcie_resume);
573 /* PCI Device Driver */
574 static struct pci_driver mwifiex_pcie = {
575 .name = "mwifiex_pcie",
576 .id_table = mwifiex_ids,
577 .probe = mwifiex_pcie_probe,
578 .remove = mwifiex_pcie_remove,
580 .coredump = mwifiex_pcie_coredump,
581 #ifdef CONFIG_PM_SLEEP
582 .pm = &mwifiex_pcie_pm_ops,
585 .shutdown = mwifiex_pcie_shutdown,
586 .err_handler = &mwifiex_pcie_err_handler,
590 * This function adds delay loop to ensure FW is awake before proceeding.
592 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
596 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
598 usleep_range(10, 20);
607 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
608 u32 max_delay_loop_cnt)
610 struct pcie_service_card *card = adapter->card;
612 u32 sleep_cookie, count;
613 struct sk_buff *cmdrsp = card->cmdrsp_buf;
615 for (count = 0; count < max_delay_loop_cnt; count++) {
616 dma_sync_single_for_cpu(&card->dev->dev,
617 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
618 sizeof(sleep_cookie), DMA_FROM_DEVICE);
619 buffer = cmdrsp->data;
620 sleep_cookie = get_unaligned_le32(buffer);
622 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
623 mwifiex_dbg(adapter, INFO,
624 "sleep cookie found at count %d\n", count);
627 dma_sync_single_for_device(&card->dev->dev,
628 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
629 sizeof(sleep_cookie),
631 usleep_range(20, 30);
634 if (count >= max_delay_loop_cnt)
635 mwifiex_dbg(adapter, INFO,
636 "max count reached while accessing sleep cookie\n");
639 /* This function wakes up the card by reading fw_status register. */
640 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
642 struct pcie_service_card *card = adapter->card;
643 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
645 mwifiex_dbg(adapter, EVENT,
646 "event: Wakeup device...\n");
648 if (reg->sleep_cookie)
649 mwifiex_pcie_dev_wakeup_delay(adapter);
651 /* Accessing fw_status register will wakeup device */
652 if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
653 mwifiex_dbg(adapter, ERROR,
654 "Writing fw_status register failed\n");
658 if (reg->sleep_cookie) {
659 mwifiex_pcie_dev_wakeup_delay(adapter);
660 mwifiex_dbg(adapter, INFO,
661 "PCIE wakeup: Setting PS_STATE_AWAKE\n");
662 adapter->ps_state = PS_STATE_AWAKE;
669 * This function is called after the card has woken up.
671 * The card configuration register is reset.
673 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
675 mwifiex_dbg(adapter, CMD,
676 "cmd: Wakeup device completed\n");
682 * This function disables the host interrupt.
684 * The host interrupt mask is read, the disable bit is reset and
685 * written back to the card host interrupt mask register.
687 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
689 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
690 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
692 mwifiex_dbg(adapter, ERROR,
693 "Disable host interrupt failed\n");
698 atomic_set(&adapter->tx_hw_pending, 0);
702 static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter)
704 WARN_ON(mwifiex_pcie_disable_host_int(adapter));
708 * This function enables the host interrupt.
710 * The host interrupt enable mask is written to the card
711 * host interrupt mask register.
713 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
715 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
716 /* Simply write the mask to the register */
717 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
719 mwifiex_dbg(adapter, ERROR,
720 "Enable host interrupt failed\n");
729 * This function initializes TX buffer ring descriptors
731 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
733 struct pcie_service_card *card = adapter->card;
734 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
735 struct mwifiex_pcie_buf_desc *desc;
736 struct mwifiex_pfu_buf_desc *desc2;
739 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
740 card->tx_buf_list[i] = NULL;
741 if (reg->pfu_enabled) {
742 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
743 (sizeof(*desc2) * i);
744 desc2 = card->txbd_ring[i];
745 memset(desc2, 0, sizeof(*desc2));
747 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
749 desc = card->txbd_ring[i];
750 memset(desc, 0, sizeof(*desc));
757 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
758 * here and after mapping PCI memory, its physical address is assigned to
759 * PCIE Rx buffer descriptor's physical address.
761 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
763 struct pcie_service_card *card = adapter->card;
764 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
766 struct mwifiex_pcie_buf_desc *desc;
767 struct mwifiex_pfu_buf_desc *desc2;
771 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
772 /* Allocate skb here so that firmware can DMA data from it */
773 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
776 mwifiex_dbg(adapter, ERROR,
777 "Unable to allocate skb for RX ring.\n");
778 kfree(card->rxbd_ring_vbase);
782 if (mwifiex_map_pci_memory(adapter, skb,
783 MWIFIEX_RX_DATA_BUF_SIZE,
787 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
789 mwifiex_dbg(adapter, INFO,
790 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
791 skb, skb->len, skb->data, (u32)buf_pa,
792 (u32)((u64)buf_pa >> 32));
794 card->rx_buf_list[i] = skb;
795 if (reg->pfu_enabled) {
796 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
797 (sizeof(*desc2) * i);
798 desc2 = card->rxbd_ring[i];
799 desc2->paddr = buf_pa;
800 desc2->len = (u16)skb->len;
801 desc2->frag_len = (u16)skb->len;
802 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
805 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
806 (sizeof(*desc) * i));
807 desc = card->rxbd_ring[i];
808 desc->paddr = buf_pa;
809 desc->len = (u16)skb->len;
817 /* This function initializes event buffer ring descriptors. Each SKB is
818 * allocated here and after mapping PCI memory, its physical address is assigned
819 * to PCIE Rx buffer descriptor's physical address
821 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
823 struct pcie_service_card *card = adapter->card;
824 struct mwifiex_evt_buf_desc *desc;
829 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
830 /* Allocate skb here so that firmware can DMA data from it */
831 skb = dev_alloc_skb(MAX_EVENT_SIZE);
833 mwifiex_dbg(adapter, ERROR,
834 "Unable to allocate skb for EVENT buf.\n");
835 kfree(card->evtbd_ring_vbase);
838 skb_put(skb, MAX_EVENT_SIZE);
840 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
843 kfree(card->evtbd_ring_vbase);
847 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
849 mwifiex_dbg(adapter, EVENT,
850 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
851 skb, skb->len, skb->data, (u32)buf_pa,
852 (u32)((u64)buf_pa >> 32));
854 card->evt_buf_list[i] = skb;
855 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
856 (sizeof(*desc) * i));
857 desc = card->evtbd_ring[i];
858 desc->paddr = buf_pa;
859 desc->len = (u16)skb->len;
866 /* This function cleans up TX buffer rings. If any of the buffer list has valid
867 * SKB address, associated SKB is freed.
869 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
871 struct pcie_service_card *card = adapter->card;
872 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
874 struct mwifiex_pcie_buf_desc *desc;
875 struct mwifiex_pfu_buf_desc *desc2;
878 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
879 if (reg->pfu_enabled) {
880 desc2 = card->txbd_ring[i];
881 if (card->tx_buf_list[i]) {
882 skb = card->tx_buf_list[i];
883 mwifiex_unmap_pci_memory(adapter, skb,
885 dev_kfree_skb_any(skb);
887 memset(desc2, 0, sizeof(*desc2));
889 desc = card->txbd_ring[i];
890 if (card->tx_buf_list[i]) {
891 skb = card->tx_buf_list[i];
892 mwifiex_unmap_pci_memory(adapter, skb,
894 dev_kfree_skb_any(skb);
896 memset(desc, 0, sizeof(*desc));
898 card->tx_buf_list[i] = NULL;
901 atomic_set(&adapter->tx_hw_pending, 0);
905 /* This function cleans up RX buffer rings. If any of the buffer list has valid
906 * SKB address, associated SKB is freed.
908 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
910 struct pcie_service_card *card = adapter->card;
911 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
912 struct mwifiex_pcie_buf_desc *desc;
913 struct mwifiex_pfu_buf_desc *desc2;
917 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
918 if (reg->pfu_enabled) {
919 desc2 = card->rxbd_ring[i];
920 if (card->rx_buf_list[i]) {
921 skb = card->rx_buf_list[i];
922 mwifiex_unmap_pci_memory(adapter, skb,
924 dev_kfree_skb_any(skb);
926 memset(desc2, 0, sizeof(*desc2));
928 desc = card->rxbd_ring[i];
929 if (card->rx_buf_list[i]) {
930 skb = card->rx_buf_list[i];
931 mwifiex_unmap_pci_memory(adapter, skb,
933 dev_kfree_skb_any(skb);
935 memset(desc, 0, sizeof(*desc));
937 card->rx_buf_list[i] = NULL;
943 /* This function cleans up event buffer rings. If any of the buffer list has
944 * valid SKB address, associated SKB is freed.
946 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
948 struct pcie_service_card *card = adapter->card;
949 struct mwifiex_evt_buf_desc *desc;
953 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
954 desc = card->evtbd_ring[i];
955 if (card->evt_buf_list[i]) {
956 skb = card->evt_buf_list[i];
957 mwifiex_unmap_pci_memory(adapter, skb,
959 dev_kfree_skb_any(skb);
961 card->evt_buf_list[i] = NULL;
962 memset(desc, 0, sizeof(*desc));
968 /* This function creates buffer descriptor ring for TX
970 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
972 struct pcie_service_card *card = adapter->card;
973 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
976 * driver maintaines the write pointer and firmware maintaines the read
977 * pointer. The write pointer starts at 0 (zero) while the read pointer
978 * starts at zero with rollover bit set
980 card->txbd_wrptr = 0;
982 if (reg->pfu_enabled)
983 card->txbd_rdptr = 0;
985 card->txbd_rdptr |= reg->tx_rollover_ind;
987 /* allocate shared memory for the BD ring and divide the same in to
988 several descriptors */
989 if (reg->pfu_enabled)
990 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
993 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
996 mwifiex_dbg(adapter, INFO,
997 "info: txbd_ring: Allocating %d bytes\n",
998 card->txbd_ring_size);
999 card->txbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
1000 card->txbd_ring_size,
1001 &card->txbd_ring_pbase,
1003 if (!card->txbd_ring_vbase) {
1004 mwifiex_dbg(adapter, ERROR,
1005 "allocate coherent memory (%d bytes) failed!\n",
1006 card->txbd_ring_size);
1010 mwifiex_dbg(adapter, DATA,
1011 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
1012 card->txbd_ring_vbase, (u32)card->txbd_ring_pbase,
1013 (u32)((u64)card->txbd_ring_pbase >> 32),
1014 card->txbd_ring_size);
1016 return mwifiex_init_txq_ring(adapter);
1019 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
1021 struct pcie_service_card *card = adapter->card;
1022 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1024 mwifiex_cleanup_txq_ring(adapter);
1026 if (card->txbd_ring_vbase)
1027 dma_free_coherent(&card->dev->dev, card->txbd_ring_size,
1028 card->txbd_ring_vbase,
1029 card->txbd_ring_pbase);
1030 card->txbd_ring_size = 0;
1031 card->txbd_wrptr = 0;
1032 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
1033 card->txbd_ring_vbase = NULL;
1034 card->txbd_ring_pbase = 0;
1040 * This function creates buffer descriptor ring for RX
1042 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
1044 struct pcie_service_card *card = adapter->card;
1045 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1048 * driver maintaines the read pointer and firmware maintaines the write
1049 * pointer. The write pointer starts at 0 (zero) while the read pointer
1050 * starts at zero with rollover bit set
1052 card->rxbd_wrptr = 0;
1053 card->rxbd_rdptr = reg->rx_rollover_ind;
1055 if (reg->pfu_enabled)
1056 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
1057 MWIFIEX_MAX_TXRX_BD;
1059 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
1060 MWIFIEX_MAX_TXRX_BD;
1062 mwifiex_dbg(adapter, INFO,
1063 "info: rxbd_ring: Allocating %d bytes\n",
1064 card->rxbd_ring_size);
1065 card->rxbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
1066 card->rxbd_ring_size,
1067 &card->rxbd_ring_pbase,
1069 if (!card->rxbd_ring_vbase) {
1070 mwifiex_dbg(adapter, ERROR,
1071 "allocate coherent memory (%d bytes) failed!\n",
1072 card->rxbd_ring_size);
1076 mwifiex_dbg(adapter, DATA,
1077 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
1078 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
1079 (u32)((u64)card->rxbd_ring_pbase >> 32),
1080 card->rxbd_ring_size);
1082 return mwifiex_init_rxq_ring(adapter);
1086 * This function deletes Buffer descriptor ring for RX
1088 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
1090 struct pcie_service_card *card = adapter->card;
1091 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1093 mwifiex_cleanup_rxq_ring(adapter);
1095 if (card->rxbd_ring_vbase)
1096 dma_free_coherent(&card->dev->dev, card->rxbd_ring_size,
1097 card->rxbd_ring_vbase,
1098 card->rxbd_ring_pbase);
1099 card->rxbd_ring_size = 0;
1100 card->rxbd_wrptr = 0;
1101 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
1102 card->rxbd_ring_vbase = NULL;
1103 card->rxbd_ring_pbase = 0;
1109 * This function creates buffer descriptor ring for Events
1111 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
1113 struct pcie_service_card *card = adapter->card;
1114 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1117 * driver maintaines the read pointer and firmware maintaines the write
1118 * pointer. The write pointer starts at 0 (zero) while the read pointer
1119 * starts at zero with rollover bit set
1121 card->evtbd_wrptr = 0;
1122 card->evtbd_rdptr = reg->evt_rollover_ind;
1124 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
1127 mwifiex_dbg(adapter, INFO,
1128 "info: evtbd_ring: Allocating %d bytes\n",
1129 card->evtbd_ring_size);
1130 card->evtbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
1131 card->evtbd_ring_size,
1132 &card->evtbd_ring_pbase,
1134 if (!card->evtbd_ring_vbase) {
1135 mwifiex_dbg(adapter, ERROR,
1136 "allocate coherent memory (%d bytes) failed!\n",
1137 card->evtbd_ring_size);
1141 mwifiex_dbg(adapter, EVENT,
1142 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
1143 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
1144 (u32)((u64)card->evtbd_ring_pbase >> 32),
1145 card->evtbd_ring_size);
1147 return mwifiex_pcie_init_evt_ring(adapter);
1151 * This function deletes Buffer descriptor ring for Events
1153 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
1155 struct pcie_service_card *card = adapter->card;
1156 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1158 mwifiex_cleanup_evt_ring(adapter);
1160 if (card->evtbd_ring_vbase)
1161 dma_free_coherent(&card->dev->dev, card->evtbd_ring_size,
1162 card->evtbd_ring_vbase,
1163 card->evtbd_ring_pbase);
1164 card->evtbd_wrptr = 0;
1165 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
1166 card->evtbd_ring_size = 0;
1167 card->evtbd_ring_vbase = NULL;
1168 card->evtbd_ring_pbase = 0;
1174 * This function allocates a buffer for CMDRSP
1176 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
1178 struct pcie_service_card *card = adapter->card;
1179 struct sk_buff *skb;
1181 /* Allocate memory for receiving command response data */
1182 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1184 mwifiex_dbg(adapter, ERROR,
1185 "Unable to allocate skb for command response data.\n");
1188 skb_put(skb, MWIFIEX_UPLD_SIZE);
1189 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1195 card->cmdrsp_buf = skb;
1201 * This function deletes a buffer for CMDRSP
1203 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
1205 struct pcie_service_card *card;
1210 card = adapter->card;
1212 if (card && card->cmdrsp_buf) {
1213 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
1215 dev_kfree_skb_any(card->cmdrsp_buf);
1216 card->cmdrsp_buf = NULL;
1219 if (card && card->cmd_buf) {
1220 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1222 dev_kfree_skb_any(card->cmd_buf);
1223 card->cmd_buf = NULL;
1229 * This function allocates a buffer for sleep cookie
1231 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1233 struct pcie_service_card *card = adapter->card;
1236 card->sleep_cookie_vbase = dma_alloc_coherent(&card->dev->dev,
1238 &card->sleep_cookie_pbase,
1240 if (!card->sleep_cookie_vbase) {
1241 mwifiex_dbg(adapter, ERROR,
1242 "dma_alloc_coherent failed!\n");
1245 /* Init val of Sleep Cookie */
1246 tmp = FW_AWAKE_COOKIE;
1247 put_unaligned(tmp, card->sleep_cookie_vbase);
1249 mwifiex_dbg(adapter, INFO,
1250 "alloc_scook: sleep cookie=0x%x\n",
1251 get_unaligned(card->sleep_cookie_vbase));
1257 * This function deletes buffer for sleep cookie
1259 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1261 struct pcie_service_card *card;
1266 card = adapter->card;
1268 if (card && card->sleep_cookie_vbase) {
1269 dma_free_coherent(&card->dev->dev, sizeof(u32),
1270 card->sleep_cookie_vbase,
1271 card->sleep_cookie_pbase);
1272 card->sleep_cookie_vbase = NULL;
1278 /* This function flushes the TX buffer descriptor ring
1279 * This function defined as handler is also called while cleaning TXRX
1280 * during disconnect/ bss stop.
1282 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1284 struct pcie_service_card *card = adapter->card;
1286 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1287 card->txbd_flush = 1;
1288 /* write pointer already set at last send
1289 * send dnld-rdy intr again, wait for completion.
1291 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1292 CPU_INTR_DNLD_RDY)) {
1293 mwifiex_dbg(adapter, ERROR,
1294 "failed to assert dnld-rdy interrupt.\n");
1302 * This function unmaps and frees downloaded data buffer
1304 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1306 struct sk_buff *skb;
1307 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1308 struct mwifiex_pcie_buf_desc *desc;
1309 struct mwifiex_pfu_buf_desc *desc2;
1310 struct pcie_service_card *card = adapter->card;
1311 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1313 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1314 mwifiex_pm_wakeup_card(adapter);
1316 /* Read the TX ring read pointer set by firmware */
1317 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1318 mwifiex_dbg(adapter, ERROR,
1319 "SEND COMP: failed to read reg->tx_rdptr\n");
1323 mwifiex_dbg(adapter, DATA,
1324 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1325 card->txbd_rdptr, rdptr);
1327 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1328 /* free from previous txbd_rdptr to current txbd_rdptr */
1329 while (((card->txbd_rdptr & reg->tx_mask) !=
1330 (rdptr & reg->tx_mask)) ||
1331 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1332 (rdptr & reg->tx_rollover_ind))) {
1333 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1336 skb = card->tx_buf_list[wrdoneidx];
1339 mwifiex_dbg(adapter, DATA,
1340 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1342 mwifiex_unmap_pci_memory(adapter, skb,
1347 if (card->txbd_flush)
1348 mwifiex_write_data_complete(adapter, skb, 0,
1351 mwifiex_write_data_complete(adapter, skb, 0, 0);
1352 atomic_dec(&adapter->tx_hw_pending);
1355 card->tx_buf_list[wrdoneidx] = NULL;
1357 if (reg->pfu_enabled) {
1358 desc2 = card->txbd_ring[wrdoneidx];
1359 memset(desc2, 0, sizeof(*desc2));
1361 desc = card->txbd_ring[wrdoneidx];
1362 memset(desc, 0, sizeof(*desc));
1364 switch (card->dev->device) {
1365 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1368 case PCIE_DEVICE_ID_MARVELL_88W8897:
1369 case PCIE_DEVICE_ID_MARVELL_88W8997:
1370 card->txbd_rdptr += reg->ring_tx_start_ptr;
1375 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1376 card->txbd_rdptr = ((card->txbd_rdptr &
1377 reg->tx_rollover_ind) ^
1378 reg->tx_rollover_ind);
1382 adapter->data_sent = false;
1384 if (card->txbd_flush) {
1385 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1386 card->txbd_flush = 0;
1388 mwifiex_clean_pcie_ring_buf(adapter);
1394 /* This function sends data buffer to device. First 4 bytes of payload
1395 * are filled with payload length and payload type. Then this payload
1396 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1397 * Download ready interrupt to FW is deffered if Tx ring is not full and
1398 * additional payload can be accomodated.
1399 * Caller must ensure tx_param parameter to this function is not NULL.
1402 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1403 struct mwifiex_tx_param *tx_param)
1405 struct pcie_service_card *card = adapter->card;
1406 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1407 u32 wrindx, num_tx_buffs, rx_val;
1410 struct mwifiex_pcie_buf_desc *desc = NULL;
1411 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1413 if (!(skb->data && skb->len)) {
1414 mwifiex_dbg(adapter, ERROR,
1415 "%s(): invalid parameter <%p, %#x>\n",
1416 __func__, skb->data, skb->len);
1420 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1421 mwifiex_pm_wakeup_card(adapter);
1423 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1424 mwifiex_dbg(adapter, DATA,
1425 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1426 card->txbd_rdptr, card->txbd_wrptr);
1427 if (mwifiex_pcie_txbd_not_full(card)) {
1430 adapter->data_sent = true;
1431 payload = skb->data;
1432 put_unaligned_le16((u16)skb->len, payload + 0);
1433 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
1435 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1439 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1440 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1441 card->tx_buf_list[wrindx] = skb;
1442 atomic_inc(&adapter->tx_hw_pending);
1444 if (reg->pfu_enabled) {
1445 desc2 = card->txbd_ring[wrindx];
1446 desc2->paddr = buf_pa;
1447 desc2->len = (u16)skb->len;
1448 desc2->frag_len = (u16)skb->len;
1450 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1451 MWIFIEX_BD_FLAG_LAST_DESC;
1453 desc = card->txbd_ring[wrindx];
1454 desc->paddr = buf_pa;
1455 desc->len = (u16)skb->len;
1456 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1457 MWIFIEX_BD_FLAG_LAST_DESC;
1460 switch (card->dev->device) {
1461 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1464 case PCIE_DEVICE_ID_MARVELL_88W8897:
1465 case PCIE_DEVICE_ID_MARVELL_88W8997:
1466 card->txbd_wrptr += reg->ring_tx_start_ptr;
1470 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1471 card->txbd_wrptr = ((card->txbd_wrptr &
1472 reg->tx_rollover_ind) ^
1473 reg->tx_rollover_ind);
1475 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1476 /* Write the TX ring write pointer in to reg->tx_wrptr */
1477 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1478 card->txbd_wrptr | rx_val)) {
1479 mwifiex_dbg(adapter, ERROR,
1480 "SEND DATA: failed to write reg->tx_wrptr\n");
1484 if ((mwifiex_pcie_txbd_not_full(card)) &&
1485 tx_param->next_pkt_len) {
1486 /* have more packets and TxBD still can hold more */
1487 mwifiex_dbg(adapter, DATA,
1488 "SEND DATA: delay dnld-rdy interrupt.\n");
1489 adapter->data_sent = false;
1491 /* Send the TX ready interrupt */
1492 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1493 CPU_INTR_DNLD_RDY)) {
1494 mwifiex_dbg(adapter, ERROR,
1495 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1500 mwifiex_dbg(adapter, DATA,
1501 "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1502 "%#x> and sent packet to firmware successfully\n",
1503 card->txbd_rdptr, card->txbd_wrptr);
1505 mwifiex_dbg(adapter, DATA,
1506 "info: TX Ring full, can't send packets to fw\n");
1507 adapter->data_sent = true;
1508 /* Send the TX ready interrupt */
1509 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1511 mwifiex_dbg(adapter, ERROR,
1512 "SEND DATA: failed to assert door-bell intr\n");
1516 return -EINPROGRESS;
1518 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1519 card->tx_buf_list[wrindx] = NULL;
1520 atomic_dec(&adapter->tx_hw_pending);
1521 if (reg->pfu_enabled)
1522 memset(desc2, 0, sizeof(*desc2));
1524 memset(desc, 0, sizeof(*desc));
1530 * This function handles received buffer ring and
1531 * dispatches packets to upper
1533 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1535 struct pcie_service_card *card = adapter->card;
1536 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1537 u32 wrptr, rd_index, tx_val;
1540 struct sk_buff *skb_tmp = NULL;
1541 struct mwifiex_pcie_buf_desc *desc;
1542 struct mwifiex_pfu_buf_desc *desc2;
1544 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1545 mwifiex_pm_wakeup_card(adapter);
1547 /* Read the RX ring Write pointer set by firmware */
1548 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1549 mwifiex_dbg(adapter, ERROR,
1550 "RECV DATA: failed to read reg->rx_wrptr\n");
1554 card->rxbd_wrptr = wrptr;
1556 while (((wrptr & reg->rx_mask) !=
1557 (card->rxbd_rdptr & reg->rx_mask)) ||
1558 ((wrptr & reg->rx_rollover_ind) ==
1559 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1560 struct sk_buff *skb_data;
1563 rd_index = card->rxbd_rdptr & reg->rx_mask;
1564 skb_data = card->rx_buf_list[rd_index];
1566 /* If skb allocation was failed earlier for Rx packet,
1567 * rx_buf_list[rd_index] would have been left with a NULL.
1572 mwifiex_unmap_pci_memory(adapter, skb_data, DMA_FROM_DEVICE);
1573 card->rx_buf_list[rd_index] = NULL;
1575 /* Get data length from interface header -
1576 * first 2 bytes for len, next 2 bytes is for type
1578 rx_len = get_unaligned_le16(skb_data->data);
1579 if (WARN_ON(rx_len <= adapter->intf_hdr_len ||
1580 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1581 mwifiex_dbg(adapter, ERROR,
1582 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1583 rx_len, card->rxbd_rdptr, wrptr);
1584 dev_kfree_skb_any(skb_data);
1586 skb_put(skb_data, rx_len);
1587 mwifiex_dbg(adapter, DATA,
1588 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1589 card->rxbd_rdptr, wrptr, rx_len);
1590 skb_pull(skb_data, adapter->intf_hdr_len);
1591 if (adapter->rx_work_enabled) {
1592 skb_queue_tail(&adapter->rx_data_q, skb_data);
1593 adapter->data_received = true;
1594 atomic_inc(&adapter->rx_pending);
1596 mwifiex_handle_rx_packet(adapter, skb_data);
1600 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1603 mwifiex_dbg(adapter, ERROR,
1604 "Unable to allocate skb.\n");
1608 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1609 MWIFIEX_RX_DATA_BUF_SIZE,
1613 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1615 mwifiex_dbg(adapter, INFO,
1616 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1618 card->rx_buf_list[rd_index] = skb_tmp;
1620 if (reg->pfu_enabled) {
1621 desc2 = card->rxbd_ring[rd_index];
1622 desc2->paddr = buf_pa;
1623 desc2->len = skb_tmp->len;
1624 desc2->frag_len = skb_tmp->len;
1626 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1628 desc = card->rxbd_ring[rd_index];
1629 desc->paddr = buf_pa;
1630 desc->len = skb_tmp->len;
1634 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1635 MWIFIEX_MAX_TXRX_BD) {
1636 card->rxbd_rdptr = ((card->rxbd_rdptr &
1637 reg->rx_rollover_ind) ^
1638 reg->rx_rollover_ind);
1640 mwifiex_dbg(adapter, DATA,
1641 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1642 card->rxbd_rdptr, wrptr);
1644 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1645 /* Write the RX ring read pointer in to reg->rx_rdptr */
1646 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1647 card->rxbd_rdptr | tx_val)) {
1648 mwifiex_dbg(adapter, DATA,
1649 "RECV DATA: failed to write reg->rx_rdptr\n");
1654 /* Read the RX ring Write pointer set by firmware */
1655 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1656 mwifiex_dbg(adapter, ERROR,
1657 "RECV DATA: failed to read reg->rx_wrptr\n");
1661 mwifiex_dbg(adapter, DATA,
1662 "info: RECV DATA: Rcvd packet from fw successfully\n");
1663 card->rxbd_wrptr = wrptr;
1671 * This function downloads the boot command to device
1674 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1677 struct pcie_service_card *card = adapter->card;
1678 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1680 if (!(skb->data && skb->len)) {
1681 mwifiex_dbg(adapter, ERROR,
1682 "Invalid parameter in %s <%p. len %d>\n",
1683 __func__, skb->data, skb->len);
1687 if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE))
1690 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1692 /* Write the lower 32bits of the physical address to low command
1693 * address scratch register
1695 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1696 mwifiex_dbg(adapter, ERROR,
1697 "%s: failed to write download command to boot code.\n",
1699 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1703 /* Write the upper 32bits of the physical address to high command
1704 * address scratch register
1706 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1707 (u32)((u64)buf_pa >> 32))) {
1708 mwifiex_dbg(adapter, ERROR,
1709 "%s: failed to write download command to boot code.\n",
1711 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1715 /* Write the command length to cmd_size scratch register */
1716 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1717 mwifiex_dbg(adapter, ERROR,
1718 "%s: failed to write command len to cmd_size scratch reg\n",
1720 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1724 /* Ring the door bell */
1725 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1726 CPU_INTR_DOOR_BELL)) {
1727 mwifiex_dbg(adapter, ERROR,
1728 "%s: failed to assert door-bell intr\n", __func__);
1729 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
1736 /* This function init rx port in firmware which in turn enables to receive data
1737 * from device before transmitting any packet.
1739 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1741 struct pcie_service_card *card = adapter->card;
1742 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1743 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1745 /* Write the RX ring read pointer in to reg->rx_rdptr */
1746 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1748 mwifiex_dbg(adapter, ERROR,
1749 "RECV DATA: failed to write reg->rx_rdptr\n");
1755 /* This function downloads commands to the device
1758 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1760 struct pcie_service_card *card = adapter->card;
1761 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1763 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1764 u8 *payload = (u8 *)skb->data;
1766 if (!(skb->data && skb->len)) {
1767 mwifiex_dbg(adapter, ERROR,
1768 "Invalid parameter in %s <%p, %#x>\n",
1769 __func__, skb->data, skb->len);
1773 /* Make sure a command response buffer is available */
1774 if (!card->cmdrsp_buf) {
1775 mwifiex_dbg(adapter, ERROR,
1776 "No response buffer available, send command failed\n");
1780 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1781 mwifiex_pm_wakeup_card(adapter);
1783 adapter->cmd_sent = true;
1785 put_unaligned_le16((u16)skb->len, &payload[0]);
1786 put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
1788 if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE))
1791 card->cmd_buf = skb;
1793 * Need to keep a reference, since core driver might free up this
1794 * buffer before we've unmapped it.
1798 /* To send a command, the driver will:
1799 1. Write the 64bit physical address of the data buffer to
1800 cmd response address low + cmd response address high
1801 2. Ring the door bell (i.e. set the door bell interrupt)
1803 In response to door bell interrupt, the firmware will perform
1804 the DMA of the command packet (first header to obtain the total
1805 length and then rest of the command).
1808 if (card->cmdrsp_buf) {
1809 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1810 /* Write the lower 32bits of the cmdrsp buffer physical
1812 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1813 (u32)cmdrsp_buf_pa)) {
1814 mwifiex_dbg(adapter, ERROR,
1815 "Failed to write download cmd to boot code.\n");
1819 /* Write the upper 32bits of the cmdrsp buffer physical
1821 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1822 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1823 mwifiex_dbg(adapter, ERROR,
1824 "Failed to write download cmd to boot code.\n");
1830 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1831 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1832 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1834 mwifiex_dbg(adapter, ERROR,
1835 "Failed to write download cmd to boot code.\n");
1839 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1840 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1841 (u32)((u64)cmd_buf_pa >> 32))) {
1842 mwifiex_dbg(adapter, ERROR,
1843 "Failed to write download cmd to boot code.\n");
1848 /* Write the command length to reg->cmd_size */
1849 if (mwifiex_write_reg(adapter, reg->cmd_size,
1850 card->cmd_buf->len)) {
1851 mwifiex_dbg(adapter, ERROR,
1852 "Failed to write cmd len to reg->cmd_size\n");
1857 /* Ring the door bell */
1858 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1859 CPU_INTR_DOOR_BELL)) {
1860 mwifiex_dbg(adapter, ERROR,
1861 "Failed to assert door-bell intr\n");
1868 adapter->cmd_sent = false;
1874 * This function handles command complete interrupt
1876 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1878 struct pcie_service_card *card = adapter->card;
1879 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1880 struct sk_buff *skb = card->cmdrsp_buf;
1884 mwifiex_dbg(adapter, CMD,
1885 "info: Rx CMD Response\n");
1887 if (adapter->curr_cmd)
1888 mwifiex_unmap_pci_memory(adapter, skb, DMA_FROM_DEVICE);
1890 dma_sync_single_for_cpu(&card->dev->dev,
1891 MWIFIEX_SKB_DMA_ADDR(skb),
1892 MWIFIEX_UPLD_SIZE, DMA_FROM_DEVICE);
1894 /* Unmap the command as a response has been received. */
1895 if (card->cmd_buf) {
1896 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1898 dev_kfree_skb_any(card->cmd_buf);
1899 card->cmd_buf = NULL;
1902 rx_len = get_unaligned_le16(skb->data);
1903 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1904 skb_trim(skb, rx_len);
1906 if (!adapter->curr_cmd) {
1907 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1908 dma_sync_single_for_device(&card->dev->dev,
1909 MWIFIEX_SKB_DMA_ADDR(skb),
1910 MWIFIEX_SLEEP_COOKIE_SIZE,
1912 if (mwifiex_write_reg(adapter,
1914 CPU_INTR_SLEEP_CFM_DONE)) {
1915 mwifiex_dbg(adapter, ERROR,
1916 "Write register failed\n");
1919 mwifiex_delay_for_sleep_cookie(adapter,
1920 MWIFIEX_MAX_DELAY_COUNT);
1921 mwifiex_unmap_pci_memory(adapter, skb,
1923 skb_pull(skb, adapter->intf_hdr_len);
1924 while (reg->sleep_cookie && (count++ < 10) &&
1925 mwifiex_pcie_ok_to_access_hw(adapter))
1926 usleep_range(50, 60);
1927 mwifiex_pcie_enable_host_int(adapter);
1928 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1931 mwifiex_dbg(adapter, ERROR,
1932 "There is no command but got cmdrsp\n");
1934 memcpy(adapter->upld_buf, skb->data,
1935 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1936 skb_push(skb, adapter->intf_hdr_len);
1937 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1940 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1941 skb_pull(skb, adapter->intf_hdr_len);
1942 adapter->curr_cmd->resp_skb = skb;
1943 adapter->cmd_resp_received = true;
1944 /* Take the pointer and set it to CMD node and will
1945 return in the response complete callback */
1946 card->cmdrsp_buf = NULL;
1948 /* Clear the cmd-rsp buffer address in scratch registers. This
1949 will prevent firmware from writing to the same response
1951 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1952 mwifiex_dbg(adapter, ERROR,
1953 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1956 /* Write the upper 32bits of the cmdrsp buffer physical
1958 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1959 mwifiex_dbg(adapter, ERROR,
1960 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1969 * Command Response processing complete handler
1971 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1972 struct sk_buff *skb)
1974 struct pcie_service_card *card = adapter->card;
1977 card->cmdrsp_buf = skb;
1978 skb_push(card->cmdrsp_buf, adapter->intf_hdr_len);
1979 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1988 * This function handles firmware event ready interrupt
1990 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1992 struct pcie_service_card *card = adapter->card;
1993 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1994 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1996 struct mwifiex_evt_buf_desc *desc;
1998 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1999 mwifiex_pm_wakeup_card(adapter);
2001 if (adapter->event_received) {
2002 mwifiex_dbg(adapter, EVENT,
2003 "info: Event being processed,\t"
2004 "do not process this interrupt just yet\n");
2008 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
2009 mwifiex_dbg(adapter, ERROR,
2010 "info: Invalid read pointer...\n");
2014 /* Read the event ring write pointer set by firmware */
2015 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
2016 mwifiex_dbg(adapter, ERROR,
2017 "EventReady: failed to read reg->evt_wrptr\n");
2021 mwifiex_dbg(adapter, EVENT,
2022 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
2023 card->evtbd_rdptr, wrptr);
2024 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
2025 & MWIFIEX_EVTBD_MASK)) ||
2026 ((wrptr & reg->evt_rollover_ind) ==
2027 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
2028 struct sk_buff *skb_cmd;
2029 __le16 data_len = 0;
2032 mwifiex_dbg(adapter, INFO,
2033 "info: Read Index: %d\n", rdptr);
2034 skb_cmd = card->evt_buf_list[rdptr];
2035 mwifiex_unmap_pci_memory(adapter, skb_cmd, DMA_FROM_DEVICE);
2037 /* Take the pointer and set it to event pointer in adapter
2038 and will return back after event handling callback */
2039 card->evt_buf_list[rdptr] = NULL;
2040 desc = card->evtbd_ring[rdptr];
2041 memset(desc, 0, sizeof(*desc));
2043 event = get_unaligned_le32(
2044 &skb_cmd->data[adapter->intf_hdr_len]);
2045 adapter->event_cause = event;
2046 /* The first 4bytes will be the event transfer header
2047 len is 2 bytes followed by type which is 2 bytes */
2048 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
2049 evt_len = le16_to_cpu(data_len);
2050 skb_trim(skb_cmd, evt_len);
2051 skb_pull(skb_cmd, adapter->intf_hdr_len);
2052 mwifiex_dbg(adapter, EVENT,
2053 "info: Event length: %d\n", evt_len);
2055 if (evt_len > MWIFIEX_EVENT_HEADER_LEN &&
2056 evt_len < MAX_EVENT_SIZE)
2057 memcpy(adapter->event_body, skb_cmd->data +
2058 MWIFIEX_EVENT_HEADER_LEN, evt_len -
2059 MWIFIEX_EVENT_HEADER_LEN);
2061 adapter->event_received = true;
2062 adapter->event_skb = skb_cmd;
2064 /* Do not update the event read pointer here, wait till the
2065 buffer is released. This is just to make things simpler,
2066 we need to find a better method of managing these buffers.
2069 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
2070 CPU_INTR_EVENT_DONE)) {
2071 mwifiex_dbg(adapter, ERROR,
2072 "Write register failed\n");
2081 * Event processing complete handler
2083 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
2084 struct sk_buff *skb)
2086 struct pcie_service_card *card = adapter->card;
2087 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2089 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
2091 struct mwifiex_evt_buf_desc *desc;
2096 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
2097 mwifiex_dbg(adapter, ERROR,
2098 "event_complete: Invalid rdptr 0x%x\n",
2103 /* Read the event ring write pointer set by firmware */
2104 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
2105 mwifiex_dbg(adapter, ERROR,
2106 "event_complete: failed to read reg->evt_wrptr\n");
2110 if (!card->evt_buf_list[rdptr]) {
2111 skb_push(skb, adapter->intf_hdr_len);
2112 skb_put(skb, MAX_EVENT_SIZE - skb->len);
2113 if (mwifiex_map_pci_memory(adapter, skb,
2117 card->evt_buf_list[rdptr] = skb;
2118 desc = card->evtbd_ring[rdptr];
2119 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
2120 desc->len = (u16)skb->len;
2124 mwifiex_dbg(adapter, ERROR,
2125 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
2126 rdptr, card->evt_buf_list[rdptr], skb);
2129 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
2130 card->evtbd_rdptr = ((card->evtbd_rdptr &
2131 reg->evt_rollover_ind) ^
2132 reg->evt_rollover_ind);
2135 mwifiex_dbg(adapter, EVENT,
2136 "info: Updated <Rd: 0x%x, Wr: 0x%x>",
2137 card->evtbd_rdptr, wrptr);
2139 /* Write the event ring read pointer in to reg->evt_rdptr */
2140 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
2141 card->evtbd_rdptr)) {
2142 mwifiex_dbg(adapter, ERROR,
2143 "event_complete: failed to read reg->evt_rdptr\n");
2147 mwifiex_dbg(adapter, EVENT,
2148 "info: Check Events Again\n");
2149 ret = mwifiex_pcie_process_event_ready(adapter);
2154 /* Combo firmware image is a combination of
2155 * (1) combo crc heaer, start with CMD5
2156 * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1.
2159 * This function bypass the header and bluetooth part, return
2160 * the offset of tail wifi-only part. If the image is already wifi-only,
2161 * that is start with CMD1, return 0.
2164 static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
2165 const void *firmware, u32 firmware_len) {
2166 const struct mwifiex_fw_data *fwdata;
2167 u32 offset = 0, data_len, dnld_cmd;
2169 bool cmd7_before = false, first_cmd = false;
2172 /* Check for integer and buffer overflow */
2173 if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
2174 offset + sizeof(fwdata->header) >= firmware_len) {
2175 mwifiex_dbg(adapter, ERROR,
2176 "extract wifi-only fw failure!\n");
2181 fwdata = firmware + offset;
2182 dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
2183 data_len = le32_to_cpu(fwdata->header.data_length);
2185 /* Skip past header */
2186 offset += sizeof(fwdata->header);
2189 case MWIFIEX_FW_DNLD_CMD_1:
2190 if (offset + data_len < data_len) {
2191 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2196 /* Image start with cmd1, already wifi-only firmware */
2198 mwifiex_dbg(adapter, MSG,
2199 "input wifi-only firmware\n");
2204 mwifiex_dbg(adapter, ERROR,
2205 "no cmd7 before cmd1!\n");
2211 case MWIFIEX_FW_DNLD_CMD_5:
2213 /* Check for integer overflow */
2214 if (offset + data_len < data_len) {
2215 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2221 case MWIFIEX_FW_DNLD_CMD_6:
2223 /* Check for integer overflow */
2224 if (offset + data_len < data_len) {
2225 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2230 if (offset >= firmware_len) {
2231 mwifiex_dbg(adapter, ERROR,
2232 "extract wifi-only fw failure!\n");
2238 case MWIFIEX_FW_DNLD_CMD_7:
2243 mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n",
2255 * This function downloads the firmware to the card.
2257 * Firmware is downloaded to the card in blocks. Every block download
2258 * is tested for CRC errors, and retried a number of times before
2259 * returning failure.
2261 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
2262 struct mwifiex_fw_image *fw)
2265 u8 *firmware = fw->fw_buf;
2266 u32 firmware_len = fw->fw_len;
2268 struct sk_buff *skb;
2269 u32 txlen, tx_blocks = 0, tries, len, val;
2270 u32 block_retry_cnt = 0;
2271 struct pcie_service_card *card = adapter->card;
2272 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2274 if (!firmware || !firmware_len) {
2275 mwifiex_dbg(adapter, ERROR,
2276 "No firmware image found! Terminating download\n");
2280 mwifiex_dbg(adapter, INFO,
2281 "info: Downloading FW image (%d bytes)\n",
2284 if (mwifiex_pcie_disable_host_int(adapter)) {
2285 mwifiex_dbg(adapter, ERROR,
2286 "%s: Disabling interrupts failed.\n", __func__);
2290 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
2296 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val);
2298 mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n");
2302 /* PCIE FLR case: extract wifi part from combo firmware*/
2303 if (val == MWIFIEX_PCIE_FLR_HAPPENS) {
2304 ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len);
2306 mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n");
2310 mwifiex_dbg(adapter, MSG,
2311 "info: dnld wifi firmware from %d bytes\n", offset);
2314 /* Perform firmware data transfer */
2319 if (offset >= firmware_len)
2322 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2323 ret = mwifiex_read_reg(adapter, reg->cmd_size,
2326 mwifiex_dbg(adapter, FATAL,
2327 "Failed reading len from boot code\n");
2332 usleep_range(10, 20);
2337 } else if (len > MWIFIEX_UPLD_SIZE) {
2338 mwifiex_dbg(adapter, ERROR,
2339 "FW download failure @ %d, invalid length %d\n",
2349 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
2350 mwifiex_dbg(adapter, ERROR,
2351 "FW download failure @ %d, over max\t"
2352 "retry count\n", offset);
2356 mwifiex_dbg(adapter, ERROR,
2357 "FW CRC error indicated by the\t"
2358 "helper: len = 0x%04X, txlen = %d\n",
2361 /* Setting this to 0 to resend from same offset */
2364 block_retry_cnt = 0;
2365 /* Set blocksize to transfer - checking for
2367 if (firmware_len - offset < txlen)
2368 txlen = firmware_len - offset;
2370 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
2371 card->pcie.blksz_fw_dl;
2373 /* Copy payload to buffer */
2374 memmove(skb->data, &firmware[offset], txlen);
2377 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
2378 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
2380 /* Send the boot command to device */
2381 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
2382 mwifiex_dbg(adapter, ERROR,
2383 "Failed to send firmware download command\n");
2388 /* Wait for the command done interrupt */
2389 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2390 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
2392 mwifiex_dbg(adapter, ERROR,
2393 "%s: Failed to read\t"
2394 "interrupt status during fw dnld.\n",
2396 mwifiex_unmap_pci_memory(adapter, skb,
2401 if (!(ireg_intr & CPU_INTR_DOOR_BELL))
2403 usleep_range(10, 20);
2405 if (ireg_intr & CPU_INTR_DOOR_BELL) {
2406 mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
2408 mwifiex_unmap_pci_memory(adapter, skb,
2414 mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
2419 mwifiex_dbg(adapter, MSG,
2420 "info: FW download over, size %d bytes\n", offset);
2425 dev_kfree_skb_any(skb);
2430 * This function checks the firmware status in card.
2433 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2437 struct pcie_service_card *card = adapter->card;
2438 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2441 /* Mask spurios interrupts */
2442 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2444 mwifiex_dbg(adapter, ERROR,
2445 "Write register failed\n");
2449 mwifiex_dbg(adapter, INFO,
2450 "Setting driver ready signature\n");
2451 if (mwifiex_write_reg(adapter, reg->drv_rdy,
2452 FIRMWARE_READY_PCIE)) {
2453 mwifiex_dbg(adapter, ERROR,
2454 "Failed to write driver ready signature\n");
2458 /* Wait for firmware initialization event */
2459 for (tries = 0; tries < poll_num; tries++) {
2460 if (mwifiex_read_reg(adapter, reg->fw_status,
2466 mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>",
2467 tries, ret, firmware_stat);
2471 if (firmware_stat == FIRMWARE_READY_PCIE) {
2483 /* This function checks if WLAN is the winner.
2486 mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
2490 struct pcie_service_card *card = adapter->card;
2491 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2493 if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) {
2495 } else if (!winner) {
2496 mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n");
2497 adapter->winner = 1;
2499 mwifiex_dbg(adapter, ERROR,
2500 "PCI-E is not the winner <%#x>", winner);
2507 * This function reads the interrupt status from card.
2509 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
2513 unsigned long flags;
2514 struct pcie_service_card *card = adapter->card;
2516 if (card->msi_enable) {
2517 spin_lock_irqsave(&adapter->int_lock, flags);
2518 adapter->int_status = 1;
2519 spin_unlock_irqrestore(&adapter->int_lock, flags);
2523 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2526 if (card->msix_enable && msg_id >= 0) {
2527 pcie_ireg = BIT(msg_id);
2529 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2531 mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2535 if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg)
2539 mwifiex_pcie_disable_host_int(adapter);
2541 /* Clear the pending interrupts */
2542 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2544 mwifiex_dbg(adapter, ERROR,
2545 "Write register failed\n");
2550 if (!adapter->pps_uapsd_mode &&
2551 adapter->ps_state == PS_STATE_SLEEP &&
2552 mwifiex_pcie_ok_to_access_hw(adapter)) {
2553 /* Potentially for PCIe we could get other
2554 * interrupts like shared. Don't change power
2555 * state until cookie is set
2557 adapter->ps_state = PS_STATE_AWAKE;
2558 adapter->pm_wakeup_fw_try = false;
2559 del_timer(&adapter->wakeup_timer);
2562 spin_lock_irqsave(&adapter->int_lock, flags);
2563 adapter->int_status |= pcie_ireg;
2564 spin_unlock_irqrestore(&adapter->int_lock, flags);
2565 mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
2569 * Interrupt handler for PCIe root port
2571 * This function reads the interrupt status from firmware and assigns
2572 * the main process in workqueue which will handle the interrupt.
2574 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2576 struct mwifiex_msix_context *ctx = context;
2577 struct pci_dev *pdev = ctx->dev;
2578 struct pcie_service_card *card;
2579 struct mwifiex_adapter *adapter;
2581 card = pci_get_drvdata(pdev);
2583 if (!card->adapter) {
2584 pr_err("info: %s: card=%p adapter=%p\n", __func__, card,
2585 card ? card->adapter : NULL);
2588 adapter = card->adapter;
2590 if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags))
2593 if (card->msix_enable)
2594 mwifiex_interrupt_status(adapter, ctx->msg_id);
2596 mwifiex_interrupt_status(adapter, -1);
2598 mwifiex_queue_main_work(adapter);
2605 * This function checks the current interrupt status.
2607 * The following interrupts are checked and handled by this function -
2610 * - Command received
2611 * - Packets received
2614 * In case of Rx packets received, the packets are uploaded from card to
2615 * host and processed accordingly.
2617 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2621 unsigned long flags;
2622 struct pcie_service_card *card = adapter->card;
2624 spin_lock_irqsave(&adapter->int_lock, flags);
2625 if (!card->msi_enable) {
2626 /* Clear out unused interrupts */
2627 pcie_ireg = adapter->int_status;
2629 adapter->int_status = 0;
2630 spin_unlock_irqrestore(&adapter->int_lock, flags);
2632 if (card->msi_enable) {
2633 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2634 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2636 mwifiex_dbg(adapter, ERROR,
2637 "Read register failed\n");
2641 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2642 if (mwifiex_write_reg(adapter,
2643 PCIE_HOST_INT_STATUS,
2645 mwifiex_dbg(adapter, ERROR,
2646 "Write register failed\n");
2649 if (!adapter->pps_uapsd_mode &&
2650 adapter->ps_state == PS_STATE_SLEEP) {
2651 adapter->ps_state = PS_STATE_AWAKE;
2652 adapter->pm_wakeup_fw_try = false;
2653 del_timer(&adapter->wakeup_timer);
2659 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2660 mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n");
2661 ret = mwifiex_pcie_send_data_complete(adapter);
2665 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2666 mwifiex_dbg(adapter, INTR, "info: Rx DATA\n");
2667 ret = mwifiex_pcie_process_recv_data(adapter);
2671 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2672 mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n");
2673 ret = mwifiex_pcie_process_event_ready(adapter);
2677 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2678 if (adapter->cmd_sent) {
2679 mwifiex_dbg(adapter, INTR,
2680 "info: CMD sent Interrupt\n");
2681 adapter->cmd_sent = false;
2683 /* Handle command response */
2684 ret = mwifiex_pcie_process_cmd_complete(adapter);
2689 mwifiex_dbg(adapter, INTR,
2690 "info: cmd_sent=%d data_sent=%d\n",
2691 adapter->cmd_sent, adapter->data_sent);
2692 if (!card->msi_enable && !card->msix_enable &&
2693 adapter->ps_state != PS_STATE_SLEEP)
2694 mwifiex_pcie_enable_host_int(adapter);
2700 * This function downloads data from driver to card.
2702 * Both commands and data packets are transferred to the card by this
2705 * This function adds the PCIE specific header to the front of the buffer
2706 * before transferring. The header contains the length of the packet and
2707 * the type. The firmware handles the packets based upon this set type.
2709 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2710 struct sk_buff *skb,
2711 struct mwifiex_tx_param *tx_param)
2714 mwifiex_dbg(adapter, ERROR,
2715 "Passed NULL skb to %s\n", __func__);
2719 if (type == MWIFIEX_TYPE_DATA)
2720 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2721 else if (type == MWIFIEX_TYPE_CMD)
2722 return mwifiex_pcie_send_cmd(adapter, skb);
2727 /* Function to dump PCIE scratch registers in case of FW crash
2730 mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
2733 char buf[256], *ptr;
2736 struct pcie_service_card *card = adapter->card;
2737 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2738 int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
2739 PCIE_SCRATCH_14_REG,
2740 PCIE_SCRATCH_15_REG};
2745 mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
2747 if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
2748 mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
2753 mwifiex_dbg(adapter, MSG, "pcie scratch register:");
2754 for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
2755 mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
2756 ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
2757 pcie_scratch_reg[i], value);
2760 mwifiex_dbg(adapter, MSG, "%s\n", buf);
2761 p += sprintf(p, "%s\n", buf);
2763 mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
2768 /* This function read/write firmware */
2769 static enum rdwr_status
2770 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2775 struct pcie_service_card *card = adapter->card;
2776 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2778 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
2779 return RDWR_STATUS_FAILURE;
2781 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2782 reg->fw_dump_host_ready);
2784 mwifiex_dbg(adapter, ERROR,
2785 "PCIE write err\n");
2786 return RDWR_STATUS_FAILURE;
2789 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2790 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2791 if (ctrl_data == FW_DUMP_DONE)
2792 return RDWR_STATUS_SUCCESS;
2793 if (doneflag && ctrl_data == doneflag)
2794 return RDWR_STATUS_DONE;
2795 if (ctrl_data != reg->fw_dump_host_ready) {
2796 mwifiex_dbg(adapter, WARN,
2797 "The ctrl reg was changed, re-try again!\n");
2798 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2799 reg->fw_dump_host_ready);
2801 mwifiex_dbg(adapter, ERROR,
2802 "PCIE write err\n");
2803 return RDWR_STATUS_FAILURE;
2806 usleep_range(100, 200);
2809 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2810 return RDWR_STATUS_FAILURE;
2813 /* This function dump firmware memory to file */
2814 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2816 struct pcie_service_card *card = adapter->card;
2817 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2818 unsigned int reg, reg_start, reg_end;
2819 u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
2820 u8 idx, i, read_reg, doneflag = 0;
2821 enum rdwr_status stat;
2825 if (!card->pcie.can_dump_fw)
2828 for (idx = 0; idx < adapter->num_mem_types; idx++) {
2829 struct memory_type_mapping *entry =
2830 &adapter->mem_type_mapping_tbl[idx];
2832 if (entry->mem_ptr) {
2833 vfree(entry->mem_ptr);
2834 entry->mem_ptr = NULL;
2836 entry->mem_size = 0;
2839 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
2841 /* Read the number of the memories which will dump */
2842 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2843 if (stat == RDWR_STATUS_FAILURE)
2846 reg = creg->fw_dump_start;
2847 mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
2849 /* W8997 chipset firmware dump will be restore in single region*/
2850 if (fw_dump_num == 0)
2853 dump_num = fw_dump_num;
2855 /* Read the length of every memory which will dump */
2856 for (idx = 0; idx < dump_num; idx++) {
2857 struct memory_type_mapping *entry =
2858 &adapter->mem_type_mapping_tbl[idx];
2860 if (fw_dump_num != 0) {
2861 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2862 if (stat == RDWR_STATUS_FAILURE)
2865 reg = creg->fw_dump_start;
2866 for (i = 0; i < 4; i++) {
2867 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2868 memory_size |= (read_reg << (i * 8));
2872 memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
2875 if (memory_size == 0) {
2876 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2877 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2878 creg->fw_dump_read_done);
2880 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2886 mwifiex_dbg(adapter, DUMP,
2887 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2888 entry->mem_ptr = vmalloc(memory_size + 1);
2889 entry->mem_size = memory_size;
2890 if (!entry->mem_ptr) {
2891 mwifiex_dbg(adapter, ERROR,
2892 "Vmalloc %s failed\n", entry->mem_name);
2895 dbg_ptr = entry->mem_ptr;
2896 end_ptr = dbg_ptr + memory_size;
2898 doneflag = entry->done_flag;
2899 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2903 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2904 if (RDWR_STATUS_FAILURE == stat)
2907 reg_start = creg->fw_dump_start;
2908 reg_end = creg->fw_dump_end;
2909 for (reg = reg_start; reg <= reg_end; reg++) {
2910 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2911 if (dbg_ptr < end_ptr) {
2915 mwifiex_dbg(adapter, ERROR,
2916 "pre-allocated buf not enough\n");
2918 vzalloc(memory_size + MWIFIEX_SIZE_4K);
2921 memcpy(tmp_ptr, entry->mem_ptr, memory_size);
2922 vfree(entry->mem_ptr);
2923 entry->mem_ptr = tmp_ptr;
2925 dbg_ptr = entry->mem_ptr + memory_size;
2926 memory_size += MWIFIEX_SIZE_4K;
2927 end_ptr = entry->mem_ptr + memory_size;
2930 if (stat != RDWR_STATUS_DONE)
2933 mwifiex_dbg(adapter, DUMP,
2934 "%s done: size=0x%tx\n",
2935 entry->mem_name, dbg_ptr - entry->mem_ptr);
2939 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
2942 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2944 adapter->devdump_data = vzalloc(MWIFIEX_FW_DUMP_SIZE);
2945 if (!adapter->devdump_data) {
2946 mwifiex_dbg(adapter, ERROR,
2947 "vzalloc devdump data failure!\n");
2951 mwifiex_drv_info_dump(adapter);
2952 mwifiex_pcie_fw_dump(adapter);
2953 mwifiex_prepare_fw_dump_info(adapter);
2954 mwifiex_upload_device_dump(adapter);
2957 static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter)
2959 struct pcie_service_card *card = adapter->card;
2961 /* We can't afford to wait here; remove() might be waiting on us. If we
2962 * can't grab the device lock, maybe we'll get another chance later.
2964 pci_try_reset_function(card->dev);
2967 static void mwifiex_pcie_work(struct work_struct *work)
2969 struct pcie_service_card *card =
2970 container_of(work, struct pcie_service_card, work);
2972 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2974 mwifiex_pcie_device_dump_work(card->adapter);
2975 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
2977 mwifiex_pcie_card_reset_work(card->adapter);
2980 /* This function dumps FW information */
2981 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2983 struct pcie_service_card *card = adapter->card;
2985 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2987 schedule_work(&card->work);
2990 static void mwifiex_pcie_card_reset(struct mwifiex_adapter *adapter)
2992 struct pcie_service_card *card = adapter->card;
2994 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags))
2995 schedule_work(&card->work);
2998 static int mwifiex_pcie_alloc_buffers(struct mwifiex_adapter *adapter)
3000 struct pcie_service_card *card = adapter->card;
3001 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3004 card->cmdrsp_buf = NULL;
3005 ret = mwifiex_pcie_create_txbd_ring(adapter);
3007 mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n");
3011 ret = mwifiex_pcie_create_rxbd_ring(adapter);
3013 mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n");
3017 ret = mwifiex_pcie_create_evtbd_ring(adapter);
3019 mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n");
3023 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
3025 mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n");
3026 goto err_alloc_cmdbuf;
3029 if (reg->sleep_cookie) {
3030 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
3032 mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n");
3033 goto err_alloc_cookie;
3036 card->sleep_cookie_vbase = NULL;
3042 mwifiex_pcie_delete_cmdrsp_buf(adapter);
3044 mwifiex_pcie_delete_evtbd_ring(adapter);
3046 mwifiex_pcie_delete_rxbd_ring(adapter);
3048 mwifiex_pcie_delete_txbd_ring(adapter);
3053 static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter)
3055 struct pcie_service_card *card = adapter->card;
3056 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3058 if (reg->sleep_cookie)
3059 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
3061 mwifiex_pcie_delete_cmdrsp_buf(adapter);
3062 mwifiex_pcie_delete_evtbd_ring(adapter);
3063 mwifiex_pcie_delete_rxbd_ring(adapter);
3064 mwifiex_pcie_delete_txbd_ring(adapter);
3068 * This function initializes the PCI-E host memory space, WCB rings, etc.
3070 static int mwifiex_init_pcie(struct mwifiex_adapter *adapter)
3072 struct pcie_service_card *card = adapter->card;
3074 struct pci_dev *pdev = card->dev;
3076 pci_set_drvdata(pdev, card);
3078 ret = pci_enable_device(pdev);
3080 goto err_enable_dev;
3082 pci_set_master(pdev);
3084 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
3086 pr_err("dma_set_mask(32) failed: %d\n", ret);
3087 goto err_set_dma_mask;
3090 ret = pci_request_region(pdev, 0, DRV_NAME);
3092 pr_err("req_reg(0) error\n");
3093 goto err_req_region0;
3095 card->pci_mmap = pci_iomap(pdev, 0, 0);
3096 if (!card->pci_mmap) {
3097 pr_err("iomap(0) error\n");
3101 ret = pci_request_region(pdev, 2, DRV_NAME);
3103 pr_err("req_reg(2) error\n");
3104 goto err_req_region2;
3106 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
3107 if (!card->pci_mmap1) {
3108 pr_err("iomap(2) error\n");
3113 pr_notice("PCI memory map Virt0: %pK PCI memory map Virt2: %pK\n",
3114 card->pci_mmap, card->pci_mmap1);
3116 ret = mwifiex_pcie_alloc_buffers(adapter);
3118 goto err_alloc_buffers;
3123 pci_iounmap(pdev, card->pci_mmap1);
3125 pci_release_region(pdev, 2);
3127 pci_iounmap(pdev, card->pci_mmap);
3129 pci_release_region(pdev, 0);
3132 pci_disable_device(pdev);
3138 * This function cleans up the allocated card buffers.
3140 static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter)
3142 struct pcie_service_card *card = adapter->card;
3143 struct pci_dev *pdev = card->dev;
3144 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3147 /* Perform the cancel_work_sync() only when we're not resetting
3148 * the card. It's because that function never returns if we're
3149 * in reset path. If we're here when resetting the card, it means
3150 * that we failed to reset the card (reset failure path).
3152 if (!card->pci_reset_ongoing) {
3153 mwifiex_dbg(adapter, MSG, "performing cancel_work_sync()...\n");
3154 cancel_work_sync(&card->work);
3155 mwifiex_dbg(adapter, MSG, "cancel_work_sync() done\n");
3157 mwifiex_dbg(adapter, MSG,
3158 "skipped cancel_work_sync() because we're in card reset failure path\n");
3161 mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
3162 if (fw_status == FIRMWARE_READY_PCIE) {
3163 mwifiex_dbg(adapter, INFO,
3164 "Clearing driver ready signature\n");
3165 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3166 mwifiex_dbg(adapter, ERROR,
3167 "Failed to write driver not-ready signature\n");
3170 pci_disable_device(pdev);
3172 pci_iounmap(pdev, card->pci_mmap);
3173 pci_iounmap(pdev, card->pci_mmap1);
3174 pci_release_region(pdev, 2);
3175 pci_release_region(pdev, 0);
3177 mwifiex_pcie_free_buffers(adapter);
3180 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
3183 struct pcie_service_card *card = adapter->card;
3184 struct pci_dev *pdev = card->dev;
3186 if (card->pcie.reg->msix_support) {
3187 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3188 card->msix_entries[i].entry = i;
3189 ret = pci_enable_msix_exact(pdev, card->msix_entries,
3190 MWIFIEX_NUM_MSIX_VECTORS);
3192 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) {
3193 card->msix_ctx[i].dev = pdev;
3194 card->msix_ctx[i].msg_id = i;
3196 ret = request_irq(card->msix_entries[i].vector,
3197 mwifiex_pcie_interrupt, 0,
3198 "MWIFIEX_PCIE_MSIX",
3199 &card->msix_ctx[i]);
3205 mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n",
3207 for (j = 0; j < i; j++)
3208 free_irq(card->msix_entries[j].vector,
3209 &card->msix_ctx[i]);
3210 pci_disable_msix(pdev);
3212 mwifiex_dbg(adapter, MSG, "MSIx enabled!");
3213 card->msix_enable = 1;
3219 if (pci_enable_msi(pdev) != 0)
3220 pci_disable_msi(pdev);
3222 card->msi_enable = 1;
3224 mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
3226 card->share_irq_ctx.dev = pdev;
3227 card->share_irq_ctx.msg_id = -1;
3228 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
3229 "MRVL_PCIE", &card->share_irq_ctx);
3231 pr_err("request_irq failed: ret=%d\n", ret);
3239 * This function gets the firmware name for downloading by revision id
3241 * Read revision id register to get revision id
3243 static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter)
3245 int revision_id = 0;
3247 struct pcie_service_card *card = adapter->card;
3249 switch (card->dev->device) {
3250 case PCIE_DEVICE_ID_MARVELL_88W8766P:
3251 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
3253 case PCIE_DEVICE_ID_MARVELL_88W8897:
3254 mwifiex_write_reg(adapter, 0x0c58, 0x80c00000);
3255 mwifiex_read_reg(adapter, 0x0c58, &revision_id);
3256 revision_id &= 0xff00;
3257 switch (revision_id) {
3259 strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME);
3262 strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME);
3265 strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME);
3270 case PCIE_DEVICE_ID_MARVELL_88W8997:
3271 mwifiex_read_reg(adapter, 0x8, &revision_id);
3272 mwifiex_read_reg(adapter, 0x0cd0, &version);
3273 mwifiex_read_reg(adapter, 0x0cd4, &magic);
3274 revision_id &= 0xff;
3277 if (revision_id == PCIE8997_A1 &&
3278 magic == CHIP_MAGIC_VALUE &&
3279 version == CHIP_VER_PCIEUART)
3280 strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4);
3282 strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4);
3290 * This function registers the PCIE device.
3292 * PCIE IRQ is claimed, block size is set and driver data is initialized.
3294 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
3296 struct pcie_service_card *card = adapter->card;
3298 /* save adapter pointer in card */
3299 card->adapter = adapter;
3301 if (mwifiex_pcie_request_irq(adapter))
3304 adapter->tx_buf_size = card->pcie.tx_buf_size;
3305 adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
3306 adapter->num_mem_types = card->pcie.num_mem_types;
3307 adapter->ext_scan = card->pcie.can_ext_scan;
3308 mwifiex_pcie_get_fw_name(adapter);
3314 * This function unregisters the PCIE device.
3316 * The PCIE IRQ is released, the function is disabled and driver
3317 * data is set to null.
3319 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
3321 struct pcie_service_card *card = adapter->card;
3322 struct pci_dev *pdev = card->dev;
3325 if (card->msix_enable) {
3326 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3327 synchronize_irq(card->msix_entries[i].vector);
3329 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3330 free_irq(card->msix_entries[i].vector,
3331 &card->msix_ctx[i]);
3333 card->msix_enable = 0;
3334 pci_disable_msix(pdev);
3336 mwifiex_dbg(adapter, INFO,
3337 "%s(): calling free_irq()\n", __func__);
3338 free_irq(card->dev->irq, &card->share_irq_ctx);
3340 if (card->msi_enable)
3341 pci_disable_msi(pdev);
3343 card->adapter = NULL;
3347 * This function initializes the PCI-E host memory space, WCB rings, etc.,
3348 * similar to mwifiex_init_pcie(), but without resetting PCI-E state.
3350 static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter)
3352 struct pcie_service_card *card = adapter->card;
3353 struct pci_dev *pdev = card->dev;
3355 /* tx_buf_size might be changed to 3584 by firmware during
3356 * data transfer, we should reset it to default size.
3358 adapter->tx_buf_size = card->pcie.tx_buf_size;
3360 mwifiex_pcie_alloc_buffers(adapter);
3362 pci_set_master(pdev);
3365 /* This function cleans up the PCI-E host memory space. */
3366 static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter)
3368 struct pcie_service_card *card = adapter->card;
3369 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3370 struct pci_dev *pdev = card->dev;
3372 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3373 mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n");
3375 pci_clear_master(pdev);
3377 adapter->seq_num = 0;
3379 mwifiex_pcie_free_buffers(adapter);
3382 static struct mwifiex_if_ops pcie_ops = {
3383 .init_if = mwifiex_init_pcie,
3384 .cleanup_if = mwifiex_cleanup_pcie,
3385 .check_fw_status = mwifiex_check_fw_status,
3386 .check_winner_status = mwifiex_check_winner_status,
3387 .prog_fw = mwifiex_prog_fw_w_helper,
3388 .register_dev = mwifiex_register_dev,
3389 .unregister_dev = mwifiex_unregister_dev,
3390 .enable_int = mwifiex_pcie_enable_host_int,
3391 .disable_int = mwifiex_pcie_disable_host_int_noerr,
3392 .process_int_status = mwifiex_process_int_status,
3393 .host_to_card = mwifiex_pcie_host_to_card,
3394 .wakeup = mwifiex_pm_wakeup_card,
3395 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
3398 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
3399 .event_complete = mwifiex_pcie_event_complete,
3400 .update_mp_end_port = NULL,
3401 .cleanup_mpa_buf = NULL,
3402 .init_fw_port = mwifiex_pcie_init_fw_port,
3403 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
3404 .card_reset = mwifiex_pcie_card_reset,
3405 .reg_dump = mwifiex_pcie_reg_dump,
3406 .device_dump = mwifiex_pcie_device_dump,
3407 .down_dev = mwifiex_pcie_down_dev,
3408 .up_dev = mwifiex_pcie_up_dev,
3411 module_pci_driver(mwifiex_pcie);
3413 MODULE_AUTHOR("Marvell International Ltd.");
3414 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
3415 MODULE_VERSION(PCIE_VERSION);
3416 MODULE_LICENSE("GPL v2");