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);
349 static void mwifiex_pcie_reset_notify(struct pci_dev *pdev, bool prepare)
351 struct pcie_service_card *card = pci_get_drvdata(pdev);
352 struct mwifiex_adapter *adapter = card->adapter;
356 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
361 mwifiex_dbg(adapter, INFO,
362 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d %s\n",
363 __func__, pdev->vendor, pdev->device,
365 prepare ? "Pre-FLR" : "Post-FLR");
368 /* Kernel would be performing FLR after this notification.
369 * Cleanup all software without cleaning anything related to
372 mwifiex_shutdown_sw(adapter);
373 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
374 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
376 /* Kernel stores and restores PCIe function context before and
377 * after performing FLR respectively. Reconfigure the software
378 * and firmware including firmware redownload
380 ret = mwifiex_reinit_sw(adapter);
382 dev_err(&pdev->dev, "reinit failed: %d\n", ret);
386 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
389 static const struct pci_error_handlers mwifiex_pcie_err_handler[] = {
390 { .reset_notify = mwifiex_pcie_reset_notify, },
393 #ifdef CONFIG_PM_SLEEP
394 /* Power Management Hooks */
395 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
396 mwifiex_pcie_resume);
399 /* PCI Device Driver */
400 static struct pci_driver __refdata mwifiex_pcie = {
401 .name = "mwifiex_pcie",
402 .id_table = mwifiex_ids,
403 .probe = mwifiex_pcie_probe,
404 .remove = mwifiex_pcie_remove,
405 #ifdef CONFIG_PM_SLEEP
407 .pm = &mwifiex_pcie_pm_ops,
410 .shutdown = mwifiex_pcie_shutdown,
411 .err_handler = mwifiex_pcie_err_handler,
415 * This function adds delay loop to ensure FW is awake before proceeding.
417 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
421 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
423 usleep_range(10, 20);
432 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
433 u32 max_delay_loop_cnt)
435 struct pcie_service_card *card = adapter->card;
437 u32 sleep_cookie, count;
438 struct sk_buff *cmdrsp = card->cmdrsp_buf;
440 for (count = 0; count < max_delay_loop_cnt; count++) {
441 pci_dma_sync_single_for_cpu(card->dev,
442 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
443 sizeof(sleep_cookie),
445 buffer = cmdrsp->data;
446 sleep_cookie = get_unaligned_le32(buffer);
448 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
449 mwifiex_dbg(adapter, INFO,
450 "sleep cookie found at count %d\n", count);
453 pci_dma_sync_single_for_device(card->dev,
454 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
455 sizeof(sleep_cookie),
457 usleep_range(20, 30);
460 if (count >= max_delay_loop_cnt)
461 mwifiex_dbg(adapter, INFO,
462 "max count reached while accessing sleep cookie\n");
465 /* This function wakes up the card by reading fw_status register. */
466 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
468 struct pcie_service_card *card = adapter->card;
469 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
471 mwifiex_dbg(adapter, EVENT,
472 "event: Wakeup device...\n");
474 if (reg->sleep_cookie)
475 mwifiex_pcie_dev_wakeup_delay(adapter);
477 /* Accessing fw_status register will wakeup device */
478 if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
479 mwifiex_dbg(adapter, ERROR,
480 "Writing fw_status register failed\n");
484 if (reg->sleep_cookie) {
485 mwifiex_pcie_dev_wakeup_delay(adapter);
486 mwifiex_dbg(adapter, INFO,
487 "PCIE wakeup: Setting PS_STATE_AWAKE\n");
488 adapter->ps_state = PS_STATE_AWAKE;
495 * This function is called after the card has woken up.
497 * The card configuration register is reset.
499 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
501 mwifiex_dbg(adapter, CMD,
502 "cmd: Wakeup device completed\n");
508 * This function disables the host interrupt.
510 * The host interrupt mask is read, the disable bit is reset and
511 * written back to the card host interrupt mask register.
513 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
515 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
516 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
518 mwifiex_dbg(adapter, ERROR,
519 "Disable host interrupt failed\n");
524 atomic_set(&adapter->tx_hw_pending, 0);
528 static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter)
530 WARN_ON(mwifiex_pcie_disable_host_int(adapter));
534 * This function enables the host interrupt.
536 * The host interrupt enable mask is written to the card
537 * host interrupt mask register.
539 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
541 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
542 /* Simply write the mask to the register */
543 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
545 mwifiex_dbg(adapter, ERROR,
546 "Enable host interrupt failed\n");
555 * This function initializes TX buffer ring descriptors
557 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
559 struct pcie_service_card *card = adapter->card;
560 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
561 struct mwifiex_pcie_buf_desc *desc;
562 struct mwifiex_pfu_buf_desc *desc2;
565 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
566 card->tx_buf_list[i] = NULL;
567 if (reg->pfu_enabled) {
568 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
569 (sizeof(*desc2) * i);
570 desc2 = card->txbd_ring[i];
571 memset(desc2, 0, sizeof(*desc2));
573 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
575 desc = card->txbd_ring[i];
576 memset(desc, 0, sizeof(*desc));
583 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
584 * here and after mapping PCI memory, its physical address is assigned to
585 * PCIE Rx buffer descriptor's physical address.
587 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
589 struct pcie_service_card *card = adapter->card;
590 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
592 struct mwifiex_pcie_buf_desc *desc;
593 struct mwifiex_pfu_buf_desc *desc2;
597 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
598 /* Allocate skb here so that firmware can DMA data from it */
599 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
602 mwifiex_dbg(adapter, ERROR,
603 "Unable to allocate skb for RX ring.\n");
604 kfree(card->rxbd_ring_vbase);
608 if (mwifiex_map_pci_memory(adapter, skb,
609 MWIFIEX_RX_DATA_BUF_SIZE,
613 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
615 mwifiex_dbg(adapter, INFO,
616 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
617 skb, skb->len, skb->data, (u32)buf_pa,
618 (u32)((u64)buf_pa >> 32));
620 card->rx_buf_list[i] = skb;
621 if (reg->pfu_enabled) {
622 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
623 (sizeof(*desc2) * i);
624 desc2 = card->rxbd_ring[i];
625 desc2->paddr = buf_pa;
626 desc2->len = (u16)skb->len;
627 desc2->frag_len = (u16)skb->len;
628 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
631 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
632 (sizeof(*desc) * i));
633 desc = card->rxbd_ring[i];
634 desc->paddr = buf_pa;
635 desc->len = (u16)skb->len;
643 /* This function initializes event buffer ring descriptors. Each SKB is
644 * allocated here and after mapping PCI memory, its physical address is assigned
645 * to PCIE Rx buffer descriptor's physical address
647 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
649 struct pcie_service_card *card = adapter->card;
650 struct mwifiex_evt_buf_desc *desc;
655 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
656 /* Allocate skb here so that firmware can DMA data from it */
657 skb = dev_alloc_skb(MAX_EVENT_SIZE);
659 mwifiex_dbg(adapter, ERROR,
660 "Unable to allocate skb for EVENT buf.\n");
661 kfree(card->evtbd_ring_vbase);
664 skb_put(skb, MAX_EVENT_SIZE);
666 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
670 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
672 mwifiex_dbg(adapter, EVENT,
673 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
674 skb, skb->len, skb->data, (u32)buf_pa,
675 (u32)((u64)buf_pa >> 32));
677 card->evt_buf_list[i] = skb;
678 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
679 (sizeof(*desc) * i));
680 desc = card->evtbd_ring[i];
681 desc->paddr = buf_pa;
682 desc->len = (u16)skb->len;
689 /* This function cleans up TX buffer rings. If any of the buffer list has valid
690 * SKB address, associated SKB is freed.
692 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
694 struct pcie_service_card *card = adapter->card;
695 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
697 struct mwifiex_pcie_buf_desc *desc;
698 struct mwifiex_pfu_buf_desc *desc2;
701 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
702 if (reg->pfu_enabled) {
703 desc2 = card->txbd_ring[i];
704 if (card->tx_buf_list[i]) {
705 skb = card->tx_buf_list[i];
706 mwifiex_unmap_pci_memory(adapter, skb,
708 dev_kfree_skb_any(skb);
710 memset(desc2, 0, sizeof(*desc2));
712 desc = card->txbd_ring[i];
713 if (card->tx_buf_list[i]) {
714 skb = card->tx_buf_list[i];
715 mwifiex_unmap_pci_memory(adapter, skb,
717 dev_kfree_skb_any(skb);
719 memset(desc, 0, sizeof(*desc));
721 card->tx_buf_list[i] = NULL;
724 atomic_set(&adapter->tx_hw_pending, 0);
728 /* This function cleans up RX buffer rings. If any of the buffer list has valid
729 * SKB address, associated SKB is freed.
731 static void mwifiex_cleanup_rxq_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;
740 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
741 if (reg->pfu_enabled) {
742 desc2 = card->rxbd_ring[i];
743 if (card->rx_buf_list[i]) {
744 skb = card->rx_buf_list[i];
745 mwifiex_unmap_pci_memory(adapter, skb,
747 dev_kfree_skb_any(skb);
749 memset(desc2, 0, sizeof(*desc2));
751 desc = card->rxbd_ring[i];
752 if (card->rx_buf_list[i]) {
753 skb = card->rx_buf_list[i];
754 mwifiex_unmap_pci_memory(adapter, skb,
756 dev_kfree_skb_any(skb);
758 memset(desc, 0, sizeof(*desc));
760 card->rx_buf_list[i] = NULL;
766 /* This function cleans up event buffer rings. If any of the buffer list has
767 * valid SKB address, associated SKB is freed.
769 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
771 struct pcie_service_card *card = adapter->card;
772 struct mwifiex_evt_buf_desc *desc;
776 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
777 desc = card->evtbd_ring[i];
778 if (card->evt_buf_list[i]) {
779 skb = card->evt_buf_list[i];
780 mwifiex_unmap_pci_memory(adapter, skb,
782 dev_kfree_skb_any(skb);
784 card->evt_buf_list[i] = NULL;
785 memset(desc, 0, sizeof(*desc));
791 /* This function creates buffer descriptor ring for TX
793 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
795 struct pcie_service_card *card = adapter->card;
796 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
799 * driver maintaines the write pointer and firmware maintaines the read
800 * pointer. The write pointer starts at 0 (zero) while the read pointer
801 * starts at zero with rollover bit set
803 card->txbd_wrptr = 0;
805 if (reg->pfu_enabled)
806 card->txbd_rdptr = 0;
808 card->txbd_rdptr |= reg->tx_rollover_ind;
810 /* allocate shared memory for the BD ring and divide the same in to
811 several descriptors */
812 if (reg->pfu_enabled)
813 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
816 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
819 mwifiex_dbg(adapter, INFO,
820 "info: txbd_ring: Allocating %d bytes\n",
821 card->txbd_ring_size);
822 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
823 card->txbd_ring_size,
824 &card->txbd_ring_pbase);
825 if (!card->txbd_ring_vbase) {
826 mwifiex_dbg(adapter, ERROR,
827 "allocate consistent memory (%d bytes) failed!\n",
828 card->txbd_ring_size);
831 mwifiex_dbg(adapter, DATA,
832 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
833 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
834 (u32)((u64)card->txbd_ring_pbase >> 32),
835 card->txbd_ring_size);
837 return mwifiex_init_txq_ring(adapter);
840 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
842 struct pcie_service_card *card = adapter->card;
843 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
845 mwifiex_cleanup_txq_ring(adapter);
847 if (card->txbd_ring_vbase)
848 pci_free_consistent(card->dev, card->txbd_ring_size,
849 card->txbd_ring_vbase,
850 card->txbd_ring_pbase);
851 card->txbd_ring_size = 0;
852 card->txbd_wrptr = 0;
853 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
854 card->txbd_ring_vbase = NULL;
855 card->txbd_ring_pbase = 0;
861 * This function creates buffer descriptor ring for RX
863 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
865 struct pcie_service_card *card = adapter->card;
866 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
869 * driver maintaines the read pointer and firmware maintaines the write
870 * pointer. The write pointer starts at 0 (zero) while the read pointer
871 * starts at zero with rollover bit set
873 card->rxbd_wrptr = 0;
874 card->rxbd_rdptr = reg->rx_rollover_ind;
876 if (reg->pfu_enabled)
877 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
880 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
883 mwifiex_dbg(adapter, INFO,
884 "info: rxbd_ring: Allocating %d bytes\n",
885 card->rxbd_ring_size);
886 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
887 card->rxbd_ring_size,
888 &card->rxbd_ring_pbase);
889 if (!card->rxbd_ring_vbase) {
890 mwifiex_dbg(adapter, ERROR,
891 "allocate consistent memory (%d bytes) failed!\n",
892 card->rxbd_ring_size);
896 mwifiex_dbg(adapter, DATA,
897 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
898 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
899 (u32)((u64)card->rxbd_ring_pbase >> 32),
900 card->rxbd_ring_size);
902 return mwifiex_init_rxq_ring(adapter);
906 * This function deletes Buffer descriptor ring for RX
908 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
910 struct pcie_service_card *card = adapter->card;
911 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
913 mwifiex_cleanup_rxq_ring(adapter);
915 if (card->rxbd_ring_vbase)
916 pci_free_consistent(card->dev, card->rxbd_ring_size,
917 card->rxbd_ring_vbase,
918 card->rxbd_ring_pbase);
919 card->rxbd_ring_size = 0;
920 card->rxbd_wrptr = 0;
921 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
922 card->rxbd_ring_vbase = NULL;
923 card->rxbd_ring_pbase = 0;
929 * This function creates buffer descriptor ring for Events
931 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
933 struct pcie_service_card *card = adapter->card;
934 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
937 * driver maintaines the read pointer and firmware maintaines the write
938 * pointer. The write pointer starts at 0 (zero) while the read pointer
939 * starts at zero with rollover bit set
941 card->evtbd_wrptr = 0;
942 card->evtbd_rdptr = reg->evt_rollover_ind;
944 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
947 mwifiex_dbg(adapter, INFO,
948 "info: evtbd_ring: Allocating %d bytes\n",
949 card->evtbd_ring_size);
950 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
951 card->evtbd_ring_size,
952 &card->evtbd_ring_pbase);
953 if (!card->evtbd_ring_vbase) {
954 mwifiex_dbg(adapter, ERROR,
955 "allocate consistent memory (%d bytes) failed!\n",
956 card->evtbd_ring_size);
960 mwifiex_dbg(adapter, EVENT,
961 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
962 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
963 (u32)((u64)card->evtbd_ring_pbase >> 32),
964 card->evtbd_ring_size);
966 return mwifiex_pcie_init_evt_ring(adapter);
970 * This function deletes Buffer descriptor ring for Events
972 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
974 struct pcie_service_card *card = adapter->card;
975 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
977 mwifiex_cleanup_evt_ring(adapter);
979 if (card->evtbd_ring_vbase)
980 pci_free_consistent(card->dev, card->evtbd_ring_size,
981 card->evtbd_ring_vbase,
982 card->evtbd_ring_pbase);
983 card->evtbd_wrptr = 0;
984 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
985 card->evtbd_ring_size = 0;
986 card->evtbd_ring_vbase = NULL;
987 card->evtbd_ring_pbase = 0;
993 * This function allocates a buffer for CMDRSP
995 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
997 struct pcie_service_card *card = adapter->card;
1000 /* Allocate memory for receiving command response data */
1001 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1003 mwifiex_dbg(adapter, ERROR,
1004 "Unable to allocate skb for command response data.\n");
1007 skb_put(skb, MWIFIEX_UPLD_SIZE);
1008 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1009 PCI_DMA_FROMDEVICE))
1012 card->cmdrsp_buf = skb;
1018 * This function deletes a buffer for CMDRSP
1020 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
1022 struct pcie_service_card *card;
1027 card = adapter->card;
1029 if (card && card->cmdrsp_buf) {
1030 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
1031 PCI_DMA_FROMDEVICE);
1032 dev_kfree_skb_any(card->cmdrsp_buf);
1035 if (card && card->cmd_buf) {
1036 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1038 dev_kfree_skb_any(card->cmd_buf);
1044 * This function allocates a buffer for sleep cookie
1046 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1048 struct pcie_service_card *card = adapter->card;
1051 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
1052 &card->sleep_cookie_pbase);
1053 if (!card->sleep_cookie_vbase) {
1054 mwifiex_dbg(adapter, ERROR,
1055 "pci_alloc_consistent failed!\n");
1058 /* Init val of Sleep Cookie */
1059 tmp = FW_AWAKE_COOKIE;
1060 put_unaligned(tmp, card->sleep_cookie_vbase);
1062 mwifiex_dbg(adapter, INFO,
1063 "alloc_scook: sleep cookie=0x%x\n",
1064 get_unaligned(card->sleep_cookie_vbase));
1070 * This function deletes buffer for sleep cookie
1072 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1074 struct pcie_service_card *card;
1079 card = adapter->card;
1081 if (card && card->sleep_cookie_vbase) {
1082 pci_free_consistent(card->dev, sizeof(u32),
1083 card->sleep_cookie_vbase,
1084 card->sleep_cookie_pbase);
1085 card->sleep_cookie_vbase = NULL;
1091 /* This function flushes the TX buffer descriptor ring
1092 * This function defined as handler is also called while cleaning TXRX
1093 * during disconnect/ bss stop.
1095 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1097 struct pcie_service_card *card = adapter->card;
1099 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1100 card->txbd_flush = 1;
1101 /* write pointer already set at last send
1102 * send dnld-rdy intr again, wait for completion.
1104 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1105 CPU_INTR_DNLD_RDY)) {
1106 mwifiex_dbg(adapter, ERROR,
1107 "failed to assert dnld-rdy interrupt.\n");
1115 * This function unmaps and frees downloaded data buffer
1117 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1119 struct sk_buff *skb;
1120 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1121 struct mwifiex_pcie_buf_desc *desc;
1122 struct mwifiex_pfu_buf_desc *desc2;
1123 struct pcie_service_card *card = adapter->card;
1124 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1126 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1127 mwifiex_pm_wakeup_card(adapter);
1129 /* Read the TX ring read pointer set by firmware */
1130 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1131 mwifiex_dbg(adapter, ERROR,
1132 "SEND COMP: failed to read reg->tx_rdptr\n");
1136 mwifiex_dbg(adapter, DATA,
1137 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1138 card->txbd_rdptr, rdptr);
1140 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1141 /* free from previous txbd_rdptr to current txbd_rdptr */
1142 while (((card->txbd_rdptr & reg->tx_mask) !=
1143 (rdptr & reg->tx_mask)) ||
1144 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1145 (rdptr & reg->tx_rollover_ind))) {
1146 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1149 skb = card->tx_buf_list[wrdoneidx];
1152 mwifiex_dbg(adapter, DATA,
1153 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1155 mwifiex_unmap_pci_memory(adapter, skb,
1160 if (card->txbd_flush)
1161 mwifiex_write_data_complete(adapter, skb, 0,
1164 mwifiex_write_data_complete(adapter, skb, 0, 0);
1165 atomic_dec(&adapter->tx_hw_pending);
1168 card->tx_buf_list[wrdoneidx] = NULL;
1170 if (reg->pfu_enabled) {
1171 desc2 = card->txbd_ring[wrdoneidx];
1172 memset(desc2, 0, sizeof(*desc2));
1174 desc = card->txbd_ring[wrdoneidx];
1175 memset(desc, 0, sizeof(*desc));
1177 switch (card->dev->device) {
1178 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1181 case PCIE_DEVICE_ID_MARVELL_88W8897:
1182 case PCIE_DEVICE_ID_MARVELL_88W8997:
1183 card->txbd_rdptr += reg->ring_tx_start_ptr;
1188 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1189 card->txbd_rdptr = ((card->txbd_rdptr &
1190 reg->tx_rollover_ind) ^
1191 reg->tx_rollover_ind);
1195 adapter->data_sent = false;
1197 if (card->txbd_flush) {
1198 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1199 card->txbd_flush = 0;
1201 mwifiex_clean_pcie_ring_buf(adapter);
1207 /* This function sends data buffer to device. First 4 bytes of payload
1208 * are filled with payload length and payload type. Then this payload
1209 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1210 * Download ready interrupt to FW is deffered if Tx ring is not full and
1211 * additional payload can be accomodated.
1212 * Caller must ensure tx_param parameter to this function is not NULL.
1215 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1216 struct mwifiex_tx_param *tx_param)
1218 struct pcie_service_card *card = adapter->card;
1219 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1220 u32 wrindx, num_tx_buffs, rx_val;
1223 struct mwifiex_pcie_buf_desc *desc = NULL;
1224 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1226 if (!(skb->data && skb->len)) {
1227 mwifiex_dbg(adapter, ERROR,
1228 "%s(): invalid parameter <%p, %#x>\n",
1229 __func__, skb->data, skb->len);
1233 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1234 mwifiex_pm_wakeup_card(adapter);
1236 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1237 mwifiex_dbg(adapter, DATA,
1238 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1239 card->txbd_rdptr, card->txbd_wrptr);
1240 if (mwifiex_pcie_txbd_not_full(card)) {
1243 adapter->data_sent = true;
1244 payload = skb->data;
1245 put_unaligned_le16((u16)skb->len, payload + 0);
1246 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
1248 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1252 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1253 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1254 card->tx_buf_list[wrindx] = skb;
1255 atomic_inc(&adapter->tx_hw_pending);
1257 if (reg->pfu_enabled) {
1258 desc2 = card->txbd_ring[wrindx];
1259 desc2->paddr = buf_pa;
1260 desc2->len = (u16)skb->len;
1261 desc2->frag_len = (u16)skb->len;
1263 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1264 MWIFIEX_BD_FLAG_LAST_DESC;
1266 desc = card->txbd_ring[wrindx];
1267 desc->paddr = buf_pa;
1268 desc->len = (u16)skb->len;
1269 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1270 MWIFIEX_BD_FLAG_LAST_DESC;
1273 switch (card->dev->device) {
1274 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1277 case PCIE_DEVICE_ID_MARVELL_88W8897:
1278 case PCIE_DEVICE_ID_MARVELL_88W8997:
1279 card->txbd_wrptr += reg->ring_tx_start_ptr;
1283 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1284 card->txbd_wrptr = ((card->txbd_wrptr &
1285 reg->tx_rollover_ind) ^
1286 reg->tx_rollover_ind);
1288 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1289 /* Write the TX ring write pointer in to reg->tx_wrptr */
1290 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1291 card->txbd_wrptr | rx_val)) {
1292 mwifiex_dbg(adapter, ERROR,
1293 "SEND DATA: failed to write reg->tx_wrptr\n");
1297 if ((mwifiex_pcie_txbd_not_full(card)) &&
1298 tx_param->next_pkt_len) {
1299 /* have more packets and TxBD still can hold more */
1300 mwifiex_dbg(adapter, DATA,
1301 "SEND DATA: delay dnld-rdy interrupt.\n");
1302 adapter->data_sent = false;
1304 /* Send the TX ready interrupt */
1305 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1306 CPU_INTR_DNLD_RDY)) {
1307 mwifiex_dbg(adapter, ERROR,
1308 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1313 mwifiex_dbg(adapter, DATA,
1314 "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1315 "%#x> and sent packet to firmware successfully\n",
1316 card->txbd_rdptr, card->txbd_wrptr);
1318 mwifiex_dbg(adapter, DATA,
1319 "info: TX Ring full, can't send packets to fw\n");
1320 adapter->data_sent = true;
1321 /* Send the TX ready interrupt */
1322 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1324 mwifiex_dbg(adapter, ERROR,
1325 "SEND DATA: failed to assert door-bell intr\n");
1329 return -EINPROGRESS;
1331 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1332 card->tx_buf_list[wrindx] = NULL;
1333 atomic_dec(&adapter->tx_hw_pending);
1334 if (reg->pfu_enabled)
1335 memset(desc2, 0, sizeof(*desc2));
1337 memset(desc, 0, sizeof(*desc));
1343 * This function handles received buffer ring and
1344 * dispatches packets to upper
1346 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1348 struct pcie_service_card *card = adapter->card;
1349 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1350 u32 wrptr, rd_index, tx_val;
1353 struct sk_buff *skb_tmp = NULL;
1354 struct mwifiex_pcie_buf_desc *desc;
1355 struct mwifiex_pfu_buf_desc *desc2;
1357 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1358 mwifiex_pm_wakeup_card(adapter);
1360 /* Read the RX ring Write pointer set by firmware */
1361 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1362 mwifiex_dbg(adapter, ERROR,
1363 "RECV DATA: failed to read reg->rx_wrptr\n");
1367 card->rxbd_wrptr = wrptr;
1369 while (((wrptr & reg->rx_mask) !=
1370 (card->rxbd_rdptr & reg->rx_mask)) ||
1371 ((wrptr & reg->rx_rollover_ind) ==
1372 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1373 struct sk_buff *skb_data;
1376 rd_index = card->rxbd_rdptr & reg->rx_mask;
1377 skb_data = card->rx_buf_list[rd_index];
1379 /* If skb allocation was failed earlier for Rx packet,
1380 * rx_buf_list[rd_index] would have been left with a NULL.
1385 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1386 card->rx_buf_list[rd_index] = NULL;
1388 /* Get data length from interface header -
1389 * first 2 bytes for len, next 2 bytes is for type
1391 rx_len = get_unaligned_le16(skb_data->data);
1392 if (WARN_ON(rx_len <= adapter->intf_hdr_len ||
1393 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1394 mwifiex_dbg(adapter, ERROR,
1395 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1396 rx_len, card->rxbd_rdptr, wrptr);
1397 dev_kfree_skb_any(skb_data);
1399 skb_put(skb_data, rx_len);
1400 mwifiex_dbg(adapter, DATA,
1401 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1402 card->rxbd_rdptr, wrptr, rx_len);
1403 skb_pull(skb_data, adapter->intf_hdr_len);
1404 if (adapter->rx_work_enabled) {
1405 skb_queue_tail(&adapter->rx_data_q, skb_data);
1406 adapter->data_received = true;
1407 atomic_inc(&adapter->rx_pending);
1409 mwifiex_handle_rx_packet(adapter, skb_data);
1413 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1416 mwifiex_dbg(adapter, ERROR,
1417 "Unable to allocate skb.\n");
1421 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1422 MWIFIEX_RX_DATA_BUF_SIZE,
1423 PCI_DMA_FROMDEVICE))
1426 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1428 mwifiex_dbg(adapter, INFO,
1429 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1431 card->rx_buf_list[rd_index] = skb_tmp;
1433 if (reg->pfu_enabled) {
1434 desc2 = card->rxbd_ring[rd_index];
1435 desc2->paddr = buf_pa;
1436 desc2->len = skb_tmp->len;
1437 desc2->frag_len = skb_tmp->len;
1439 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1441 desc = card->rxbd_ring[rd_index];
1442 desc->paddr = buf_pa;
1443 desc->len = skb_tmp->len;
1447 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1448 MWIFIEX_MAX_TXRX_BD) {
1449 card->rxbd_rdptr = ((card->rxbd_rdptr &
1450 reg->rx_rollover_ind) ^
1451 reg->rx_rollover_ind);
1453 mwifiex_dbg(adapter, DATA,
1454 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1455 card->rxbd_rdptr, wrptr);
1457 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1458 /* Write the RX ring read pointer in to reg->rx_rdptr */
1459 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1460 card->rxbd_rdptr | tx_val)) {
1461 mwifiex_dbg(adapter, DATA,
1462 "RECV DATA: failed to write reg->rx_rdptr\n");
1467 /* Read the RX ring Write pointer set by firmware */
1468 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1469 mwifiex_dbg(adapter, ERROR,
1470 "RECV DATA: failed to read reg->rx_wrptr\n");
1474 mwifiex_dbg(adapter, DATA,
1475 "info: RECV DATA: Rcvd packet from fw successfully\n");
1476 card->rxbd_wrptr = wrptr;
1484 * This function downloads the boot command to device
1487 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1490 struct pcie_service_card *card = adapter->card;
1491 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1493 if (!(skb->data && skb->len)) {
1494 mwifiex_dbg(adapter, ERROR,
1495 "Invalid parameter in %s <%p. len %d>\n",
1496 __func__, skb->data, skb->len);
1500 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1503 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1505 /* Write the lower 32bits of the physical address to low command
1506 * address scratch register
1508 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1509 mwifiex_dbg(adapter, ERROR,
1510 "%s: failed to write download command to boot code.\n",
1512 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1516 /* Write the upper 32bits of the physical address to high command
1517 * address scratch register
1519 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1520 (u32)((u64)buf_pa >> 32))) {
1521 mwifiex_dbg(adapter, ERROR,
1522 "%s: failed to write download command to boot code.\n",
1524 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1528 /* Write the command length to cmd_size scratch register */
1529 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1530 mwifiex_dbg(adapter, ERROR,
1531 "%s: failed to write command len to cmd_size scratch reg\n",
1533 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1537 /* Ring the door bell */
1538 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1539 CPU_INTR_DOOR_BELL)) {
1540 mwifiex_dbg(adapter, ERROR,
1541 "%s: failed to assert door-bell intr\n", __func__);
1542 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1549 /* This function init rx port in firmware which in turn enables to receive data
1550 * from device before transmitting any packet.
1552 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1554 struct pcie_service_card *card = adapter->card;
1555 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1556 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1558 /* Write the RX ring read pointer in to reg->rx_rdptr */
1559 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1561 mwifiex_dbg(adapter, ERROR,
1562 "RECV DATA: failed to write reg->rx_rdptr\n");
1568 /* This function downloads commands to the device
1571 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1573 struct pcie_service_card *card = adapter->card;
1574 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1576 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1577 u8 *payload = (u8 *)skb->data;
1579 if (!(skb->data && skb->len)) {
1580 mwifiex_dbg(adapter, ERROR,
1581 "Invalid parameter in %s <%p, %#x>\n",
1582 __func__, skb->data, skb->len);
1586 /* Make sure a command response buffer is available */
1587 if (!card->cmdrsp_buf) {
1588 mwifiex_dbg(adapter, ERROR,
1589 "No response buffer available, send command failed\n");
1593 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1594 mwifiex_pm_wakeup_card(adapter);
1596 adapter->cmd_sent = true;
1598 put_unaligned_le16((u16)skb->len, &payload[0]);
1599 put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
1601 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1604 card->cmd_buf = skb;
1606 * Need to keep a reference, since core driver might free up this
1607 * buffer before we've unmapped it.
1611 /* To send a command, the driver will:
1612 1. Write the 64bit physical address of the data buffer to
1613 cmd response address low + cmd response address high
1614 2. Ring the door bell (i.e. set the door bell interrupt)
1616 In response to door bell interrupt, the firmware will perform
1617 the DMA of the command packet (first header to obtain the total
1618 length and then rest of the command).
1621 if (card->cmdrsp_buf) {
1622 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1623 /* Write the lower 32bits of the cmdrsp buffer physical
1625 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1626 (u32)cmdrsp_buf_pa)) {
1627 mwifiex_dbg(adapter, ERROR,
1628 "Failed to write download cmd to boot code.\n");
1632 /* Write the upper 32bits of the cmdrsp buffer physical
1634 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1635 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1636 mwifiex_dbg(adapter, ERROR,
1637 "Failed to write download cmd to boot code.\n");
1643 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1644 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1645 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1647 mwifiex_dbg(adapter, ERROR,
1648 "Failed to write download cmd to boot code.\n");
1652 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1653 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1654 (u32)((u64)cmd_buf_pa >> 32))) {
1655 mwifiex_dbg(adapter, ERROR,
1656 "Failed to write download cmd to boot code.\n");
1661 /* Write the command length to reg->cmd_size */
1662 if (mwifiex_write_reg(adapter, reg->cmd_size,
1663 card->cmd_buf->len)) {
1664 mwifiex_dbg(adapter, ERROR,
1665 "Failed to write cmd len to reg->cmd_size\n");
1670 /* Ring the door bell */
1671 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1672 CPU_INTR_DOOR_BELL)) {
1673 mwifiex_dbg(adapter, ERROR,
1674 "Failed to assert door-bell intr\n");
1681 adapter->cmd_sent = false;
1687 * This function handles command complete interrupt
1689 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1691 struct pcie_service_card *card = adapter->card;
1692 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1693 struct sk_buff *skb = card->cmdrsp_buf;
1697 mwifiex_dbg(adapter, CMD,
1698 "info: Rx CMD Response\n");
1700 if (adapter->curr_cmd)
1701 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1703 pci_dma_sync_single_for_cpu(card->dev,
1704 MWIFIEX_SKB_DMA_ADDR(skb),
1706 PCI_DMA_FROMDEVICE);
1708 /* Unmap the command as a response has been received. */
1709 if (card->cmd_buf) {
1710 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1712 dev_kfree_skb_any(card->cmd_buf);
1713 card->cmd_buf = NULL;
1716 rx_len = get_unaligned_le16(skb->data);
1717 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1718 skb_trim(skb, rx_len);
1720 if (!adapter->curr_cmd) {
1721 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1722 pci_dma_sync_single_for_device(card->dev,
1723 MWIFIEX_SKB_DMA_ADDR(skb),
1724 MWIFIEX_SLEEP_COOKIE_SIZE,
1725 PCI_DMA_FROMDEVICE);
1726 if (mwifiex_write_reg(adapter,
1728 CPU_INTR_SLEEP_CFM_DONE)) {
1729 mwifiex_dbg(adapter, ERROR,
1730 "Write register failed\n");
1733 mwifiex_delay_for_sleep_cookie(adapter,
1734 MWIFIEX_MAX_DELAY_COUNT);
1735 mwifiex_unmap_pci_memory(adapter, skb,
1736 PCI_DMA_FROMDEVICE);
1737 skb_pull(skb, adapter->intf_hdr_len);
1738 while (reg->sleep_cookie && (count++ < 10) &&
1739 mwifiex_pcie_ok_to_access_hw(adapter))
1740 usleep_range(50, 60);
1741 mwifiex_pcie_enable_host_int(adapter);
1742 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1745 mwifiex_dbg(adapter, ERROR,
1746 "There is no command but got cmdrsp\n");
1748 memcpy(adapter->upld_buf, skb->data,
1749 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1750 skb_push(skb, adapter->intf_hdr_len);
1751 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1752 PCI_DMA_FROMDEVICE))
1754 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1755 skb_pull(skb, adapter->intf_hdr_len);
1756 adapter->curr_cmd->resp_skb = skb;
1757 adapter->cmd_resp_received = true;
1758 /* Take the pointer and set it to CMD node and will
1759 return in the response complete callback */
1760 card->cmdrsp_buf = NULL;
1762 /* Clear the cmd-rsp buffer address in scratch registers. This
1763 will prevent firmware from writing to the same response
1765 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1766 mwifiex_dbg(adapter, ERROR,
1767 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1770 /* Write the upper 32bits of the cmdrsp buffer physical
1772 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1773 mwifiex_dbg(adapter, ERROR,
1774 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1783 * Command Response processing complete handler
1785 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1786 struct sk_buff *skb)
1788 struct pcie_service_card *card = adapter->card;
1791 card->cmdrsp_buf = skb;
1792 skb_push(card->cmdrsp_buf, adapter->intf_hdr_len);
1793 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1794 PCI_DMA_FROMDEVICE))
1802 * This function handles firmware event ready interrupt
1804 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1806 struct pcie_service_card *card = adapter->card;
1807 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1808 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1810 struct mwifiex_evt_buf_desc *desc;
1812 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1813 mwifiex_pm_wakeup_card(adapter);
1815 if (adapter->event_received) {
1816 mwifiex_dbg(adapter, EVENT,
1817 "info: Event being processed,\t"
1818 "do not process this interrupt just yet\n");
1822 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1823 mwifiex_dbg(adapter, ERROR,
1824 "info: Invalid read pointer...\n");
1828 /* Read the event ring write pointer set by firmware */
1829 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1830 mwifiex_dbg(adapter, ERROR,
1831 "EventReady: failed to read reg->evt_wrptr\n");
1835 mwifiex_dbg(adapter, EVENT,
1836 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1837 card->evtbd_rdptr, wrptr);
1838 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1839 & MWIFIEX_EVTBD_MASK)) ||
1840 ((wrptr & reg->evt_rollover_ind) ==
1841 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1842 struct sk_buff *skb_cmd;
1843 __le16 data_len = 0;
1846 mwifiex_dbg(adapter, INFO,
1847 "info: Read Index: %d\n", rdptr);
1848 skb_cmd = card->evt_buf_list[rdptr];
1849 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1851 /* Take the pointer and set it to event pointer in adapter
1852 and will return back after event handling callback */
1853 card->evt_buf_list[rdptr] = NULL;
1854 desc = card->evtbd_ring[rdptr];
1855 memset(desc, 0, sizeof(*desc));
1857 event = get_unaligned_le32(
1858 &skb_cmd->data[adapter->intf_hdr_len]);
1859 adapter->event_cause = event;
1860 /* The first 4bytes will be the event transfer header
1861 len is 2 bytes followed by type which is 2 bytes */
1862 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1863 evt_len = le16_to_cpu(data_len);
1864 skb_trim(skb_cmd, evt_len);
1865 skb_pull(skb_cmd, adapter->intf_hdr_len);
1866 mwifiex_dbg(adapter, EVENT,
1867 "info: Event length: %d\n", evt_len);
1869 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1870 memcpy(adapter->event_body, skb_cmd->data +
1871 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1872 MWIFIEX_EVENT_HEADER_LEN);
1874 adapter->event_received = true;
1875 adapter->event_skb = skb_cmd;
1877 /* Do not update the event read pointer here, wait till the
1878 buffer is released. This is just to make things simpler,
1879 we need to find a better method of managing these buffers.
1882 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1883 CPU_INTR_EVENT_DONE)) {
1884 mwifiex_dbg(adapter, ERROR,
1885 "Write register failed\n");
1894 * Event processing complete handler
1896 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1897 struct sk_buff *skb)
1899 struct pcie_service_card *card = adapter->card;
1900 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1902 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1904 struct mwifiex_evt_buf_desc *desc;
1909 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1910 mwifiex_dbg(adapter, ERROR,
1911 "event_complete: Invalid rdptr 0x%x\n",
1916 /* Read the event ring write pointer set by firmware */
1917 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1918 mwifiex_dbg(adapter, ERROR,
1919 "event_complete: failed to read reg->evt_wrptr\n");
1923 if (!card->evt_buf_list[rdptr]) {
1924 skb_push(skb, adapter->intf_hdr_len);
1925 skb_put(skb, MAX_EVENT_SIZE - skb->len);
1926 if (mwifiex_map_pci_memory(adapter, skb,
1928 PCI_DMA_FROMDEVICE))
1930 card->evt_buf_list[rdptr] = skb;
1931 desc = card->evtbd_ring[rdptr];
1932 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1933 desc->len = (u16)skb->len;
1937 mwifiex_dbg(adapter, ERROR,
1938 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1939 rdptr, card->evt_buf_list[rdptr], skb);
1942 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1943 card->evtbd_rdptr = ((card->evtbd_rdptr &
1944 reg->evt_rollover_ind) ^
1945 reg->evt_rollover_ind);
1948 mwifiex_dbg(adapter, EVENT,
1949 "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1950 card->evtbd_rdptr, wrptr);
1952 /* Write the event ring read pointer in to reg->evt_rdptr */
1953 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1954 card->evtbd_rdptr)) {
1955 mwifiex_dbg(adapter, ERROR,
1956 "event_complete: failed to read reg->evt_rdptr\n");
1960 mwifiex_dbg(adapter, EVENT,
1961 "info: Check Events Again\n");
1962 ret = mwifiex_pcie_process_event_ready(adapter);
1967 /* Combo firmware image is a combination of
1968 * (1) combo crc heaer, start with CMD5
1969 * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1.
1972 * This function bypass the header and bluetooth part, return
1973 * the offset of tail wifi-only part.
1976 static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
1977 const void *firmware, u32 firmware_len) {
1978 const struct mwifiex_fw_data *fwdata;
1979 u32 offset = 0, data_len, dnld_cmd;
1981 bool cmd7_before = false;
1984 /* Check for integer and buffer overflow */
1985 if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
1986 offset + sizeof(fwdata->header) >= firmware_len) {
1987 mwifiex_dbg(adapter, ERROR,
1988 "extract wifi-only fw failure!\n");
1993 fwdata = firmware + offset;
1994 dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
1995 data_len = le32_to_cpu(fwdata->header.data_length);
1997 /* Skip past header */
1998 offset += sizeof(fwdata->header);
2001 case MWIFIEX_FW_DNLD_CMD_1:
2003 mwifiex_dbg(adapter, ERROR,
2004 "no cmd7 before cmd1!\n");
2008 if (offset + data_len < data_len) {
2009 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2015 case MWIFIEX_FW_DNLD_CMD_5:
2016 /* Check for integer overflow */
2017 if (offset + data_len < data_len) {
2018 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2024 case MWIFIEX_FW_DNLD_CMD_6:
2025 /* Check for integer overflow */
2026 if (offset + data_len < data_len) {
2027 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2032 if (offset >= firmware_len) {
2033 mwifiex_dbg(adapter, ERROR,
2034 "extract wifi-only fw failure!\n");
2040 case MWIFIEX_FW_DNLD_CMD_7:
2044 mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n",
2056 * This function downloads the firmware to the card.
2058 * Firmware is downloaded to the card in blocks. Every block download
2059 * is tested for CRC errors, and retried a number of times before
2060 * returning failure.
2062 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
2063 struct mwifiex_fw_image *fw)
2066 u8 *firmware = fw->fw_buf;
2067 u32 firmware_len = fw->fw_len;
2069 struct sk_buff *skb;
2070 u32 txlen, tx_blocks = 0, tries, len, val;
2071 u32 block_retry_cnt = 0;
2072 struct pcie_service_card *card = adapter->card;
2073 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2075 if (!firmware || !firmware_len) {
2076 mwifiex_dbg(adapter, ERROR,
2077 "No firmware image found! Terminating download\n");
2081 mwifiex_dbg(adapter, INFO,
2082 "info: Downloading FW image (%d bytes)\n",
2085 if (mwifiex_pcie_disable_host_int(adapter)) {
2086 mwifiex_dbg(adapter, ERROR,
2087 "%s: Disabling interrupts failed.\n", __func__);
2091 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
2097 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val);
2099 mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n");
2103 /* PCIE FLR case: extract wifi part from combo firmware*/
2104 if (val == MWIFIEX_PCIE_FLR_HAPPENS) {
2105 ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len);
2107 mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n");
2111 mwifiex_dbg(adapter, MSG,
2112 "info: dnld wifi firmware from %d bytes\n", offset);
2115 /* Perform firmware data transfer */
2120 if (offset >= firmware_len)
2123 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2124 ret = mwifiex_read_reg(adapter, reg->cmd_size,
2127 mwifiex_dbg(adapter, FATAL,
2128 "Failed reading len from boot code\n");
2133 usleep_range(10, 20);
2138 } else if (len > MWIFIEX_UPLD_SIZE) {
2139 mwifiex_dbg(adapter, ERROR,
2140 "FW download failure @ %d, invalid length %d\n",
2150 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
2151 mwifiex_dbg(adapter, ERROR,
2152 "FW download failure @ %d, over max\t"
2153 "retry count\n", offset);
2157 mwifiex_dbg(adapter, ERROR,
2158 "FW CRC error indicated by the\t"
2159 "helper: len = 0x%04X, txlen = %d\n",
2162 /* Setting this to 0 to resend from same offset */
2165 block_retry_cnt = 0;
2166 /* Set blocksize to transfer - checking for
2168 if (firmware_len - offset < txlen)
2169 txlen = firmware_len - offset;
2171 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
2172 card->pcie.blksz_fw_dl;
2174 /* Copy payload to buffer */
2175 memmove(skb->data, &firmware[offset], txlen);
2178 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
2179 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
2181 /* Send the boot command to device */
2182 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
2183 mwifiex_dbg(adapter, ERROR,
2184 "Failed to send firmware download command\n");
2189 /* Wait for the command done interrupt */
2190 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2191 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
2193 mwifiex_dbg(adapter, ERROR,
2194 "%s: Failed to read\t"
2195 "interrupt status during fw dnld.\n",
2197 mwifiex_unmap_pci_memory(adapter, skb,
2202 if (!(ireg_intr & CPU_INTR_DOOR_BELL))
2204 usleep_range(10, 20);
2206 if (ireg_intr & CPU_INTR_DOOR_BELL) {
2207 mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
2209 mwifiex_unmap_pci_memory(adapter, skb,
2215 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
2220 mwifiex_dbg(adapter, MSG,
2221 "info: FW download over, size %d bytes\n", offset);
2226 dev_kfree_skb_any(skb);
2231 * This function checks the firmware status in card.
2234 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2238 struct pcie_service_card *card = adapter->card;
2239 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2242 /* Mask spurios interrupts */
2243 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2245 mwifiex_dbg(adapter, ERROR,
2246 "Write register failed\n");
2250 mwifiex_dbg(adapter, INFO,
2251 "Setting driver ready signature\n");
2252 if (mwifiex_write_reg(adapter, reg->drv_rdy,
2253 FIRMWARE_READY_PCIE)) {
2254 mwifiex_dbg(adapter, ERROR,
2255 "Failed to write driver ready signature\n");
2259 /* Wait for firmware initialization event */
2260 for (tries = 0; tries < poll_num; tries++) {
2261 if (mwifiex_read_reg(adapter, reg->fw_status,
2267 mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>",
2268 tries, ret, firmware_stat);
2272 if (firmware_stat == FIRMWARE_READY_PCIE) {
2284 /* This function checks if WLAN is the winner.
2287 mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
2291 struct pcie_service_card *card = adapter->card;
2292 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2294 if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) {
2296 } else if (!winner) {
2297 mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n");
2298 adapter->winner = 1;
2300 mwifiex_dbg(adapter, ERROR,
2301 "PCI-E is not the winner <%#x>", winner);
2308 * This function reads the interrupt status from card.
2310 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
2314 unsigned long flags;
2315 struct pcie_service_card *card = adapter->card;
2317 if (card->msi_enable) {
2318 spin_lock_irqsave(&adapter->int_lock, flags);
2319 adapter->int_status = 1;
2320 spin_unlock_irqrestore(&adapter->int_lock, flags);
2324 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2327 if (card->msix_enable && msg_id >= 0) {
2328 pcie_ireg = BIT(msg_id);
2330 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2332 mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2336 if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg)
2340 mwifiex_pcie_disable_host_int(adapter);
2342 /* Clear the pending interrupts */
2343 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2345 mwifiex_dbg(adapter, ERROR,
2346 "Write register failed\n");
2351 if (!adapter->pps_uapsd_mode &&
2352 adapter->ps_state == PS_STATE_SLEEP &&
2353 mwifiex_pcie_ok_to_access_hw(adapter)) {
2354 /* Potentially for PCIe we could get other
2355 * interrupts like shared. Don't change power
2356 * state until cookie is set
2358 adapter->ps_state = PS_STATE_AWAKE;
2359 adapter->pm_wakeup_fw_try = false;
2360 del_timer(&adapter->wakeup_timer);
2363 spin_lock_irqsave(&adapter->int_lock, flags);
2364 adapter->int_status |= pcie_ireg;
2365 spin_unlock_irqrestore(&adapter->int_lock, flags);
2366 mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
2370 * Interrupt handler for PCIe root port
2372 * This function reads the interrupt status from firmware and assigns
2373 * the main process in workqueue which will handle the interrupt.
2375 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2377 struct mwifiex_msix_context *ctx = context;
2378 struct pci_dev *pdev = ctx->dev;
2379 struct pcie_service_card *card;
2380 struct mwifiex_adapter *adapter;
2382 card = pci_get_drvdata(pdev);
2384 if (!card->adapter) {
2385 pr_err("info: %s: card=%p adapter=%p\n", __func__, card,
2386 card ? card->adapter : NULL);
2389 adapter = card->adapter;
2391 if (adapter->surprise_removed)
2394 if (card->msix_enable)
2395 mwifiex_interrupt_status(adapter, ctx->msg_id);
2397 mwifiex_interrupt_status(adapter, -1);
2399 mwifiex_queue_main_work(adapter);
2406 * This function checks the current interrupt status.
2408 * The following interrupts are checked and handled by this function -
2411 * - Command received
2412 * - Packets received
2415 * In case of Rx packets received, the packets are uploaded from card to
2416 * host and processed accordingly.
2418 static int mwifiex_process_pcie_int(struct mwifiex_adapter *adapter)
2422 unsigned long flags;
2423 struct pcie_service_card *card = adapter->card;
2425 spin_lock_irqsave(&adapter->int_lock, flags);
2426 if (!card->msi_enable) {
2427 /* Clear out unused interrupts */
2428 pcie_ireg = adapter->int_status;
2430 adapter->int_status = 0;
2431 spin_unlock_irqrestore(&adapter->int_lock, flags);
2433 if (card->msi_enable) {
2434 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2435 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2437 mwifiex_dbg(adapter, ERROR,
2438 "Read register failed\n");
2442 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2443 if (mwifiex_write_reg(adapter,
2444 PCIE_HOST_INT_STATUS,
2446 mwifiex_dbg(adapter, ERROR,
2447 "Write register failed\n");
2450 if (!adapter->pps_uapsd_mode &&
2451 adapter->ps_state == PS_STATE_SLEEP) {
2452 adapter->ps_state = PS_STATE_AWAKE;
2453 adapter->pm_wakeup_fw_try = false;
2454 del_timer(&adapter->wakeup_timer);
2460 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2461 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
2462 mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n");
2463 ret = mwifiex_pcie_send_data_complete(adapter);
2467 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2468 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
2469 mwifiex_dbg(adapter, INTR, "info: Rx DATA\n");
2470 ret = mwifiex_pcie_process_recv_data(adapter);
2474 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2475 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
2476 mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n");
2477 ret = mwifiex_pcie_process_event_ready(adapter);
2481 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2482 pcie_ireg &= ~HOST_INTR_CMD_DONE;
2483 if (adapter->cmd_sent) {
2484 mwifiex_dbg(adapter, INTR,
2485 "info: CMD sent Interrupt\n");
2486 adapter->cmd_sent = false;
2488 /* Handle command response */
2489 ret = mwifiex_pcie_process_cmd_complete(adapter);
2494 mwifiex_dbg(adapter, INTR,
2495 "info: cmd_sent=%d data_sent=%d\n",
2496 adapter->cmd_sent, adapter->data_sent);
2497 if (!card->msi_enable && adapter->ps_state != PS_STATE_SLEEP)
2498 mwifiex_pcie_enable_host_int(adapter);
2503 static int mwifiex_process_msix_int(struct mwifiex_adapter *adapter)
2507 unsigned long flags;
2509 spin_lock_irqsave(&adapter->int_lock, flags);
2510 /* Clear out unused interrupts */
2511 pcie_ireg = adapter->int_status;
2512 adapter->int_status = 0;
2513 spin_unlock_irqrestore(&adapter->int_lock, flags);
2515 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2516 mwifiex_dbg(adapter, INTR,
2517 "info: TX DNLD Done\n");
2518 ret = mwifiex_pcie_send_data_complete(adapter);
2522 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2523 mwifiex_dbg(adapter, INTR,
2525 ret = mwifiex_pcie_process_recv_data(adapter);
2529 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2530 mwifiex_dbg(adapter, INTR,
2531 "info: Rx EVENT\n");
2532 ret = mwifiex_pcie_process_event_ready(adapter);
2537 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2538 if (adapter->cmd_sent) {
2539 mwifiex_dbg(adapter, INTR,
2540 "info: CMD sent Interrupt\n");
2541 adapter->cmd_sent = false;
2543 /* Handle command response */
2544 ret = mwifiex_pcie_process_cmd_complete(adapter);
2549 mwifiex_dbg(adapter, INTR,
2550 "info: cmd_sent=%d data_sent=%d\n",
2551 adapter->cmd_sent, adapter->data_sent);
2556 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2558 struct pcie_service_card *card = adapter->card;
2560 if (card->msix_enable)
2561 return mwifiex_process_msix_int(adapter);
2563 return mwifiex_process_pcie_int(adapter);
2567 * This function downloads data from driver to card.
2569 * Both commands and data packets are transferred to the card by this
2572 * This function adds the PCIE specific header to the front of the buffer
2573 * before transferring. The header contains the length of the packet and
2574 * the type. The firmware handles the packets based upon this set type.
2576 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2577 struct sk_buff *skb,
2578 struct mwifiex_tx_param *tx_param)
2581 mwifiex_dbg(adapter, ERROR,
2582 "Passed NULL skb to %s\n", __func__);
2586 if (type == MWIFIEX_TYPE_DATA)
2587 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2588 else if (type == MWIFIEX_TYPE_CMD)
2589 return mwifiex_pcie_send_cmd(adapter, skb);
2594 /* Function to dump PCIE scratch registers in case of FW crash
2597 mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
2600 char buf[256], *ptr;
2603 struct pcie_service_card *card = adapter->card;
2604 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2605 int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
2606 PCIE_SCRATCH_14_REG,
2607 PCIE_SCRATCH_15_REG};
2612 mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
2614 if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
2615 mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
2620 mwifiex_dbg(adapter, MSG, "pcie scratch register:");
2621 for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
2622 mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
2623 ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
2624 pcie_scratch_reg[i], value);
2627 mwifiex_dbg(adapter, MSG, "%s\n", buf);
2628 p += sprintf(p, "%s\n", buf);
2630 mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
2635 /* This function read/write firmware */
2636 static enum rdwr_status
2637 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2642 struct pcie_service_card *card = adapter->card;
2643 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2645 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
2646 return RDWR_STATUS_FAILURE;
2648 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2649 reg->fw_dump_host_ready);
2651 mwifiex_dbg(adapter, ERROR,
2652 "PCIE write err\n");
2653 return RDWR_STATUS_FAILURE;
2656 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2657 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2658 if (ctrl_data == FW_DUMP_DONE)
2659 return RDWR_STATUS_SUCCESS;
2660 if (doneflag && ctrl_data == doneflag)
2661 return RDWR_STATUS_DONE;
2662 if (ctrl_data != reg->fw_dump_host_ready) {
2663 mwifiex_dbg(adapter, WARN,
2664 "The ctrl reg was changed, re-try again!\n");
2665 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2666 reg->fw_dump_host_ready);
2668 mwifiex_dbg(adapter, ERROR,
2669 "PCIE write err\n");
2670 return RDWR_STATUS_FAILURE;
2673 usleep_range(100, 200);
2676 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2677 return RDWR_STATUS_FAILURE;
2680 /* This function dump firmware memory to file */
2681 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2683 struct pcie_service_card *card = adapter->card;
2684 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2685 unsigned int reg, reg_start, reg_end;
2686 u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
2687 u8 idx, i, read_reg, doneflag = 0;
2688 enum rdwr_status stat;
2692 if (!card->pcie.can_dump_fw)
2695 for (idx = 0; idx < adapter->num_mem_types; idx++) {
2696 struct memory_type_mapping *entry =
2697 &adapter->mem_type_mapping_tbl[idx];
2699 if (entry->mem_ptr) {
2700 vfree(entry->mem_ptr);
2701 entry->mem_ptr = NULL;
2703 entry->mem_size = 0;
2706 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
2708 /* Read the number of the memories which will dump */
2709 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2710 if (stat == RDWR_STATUS_FAILURE)
2713 reg = creg->fw_dump_start;
2714 mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
2716 /* W8997 chipset firmware dump will be restore in single region*/
2717 if (fw_dump_num == 0)
2720 dump_num = fw_dump_num;
2722 /* Read the length of every memory which will dump */
2723 for (idx = 0; idx < dump_num; idx++) {
2724 struct memory_type_mapping *entry =
2725 &adapter->mem_type_mapping_tbl[idx];
2727 if (fw_dump_num != 0) {
2728 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2729 if (stat == RDWR_STATUS_FAILURE)
2732 reg = creg->fw_dump_start;
2733 for (i = 0; i < 4; i++) {
2734 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2735 memory_size |= (read_reg << (i * 8));
2739 memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
2742 if (memory_size == 0) {
2743 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2744 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2745 creg->fw_dump_read_done);
2747 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2753 mwifiex_dbg(adapter, DUMP,
2754 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2755 entry->mem_ptr = vmalloc(memory_size + 1);
2756 entry->mem_size = memory_size;
2757 if (!entry->mem_ptr) {
2758 mwifiex_dbg(adapter, ERROR,
2759 "Vmalloc %s failed\n", entry->mem_name);
2762 dbg_ptr = entry->mem_ptr;
2763 end_ptr = dbg_ptr + memory_size;
2765 doneflag = entry->done_flag;
2766 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2770 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2771 if (RDWR_STATUS_FAILURE == stat)
2774 reg_start = creg->fw_dump_start;
2775 reg_end = creg->fw_dump_end;
2776 for (reg = reg_start; reg <= reg_end; reg++) {
2777 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2778 if (dbg_ptr < end_ptr) {
2782 mwifiex_dbg(adapter, ERROR,
2783 "pre-allocated buf not enough\n");
2785 vzalloc(memory_size + MWIFIEX_SIZE_4K);
2788 memcpy(tmp_ptr, entry->mem_ptr, memory_size);
2789 vfree(entry->mem_ptr);
2790 entry->mem_ptr = tmp_ptr;
2792 dbg_ptr = entry->mem_ptr + memory_size;
2793 memory_size += MWIFIEX_SIZE_4K;
2794 end_ptr = entry->mem_ptr + memory_size;
2797 if (stat != RDWR_STATUS_DONE)
2800 mwifiex_dbg(adapter, DUMP,
2801 "%s done: size=0x%tx\n",
2802 entry->mem_name, dbg_ptr - entry->mem_ptr);
2806 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
2809 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2814 drv_info_size = mwifiex_drv_info_dump(adapter, &drv_info);
2815 mwifiex_pcie_fw_dump(adapter);
2816 mwifiex_upload_device_dump(adapter, drv_info, drv_info_size);
2819 static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter)
2821 struct pcie_service_card *card = adapter->card;
2823 pci_reset_function(card->dev);
2826 static void mwifiex_pcie_work(struct work_struct *work)
2828 struct pcie_service_card *card =
2829 container_of(work, struct pcie_service_card, work);
2831 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2833 mwifiex_pcie_device_dump_work(card->adapter);
2834 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
2836 mwifiex_pcie_card_reset_work(card->adapter);
2839 /* This function dumps FW information */
2840 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2842 struct pcie_service_card *card = adapter->card;
2844 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2846 schedule_work(&card->work);
2849 static void mwifiex_pcie_card_reset(struct mwifiex_adapter *adapter)
2851 struct pcie_service_card *card = adapter->card;
2853 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags))
2854 schedule_work(&card->work);
2857 static int mwifiex_pcie_alloc_buffers(struct mwifiex_adapter *adapter)
2859 struct pcie_service_card *card = adapter->card;
2860 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2863 card->cmdrsp_buf = NULL;
2864 ret = mwifiex_pcie_create_txbd_ring(adapter);
2866 mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n");
2870 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2872 mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n");
2876 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2878 mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n");
2882 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2884 mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n");
2885 goto err_alloc_cmdbuf;
2888 if (reg->sleep_cookie) {
2889 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2891 mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n");
2892 goto err_alloc_cookie;
2895 card->sleep_cookie_vbase = NULL;
2901 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2903 mwifiex_pcie_delete_evtbd_ring(adapter);
2905 mwifiex_pcie_delete_rxbd_ring(adapter);
2907 mwifiex_pcie_delete_txbd_ring(adapter);
2912 static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter)
2914 struct pcie_service_card *card = adapter->card;
2915 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2917 if (reg->sleep_cookie)
2918 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2920 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2921 mwifiex_pcie_delete_evtbd_ring(adapter);
2922 mwifiex_pcie_delete_rxbd_ring(adapter);
2923 mwifiex_pcie_delete_txbd_ring(adapter);
2924 card->cmdrsp_buf = NULL;
2928 * This function initializes the PCI-E host memory space, WCB rings, etc.
2930 static int mwifiex_init_pcie(struct mwifiex_adapter *adapter)
2932 struct pcie_service_card *card = adapter->card;
2934 struct pci_dev *pdev = card->dev;
2936 pci_set_drvdata(pdev, card);
2938 ret = pci_enable_device(pdev);
2940 goto err_enable_dev;
2942 pci_set_master(pdev);
2944 pr_notice("try set_consistent_dma_mask(32)\n");
2945 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2947 pr_err("set_dma_mask(32) failed\n");
2948 goto err_set_dma_mask;
2951 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2953 pr_err("set_consistent_dma_mask(64) failed\n");
2954 goto err_set_dma_mask;
2957 ret = pci_request_region(pdev, 0, DRV_NAME);
2959 pr_err("req_reg(0) error\n");
2960 goto err_req_region0;
2962 card->pci_mmap = pci_iomap(pdev, 0, 0);
2963 if (!card->pci_mmap) {
2964 pr_err("iomap(0) error\n");
2968 ret = pci_request_region(pdev, 2, DRV_NAME);
2970 pr_err("req_reg(2) error\n");
2971 goto err_req_region2;
2973 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2974 if (!card->pci_mmap1) {
2975 pr_err("iomap(2) error\n");
2980 pr_notice("PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2981 card->pci_mmap, card->pci_mmap1);
2983 ret = mwifiex_pcie_alloc_buffers(adapter);
2985 goto err_alloc_buffers;
2990 pci_iounmap(pdev, card->pci_mmap1);
2992 pci_release_region(pdev, 2);
2994 pci_iounmap(pdev, card->pci_mmap);
2996 pci_release_region(pdev, 0);
2999 pci_disable_device(pdev);
3005 * This function cleans up the allocated card buffers.
3007 static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter)
3009 struct pcie_service_card *card = adapter->card;
3010 struct pci_dev *pdev = card->dev;
3011 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3015 cancel_work_sync(&card->work);
3017 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
3018 if (fw_status == FIRMWARE_READY_PCIE) {
3019 mwifiex_dbg(adapter, INFO,
3020 "Clearing driver ready signature\n");
3021 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3022 mwifiex_dbg(adapter, ERROR,
3023 "Failed to write driver not-ready signature\n");
3026 mwifiex_pcie_free_buffers(adapter);
3029 pci_iounmap(pdev, card->pci_mmap);
3030 pci_iounmap(pdev, card->pci_mmap1);
3031 pci_disable_device(pdev);
3032 pci_release_region(pdev, 2);
3033 pci_release_region(pdev, 0);
3037 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
3040 struct pcie_service_card *card = adapter->card;
3041 struct pci_dev *pdev = card->dev;
3043 if (card->pcie.reg->msix_support) {
3044 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3045 card->msix_entries[i].entry = i;
3046 ret = pci_enable_msix_exact(pdev, card->msix_entries,
3047 MWIFIEX_NUM_MSIX_VECTORS);
3049 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) {
3050 card->msix_ctx[i].dev = pdev;
3051 card->msix_ctx[i].msg_id = i;
3053 ret = request_irq(card->msix_entries[i].vector,
3054 mwifiex_pcie_interrupt, 0,
3055 "MWIFIEX_PCIE_MSIX",
3056 &card->msix_ctx[i]);
3062 mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n",
3064 for (j = 0; j < i; j++)
3065 free_irq(card->msix_entries[j].vector,
3066 &card->msix_ctx[i]);
3067 pci_disable_msix(pdev);
3069 mwifiex_dbg(adapter, MSG, "MSIx enabled!");
3070 card->msix_enable = 1;
3076 if (pci_enable_msi(pdev) != 0)
3077 pci_disable_msi(pdev);
3079 card->msi_enable = 1;
3081 mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
3083 card->share_irq_ctx.dev = pdev;
3084 card->share_irq_ctx.msg_id = -1;
3085 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
3086 "MRVL_PCIE", &card->share_irq_ctx);
3088 pr_err("request_irq failed: ret=%d\n", ret);
3096 * This function gets the firmware name for downloading by revision id
3098 * Read revision id register to get revision id
3100 static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter)
3102 int revision_id = 0;
3104 struct pcie_service_card *card = adapter->card;
3106 switch (card->dev->device) {
3107 case PCIE_DEVICE_ID_MARVELL_88W8766P:
3108 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
3110 case PCIE_DEVICE_ID_MARVELL_88W8897:
3111 mwifiex_write_reg(adapter, 0x0c58, 0x80c00000);
3112 mwifiex_read_reg(adapter, 0x0c58, &revision_id);
3113 revision_id &= 0xff00;
3114 switch (revision_id) {
3116 strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME);
3119 strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME);
3122 strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME);
3127 case PCIE_DEVICE_ID_MARVELL_88W8997:
3128 mwifiex_read_reg(adapter, 0x8, &revision_id);
3129 mwifiex_read_reg(adapter, 0x0cd0, &version);
3130 mwifiex_read_reg(adapter, 0x0cd4, &magic);
3131 revision_id &= 0xff;
3134 if (revision_id == PCIE8997_A1 &&
3135 magic == CHIP_MAGIC_VALUE &&
3136 version == CHIP_VER_PCIEUART)
3137 strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4);
3139 strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4);
3147 * This function registers the PCIE device.
3149 * PCIE IRQ is claimed, block size is set and driver data is initialized.
3151 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
3153 struct pcie_service_card *card = adapter->card;
3155 /* save adapter pointer in card */
3156 card->adapter = adapter;
3158 if (mwifiex_pcie_request_irq(adapter))
3161 adapter->tx_buf_size = card->pcie.tx_buf_size;
3162 adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
3163 adapter->num_mem_types = card->pcie.num_mem_types;
3164 adapter->ext_scan = card->pcie.can_ext_scan;
3165 mwifiex_pcie_get_fw_name(adapter);
3171 * This function unregisters the PCIE device.
3173 * The PCIE IRQ is released, the function is disabled and driver
3174 * data is set to null.
3176 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
3178 struct pcie_service_card *card = adapter->card;
3179 struct pci_dev *pdev = card->dev;
3182 if (card->msix_enable) {
3183 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3184 synchronize_irq(card->msix_entries[i].vector);
3186 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3187 free_irq(card->msix_entries[i].vector,
3188 &card->msix_ctx[i]);
3190 card->msix_enable = 0;
3191 pci_disable_msix(pdev);
3193 mwifiex_dbg(adapter, INFO,
3194 "%s(): calling free_irq()\n", __func__);
3195 free_irq(card->dev->irq, &card->share_irq_ctx);
3197 if (card->msi_enable)
3198 pci_disable_msi(pdev);
3200 card->adapter = NULL;
3204 * This function initializes the PCI-E host memory space, WCB rings, etc.,
3205 * similar to mwifiex_init_pcie(), but without resetting PCI-E state.
3207 static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter)
3209 struct pcie_service_card *card = adapter->card;
3211 struct pci_dev *pdev = card->dev;
3213 /* tx_buf_size might be changed to 3584 by firmware during
3214 * data transfer, we should reset it to default size.
3216 adapter->tx_buf_size = card->pcie.tx_buf_size;
3218 ret = mwifiex_pcie_alloc_buffers(adapter);
3222 pci_iounmap(pdev, card->pci_mmap1);
3225 /* This function cleans up the PCI-E host memory space. */
3226 static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter)
3228 struct pcie_service_card *card = adapter->card;
3229 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3231 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3232 mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n");
3234 adapter->seq_num = 0;
3236 mwifiex_pcie_free_buffers(adapter);
3239 static struct mwifiex_if_ops pcie_ops = {
3240 .init_if = mwifiex_init_pcie,
3241 .cleanup_if = mwifiex_cleanup_pcie,
3242 .check_fw_status = mwifiex_check_fw_status,
3243 .check_winner_status = mwifiex_check_winner_status,
3244 .prog_fw = mwifiex_prog_fw_w_helper,
3245 .register_dev = mwifiex_register_dev,
3246 .unregister_dev = mwifiex_unregister_dev,
3247 .enable_int = mwifiex_pcie_enable_host_int,
3248 .disable_int = mwifiex_pcie_disable_host_int_noerr,
3249 .process_int_status = mwifiex_process_int_status,
3250 .host_to_card = mwifiex_pcie_host_to_card,
3251 .wakeup = mwifiex_pm_wakeup_card,
3252 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
3255 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
3256 .event_complete = mwifiex_pcie_event_complete,
3257 .update_mp_end_port = NULL,
3258 .cleanup_mpa_buf = NULL,
3259 .init_fw_port = mwifiex_pcie_init_fw_port,
3260 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
3261 .card_reset = mwifiex_pcie_card_reset,
3262 .reg_dump = mwifiex_pcie_reg_dump,
3263 .device_dump = mwifiex_pcie_device_dump,
3264 .down_dev = mwifiex_pcie_down_dev,
3265 .up_dev = mwifiex_pcie_up_dev,
3268 module_pci_driver(mwifiex_pcie);
3270 MODULE_AUTHOR("Marvell International Ltd.");
3271 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
3272 MODULE_VERSION(PCIE_VERSION);
3273 MODULE_LICENSE("GPL v2");