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)
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 pci_dev *pdev, pm_message_t state)
90 struct mwifiex_adapter *adapter;
91 struct pcie_service_card *card;
95 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
96 if (!card || !card->adapter) {
97 pr_err("Card or adapter structure is not valid\n");
101 pr_err("PCIE device is not specified\n");
105 adapter = card->adapter;
107 hs_actived = mwifiex_enable_hs(adapter);
109 /* Indicate device suspended */
110 adapter->is_suspended = true;
116 * Kernel needs to suspend all functions separately. Therefore all
117 * registered functions must have drivers with suspend and resume
118 * methods. Failing that the kernel simply removes the whole card.
120 * If already not resumed, this function turns on the traffic and
121 * sends a host sleep cancel request to the firmware.
123 static int mwifiex_pcie_resume(struct pci_dev *pdev)
125 struct mwifiex_adapter *adapter;
126 struct pcie_service_card *card;
129 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
130 if (!card || !card->adapter) {
131 pr_err("Card or adapter structure is not valid\n");
135 pr_err("PCIE device is not specified\n");
139 adapter = card->adapter;
141 if (!adapter->is_suspended) {
142 dev_warn(adapter->dev, "Device already resumed\n");
146 adapter->is_suspended = false;
148 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
156 * This function probes an mwifiex device and registers it. It allocates
157 * the card structure, enables PCIE function number and initiates the
158 * device registration and initialization procedure by adding a logical
161 static int mwifiex_pcie_probe(struct pci_dev *pdev,
162 const struct pci_device_id *ent)
164 struct pcie_service_card *card;
166 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
167 pdev->vendor, pdev->device, pdev->revision);
169 card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
175 if (ent->driver_data) {
176 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
177 card->pcie.firmware = data->firmware;
178 card->pcie.reg = data->reg;
179 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
182 if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
184 pr_err("%s failed\n", __func__);
193 * This function removes the interface and frees up the card structure.
195 static void mwifiex_pcie_remove(struct pci_dev *pdev)
197 struct pcie_service_card *card;
198 struct mwifiex_adapter *adapter;
199 struct mwifiex_private *priv;
202 card = pci_get_drvdata(pdev);
206 adapter = card->adapter;
207 if (!adapter || !adapter->priv_num)
210 /* In case driver is removed when asynchronous FW load is in progress */
211 wait_for_completion(&adapter->fw_load);
215 if (adapter->is_suspended)
216 mwifiex_pcie_resume(pdev);
219 for (i = 0; i < adapter->priv_num; i++)
220 if ((GET_BSS_ROLE(adapter->priv[i]) ==
221 MWIFIEX_BSS_ROLE_STA) &&
222 adapter->priv[i]->media_connected)
223 mwifiex_deauthenticate(adapter->priv[i], NULL);
225 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
227 mwifiex_disable_auto_ds(priv);
229 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
232 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
236 static DEFINE_PCI_DEVICE_TABLE(mwifiex_ids) = {
238 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
239 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
240 .driver_data = (unsigned long) &mwifiex_pcie8766,
243 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
244 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
245 .driver_data = (unsigned long) &mwifiex_pcie8897,
250 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
252 /* PCI Device Driver */
253 static struct pci_driver __refdata mwifiex_pcie = {
254 .name = "mwifiex_pcie",
255 .id_table = mwifiex_ids,
256 .probe = mwifiex_pcie_probe,
257 .remove = mwifiex_pcie_remove,
259 /* Power Management Hooks */
260 .suspend = mwifiex_pcie_suspend,
261 .resume = mwifiex_pcie_resume,
266 * This function writes data into PCIE card register.
268 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
270 struct pcie_service_card *card = adapter->card;
272 iowrite32(data, card->pci_mmap1 + reg);
278 * This function reads data from PCIE card register.
280 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
282 struct pcie_service_card *card = adapter->card;
284 *data = ioread32(card->pci_mmap1 + reg);
290 * This function adds delay loop to ensure FW is awake before proceeding.
292 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
296 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
298 usleep_range(10, 20);
307 /* This function wakes up the card by reading fw_status register. */
308 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
311 struct pcie_service_card *card = adapter->card;
312 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
314 dev_dbg(adapter->dev, "event: Wakeup device...\n");
316 if (reg->sleep_cookie)
317 mwifiex_pcie_dev_wakeup_delay(adapter);
319 /* Reading fw_status register will wakeup device */
320 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status)) {
321 dev_warn(adapter->dev, "Reading fw_status register failed\n");
325 if (reg->sleep_cookie) {
326 mwifiex_pcie_dev_wakeup_delay(adapter);
327 dev_dbg(adapter->dev, "PCIE wakeup: Setting PS_STATE_AWAKE\n");
328 adapter->ps_state = PS_STATE_AWAKE;
335 * This function is called after the card has woken up.
337 * The card configuration register is reset.
339 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
341 dev_dbg(adapter->dev, "cmd: Wakeup device completed\n");
347 * This function disables the host interrupt.
349 * The host interrupt mask is read, the disable bit is reset and
350 * written back to the card host interrupt mask register.
352 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
354 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
355 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
357 dev_warn(adapter->dev, "Disable host interrupt failed\n");
366 * This function enables the host interrupt.
368 * The host interrupt enable mask is written to the card
369 * host interrupt mask register.
371 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
373 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
374 /* Simply write the mask to the register */
375 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
377 dev_warn(adapter->dev, "Enable host interrupt failed\n");
386 * This function initializes TX buffer ring descriptors
388 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
390 struct pcie_service_card *card = adapter->card;
391 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
392 struct mwifiex_pcie_buf_desc *desc;
393 struct mwifiex_pfu_buf_desc *desc2;
396 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
397 card->tx_buf_list[i] = NULL;
398 if (reg->pfu_enabled) {
399 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
400 (sizeof(*desc2) * i);
401 desc2 = card->txbd_ring[i];
402 memset(desc2, 0, sizeof(*desc2));
404 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
406 desc = card->txbd_ring[i];
407 memset(desc, 0, sizeof(*desc));
414 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
415 * here and after mapping PCI memory, its physical address is assigned to
416 * PCIE Rx buffer descriptor's physical address.
418 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
420 struct pcie_service_card *card = adapter->card;
421 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
423 struct mwifiex_pcie_buf_desc *desc;
424 struct mwifiex_pfu_buf_desc *desc2;
428 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
429 /* Allocate skb here so that firmware can DMA data from it */
430 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
432 dev_err(adapter->dev,
433 "Unable to allocate skb for RX ring.\n");
434 kfree(card->rxbd_ring_vbase);
438 if (mwifiex_map_pci_memory(adapter, skb,
439 MWIFIEX_RX_DATA_BUF_SIZE,
443 MWIFIEX_SKB_PACB(skb, &buf_pa);
445 dev_dbg(adapter->dev,
446 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
447 skb, skb->len, skb->data, (u32)buf_pa,
448 (u32)((u64)buf_pa >> 32));
450 card->rx_buf_list[i] = skb;
451 if (reg->pfu_enabled) {
452 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
453 (sizeof(*desc2) * i);
454 desc2 = card->rxbd_ring[i];
455 desc2->paddr = buf_pa;
456 desc2->len = (u16)skb->len;
457 desc2->frag_len = (u16)skb->len;
458 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
461 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
462 (sizeof(*desc) * i));
463 desc = card->rxbd_ring[i];
464 desc->paddr = buf_pa;
465 desc->len = (u16)skb->len;
473 /* This function initializes event buffer ring descriptors. Each SKB is
474 * allocated here and after mapping PCI memory, its physical address is assigned
475 * to PCIE Rx buffer descriptor's physical address
477 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
479 struct pcie_service_card *card = adapter->card;
480 struct mwifiex_evt_buf_desc *desc;
485 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
486 /* Allocate skb here so that firmware can DMA data from it */
487 skb = dev_alloc_skb(MAX_EVENT_SIZE);
489 dev_err(adapter->dev,
490 "Unable to allocate skb for EVENT buf.\n");
491 kfree(card->evtbd_ring_vbase);
494 skb_put(skb, MAX_EVENT_SIZE);
496 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
500 MWIFIEX_SKB_PACB(skb, &buf_pa);
502 dev_dbg(adapter->dev,
503 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
504 skb, skb->len, skb->data, (u32)buf_pa,
505 (u32)((u64)buf_pa >> 32));
507 card->evt_buf_list[i] = skb;
508 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
509 (sizeof(*desc) * i));
510 desc = card->evtbd_ring[i];
511 desc->paddr = buf_pa;
512 desc->len = (u16)skb->len;
519 /* This function cleans up TX buffer rings. If any of the buffer list has valid
520 * SKB address, associated SKB is freed.
522 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
524 struct pcie_service_card *card = adapter->card;
525 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
527 struct mwifiex_pcie_buf_desc *desc;
528 struct mwifiex_pfu_buf_desc *desc2;
531 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
532 if (reg->pfu_enabled) {
533 desc2 = card->txbd_ring[i];
534 if (card->tx_buf_list[i]) {
535 skb = card->tx_buf_list[i];
536 pci_unmap_single(card->dev, desc2->paddr,
537 skb->len, PCI_DMA_TODEVICE);
538 dev_kfree_skb_any(skb);
540 memset(desc2, 0, sizeof(*desc2));
542 desc = card->txbd_ring[i];
543 if (card->tx_buf_list[i]) {
544 skb = card->tx_buf_list[i];
545 pci_unmap_single(card->dev, desc->paddr,
546 skb->len, PCI_DMA_TODEVICE);
547 dev_kfree_skb_any(skb);
549 memset(desc, 0, sizeof(*desc));
551 card->tx_buf_list[i] = NULL;
557 /* This function cleans up RX buffer rings. If any of the buffer list has valid
558 * SKB address, associated SKB is freed.
560 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
562 struct pcie_service_card *card = adapter->card;
563 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
564 struct mwifiex_pcie_buf_desc *desc;
565 struct mwifiex_pfu_buf_desc *desc2;
569 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
570 if (reg->pfu_enabled) {
571 desc2 = card->rxbd_ring[i];
572 if (card->rx_buf_list[i]) {
573 skb = card->rx_buf_list[i];
574 pci_unmap_single(card->dev, desc2->paddr,
575 skb->len, PCI_DMA_FROMDEVICE);
576 dev_kfree_skb_any(skb);
578 memset(desc2, 0, sizeof(*desc2));
580 desc = card->rxbd_ring[i];
581 if (card->rx_buf_list[i]) {
582 skb = card->rx_buf_list[i];
583 pci_unmap_single(card->dev, desc->paddr,
584 skb->len, PCI_DMA_FROMDEVICE);
585 dev_kfree_skb_any(skb);
587 memset(desc, 0, sizeof(*desc));
589 card->rx_buf_list[i] = NULL;
595 /* This function cleans up event buffer rings. If any of the buffer list has
596 * valid SKB address, associated SKB is freed.
598 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
600 struct pcie_service_card *card = adapter->card;
601 struct mwifiex_evt_buf_desc *desc;
605 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
606 desc = card->evtbd_ring[i];
607 if (card->evt_buf_list[i]) {
608 skb = card->evt_buf_list[i];
609 pci_unmap_single(card->dev, desc->paddr, MAX_EVENT_SIZE,
611 dev_kfree_skb_any(skb);
613 card->evt_buf_list[i] = NULL;
614 memset(desc, 0, sizeof(*desc));
620 /* This function creates buffer descriptor ring for TX
622 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
624 struct pcie_service_card *card = adapter->card;
625 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
628 * driver maintaines the write pointer and firmware maintaines the read
629 * pointer. The write pointer starts at 0 (zero) while the read pointer
630 * starts at zero with rollover bit set
632 card->txbd_wrptr = 0;
634 if (reg->pfu_enabled)
635 card->txbd_rdptr = 0;
637 card->txbd_rdptr |= reg->tx_rollover_ind;
639 /* allocate shared memory for the BD ring and divide the same in to
640 several descriptors */
641 if (reg->pfu_enabled)
642 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
645 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
648 dev_dbg(adapter->dev, "info: txbd_ring: Allocating %d bytes\n",
649 card->txbd_ring_size);
650 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
651 card->txbd_ring_size,
652 &card->txbd_ring_pbase);
653 if (!card->txbd_ring_vbase) {
654 dev_err(adapter->dev,
655 "allocate consistent memory (%d bytes) failed!\n",
656 card->txbd_ring_size);
659 dev_dbg(adapter->dev,
660 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
661 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
662 (u32)((u64)card->txbd_ring_pbase >> 32), card->txbd_ring_size);
664 return mwifiex_init_txq_ring(adapter);
667 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
669 struct pcie_service_card *card = adapter->card;
670 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
672 mwifiex_cleanup_txq_ring(adapter);
674 if (card->txbd_ring_vbase)
675 pci_free_consistent(card->dev, card->txbd_ring_size,
676 card->txbd_ring_vbase,
677 card->txbd_ring_pbase);
678 card->txbd_ring_size = 0;
679 card->txbd_wrptr = 0;
680 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
681 card->txbd_ring_vbase = NULL;
682 card->txbd_ring_pbase = 0;
688 * This function creates buffer descriptor ring for RX
690 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
692 struct pcie_service_card *card = adapter->card;
693 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
696 * driver maintaines the read pointer and firmware maintaines the write
697 * pointer. The write pointer starts at 0 (zero) while the read pointer
698 * starts at zero with rollover bit set
700 card->rxbd_wrptr = 0;
701 card->rxbd_rdptr = reg->rx_rollover_ind;
703 if (reg->pfu_enabled)
704 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
707 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
710 dev_dbg(adapter->dev, "info: rxbd_ring: Allocating %d bytes\n",
711 card->rxbd_ring_size);
712 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
713 card->rxbd_ring_size,
714 &card->rxbd_ring_pbase);
715 if (!card->rxbd_ring_vbase) {
716 dev_err(adapter->dev,
717 "allocate consistent memory (%d bytes) failed!\n",
718 card->rxbd_ring_size);
722 dev_dbg(adapter->dev,
723 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
724 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
725 (u32)((u64)card->rxbd_ring_pbase >> 32),
726 card->rxbd_ring_size);
728 return mwifiex_init_rxq_ring(adapter);
732 * This function deletes Buffer descriptor ring for RX
734 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
736 struct pcie_service_card *card = adapter->card;
737 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
739 mwifiex_cleanup_rxq_ring(adapter);
741 if (card->rxbd_ring_vbase)
742 pci_free_consistent(card->dev, card->rxbd_ring_size,
743 card->rxbd_ring_vbase,
744 card->rxbd_ring_pbase);
745 card->rxbd_ring_size = 0;
746 card->rxbd_wrptr = 0;
747 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
748 card->rxbd_ring_vbase = NULL;
749 card->rxbd_ring_pbase = 0;
755 * This function creates buffer descriptor ring for Events
757 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
759 struct pcie_service_card *card = adapter->card;
760 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
763 * driver maintaines the read pointer and firmware maintaines the write
764 * pointer. The write pointer starts at 0 (zero) while the read pointer
765 * starts at zero with rollover bit set
767 card->evtbd_wrptr = 0;
768 card->evtbd_rdptr = reg->evt_rollover_ind;
770 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
773 dev_dbg(adapter->dev, "info: evtbd_ring: Allocating %d bytes\n",
774 card->evtbd_ring_size);
775 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
776 card->evtbd_ring_size,
777 &card->evtbd_ring_pbase);
778 if (!card->evtbd_ring_vbase) {
779 dev_err(adapter->dev,
780 "allocate consistent memory (%d bytes) failed!\n",
781 card->evtbd_ring_size);
785 dev_dbg(adapter->dev,
786 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
787 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
788 (u32)((u64)card->evtbd_ring_pbase >> 32),
789 card->evtbd_ring_size);
791 return mwifiex_pcie_init_evt_ring(adapter);
795 * This function deletes Buffer descriptor ring for Events
797 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
799 struct pcie_service_card *card = adapter->card;
800 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
802 mwifiex_cleanup_evt_ring(adapter);
804 if (card->evtbd_ring_vbase)
805 pci_free_consistent(card->dev, card->evtbd_ring_size,
806 card->evtbd_ring_vbase,
807 card->evtbd_ring_pbase);
808 card->evtbd_wrptr = 0;
809 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
810 card->evtbd_ring_size = 0;
811 card->evtbd_ring_vbase = NULL;
812 card->evtbd_ring_pbase = 0;
818 * This function allocates a buffer for CMDRSP
820 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
822 struct pcie_service_card *card = adapter->card;
825 /* Allocate memory for receiving command response data */
826 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
828 dev_err(adapter->dev,
829 "Unable to allocate skb for command response data.\n");
832 skb_put(skb, MWIFIEX_UPLD_SIZE);
833 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
837 card->cmdrsp_buf = skb;
843 * This function deletes a buffer for CMDRSP
845 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
847 struct pcie_service_card *card;
853 card = adapter->card;
855 if (card && card->cmdrsp_buf) {
856 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &buf_pa);
857 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
859 dev_kfree_skb_any(card->cmdrsp_buf);
862 if (card && card->cmd_buf) {
863 MWIFIEX_SKB_PACB(card->cmd_buf, &buf_pa);
864 pci_unmap_single(card->dev, buf_pa, card->cmd_buf->len,
871 * This function allocates a buffer for sleep cookie
873 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
875 struct pcie_service_card *card = adapter->card;
877 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
878 &card->sleep_cookie_pbase);
879 if (!card->sleep_cookie_vbase) {
880 dev_err(adapter->dev, "pci_alloc_consistent failed!\n");
883 /* Init val of Sleep Cookie */
884 *(u32 *)card->sleep_cookie_vbase = FW_AWAKE_COOKIE;
886 dev_dbg(adapter->dev, "alloc_scook: sleep cookie=0x%x\n",
887 *((u32 *)card->sleep_cookie_vbase));
893 * This function deletes buffer for sleep cookie
895 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
897 struct pcie_service_card *card;
902 card = adapter->card;
904 if (card && card->sleep_cookie_vbase) {
905 pci_free_consistent(card->dev, sizeof(u32),
906 card->sleep_cookie_vbase,
907 card->sleep_cookie_pbase);
908 card->sleep_cookie_vbase = NULL;
914 /* This function flushes the TX buffer descriptor ring
915 * This function defined as handler is also called while cleaning TXRX
916 * during disconnect/ bss stop.
918 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
920 struct pcie_service_card *card = adapter->card;
922 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
923 card->txbd_flush = 1;
924 /* write pointer already set at last send
925 * send dnld-rdy intr again, wait for completion.
927 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
928 CPU_INTR_DNLD_RDY)) {
929 dev_err(adapter->dev,
930 "failed to assert dnld-rdy interrupt.\n");
938 * This function unmaps and frees downloaded data buffer
940 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
944 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
945 struct mwifiex_pcie_buf_desc *desc;
946 struct mwifiex_pfu_buf_desc *desc2;
947 struct pcie_service_card *card = adapter->card;
948 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
950 if (!mwifiex_pcie_ok_to_access_hw(adapter))
951 mwifiex_pm_wakeup_card(adapter);
953 /* Read the TX ring read pointer set by firmware */
954 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
955 dev_err(adapter->dev,
956 "SEND COMP: failed to read reg->tx_rdptr\n");
960 dev_dbg(adapter->dev, "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
961 card->txbd_rdptr, rdptr);
963 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
964 /* free from previous txbd_rdptr to current txbd_rdptr */
965 while (((card->txbd_rdptr & reg->tx_mask) !=
966 (rdptr & reg->tx_mask)) ||
967 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
968 (rdptr & reg->tx_rollover_ind))) {
969 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
972 skb = card->tx_buf_list[wrdoneidx];
974 dev_dbg(adapter->dev,
975 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
977 MWIFIEX_SKB_PACB(skb, &buf_pa);
978 pci_unmap_single(card->dev, buf_pa, skb->len,
983 if (card->txbd_flush)
984 mwifiex_write_data_complete(adapter, skb, 0,
987 mwifiex_write_data_complete(adapter, skb, 0, 0);
990 card->tx_buf_list[wrdoneidx] = NULL;
992 if (reg->pfu_enabled) {
993 desc2 = (void *)card->txbd_ring[wrdoneidx];
994 memset(desc2, 0, sizeof(*desc2));
996 desc = card->txbd_ring[wrdoneidx];
997 memset(desc, 0, sizeof(*desc));
999 switch (card->dev->device) {
1000 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1003 case PCIE_DEVICE_ID_MARVELL_88W8897:
1004 card->txbd_rdptr += reg->ring_tx_start_ptr;
1009 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1010 card->txbd_rdptr = ((card->txbd_rdptr &
1011 reg->tx_rollover_ind) ^
1012 reg->tx_rollover_ind);
1016 adapter->data_sent = false;
1018 if (card->txbd_flush) {
1019 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1020 card->txbd_flush = 0;
1022 mwifiex_clean_pcie_ring_buf(adapter);
1028 /* This function sends data buffer to device. First 4 bytes of payload
1029 * are filled with payload length and payload type. Then this payload
1030 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1031 * Download ready interrupt to FW is deffered if Tx ring is not full and
1032 * additional payload can be accomodated.
1035 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1036 struct mwifiex_tx_param *tx_param)
1038 struct pcie_service_card *card = adapter->card;
1039 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1040 u32 wrindx, num_tx_buffs, rx_val;
1043 struct mwifiex_pcie_buf_desc *desc = NULL;
1044 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1047 if (!(skb->data && skb->len)) {
1048 dev_err(adapter->dev, "%s(): invalid parameter <%p, %#x>\n",
1049 __func__, skb->data, skb->len);
1053 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1054 mwifiex_pm_wakeup_card(adapter);
1056 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1057 dev_dbg(adapter->dev, "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1058 card->txbd_rdptr, card->txbd_wrptr);
1059 if (mwifiex_pcie_txbd_not_full(card)) {
1062 adapter->data_sent = true;
1063 payload = skb->data;
1064 tmp = (__le16 *)&payload[0];
1065 *tmp = cpu_to_le16((u16)skb->len);
1066 tmp = (__le16 *)&payload[2];
1067 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
1069 if (mwifiex_map_pci_memory(adapter, skb, skb->len ,
1073 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1074 MWIFIEX_SKB_PACB(skb, &buf_pa);
1075 card->tx_buf_list[wrindx] = skb;
1077 if (reg->pfu_enabled) {
1078 desc2 = (void *)card->txbd_ring[wrindx];
1079 desc2->paddr = buf_pa;
1080 desc2->len = (u16)skb->len;
1081 desc2->frag_len = (u16)skb->len;
1083 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1084 MWIFIEX_BD_FLAG_LAST_DESC;
1086 desc = card->txbd_ring[wrindx];
1087 desc->paddr = buf_pa;
1088 desc->len = (u16)skb->len;
1089 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1090 MWIFIEX_BD_FLAG_LAST_DESC;
1093 switch (card->dev->device) {
1094 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1097 case PCIE_DEVICE_ID_MARVELL_88W8897:
1098 card->txbd_wrptr += reg->ring_tx_start_ptr;
1102 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1103 card->txbd_wrptr = ((card->txbd_wrptr &
1104 reg->tx_rollover_ind) ^
1105 reg->tx_rollover_ind);
1107 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1108 /* Write the TX ring write pointer in to reg->tx_wrptr */
1109 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1110 card->txbd_wrptr | rx_val)) {
1111 dev_err(adapter->dev,
1112 "SEND DATA: failed to write reg->tx_wrptr\n");
1116 if ((mwifiex_pcie_txbd_not_full(card)) &&
1117 tx_param->next_pkt_len) {
1118 /* have more packets and TxBD still can hold more */
1119 dev_dbg(adapter->dev,
1120 "SEND DATA: delay dnld-rdy interrupt.\n");
1121 adapter->data_sent = false;
1123 /* Send the TX ready interrupt */
1124 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1125 CPU_INTR_DNLD_RDY)) {
1126 dev_err(adapter->dev,
1127 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1132 dev_dbg(adapter->dev, "info: SEND DATA: Updated <Rd: %#x, Wr: "
1133 "%#x> and sent packet to firmware successfully\n",
1134 card->txbd_rdptr, card->txbd_wrptr);
1136 dev_dbg(adapter->dev,
1137 "info: TX Ring full, can't send packets to fw\n");
1138 adapter->data_sent = true;
1139 /* Send the TX ready interrupt */
1140 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1142 dev_err(adapter->dev,
1143 "SEND DATA: failed to assert door-bell intr\n");
1147 return -EINPROGRESS;
1149 MWIFIEX_SKB_PACB(skb, &buf_pa);
1150 pci_unmap_single(card->dev, buf_pa, skb->len, PCI_DMA_TODEVICE);
1151 card->tx_buf_list[wrindx] = NULL;
1152 if (reg->pfu_enabled)
1153 memset(desc2, 0, sizeof(*desc2));
1155 memset(desc, 0, sizeof(*desc));
1161 * This function handles received buffer ring and
1162 * dispatches packets to upper
1164 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1166 struct pcie_service_card *card = adapter->card;
1167 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1168 u32 wrptr, rd_index, tx_val;
1171 struct sk_buff *skb_tmp = NULL;
1172 struct mwifiex_pcie_buf_desc *desc;
1173 struct mwifiex_pfu_buf_desc *desc2;
1175 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1176 mwifiex_pm_wakeup_card(adapter);
1178 /* Read the RX ring Write pointer set by firmware */
1179 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1180 dev_err(adapter->dev,
1181 "RECV DATA: failed to read reg->rx_wrptr\n");
1185 card->rxbd_wrptr = wrptr;
1187 while (((wrptr & reg->rx_mask) !=
1188 (card->rxbd_rdptr & reg->rx_mask)) ||
1189 ((wrptr & reg->rx_rollover_ind) ==
1190 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1191 struct sk_buff *skb_data;
1195 rd_index = card->rxbd_rdptr & reg->rx_mask;
1196 skb_data = card->rx_buf_list[rd_index];
1198 /* If skb allocation was failed earlier for Rx packet,
1199 * rx_buf_list[rd_index] would have been left with a NULL.
1204 MWIFIEX_SKB_PACB(skb_data, &buf_pa);
1205 pci_unmap_single(card->dev, buf_pa, MWIFIEX_RX_DATA_BUF_SIZE,
1206 PCI_DMA_FROMDEVICE);
1207 card->rx_buf_list[rd_index] = NULL;
1209 /* Get data length from interface header -
1210 * first 2 bytes for len, next 2 bytes is for type
1212 pkt_len = *((__le16 *)skb_data->data);
1213 rx_len = le16_to_cpu(pkt_len);
1214 skb_put(skb_data, rx_len);
1215 dev_dbg(adapter->dev,
1216 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1217 card->rxbd_rdptr, wrptr, rx_len);
1218 skb_pull(skb_data, INTF_HEADER_LEN);
1219 mwifiex_handle_rx_packet(adapter, skb_data);
1221 skb_tmp = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
1223 dev_err(adapter->dev,
1224 "Unable to allocate skb.\n");
1228 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1229 MWIFIEX_RX_DATA_BUF_SIZE,
1230 PCI_DMA_FROMDEVICE))
1233 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa);
1235 dev_dbg(adapter->dev,
1236 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1238 card->rx_buf_list[rd_index] = skb_tmp;
1240 if (reg->pfu_enabled) {
1241 desc2 = (void *)card->rxbd_ring[rd_index];
1242 desc2->paddr = buf_pa;
1243 desc2->len = skb_tmp->len;
1244 desc2->frag_len = skb_tmp->len;
1246 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1248 desc = card->rxbd_ring[rd_index];
1249 desc->paddr = buf_pa;
1250 desc->len = skb_tmp->len;
1254 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1255 MWIFIEX_MAX_TXRX_BD) {
1256 card->rxbd_rdptr = ((card->rxbd_rdptr &
1257 reg->rx_rollover_ind) ^
1258 reg->rx_rollover_ind);
1260 dev_dbg(adapter->dev, "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1261 card->rxbd_rdptr, wrptr);
1263 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1264 /* Write the RX ring read pointer in to reg->rx_rdptr */
1265 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1266 card->rxbd_rdptr | tx_val)) {
1267 dev_err(adapter->dev,
1268 "RECV DATA: failed to write reg->rx_rdptr\n");
1273 /* Read the RX ring Write pointer set by firmware */
1274 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1275 dev_err(adapter->dev,
1276 "RECV DATA: failed to read reg->rx_wrptr\n");
1280 dev_dbg(adapter->dev,
1281 "info: RECV DATA: Rcvd packet from fw successfully\n");
1282 card->rxbd_wrptr = wrptr;
1290 * This function downloads the boot command to device
1293 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1296 struct pcie_service_card *card = adapter->card;
1297 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1299 if (!(skb->data && skb->len)) {
1300 dev_err(adapter->dev,
1301 "Invalid parameter in %s <%p. len %d>\n",
1302 __func__, skb->data, skb->len);
1306 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE))
1309 MWIFIEX_SKB_PACB(skb, &buf_pa);
1311 /* Write the lower 32bits of the physical address to low command
1312 * address scratch register
1314 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1315 dev_err(adapter->dev,
1316 "%s: failed to write download command to boot code.\n",
1318 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1323 /* Write the upper 32bits of the physical address to high command
1324 * address scratch register
1326 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1327 (u32)((u64)buf_pa >> 32))) {
1328 dev_err(adapter->dev,
1329 "%s: failed to write download command to boot code.\n",
1331 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1336 /* Write the command length to cmd_size scratch register */
1337 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1338 dev_err(adapter->dev,
1339 "%s: failed to write command len to cmd_size scratch reg\n",
1341 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1346 /* Ring the door bell */
1347 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1348 CPU_INTR_DOOR_BELL)) {
1349 dev_err(adapter->dev,
1350 "%s: failed to assert door-bell intr\n", __func__);
1351 pci_unmap_single(card->dev, buf_pa,
1352 MWIFIEX_UPLD_SIZE, PCI_DMA_TODEVICE);
1359 /* This function init rx port in firmware which in turn enables to receive data
1360 * from device before transmitting any packet.
1362 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1364 struct pcie_service_card *card = adapter->card;
1365 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1366 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1368 /* Write the RX ring read pointer in to reg->rx_rdptr */
1369 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1371 dev_err(adapter->dev,
1372 "RECV DATA: failed to write reg->rx_rdptr\n");
1378 /* This function downloads commands to the device
1381 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1383 struct pcie_service_card *card = adapter->card;
1384 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1386 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1387 u8 *payload = (u8 *)skb->data;
1389 if (!(skb->data && skb->len)) {
1390 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
1391 __func__, skb->data, skb->len);
1395 /* Make sure a command response buffer is available */
1396 if (!card->cmdrsp_buf) {
1397 dev_err(adapter->dev,
1398 "No response buffer available, send command failed\n");
1402 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1403 mwifiex_pm_wakeup_card(adapter);
1405 adapter->cmd_sent = true;
1407 *(__le16 *)&payload[0] = cpu_to_le16((u16)skb->len);
1408 *(__le16 *)&payload[2] = cpu_to_le16(MWIFIEX_TYPE_CMD);
1410 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1413 card->cmd_buf = skb;
1415 /* To send a command, the driver will:
1416 1. Write the 64bit physical address of the data buffer to
1417 cmd response address low + cmd response address high
1418 2. Ring the door bell (i.e. set the door bell interrupt)
1420 In response to door bell interrupt, the firmware will perform
1421 the DMA of the command packet (first header to obtain the total
1422 length and then rest of the command).
1425 if (card->cmdrsp_buf) {
1426 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &cmdrsp_buf_pa);
1427 /* Write the lower 32bits of the cmdrsp buffer physical
1429 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1430 (u32)cmdrsp_buf_pa)) {
1431 dev_err(adapter->dev,
1432 "Failed to write download cmd to boot code.\n");
1436 /* Write the upper 32bits of the cmdrsp buffer physical
1438 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1439 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1440 dev_err(adapter->dev,
1441 "Failed to write download cmd to boot code.\n");
1447 MWIFIEX_SKB_PACB(card->cmd_buf, &cmd_buf_pa);
1448 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1449 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1451 dev_err(adapter->dev,
1452 "Failed to write download cmd to boot code.\n");
1456 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1457 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1458 (u32)((u64)cmd_buf_pa >> 32))) {
1459 dev_err(adapter->dev,
1460 "Failed to write download cmd to boot code.\n");
1465 /* Write the command length to reg->cmd_size */
1466 if (mwifiex_write_reg(adapter, reg->cmd_size,
1467 card->cmd_buf->len)) {
1468 dev_err(adapter->dev,
1469 "Failed to write cmd len to reg->cmd_size\n");
1474 /* Ring the door bell */
1475 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1476 CPU_INTR_DOOR_BELL)) {
1477 dev_err(adapter->dev,
1478 "Failed to assert door-bell intr\n");
1485 adapter->cmd_sent = false;
1491 * This function handles command complete interrupt
1493 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1495 struct pcie_service_card *card = adapter->card;
1496 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1497 struct sk_buff *skb = card->cmdrsp_buf;
1503 dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1505 MWIFIEX_SKB_PACB(skb, &buf_pa);
1506 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1507 PCI_DMA_FROMDEVICE);
1509 pkt_len = *((__le16 *)skb->data);
1510 rx_len = le16_to_cpu(pkt_len);
1511 skb_trim(skb, rx_len);
1512 skb_pull(skb, INTF_HEADER_LEN);
1514 if (!adapter->curr_cmd) {
1515 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1516 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1518 while (reg->sleep_cookie && (count++ < 10) &&
1519 mwifiex_pcie_ok_to_access_hw(adapter))
1520 usleep_range(50, 60);
1522 dev_err(adapter->dev,
1523 "There is no command but got cmdrsp\n");
1525 memcpy(adapter->upld_buf, skb->data,
1526 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1527 skb_push(skb, INTF_HEADER_LEN);
1528 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1529 PCI_DMA_FROMDEVICE))
1532 MWIFIEX_SKB_PACB(skb, &buf_pa);
1533 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1534 adapter->curr_cmd->resp_skb = skb;
1535 adapter->cmd_resp_received = true;
1536 /* Take the pointer and set it to CMD node and will
1537 return in the response complete callback */
1538 card->cmdrsp_buf = NULL;
1540 /* Clear the cmd-rsp buffer address in scratch registers. This
1541 will prevent firmware from writing to the same response
1543 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1544 dev_err(adapter->dev,
1545 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1548 /* Write the upper 32bits of the cmdrsp buffer physical
1550 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1551 dev_err(adapter->dev,
1552 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1561 * Command Response processing complete handler
1563 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1564 struct sk_buff *skb)
1566 struct pcie_service_card *card = adapter->card;
1568 struct sk_buff *skb_tmp;
1571 card->cmdrsp_buf = skb;
1572 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1573 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1574 PCI_DMA_FROMDEVICE))
1578 skb_tmp = card->cmd_buf;
1580 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa);
1581 pci_unmap_single(card->dev, buf_pa, skb_tmp->len,
1582 PCI_DMA_FROMDEVICE);
1583 card->cmd_buf = NULL;
1590 * This function handles firmware event ready interrupt
1592 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1594 struct pcie_service_card *card = adapter->card;
1595 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1596 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1599 struct mwifiex_evt_buf_desc *desc;
1601 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1602 mwifiex_pm_wakeup_card(adapter);
1604 if (adapter->event_received) {
1605 dev_dbg(adapter->dev, "info: Event being processed, "
1606 "do not process this interrupt just yet\n");
1610 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1611 dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
1615 /* Read the event ring write pointer set by firmware */
1616 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1617 dev_err(adapter->dev,
1618 "EventReady: failed to read reg->evt_wrptr\n");
1622 dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1623 card->evtbd_rdptr, wrptr);
1624 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1625 & MWIFIEX_EVTBD_MASK)) ||
1626 ((wrptr & reg->evt_rollover_ind) ==
1627 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1628 struct sk_buff *skb_cmd;
1629 __le16 data_len = 0;
1632 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1633 skb_cmd = card->evt_buf_list[rdptr];
1634 MWIFIEX_SKB_PACB(skb_cmd, &buf_pa);
1635 pci_unmap_single(card->dev, buf_pa, MAX_EVENT_SIZE,
1636 PCI_DMA_FROMDEVICE);
1638 /* Take the pointer and set it to event pointer in adapter
1639 and will return back after event handling callback */
1640 card->evt_buf_list[rdptr] = NULL;
1641 desc = card->evtbd_ring[rdptr];
1642 memset(desc, 0, sizeof(*desc));
1644 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1645 adapter->event_cause = event;
1646 /* The first 4bytes will be the event transfer header
1647 len is 2 bytes followed by type which is 2 bytes */
1648 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1649 evt_len = le16_to_cpu(data_len);
1651 skb_pull(skb_cmd, INTF_HEADER_LEN);
1652 dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
1654 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1655 memcpy(adapter->event_body, skb_cmd->data +
1656 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1657 MWIFIEX_EVENT_HEADER_LEN);
1659 adapter->event_received = true;
1660 adapter->event_skb = skb_cmd;
1662 /* Do not update the event read pointer here, wait till the
1663 buffer is released. This is just to make things simpler,
1664 we need to find a better method of managing these buffers.
1672 * Event processing complete handler
1674 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1675 struct sk_buff *skb)
1677 struct pcie_service_card *card = adapter->card;
1678 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1680 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1683 struct mwifiex_evt_buf_desc *desc;
1688 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1689 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
1694 /* Read the event ring write pointer set by firmware */
1695 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1696 dev_err(adapter->dev,
1697 "event_complete: failed to read reg->evt_wrptr\n");
1701 if (!card->evt_buf_list[rdptr]) {
1702 skb_push(skb, INTF_HEADER_LEN);
1703 if (mwifiex_map_pci_memory(adapter, skb,
1705 PCI_DMA_FROMDEVICE))
1707 MWIFIEX_SKB_PACB(skb, &buf_pa);
1708 card->evt_buf_list[rdptr] = skb;
1709 MWIFIEX_SKB_PACB(skb, &buf_pa);
1710 desc = card->evtbd_ring[rdptr];
1711 desc->paddr = buf_pa;
1712 desc->len = (u16)skb->len;
1716 dev_dbg(adapter->dev,
1717 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1718 rdptr, card->evt_buf_list[rdptr], skb);
1721 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1722 card->evtbd_rdptr = ((card->evtbd_rdptr &
1723 reg->evt_rollover_ind) ^
1724 reg->evt_rollover_ind);
1727 dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1728 card->evtbd_rdptr, wrptr);
1730 /* Write the event ring read pointer in to reg->evt_rdptr */
1731 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1732 card->evtbd_rdptr)) {
1733 dev_err(adapter->dev,
1734 "event_complete: failed to read reg->evt_rdptr\n");
1738 dev_dbg(adapter->dev, "info: Check Events Again\n");
1739 ret = mwifiex_pcie_process_event_ready(adapter);
1745 * This function downloads the firmware to the card.
1747 * Firmware is downloaded to the card in blocks. Every block download
1748 * is tested for CRC errors, and retried a number of times before
1749 * returning failure.
1751 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1752 struct mwifiex_fw_image *fw)
1755 u8 *firmware = fw->fw_buf;
1756 u32 firmware_len = fw->fw_len;
1758 struct sk_buff *skb;
1759 u32 txlen, tx_blocks = 0, tries, len;
1760 u32 block_retry_cnt = 0;
1762 struct pcie_service_card *card = adapter->card;
1763 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1765 if (!firmware || !firmware_len) {
1766 dev_err(adapter->dev,
1767 "No firmware image found! Terminating download\n");
1771 dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
1774 if (mwifiex_pcie_disable_host_int(adapter)) {
1775 dev_err(adapter->dev,
1776 "%s: Disabling interrupts failed.\n", __func__);
1780 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1786 /* Perform firmware data transfer */
1791 if (offset >= firmware_len)
1794 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1795 ret = mwifiex_read_reg(adapter, reg->cmd_size,
1798 dev_warn(adapter->dev,
1799 "Failed reading len from boot code\n");
1804 usleep_range(10, 20);
1809 } else if (len > MWIFIEX_UPLD_SIZE) {
1810 pr_err("FW download failure @ %d, invalid length %d\n",
1820 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1821 pr_err("FW download failure @ %d, over max "
1822 "retry count\n", offset);
1826 dev_err(adapter->dev, "FW CRC error indicated by the "
1827 "helper: len = 0x%04X, txlen = %d\n",
1830 /* Setting this to 0 to resend from same offset */
1833 block_retry_cnt = 0;
1834 /* Set blocksize to transfer - checking for
1836 if (firmware_len - offset < txlen)
1837 txlen = firmware_len - offset;
1839 dev_dbg(adapter->dev, ".");
1841 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
1842 card->pcie.blksz_fw_dl;
1844 /* Copy payload to buffer */
1845 memmove(skb->data, &firmware[offset], txlen);
1848 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1849 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
1851 /* Send the boot command to device */
1852 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
1853 dev_err(adapter->dev,
1854 "Failed to send firmware download command\n");
1859 MWIFIEX_SKB_PACB(skb, &buf_pa);
1861 /* Wait for the command done interrupt */
1863 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1865 dev_err(adapter->dev, "%s: Failed to read "
1866 "interrupt status during fw dnld.\n",
1868 pci_unmap_single(card->dev, buf_pa, skb->len,
1873 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1874 CPU_INTR_DOOR_BELL);
1876 pci_unmap_single(card->dev, buf_pa, skb->len,
1882 dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
1888 dev_kfree_skb_any(skb);
1893 * This function checks the firmware status in card.
1895 * The winner interface is also determined by this function.
1898 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
1901 u32 firmware_stat, winner_status;
1902 struct pcie_service_card *card = adapter->card;
1903 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1906 /* Mask spurios interrupts */
1907 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
1909 dev_warn(adapter->dev, "Write register failed\n");
1913 dev_dbg(adapter->dev, "Setting driver ready signature\n");
1914 if (mwifiex_write_reg(adapter, reg->drv_rdy,
1915 FIRMWARE_READY_PCIE)) {
1916 dev_err(adapter->dev,
1917 "Failed to write driver ready signature\n");
1921 /* Wait for firmware initialization event */
1922 for (tries = 0; tries < poll_num; tries++) {
1923 if (mwifiex_read_reg(adapter, reg->fw_status,
1930 if (firmware_stat == FIRMWARE_READY_PCIE) {
1940 if (mwifiex_read_reg(adapter, reg->fw_status,
1943 else if (!winner_status) {
1944 dev_err(adapter->dev, "PCI-E is the winner\n");
1945 adapter->winner = 1;
1948 dev_err(adapter->dev,
1949 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
1950 ret, adapter->winner);
1959 * This function reads the interrupt status from card.
1961 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
1964 unsigned long flags;
1966 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1969 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
1970 dev_warn(adapter->dev, "Read register failed\n");
1974 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1976 mwifiex_pcie_disable_host_int(adapter);
1978 /* Clear the pending interrupts */
1979 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
1981 dev_warn(adapter->dev, "Write register failed\n");
1984 spin_lock_irqsave(&adapter->int_lock, flags);
1985 adapter->int_status |= pcie_ireg;
1986 spin_unlock_irqrestore(&adapter->int_lock, flags);
1988 if (pcie_ireg & HOST_INTR_CMD_DONE) {
1989 if ((adapter->ps_state == PS_STATE_SLEEP_CFM) ||
1990 (adapter->ps_state == PS_STATE_SLEEP)) {
1991 mwifiex_pcie_enable_host_int(adapter);
1992 if (mwifiex_write_reg(adapter,
1994 CPU_INTR_SLEEP_CFM_DONE)
1996 dev_warn(adapter->dev,
1997 "Write register failed\n");
2002 } else if (!adapter->pps_uapsd_mode &&
2003 adapter->ps_state == PS_STATE_SLEEP &&
2004 mwifiex_pcie_ok_to_access_hw(adapter)) {
2005 /* Potentially for PCIe we could get other
2006 * interrupts like shared. Don't change power
2007 * state until cookie is set */
2008 adapter->ps_state = PS_STATE_AWAKE;
2009 adapter->pm_wakeup_fw_try = false;
2015 * Interrupt handler for PCIe root port
2017 * This function reads the interrupt status from firmware and assigns
2018 * the main process in workqueue which will handle the interrupt.
2020 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2022 struct pci_dev *pdev = (struct pci_dev *)context;
2023 struct pcie_service_card *card;
2024 struct mwifiex_adapter *adapter;
2027 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
2031 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
2032 if (!card || !card->adapter) {
2033 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
2034 card ? card->adapter : NULL);
2037 adapter = card->adapter;
2039 if (adapter->surprise_removed)
2042 mwifiex_interrupt_status(adapter);
2043 queue_work(adapter->workqueue, &adapter->main_work);
2050 * This function checks the current interrupt status.
2052 * The following interrupts are checked and handled by this function -
2055 * - Command received
2056 * - Packets received
2059 * In case of Rx packets received, the packets are uploaded from card to
2060 * host and processed accordingly.
2062 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2066 unsigned long flags;
2068 spin_lock_irqsave(&adapter->int_lock, flags);
2069 /* Clear out unused interrupts */
2070 pcie_ireg = adapter->int_status;
2071 adapter->int_status = 0;
2072 spin_unlock_irqrestore(&adapter->int_lock, flags);
2074 while (pcie_ireg & HOST_INTR_MASK) {
2075 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2076 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
2077 dev_dbg(adapter->dev, "info: TX DNLD Done\n");
2078 ret = mwifiex_pcie_send_data_complete(adapter);
2082 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2083 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
2084 dev_dbg(adapter->dev, "info: Rx DATA\n");
2085 ret = mwifiex_pcie_process_recv_data(adapter);
2089 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2090 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
2091 dev_dbg(adapter->dev, "info: Rx EVENT\n");
2092 ret = mwifiex_pcie_process_event_ready(adapter);
2097 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2098 pcie_ireg &= ~HOST_INTR_CMD_DONE;
2099 if (adapter->cmd_sent) {
2100 dev_dbg(adapter->dev,
2101 "info: CMD sent Interrupt\n");
2102 adapter->cmd_sent = false;
2104 /* Handle command response */
2105 ret = mwifiex_pcie_process_cmd_complete(adapter);
2110 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2111 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2113 dev_warn(adapter->dev,
2114 "Read register failed\n");
2118 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2119 if (mwifiex_write_reg(adapter,
2120 PCIE_HOST_INT_STATUS,
2122 dev_warn(adapter->dev,
2123 "Write register failed\n");
2130 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
2131 adapter->cmd_sent, adapter->data_sent);
2132 if (adapter->ps_state != PS_STATE_SLEEP)
2133 mwifiex_pcie_enable_host_int(adapter);
2139 * This function downloads data from driver to card.
2141 * Both commands and data packets are transferred to the card by this
2144 * This function adds the PCIE specific header to the front of the buffer
2145 * before transferring. The header contains the length of the packet and
2146 * the type. The firmware handles the packets based upon this set type.
2148 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2149 struct sk_buff *skb,
2150 struct mwifiex_tx_param *tx_param)
2153 dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
2157 if (type == MWIFIEX_TYPE_DATA)
2158 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2159 else if (type == MWIFIEX_TYPE_CMD)
2160 return mwifiex_pcie_send_cmd(adapter, skb);
2166 * This function initializes the PCI-E host memory space, WCB rings, etc.
2168 * The following initializations steps are followed -
2169 * - Allocate TXBD ring buffers
2170 * - Allocate RXBD ring buffers
2171 * - Allocate event BD ring buffers
2172 * - Allocate command response ring buffer
2173 * - Allocate sleep cookie buffer
2175 static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
2177 struct pcie_service_card *card = adapter->card;
2179 struct pci_dev *pdev = card->dev;
2180 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2182 pci_set_drvdata(pdev, card);
2184 ret = pci_enable_device(pdev);
2186 goto err_enable_dev;
2188 pci_set_master(pdev);
2190 dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
2191 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2193 dev_err(adapter->dev, "set_dma_mask(32) failed\n");
2194 goto err_set_dma_mask;
2197 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2199 dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
2200 goto err_set_dma_mask;
2203 ret = pci_request_region(pdev, 0, DRV_NAME);
2205 dev_err(adapter->dev, "req_reg(0) error\n");
2206 goto err_req_region0;
2208 card->pci_mmap = pci_iomap(pdev, 0, 0);
2209 if (!card->pci_mmap) {
2210 dev_err(adapter->dev, "iomap(0) error\n");
2214 ret = pci_request_region(pdev, 2, DRV_NAME);
2216 dev_err(adapter->dev, "req_reg(2) error\n");
2217 goto err_req_region2;
2219 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2220 if (!card->pci_mmap1) {
2221 dev_err(adapter->dev, "iomap(2) error\n");
2226 dev_dbg(adapter->dev,
2227 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2228 card->pci_mmap, card->pci_mmap1);
2230 card->cmdrsp_buf = NULL;
2231 ret = mwifiex_pcie_create_txbd_ring(adapter);
2234 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2237 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2240 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2242 goto err_alloc_cmdbuf;
2243 if (reg->sleep_cookie) {
2244 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2246 goto err_alloc_cookie;
2248 card->sleep_cookie_vbase = NULL;
2253 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2255 mwifiex_pcie_delete_evtbd_ring(adapter);
2257 mwifiex_pcie_delete_rxbd_ring(adapter);
2259 mwifiex_pcie_delete_txbd_ring(adapter);
2261 pci_iounmap(pdev, card->pci_mmap1);
2263 pci_release_region(pdev, 2);
2265 pci_iounmap(pdev, card->pci_mmap);
2267 pci_release_region(pdev, 0);
2270 pci_disable_device(pdev);
2272 pci_set_drvdata(pdev, NULL);
2277 * This function cleans up the allocated card buffers.
2279 * The following are freed by this function -
2280 * - TXBD ring buffers
2281 * - RXBD ring buffers
2282 * - Event BD ring buffers
2283 * - Command response ring buffer
2284 * - Sleep cookie buffer
2286 static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
2288 struct pcie_service_card *card = adapter->card;
2289 struct pci_dev *pdev = card->dev;
2290 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2293 dev_dbg(adapter->dev, "Clearing driver ready signature\n");
2294 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
2295 dev_err(adapter->dev,
2296 "Failed to write driver not-ready signature\n");
2300 pci_iounmap(pdev, card->pci_mmap);
2301 pci_iounmap(pdev, card->pci_mmap1);
2302 pci_disable_device(pdev);
2303 pci_release_region(pdev, 2);
2304 pci_release_region(pdev, 0);
2305 pci_set_drvdata(pdev, NULL);
2310 * This function registers the PCIE device.
2312 * PCIE IRQ is claimed, block size is set and driver data is initialized.
2314 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
2317 struct pcie_service_card *card = adapter->card;
2318 struct pci_dev *pdev = card->dev;
2320 /* save adapter pointer in card */
2321 card->adapter = adapter;
2323 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
2326 pr_err("request_irq failed: ret=%d\n", ret);
2327 adapter->card = NULL;
2331 adapter->dev = &pdev->dev;
2332 strcpy(adapter->fw_name, card->pcie.firmware);
2338 * This function unregisters the PCIE device.
2340 * The PCIE IRQ is released, the function is disabled and driver
2341 * data is set to null.
2343 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
2345 struct pcie_service_card *card = adapter->card;
2346 const struct mwifiex_pcie_card_reg *reg;
2349 dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
2350 free_irq(card->dev->irq, card->dev);
2352 reg = card->pcie.reg;
2353 if (reg->sleep_cookie)
2354 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2356 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2357 mwifiex_pcie_delete_evtbd_ring(adapter);
2358 mwifiex_pcie_delete_rxbd_ring(adapter);
2359 mwifiex_pcie_delete_txbd_ring(adapter);
2360 card->cmdrsp_buf = NULL;
2364 static struct mwifiex_if_ops pcie_ops = {
2365 .init_if = mwifiex_pcie_init,
2366 .cleanup_if = mwifiex_pcie_cleanup,
2367 .check_fw_status = mwifiex_check_fw_status,
2368 .prog_fw = mwifiex_prog_fw_w_helper,
2369 .register_dev = mwifiex_register_dev,
2370 .unregister_dev = mwifiex_unregister_dev,
2371 .enable_int = mwifiex_pcie_enable_host_int,
2372 .process_int_status = mwifiex_process_int_status,
2373 .host_to_card = mwifiex_pcie_host_to_card,
2374 .wakeup = mwifiex_pm_wakeup_card,
2375 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
2378 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
2379 .event_complete = mwifiex_pcie_event_complete,
2380 .update_mp_end_port = NULL,
2381 .cleanup_mpa_buf = NULL,
2382 .init_fw_port = mwifiex_pcie_init_fw_port,
2383 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
2387 * This function initializes the PCIE driver module.
2389 * This initiates the semaphore and registers the device with
2392 static int mwifiex_pcie_init_module(void)
2396 pr_debug("Marvell PCIe Driver\n");
2398 sema_init(&add_remove_card_sem, 1);
2400 /* Clear the flag in case user removes the card. */
2403 ret = pci_register_driver(&mwifiex_pcie);
2405 pr_err("Driver register failed!\n");
2407 pr_debug("info: Driver registered successfully!\n");
2413 * This function cleans up the PCIE driver.
2415 * The following major steps are followed for cleanup -
2416 * - Resume the device if its suspended
2417 * - Disconnect the device if connected
2418 * - Shutdown the firmware
2419 * - Unregister the device from PCIE bus.
2421 static void mwifiex_pcie_cleanup_module(void)
2423 if (!down_interruptible(&add_remove_card_sem))
2424 up(&add_remove_card_sem);
2426 /* Set the flag as user is removing this module. */
2429 pci_unregister_driver(&mwifiex_pcie);
2432 module_init(mwifiex_pcie_init_module);
2433 module_exit(mwifiex_pcie_cleanup_module);
2435 MODULE_AUTHOR("Marvell International Ltd.");
2436 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
2437 MODULE_VERSION(PCIE_VERSION);
2438 MODULE_LICENSE("GPL v2");
2439 MODULE_FIRMWARE(PCIE8766_DEFAULT_FW_NAME);
2440 MODULE_FIRMWARE(PCIE8897_DEFAULT_FW_NAME);