2 * Marvell Wireless LAN device driver: PCIE specific handling
4 * Copyright (C) 2011, 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"
36 static struct mwifiex_if_ops pcie_ops;
38 static struct semaphore add_remove_card_sem;
41 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
44 struct pcie_service_card *card = adapter->card;
47 buf_pa = pci_map_single(card->dev, skb->data, size, flags);
48 if (pci_dma_mapping_error(card->dev, buf_pa)) {
49 dev_err(adapter->dev, "failed to map pci memory!\n");
52 memcpy(skb->cb, &buf_pa, sizeof(dma_addr_t));
57 * This function reads sleep cookie and checks if FW is ready
59 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
62 struct pcie_service_card *card = adapter->card;
63 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
65 if (!reg->sleep_cookie)
68 if (card->sleep_cookie_vbase) {
69 cookie_addr = (u32 *)card->sleep_cookie_vbase;
70 dev_dbg(adapter->dev, "info: ACCESS_HW: sleep cookie=0x%x\n",
72 if (*cookie_addr == FW_AWAKE_COOKIE)
79 #ifdef CONFIG_PM_SLEEP
81 * Kernel needs to suspend all functions separately. Therefore all
82 * registered functions must have drivers with suspend and resume
83 * methods. Failing that the kernel simply removes the whole card.
85 * If already not suspended, this function allocates and sends a host
86 * sleep activate request to the firmware and turns off the traffic.
88 static int mwifiex_pcie_suspend(struct device *dev)
90 struct mwifiex_adapter *adapter;
91 struct pcie_service_card *card;
93 struct pci_dev *pdev = to_pci_dev(dev);
96 card = pci_get_drvdata(pdev);
97 if (!card || !card->adapter) {
98 pr_err("Card or adapter structure is not valid\n");
102 pr_err("PCIE device is not specified\n");
106 adapter = card->adapter;
108 hs_actived = mwifiex_enable_hs(adapter);
110 /* Indicate device suspended */
111 adapter->is_suspended = true;
117 * Kernel needs to suspend all functions separately. Therefore all
118 * registered functions must have drivers with suspend and resume
119 * methods. Failing that the kernel simply removes the whole card.
121 * If already not resumed, this function turns on the traffic and
122 * sends a host sleep cancel request to the firmware.
124 static int mwifiex_pcie_resume(struct device *dev)
126 struct mwifiex_adapter *adapter;
127 struct pcie_service_card *card;
128 struct pci_dev *pdev = to_pci_dev(dev);
131 card = pci_get_drvdata(pdev);
132 if (!card || !card->adapter) {
133 pr_err("Card or adapter structure is not valid\n");
137 pr_err("PCIE device is not specified\n");
141 adapter = card->adapter;
143 if (!adapter->is_suspended) {
144 dev_warn(adapter->dev, "Device already resumed\n");
148 adapter->is_suspended = false;
150 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
158 * This function probes an mwifiex device and registers it. It allocates
159 * the card structure, enables PCIE function number and initiates the
160 * device registration and initialization procedure by adding a logical
163 static int mwifiex_pcie_probe(struct pci_dev *pdev,
164 const struct pci_device_id *ent)
166 struct pcie_service_card *card;
168 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
169 pdev->vendor, pdev->device, pdev->revision);
171 card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
177 if (ent->driver_data) {
178 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
179 card->pcie.firmware = data->firmware;
180 card->pcie.reg = data->reg;
181 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
184 if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
186 pr_err("%s failed\n", __func__);
195 * This function removes the interface and frees up the card structure.
197 static void mwifiex_pcie_remove(struct pci_dev *pdev)
199 struct pcie_service_card *card;
200 struct mwifiex_adapter *adapter;
201 struct mwifiex_private *priv;
204 card = pci_get_drvdata(pdev);
208 adapter = card->adapter;
209 if (!adapter || !adapter->priv_num)
212 /* In case driver is removed when asynchronous FW load is in progress */
213 wait_for_completion(&adapter->fw_load);
216 #ifdef CONFIG_PM_SLEEP
217 if (adapter->is_suspended)
218 mwifiex_pcie_resume(&pdev->dev);
221 for (i = 0; i < adapter->priv_num; i++)
222 if ((GET_BSS_ROLE(adapter->priv[i]) ==
223 MWIFIEX_BSS_ROLE_STA) &&
224 adapter->priv[i]->media_connected)
225 mwifiex_deauthenticate(adapter->priv[i], NULL);
227 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
229 mwifiex_disable_auto_ds(priv);
231 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
234 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
237 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
240 mwifiex_pcie_remove(pdev);
245 static DEFINE_PCI_DEVICE_TABLE(mwifiex_ids) = {
247 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
248 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
249 .driver_data = (unsigned long) &mwifiex_pcie8766,
252 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
253 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
254 .driver_data = (unsigned long) &mwifiex_pcie8897,
259 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
261 #ifdef CONFIG_PM_SLEEP
262 /* Power Management Hooks */
263 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
264 mwifiex_pcie_resume);
267 /* PCI Device Driver */
268 static struct pci_driver __refdata mwifiex_pcie = {
269 .name = "mwifiex_pcie",
270 .id_table = mwifiex_ids,
271 .probe = mwifiex_pcie_probe,
272 .remove = mwifiex_pcie_remove,
273 #ifdef CONFIG_PM_SLEEP
275 .pm = &mwifiex_pcie_pm_ops,
278 .shutdown = mwifiex_pcie_shutdown,
282 * This function writes data into PCIE card register.
284 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
286 struct pcie_service_card *card = adapter->card;
288 iowrite32(data, card->pci_mmap1 + reg);
294 * This function reads data from PCIE card register.
296 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
298 struct pcie_service_card *card = adapter->card;
300 *data = ioread32(card->pci_mmap1 + reg);
306 * This function adds delay loop to ensure FW is awake before proceeding.
308 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
312 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
314 usleep_range(10, 20);
323 /* This function wakes up the card by reading fw_status register. */
324 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
327 struct pcie_service_card *card = adapter->card;
328 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
330 dev_dbg(adapter->dev, "event: Wakeup device...\n");
332 if (reg->sleep_cookie)
333 mwifiex_pcie_dev_wakeup_delay(adapter);
335 /* Reading fw_status register will wakeup device */
336 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status)) {
337 dev_warn(adapter->dev, "Reading fw_status register failed\n");
341 if (reg->sleep_cookie) {
342 mwifiex_pcie_dev_wakeup_delay(adapter);
343 dev_dbg(adapter->dev, "PCIE wakeup: Setting PS_STATE_AWAKE\n");
344 adapter->ps_state = PS_STATE_AWAKE;
351 * This function is called after the card has woken up.
353 * The card configuration register is reset.
355 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
357 dev_dbg(adapter->dev, "cmd: Wakeup device completed\n");
363 * This function disables the host interrupt.
365 * The host interrupt mask is read, the disable bit is reset and
366 * written back to the card host interrupt mask register.
368 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
370 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
371 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
373 dev_warn(adapter->dev, "Disable host interrupt failed\n");
382 * This function enables the host interrupt.
384 * The host interrupt enable mask is written to the card
385 * host interrupt mask register.
387 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
389 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
390 /* Simply write the mask to the register */
391 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
393 dev_warn(adapter->dev, "Enable host interrupt failed\n");
402 * This function initializes TX buffer ring descriptors
404 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
406 struct pcie_service_card *card = adapter->card;
407 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
408 struct mwifiex_pcie_buf_desc *desc;
409 struct mwifiex_pfu_buf_desc *desc2;
412 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
413 card->tx_buf_list[i] = NULL;
414 if (reg->pfu_enabled) {
415 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
416 (sizeof(*desc2) * i);
417 desc2 = card->txbd_ring[i];
418 memset(desc2, 0, sizeof(*desc2));
420 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
422 desc = card->txbd_ring[i];
423 memset(desc, 0, sizeof(*desc));
430 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
431 * here and after mapping PCI memory, its physical address is assigned to
432 * PCIE Rx buffer descriptor's physical address.
434 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
436 struct pcie_service_card *card = adapter->card;
437 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
439 struct mwifiex_pcie_buf_desc *desc;
440 struct mwifiex_pfu_buf_desc *desc2;
444 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
445 /* Allocate skb here so that firmware can DMA data from it */
446 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
448 dev_err(adapter->dev,
449 "Unable to allocate skb for RX ring.\n");
450 kfree(card->rxbd_ring_vbase);
454 if (mwifiex_map_pci_memory(adapter, skb,
455 MWIFIEX_RX_DATA_BUF_SIZE,
459 MWIFIEX_SKB_PACB(skb, &buf_pa);
461 dev_dbg(adapter->dev,
462 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
463 skb, skb->len, skb->data, (u32)buf_pa,
464 (u32)((u64)buf_pa >> 32));
466 card->rx_buf_list[i] = skb;
467 if (reg->pfu_enabled) {
468 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
469 (sizeof(*desc2) * i);
470 desc2 = card->rxbd_ring[i];
471 desc2->paddr = buf_pa;
472 desc2->len = (u16)skb->len;
473 desc2->frag_len = (u16)skb->len;
474 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
477 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
478 (sizeof(*desc) * i));
479 desc = card->rxbd_ring[i];
480 desc->paddr = buf_pa;
481 desc->len = (u16)skb->len;
489 /* This function initializes event buffer ring descriptors. Each SKB is
490 * allocated here and after mapping PCI memory, its physical address is assigned
491 * to PCIE Rx buffer descriptor's physical address
493 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
495 struct pcie_service_card *card = adapter->card;
496 struct mwifiex_evt_buf_desc *desc;
501 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
502 /* Allocate skb here so that firmware can DMA data from it */
503 skb = dev_alloc_skb(MAX_EVENT_SIZE);
505 dev_err(adapter->dev,
506 "Unable to allocate skb for EVENT buf.\n");
507 kfree(card->evtbd_ring_vbase);
510 skb_put(skb, MAX_EVENT_SIZE);
512 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
516 MWIFIEX_SKB_PACB(skb, &buf_pa);
518 dev_dbg(adapter->dev,
519 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
520 skb, skb->len, skb->data, (u32)buf_pa,
521 (u32)((u64)buf_pa >> 32));
523 card->evt_buf_list[i] = skb;
524 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
525 (sizeof(*desc) * i));
526 desc = card->evtbd_ring[i];
527 desc->paddr = buf_pa;
528 desc->len = (u16)skb->len;
535 /* This function cleans up TX buffer rings. If any of the buffer list has valid
536 * SKB address, associated SKB is freed.
538 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
540 struct pcie_service_card *card = adapter->card;
541 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
543 struct mwifiex_pcie_buf_desc *desc;
544 struct mwifiex_pfu_buf_desc *desc2;
547 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
548 if (reg->pfu_enabled) {
549 desc2 = card->txbd_ring[i];
550 if (card->tx_buf_list[i]) {
551 skb = card->tx_buf_list[i];
552 pci_unmap_single(card->dev, desc2->paddr,
553 skb->len, PCI_DMA_TODEVICE);
554 dev_kfree_skb_any(skb);
556 memset(desc2, 0, sizeof(*desc2));
558 desc = card->txbd_ring[i];
559 if (card->tx_buf_list[i]) {
560 skb = card->tx_buf_list[i];
561 pci_unmap_single(card->dev, desc->paddr,
562 skb->len, PCI_DMA_TODEVICE);
563 dev_kfree_skb_any(skb);
565 memset(desc, 0, sizeof(*desc));
567 card->tx_buf_list[i] = NULL;
573 /* This function cleans up RX buffer rings. If any of the buffer list has valid
574 * SKB address, associated SKB is freed.
576 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
578 struct pcie_service_card *card = adapter->card;
579 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
580 struct mwifiex_pcie_buf_desc *desc;
581 struct mwifiex_pfu_buf_desc *desc2;
585 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
586 if (reg->pfu_enabled) {
587 desc2 = card->rxbd_ring[i];
588 if (card->rx_buf_list[i]) {
589 skb = card->rx_buf_list[i];
590 pci_unmap_single(card->dev, desc2->paddr,
591 skb->len, PCI_DMA_FROMDEVICE);
592 dev_kfree_skb_any(skb);
594 memset(desc2, 0, sizeof(*desc2));
596 desc = card->rxbd_ring[i];
597 if (card->rx_buf_list[i]) {
598 skb = card->rx_buf_list[i];
599 pci_unmap_single(card->dev, desc->paddr,
600 skb->len, PCI_DMA_FROMDEVICE);
601 dev_kfree_skb_any(skb);
603 memset(desc, 0, sizeof(*desc));
605 card->rx_buf_list[i] = NULL;
611 /* This function cleans up event buffer rings. If any of the buffer list has
612 * valid SKB address, associated SKB is freed.
614 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
616 struct pcie_service_card *card = adapter->card;
617 struct mwifiex_evt_buf_desc *desc;
621 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
622 desc = card->evtbd_ring[i];
623 if (card->evt_buf_list[i]) {
624 skb = card->evt_buf_list[i];
625 pci_unmap_single(card->dev, desc->paddr, MAX_EVENT_SIZE,
627 dev_kfree_skb_any(skb);
629 card->evt_buf_list[i] = NULL;
630 memset(desc, 0, sizeof(*desc));
636 /* This function creates buffer descriptor ring for TX
638 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
640 struct pcie_service_card *card = adapter->card;
641 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
644 * driver maintaines the write pointer and firmware maintaines the read
645 * pointer. The write pointer starts at 0 (zero) while the read pointer
646 * starts at zero with rollover bit set
648 card->txbd_wrptr = 0;
650 if (reg->pfu_enabled)
651 card->txbd_rdptr = 0;
653 card->txbd_rdptr |= reg->tx_rollover_ind;
655 /* allocate shared memory for the BD ring and divide the same in to
656 several descriptors */
657 if (reg->pfu_enabled)
658 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
661 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
664 dev_dbg(adapter->dev, "info: txbd_ring: Allocating %d bytes\n",
665 card->txbd_ring_size);
666 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
667 card->txbd_ring_size,
668 &card->txbd_ring_pbase);
669 if (!card->txbd_ring_vbase) {
670 dev_err(adapter->dev,
671 "allocate consistent memory (%d bytes) failed!\n",
672 card->txbd_ring_size);
675 dev_dbg(adapter->dev,
676 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
677 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
678 (u32)((u64)card->txbd_ring_pbase >> 32), card->txbd_ring_size);
680 return mwifiex_init_txq_ring(adapter);
683 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
685 struct pcie_service_card *card = adapter->card;
686 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
688 mwifiex_cleanup_txq_ring(adapter);
690 if (card->txbd_ring_vbase)
691 pci_free_consistent(card->dev, card->txbd_ring_size,
692 card->txbd_ring_vbase,
693 card->txbd_ring_pbase);
694 card->txbd_ring_size = 0;
695 card->txbd_wrptr = 0;
696 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
697 card->txbd_ring_vbase = NULL;
698 card->txbd_ring_pbase = 0;
704 * This function creates buffer descriptor ring for RX
706 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
708 struct pcie_service_card *card = adapter->card;
709 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
712 * driver maintaines the read pointer and firmware maintaines the write
713 * pointer. The write pointer starts at 0 (zero) while the read pointer
714 * starts at zero with rollover bit set
716 card->rxbd_wrptr = 0;
717 card->rxbd_rdptr = reg->rx_rollover_ind;
719 if (reg->pfu_enabled)
720 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
723 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
726 dev_dbg(adapter->dev, "info: rxbd_ring: Allocating %d bytes\n",
727 card->rxbd_ring_size);
728 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
729 card->rxbd_ring_size,
730 &card->rxbd_ring_pbase);
731 if (!card->rxbd_ring_vbase) {
732 dev_err(adapter->dev,
733 "allocate consistent memory (%d bytes) failed!\n",
734 card->rxbd_ring_size);
738 dev_dbg(adapter->dev,
739 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
740 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
741 (u32)((u64)card->rxbd_ring_pbase >> 32),
742 card->rxbd_ring_size);
744 return mwifiex_init_rxq_ring(adapter);
748 * This function deletes Buffer descriptor ring for RX
750 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
752 struct pcie_service_card *card = adapter->card;
753 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
755 mwifiex_cleanup_rxq_ring(adapter);
757 if (card->rxbd_ring_vbase)
758 pci_free_consistent(card->dev, card->rxbd_ring_size,
759 card->rxbd_ring_vbase,
760 card->rxbd_ring_pbase);
761 card->rxbd_ring_size = 0;
762 card->rxbd_wrptr = 0;
763 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
764 card->rxbd_ring_vbase = NULL;
765 card->rxbd_ring_pbase = 0;
771 * This function creates buffer descriptor ring for Events
773 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
775 struct pcie_service_card *card = adapter->card;
776 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
779 * driver maintaines the read pointer and firmware maintaines the write
780 * pointer. The write pointer starts at 0 (zero) while the read pointer
781 * starts at zero with rollover bit set
783 card->evtbd_wrptr = 0;
784 card->evtbd_rdptr = reg->evt_rollover_ind;
786 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
789 dev_dbg(adapter->dev, "info: evtbd_ring: Allocating %d bytes\n",
790 card->evtbd_ring_size);
791 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
792 card->evtbd_ring_size,
793 &card->evtbd_ring_pbase);
794 if (!card->evtbd_ring_vbase) {
795 dev_err(adapter->dev,
796 "allocate consistent memory (%d bytes) failed!\n",
797 card->evtbd_ring_size);
801 dev_dbg(adapter->dev,
802 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
803 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
804 (u32)((u64)card->evtbd_ring_pbase >> 32),
805 card->evtbd_ring_size);
807 return mwifiex_pcie_init_evt_ring(adapter);
811 * This function deletes Buffer descriptor ring for Events
813 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
815 struct pcie_service_card *card = adapter->card;
816 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
818 mwifiex_cleanup_evt_ring(adapter);
820 if (card->evtbd_ring_vbase)
821 pci_free_consistent(card->dev, card->evtbd_ring_size,
822 card->evtbd_ring_vbase,
823 card->evtbd_ring_pbase);
824 card->evtbd_wrptr = 0;
825 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
826 card->evtbd_ring_size = 0;
827 card->evtbd_ring_vbase = NULL;
828 card->evtbd_ring_pbase = 0;
834 * This function allocates a buffer for CMDRSP
836 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
838 struct pcie_service_card *card = adapter->card;
841 /* Allocate memory for receiving command response data */
842 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
844 dev_err(adapter->dev,
845 "Unable to allocate skb for command response data.\n");
848 skb_put(skb, MWIFIEX_UPLD_SIZE);
849 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
853 card->cmdrsp_buf = skb;
859 * This function deletes a buffer for CMDRSP
861 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
863 struct pcie_service_card *card;
869 card = adapter->card;
871 if (card && card->cmdrsp_buf) {
872 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &buf_pa);
873 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
875 dev_kfree_skb_any(card->cmdrsp_buf);
878 if (card && card->cmd_buf) {
879 MWIFIEX_SKB_PACB(card->cmd_buf, &buf_pa);
880 pci_unmap_single(card->dev, buf_pa, card->cmd_buf->len,
887 * This function allocates a buffer for sleep cookie
889 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
891 struct pcie_service_card *card = adapter->card;
893 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
894 &card->sleep_cookie_pbase);
895 if (!card->sleep_cookie_vbase) {
896 dev_err(adapter->dev, "pci_alloc_consistent failed!\n");
899 /* Init val of Sleep Cookie */
900 *(u32 *)card->sleep_cookie_vbase = FW_AWAKE_COOKIE;
902 dev_dbg(adapter->dev, "alloc_scook: sleep cookie=0x%x\n",
903 *((u32 *)card->sleep_cookie_vbase));
909 * This function deletes buffer for sleep cookie
911 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
913 struct pcie_service_card *card;
918 card = adapter->card;
920 if (card && card->sleep_cookie_vbase) {
921 pci_free_consistent(card->dev, sizeof(u32),
922 card->sleep_cookie_vbase,
923 card->sleep_cookie_pbase);
924 card->sleep_cookie_vbase = NULL;
930 /* This function flushes the TX buffer descriptor ring
931 * This function defined as handler is also called while cleaning TXRX
932 * during disconnect/ bss stop.
934 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
936 struct pcie_service_card *card = adapter->card;
938 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
939 card->txbd_flush = 1;
940 /* write pointer already set at last send
941 * send dnld-rdy intr again, wait for completion.
943 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
944 CPU_INTR_DNLD_RDY)) {
945 dev_err(adapter->dev,
946 "failed to assert dnld-rdy interrupt.\n");
954 * This function unmaps and frees downloaded data buffer
956 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
960 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
961 struct mwifiex_pcie_buf_desc *desc;
962 struct mwifiex_pfu_buf_desc *desc2;
963 struct pcie_service_card *card = adapter->card;
964 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
966 if (!mwifiex_pcie_ok_to_access_hw(adapter))
967 mwifiex_pm_wakeup_card(adapter);
969 /* Read the TX ring read pointer set by firmware */
970 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
971 dev_err(adapter->dev,
972 "SEND COMP: failed to read reg->tx_rdptr\n");
976 dev_dbg(adapter->dev, "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
977 card->txbd_rdptr, rdptr);
979 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
980 /* free from previous txbd_rdptr to current txbd_rdptr */
981 while (((card->txbd_rdptr & reg->tx_mask) !=
982 (rdptr & reg->tx_mask)) ||
983 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
984 (rdptr & reg->tx_rollover_ind))) {
985 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
988 skb = card->tx_buf_list[wrdoneidx];
990 dev_dbg(adapter->dev,
991 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
993 MWIFIEX_SKB_PACB(skb, &buf_pa);
994 pci_unmap_single(card->dev, buf_pa, skb->len,
999 if (card->txbd_flush)
1000 mwifiex_write_data_complete(adapter, skb, 0,
1003 mwifiex_write_data_complete(adapter, skb, 0, 0);
1006 card->tx_buf_list[wrdoneidx] = NULL;
1008 if (reg->pfu_enabled) {
1009 desc2 = (void *)card->txbd_ring[wrdoneidx];
1010 memset(desc2, 0, sizeof(*desc2));
1012 desc = card->txbd_ring[wrdoneidx];
1013 memset(desc, 0, sizeof(*desc));
1015 switch (card->dev->device) {
1016 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1019 case PCIE_DEVICE_ID_MARVELL_88W8897:
1020 card->txbd_rdptr += reg->ring_tx_start_ptr;
1025 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1026 card->txbd_rdptr = ((card->txbd_rdptr &
1027 reg->tx_rollover_ind) ^
1028 reg->tx_rollover_ind);
1032 adapter->data_sent = false;
1034 if (card->txbd_flush) {
1035 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1036 card->txbd_flush = 0;
1038 mwifiex_clean_pcie_ring_buf(adapter);
1044 /* This function sends data buffer to device. First 4 bytes of payload
1045 * are filled with payload length and payload type. Then this payload
1046 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1047 * Download ready interrupt to FW is deffered if Tx ring is not full and
1048 * additional payload can be accomodated.
1051 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1052 struct mwifiex_tx_param *tx_param)
1054 struct pcie_service_card *card = adapter->card;
1055 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1056 u32 wrindx, num_tx_buffs, rx_val;
1059 struct mwifiex_pcie_buf_desc *desc = NULL;
1060 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1063 if (!(skb->data && skb->len)) {
1064 dev_err(adapter->dev, "%s(): invalid parameter <%p, %#x>\n",
1065 __func__, skb->data, skb->len);
1069 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1070 mwifiex_pm_wakeup_card(adapter);
1072 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1073 dev_dbg(adapter->dev, "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1074 card->txbd_rdptr, card->txbd_wrptr);
1075 if (mwifiex_pcie_txbd_not_full(card)) {
1078 adapter->data_sent = true;
1079 payload = skb->data;
1080 tmp = (__le16 *)&payload[0];
1081 *tmp = cpu_to_le16((u16)skb->len);
1082 tmp = (__le16 *)&payload[2];
1083 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
1085 if (mwifiex_map_pci_memory(adapter, skb, skb->len ,
1089 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1090 MWIFIEX_SKB_PACB(skb, &buf_pa);
1091 card->tx_buf_list[wrindx] = skb;
1093 if (reg->pfu_enabled) {
1094 desc2 = (void *)card->txbd_ring[wrindx];
1095 desc2->paddr = buf_pa;
1096 desc2->len = (u16)skb->len;
1097 desc2->frag_len = (u16)skb->len;
1099 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1100 MWIFIEX_BD_FLAG_LAST_DESC;
1102 desc = card->txbd_ring[wrindx];
1103 desc->paddr = buf_pa;
1104 desc->len = (u16)skb->len;
1105 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1106 MWIFIEX_BD_FLAG_LAST_DESC;
1109 switch (card->dev->device) {
1110 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1113 case PCIE_DEVICE_ID_MARVELL_88W8897:
1114 card->txbd_wrptr += reg->ring_tx_start_ptr;
1118 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1119 card->txbd_wrptr = ((card->txbd_wrptr &
1120 reg->tx_rollover_ind) ^
1121 reg->tx_rollover_ind);
1123 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1124 /* Write the TX ring write pointer in to reg->tx_wrptr */
1125 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1126 card->txbd_wrptr | rx_val)) {
1127 dev_err(adapter->dev,
1128 "SEND DATA: failed to write reg->tx_wrptr\n");
1132 if ((mwifiex_pcie_txbd_not_full(card)) &&
1133 tx_param->next_pkt_len) {
1134 /* have more packets and TxBD still can hold more */
1135 dev_dbg(adapter->dev,
1136 "SEND DATA: delay dnld-rdy interrupt.\n");
1137 adapter->data_sent = false;
1139 /* Send the TX ready interrupt */
1140 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1141 CPU_INTR_DNLD_RDY)) {
1142 dev_err(adapter->dev,
1143 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1148 dev_dbg(adapter->dev, "info: SEND DATA: Updated <Rd: %#x, Wr: "
1149 "%#x> and sent packet to firmware successfully\n",
1150 card->txbd_rdptr, card->txbd_wrptr);
1152 dev_dbg(adapter->dev,
1153 "info: TX Ring full, can't send packets to fw\n");
1154 adapter->data_sent = true;
1155 /* Send the TX ready interrupt */
1156 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1158 dev_err(adapter->dev,
1159 "SEND DATA: failed to assert door-bell intr\n");
1163 return -EINPROGRESS;
1165 MWIFIEX_SKB_PACB(skb, &buf_pa);
1166 pci_unmap_single(card->dev, buf_pa, skb->len, PCI_DMA_TODEVICE);
1167 card->tx_buf_list[wrindx] = NULL;
1168 if (reg->pfu_enabled)
1169 memset(desc2, 0, sizeof(*desc2));
1171 memset(desc, 0, sizeof(*desc));
1177 * This function handles received buffer ring and
1178 * dispatches packets to upper
1180 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1182 struct pcie_service_card *card = adapter->card;
1183 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1184 u32 wrptr, rd_index, tx_val;
1187 struct sk_buff *skb_tmp = NULL;
1188 struct mwifiex_pcie_buf_desc *desc;
1189 struct mwifiex_pfu_buf_desc *desc2;
1191 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1192 mwifiex_pm_wakeup_card(adapter);
1194 /* Read the RX ring Write pointer set by firmware */
1195 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1196 dev_err(adapter->dev,
1197 "RECV DATA: failed to read reg->rx_wrptr\n");
1201 card->rxbd_wrptr = wrptr;
1203 while (((wrptr & reg->rx_mask) !=
1204 (card->rxbd_rdptr & reg->rx_mask)) ||
1205 ((wrptr & reg->rx_rollover_ind) ==
1206 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1207 struct sk_buff *skb_data;
1211 rd_index = card->rxbd_rdptr & reg->rx_mask;
1212 skb_data = card->rx_buf_list[rd_index];
1214 /* If skb allocation was failed earlier for Rx packet,
1215 * rx_buf_list[rd_index] would have been left with a NULL.
1220 MWIFIEX_SKB_PACB(skb_data, &buf_pa);
1221 pci_unmap_single(card->dev, buf_pa, MWIFIEX_RX_DATA_BUF_SIZE,
1222 PCI_DMA_FROMDEVICE);
1223 card->rx_buf_list[rd_index] = NULL;
1225 /* Get data length from interface header -
1226 * first 2 bytes for len, next 2 bytes is for type
1228 pkt_len = *((__le16 *)skb_data->data);
1229 rx_len = le16_to_cpu(pkt_len);
1230 skb_put(skb_data, rx_len);
1231 dev_dbg(adapter->dev,
1232 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1233 card->rxbd_rdptr, wrptr, rx_len);
1234 skb_pull(skb_data, INTF_HEADER_LEN);
1235 mwifiex_handle_rx_packet(adapter, skb_data);
1237 skb_tmp = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
1239 dev_err(adapter->dev,
1240 "Unable to allocate skb.\n");
1244 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1245 MWIFIEX_RX_DATA_BUF_SIZE,
1246 PCI_DMA_FROMDEVICE))
1249 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa);
1251 dev_dbg(adapter->dev,
1252 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1254 card->rx_buf_list[rd_index] = skb_tmp;
1256 if (reg->pfu_enabled) {
1257 desc2 = (void *)card->rxbd_ring[rd_index];
1258 desc2->paddr = buf_pa;
1259 desc2->len = skb_tmp->len;
1260 desc2->frag_len = skb_tmp->len;
1262 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1264 desc = card->rxbd_ring[rd_index];
1265 desc->paddr = buf_pa;
1266 desc->len = skb_tmp->len;
1270 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1271 MWIFIEX_MAX_TXRX_BD) {
1272 card->rxbd_rdptr = ((card->rxbd_rdptr &
1273 reg->rx_rollover_ind) ^
1274 reg->rx_rollover_ind);
1276 dev_dbg(adapter->dev, "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1277 card->rxbd_rdptr, wrptr);
1279 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1280 /* Write the RX ring read pointer in to reg->rx_rdptr */
1281 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1282 card->rxbd_rdptr | tx_val)) {
1283 dev_err(adapter->dev,
1284 "RECV DATA: failed to write reg->rx_rdptr\n");
1289 /* Read the RX ring Write pointer set by firmware */
1290 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1291 dev_err(adapter->dev,
1292 "RECV DATA: failed to read reg->rx_wrptr\n");
1296 dev_dbg(adapter->dev,
1297 "info: RECV DATA: Rcvd packet from fw successfully\n");
1298 card->rxbd_wrptr = wrptr;
1306 * This function downloads the boot command to device
1309 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1312 struct pcie_service_card *card = adapter->card;
1313 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1315 if (!(skb->data && skb->len)) {
1316 dev_err(adapter->dev,
1317 "Invalid parameter in %s <%p. len %d>\n",
1318 __func__, skb->data, skb->len);
1322 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE))
1325 MWIFIEX_SKB_PACB(skb, &buf_pa);
1327 /* Write the lower 32bits of the physical address to low command
1328 * address scratch register
1330 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1331 dev_err(adapter->dev,
1332 "%s: failed to write download command to boot code.\n",
1334 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1339 /* Write the upper 32bits of the physical address to high command
1340 * address scratch register
1342 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1343 (u32)((u64)buf_pa >> 32))) {
1344 dev_err(adapter->dev,
1345 "%s: failed to write download command to boot code.\n",
1347 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1352 /* Write the command length to cmd_size scratch register */
1353 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1354 dev_err(adapter->dev,
1355 "%s: failed to write command len to cmd_size scratch reg\n",
1357 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1362 /* Ring the door bell */
1363 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1364 CPU_INTR_DOOR_BELL)) {
1365 dev_err(adapter->dev,
1366 "%s: failed to assert door-bell intr\n", __func__);
1367 pci_unmap_single(card->dev, buf_pa,
1368 MWIFIEX_UPLD_SIZE, PCI_DMA_TODEVICE);
1375 /* This function init rx port in firmware which in turn enables to receive data
1376 * from device before transmitting any packet.
1378 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1380 struct pcie_service_card *card = adapter->card;
1381 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1382 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1384 /* Write the RX ring read pointer in to reg->rx_rdptr */
1385 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1387 dev_err(adapter->dev,
1388 "RECV DATA: failed to write reg->rx_rdptr\n");
1394 /* This function downloads commands to the device
1397 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1399 struct pcie_service_card *card = adapter->card;
1400 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1402 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1403 u8 *payload = (u8 *)skb->data;
1405 if (!(skb->data && skb->len)) {
1406 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
1407 __func__, skb->data, skb->len);
1411 /* Make sure a command response buffer is available */
1412 if (!card->cmdrsp_buf) {
1413 dev_err(adapter->dev,
1414 "No response buffer available, send command failed\n");
1418 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1419 mwifiex_pm_wakeup_card(adapter);
1421 adapter->cmd_sent = true;
1423 *(__le16 *)&payload[0] = cpu_to_le16((u16)skb->len);
1424 *(__le16 *)&payload[2] = cpu_to_le16(MWIFIEX_TYPE_CMD);
1426 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1429 card->cmd_buf = skb;
1431 /* To send a command, the driver will:
1432 1. Write the 64bit physical address of the data buffer to
1433 cmd response address low + cmd response address high
1434 2. Ring the door bell (i.e. set the door bell interrupt)
1436 In response to door bell interrupt, the firmware will perform
1437 the DMA of the command packet (first header to obtain the total
1438 length and then rest of the command).
1441 if (card->cmdrsp_buf) {
1442 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &cmdrsp_buf_pa);
1443 /* Write the lower 32bits of the cmdrsp buffer physical
1445 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1446 (u32)cmdrsp_buf_pa)) {
1447 dev_err(adapter->dev,
1448 "Failed to write download cmd to boot code.\n");
1452 /* Write the upper 32bits of the cmdrsp buffer physical
1454 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1455 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1456 dev_err(adapter->dev,
1457 "Failed to write download cmd to boot code.\n");
1463 MWIFIEX_SKB_PACB(card->cmd_buf, &cmd_buf_pa);
1464 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1465 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1467 dev_err(adapter->dev,
1468 "Failed to write download cmd to boot code.\n");
1472 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1473 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1474 (u32)((u64)cmd_buf_pa >> 32))) {
1475 dev_err(adapter->dev,
1476 "Failed to write download cmd to boot code.\n");
1481 /* Write the command length to reg->cmd_size */
1482 if (mwifiex_write_reg(adapter, reg->cmd_size,
1483 card->cmd_buf->len)) {
1484 dev_err(adapter->dev,
1485 "Failed to write cmd len to reg->cmd_size\n");
1490 /* Ring the door bell */
1491 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1492 CPU_INTR_DOOR_BELL)) {
1493 dev_err(adapter->dev,
1494 "Failed to assert door-bell intr\n");
1501 adapter->cmd_sent = false;
1507 * This function handles command complete interrupt
1509 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1511 struct pcie_service_card *card = adapter->card;
1512 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1513 struct sk_buff *skb = card->cmdrsp_buf;
1519 dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1521 MWIFIEX_SKB_PACB(skb, &buf_pa);
1522 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1523 PCI_DMA_FROMDEVICE);
1525 pkt_len = *((__le16 *)skb->data);
1526 rx_len = le16_to_cpu(pkt_len);
1527 skb_trim(skb, rx_len);
1528 skb_pull(skb, INTF_HEADER_LEN);
1530 if (!adapter->curr_cmd) {
1531 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1532 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1534 while (reg->sleep_cookie && (count++ < 10) &&
1535 mwifiex_pcie_ok_to_access_hw(adapter))
1536 usleep_range(50, 60);
1538 dev_err(adapter->dev,
1539 "There is no command but got cmdrsp\n");
1541 memcpy(adapter->upld_buf, skb->data,
1542 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1543 skb_push(skb, INTF_HEADER_LEN);
1544 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1545 PCI_DMA_FROMDEVICE))
1548 MWIFIEX_SKB_PACB(skb, &buf_pa);
1549 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1550 adapter->curr_cmd->resp_skb = skb;
1551 adapter->cmd_resp_received = true;
1552 /* Take the pointer and set it to CMD node and will
1553 return in the response complete callback */
1554 card->cmdrsp_buf = NULL;
1556 /* Clear the cmd-rsp buffer address in scratch registers. This
1557 will prevent firmware from writing to the same response
1559 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1560 dev_err(adapter->dev,
1561 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1564 /* Write the upper 32bits of the cmdrsp buffer physical
1566 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1567 dev_err(adapter->dev,
1568 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1577 * Command Response processing complete handler
1579 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1580 struct sk_buff *skb)
1582 struct pcie_service_card *card = adapter->card;
1584 struct sk_buff *skb_tmp;
1587 card->cmdrsp_buf = skb;
1588 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1589 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1590 PCI_DMA_FROMDEVICE))
1594 skb_tmp = card->cmd_buf;
1596 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa);
1597 pci_unmap_single(card->dev, buf_pa, skb_tmp->len,
1598 PCI_DMA_FROMDEVICE);
1599 card->cmd_buf = NULL;
1606 * This function handles firmware event ready interrupt
1608 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1610 struct pcie_service_card *card = adapter->card;
1611 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1612 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1615 struct mwifiex_evt_buf_desc *desc;
1617 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1618 mwifiex_pm_wakeup_card(adapter);
1620 if (adapter->event_received) {
1621 dev_dbg(adapter->dev, "info: Event being processed, "
1622 "do not process this interrupt just yet\n");
1626 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1627 dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
1631 /* Read the event ring write pointer set by firmware */
1632 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1633 dev_err(adapter->dev,
1634 "EventReady: failed to read reg->evt_wrptr\n");
1638 dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1639 card->evtbd_rdptr, wrptr);
1640 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1641 & MWIFIEX_EVTBD_MASK)) ||
1642 ((wrptr & reg->evt_rollover_ind) ==
1643 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1644 struct sk_buff *skb_cmd;
1645 __le16 data_len = 0;
1648 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1649 skb_cmd = card->evt_buf_list[rdptr];
1650 MWIFIEX_SKB_PACB(skb_cmd, &buf_pa);
1651 pci_unmap_single(card->dev, buf_pa, MAX_EVENT_SIZE,
1652 PCI_DMA_FROMDEVICE);
1654 /* Take the pointer and set it to event pointer in adapter
1655 and will return back after event handling callback */
1656 card->evt_buf_list[rdptr] = NULL;
1657 desc = card->evtbd_ring[rdptr];
1658 memset(desc, 0, sizeof(*desc));
1660 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1661 adapter->event_cause = event;
1662 /* The first 4bytes will be the event transfer header
1663 len is 2 bytes followed by type which is 2 bytes */
1664 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1665 evt_len = le16_to_cpu(data_len);
1667 skb_pull(skb_cmd, INTF_HEADER_LEN);
1668 dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
1670 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1671 memcpy(adapter->event_body, skb_cmd->data +
1672 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1673 MWIFIEX_EVENT_HEADER_LEN);
1675 adapter->event_received = true;
1676 adapter->event_skb = skb_cmd;
1678 /* Do not update the event read pointer here, wait till the
1679 buffer is released. This is just to make things simpler,
1680 we need to find a better method of managing these buffers.
1688 * Event processing complete handler
1690 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1691 struct sk_buff *skb)
1693 struct pcie_service_card *card = adapter->card;
1694 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1696 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1699 struct mwifiex_evt_buf_desc *desc;
1704 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1705 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
1710 /* Read the event ring write pointer set by firmware */
1711 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1712 dev_err(adapter->dev,
1713 "event_complete: failed to read reg->evt_wrptr\n");
1717 if (!card->evt_buf_list[rdptr]) {
1718 skb_push(skb, INTF_HEADER_LEN);
1719 if (mwifiex_map_pci_memory(adapter, skb,
1721 PCI_DMA_FROMDEVICE))
1723 MWIFIEX_SKB_PACB(skb, &buf_pa);
1724 card->evt_buf_list[rdptr] = skb;
1725 MWIFIEX_SKB_PACB(skb, &buf_pa);
1726 desc = card->evtbd_ring[rdptr];
1727 desc->paddr = buf_pa;
1728 desc->len = (u16)skb->len;
1732 dev_dbg(adapter->dev,
1733 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1734 rdptr, card->evt_buf_list[rdptr], skb);
1737 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1738 card->evtbd_rdptr = ((card->evtbd_rdptr &
1739 reg->evt_rollover_ind) ^
1740 reg->evt_rollover_ind);
1743 dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1744 card->evtbd_rdptr, wrptr);
1746 /* Write the event ring read pointer in to reg->evt_rdptr */
1747 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1748 card->evtbd_rdptr)) {
1749 dev_err(adapter->dev,
1750 "event_complete: failed to read reg->evt_rdptr\n");
1754 dev_dbg(adapter->dev, "info: Check Events Again\n");
1755 ret = mwifiex_pcie_process_event_ready(adapter);
1761 * This function downloads the firmware to the card.
1763 * Firmware is downloaded to the card in blocks. Every block download
1764 * is tested for CRC errors, and retried a number of times before
1765 * returning failure.
1767 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1768 struct mwifiex_fw_image *fw)
1771 u8 *firmware = fw->fw_buf;
1772 u32 firmware_len = fw->fw_len;
1774 struct sk_buff *skb;
1775 u32 txlen, tx_blocks = 0, tries, len;
1776 u32 block_retry_cnt = 0;
1778 struct pcie_service_card *card = adapter->card;
1779 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1781 if (!firmware || !firmware_len) {
1782 dev_err(adapter->dev,
1783 "No firmware image found! Terminating download\n");
1787 dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
1790 if (mwifiex_pcie_disable_host_int(adapter)) {
1791 dev_err(adapter->dev,
1792 "%s: Disabling interrupts failed.\n", __func__);
1796 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1802 /* Perform firmware data transfer */
1807 if (offset >= firmware_len)
1810 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1811 ret = mwifiex_read_reg(adapter, reg->cmd_size,
1814 dev_warn(adapter->dev,
1815 "Failed reading len from boot code\n");
1820 usleep_range(10, 20);
1825 } else if (len > MWIFIEX_UPLD_SIZE) {
1826 pr_err("FW download failure @ %d, invalid length %d\n",
1836 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1837 pr_err("FW download failure @ %d, over max "
1838 "retry count\n", offset);
1842 dev_err(adapter->dev, "FW CRC error indicated by the "
1843 "helper: len = 0x%04X, txlen = %d\n",
1846 /* Setting this to 0 to resend from same offset */
1849 block_retry_cnt = 0;
1850 /* Set blocksize to transfer - checking for
1852 if (firmware_len - offset < txlen)
1853 txlen = firmware_len - offset;
1855 dev_dbg(adapter->dev, ".");
1857 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
1858 card->pcie.blksz_fw_dl;
1860 /* Copy payload to buffer */
1861 memmove(skb->data, &firmware[offset], txlen);
1864 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1865 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
1867 /* Send the boot command to device */
1868 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
1869 dev_err(adapter->dev,
1870 "Failed to send firmware download command\n");
1875 MWIFIEX_SKB_PACB(skb, &buf_pa);
1877 /* Wait for the command done interrupt */
1879 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1881 dev_err(adapter->dev, "%s: Failed to read "
1882 "interrupt status during fw dnld.\n",
1884 pci_unmap_single(card->dev, buf_pa, skb->len,
1889 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1890 CPU_INTR_DOOR_BELL);
1892 pci_unmap_single(card->dev, buf_pa, skb->len,
1898 dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
1904 dev_kfree_skb_any(skb);
1909 * This function checks the firmware status in card.
1911 * The winner interface is also determined by this function.
1914 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
1917 u32 firmware_stat, winner_status;
1918 struct pcie_service_card *card = adapter->card;
1919 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1922 /* Mask spurios interrupts */
1923 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
1925 dev_warn(adapter->dev, "Write register failed\n");
1929 dev_dbg(adapter->dev, "Setting driver ready signature\n");
1930 if (mwifiex_write_reg(adapter, reg->drv_rdy,
1931 FIRMWARE_READY_PCIE)) {
1932 dev_err(adapter->dev,
1933 "Failed to write driver ready signature\n");
1937 /* Wait for firmware initialization event */
1938 for (tries = 0; tries < poll_num; tries++) {
1939 if (mwifiex_read_reg(adapter, reg->fw_status,
1946 if (firmware_stat == FIRMWARE_READY_PCIE) {
1956 if (mwifiex_read_reg(adapter, reg->fw_status,
1959 else if (!winner_status) {
1960 dev_err(adapter->dev, "PCI-E is the winner\n");
1961 adapter->winner = 1;
1963 dev_err(adapter->dev,
1964 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
1965 ret, adapter->winner);
1973 * This function reads the interrupt status from card.
1975 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
1978 unsigned long flags;
1980 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1983 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
1984 dev_warn(adapter->dev, "Read register failed\n");
1988 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1990 mwifiex_pcie_disable_host_int(adapter);
1992 /* Clear the pending interrupts */
1993 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
1995 dev_warn(adapter->dev, "Write register failed\n");
1998 spin_lock_irqsave(&adapter->int_lock, flags);
1999 adapter->int_status |= pcie_ireg;
2000 spin_unlock_irqrestore(&adapter->int_lock, flags);
2002 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2003 if ((adapter->ps_state == PS_STATE_SLEEP_CFM) ||
2004 (adapter->ps_state == PS_STATE_SLEEP)) {
2005 mwifiex_pcie_enable_host_int(adapter);
2006 if (mwifiex_write_reg(adapter,
2008 CPU_INTR_SLEEP_CFM_DONE)
2010 dev_warn(adapter->dev,
2011 "Write register failed\n");
2016 } else if (!adapter->pps_uapsd_mode &&
2017 adapter->ps_state == PS_STATE_SLEEP &&
2018 mwifiex_pcie_ok_to_access_hw(adapter)) {
2019 /* Potentially for PCIe we could get other
2020 * interrupts like shared. Don't change power
2021 * state until cookie is set */
2022 adapter->ps_state = PS_STATE_AWAKE;
2023 adapter->pm_wakeup_fw_try = false;
2029 * Interrupt handler for PCIe root port
2031 * This function reads the interrupt status from firmware and assigns
2032 * the main process in workqueue which will handle the interrupt.
2034 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2036 struct pci_dev *pdev = (struct pci_dev *)context;
2037 struct pcie_service_card *card;
2038 struct mwifiex_adapter *adapter;
2041 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
2045 card = pci_get_drvdata(pdev);
2046 if (!card || !card->adapter) {
2047 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
2048 card ? card->adapter : NULL);
2051 adapter = card->adapter;
2053 if (adapter->surprise_removed)
2056 mwifiex_interrupt_status(adapter);
2057 queue_work(adapter->workqueue, &adapter->main_work);
2064 * This function checks the current interrupt status.
2066 * The following interrupts are checked and handled by this function -
2069 * - Command received
2070 * - Packets received
2073 * In case of Rx packets received, the packets are uploaded from card to
2074 * host and processed accordingly.
2076 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2080 unsigned long flags;
2082 spin_lock_irqsave(&adapter->int_lock, flags);
2083 /* Clear out unused interrupts */
2084 pcie_ireg = adapter->int_status;
2085 adapter->int_status = 0;
2086 spin_unlock_irqrestore(&adapter->int_lock, flags);
2088 while (pcie_ireg & HOST_INTR_MASK) {
2089 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2090 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
2091 dev_dbg(adapter->dev, "info: TX DNLD Done\n");
2092 ret = mwifiex_pcie_send_data_complete(adapter);
2096 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2097 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
2098 dev_dbg(adapter->dev, "info: Rx DATA\n");
2099 ret = mwifiex_pcie_process_recv_data(adapter);
2103 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2104 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
2105 dev_dbg(adapter->dev, "info: Rx EVENT\n");
2106 ret = mwifiex_pcie_process_event_ready(adapter);
2111 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2112 pcie_ireg &= ~HOST_INTR_CMD_DONE;
2113 if (adapter->cmd_sent) {
2114 dev_dbg(adapter->dev,
2115 "info: CMD sent Interrupt\n");
2116 adapter->cmd_sent = false;
2118 /* Handle command response */
2119 ret = mwifiex_pcie_process_cmd_complete(adapter);
2124 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2125 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2127 dev_warn(adapter->dev,
2128 "Read register failed\n");
2132 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2133 if (mwifiex_write_reg(adapter,
2134 PCIE_HOST_INT_STATUS,
2136 dev_warn(adapter->dev,
2137 "Write register failed\n");
2144 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
2145 adapter->cmd_sent, adapter->data_sent);
2146 if (adapter->ps_state != PS_STATE_SLEEP)
2147 mwifiex_pcie_enable_host_int(adapter);
2153 * This function downloads data from driver to card.
2155 * Both commands and data packets are transferred to the card by this
2158 * This function adds the PCIE specific header to the front of the buffer
2159 * before transferring. The header contains the length of the packet and
2160 * the type. The firmware handles the packets based upon this set type.
2162 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2163 struct sk_buff *skb,
2164 struct mwifiex_tx_param *tx_param)
2167 dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
2171 if (type == MWIFIEX_TYPE_DATA)
2172 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2173 else if (type == MWIFIEX_TYPE_CMD)
2174 return mwifiex_pcie_send_cmd(adapter, skb);
2180 * This function initializes the PCI-E host memory space, WCB rings, etc.
2182 * The following initializations steps are followed -
2183 * - Allocate TXBD ring buffers
2184 * - Allocate RXBD ring buffers
2185 * - Allocate event BD ring buffers
2186 * - Allocate command response ring buffer
2187 * - Allocate sleep cookie buffer
2189 static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
2191 struct pcie_service_card *card = adapter->card;
2193 struct pci_dev *pdev = card->dev;
2194 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2196 pci_set_drvdata(pdev, card);
2198 ret = pci_enable_device(pdev);
2200 goto err_enable_dev;
2202 pci_set_master(pdev);
2204 dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
2205 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2207 dev_err(adapter->dev, "set_dma_mask(32) failed\n");
2208 goto err_set_dma_mask;
2211 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2213 dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
2214 goto err_set_dma_mask;
2217 ret = pci_request_region(pdev, 0, DRV_NAME);
2219 dev_err(adapter->dev, "req_reg(0) error\n");
2220 goto err_req_region0;
2222 card->pci_mmap = pci_iomap(pdev, 0, 0);
2223 if (!card->pci_mmap) {
2224 dev_err(adapter->dev, "iomap(0) error\n");
2228 ret = pci_request_region(pdev, 2, DRV_NAME);
2230 dev_err(adapter->dev, "req_reg(2) error\n");
2231 goto err_req_region2;
2233 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2234 if (!card->pci_mmap1) {
2235 dev_err(adapter->dev, "iomap(2) error\n");
2240 dev_dbg(adapter->dev,
2241 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2242 card->pci_mmap, card->pci_mmap1);
2244 card->cmdrsp_buf = NULL;
2245 ret = mwifiex_pcie_create_txbd_ring(adapter);
2248 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2251 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2254 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2256 goto err_alloc_cmdbuf;
2257 if (reg->sleep_cookie) {
2258 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2260 goto err_alloc_cookie;
2262 card->sleep_cookie_vbase = NULL;
2267 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2269 mwifiex_pcie_delete_evtbd_ring(adapter);
2271 mwifiex_pcie_delete_rxbd_ring(adapter);
2273 mwifiex_pcie_delete_txbd_ring(adapter);
2275 pci_iounmap(pdev, card->pci_mmap1);
2277 pci_release_region(pdev, 2);
2279 pci_iounmap(pdev, card->pci_mmap);
2281 pci_release_region(pdev, 0);
2284 pci_disable_device(pdev);
2286 pci_set_drvdata(pdev, NULL);
2291 * This function cleans up the allocated card buffers.
2293 * The following are freed by this function -
2294 * - TXBD ring buffers
2295 * - RXBD ring buffers
2296 * - Event BD ring buffers
2297 * - Command response ring buffer
2298 * - Sleep cookie buffer
2300 static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
2302 struct pcie_service_card *card = adapter->card;
2303 struct pci_dev *pdev = card->dev;
2304 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2307 dev_dbg(adapter->dev, "Clearing driver ready signature\n");
2308 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
2309 dev_err(adapter->dev,
2310 "Failed to write driver not-ready signature\n");
2314 pci_iounmap(pdev, card->pci_mmap);
2315 pci_iounmap(pdev, card->pci_mmap1);
2316 pci_disable_device(pdev);
2317 pci_release_region(pdev, 2);
2318 pci_release_region(pdev, 0);
2319 pci_set_drvdata(pdev, NULL);
2325 * This function registers the PCIE device.
2327 * PCIE IRQ is claimed, block size is set and driver data is initialized.
2329 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
2332 struct pcie_service_card *card = adapter->card;
2333 struct pci_dev *pdev = card->dev;
2335 /* save adapter pointer in card */
2336 card->adapter = adapter;
2338 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
2341 pr_err("request_irq failed: ret=%d\n", ret);
2342 adapter->card = NULL;
2346 adapter->dev = &pdev->dev;
2347 strcpy(adapter->fw_name, card->pcie.firmware);
2353 * This function unregisters the PCIE device.
2355 * The PCIE IRQ is released, the function is disabled and driver
2356 * data is set to null.
2358 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
2360 struct pcie_service_card *card = adapter->card;
2361 const struct mwifiex_pcie_card_reg *reg;
2364 dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
2365 free_irq(card->dev->irq, card->dev);
2367 reg = card->pcie.reg;
2368 if (reg->sleep_cookie)
2369 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2371 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2372 mwifiex_pcie_delete_evtbd_ring(adapter);
2373 mwifiex_pcie_delete_rxbd_ring(adapter);
2374 mwifiex_pcie_delete_txbd_ring(adapter);
2375 card->cmdrsp_buf = NULL;
2379 static struct mwifiex_if_ops pcie_ops = {
2380 .init_if = mwifiex_pcie_init,
2381 .cleanup_if = mwifiex_pcie_cleanup,
2382 .check_fw_status = mwifiex_check_fw_status,
2383 .prog_fw = mwifiex_prog_fw_w_helper,
2384 .register_dev = mwifiex_register_dev,
2385 .unregister_dev = mwifiex_unregister_dev,
2386 .enable_int = mwifiex_pcie_enable_host_int,
2387 .process_int_status = mwifiex_process_int_status,
2388 .host_to_card = mwifiex_pcie_host_to_card,
2389 .wakeup = mwifiex_pm_wakeup_card,
2390 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
2393 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
2394 .event_complete = mwifiex_pcie_event_complete,
2395 .update_mp_end_port = NULL,
2396 .cleanup_mpa_buf = NULL,
2397 .init_fw_port = mwifiex_pcie_init_fw_port,
2398 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
2402 * This function initializes the PCIE driver module.
2404 * This initiates the semaphore and registers the device with
2407 static int mwifiex_pcie_init_module(void)
2411 pr_debug("Marvell PCIe Driver\n");
2413 sema_init(&add_remove_card_sem, 1);
2415 /* Clear the flag in case user removes the card. */
2418 ret = pci_register_driver(&mwifiex_pcie);
2420 pr_err("Driver register failed!\n");
2422 pr_debug("info: Driver registered successfully!\n");
2428 * This function cleans up the PCIE driver.
2430 * The following major steps are followed for cleanup -
2431 * - Resume the device if its suspended
2432 * - Disconnect the device if connected
2433 * - Shutdown the firmware
2434 * - Unregister the device from PCIE bus.
2436 static void mwifiex_pcie_cleanup_module(void)
2438 if (!down_interruptible(&add_remove_card_sem))
2439 up(&add_remove_card_sem);
2441 /* Set the flag as user is removing this module. */
2444 pci_unregister_driver(&mwifiex_pcie);
2447 module_init(mwifiex_pcie_init_module);
2448 module_exit(mwifiex_pcie_cleanup_module);
2450 MODULE_AUTHOR("Marvell International Ltd.");
2451 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
2452 MODULE_VERSION(PCIE_VERSION);
2453 MODULE_LICENSE("GPL v2");
2454 MODULE_FIRMWARE(PCIE8766_DEFAULT_FW_NAME);
2455 MODULE_FIRMWARE(PCIE8897_DEFAULT_FW_NAME);