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;
154 struct pci_dev *pdev = to_pci_dev(dev);
156 card = pci_get_drvdata(pdev);
158 /* Might still be loading firmware */
159 wait_for_completion(&card->fw_done);
161 adapter = card->adapter;
163 dev_err(dev, "adapter is not valid\n");
167 mwifiex_enable_wake(adapter);
169 /* Enable the Host Sleep */
170 if (!mwifiex_enable_hs(adapter)) {
171 mwifiex_dbg(adapter, ERROR,
172 "cmd: failed to suspend\n");
173 adapter->hs_enabling = false;
174 mwifiex_disable_wake(adapter);
178 flush_workqueue(adapter->workqueue);
180 /* Indicate device suspended */
181 adapter->is_suspended = true;
182 adapter->hs_enabling = false;
188 * Kernel needs to suspend all functions separately. Therefore all
189 * registered functions must have drivers with suspend and resume
190 * methods. Failing that the kernel simply removes the whole card.
192 * If already not resumed, this function turns on the traffic and
193 * sends a host sleep cancel request to the firmware.
195 static int mwifiex_pcie_resume(struct device *dev)
197 struct mwifiex_adapter *adapter;
198 struct pcie_service_card *card;
199 struct pci_dev *pdev = to_pci_dev(dev);
201 card = pci_get_drvdata(pdev);
203 if (!card->adapter) {
204 dev_err(dev, "adapter structure is not valid\n");
208 adapter = card->adapter;
210 if (!adapter->is_suspended) {
211 mwifiex_dbg(adapter, WARN,
212 "Device already resumed\n");
216 adapter->is_suspended = false;
218 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
220 mwifiex_disable_wake(adapter);
227 * This function probes an mwifiex device and registers it. It allocates
228 * the card structure, enables PCIE function number and initiates the
229 * device registration and initialization procedure by adding a logical
232 static int mwifiex_pcie_probe(struct pci_dev *pdev,
233 const struct pci_device_id *ent)
235 struct pcie_service_card *card;
238 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
239 pdev->vendor, pdev->device, pdev->revision);
241 card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
245 init_completion(&card->fw_done);
249 if (ent->driver_data) {
250 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
251 card->pcie.reg = data->reg;
252 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
253 card->pcie.tx_buf_size = data->tx_buf_size;
254 card->pcie.can_dump_fw = data->can_dump_fw;
255 card->pcie.mem_type_mapping_tbl = data->mem_type_mapping_tbl;
256 card->pcie.num_mem_types = data->num_mem_types;
257 card->pcie.can_ext_scan = data->can_ext_scan;
258 INIT_WORK(&card->work, mwifiex_pcie_work);
261 /* device tree node parsing and platform specific configuration*/
262 if (pdev->dev.of_node) {
263 ret = mwifiex_pcie_probe_of(&pdev->dev);
268 if (mwifiex_add_card(card, &card->fw_done, &pcie_ops,
269 MWIFIEX_PCIE, &pdev->dev)) {
270 pr_err("%s failed\n", __func__);
278 * This function removes the interface and frees up the card structure.
280 static void mwifiex_pcie_remove(struct pci_dev *pdev)
282 struct pcie_service_card *card;
283 struct mwifiex_adapter *adapter;
284 struct mwifiex_private *priv;
285 const struct mwifiex_pcie_card_reg *reg;
289 card = pci_get_drvdata(pdev);
291 wait_for_completion(&card->fw_done);
293 adapter = card->adapter;
294 if (!adapter || !adapter->priv_num)
297 reg = card->pcie.reg;
299 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
303 if (fw_status == FIRMWARE_READY_PCIE && !adapter->mfg_mode) {
304 mwifiex_deauthenticate_all(adapter);
306 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
308 mwifiex_disable_auto_ds(priv);
310 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
313 mwifiex_remove_card(adapter);
316 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
318 mwifiex_pcie_remove(pdev);
323 static const struct pci_device_id mwifiex_ids[] = {
325 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
326 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
327 .driver_data = (unsigned long)&mwifiex_pcie8766,
330 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
331 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
332 .driver_data = (unsigned long)&mwifiex_pcie8897,
335 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
336 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
337 .driver_data = (unsigned long)&mwifiex_pcie8997,
340 PCIE_VENDOR_ID_V2_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
341 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
342 .driver_data = (unsigned long)&mwifiex_pcie8997,
347 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
350 * Cleanup all software without cleaning anything related to PCIe and HW.
352 static void mwifiex_pcie_reset_prepare(struct pci_dev *pdev)
354 struct pcie_service_card *card = pci_get_drvdata(pdev);
355 struct mwifiex_adapter *adapter = card->adapter;
358 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
363 mwifiex_dbg(adapter, INFO,
364 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Pre-FLR\n",
365 __func__, pdev->vendor, pdev->device, pdev->revision);
367 mwifiex_shutdown_sw(adapter);
368 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
369 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
370 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
372 card->pci_reset_ongoing = true;
376 * Kernel stores and restores PCIe function context before and after performing
377 * FLR respectively. Reconfigure the software and firmware including firmware
380 static void mwifiex_pcie_reset_done(struct pci_dev *pdev)
382 struct pcie_service_card *card = pci_get_drvdata(pdev);
383 struct mwifiex_adapter *adapter = card->adapter;
387 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
392 mwifiex_dbg(adapter, INFO,
393 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Post-FLR\n",
394 __func__, pdev->vendor, pdev->device, pdev->revision);
396 ret = mwifiex_reinit_sw(adapter);
398 dev_err(&pdev->dev, "reinit failed: %d\n", ret);
400 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
402 card->pci_reset_ongoing = false;
405 static const struct pci_error_handlers mwifiex_pcie_err_handler = {
406 .reset_prepare = mwifiex_pcie_reset_prepare,
407 .reset_done = mwifiex_pcie_reset_done,
410 #ifdef CONFIG_PM_SLEEP
411 /* Power Management Hooks */
412 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
413 mwifiex_pcie_resume);
416 /* PCI Device Driver */
417 static struct pci_driver __refdata mwifiex_pcie = {
418 .name = "mwifiex_pcie",
419 .id_table = mwifiex_ids,
420 .probe = mwifiex_pcie_probe,
421 .remove = mwifiex_pcie_remove,
422 #ifdef CONFIG_PM_SLEEP
424 .pm = &mwifiex_pcie_pm_ops,
427 .shutdown = mwifiex_pcie_shutdown,
428 .err_handler = &mwifiex_pcie_err_handler,
432 * This function adds delay loop to ensure FW is awake before proceeding.
434 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
438 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
440 usleep_range(10, 20);
449 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
450 u32 max_delay_loop_cnt)
452 struct pcie_service_card *card = adapter->card;
454 u32 sleep_cookie, count;
455 struct sk_buff *cmdrsp = card->cmdrsp_buf;
457 for (count = 0; count < max_delay_loop_cnt; count++) {
458 pci_dma_sync_single_for_cpu(card->dev,
459 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
460 sizeof(sleep_cookie),
462 buffer = cmdrsp->data;
463 sleep_cookie = get_unaligned_le32(buffer);
465 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
466 mwifiex_dbg(adapter, INFO,
467 "sleep cookie found at count %d\n", count);
470 pci_dma_sync_single_for_device(card->dev,
471 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
472 sizeof(sleep_cookie),
474 usleep_range(20, 30);
477 if (count >= max_delay_loop_cnt)
478 mwifiex_dbg(adapter, INFO,
479 "max count reached while accessing sleep cookie\n");
482 /* This function wakes up the card by reading fw_status register. */
483 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
485 struct pcie_service_card *card = adapter->card;
486 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
488 mwifiex_dbg(adapter, EVENT,
489 "event: Wakeup device...\n");
491 if (reg->sleep_cookie)
492 mwifiex_pcie_dev_wakeup_delay(adapter);
494 /* Accessing fw_status register will wakeup device */
495 if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
496 mwifiex_dbg(adapter, ERROR,
497 "Writing fw_status register failed\n");
501 if (reg->sleep_cookie) {
502 mwifiex_pcie_dev_wakeup_delay(adapter);
503 mwifiex_dbg(adapter, INFO,
504 "PCIE wakeup: Setting PS_STATE_AWAKE\n");
505 adapter->ps_state = PS_STATE_AWAKE;
512 * This function is called after the card has woken up.
514 * The card configuration register is reset.
516 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
518 mwifiex_dbg(adapter, CMD,
519 "cmd: Wakeup device completed\n");
525 * This function disables the host interrupt.
527 * The host interrupt mask is read, the disable bit is reset and
528 * written back to the card host interrupt mask register.
530 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
532 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
533 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
535 mwifiex_dbg(adapter, ERROR,
536 "Disable host interrupt failed\n");
541 atomic_set(&adapter->tx_hw_pending, 0);
545 static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter)
547 WARN_ON(mwifiex_pcie_disable_host_int(adapter));
551 * This function enables the host interrupt.
553 * The host interrupt enable mask is written to the card
554 * host interrupt mask register.
556 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
558 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
559 /* Simply write the mask to the register */
560 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
562 mwifiex_dbg(adapter, ERROR,
563 "Enable host interrupt failed\n");
572 * This function initializes TX buffer ring descriptors
574 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
576 struct pcie_service_card *card = adapter->card;
577 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
578 struct mwifiex_pcie_buf_desc *desc;
579 struct mwifiex_pfu_buf_desc *desc2;
582 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
583 card->tx_buf_list[i] = NULL;
584 if (reg->pfu_enabled) {
585 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
586 (sizeof(*desc2) * i);
587 desc2 = card->txbd_ring[i];
588 memset(desc2, 0, sizeof(*desc2));
590 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
592 desc = card->txbd_ring[i];
593 memset(desc, 0, sizeof(*desc));
600 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
601 * here and after mapping PCI memory, its physical address is assigned to
602 * PCIE Rx buffer descriptor's physical address.
604 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
606 struct pcie_service_card *card = adapter->card;
607 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
609 struct mwifiex_pcie_buf_desc *desc;
610 struct mwifiex_pfu_buf_desc *desc2;
614 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
615 /* Allocate skb here so that firmware can DMA data from it */
616 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
619 mwifiex_dbg(adapter, ERROR,
620 "Unable to allocate skb for RX ring.\n");
621 kfree(card->rxbd_ring_vbase);
625 if (mwifiex_map_pci_memory(adapter, skb,
626 MWIFIEX_RX_DATA_BUF_SIZE,
630 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
632 mwifiex_dbg(adapter, INFO,
633 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
634 skb, skb->len, skb->data, (u32)buf_pa,
635 (u32)((u64)buf_pa >> 32));
637 card->rx_buf_list[i] = skb;
638 if (reg->pfu_enabled) {
639 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
640 (sizeof(*desc2) * i);
641 desc2 = card->rxbd_ring[i];
642 desc2->paddr = buf_pa;
643 desc2->len = (u16)skb->len;
644 desc2->frag_len = (u16)skb->len;
645 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
648 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
649 (sizeof(*desc) * i));
650 desc = card->rxbd_ring[i];
651 desc->paddr = buf_pa;
652 desc->len = (u16)skb->len;
660 /* This function initializes event buffer ring descriptors. Each SKB is
661 * allocated here and after mapping PCI memory, its physical address is assigned
662 * to PCIE Rx buffer descriptor's physical address
664 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
666 struct pcie_service_card *card = adapter->card;
667 struct mwifiex_evt_buf_desc *desc;
672 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
673 /* Allocate skb here so that firmware can DMA data from it */
674 skb = dev_alloc_skb(MAX_EVENT_SIZE);
676 mwifiex_dbg(adapter, ERROR,
677 "Unable to allocate skb for EVENT buf.\n");
678 kfree(card->evtbd_ring_vbase);
681 skb_put(skb, MAX_EVENT_SIZE);
683 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
684 PCI_DMA_FROMDEVICE)) {
686 kfree(card->evtbd_ring_vbase);
690 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
692 mwifiex_dbg(adapter, EVENT,
693 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
694 skb, skb->len, skb->data, (u32)buf_pa,
695 (u32)((u64)buf_pa >> 32));
697 card->evt_buf_list[i] = skb;
698 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
699 (sizeof(*desc) * i));
700 desc = card->evtbd_ring[i];
701 desc->paddr = buf_pa;
702 desc->len = (u16)skb->len;
709 /* This function cleans up TX buffer rings. If any of the buffer list has valid
710 * SKB address, associated SKB is freed.
712 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
714 struct pcie_service_card *card = adapter->card;
715 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
717 struct mwifiex_pcie_buf_desc *desc;
718 struct mwifiex_pfu_buf_desc *desc2;
721 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
722 if (reg->pfu_enabled) {
723 desc2 = card->txbd_ring[i];
724 if (card->tx_buf_list[i]) {
725 skb = card->tx_buf_list[i];
726 mwifiex_unmap_pci_memory(adapter, skb,
728 dev_kfree_skb_any(skb);
730 memset(desc2, 0, sizeof(*desc2));
732 desc = card->txbd_ring[i];
733 if (card->tx_buf_list[i]) {
734 skb = card->tx_buf_list[i];
735 mwifiex_unmap_pci_memory(adapter, skb,
737 dev_kfree_skb_any(skb);
739 memset(desc, 0, sizeof(*desc));
741 card->tx_buf_list[i] = NULL;
744 atomic_set(&adapter->tx_hw_pending, 0);
748 /* This function cleans up RX buffer rings. If any of the buffer list has valid
749 * SKB address, associated SKB is freed.
751 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
753 struct pcie_service_card *card = adapter->card;
754 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
755 struct mwifiex_pcie_buf_desc *desc;
756 struct mwifiex_pfu_buf_desc *desc2;
760 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
761 if (reg->pfu_enabled) {
762 desc2 = card->rxbd_ring[i];
763 if (card->rx_buf_list[i]) {
764 skb = card->rx_buf_list[i];
765 mwifiex_unmap_pci_memory(adapter, skb,
767 dev_kfree_skb_any(skb);
769 memset(desc2, 0, sizeof(*desc2));
771 desc = card->rxbd_ring[i];
772 if (card->rx_buf_list[i]) {
773 skb = card->rx_buf_list[i];
774 mwifiex_unmap_pci_memory(adapter, skb,
776 dev_kfree_skb_any(skb);
778 memset(desc, 0, sizeof(*desc));
780 card->rx_buf_list[i] = NULL;
786 /* This function cleans up event buffer rings. If any of the buffer list has
787 * valid SKB address, associated SKB is freed.
789 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
791 struct pcie_service_card *card = adapter->card;
792 struct mwifiex_evt_buf_desc *desc;
796 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
797 desc = card->evtbd_ring[i];
798 if (card->evt_buf_list[i]) {
799 skb = card->evt_buf_list[i];
800 mwifiex_unmap_pci_memory(adapter, skb,
802 dev_kfree_skb_any(skb);
804 card->evt_buf_list[i] = NULL;
805 memset(desc, 0, sizeof(*desc));
811 /* This function creates buffer descriptor ring for TX
813 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
815 struct pcie_service_card *card = adapter->card;
816 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
819 * driver maintaines the write pointer and firmware maintaines the read
820 * pointer. The write pointer starts at 0 (zero) while the read pointer
821 * starts at zero with rollover bit set
823 card->txbd_wrptr = 0;
825 if (reg->pfu_enabled)
826 card->txbd_rdptr = 0;
828 card->txbd_rdptr |= reg->tx_rollover_ind;
830 /* allocate shared memory for the BD ring and divide the same in to
831 several descriptors */
832 if (reg->pfu_enabled)
833 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
836 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
839 mwifiex_dbg(adapter, INFO,
840 "info: txbd_ring: Allocating %d bytes\n",
841 card->txbd_ring_size);
842 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
843 card->txbd_ring_size,
844 &card->txbd_ring_pbase);
845 if (!card->txbd_ring_vbase) {
846 mwifiex_dbg(adapter, ERROR,
847 "allocate consistent memory (%d bytes) failed!\n",
848 card->txbd_ring_size);
851 mwifiex_dbg(adapter, DATA,
852 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
853 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
854 (u32)((u64)card->txbd_ring_pbase >> 32),
855 card->txbd_ring_size);
857 return mwifiex_init_txq_ring(adapter);
860 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
862 struct pcie_service_card *card = adapter->card;
863 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
865 mwifiex_cleanup_txq_ring(adapter);
867 if (card->txbd_ring_vbase)
868 pci_free_consistent(card->dev, card->txbd_ring_size,
869 card->txbd_ring_vbase,
870 card->txbd_ring_pbase);
871 card->txbd_ring_size = 0;
872 card->txbd_wrptr = 0;
873 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
874 card->txbd_ring_vbase = NULL;
875 card->txbd_ring_pbase = 0;
881 * This function creates buffer descriptor ring for RX
883 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
885 struct pcie_service_card *card = adapter->card;
886 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
889 * driver maintaines the read pointer and firmware maintaines the write
890 * pointer. The write pointer starts at 0 (zero) while the read pointer
891 * starts at zero with rollover bit set
893 card->rxbd_wrptr = 0;
894 card->rxbd_rdptr = reg->rx_rollover_ind;
896 if (reg->pfu_enabled)
897 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
900 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
903 mwifiex_dbg(adapter, INFO,
904 "info: rxbd_ring: Allocating %d bytes\n",
905 card->rxbd_ring_size);
906 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
907 card->rxbd_ring_size,
908 &card->rxbd_ring_pbase);
909 if (!card->rxbd_ring_vbase) {
910 mwifiex_dbg(adapter, ERROR,
911 "allocate consistent memory (%d bytes) failed!\n",
912 card->rxbd_ring_size);
916 mwifiex_dbg(adapter, DATA,
917 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
918 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
919 (u32)((u64)card->rxbd_ring_pbase >> 32),
920 card->rxbd_ring_size);
922 return mwifiex_init_rxq_ring(adapter);
926 * This function deletes Buffer descriptor ring for RX
928 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
930 struct pcie_service_card *card = adapter->card;
931 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
933 mwifiex_cleanup_rxq_ring(adapter);
935 if (card->rxbd_ring_vbase)
936 pci_free_consistent(card->dev, card->rxbd_ring_size,
937 card->rxbd_ring_vbase,
938 card->rxbd_ring_pbase);
939 card->rxbd_ring_size = 0;
940 card->rxbd_wrptr = 0;
941 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
942 card->rxbd_ring_vbase = NULL;
943 card->rxbd_ring_pbase = 0;
949 * This function creates buffer descriptor ring for Events
951 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
953 struct pcie_service_card *card = adapter->card;
954 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
957 * driver maintaines the read pointer and firmware maintaines the write
958 * pointer. The write pointer starts at 0 (zero) while the read pointer
959 * starts at zero with rollover bit set
961 card->evtbd_wrptr = 0;
962 card->evtbd_rdptr = reg->evt_rollover_ind;
964 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
967 mwifiex_dbg(adapter, INFO,
968 "info: evtbd_ring: Allocating %d bytes\n",
969 card->evtbd_ring_size);
970 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
971 card->evtbd_ring_size,
972 &card->evtbd_ring_pbase);
973 if (!card->evtbd_ring_vbase) {
974 mwifiex_dbg(adapter, ERROR,
975 "allocate consistent memory (%d bytes) failed!\n",
976 card->evtbd_ring_size);
980 mwifiex_dbg(adapter, EVENT,
981 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
982 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
983 (u32)((u64)card->evtbd_ring_pbase >> 32),
984 card->evtbd_ring_size);
986 return mwifiex_pcie_init_evt_ring(adapter);
990 * This function deletes Buffer descriptor ring for Events
992 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
994 struct pcie_service_card *card = adapter->card;
995 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
997 mwifiex_cleanup_evt_ring(adapter);
999 if (card->evtbd_ring_vbase)
1000 pci_free_consistent(card->dev, card->evtbd_ring_size,
1001 card->evtbd_ring_vbase,
1002 card->evtbd_ring_pbase);
1003 card->evtbd_wrptr = 0;
1004 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
1005 card->evtbd_ring_size = 0;
1006 card->evtbd_ring_vbase = NULL;
1007 card->evtbd_ring_pbase = 0;
1013 * This function allocates a buffer for CMDRSP
1015 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
1017 struct pcie_service_card *card = adapter->card;
1018 struct sk_buff *skb;
1020 /* Allocate memory for receiving command response data */
1021 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1023 mwifiex_dbg(adapter, ERROR,
1024 "Unable to allocate skb for command response data.\n");
1027 skb_put(skb, MWIFIEX_UPLD_SIZE);
1028 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1029 PCI_DMA_FROMDEVICE)) {
1034 card->cmdrsp_buf = skb;
1040 * This function deletes a buffer for CMDRSP
1042 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
1044 struct pcie_service_card *card;
1049 card = adapter->card;
1051 if (card && card->cmdrsp_buf) {
1052 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
1053 PCI_DMA_FROMDEVICE);
1054 dev_kfree_skb_any(card->cmdrsp_buf);
1055 card->cmdrsp_buf = NULL;
1058 if (card && card->cmd_buf) {
1059 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1061 dev_kfree_skb_any(card->cmd_buf);
1062 card->cmd_buf = NULL;
1068 * This function allocates a buffer for sleep cookie
1070 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1072 struct pcie_service_card *card = adapter->card;
1075 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
1076 &card->sleep_cookie_pbase);
1077 if (!card->sleep_cookie_vbase) {
1078 mwifiex_dbg(adapter, ERROR,
1079 "pci_alloc_consistent failed!\n");
1082 cookie = (u32 *)card->sleep_cookie_vbase;
1083 /* Init val of Sleep Cookie */
1084 *cookie = FW_AWAKE_COOKIE;
1086 mwifiex_dbg(adapter, INFO, "alloc_scook: sleep cookie=0x%x\n", *cookie);
1092 * This function deletes buffer for sleep cookie
1094 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1096 struct pcie_service_card *card;
1101 card = adapter->card;
1103 if (card && card->sleep_cookie_vbase) {
1104 pci_free_consistent(card->dev, sizeof(u32),
1105 card->sleep_cookie_vbase,
1106 card->sleep_cookie_pbase);
1107 card->sleep_cookie_vbase = NULL;
1113 /* This function flushes the TX buffer descriptor ring
1114 * This function defined as handler is also called while cleaning TXRX
1115 * during disconnect/ bss stop.
1117 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1119 struct pcie_service_card *card = adapter->card;
1121 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1122 card->txbd_flush = 1;
1123 /* write pointer already set at last send
1124 * send dnld-rdy intr again, wait for completion.
1126 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1127 CPU_INTR_DNLD_RDY)) {
1128 mwifiex_dbg(adapter, ERROR,
1129 "failed to assert dnld-rdy interrupt.\n");
1137 * This function unmaps and frees downloaded data buffer
1139 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1141 struct sk_buff *skb;
1142 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1143 struct mwifiex_pcie_buf_desc *desc;
1144 struct mwifiex_pfu_buf_desc *desc2;
1145 struct pcie_service_card *card = adapter->card;
1146 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1148 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1149 mwifiex_pm_wakeup_card(adapter);
1151 /* Read the TX ring read pointer set by firmware */
1152 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1153 mwifiex_dbg(adapter, ERROR,
1154 "SEND COMP: failed to read reg->tx_rdptr\n");
1158 mwifiex_dbg(adapter, DATA,
1159 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1160 card->txbd_rdptr, rdptr);
1162 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1163 /* free from previous txbd_rdptr to current txbd_rdptr */
1164 while (((card->txbd_rdptr & reg->tx_mask) !=
1165 (rdptr & reg->tx_mask)) ||
1166 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1167 (rdptr & reg->tx_rollover_ind))) {
1168 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1171 skb = card->tx_buf_list[wrdoneidx];
1174 mwifiex_dbg(adapter, DATA,
1175 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1177 mwifiex_unmap_pci_memory(adapter, skb,
1182 if (card->txbd_flush)
1183 mwifiex_write_data_complete(adapter, skb, 0,
1186 mwifiex_write_data_complete(adapter, skb, 0, 0);
1187 atomic_dec(&adapter->tx_hw_pending);
1190 card->tx_buf_list[wrdoneidx] = NULL;
1192 if (reg->pfu_enabled) {
1193 desc2 = card->txbd_ring[wrdoneidx];
1194 memset(desc2, 0, sizeof(*desc2));
1196 desc = card->txbd_ring[wrdoneidx];
1197 memset(desc, 0, sizeof(*desc));
1199 switch (card->dev->device) {
1200 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1203 case PCIE_DEVICE_ID_MARVELL_88W8897:
1204 case PCIE_DEVICE_ID_MARVELL_88W8997:
1205 card->txbd_rdptr += reg->ring_tx_start_ptr;
1210 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1211 card->txbd_rdptr = ((card->txbd_rdptr &
1212 reg->tx_rollover_ind) ^
1213 reg->tx_rollover_ind);
1217 adapter->data_sent = false;
1219 if (card->txbd_flush) {
1220 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1221 card->txbd_flush = 0;
1223 mwifiex_clean_pcie_ring_buf(adapter);
1229 /* This function sends data buffer to device. First 4 bytes of payload
1230 * are filled with payload length and payload type. Then this payload
1231 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1232 * Download ready interrupt to FW is deffered if Tx ring is not full and
1233 * additional payload can be accomodated.
1234 * Caller must ensure tx_param parameter to this function is not NULL.
1237 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1238 struct mwifiex_tx_param *tx_param)
1240 struct pcie_service_card *card = adapter->card;
1241 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1242 u32 wrindx, num_tx_buffs, rx_val;
1245 struct mwifiex_pcie_buf_desc *desc = NULL;
1246 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1248 if (!(skb->data && skb->len)) {
1249 mwifiex_dbg(adapter, ERROR,
1250 "%s(): invalid parameter <%p, %#x>\n",
1251 __func__, skb->data, skb->len);
1255 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1256 mwifiex_pm_wakeup_card(adapter);
1258 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1259 mwifiex_dbg(adapter, DATA,
1260 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1261 card->txbd_rdptr, card->txbd_wrptr);
1262 if (mwifiex_pcie_txbd_not_full(card)) {
1265 adapter->data_sent = true;
1266 payload = skb->data;
1267 put_unaligned_le16((u16)skb->len, payload + 0);
1268 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
1270 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1274 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1275 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1276 card->tx_buf_list[wrindx] = skb;
1277 atomic_inc(&adapter->tx_hw_pending);
1279 if (reg->pfu_enabled) {
1280 desc2 = card->txbd_ring[wrindx];
1281 desc2->paddr = buf_pa;
1282 desc2->len = (u16)skb->len;
1283 desc2->frag_len = (u16)skb->len;
1285 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1286 MWIFIEX_BD_FLAG_LAST_DESC;
1288 desc = card->txbd_ring[wrindx];
1289 desc->paddr = buf_pa;
1290 desc->len = (u16)skb->len;
1291 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1292 MWIFIEX_BD_FLAG_LAST_DESC;
1295 switch (card->dev->device) {
1296 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1299 case PCIE_DEVICE_ID_MARVELL_88W8897:
1300 case PCIE_DEVICE_ID_MARVELL_88W8997:
1301 card->txbd_wrptr += reg->ring_tx_start_ptr;
1305 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1306 card->txbd_wrptr = ((card->txbd_wrptr &
1307 reg->tx_rollover_ind) ^
1308 reg->tx_rollover_ind);
1310 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1311 /* Write the TX ring write pointer in to reg->tx_wrptr */
1312 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1313 card->txbd_wrptr | rx_val)) {
1314 mwifiex_dbg(adapter, ERROR,
1315 "SEND DATA: failed to write reg->tx_wrptr\n");
1319 if ((mwifiex_pcie_txbd_not_full(card)) &&
1320 tx_param->next_pkt_len) {
1321 /* have more packets and TxBD still can hold more */
1322 mwifiex_dbg(adapter, DATA,
1323 "SEND DATA: delay dnld-rdy interrupt.\n");
1324 adapter->data_sent = false;
1326 /* Send the TX ready interrupt */
1327 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1328 CPU_INTR_DNLD_RDY)) {
1329 mwifiex_dbg(adapter, ERROR,
1330 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1335 mwifiex_dbg(adapter, DATA,
1336 "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1337 "%#x> and sent packet to firmware successfully\n",
1338 card->txbd_rdptr, card->txbd_wrptr);
1340 mwifiex_dbg(adapter, DATA,
1341 "info: TX Ring full, can't send packets to fw\n");
1342 adapter->data_sent = true;
1343 /* Send the TX ready interrupt */
1344 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1346 mwifiex_dbg(adapter, ERROR,
1347 "SEND DATA: failed to assert door-bell intr\n");
1351 return -EINPROGRESS;
1353 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1354 card->tx_buf_list[wrindx] = NULL;
1355 atomic_dec(&adapter->tx_hw_pending);
1356 if (reg->pfu_enabled)
1357 memset(desc2, 0, sizeof(*desc2));
1359 memset(desc, 0, sizeof(*desc));
1365 * This function handles received buffer ring and
1366 * dispatches packets to upper
1368 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1370 struct pcie_service_card *card = adapter->card;
1371 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1372 u32 wrptr, rd_index, tx_val;
1375 struct sk_buff *skb_tmp = NULL;
1376 struct mwifiex_pcie_buf_desc *desc;
1377 struct mwifiex_pfu_buf_desc *desc2;
1379 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1380 mwifiex_pm_wakeup_card(adapter);
1382 /* Read the RX ring Write pointer set by firmware */
1383 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1384 mwifiex_dbg(adapter, ERROR,
1385 "RECV DATA: failed to read reg->rx_wrptr\n");
1389 card->rxbd_wrptr = wrptr;
1391 while (((wrptr & reg->rx_mask) !=
1392 (card->rxbd_rdptr & reg->rx_mask)) ||
1393 ((wrptr & reg->rx_rollover_ind) ==
1394 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1395 struct sk_buff *skb_data;
1398 rd_index = card->rxbd_rdptr & reg->rx_mask;
1399 skb_data = card->rx_buf_list[rd_index];
1401 /* If skb allocation was failed earlier for Rx packet,
1402 * rx_buf_list[rd_index] would have been left with a NULL.
1407 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1408 card->rx_buf_list[rd_index] = NULL;
1410 /* Get data length from interface header -
1411 * first 2 bytes for len, next 2 bytes is for type
1413 rx_len = get_unaligned_le16(skb_data->data);
1414 if (WARN_ON(rx_len <= adapter->intf_hdr_len ||
1415 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1416 mwifiex_dbg(adapter, ERROR,
1417 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1418 rx_len, card->rxbd_rdptr, wrptr);
1419 dev_kfree_skb_any(skb_data);
1421 skb_put(skb_data, rx_len);
1422 mwifiex_dbg(adapter, DATA,
1423 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1424 card->rxbd_rdptr, wrptr, rx_len);
1425 skb_pull(skb_data, adapter->intf_hdr_len);
1426 if (adapter->rx_work_enabled) {
1427 skb_queue_tail(&adapter->rx_data_q, skb_data);
1428 adapter->data_received = true;
1429 atomic_inc(&adapter->rx_pending);
1431 mwifiex_handle_rx_packet(adapter, skb_data);
1435 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1438 mwifiex_dbg(adapter, ERROR,
1439 "Unable to allocate skb.\n");
1443 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1444 MWIFIEX_RX_DATA_BUF_SIZE,
1445 PCI_DMA_FROMDEVICE))
1448 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1450 mwifiex_dbg(adapter, INFO,
1451 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1453 card->rx_buf_list[rd_index] = skb_tmp;
1455 if (reg->pfu_enabled) {
1456 desc2 = card->rxbd_ring[rd_index];
1457 desc2->paddr = buf_pa;
1458 desc2->len = skb_tmp->len;
1459 desc2->frag_len = skb_tmp->len;
1461 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1463 desc = card->rxbd_ring[rd_index];
1464 desc->paddr = buf_pa;
1465 desc->len = skb_tmp->len;
1469 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1470 MWIFIEX_MAX_TXRX_BD) {
1471 card->rxbd_rdptr = ((card->rxbd_rdptr &
1472 reg->rx_rollover_ind) ^
1473 reg->rx_rollover_ind);
1475 mwifiex_dbg(adapter, DATA,
1476 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1477 card->rxbd_rdptr, wrptr);
1479 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1480 /* Write the RX ring read pointer in to reg->rx_rdptr */
1481 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1482 card->rxbd_rdptr | tx_val)) {
1483 mwifiex_dbg(adapter, DATA,
1484 "RECV DATA: failed to write reg->rx_rdptr\n");
1489 /* Read the RX ring Write pointer set by firmware */
1490 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1491 mwifiex_dbg(adapter, ERROR,
1492 "RECV DATA: failed to read reg->rx_wrptr\n");
1496 mwifiex_dbg(adapter, DATA,
1497 "info: RECV DATA: Rcvd packet from fw successfully\n");
1498 card->rxbd_wrptr = wrptr;
1506 * This function downloads the boot command to device
1509 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1512 struct pcie_service_card *card = adapter->card;
1513 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1515 if (!(skb->data && skb->len)) {
1516 mwifiex_dbg(adapter, ERROR,
1517 "Invalid parameter in %s <%p. len %d>\n",
1518 __func__, skb->data, skb->len);
1522 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1525 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1527 /* Write the lower 32bits of the physical address to low command
1528 * address scratch register
1530 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1531 mwifiex_dbg(adapter, ERROR,
1532 "%s: failed to write download command to boot code.\n",
1534 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1538 /* Write the upper 32bits of the physical address to high command
1539 * address scratch register
1541 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1542 (u32)((u64)buf_pa >> 32))) {
1543 mwifiex_dbg(adapter, ERROR,
1544 "%s: failed to write download command to boot code.\n",
1546 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1550 /* Write the command length to cmd_size scratch register */
1551 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1552 mwifiex_dbg(adapter, ERROR,
1553 "%s: failed to write command len to cmd_size scratch reg\n",
1555 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1559 /* Ring the door bell */
1560 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1561 CPU_INTR_DOOR_BELL)) {
1562 mwifiex_dbg(adapter, ERROR,
1563 "%s: failed to assert door-bell intr\n", __func__);
1564 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1571 /* This function init rx port in firmware which in turn enables to receive data
1572 * from device before transmitting any packet.
1574 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1576 struct pcie_service_card *card = adapter->card;
1577 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1578 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1580 /* Write the RX ring read pointer in to reg->rx_rdptr */
1581 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1583 mwifiex_dbg(adapter, ERROR,
1584 "RECV DATA: failed to write reg->rx_rdptr\n");
1590 /* This function downloads commands to the device
1593 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1595 struct pcie_service_card *card = adapter->card;
1596 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1598 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1599 u8 *payload = (u8 *)skb->data;
1601 if (!(skb->data && skb->len)) {
1602 mwifiex_dbg(adapter, ERROR,
1603 "Invalid parameter in %s <%p, %#x>\n",
1604 __func__, skb->data, skb->len);
1608 /* Make sure a command response buffer is available */
1609 if (!card->cmdrsp_buf) {
1610 mwifiex_dbg(adapter, ERROR,
1611 "No response buffer available, send command failed\n");
1615 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1616 mwifiex_pm_wakeup_card(adapter);
1618 adapter->cmd_sent = true;
1620 put_unaligned_le16((u16)skb->len, &payload[0]);
1621 put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
1623 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1626 card->cmd_buf = skb;
1628 * Need to keep a reference, since core driver might free up this
1629 * buffer before we've unmapped it.
1633 /* To send a command, the driver will:
1634 1. Write the 64bit physical address of the data buffer to
1635 cmd response address low + cmd response address high
1636 2. Ring the door bell (i.e. set the door bell interrupt)
1638 In response to door bell interrupt, the firmware will perform
1639 the DMA of the command packet (first header to obtain the total
1640 length and then rest of the command).
1643 if (card->cmdrsp_buf) {
1644 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1645 /* Write the lower 32bits of the cmdrsp buffer physical
1647 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1648 (u32)cmdrsp_buf_pa)) {
1649 mwifiex_dbg(adapter, ERROR,
1650 "Failed to write download cmd to boot code.\n");
1654 /* Write the upper 32bits of the cmdrsp buffer physical
1656 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1657 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1658 mwifiex_dbg(adapter, ERROR,
1659 "Failed to write download cmd to boot code.\n");
1665 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1666 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1667 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1669 mwifiex_dbg(adapter, ERROR,
1670 "Failed to write download cmd to boot code.\n");
1674 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1675 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1676 (u32)((u64)cmd_buf_pa >> 32))) {
1677 mwifiex_dbg(adapter, ERROR,
1678 "Failed to write download cmd to boot code.\n");
1683 /* Write the command length to reg->cmd_size */
1684 if (mwifiex_write_reg(adapter, reg->cmd_size,
1685 card->cmd_buf->len)) {
1686 mwifiex_dbg(adapter, ERROR,
1687 "Failed to write cmd len to reg->cmd_size\n");
1692 /* Ring the door bell */
1693 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1694 CPU_INTR_DOOR_BELL)) {
1695 mwifiex_dbg(adapter, ERROR,
1696 "Failed to assert door-bell intr\n");
1703 adapter->cmd_sent = false;
1709 * This function handles command complete interrupt
1711 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1713 struct pcie_service_card *card = adapter->card;
1714 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1715 struct sk_buff *skb = card->cmdrsp_buf;
1719 mwifiex_dbg(adapter, CMD,
1720 "info: Rx CMD Response\n");
1722 if (adapter->curr_cmd)
1723 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1725 pci_dma_sync_single_for_cpu(card->dev,
1726 MWIFIEX_SKB_DMA_ADDR(skb),
1728 PCI_DMA_FROMDEVICE);
1730 /* Unmap the command as a response has been received. */
1731 if (card->cmd_buf) {
1732 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1734 dev_kfree_skb_any(card->cmd_buf);
1735 card->cmd_buf = NULL;
1738 rx_len = get_unaligned_le16(skb->data);
1739 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1740 skb_trim(skb, rx_len);
1742 if (!adapter->curr_cmd) {
1743 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1744 pci_dma_sync_single_for_device(card->dev,
1745 MWIFIEX_SKB_DMA_ADDR(skb),
1746 MWIFIEX_SLEEP_COOKIE_SIZE,
1747 PCI_DMA_FROMDEVICE);
1748 if (mwifiex_write_reg(adapter,
1750 CPU_INTR_SLEEP_CFM_DONE)) {
1751 mwifiex_dbg(adapter, ERROR,
1752 "Write register failed\n");
1755 mwifiex_delay_for_sleep_cookie(adapter,
1756 MWIFIEX_MAX_DELAY_COUNT);
1757 mwifiex_unmap_pci_memory(adapter, skb,
1758 PCI_DMA_FROMDEVICE);
1759 skb_pull(skb, adapter->intf_hdr_len);
1760 while (reg->sleep_cookie && (count++ < 10) &&
1761 mwifiex_pcie_ok_to_access_hw(adapter))
1762 usleep_range(50, 60);
1763 mwifiex_pcie_enable_host_int(adapter);
1764 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1767 mwifiex_dbg(adapter, ERROR,
1768 "There is no command but got cmdrsp\n");
1770 memcpy(adapter->upld_buf, skb->data,
1771 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1772 skb_push(skb, adapter->intf_hdr_len);
1773 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1774 PCI_DMA_FROMDEVICE))
1776 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1777 skb_pull(skb, adapter->intf_hdr_len);
1778 adapter->curr_cmd->resp_skb = skb;
1779 adapter->cmd_resp_received = true;
1780 /* Take the pointer and set it to CMD node and will
1781 return in the response complete callback */
1782 card->cmdrsp_buf = NULL;
1784 /* Clear the cmd-rsp buffer address in scratch registers. This
1785 will prevent firmware from writing to the same response
1787 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1788 mwifiex_dbg(adapter, ERROR,
1789 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1792 /* Write the upper 32bits of the cmdrsp buffer physical
1794 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1795 mwifiex_dbg(adapter, ERROR,
1796 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1805 * Command Response processing complete handler
1807 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1808 struct sk_buff *skb)
1810 struct pcie_service_card *card = adapter->card;
1813 card->cmdrsp_buf = skb;
1814 skb_push(card->cmdrsp_buf, adapter->intf_hdr_len);
1815 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1816 PCI_DMA_FROMDEVICE))
1824 * This function handles firmware event ready interrupt
1826 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1828 struct pcie_service_card *card = adapter->card;
1829 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1830 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1832 struct mwifiex_evt_buf_desc *desc;
1834 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1835 mwifiex_pm_wakeup_card(adapter);
1837 if (adapter->event_received) {
1838 mwifiex_dbg(adapter, EVENT,
1839 "info: Event being processed,\t"
1840 "do not process this interrupt just yet\n");
1844 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1845 mwifiex_dbg(adapter, ERROR,
1846 "info: Invalid read pointer...\n");
1850 /* Read the event ring write pointer set by firmware */
1851 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1852 mwifiex_dbg(adapter, ERROR,
1853 "EventReady: failed to read reg->evt_wrptr\n");
1857 mwifiex_dbg(adapter, EVENT,
1858 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1859 card->evtbd_rdptr, wrptr);
1860 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1861 & MWIFIEX_EVTBD_MASK)) ||
1862 ((wrptr & reg->evt_rollover_ind) ==
1863 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1864 struct sk_buff *skb_cmd;
1865 __le16 data_len = 0;
1868 mwifiex_dbg(adapter, INFO,
1869 "info: Read Index: %d\n", rdptr);
1870 skb_cmd = card->evt_buf_list[rdptr];
1871 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1873 /* Take the pointer and set it to event pointer in adapter
1874 and will return back after event handling callback */
1875 card->evt_buf_list[rdptr] = NULL;
1876 desc = card->evtbd_ring[rdptr];
1877 memset(desc, 0, sizeof(*desc));
1879 event = get_unaligned_le32(
1880 &skb_cmd->data[adapter->intf_hdr_len]);
1881 adapter->event_cause = event;
1882 /* The first 4bytes will be the event transfer header
1883 len is 2 bytes followed by type which is 2 bytes */
1884 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1885 evt_len = le16_to_cpu(data_len);
1886 skb_trim(skb_cmd, evt_len);
1887 skb_pull(skb_cmd, adapter->intf_hdr_len);
1888 mwifiex_dbg(adapter, EVENT,
1889 "info: Event length: %d\n", evt_len);
1891 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1892 memcpy(adapter->event_body, skb_cmd->data +
1893 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1894 MWIFIEX_EVENT_HEADER_LEN);
1896 adapter->event_received = true;
1897 adapter->event_skb = skb_cmd;
1899 /* Do not update the event read pointer here, wait till the
1900 buffer is released. This is just to make things simpler,
1901 we need to find a better method of managing these buffers.
1904 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1905 CPU_INTR_EVENT_DONE)) {
1906 mwifiex_dbg(adapter, ERROR,
1907 "Write register failed\n");
1916 * Event processing complete handler
1918 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1919 struct sk_buff *skb)
1921 struct pcie_service_card *card = adapter->card;
1922 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1924 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1926 struct mwifiex_evt_buf_desc *desc;
1931 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1932 mwifiex_dbg(adapter, ERROR,
1933 "event_complete: Invalid rdptr 0x%x\n",
1938 /* Read the event ring write pointer set by firmware */
1939 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1940 mwifiex_dbg(adapter, ERROR,
1941 "event_complete: failed to read reg->evt_wrptr\n");
1945 if (!card->evt_buf_list[rdptr]) {
1946 skb_push(skb, adapter->intf_hdr_len);
1947 skb_put(skb, MAX_EVENT_SIZE - skb->len);
1948 if (mwifiex_map_pci_memory(adapter, skb,
1950 PCI_DMA_FROMDEVICE))
1952 card->evt_buf_list[rdptr] = skb;
1953 desc = card->evtbd_ring[rdptr];
1954 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1955 desc->len = (u16)skb->len;
1959 mwifiex_dbg(adapter, ERROR,
1960 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1961 rdptr, card->evt_buf_list[rdptr], skb);
1964 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1965 card->evtbd_rdptr = ((card->evtbd_rdptr &
1966 reg->evt_rollover_ind) ^
1967 reg->evt_rollover_ind);
1970 mwifiex_dbg(adapter, EVENT,
1971 "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1972 card->evtbd_rdptr, wrptr);
1974 /* Write the event ring read pointer in to reg->evt_rdptr */
1975 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1976 card->evtbd_rdptr)) {
1977 mwifiex_dbg(adapter, ERROR,
1978 "event_complete: failed to read reg->evt_rdptr\n");
1982 mwifiex_dbg(adapter, EVENT,
1983 "info: Check Events Again\n");
1984 ret = mwifiex_pcie_process_event_ready(adapter);
1989 /* Combo firmware image is a combination of
1990 * (1) combo crc heaer, start with CMD5
1991 * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1.
1994 * This function bypass the header and bluetooth part, return
1995 * the offset of tail wifi-only part. If the image is already wifi-only,
1996 * that is start with CMD1, return 0.
1999 static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
2000 const void *firmware, u32 firmware_len) {
2001 const struct mwifiex_fw_data *fwdata;
2002 u32 offset = 0, data_len, dnld_cmd;
2004 bool cmd7_before = false, first_cmd = false;
2007 /* Check for integer and buffer overflow */
2008 if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
2009 offset + sizeof(fwdata->header) >= firmware_len) {
2010 mwifiex_dbg(adapter, ERROR,
2011 "extract wifi-only fw failure!\n");
2016 fwdata = firmware + offset;
2017 dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
2018 data_len = le32_to_cpu(fwdata->header.data_length);
2020 /* Skip past header */
2021 offset += sizeof(fwdata->header);
2024 case MWIFIEX_FW_DNLD_CMD_1:
2025 if (offset + data_len < data_len) {
2026 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2031 /* Image start with cmd1, already wifi-only firmware */
2033 mwifiex_dbg(adapter, MSG,
2034 "input wifi-only firmware\n");
2039 mwifiex_dbg(adapter, ERROR,
2040 "no cmd7 before cmd1!\n");
2046 case MWIFIEX_FW_DNLD_CMD_5:
2048 /* Check for integer overflow */
2049 if (offset + data_len < data_len) {
2050 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2056 case MWIFIEX_FW_DNLD_CMD_6:
2058 /* Check for integer overflow */
2059 if (offset + data_len < data_len) {
2060 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2065 if (offset >= firmware_len) {
2066 mwifiex_dbg(adapter, ERROR,
2067 "extract wifi-only fw failure!\n");
2073 case MWIFIEX_FW_DNLD_CMD_7:
2078 mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n",
2090 * This function downloads the firmware to the card.
2092 * Firmware is downloaded to the card in blocks. Every block download
2093 * is tested for CRC errors, and retried a number of times before
2094 * returning failure.
2096 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
2097 struct mwifiex_fw_image *fw)
2100 u8 *firmware = fw->fw_buf;
2101 u32 firmware_len = fw->fw_len;
2103 struct sk_buff *skb;
2104 u32 txlen, tx_blocks = 0, tries, len, val;
2105 u32 block_retry_cnt = 0;
2106 struct pcie_service_card *card = adapter->card;
2107 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2109 if (!firmware || !firmware_len) {
2110 mwifiex_dbg(adapter, ERROR,
2111 "No firmware image found! Terminating download\n");
2115 mwifiex_dbg(adapter, INFO,
2116 "info: Downloading FW image (%d bytes)\n",
2119 if (mwifiex_pcie_disable_host_int(adapter)) {
2120 mwifiex_dbg(adapter, ERROR,
2121 "%s: Disabling interrupts failed.\n", __func__);
2125 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
2131 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val);
2133 mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n");
2137 /* PCIE FLR case: extract wifi part from combo firmware*/
2138 if (val == MWIFIEX_PCIE_FLR_HAPPENS) {
2139 ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len);
2141 mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n");
2145 mwifiex_dbg(adapter, MSG,
2146 "info: dnld wifi firmware from %d bytes\n", offset);
2149 /* Perform firmware data transfer */
2154 if (offset >= firmware_len)
2157 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2158 ret = mwifiex_read_reg(adapter, reg->cmd_size,
2161 mwifiex_dbg(adapter, FATAL,
2162 "Failed reading len from boot code\n");
2167 usleep_range(10, 20);
2172 } else if (len > MWIFIEX_UPLD_SIZE) {
2173 mwifiex_dbg(adapter, ERROR,
2174 "FW download failure @ %d, invalid length %d\n",
2184 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
2185 mwifiex_dbg(adapter, ERROR,
2186 "FW download failure @ %d, over max\t"
2187 "retry count\n", offset);
2191 mwifiex_dbg(adapter, ERROR,
2192 "FW CRC error indicated by the\t"
2193 "helper: len = 0x%04X, txlen = %d\n",
2196 /* Setting this to 0 to resend from same offset */
2199 block_retry_cnt = 0;
2200 /* Set blocksize to transfer - checking for
2202 if (firmware_len - offset < txlen)
2203 txlen = firmware_len - offset;
2205 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
2206 card->pcie.blksz_fw_dl;
2208 /* Copy payload to buffer */
2209 memmove(skb->data, &firmware[offset], txlen);
2212 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
2213 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
2215 /* Send the boot command to device */
2216 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
2217 mwifiex_dbg(adapter, ERROR,
2218 "Failed to send firmware download command\n");
2223 /* Wait for the command done interrupt */
2224 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2225 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
2227 mwifiex_dbg(adapter, ERROR,
2228 "%s: Failed to read\t"
2229 "interrupt status during fw dnld.\n",
2231 mwifiex_unmap_pci_memory(adapter, skb,
2236 if (!(ireg_intr & CPU_INTR_DOOR_BELL))
2238 usleep_range(10, 20);
2240 if (ireg_intr & CPU_INTR_DOOR_BELL) {
2241 mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
2243 mwifiex_unmap_pci_memory(adapter, skb,
2249 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
2254 mwifiex_dbg(adapter, MSG,
2255 "info: FW download over, size %d bytes\n", offset);
2260 dev_kfree_skb_any(skb);
2265 * This function checks the firmware status in card.
2268 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2272 struct pcie_service_card *card = adapter->card;
2273 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2276 /* Mask spurios interrupts */
2277 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2279 mwifiex_dbg(adapter, ERROR,
2280 "Write register failed\n");
2284 mwifiex_dbg(adapter, INFO,
2285 "Setting driver ready signature\n");
2286 if (mwifiex_write_reg(adapter, reg->drv_rdy,
2287 FIRMWARE_READY_PCIE)) {
2288 mwifiex_dbg(adapter, ERROR,
2289 "Failed to write driver ready signature\n");
2293 /* Wait for firmware initialization event */
2294 for (tries = 0; tries < poll_num; tries++) {
2295 if (mwifiex_read_reg(adapter, reg->fw_status,
2301 mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>",
2302 tries, ret, firmware_stat);
2306 if (firmware_stat == FIRMWARE_READY_PCIE) {
2318 /* This function checks if WLAN is the winner.
2321 mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
2325 struct pcie_service_card *card = adapter->card;
2326 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2328 if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) {
2330 } else if (!winner) {
2331 mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n");
2332 adapter->winner = 1;
2334 mwifiex_dbg(adapter, ERROR,
2335 "PCI-E is not the winner <%#x>", winner);
2342 * This function reads the interrupt status from card.
2344 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
2348 unsigned long flags;
2349 struct pcie_service_card *card = adapter->card;
2351 if (card->msi_enable) {
2352 spin_lock_irqsave(&adapter->int_lock, flags);
2353 adapter->int_status = 1;
2354 spin_unlock_irqrestore(&adapter->int_lock, flags);
2358 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2361 if (card->msix_enable && msg_id >= 0) {
2362 pcie_ireg = BIT(msg_id);
2364 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2366 mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2370 if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg)
2374 mwifiex_pcie_disable_host_int(adapter);
2376 /* Clear the pending interrupts */
2377 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2379 mwifiex_dbg(adapter, ERROR,
2380 "Write register failed\n");
2385 if (!adapter->pps_uapsd_mode &&
2386 adapter->ps_state == PS_STATE_SLEEP &&
2387 mwifiex_pcie_ok_to_access_hw(adapter)) {
2388 /* Potentially for PCIe we could get other
2389 * interrupts like shared. Don't change power
2390 * state until cookie is set
2392 adapter->ps_state = PS_STATE_AWAKE;
2393 adapter->pm_wakeup_fw_try = false;
2394 del_timer(&adapter->wakeup_timer);
2397 spin_lock_irqsave(&adapter->int_lock, flags);
2398 adapter->int_status |= pcie_ireg;
2399 spin_unlock_irqrestore(&adapter->int_lock, flags);
2400 mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
2404 * Interrupt handler for PCIe root port
2406 * This function reads the interrupt status from firmware and assigns
2407 * the main process in workqueue which will handle the interrupt.
2409 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2411 struct mwifiex_msix_context *ctx = context;
2412 struct pci_dev *pdev = ctx->dev;
2413 struct pcie_service_card *card;
2414 struct mwifiex_adapter *adapter;
2416 card = pci_get_drvdata(pdev);
2418 if (!card->adapter) {
2419 pr_err("info: %s: card=%p adapter=%p\n", __func__, card,
2420 card ? card->adapter : NULL);
2423 adapter = card->adapter;
2425 if (adapter->surprise_removed)
2428 if (card->msix_enable)
2429 mwifiex_interrupt_status(adapter, ctx->msg_id);
2431 mwifiex_interrupt_status(adapter, -1);
2433 mwifiex_queue_main_work(adapter);
2440 * This function checks the current interrupt status.
2442 * The following interrupts are checked and handled by this function -
2445 * - Command received
2446 * - Packets received
2449 * In case of Rx packets received, the packets are uploaded from card to
2450 * host and processed accordingly.
2452 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2456 unsigned long flags;
2457 struct pcie_service_card *card = adapter->card;
2459 spin_lock_irqsave(&adapter->int_lock, flags);
2460 if (!card->msi_enable) {
2461 /* Clear out unused interrupts */
2462 pcie_ireg = adapter->int_status;
2464 adapter->int_status = 0;
2465 spin_unlock_irqrestore(&adapter->int_lock, flags);
2467 if (card->msi_enable) {
2468 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2469 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2471 mwifiex_dbg(adapter, ERROR,
2472 "Read register failed\n");
2476 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2477 if (mwifiex_write_reg(adapter,
2478 PCIE_HOST_INT_STATUS,
2480 mwifiex_dbg(adapter, ERROR,
2481 "Write register failed\n");
2484 if (!adapter->pps_uapsd_mode &&
2485 adapter->ps_state == PS_STATE_SLEEP) {
2486 adapter->ps_state = PS_STATE_AWAKE;
2487 adapter->pm_wakeup_fw_try = false;
2488 del_timer(&adapter->wakeup_timer);
2494 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2495 mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n");
2496 ret = mwifiex_pcie_send_data_complete(adapter);
2500 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2501 mwifiex_dbg(adapter, INTR, "info: Rx DATA\n");
2502 ret = mwifiex_pcie_process_recv_data(adapter);
2506 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2507 mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n");
2508 ret = mwifiex_pcie_process_event_ready(adapter);
2512 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2513 if (adapter->cmd_sent) {
2514 mwifiex_dbg(adapter, INTR,
2515 "info: CMD sent Interrupt\n");
2516 adapter->cmd_sent = false;
2518 /* Handle command response */
2519 ret = mwifiex_pcie_process_cmd_complete(adapter);
2524 mwifiex_dbg(adapter, INTR,
2525 "info: cmd_sent=%d data_sent=%d\n",
2526 adapter->cmd_sent, adapter->data_sent);
2527 if (!card->msi_enable && !card->msix_enable &&
2528 adapter->ps_state != PS_STATE_SLEEP)
2529 mwifiex_pcie_enable_host_int(adapter);
2535 * This function downloads data from driver to card.
2537 * Both commands and data packets are transferred to the card by this
2540 * This function adds the PCIE specific header to the front of the buffer
2541 * before transferring. The header contains the length of the packet and
2542 * the type. The firmware handles the packets based upon this set type.
2544 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2545 struct sk_buff *skb,
2546 struct mwifiex_tx_param *tx_param)
2549 mwifiex_dbg(adapter, ERROR,
2550 "Passed NULL skb to %s\n", __func__);
2554 if (type == MWIFIEX_TYPE_DATA)
2555 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2556 else if (type == MWIFIEX_TYPE_CMD)
2557 return mwifiex_pcie_send_cmd(adapter, skb);
2562 /* Function to dump PCIE scratch registers in case of FW crash
2565 mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
2568 char buf[256], *ptr;
2571 struct pcie_service_card *card = adapter->card;
2572 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2573 int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
2574 PCIE_SCRATCH_14_REG,
2575 PCIE_SCRATCH_15_REG};
2580 mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
2582 if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
2583 mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
2588 mwifiex_dbg(adapter, MSG, "pcie scratch register:");
2589 for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
2590 mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
2591 ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
2592 pcie_scratch_reg[i], value);
2595 mwifiex_dbg(adapter, MSG, "%s\n", buf);
2596 p += sprintf(p, "%s\n", buf);
2598 mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
2603 /* This function read/write firmware */
2604 static enum rdwr_status
2605 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2610 struct pcie_service_card *card = adapter->card;
2611 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2613 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
2614 return RDWR_STATUS_FAILURE;
2616 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2617 reg->fw_dump_host_ready);
2619 mwifiex_dbg(adapter, ERROR,
2620 "PCIE write err\n");
2621 return RDWR_STATUS_FAILURE;
2624 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2625 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2626 if (ctrl_data == FW_DUMP_DONE)
2627 return RDWR_STATUS_SUCCESS;
2628 if (doneflag && ctrl_data == doneflag)
2629 return RDWR_STATUS_DONE;
2630 if (ctrl_data != reg->fw_dump_host_ready) {
2631 mwifiex_dbg(adapter, WARN,
2632 "The ctrl reg was changed, re-try again!\n");
2633 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2634 reg->fw_dump_host_ready);
2636 mwifiex_dbg(adapter, ERROR,
2637 "PCIE write err\n");
2638 return RDWR_STATUS_FAILURE;
2641 usleep_range(100, 200);
2644 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2645 return RDWR_STATUS_FAILURE;
2648 /* This function dump firmware memory to file */
2649 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2651 struct pcie_service_card *card = adapter->card;
2652 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2653 unsigned int reg, reg_start, reg_end;
2654 u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
2655 u8 idx, i, read_reg, doneflag = 0;
2656 enum rdwr_status stat;
2660 if (!card->pcie.can_dump_fw)
2663 for (idx = 0; idx < adapter->num_mem_types; idx++) {
2664 struct memory_type_mapping *entry =
2665 &adapter->mem_type_mapping_tbl[idx];
2667 if (entry->mem_ptr) {
2668 vfree(entry->mem_ptr);
2669 entry->mem_ptr = NULL;
2671 entry->mem_size = 0;
2674 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
2676 /* Read the number of the memories which will dump */
2677 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2678 if (stat == RDWR_STATUS_FAILURE)
2681 reg = creg->fw_dump_start;
2682 mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
2684 /* W8997 chipset firmware dump will be restore in single region*/
2685 if (fw_dump_num == 0)
2688 dump_num = fw_dump_num;
2690 /* Read the length of every memory which will dump */
2691 for (idx = 0; idx < dump_num; idx++) {
2692 struct memory_type_mapping *entry =
2693 &adapter->mem_type_mapping_tbl[idx];
2695 if (fw_dump_num != 0) {
2696 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2697 if (stat == RDWR_STATUS_FAILURE)
2700 reg = creg->fw_dump_start;
2701 for (i = 0; i < 4; i++) {
2702 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2703 memory_size |= (read_reg << (i * 8));
2707 memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
2710 if (memory_size == 0) {
2711 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2712 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2713 creg->fw_dump_read_done);
2715 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2721 mwifiex_dbg(adapter, DUMP,
2722 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2723 entry->mem_ptr = vmalloc(memory_size + 1);
2724 entry->mem_size = memory_size;
2725 if (!entry->mem_ptr) {
2726 mwifiex_dbg(adapter, ERROR,
2727 "Vmalloc %s failed\n", entry->mem_name);
2730 dbg_ptr = entry->mem_ptr;
2731 end_ptr = dbg_ptr + memory_size;
2733 doneflag = entry->done_flag;
2734 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2738 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2739 if (RDWR_STATUS_FAILURE == stat)
2742 reg_start = creg->fw_dump_start;
2743 reg_end = creg->fw_dump_end;
2744 for (reg = reg_start; reg <= reg_end; reg++) {
2745 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2746 if (dbg_ptr < end_ptr) {
2750 mwifiex_dbg(adapter, ERROR,
2751 "pre-allocated buf not enough\n");
2753 vzalloc(memory_size + MWIFIEX_SIZE_4K);
2756 memcpy(tmp_ptr, entry->mem_ptr, memory_size);
2757 vfree(entry->mem_ptr);
2758 entry->mem_ptr = tmp_ptr;
2760 dbg_ptr = entry->mem_ptr + memory_size;
2761 memory_size += MWIFIEX_SIZE_4K;
2762 end_ptr = entry->mem_ptr + memory_size;
2765 if (stat != RDWR_STATUS_DONE)
2768 mwifiex_dbg(adapter, DUMP,
2769 "%s done: size=0x%tx\n",
2770 entry->mem_name, dbg_ptr - entry->mem_ptr);
2774 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
2777 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2782 drv_info_size = mwifiex_drv_info_dump(adapter, &drv_info);
2783 mwifiex_pcie_fw_dump(adapter);
2784 mwifiex_upload_device_dump(adapter, drv_info, drv_info_size);
2787 static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter)
2789 struct pcie_service_card *card = adapter->card;
2791 /* We can't afford to wait here; remove() might be waiting on us. If we
2792 * can't grab the device lock, maybe we'll get another chance later.
2794 pci_try_reset_function(card->dev);
2797 static void mwifiex_pcie_work(struct work_struct *work)
2799 struct pcie_service_card *card =
2800 container_of(work, struct pcie_service_card, work);
2802 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2804 mwifiex_pcie_device_dump_work(card->adapter);
2805 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
2807 mwifiex_pcie_card_reset_work(card->adapter);
2810 /* This function dumps FW information */
2811 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2813 struct pcie_service_card *card = adapter->card;
2815 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2817 schedule_work(&card->work);
2820 static void mwifiex_pcie_card_reset(struct mwifiex_adapter *adapter)
2822 struct pcie_service_card *card = adapter->card;
2824 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags))
2825 schedule_work(&card->work);
2828 static int mwifiex_pcie_alloc_buffers(struct mwifiex_adapter *adapter)
2830 struct pcie_service_card *card = adapter->card;
2831 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2834 card->cmdrsp_buf = NULL;
2835 ret = mwifiex_pcie_create_txbd_ring(adapter);
2837 mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n");
2841 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2843 mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n");
2847 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2849 mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n");
2853 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2855 mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n");
2856 goto err_alloc_cmdbuf;
2859 if (reg->sleep_cookie) {
2860 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2862 mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n");
2863 goto err_alloc_cookie;
2866 card->sleep_cookie_vbase = NULL;
2872 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2874 mwifiex_pcie_delete_evtbd_ring(adapter);
2876 mwifiex_pcie_delete_rxbd_ring(adapter);
2878 mwifiex_pcie_delete_txbd_ring(adapter);
2883 static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter)
2885 struct pcie_service_card *card = adapter->card;
2886 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2888 if (reg->sleep_cookie)
2889 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2891 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2892 mwifiex_pcie_delete_evtbd_ring(adapter);
2893 mwifiex_pcie_delete_rxbd_ring(adapter);
2894 mwifiex_pcie_delete_txbd_ring(adapter);
2898 * This function initializes the PCI-E host memory space, WCB rings, etc.
2900 static int mwifiex_init_pcie(struct mwifiex_adapter *adapter)
2902 struct pcie_service_card *card = adapter->card;
2904 struct pci_dev *pdev = card->dev;
2906 pci_set_drvdata(pdev, card);
2908 ret = pci_enable_device(pdev);
2910 goto err_enable_dev;
2912 pci_set_master(pdev);
2914 pr_notice("try set_consistent_dma_mask(32)\n");
2915 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2917 pr_err("set_dma_mask(32) failed\n");
2918 goto err_set_dma_mask;
2921 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2923 pr_err("set_consistent_dma_mask(64) failed\n");
2924 goto err_set_dma_mask;
2927 ret = pci_request_region(pdev, 0, DRV_NAME);
2929 pr_err("req_reg(0) error\n");
2930 goto err_req_region0;
2932 card->pci_mmap = pci_iomap(pdev, 0, 0);
2933 if (!card->pci_mmap) {
2934 pr_err("iomap(0) error\n");
2938 ret = pci_request_region(pdev, 2, DRV_NAME);
2940 pr_err("req_reg(2) error\n");
2941 goto err_req_region2;
2943 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2944 if (!card->pci_mmap1) {
2945 pr_err("iomap(2) error\n");
2950 pr_notice("PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2951 card->pci_mmap, card->pci_mmap1);
2953 ret = mwifiex_pcie_alloc_buffers(adapter);
2955 goto err_alloc_buffers;
2960 pci_iounmap(pdev, card->pci_mmap1);
2962 pci_release_region(pdev, 2);
2964 pci_iounmap(pdev, card->pci_mmap);
2966 pci_release_region(pdev, 0);
2969 pci_disable_device(pdev);
2975 * This function cleans up the allocated card buffers.
2977 static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter)
2979 struct pcie_service_card *card = adapter->card;
2980 struct pci_dev *pdev = card->dev;
2981 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2985 /* Perform the cancel_work_sync() only when we're not resetting
2986 * the card. It's because that function never returns if we're
2987 * in reset path. If we're here when resetting the card, it means
2988 * that we failed to reset the card (reset failure path).
2990 if (!card->pci_reset_ongoing) {
2991 mwifiex_dbg(adapter, MSG, "performing cancel_work_sync()...\n");
2992 cancel_work_sync(&card->work);
2993 mwifiex_dbg(adapter, MSG, "cancel_work_sync() done\n");
2995 mwifiex_dbg(adapter, MSG,
2996 "skipped cancel_work_sync() because we're in card reset failure path\n");
2999 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
3000 if (fw_status == FIRMWARE_READY_PCIE) {
3001 mwifiex_dbg(adapter, INFO,
3002 "Clearing driver ready signature\n");
3003 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3004 mwifiex_dbg(adapter, ERROR,
3005 "Failed to write driver not-ready signature\n");
3008 pci_disable_device(pdev);
3010 pci_iounmap(pdev, card->pci_mmap);
3011 pci_iounmap(pdev, card->pci_mmap1);
3012 pci_release_region(pdev, 2);
3013 pci_release_region(pdev, 0);
3015 mwifiex_pcie_free_buffers(adapter);
3018 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
3021 struct pcie_service_card *card = adapter->card;
3022 struct pci_dev *pdev = card->dev;
3024 if (card->pcie.reg->msix_support) {
3025 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3026 card->msix_entries[i].entry = i;
3027 ret = pci_enable_msix_exact(pdev, card->msix_entries,
3028 MWIFIEX_NUM_MSIX_VECTORS);
3030 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) {
3031 card->msix_ctx[i].dev = pdev;
3032 card->msix_ctx[i].msg_id = i;
3034 ret = request_irq(card->msix_entries[i].vector,
3035 mwifiex_pcie_interrupt, 0,
3036 "MWIFIEX_PCIE_MSIX",
3037 &card->msix_ctx[i]);
3043 mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n",
3045 for (j = 0; j < i; j++)
3046 free_irq(card->msix_entries[j].vector,
3047 &card->msix_ctx[i]);
3048 pci_disable_msix(pdev);
3050 mwifiex_dbg(adapter, MSG, "MSIx enabled!");
3051 card->msix_enable = 1;
3057 if (pci_enable_msi(pdev) != 0)
3058 pci_disable_msi(pdev);
3060 card->msi_enable = 1;
3062 mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
3064 card->share_irq_ctx.dev = pdev;
3065 card->share_irq_ctx.msg_id = -1;
3066 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
3067 "MRVL_PCIE", &card->share_irq_ctx);
3069 pr_err("request_irq failed: ret=%d\n", ret);
3077 * This function gets the firmware name for downloading by revision id
3079 * Read revision id register to get revision id
3081 static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter)
3083 int revision_id = 0;
3085 struct pcie_service_card *card = adapter->card;
3087 switch (card->dev->device) {
3088 case PCIE_DEVICE_ID_MARVELL_88W8766P:
3089 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
3091 case PCIE_DEVICE_ID_MARVELL_88W8897:
3092 mwifiex_write_reg(adapter, 0x0c58, 0x80c00000);
3093 mwifiex_read_reg(adapter, 0x0c58, &revision_id);
3094 revision_id &= 0xff00;
3095 switch (revision_id) {
3097 strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME);
3100 strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME);
3103 strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME);
3108 case PCIE_DEVICE_ID_MARVELL_88W8997:
3109 mwifiex_read_reg(adapter, 0x8, &revision_id);
3110 mwifiex_read_reg(adapter, 0x0cd0, &version);
3111 mwifiex_read_reg(adapter, 0x0cd4, &magic);
3112 revision_id &= 0xff;
3115 if (revision_id == PCIE8997_A1 &&
3116 magic == CHIP_MAGIC_VALUE &&
3117 version == CHIP_VER_PCIEUART)
3118 strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4);
3120 strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4);
3128 * This function registers the PCIE device.
3130 * PCIE IRQ is claimed, block size is set and driver data is initialized.
3132 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
3134 struct pcie_service_card *card = adapter->card;
3136 /* save adapter pointer in card */
3137 card->adapter = adapter;
3139 if (mwifiex_pcie_request_irq(adapter))
3142 adapter->tx_buf_size = card->pcie.tx_buf_size;
3143 adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
3144 adapter->num_mem_types = card->pcie.num_mem_types;
3145 adapter->ext_scan = card->pcie.can_ext_scan;
3146 mwifiex_pcie_get_fw_name(adapter);
3152 * This function unregisters the PCIE device.
3154 * The PCIE IRQ is released, the function is disabled and driver
3155 * data is set to null.
3157 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
3159 struct pcie_service_card *card = adapter->card;
3160 struct pci_dev *pdev = card->dev;
3163 if (card->msix_enable) {
3164 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3165 synchronize_irq(card->msix_entries[i].vector);
3167 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3168 free_irq(card->msix_entries[i].vector,
3169 &card->msix_ctx[i]);
3171 card->msix_enable = 0;
3172 pci_disable_msix(pdev);
3174 mwifiex_dbg(adapter, INFO,
3175 "%s(): calling free_irq()\n", __func__);
3176 free_irq(card->dev->irq, &card->share_irq_ctx);
3178 if (card->msi_enable)
3179 pci_disable_msi(pdev);
3181 card->adapter = NULL;
3185 * This function initializes the PCI-E host memory space, WCB rings, etc.,
3186 * similar to mwifiex_init_pcie(), but without resetting PCI-E state.
3188 static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter)
3190 struct pcie_service_card *card = adapter->card;
3191 struct pci_dev *pdev = card->dev;
3193 /* tx_buf_size might be changed to 3584 by firmware during
3194 * data transfer, we should reset it to default size.
3196 adapter->tx_buf_size = card->pcie.tx_buf_size;
3198 mwifiex_pcie_alloc_buffers(adapter);
3200 pci_set_master(pdev);
3203 /* This function cleans up the PCI-E host memory space. */
3204 static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter)
3206 struct pcie_service_card *card = adapter->card;
3207 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3208 struct pci_dev *pdev = card->dev;
3210 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3211 mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n");
3213 pci_clear_master(pdev);
3215 adapter->seq_num = 0;
3217 mwifiex_pcie_free_buffers(adapter);
3220 static struct mwifiex_if_ops pcie_ops = {
3221 .init_if = mwifiex_init_pcie,
3222 .cleanup_if = mwifiex_cleanup_pcie,
3223 .check_fw_status = mwifiex_check_fw_status,
3224 .check_winner_status = mwifiex_check_winner_status,
3225 .prog_fw = mwifiex_prog_fw_w_helper,
3226 .register_dev = mwifiex_register_dev,
3227 .unregister_dev = mwifiex_unregister_dev,
3228 .enable_int = mwifiex_pcie_enable_host_int,
3229 .disable_int = mwifiex_pcie_disable_host_int_noerr,
3230 .process_int_status = mwifiex_process_int_status,
3231 .host_to_card = mwifiex_pcie_host_to_card,
3232 .wakeup = mwifiex_pm_wakeup_card,
3233 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
3236 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
3237 .event_complete = mwifiex_pcie_event_complete,
3238 .update_mp_end_port = NULL,
3239 .cleanup_mpa_buf = NULL,
3240 .init_fw_port = mwifiex_pcie_init_fw_port,
3241 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
3242 .card_reset = mwifiex_pcie_card_reset,
3243 .reg_dump = mwifiex_pcie_reg_dump,
3244 .device_dump = mwifiex_pcie_device_dump,
3245 .down_dev = mwifiex_pcie_down_dev,
3246 .up_dev = mwifiex_pcie_up_dev,
3249 module_pci_driver(mwifiex_pcie);
3251 MODULE_AUTHOR("Marvell International Ltd.");
3252 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
3253 MODULE_VERSION(PCIE_VERSION);
3254 MODULE_LICENSE("GPL v2");