cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pcie.c (94525B)


      1/*
      2 * NXP Wireless LAN device driver: PCIE specific handling
      3 *
      4 * Copyright 2011-2020 NXP
      5 *
      6 * This software file (the "File") is distributed by NXP
      7 * under the terms of the GNU General Public License Version 2, June 1991
      8 * (the "License").  You may use, redistribute and/or modify this File in
      9 * accordance with the terms and conditions of the License, a copy of which
     10 * is available by writing to the Free Software Foundation, Inc.,
     11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
     12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
     13 *
     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.
     18 */
     19
     20#include <linux/iopoll.h>
     21#include <linux/firmware.h>
     22
     23#include "decl.h"
     24#include "ioctl.h"
     25#include "util.h"
     26#include "fw.h"
     27#include "main.h"
     28#include "wmm.h"
     29#include "11n.h"
     30#include "pcie.h"
     31#include "pcie_quirks.h"
     32
     33#define PCIE_VERSION	"1.0"
     34#define DRV_NAME        "Marvell mwifiex PCIe"
     35
     36static struct mwifiex_if_ops pcie_ops;
     37
     38static const struct mwifiex_pcie_card_reg mwifiex_reg_8766 = {
     39	.cmd_addr_lo = PCIE_SCRATCH_0_REG,
     40	.cmd_addr_hi = PCIE_SCRATCH_1_REG,
     41	.cmd_size = PCIE_SCRATCH_2_REG,
     42	.fw_status = PCIE_SCRATCH_3_REG,
     43	.cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
     44	.cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
     45	.tx_rdptr = PCIE_SCRATCH_6_REG,
     46	.tx_wrptr = PCIE_SCRATCH_7_REG,
     47	.rx_rdptr = PCIE_SCRATCH_8_REG,
     48	.rx_wrptr = PCIE_SCRATCH_9_REG,
     49	.evt_rdptr = PCIE_SCRATCH_10_REG,
     50	.evt_wrptr = PCIE_SCRATCH_11_REG,
     51	.drv_rdy = PCIE_SCRATCH_12_REG,
     52	.tx_start_ptr = 0,
     53	.tx_mask = MWIFIEX_TXBD_MASK,
     54	.tx_wrap_mask = 0,
     55	.rx_mask = MWIFIEX_RXBD_MASK,
     56	.rx_wrap_mask = 0,
     57	.tx_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
     58	.rx_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
     59	.evt_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
     60	.ring_flag_sop = 0,
     61	.ring_flag_eop = 0,
     62	.ring_flag_xs_sop = 0,
     63	.ring_flag_xs_eop = 0,
     64	.ring_tx_start_ptr = 0,
     65	.pfu_enabled = 0,
     66	.sleep_cookie = 1,
     67	.msix_support = 0,
     68};
     69
     70static const struct mwifiex_pcie_card_reg mwifiex_reg_8897 = {
     71	.cmd_addr_lo = PCIE_SCRATCH_0_REG,
     72	.cmd_addr_hi = PCIE_SCRATCH_1_REG,
     73	.cmd_size = PCIE_SCRATCH_2_REG,
     74	.fw_status = PCIE_SCRATCH_3_REG,
     75	.cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
     76	.cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
     77	.tx_rdptr = PCIE_RD_DATA_PTR_Q0_Q1,
     78	.tx_wrptr = PCIE_WR_DATA_PTR_Q0_Q1,
     79	.rx_rdptr = PCIE_WR_DATA_PTR_Q0_Q1,
     80	.rx_wrptr = PCIE_RD_DATA_PTR_Q0_Q1,
     81	.evt_rdptr = PCIE_SCRATCH_10_REG,
     82	.evt_wrptr = PCIE_SCRATCH_11_REG,
     83	.drv_rdy = PCIE_SCRATCH_12_REG,
     84	.tx_start_ptr = 16,
     85	.tx_mask = 0x03FF0000,
     86	.tx_wrap_mask = 0x07FF0000,
     87	.rx_mask = 0x000003FF,
     88	.rx_wrap_mask = 0x000007FF,
     89	.tx_rollover_ind = MWIFIEX_BD_FLAG_TX_ROLLOVER_IND,
     90	.rx_rollover_ind = MWIFIEX_BD_FLAG_RX_ROLLOVER_IND,
     91	.evt_rollover_ind = MWIFIEX_BD_FLAG_EVT_ROLLOVER_IND,
     92	.ring_flag_sop = MWIFIEX_BD_FLAG_SOP,
     93	.ring_flag_eop = MWIFIEX_BD_FLAG_EOP,
     94	.ring_flag_xs_sop = MWIFIEX_BD_FLAG_XS_SOP,
     95	.ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP,
     96	.ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR,
     97	.pfu_enabled = 1,
     98	.sleep_cookie = 0,
     99	.fw_dump_ctrl = PCIE_SCRATCH_13_REG,
    100	.fw_dump_start = PCIE_SCRATCH_14_REG,
    101	.fw_dump_end = 0xcff,
    102	.fw_dump_host_ready = 0xee,
    103	.fw_dump_read_done = 0xfe,
    104	.msix_support = 0,
    105};
    106
    107static const struct mwifiex_pcie_card_reg mwifiex_reg_8997 = {
    108	.cmd_addr_lo = PCIE_SCRATCH_0_REG,
    109	.cmd_addr_hi = PCIE_SCRATCH_1_REG,
    110	.cmd_size = PCIE_SCRATCH_2_REG,
    111	.fw_status = PCIE_SCRATCH_3_REG,
    112	.cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
    113	.cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
    114	.tx_rdptr = 0xC1A4,
    115	.tx_wrptr = 0xC174,
    116	.rx_rdptr = 0xC174,
    117	.rx_wrptr = 0xC1A4,
    118	.evt_rdptr = PCIE_SCRATCH_10_REG,
    119	.evt_wrptr = PCIE_SCRATCH_11_REG,
    120	.drv_rdy = PCIE_SCRATCH_12_REG,
    121	.tx_start_ptr = 16,
    122	.tx_mask = 0x0FFF0000,
    123	.tx_wrap_mask = 0x1FFF0000,
    124	.rx_mask = 0x00000FFF,
    125	.rx_wrap_mask = 0x00001FFF,
    126	.tx_rollover_ind = BIT(28),
    127	.rx_rollover_ind = BIT(12),
    128	.evt_rollover_ind = MWIFIEX_BD_FLAG_EVT_ROLLOVER_IND,
    129	.ring_flag_sop = MWIFIEX_BD_FLAG_SOP,
    130	.ring_flag_eop = MWIFIEX_BD_FLAG_EOP,
    131	.ring_flag_xs_sop = MWIFIEX_BD_FLAG_XS_SOP,
    132	.ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP,
    133	.ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR,
    134	.pfu_enabled = 1,
    135	.sleep_cookie = 0,
    136	.fw_dump_ctrl = PCIE_SCRATCH_13_REG,
    137	.fw_dump_start = PCIE_SCRATCH_14_REG,
    138	.fw_dump_end = 0xcff,
    139	.fw_dump_host_ready = 0xcc,
    140	.fw_dump_read_done = 0xdd,
    141	.msix_support = 0,
    142};
    143
    144static struct memory_type_mapping mem_type_mapping_tbl_w8897[] = {
    145	{"ITCM", NULL, 0, 0xF0},
    146	{"DTCM", NULL, 0, 0xF1},
    147	{"SQRAM", NULL, 0, 0xF2},
    148	{"IRAM", NULL, 0, 0xF3},
    149	{"APU", NULL, 0, 0xF4},
    150	{"CIU", NULL, 0, 0xF5},
    151	{"ICU", NULL, 0, 0xF6},
    152	{"MAC", NULL, 0, 0xF7},
    153};
    154
    155static struct memory_type_mapping mem_type_mapping_tbl_w8997[] = {
    156	{"DUMP", NULL, 0, 0xDD},
    157};
    158
    159static const struct mwifiex_pcie_device mwifiex_pcie8766 = {
    160	.reg            = &mwifiex_reg_8766,
    161	.blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
    162	.tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
    163	.can_dump_fw = false,
    164	.can_ext_scan = true,
    165};
    166
    167static const struct mwifiex_pcie_device mwifiex_pcie8897 = {
    168	.reg            = &mwifiex_reg_8897,
    169	.blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
    170	.tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
    171	.can_dump_fw = true,
    172	.mem_type_mapping_tbl = mem_type_mapping_tbl_w8897,
    173	.num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8897),
    174	.can_ext_scan = true,
    175};
    176
    177static const struct mwifiex_pcie_device mwifiex_pcie8997 = {
    178	.reg            = &mwifiex_reg_8997,
    179	.blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
    180	.tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
    181	.can_dump_fw = true,
    182	.mem_type_mapping_tbl = mem_type_mapping_tbl_w8997,
    183	.num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8997),
    184	.can_ext_scan = true,
    185};
    186
    187static const struct of_device_id mwifiex_pcie_of_match_table[] = {
    188	{ .compatible = "pci11ab,2b42" },
    189	{ .compatible = "pci1b4b,2b42" },
    190	{ }
    191};
    192
    193static int mwifiex_pcie_probe_of(struct device *dev)
    194{
    195	if (!of_match_node(mwifiex_pcie_of_match_table, dev->of_node)) {
    196		dev_err(dev, "required compatible string missing\n");
    197		return -EINVAL;
    198	}
    199
    200	return 0;
    201}
    202
    203static void mwifiex_pcie_work(struct work_struct *work);
    204
    205static int
    206mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
    207		       size_t size, int flags)
    208{
    209	struct pcie_service_card *card = adapter->card;
    210	struct mwifiex_dma_mapping mapping;
    211
    212	mapping.addr = dma_map_single(&card->dev->dev, skb->data, size, flags);
    213	if (dma_mapping_error(&card->dev->dev, mapping.addr)) {
    214		mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n");
    215		return -1;
    216	}
    217	mapping.len = size;
    218	mwifiex_store_mapping(skb, &mapping);
    219	return 0;
    220}
    221
    222static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter,
    223				     struct sk_buff *skb, int flags)
    224{
    225	struct pcie_service_card *card = adapter->card;
    226	struct mwifiex_dma_mapping mapping;
    227
    228	mwifiex_get_mapping(skb, &mapping);
    229	dma_unmap_single(&card->dev->dev, mapping.addr, mapping.len, flags);
    230}
    231
    232/*
    233 * This function writes data into PCIE card register.
    234 */
    235static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
    236{
    237	struct pcie_service_card *card = adapter->card;
    238
    239	iowrite32(data, card->pci_mmap1 + reg);
    240
    241	return 0;
    242}
    243
    244/* This function reads data from PCIE card register.
    245 */
    246static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
    247{
    248	struct pcie_service_card *card = adapter->card;
    249
    250	*data = ioread32(card->pci_mmap1 + reg);
    251	if (*data == 0xffffffff)
    252		return 0xffffffff;
    253
    254	return 0;
    255}
    256
    257/* This function reads u8 data from PCIE card register. */
    258static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter,
    259				 int reg, u8 *data)
    260{
    261	struct pcie_service_card *card = adapter->card;
    262
    263	*data = ioread8(card->pci_mmap1 + reg);
    264
    265	return 0;
    266}
    267
    268/*
    269 * This function reads sleep cookie and checks if FW is ready
    270 */
    271static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
    272{
    273	u32 cookie_value;
    274	struct pcie_service_card *card = adapter->card;
    275	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
    276
    277	if (!reg->sleep_cookie)
    278		return true;
    279
    280	if (card->sleep_cookie_vbase) {
    281		cookie_value = get_unaligned_le32(card->sleep_cookie_vbase);
    282		mwifiex_dbg(adapter, INFO,
    283			    "info: ACCESS_HW: sleep cookie=0x%x\n",
    284			    cookie_value);
    285		if (cookie_value == FW_AWAKE_COOKIE)
    286			return true;
    287	}
    288
    289	return false;
    290}
    291
    292#ifdef CONFIG_PM_SLEEP
    293/*
    294 * Kernel needs to suspend all functions separately. Therefore all
    295 * registered functions must have drivers with suspend and resume
    296 * methods. Failing that the kernel simply removes the whole card.
    297 *
    298 * If already not suspended, this function allocates and sends a host
    299 * sleep activate request to the firmware and turns off the traffic.
    300 */
    301static int mwifiex_pcie_suspend(struct device *dev)
    302{
    303	struct mwifiex_adapter *adapter;
    304	struct pcie_service_card *card = dev_get_drvdata(dev);
    305
    306
    307	/* Might still be loading firmware */
    308	wait_for_completion(&card->fw_done);
    309
    310	adapter = card->adapter;
    311	if (!adapter) {
    312		dev_err(dev, "adapter is not valid\n");
    313		return 0;
    314	}
    315
    316	mwifiex_enable_wake(adapter);
    317
    318	/* Enable the Host Sleep */
    319	if (!mwifiex_enable_hs(adapter)) {
    320		mwifiex_dbg(adapter, ERROR,
    321			    "cmd: failed to suspend\n");
    322		clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
    323		mwifiex_disable_wake(adapter);
    324		return -EFAULT;
    325	}
    326
    327	flush_workqueue(adapter->workqueue);
    328
    329	/* Indicate device suspended */
    330	set_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
    331	clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
    332
    333	return 0;
    334}
    335
    336/*
    337 * Kernel needs to suspend all functions separately. Therefore all
    338 * registered functions must have drivers with suspend and resume
    339 * methods. Failing that the kernel simply removes the whole card.
    340 *
    341 * If already not resumed, this function turns on the traffic and
    342 * sends a host sleep cancel request to the firmware.
    343 */
    344static int mwifiex_pcie_resume(struct device *dev)
    345{
    346	struct mwifiex_adapter *adapter;
    347	struct pcie_service_card *card = dev_get_drvdata(dev);
    348
    349
    350	if (!card->adapter) {
    351		dev_err(dev, "adapter structure is not valid\n");
    352		return 0;
    353	}
    354
    355	adapter = card->adapter;
    356
    357	if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) {
    358		mwifiex_dbg(adapter, WARN,
    359			    "Device already resumed\n");
    360		return 0;
    361	}
    362
    363	clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
    364
    365	mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
    366			  MWIFIEX_ASYNC_CMD);
    367	mwifiex_disable_wake(adapter);
    368
    369	return 0;
    370}
    371#endif
    372
    373/*
    374 * This function probes an mwifiex device and registers it. It allocates
    375 * the card structure, enables PCIE function number and initiates the
    376 * device registration and initialization procedure by adding a logical
    377 * interface.
    378 */
    379static int mwifiex_pcie_probe(struct pci_dev *pdev,
    380					const struct pci_device_id *ent)
    381{
    382	struct pcie_service_card *card;
    383	int ret;
    384
    385	pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
    386		 pdev->vendor, pdev->device, pdev->revision);
    387
    388	card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
    389	if (!card)
    390		return -ENOMEM;
    391
    392	init_completion(&card->fw_done);
    393
    394	card->dev = pdev;
    395
    396	if (ent->driver_data) {
    397		struct mwifiex_pcie_device *data = (void *)ent->driver_data;
    398		card->pcie.reg = data->reg;
    399		card->pcie.blksz_fw_dl = data->blksz_fw_dl;
    400		card->pcie.tx_buf_size = data->tx_buf_size;
    401		card->pcie.can_dump_fw = data->can_dump_fw;
    402		card->pcie.mem_type_mapping_tbl = data->mem_type_mapping_tbl;
    403		card->pcie.num_mem_types = data->num_mem_types;
    404		card->pcie.can_ext_scan = data->can_ext_scan;
    405		INIT_WORK(&card->work, mwifiex_pcie_work);
    406	}
    407
    408	/* device tree node parsing and platform specific configuration*/
    409	if (pdev->dev.of_node) {
    410		ret = mwifiex_pcie_probe_of(&pdev->dev);
    411		if (ret)
    412			return ret;
    413	}
    414
    415	/* check quirks */
    416	mwifiex_initialize_quirks(card);
    417
    418	if (mwifiex_add_card(card, &card->fw_done, &pcie_ops,
    419			     MWIFIEX_PCIE, &pdev->dev)) {
    420		pr_err("%s failed\n", __func__);
    421		return -1;
    422	}
    423
    424	return 0;
    425}
    426
    427/*
    428 * This function removes the interface and frees up the card structure.
    429 */
    430static void mwifiex_pcie_remove(struct pci_dev *pdev)
    431{
    432	struct pcie_service_card *card;
    433	struct mwifiex_adapter *adapter;
    434	struct mwifiex_private *priv;
    435	const struct mwifiex_pcie_card_reg *reg;
    436	u32 fw_status;
    437
    438	card = pci_get_drvdata(pdev);
    439
    440	wait_for_completion(&card->fw_done);
    441
    442	adapter = card->adapter;
    443	if (!adapter || !adapter->priv_num)
    444		return;
    445
    446	reg = card->pcie.reg;
    447	if (reg)
    448		mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
    449	else
    450		fw_status = -1;
    451
    452	if (fw_status == FIRMWARE_READY_PCIE && !adapter->mfg_mode) {
    453		mwifiex_deauthenticate_all(adapter);
    454
    455		priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
    456
    457		mwifiex_disable_auto_ds(priv);
    458
    459		mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
    460	}
    461
    462	mwifiex_remove_card(adapter);
    463}
    464
    465static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
    466{
    467	mwifiex_pcie_remove(pdev);
    468
    469	return;
    470}
    471
    472static void mwifiex_pcie_coredump(struct device *dev)
    473{
    474	struct pci_dev *pdev;
    475	struct pcie_service_card *card;
    476
    477	pdev = container_of(dev, struct pci_dev, dev);
    478	card = pci_get_drvdata(pdev);
    479
    480	if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
    481			      &card->work_flags))
    482		schedule_work(&card->work);
    483}
    484
    485static const struct pci_device_id mwifiex_ids[] = {
    486	{
    487		PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
    488		PCI_ANY_ID, PCI_ANY_ID, 0, 0,
    489		.driver_data = (unsigned long)&mwifiex_pcie8766,
    490	},
    491	{
    492		PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
    493		PCI_ANY_ID, PCI_ANY_ID, 0, 0,
    494		.driver_data = (unsigned long)&mwifiex_pcie8897,
    495	},
    496	{
    497		PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
    498		PCI_ANY_ID, PCI_ANY_ID, 0, 0,
    499		.driver_data = (unsigned long)&mwifiex_pcie8997,
    500	},
    501	{
    502		PCIE_VENDOR_ID_V2_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
    503		PCI_ANY_ID, PCI_ANY_ID, 0, 0,
    504		.driver_data = (unsigned long)&mwifiex_pcie8997,
    505	},
    506	{},
    507};
    508
    509MODULE_DEVICE_TABLE(pci, mwifiex_ids);
    510
    511/*
    512 * Cleanup all software without cleaning anything related to PCIe and HW.
    513 */
    514static void mwifiex_pcie_reset_prepare(struct pci_dev *pdev)
    515{
    516	struct pcie_service_card *card = pci_get_drvdata(pdev);
    517	struct mwifiex_adapter *adapter = card->adapter;
    518
    519	if (!adapter) {
    520		dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
    521			__func__);
    522		return;
    523	}
    524
    525	mwifiex_dbg(adapter, INFO,
    526		    "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Pre-FLR\n",
    527		    __func__, pdev->vendor, pdev->device, pdev->revision);
    528
    529	mwifiex_shutdown_sw(adapter);
    530	clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
    531	clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
    532
    533	/* On MS Surface gen4+ devices FLR isn't effective to recover from
    534	 * hangups, so we power-cycle the card instead.
    535	 */
    536	if (card->quirks & QUIRK_FW_RST_D3COLD)
    537		mwifiex_pcie_reset_d3cold_quirk(pdev);
    538
    539	mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
    540
    541	card->pci_reset_ongoing = true;
    542}
    543
    544/*
    545 * Kernel stores and restores PCIe function context before and after performing
    546 * FLR respectively. Reconfigure the software and firmware including firmware
    547 * redownload.
    548 */
    549static void mwifiex_pcie_reset_done(struct pci_dev *pdev)
    550{
    551	struct pcie_service_card *card = pci_get_drvdata(pdev);
    552	struct mwifiex_adapter *adapter = card->adapter;
    553	int ret;
    554
    555	if (!adapter) {
    556		dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
    557			__func__);
    558		return;
    559	}
    560
    561	mwifiex_dbg(adapter, INFO,
    562		    "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Post-FLR\n",
    563		    __func__, pdev->vendor, pdev->device, pdev->revision);
    564
    565	ret = mwifiex_reinit_sw(adapter);
    566	if (ret)
    567		dev_err(&pdev->dev, "reinit failed: %d\n", ret);
    568	else
    569		mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
    570
    571	card->pci_reset_ongoing = false;
    572}
    573
    574static const struct pci_error_handlers mwifiex_pcie_err_handler = {
    575	.reset_prepare		= mwifiex_pcie_reset_prepare,
    576	.reset_done		= mwifiex_pcie_reset_done,
    577};
    578
    579#ifdef CONFIG_PM_SLEEP
    580/* Power Management Hooks */
    581static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
    582				mwifiex_pcie_resume);
    583#endif
    584
    585/* PCI Device Driver */
    586static struct pci_driver mwifiex_pcie = {
    587	.name     = "mwifiex_pcie",
    588	.id_table = mwifiex_ids,
    589	.probe    = mwifiex_pcie_probe,
    590	.remove   = mwifiex_pcie_remove,
    591	.driver   = {
    592		.coredump = mwifiex_pcie_coredump,
    593#ifdef CONFIG_PM_SLEEP
    594		.pm = &mwifiex_pcie_pm_ops,
    595#endif
    596	},
    597	.shutdown = mwifiex_pcie_shutdown,
    598	.err_handler = &mwifiex_pcie_err_handler,
    599};
    600
    601/*
    602 * This function adds delay loop to ensure FW is awake before proceeding.
    603 */
    604static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
    605{
    606	int i = 0;
    607
    608	while (mwifiex_pcie_ok_to_access_hw(adapter)) {
    609		i++;
    610		usleep_range(10, 20);
    611		/* 50ms max wait */
    612		if (i == 5000)
    613			break;
    614	}
    615
    616	return;
    617}
    618
    619static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
    620					   u32 max_delay_loop_cnt)
    621{
    622	struct pcie_service_card *card = adapter->card;
    623	u8 *buffer;
    624	u32 sleep_cookie, count;
    625	struct sk_buff *cmdrsp = card->cmdrsp_buf;
    626
    627	for (count = 0; count < max_delay_loop_cnt; count++) {
    628		dma_sync_single_for_cpu(&card->dev->dev,
    629					MWIFIEX_SKB_DMA_ADDR(cmdrsp),
    630					sizeof(sleep_cookie), DMA_FROM_DEVICE);
    631		buffer = cmdrsp->data;
    632		sleep_cookie = get_unaligned_le32(buffer);
    633
    634		if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
    635			mwifiex_dbg(adapter, INFO,
    636				    "sleep cookie found at count %d\n", count);
    637			break;
    638		}
    639		dma_sync_single_for_device(&card->dev->dev,
    640					   MWIFIEX_SKB_DMA_ADDR(cmdrsp),
    641					   sizeof(sleep_cookie),
    642					   DMA_FROM_DEVICE);
    643		usleep_range(20, 30);
    644	}
    645
    646	if (count >= max_delay_loop_cnt)
    647		mwifiex_dbg(adapter, INFO,
    648			    "max count reached while accessing sleep cookie\n");
    649}
    650
    651#define N_WAKEUP_TRIES_SHORT_INTERVAL 15
    652#define N_WAKEUP_TRIES_LONG_INTERVAL 35
    653
    654/* This function wakes up the card by reading fw_status register. */
    655static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
    656{
    657	struct pcie_service_card *card = adapter->card;
    658	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
    659	int retval;
    660
    661	mwifiex_dbg(adapter, EVENT,
    662		    "event: Wakeup device...\n");
    663
    664	if (reg->sleep_cookie)
    665		mwifiex_pcie_dev_wakeup_delay(adapter);
    666
    667	/* The 88W8897 PCIe+USB firmware (latest version 15.68.19.p21) sometimes
    668	 * appears to ignore or miss our wakeup request, so we continue trying
    669	 * until we receive an interrupt from the card.
    670	 */
    671	if (read_poll_timeout(mwifiex_write_reg, retval,
    672			      READ_ONCE(adapter->int_status) != 0,
    673			      500, 500 * N_WAKEUP_TRIES_SHORT_INTERVAL,
    674			      false,
    675			      adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
    676		if (read_poll_timeout(mwifiex_write_reg, retval,
    677				      READ_ONCE(adapter->int_status) != 0,
    678				      10000, 10000 * N_WAKEUP_TRIES_LONG_INTERVAL,
    679				      false,
    680				      adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
    681			mwifiex_dbg(adapter, ERROR,
    682				    "Firmware didn't wake up\n");
    683			return -EIO;
    684		}
    685	}
    686
    687	if (reg->sleep_cookie) {
    688		mwifiex_pcie_dev_wakeup_delay(adapter);
    689		mwifiex_dbg(adapter, INFO,
    690			    "PCIE wakeup: Setting PS_STATE_AWAKE\n");
    691		adapter->ps_state = PS_STATE_AWAKE;
    692	}
    693
    694	return 0;
    695}
    696
    697/*
    698 * This function is called after the card has woken up.
    699 *
    700 * The card configuration register is reset.
    701 */
    702static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
    703{
    704	mwifiex_dbg(adapter, CMD,
    705		    "cmd: Wakeup device completed\n");
    706
    707	return 0;
    708}
    709
    710/*
    711 * This function disables the host interrupt.
    712 *
    713 * The host interrupt mask is read, the disable bit is reset and
    714 * written back to the card host interrupt mask register.
    715 */
    716static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
    717{
    718	if (mwifiex_pcie_ok_to_access_hw(adapter)) {
    719		if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
    720				      0x00000000)) {
    721			mwifiex_dbg(adapter, ERROR,
    722				    "Disable host interrupt failed\n");
    723			return -1;
    724		}
    725	}
    726
    727	atomic_set(&adapter->tx_hw_pending, 0);
    728	return 0;
    729}
    730
    731static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter)
    732{
    733	WARN_ON(mwifiex_pcie_disable_host_int(adapter));
    734}
    735
    736/*
    737 * This function enables the host interrupt.
    738 *
    739 * The host interrupt enable mask is written to the card
    740 * host interrupt mask register.
    741 */
    742static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
    743{
    744	if (mwifiex_pcie_ok_to_access_hw(adapter)) {
    745		/* Simply write the mask to the register */
    746		if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
    747				      HOST_INTR_MASK)) {
    748			mwifiex_dbg(adapter, ERROR,
    749				    "Enable host interrupt failed\n");
    750			return -1;
    751		}
    752	}
    753
    754	return 0;
    755}
    756
    757/*
    758 * This function initializes TX buffer ring descriptors
    759 */
    760static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
    761{
    762	struct pcie_service_card *card = adapter->card;
    763	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
    764	struct mwifiex_pcie_buf_desc *desc;
    765	struct mwifiex_pfu_buf_desc *desc2;
    766	int i;
    767
    768	for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
    769		card->tx_buf_list[i] = NULL;
    770		if (reg->pfu_enabled) {
    771			card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
    772					     (sizeof(*desc2) * i);
    773			desc2 = card->txbd_ring[i];
    774			memset(desc2, 0, sizeof(*desc2));
    775		} else {
    776			card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
    777					     (sizeof(*desc) * i);
    778			desc = card->txbd_ring[i];
    779			memset(desc, 0, sizeof(*desc));
    780		}
    781	}
    782
    783	return 0;
    784}
    785
    786/* This function initializes RX buffer ring descriptors. Each SKB is allocated
    787 * here and after mapping PCI memory, its physical address is assigned to
    788 * PCIE Rx buffer descriptor's physical address.
    789 */
    790static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
    791{
    792	struct pcie_service_card *card = adapter->card;
    793	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
    794	struct sk_buff *skb;
    795	struct mwifiex_pcie_buf_desc *desc;
    796	struct mwifiex_pfu_buf_desc *desc2;
    797	dma_addr_t buf_pa;
    798	int i;
    799
    800	for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
    801		/* Allocate skb here so that firmware can DMA data from it */
    802		skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
    803						  GFP_KERNEL);
    804		if (!skb) {
    805			mwifiex_dbg(adapter, ERROR,
    806				    "Unable to allocate skb for RX ring.\n");
    807			kfree(card->rxbd_ring_vbase);
    808			return -ENOMEM;
    809		}
    810
    811		if (mwifiex_map_pci_memory(adapter, skb,
    812					   MWIFIEX_RX_DATA_BUF_SIZE,
    813					   DMA_FROM_DEVICE))
    814			return -1;
    815
    816		buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
    817
    818		mwifiex_dbg(adapter, INFO,
    819			    "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
    820			    skb, skb->len, skb->data, (u32)buf_pa,
    821			    (u32)((u64)buf_pa >> 32));
    822
    823		card->rx_buf_list[i] = skb;
    824		if (reg->pfu_enabled) {
    825			card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
    826					     (sizeof(*desc2) * i);
    827			desc2 = card->rxbd_ring[i];
    828			desc2->paddr = buf_pa;
    829			desc2->len = (u16)skb->len;
    830			desc2->frag_len = (u16)skb->len;
    831			desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
    832			desc2->offset = 0;
    833		} else {
    834			card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
    835					     (sizeof(*desc) * i));
    836			desc = card->rxbd_ring[i];
    837			desc->paddr = buf_pa;
    838			desc->len = (u16)skb->len;
    839			desc->flags = 0;
    840		}
    841	}
    842
    843	return 0;
    844}
    845
    846/* This function initializes event buffer ring descriptors. Each SKB is
    847 * allocated here and after mapping PCI memory, its physical address is assigned
    848 * to PCIE Rx buffer descriptor's physical address
    849 */
    850static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
    851{
    852	struct pcie_service_card *card = adapter->card;
    853	struct mwifiex_evt_buf_desc *desc;
    854	struct sk_buff *skb;
    855	dma_addr_t buf_pa;
    856	int i;
    857
    858	for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
    859		/* Allocate skb here so that firmware can DMA data from it */
    860		skb = dev_alloc_skb(MAX_EVENT_SIZE);
    861		if (!skb) {
    862			mwifiex_dbg(adapter, ERROR,
    863				    "Unable to allocate skb for EVENT buf.\n");
    864			kfree(card->evtbd_ring_vbase);
    865			return -ENOMEM;
    866		}
    867		skb_put(skb, MAX_EVENT_SIZE);
    868
    869		if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
    870					   DMA_FROM_DEVICE)) {
    871			kfree_skb(skb);
    872			kfree(card->evtbd_ring_vbase);
    873			return -1;
    874		}
    875
    876		buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
    877
    878		mwifiex_dbg(adapter, EVENT,
    879			    "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
    880			    skb, skb->len, skb->data, (u32)buf_pa,
    881			    (u32)((u64)buf_pa >> 32));
    882
    883		card->evt_buf_list[i] = skb;
    884		card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
    885				      (sizeof(*desc) * i));
    886		desc = card->evtbd_ring[i];
    887		desc->paddr = buf_pa;
    888		desc->len = (u16)skb->len;
    889		desc->flags = 0;
    890	}
    891
    892	return 0;
    893}
    894
    895/* This function cleans up TX buffer rings. If any of the buffer list has valid
    896 * SKB address, associated SKB is freed.
    897 */
    898static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
    899{
    900	struct pcie_service_card *card = adapter->card;
    901	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
    902	struct sk_buff *skb;
    903	struct mwifiex_pcie_buf_desc *desc;
    904	struct mwifiex_pfu_buf_desc *desc2;
    905	int i;
    906
    907	for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
    908		if (reg->pfu_enabled) {
    909			desc2 = card->txbd_ring[i];
    910			if (card->tx_buf_list[i]) {
    911				skb = card->tx_buf_list[i];
    912				mwifiex_unmap_pci_memory(adapter, skb,
    913							 DMA_TO_DEVICE);
    914				dev_kfree_skb_any(skb);
    915			}
    916			memset(desc2, 0, sizeof(*desc2));
    917		} else {
    918			desc = card->txbd_ring[i];
    919			if (card->tx_buf_list[i]) {
    920				skb = card->tx_buf_list[i];
    921				mwifiex_unmap_pci_memory(adapter, skb,
    922							 DMA_TO_DEVICE);
    923				dev_kfree_skb_any(skb);
    924			}
    925			memset(desc, 0, sizeof(*desc));
    926		}
    927		card->tx_buf_list[i] = NULL;
    928	}
    929
    930	atomic_set(&adapter->tx_hw_pending, 0);
    931	return;
    932}
    933
    934/* This function cleans up RX buffer rings. If any of the buffer list has valid
    935 * SKB address, associated SKB is freed.
    936 */
    937static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
    938{
    939	struct pcie_service_card *card = adapter->card;
    940	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
    941	struct mwifiex_pcie_buf_desc *desc;
    942	struct mwifiex_pfu_buf_desc *desc2;
    943	struct sk_buff *skb;
    944	int i;
    945
    946	for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
    947		if (reg->pfu_enabled) {
    948			desc2 = card->rxbd_ring[i];
    949			if (card->rx_buf_list[i]) {
    950				skb = card->rx_buf_list[i];
    951				mwifiex_unmap_pci_memory(adapter, skb,
    952							 DMA_FROM_DEVICE);
    953				dev_kfree_skb_any(skb);
    954			}
    955			memset(desc2, 0, sizeof(*desc2));
    956		} else {
    957			desc = card->rxbd_ring[i];
    958			if (card->rx_buf_list[i]) {
    959				skb = card->rx_buf_list[i];
    960				mwifiex_unmap_pci_memory(adapter, skb,
    961							 DMA_FROM_DEVICE);
    962				dev_kfree_skb_any(skb);
    963			}
    964			memset(desc, 0, sizeof(*desc));
    965		}
    966		card->rx_buf_list[i] = NULL;
    967	}
    968
    969	return;
    970}
    971
    972/* This function cleans up event buffer rings. If any of the buffer list has
    973 * valid SKB address, associated SKB is freed.
    974 */
    975static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
    976{
    977	struct pcie_service_card *card = adapter->card;
    978	struct mwifiex_evt_buf_desc *desc;
    979	struct sk_buff *skb;
    980	int i;
    981
    982	for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
    983		desc = card->evtbd_ring[i];
    984		if (card->evt_buf_list[i]) {
    985			skb = card->evt_buf_list[i];
    986			mwifiex_unmap_pci_memory(adapter, skb,
    987						 DMA_FROM_DEVICE);
    988			dev_kfree_skb_any(skb);
    989		}
    990		card->evt_buf_list[i] = NULL;
    991		memset(desc, 0, sizeof(*desc));
    992	}
    993
    994	return;
    995}
    996
    997/* This function creates buffer descriptor ring for TX
    998 */
    999static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
   1000{
   1001	struct pcie_service_card *card = adapter->card;
   1002	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1003
   1004	/*
   1005	 * driver maintaines the write pointer and firmware maintaines the read
   1006	 * pointer. The write pointer starts at 0 (zero) while the read pointer
   1007	 * starts at zero with rollover bit set
   1008	 */
   1009	card->txbd_wrptr = 0;
   1010
   1011	if (reg->pfu_enabled)
   1012		card->txbd_rdptr = 0;
   1013	else
   1014		card->txbd_rdptr |= reg->tx_rollover_ind;
   1015
   1016	/* allocate shared memory for the BD ring and divide the same in to
   1017	   several descriptors */
   1018	if (reg->pfu_enabled)
   1019		card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
   1020				       MWIFIEX_MAX_TXRX_BD;
   1021	else
   1022		card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
   1023				       MWIFIEX_MAX_TXRX_BD;
   1024
   1025	mwifiex_dbg(adapter, INFO,
   1026		    "info: txbd_ring: Allocating %d bytes\n",
   1027		    card->txbd_ring_size);
   1028	card->txbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
   1029						   card->txbd_ring_size,
   1030						   &card->txbd_ring_pbase,
   1031						   GFP_KERNEL);
   1032	if (!card->txbd_ring_vbase) {
   1033		mwifiex_dbg(adapter, ERROR,
   1034			    "allocate coherent memory (%d bytes) failed!\n",
   1035			    card->txbd_ring_size);
   1036		return -ENOMEM;
   1037	}
   1038
   1039	mwifiex_dbg(adapter, DATA,
   1040		    "info: txbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
   1041		    card->txbd_ring_vbase, (u32)card->txbd_ring_pbase,
   1042		    (u32)((u64)card->txbd_ring_pbase >> 32),
   1043		    card->txbd_ring_size);
   1044
   1045	return mwifiex_init_txq_ring(adapter);
   1046}
   1047
   1048static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
   1049{
   1050	struct pcie_service_card *card = adapter->card;
   1051	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1052
   1053	mwifiex_cleanup_txq_ring(adapter);
   1054
   1055	if (card->txbd_ring_vbase)
   1056		dma_free_coherent(&card->dev->dev, card->txbd_ring_size,
   1057				  card->txbd_ring_vbase,
   1058				  card->txbd_ring_pbase);
   1059	card->txbd_ring_size = 0;
   1060	card->txbd_wrptr = 0;
   1061	card->txbd_rdptr = 0 | reg->tx_rollover_ind;
   1062	card->txbd_ring_vbase = NULL;
   1063	card->txbd_ring_pbase = 0;
   1064
   1065	return 0;
   1066}
   1067
   1068/*
   1069 * This function creates buffer descriptor ring for RX
   1070 */
   1071static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
   1072{
   1073	struct pcie_service_card *card = adapter->card;
   1074	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1075
   1076	/*
   1077	 * driver maintaines the read pointer and firmware maintaines the write
   1078	 * pointer. The write pointer starts at 0 (zero) while the read pointer
   1079	 * starts at zero with rollover bit set
   1080	 */
   1081	card->rxbd_wrptr = 0;
   1082	card->rxbd_rdptr = reg->rx_rollover_ind;
   1083
   1084	if (reg->pfu_enabled)
   1085		card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
   1086				       MWIFIEX_MAX_TXRX_BD;
   1087	else
   1088		card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
   1089				       MWIFIEX_MAX_TXRX_BD;
   1090
   1091	mwifiex_dbg(adapter, INFO,
   1092		    "info: rxbd_ring: Allocating %d bytes\n",
   1093		    card->rxbd_ring_size);
   1094	card->rxbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
   1095						   card->rxbd_ring_size,
   1096						   &card->rxbd_ring_pbase,
   1097						   GFP_KERNEL);
   1098	if (!card->rxbd_ring_vbase) {
   1099		mwifiex_dbg(adapter, ERROR,
   1100			    "allocate coherent memory (%d bytes) failed!\n",
   1101			    card->rxbd_ring_size);
   1102		return -ENOMEM;
   1103	}
   1104
   1105	mwifiex_dbg(adapter, DATA,
   1106		    "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
   1107		    card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
   1108		    (u32)((u64)card->rxbd_ring_pbase >> 32),
   1109		    card->rxbd_ring_size);
   1110
   1111	return mwifiex_init_rxq_ring(adapter);
   1112}
   1113
   1114/*
   1115 * This function deletes Buffer descriptor ring for RX
   1116 */
   1117static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
   1118{
   1119	struct pcie_service_card *card = adapter->card;
   1120	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1121
   1122	mwifiex_cleanup_rxq_ring(adapter);
   1123
   1124	if (card->rxbd_ring_vbase)
   1125		dma_free_coherent(&card->dev->dev, card->rxbd_ring_size,
   1126				  card->rxbd_ring_vbase,
   1127				  card->rxbd_ring_pbase);
   1128	card->rxbd_ring_size = 0;
   1129	card->rxbd_wrptr = 0;
   1130	card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
   1131	card->rxbd_ring_vbase = NULL;
   1132	card->rxbd_ring_pbase = 0;
   1133
   1134	return 0;
   1135}
   1136
   1137/*
   1138 * This function creates buffer descriptor ring for Events
   1139 */
   1140static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
   1141{
   1142	struct pcie_service_card *card = adapter->card;
   1143	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1144
   1145	/*
   1146	 * driver maintaines the read pointer and firmware maintaines the write
   1147	 * pointer. The write pointer starts at 0 (zero) while the read pointer
   1148	 * starts at zero with rollover bit set
   1149	 */
   1150	card->evtbd_wrptr = 0;
   1151	card->evtbd_rdptr = reg->evt_rollover_ind;
   1152
   1153	card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
   1154				MWIFIEX_MAX_EVT_BD;
   1155
   1156	mwifiex_dbg(adapter, INFO,
   1157		    "info: evtbd_ring: Allocating %d bytes\n",
   1158		    card->evtbd_ring_size);
   1159	card->evtbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
   1160						    card->evtbd_ring_size,
   1161						    &card->evtbd_ring_pbase,
   1162						    GFP_KERNEL);
   1163	if (!card->evtbd_ring_vbase) {
   1164		mwifiex_dbg(adapter, ERROR,
   1165			    "allocate coherent memory (%d bytes) failed!\n",
   1166			    card->evtbd_ring_size);
   1167		return -ENOMEM;
   1168	}
   1169
   1170	mwifiex_dbg(adapter, EVENT,
   1171		    "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
   1172		    card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
   1173		    (u32)((u64)card->evtbd_ring_pbase >> 32),
   1174		    card->evtbd_ring_size);
   1175
   1176	return mwifiex_pcie_init_evt_ring(adapter);
   1177}
   1178
   1179/*
   1180 * This function deletes Buffer descriptor ring for Events
   1181 */
   1182static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
   1183{
   1184	struct pcie_service_card *card = adapter->card;
   1185	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1186
   1187	mwifiex_cleanup_evt_ring(adapter);
   1188
   1189	if (card->evtbd_ring_vbase)
   1190		dma_free_coherent(&card->dev->dev, card->evtbd_ring_size,
   1191				  card->evtbd_ring_vbase,
   1192				  card->evtbd_ring_pbase);
   1193	card->evtbd_wrptr = 0;
   1194	card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
   1195	card->evtbd_ring_size = 0;
   1196	card->evtbd_ring_vbase = NULL;
   1197	card->evtbd_ring_pbase = 0;
   1198
   1199	return 0;
   1200}
   1201
   1202/*
   1203 * This function allocates a buffer for CMDRSP
   1204 */
   1205static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
   1206{
   1207	struct pcie_service_card *card = adapter->card;
   1208	struct sk_buff *skb;
   1209
   1210	/* Allocate memory for receiving command response data */
   1211	skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
   1212	if (!skb) {
   1213		mwifiex_dbg(adapter, ERROR,
   1214			    "Unable to allocate skb for command response data.\n");
   1215		return -ENOMEM;
   1216	}
   1217	skb_put(skb, MWIFIEX_UPLD_SIZE);
   1218	if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
   1219				   DMA_FROM_DEVICE)) {
   1220		kfree_skb(skb);
   1221		return -1;
   1222	}
   1223
   1224	card->cmdrsp_buf = skb;
   1225
   1226	return 0;
   1227}
   1228
   1229/*
   1230 * This function deletes a buffer for CMDRSP
   1231 */
   1232static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
   1233{
   1234	struct pcie_service_card *card;
   1235
   1236	if (!adapter)
   1237		return 0;
   1238
   1239	card = adapter->card;
   1240
   1241	if (card && card->cmdrsp_buf) {
   1242		mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
   1243					 DMA_FROM_DEVICE);
   1244		dev_kfree_skb_any(card->cmdrsp_buf);
   1245		card->cmdrsp_buf = NULL;
   1246	}
   1247
   1248	if (card && card->cmd_buf) {
   1249		mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
   1250					 DMA_TO_DEVICE);
   1251		dev_kfree_skb_any(card->cmd_buf);
   1252		card->cmd_buf = NULL;
   1253	}
   1254	return 0;
   1255}
   1256
   1257/*
   1258 * This function allocates a buffer for sleep cookie
   1259 */
   1260static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
   1261{
   1262	struct pcie_service_card *card = adapter->card;
   1263	u32 *cookie;
   1264
   1265	card->sleep_cookie_vbase = dma_alloc_coherent(&card->dev->dev,
   1266						      sizeof(u32),
   1267						      &card->sleep_cookie_pbase,
   1268						      GFP_KERNEL);
   1269	if (!card->sleep_cookie_vbase) {
   1270		mwifiex_dbg(adapter, ERROR,
   1271			    "dma_alloc_coherent failed!\n");
   1272		return -ENOMEM;
   1273	}
   1274	cookie = (u32 *)card->sleep_cookie_vbase;
   1275	/* Init val of Sleep Cookie */
   1276	*cookie = FW_AWAKE_COOKIE;
   1277
   1278	mwifiex_dbg(adapter, INFO, "alloc_scook: sleep cookie=0x%x\n", *cookie);
   1279
   1280	return 0;
   1281}
   1282
   1283/*
   1284 * This function deletes buffer for sleep cookie
   1285 */
   1286static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
   1287{
   1288	struct pcie_service_card *card;
   1289
   1290	if (!adapter)
   1291		return 0;
   1292
   1293	card = adapter->card;
   1294
   1295	if (card && card->sleep_cookie_vbase) {
   1296		dma_free_coherent(&card->dev->dev, sizeof(u32),
   1297				  card->sleep_cookie_vbase,
   1298				  card->sleep_cookie_pbase);
   1299		card->sleep_cookie_vbase = NULL;
   1300	}
   1301
   1302	return 0;
   1303}
   1304
   1305/* This function flushes the TX buffer descriptor ring
   1306 * This function defined as handler is also called while cleaning TXRX
   1307 * during disconnect/ bss stop.
   1308 */
   1309static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
   1310{
   1311	struct pcie_service_card *card = adapter->card;
   1312
   1313	if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
   1314		card->txbd_flush = 1;
   1315		/* write pointer already set at last send
   1316		 * send dnld-rdy intr again, wait for completion.
   1317		 */
   1318		if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
   1319				      CPU_INTR_DNLD_RDY)) {
   1320			mwifiex_dbg(adapter, ERROR,
   1321				    "failed to assert dnld-rdy interrupt.\n");
   1322			return -1;
   1323		}
   1324	}
   1325	return 0;
   1326}
   1327
   1328/*
   1329 * This function unmaps and frees downloaded data buffer
   1330 */
   1331static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
   1332{
   1333	struct sk_buff *skb;
   1334	u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
   1335	struct mwifiex_pcie_buf_desc *desc;
   1336	struct mwifiex_pfu_buf_desc *desc2;
   1337	struct pcie_service_card *card = adapter->card;
   1338	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1339
   1340	if (!mwifiex_pcie_ok_to_access_hw(adapter))
   1341		mwifiex_pm_wakeup_card(adapter);
   1342
   1343	/* Read the TX ring read pointer set by firmware */
   1344	if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
   1345		mwifiex_dbg(adapter, ERROR,
   1346			    "SEND COMP: failed to read reg->tx_rdptr\n");
   1347		return -1;
   1348	}
   1349
   1350	mwifiex_dbg(adapter, DATA,
   1351		    "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
   1352		    card->txbd_rdptr, rdptr);
   1353
   1354	num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
   1355	/* free from previous txbd_rdptr to current txbd_rdptr */
   1356	while (((card->txbd_rdptr & reg->tx_mask) !=
   1357		(rdptr & reg->tx_mask)) ||
   1358	       ((card->txbd_rdptr & reg->tx_rollover_ind) !=
   1359		(rdptr & reg->tx_rollover_ind))) {
   1360		wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
   1361			    reg->tx_start_ptr;
   1362
   1363		skb = card->tx_buf_list[wrdoneidx];
   1364
   1365		if (skb) {
   1366			mwifiex_dbg(adapter, DATA,
   1367				    "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
   1368				    skb, wrdoneidx);
   1369			mwifiex_unmap_pci_memory(adapter, skb,
   1370						 DMA_TO_DEVICE);
   1371
   1372			unmap_count++;
   1373
   1374			if (card->txbd_flush)
   1375				mwifiex_write_data_complete(adapter, skb, 0,
   1376							    -1);
   1377			else
   1378				mwifiex_write_data_complete(adapter, skb, 0, 0);
   1379			atomic_dec(&adapter->tx_hw_pending);
   1380		}
   1381
   1382		card->tx_buf_list[wrdoneidx] = NULL;
   1383
   1384		if (reg->pfu_enabled) {
   1385			desc2 = card->txbd_ring[wrdoneidx];
   1386			memset(desc2, 0, sizeof(*desc2));
   1387		} else {
   1388			desc = card->txbd_ring[wrdoneidx];
   1389			memset(desc, 0, sizeof(*desc));
   1390		}
   1391		switch (card->dev->device) {
   1392		case PCIE_DEVICE_ID_MARVELL_88W8766P:
   1393			card->txbd_rdptr++;
   1394			break;
   1395		case PCIE_DEVICE_ID_MARVELL_88W8897:
   1396		case PCIE_DEVICE_ID_MARVELL_88W8997:
   1397			card->txbd_rdptr += reg->ring_tx_start_ptr;
   1398			break;
   1399		}
   1400
   1401
   1402		if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
   1403			card->txbd_rdptr = ((card->txbd_rdptr &
   1404					     reg->tx_rollover_ind) ^
   1405					     reg->tx_rollover_ind);
   1406	}
   1407
   1408	if (unmap_count)
   1409		adapter->data_sent = false;
   1410
   1411	if (card->txbd_flush) {
   1412		if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
   1413			card->txbd_flush = 0;
   1414		else
   1415			mwifiex_clean_pcie_ring_buf(adapter);
   1416	}
   1417
   1418	return 0;
   1419}
   1420
   1421/* This function sends data buffer to device. First 4 bytes of payload
   1422 * are filled with payload length and payload type. Then this payload
   1423 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
   1424 * Download ready interrupt to FW is deffered if Tx ring is not full and
   1425 * additional payload can be accomodated.
   1426 * Caller must ensure tx_param parameter to this function is not NULL.
   1427 */
   1428static int
   1429mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
   1430		       struct mwifiex_tx_param *tx_param)
   1431{
   1432	struct pcie_service_card *card = adapter->card;
   1433	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1434	u32 wrindx, num_tx_buffs, rx_val;
   1435	int ret;
   1436	dma_addr_t buf_pa;
   1437	struct mwifiex_pcie_buf_desc *desc = NULL;
   1438	struct mwifiex_pfu_buf_desc *desc2 = NULL;
   1439
   1440	if (!(skb->data && skb->len)) {
   1441		mwifiex_dbg(adapter, ERROR,
   1442			    "%s(): invalid parameter <%p, %#x>\n",
   1443			    __func__, skb->data, skb->len);
   1444		return -1;
   1445	}
   1446
   1447	if (!mwifiex_pcie_ok_to_access_hw(adapter))
   1448		mwifiex_pm_wakeup_card(adapter);
   1449
   1450	num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
   1451	mwifiex_dbg(adapter, DATA,
   1452		    "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
   1453		card->txbd_rdptr, card->txbd_wrptr);
   1454	if (mwifiex_pcie_txbd_not_full(card)) {
   1455		u8 *payload;
   1456
   1457		adapter->data_sent = true;
   1458		payload = skb->data;
   1459		put_unaligned_le16((u16)skb->len, payload + 0);
   1460		put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
   1461
   1462		if (mwifiex_map_pci_memory(adapter, skb, skb->len,
   1463					   DMA_TO_DEVICE))
   1464			return -1;
   1465
   1466		wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
   1467		buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
   1468		card->tx_buf_list[wrindx] = skb;
   1469		atomic_inc(&adapter->tx_hw_pending);
   1470
   1471		if (reg->pfu_enabled) {
   1472			desc2 = card->txbd_ring[wrindx];
   1473			desc2->paddr = buf_pa;
   1474			desc2->len = (u16)skb->len;
   1475			desc2->frag_len = (u16)skb->len;
   1476			desc2->offset = 0;
   1477			desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
   1478					 MWIFIEX_BD_FLAG_LAST_DESC;
   1479		} else {
   1480			desc = card->txbd_ring[wrindx];
   1481			desc->paddr = buf_pa;
   1482			desc->len = (u16)skb->len;
   1483			desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
   1484				      MWIFIEX_BD_FLAG_LAST_DESC;
   1485		}
   1486
   1487		switch (card->dev->device) {
   1488		case PCIE_DEVICE_ID_MARVELL_88W8766P:
   1489			card->txbd_wrptr++;
   1490			break;
   1491		case PCIE_DEVICE_ID_MARVELL_88W8897:
   1492		case PCIE_DEVICE_ID_MARVELL_88W8997:
   1493			card->txbd_wrptr += reg->ring_tx_start_ptr;
   1494			break;
   1495		}
   1496
   1497		if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
   1498			card->txbd_wrptr = ((card->txbd_wrptr &
   1499						reg->tx_rollover_ind) ^
   1500						reg->tx_rollover_ind);
   1501
   1502		rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
   1503		/* Write the TX ring write pointer in to reg->tx_wrptr */
   1504		if (mwifiex_write_reg(adapter, reg->tx_wrptr,
   1505				      card->txbd_wrptr | rx_val)) {
   1506			mwifiex_dbg(adapter, ERROR,
   1507				    "SEND DATA: failed to write reg->tx_wrptr\n");
   1508			ret = -1;
   1509			goto done_unmap;
   1510		}
   1511
   1512		/* The firmware (latest version 15.68.19.p21) of the 88W8897 PCIe+USB card
   1513		 * seems to crash randomly after setting the TX ring write pointer when
   1514		 * ASPM powersaving is enabled. A workaround seems to be keeping the bus
   1515		 * busy by reading a random register afterwards.
   1516		 */
   1517		mwifiex_read_reg(adapter, PCI_VENDOR_ID, &rx_val);
   1518
   1519		if ((mwifiex_pcie_txbd_not_full(card)) &&
   1520		    tx_param->next_pkt_len) {
   1521			/* have more packets and TxBD still can hold more */
   1522			mwifiex_dbg(adapter, DATA,
   1523				    "SEND DATA: delay dnld-rdy interrupt.\n");
   1524			adapter->data_sent = false;
   1525		} else {
   1526			/* Send the TX ready interrupt */
   1527			if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
   1528					      CPU_INTR_DNLD_RDY)) {
   1529				mwifiex_dbg(adapter, ERROR,
   1530					    "SEND DATA: failed to assert dnld-rdy interrupt.\n");
   1531				ret = -1;
   1532				goto done_unmap;
   1533			}
   1534		}
   1535		mwifiex_dbg(adapter, DATA,
   1536			    "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
   1537			    "%#x> and sent packet to firmware successfully\n",
   1538			    card->txbd_rdptr, card->txbd_wrptr);
   1539	} else {
   1540		mwifiex_dbg(adapter, DATA,
   1541			    "info: TX Ring full, can't send packets to fw\n");
   1542		adapter->data_sent = true;
   1543		/* Send the TX ready interrupt */
   1544		if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
   1545				      CPU_INTR_DNLD_RDY))
   1546			mwifiex_dbg(adapter, ERROR,
   1547				    "SEND DATA: failed to assert door-bell intr\n");
   1548		return -EBUSY;
   1549	}
   1550
   1551	return -EINPROGRESS;
   1552done_unmap:
   1553	mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
   1554	card->tx_buf_list[wrindx] = NULL;
   1555	atomic_dec(&adapter->tx_hw_pending);
   1556	if (reg->pfu_enabled)
   1557		memset(desc2, 0, sizeof(*desc2));
   1558	else
   1559		memset(desc, 0, sizeof(*desc));
   1560
   1561	return ret;
   1562}
   1563
   1564/*
   1565 * This function handles received buffer ring and
   1566 * dispatches packets to upper
   1567 */
   1568static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
   1569{
   1570	struct pcie_service_card *card = adapter->card;
   1571	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1572	u32 wrptr, rd_index, tx_val;
   1573	dma_addr_t buf_pa;
   1574	int ret = 0;
   1575	struct sk_buff *skb_tmp = NULL;
   1576	struct mwifiex_pcie_buf_desc *desc;
   1577	struct mwifiex_pfu_buf_desc *desc2;
   1578
   1579	if (!mwifiex_pcie_ok_to_access_hw(adapter))
   1580		mwifiex_pm_wakeup_card(adapter);
   1581
   1582	/* Read the RX ring Write pointer set by firmware */
   1583	if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
   1584		mwifiex_dbg(adapter, ERROR,
   1585			    "RECV DATA: failed to read reg->rx_wrptr\n");
   1586		ret = -1;
   1587		goto done;
   1588	}
   1589	card->rxbd_wrptr = wrptr;
   1590
   1591	while (((wrptr & reg->rx_mask) !=
   1592		(card->rxbd_rdptr & reg->rx_mask)) ||
   1593	       ((wrptr & reg->rx_rollover_ind) ==
   1594		(card->rxbd_rdptr & reg->rx_rollover_ind))) {
   1595		struct sk_buff *skb_data;
   1596		u16 rx_len;
   1597
   1598		rd_index = card->rxbd_rdptr & reg->rx_mask;
   1599		skb_data = card->rx_buf_list[rd_index];
   1600
   1601		/* If skb allocation was failed earlier for Rx packet,
   1602		 * rx_buf_list[rd_index] would have been left with a NULL.
   1603		 */
   1604		if (!skb_data)
   1605			return -ENOMEM;
   1606
   1607		mwifiex_unmap_pci_memory(adapter, skb_data, DMA_FROM_DEVICE);
   1608		card->rx_buf_list[rd_index] = NULL;
   1609
   1610		/* Get data length from interface header -
   1611		 * first 2 bytes for len, next 2 bytes is for type
   1612		 */
   1613		rx_len = get_unaligned_le16(skb_data->data);
   1614		if (WARN_ON(rx_len <= adapter->intf_hdr_len ||
   1615			    rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
   1616			mwifiex_dbg(adapter, ERROR,
   1617				    "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
   1618				    rx_len, card->rxbd_rdptr, wrptr);
   1619			dev_kfree_skb_any(skb_data);
   1620		} else {
   1621			skb_put(skb_data, rx_len);
   1622			mwifiex_dbg(adapter, DATA,
   1623				    "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
   1624				    card->rxbd_rdptr, wrptr, rx_len);
   1625			skb_pull(skb_data, adapter->intf_hdr_len);
   1626			if (adapter->rx_work_enabled) {
   1627				skb_queue_tail(&adapter->rx_data_q, skb_data);
   1628				adapter->data_received = true;
   1629				atomic_inc(&adapter->rx_pending);
   1630			} else {
   1631				mwifiex_handle_rx_packet(adapter, skb_data);
   1632			}
   1633		}
   1634
   1635		skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
   1636						      GFP_KERNEL);
   1637		if (!skb_tmp) {
   1638			mwifiex_dbg(adapter, ERROR,
   1639				    "Unable to allocate skb.\n");
   1640			return -ENOMEM;
   1641		}
   1642
   1643		if (mwifiex_map_pci_memory(adapter, skb_tmp,
   1644					   MWIFIEX_RX_DATA_BUF_SIZE,
   1645					   DMA_FROM_DEVICE))
   1646			return -1;
   1647
   1648		buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
   1649
   1650		mwifiex_dbg(adapter, INFO,
   1651			    "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
   1652			    skb_tmp, rd_index);
   1653		card->rx_buf_list[rd_index] = skb_tmp;
   1654
   1655		if (reg->pfu_enabled) {
   1656			desc2 = card->rxbd_ring[rd_index];
   1657			desc2->paddr = buf_pa;
   1658			desc2->len = skb_tmp->len;
   1659			desc2->frag_len = skb_tmp->len;
   1660			desc2->offset = 0;
   1661			desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
   1662		} else {
   1663			desc = card->rxbd_ring[rd_index];
   1664			desc->paddr = buf_pa;
   1665			desc->len = skb_tmp->len;
   1666			desc->flags = 0;
   1667		}
   1668
   1669		if ((++card->rxbd_rdptr & reg->rx_mask) ==
   1670							MWIFIEX_MAX_TXRX_BD) {
   1671			card->rxbd_rdptr = ((card->rxbd_rdptr &
   1672					     reg->rx_rollover_ind) ^
   1673					     reg->rx_rollover_ind);
   1674		}
   1675		mwifiex_dbg(adapter, DATA,
   1676			    "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
   1677			    card->rxbd_rdptr, wrptr);
   1678
   1679		tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
   1680		/* Write the RX ring read pointer in to reg->rx_rdptr */
   1681		if (mwifiex_write_reg(adapter, reg->rx_rdptr,
   1682				      card->rxbd_rdptr | tx_val)) {
   1683			mwifiex_dbg(adapter, DATA,
   1684				    "RECV DATA: failed to write reg->rx_rdptr\n");
   1685			ret = -1;
   1686			goto done;
   1687		}
   1688
   1689		/* Read the RX ring Write pointer set by firmware */
   1690		if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
   1691			mwifiex_dbg(adapter, ERROR,
   1692				    "RECV DATA: failed to read reg->rx_wrptr\n");
   1693			ret = -1;
   1694			goto done;
   1695		}
   1696		mwifiex_dbg(adapter, DATA,
   1697			    "info: RECV DATA: Rcvd packet from fw successfully\n");
   1698		card->rxbd_wrptr = wrptr;
   1699	}
   1700
   1701done:
   1702	return ret;
   1703}
   1704
   1705/*
   1706 * This function downloads the boot command to device
   1707 */
   1708static int
   1709mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
   1710{
   1711	dma_addr_t buf_pa;
   1712	struct pcie_service_card *card = adapter->card;
   1713	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1714
   1715	if (!(skb->data && skb->len)) {
   1716		mwifiex_dbg(adapter, ERROR,
   1717			    "Invalid parameter in %s <%p. len %d>\n",
   1718			    __func__, skb->data, skb->len);
   1719		return -1;
   1720	}
   1721
   1722	if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE))
   1723		return -1;
   1724
   1725	buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
   1726
   1727	/* Write the lower 32bits of the physical address to low command
   1728	 * address scratch register
   1729	 */
   1730	if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
   1731		mwifiex_dbg(adapter, ERROR,
   1732			    "%s: failed to write download command to boot code.\n",
   1733			    __func__);
   1734		mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
   1735		return -1;
   1736	}
   1737
   1738	/* Write the upper 32bits of the physical address to high command
   1739	 * address scratch register
   1740	 */
   1741	if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
   1742			      (u32)((u64)buf_pa >> 32))) {
   1743		mwifiex_dbg(adapter, ERROR,
   1744			    "%s: failed to write download command to boot code.\n",
   1745			    __func__);
   1746		mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
   1747		return -1;
   1748	}
   1749
   1750	/* Write the command length to cmd_size scratch register */
   1751	if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
   1752		mwifiex_dbg(adapter, ERROR,
   1753			    "%s: failed to write command len to cmd_size scratch reg\n",
   1754			    __func__);
   1755		mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
   1756		return -1;
   1757	}
   1758
   1759	/* Ring the door bell */
   1760	if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
   1761			      CPU_INTR_DOOR_BELL)) {
   1762		mwifiex_dbg(adapter, ERROR,
   1763			    "%s: failed to assert door-bell intr\n", __func__);
   1764		mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
   1765		return -1;
   1766	}
   1767
   1768	return 0;
   1769}
   1770
   1771/* This function init rx port in firmware which in turn enables to receive data
   1772 * from device before transmitting any packet.
   1773 */
   1774static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
   1775{
   1776	struct pcie_service_card *card = adapter->card;
   1777	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1778	int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
   1779
   1780	/* Write the RX ring read pointer in to reg->rx_rdptr */
   1781	if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
   1782			      tx_wrap)) {
   1783		mwifiex_dbg(adapter, ERROR,
   1784			    "RECV DATA: failed to write reg->rx_rdptr\n");
   1785		return -1;
   1786	}
   1787	return 0;
   1788}
   1789
   1790/* This function downloads commands to the device
   1791 */
   1792static int
   1793mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
   1794{
   1795	struct pcie_service_card *card = adapter->card;
   1796	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1797	int ret = 0;
   1798	dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
   1799	u8 *payload = (u8 *)skb->data;
   1800
   1801	if (!(skb->data && skb->len)) {
   1802		mwifiex_dbg(adapter, ERROR,
   1803			    "Invalid parameter in %s <%p, %#x>\n",
   1804			    __func__, skb->data, skb->len);
   1805		return -1;
   1806	}
   1807
   1808	/* Make sure a command response buffer is available */
   1809	if (!card->cmdrsp_buf) {
   1810		mwifiex_dbg(adapter, ERROR,
   1811			    "No response buffer available, send command failed\n");
   1812		return -EBUSY;
   1813	}
   1814
   1815	if (!mwifiex_pcie_ok_to_access_hw(adapter))
   1816		mwifiex_pm_wakeup_card(adapter);
   1817
   1818	adapter->cmd_sent = true;
   1819
   1820	put_unaligned_le16((u16)skb->len, &payload[0]);
   1821	put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
   1822
   1823	if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE))
   1824		return -1;
   1825
   1826	card->cmd_buf = skb;
   1827	/*
   1828	 * Need to keep a reference, since core driver might free up this
   1829	 * buffer before we've unmapped it.
   1830	 */
   1831	skb_get(skb);
   1832
   1833	/* To send a command, the driver will:
   1834		1. Write the 64bit physical address of the data buffer to
   1835		   cmd response address low  + cmd response address high
   1836		2. Ring the door bell (i.e. set the door bell interrupt)
   1837
   1838		In response to door bell interrupt, the firmware will perform
   1839		the DMA of the command packet (first header to obtain the total
   1840		length and then rest of the command).
   1841	*/
   1842
   1843	if (card->cmdrsp_buf) {
   1844		cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
   1845		/* Write the lower 32bits of the cmdrsp buffer physical
   1846		   address */
   1847		if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
   1848				      (u32)cmdrsp_buf_pa)) {
   1849			mwifiex_dbg(adapter, ERROR,
   1850				    "Failed to write download cmd to boot code.\n");
   1851			ret = -1;
   1852			goto done;
   1853		}
   1854		/* Write the upper 32bits of the cmdrsp buffer physical
   1855		   address */
   1856		if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
   1857				      (u32)((u64)cmdrsp_buf_pa >> 32))) {
   1858			mwifiex_dbg(adapter, ERROR,
   1859				    "Failed to write download cmd to boot code.\n");
   1860			ret = -1;
   1861			goto done;
   1862		}
   1863	}
   1864
   1865	cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
   1866	/* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
   1867	if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
   1868			      (u32)cmd_buf_pa)) {
   1869		mwifiex_dbg(adapter, ERROR,
   1870			    "Failed to write download cmd to boot code.\n");
   1871		ret = -1;
   1872		goto done;
   1873	}
   1874	/* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
   1875	if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
   1876			      (u32)((u64)cmd_buf_pa >> 32))) {
   1877		mwifiex_dbg(adapter, ERROR,
   1878			    "Failed to write download cmd to boot code.\n");
   1879		ret = -1;
   1880		goto done;
   1881	}
   1882
   1883	/* Write the command length to reg->cmd_size */
   1884	if (mwifiex_write_reg(adapter, reg->cmd_size,
   1885			      card->cmd_buf->len)) {
   1886		mwifiex_dbg(adapter, ERROR,
   1887			    "Failed to write cmd len to reg->cmd_size\n");
   1888		ret = -1;
   1889		goto done;
   1890	}
   1891
   1892	/* Ring the door bell */
   1893	if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
   1894			      CPU_INTR_DOOR_BELL)) {
   1895		mwifiex_dbg(adapter, ERROR,
   1896			    "Failed to assert door-bell intr\n");
   1897		ret = -1;
   1898		goto done;
   1899	}
   1900
   1901done:
   1902	if (ret)
   1903		adapter->cmd_sent = false;
   1904
   1905	return 0;
   1906}
   1907
   1908/*
   1909 * This function handles command complete interrupt
   1910 */
   1911static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
   1912{
   1913	struct pcie_service_card *card = adapter->card;
   1914	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   1915	struct sk_buff *skb = card->cmdrsp_buf;
   1916	int count = 0;
   1917	u16 rx_len;
   1918
   1919	mwifiex_dbg(adapter, CMD,
   1920		    "info: Rx CMD Response\n");
   1921
   1922	if (adapter->curr_cmd)
   1923		mwifiex_unmap_pci_memory(adapter, skb, DMA_FROM_DEVICE);
   1924	else
   1925		dma_sync_single_for_cpu(&card->dev->dev,
   1926					MWIFIEX_SKB_DMA_ADDR(skb),
   1927					MWIFIEX_UPLD_SIZE, DMA_FROM_DEVICE);
   1928
   1929	/* Unmap the command as a response has been received. */
   1930	if (card->cmd_buf) {
   1931		mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
   1932					 DMA_TO_DEVICE);
   1933		dev_kfree_skb_any(card->cmd_buf);
   1934		card->cmd_buf = NULL;
   1935	}
   1936
   1937	rx_len = get_unaligned_le16(skb->data);
   1938	skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
   1939	skb_trim(skb, rx_len);
   1940
   1941	if (!adapter->curr_cmd) {
   1942		if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
   1943			dma_sync_single_for_device(&card->dev->dev,
   1944						   MWIFIEX_SKB_DMA_ADDR(skb),
   1945						   MWIFIEX_SLEEP_COOKIE_SIZE,
   1946						   DMA_FROM_DEVICE);
   1947			if (mwifiex_write_reg(adapter,
   1948					      PCIE_CPU_INT_EVENT,
   1949					      CPU_INTR_SLEEP_CFM_DONE)) {
   1950				mwifiex_dbg(adapter, ERROR,
   1951					    "Write register failed\n");
   1952				return -1;
   1953			}
   1954			mwifiex_delay_for_sleep_cookie(adapter,
   1955						       MWIFIEX_MAX_DELAY_COUNT);
   1956			mwifiex_unmap_pci_memory(adapter, skb,
   1957						 DMA_FROM_DEVICE);
   1958			skb_pull(skb, adapter->intf_hdr_len);
   1959			while (reg->sleep_cookie && (count++ < 10) &&
   1960			       mwifiex_pcie_ok_to_access_hw(adapter))
   1961				usleep_range(50, 60);
   1962			mwifiex_pcie_enable_host_int(adapter);
   1963			mwifiex_process_sleep_confirm_resp(adapter, skb->data,
   1964							   skb->len);
   1965		} else {
   1966			mwifiex_dbg(adapter, ERROR,
   1967				    "There is no command but got cmdrsp\n");
   1968		}
   1969		memcpy(adapter->upld_buf, skb->data,
   1970		       min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
   1971		skb_push(skb, adapter->intf_hdr_len);
   1972		if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
   1973					   DMA_FROM_DEVICE))
   1974			return -1;
   1975	} else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
   1976		skb_pull(skb, adapter->intf_hdr_len);
   1977		adapter->curr_cmd->resp_skb = skb;
   1978		adapter->cmd_resp_received = true;
   1979		/* Take the pointer and set it to CMD node and will
   1980		   return in the response complete callback */
   1981		card->cmdrsp_buf = NULL;
   1982
   1983		/* Clear the cmd-rsp buffer address in scratch registers. This
   1984		   will prevent firmware from writing to the same response
   1985		   buffer again. */
   1986		if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
   1987			mwifiex_dbg(adapter, ERROR,
   1988				    "cmd_done: failed to clear cmd_rsp_addr_lo\n");
   1989			return -1;
   1990		}
   1991		/* Write the upper 32bits of the cmdrsp buffer physical
   1992		   address */
   1993		if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
   1994			mwifiex_dbg(adapter, ERROR,
   1995				    "cmd_done: failed to clear cmd_rsp_addr_hi\n");
   1996			return -1;
   1997		}
   1998	}
   1999
   2000	return 0;
   2001}
   2002
   2003/*
   2004 * Command Response processing complete handler
   2005 */
   2006static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
   2007					struct sk_buff *skb)
   2008{
   2009	struct pcie_service_card *card = adapter->card;
   2010
   2011	if (skb) {
   2012		card->cmdrsp_buf = skb;
   2013		skb_push(card->cmdrsp_buf, adapter->intf_hdr_len);
   2014		if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
   2015					   DMA_FROM_DEVICE))
   2016			return -1;
   2017	}
   2018
   2019	return 0;
   2020}
   2021
   2022/*
   2023 * This function handles firmware event ready interrupt
   2024 */
   2025static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
   2026{
   2027	struct pcie_service_card *card = adapter->card;
   2028	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   2029	u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
   2030	u32 wrptr, event;
   2031	struct mwifiex_evt_buf_desc *desc;
   2032
   2033	if (!mwifiex_pcie_ok_to_access_hw(adapter))
   2034		mwifiex_pm_wakeup_card(adapter);
   2035
   2036	if (adapter->event_received) {
   2037		mwifiex_dbg(adapter, EVENT,
   2038			    "info: Event being processed,\t"
   2039			    "do not process this interrupt just yet\n");
   2040		return 0;
   2041	}
   2042
   2043	if (rdptr >= MWIFIEX_MAX_EVT_BD) {
   2044		mwifiex_dbg(adapter, ERROR,
   2045			    "info: Invalid read pointer...\n");
   2046		return -1;
   2047	}
   2048
   2049	/* Read the event ring write pointer set by firmware */
   2050	if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
   2051		mwifiex_dbg(adapter, ERROR,
   2052			    "EventReady: failed to read reg->evt_wrptr\n");
   2053		return -1;
   2054	}
   2055
   2056	mwifiex_dbg(adapter, EVENT,
   2057		    "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
   2058		    card->evtbd_rdptr, wrptr);
   2059	if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
   2060					      & MWIFIEX_EVTBD_MASK)) ||
   2061	    ((wrptr & reg->evt_rollover_ind) ==
   2062	     (card->evtbd_rdptr & reg->evt_rollover_ind))) {
   2063		struct sk_buff *skb_cmd;
   2064		__le16 data_len = 0;
   2065		u16 evt_len;
   2066
   2067		mwifiex_dbg(adapter, INFO,
   2068			    "info: Read Index: %d\n", rdptr);
   2069		skb_cmd = card->evt_buf_list[rdptr];
   2070		mwifiex_unmap_pci_memory(adapter, skb_cmd, DMA_FROM_DEVICE);
   2071
   2072		/* Take the pointer and set it to event pointer in adapter
   2073		   and will return back after event handling callback */
   2074		card->evt_buf_list[rdptr] = NULL;
   2075		desc = card->evtbd_ring[rdptr];
   2076		memset(desc, 0, sizeof(*desc));
   2077
   2078		event = get_unaligned_le32(
   2079			&skb_cmd->data[adapter->intf_hdr_len]);
   2080		adapter->event_cause = event;
   2081		/* The first 4bytes will be the event transfer header
   2082		   len is 2 bytes followed by type which is 2 bytes */
   2083		memcpy(&data_len, skb_cmd->data, sizeof(__le16));
   2084		evt_len = le16_to_cpu(data_len);
   2085		skb_trim(skb_cmd, evt_len);
   2086		skb_pull(skb_cmd, adapter->intf_hdr_len);
   2087		mwifiex_dbg(adapter, EVENT,
   2088			    "info: Event length: %d\n", evt_len);
   2089
   2090		if (evt_len > MWIFIEX_EVENT_HEADER_LEN &&
   2091		    evt_len < MAX_EVENT_SIZE)
   2092			memcpy(adapter->event_body, skb_cmd->data +
   2093			       MWIFIEX_EVENT_HEADER_LEN, evt_len -
   2094			       MWIFIEX_EVENT_HEADER_LEN);
   2095
   2096		adapter->event_received = true;
   2097		adapter->event_skb = skb_cmd;
   2098
   2099		/* Do not update the event read pointer here, wait till the
   2100		   buffer is released. This is just to make things simpler,
   2101		   we need to find a better method of managing these buffers.
   2102		*/
   2103	} else {
   2104		if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
   2105				      CPU_INTR_EVENT_DONE)) {
   2106			mwifiex_dbg(adapter, ERROR,
   2107				    "Write register failed\n");
   2108			return -1;
   2109		}
   2110	}
   2111
   2112	return 0;
   2113}
   2114
   2115/*
   2116 * Event processing complete handler
   2117 */
   2118static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
   2119				       struct sk_buff *skb)
   2120{
   2121	struct pcie_service_card *card = adapter->card;
   2122	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   2123	int ret = 0;
   2124	u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
   2125	u32 wrptr;
   2126	struct mwifiex_evt_buf_desc *desc;
   2127
   2128	if (!skb)
   2129		return 0;
   2130
   2131	if (rdptr >= MWIFIEX_MAX_EVT_BD) {
   2132		mwifiex_dbg(adapter, ERROR,
   2133			    "event_complete: Invalid rdptr 0x%x\n",
   2134			    rdptr);
   2135		return -EINVAL;
   2136	}
   2137
   2138	/* Read the event ring write pointer set by firmware */
   2139	if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
   2140		mwifiex_dbg(adapter, ERROR,
   2141			    "event_complete: failed to read reg->evt_wrptr\n");
   2142		return -1;
   2143	}
   2144
   2145	if (!card->evt_buf_list[rdptr]) {
   2146		skb_push(skb, adapter->intf_hdr_len);
   2147		skb_put(skb, MAX_EVENT_SIZE - skb->len);
   2148		if (mwifiex_map_pci_memory(adapter, skb,
   2149					   MAX_EVENT_SIZE,
   2150					   DMA_FROM_DEVICE))
   2151			return -1;
   2152		card->evt_buf_list[rdptr] = skb;
   2153		desc = card->evtbd_ring[rdptr];
   2154		desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
   2155		desc->len = (u16)skb->len;
   2156		desc->flags = 0;
   2157		skb = NULL;
   2158	} else {
   2159		mwifiex_dbg(adapter, ERROR,
   2160			    "info: ERROR: buf still valid at index %d, <%p, %p>\n",
   2161			    rdptr, card->evt_buf_list[rdptr], skb);
   2162	}
   2163
   2164	if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
   2165		card->evtbd_rdptr = ((card->evtbd_rdptr &
   2166					reg->evt_rollover_ind) ^
   2167					reg->evt_rollover_ind);
   2168	}
   2169
   2170	mwifiex_dbg(adapter, EVENT,
   2171		    "info: Updated <Rd: 0x%x, Wr: 0x%x>",
   2172		    card->evtbd_rdptr, wrptr);
   2173
   2174	/* Write the event ring read pointer in to reg->evt_rdptr */
   2175	if (mwifiex_write_reg(adapter, reg->evt_rdptr,
   2176			      card->evtbd_rdptr)) {
   2177		mwifiex_dbg(adapter, ERROR,
   2178			    "event_complete: failed to read reg->evt_rdptr\n");
   2179		return -1;
   2180	}
   2181
   2182	mwifiex_dbg(adapter, EVENT,
   2183		    "info: Check Events Again\n");
   2184	ret = mwifiex_pcie_process_event_ready(adapter);
   2185
   2186	return ret;
   2187}
   2188
   2189/* Combo firmware image is a combination of
   2190 * (1) combo crc heaer, start with CMD5
   2191 * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1.
   2192 * (3) wifi image.
   2193 *
   2194 * This function bypass the header and bluetooth part, return
   2195 * the offset of tail wifi-only part. If the image is already wifi-only,
   2196 * that is start with CMD1, return 0.
   2197 */
   2198
   2199static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
   2200				   const void *firmware, u32 firmware_len) {
   2201	const struct mwifiex_fw_data *fwdata;
   2202	u32 offset = 0, data_len, dnld_cmd;
   2203	int ret = 0;
   2204	bool cmd7_before = false, first_cmd = false;
   2205
   2206	while (1) {
   2207		/* Check for integer and buffer overflow */
   2208		if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
   2209		    offset + sizeof(fwdata->header) >= firmware_len) {
   2210			mwifiex_dbg(adapter, ERROR,
   2211				    "extract wifi-only fw failure!\n");
   2212			ret = -1;
   2213			goto done;
   2214		}
   2215
   2216		fwdata = firmware + offset;
   2217		dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
   2218		data_len = le32_to_cpu(fwdata->header.data_length);
   2219
   2220		/* Skip past header */
   2221		offset += sizeof(fwdata->header);
   2222
   2223		switch (dnld_cmd) {
   2224		case MWIFIEX_FW_DNLD_CMD_1:
   2225			if (offset + data_len < data_len) {
   2226				mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
   2227				ret = -1;
   2228				goto done;
   2229			}
   2230
   2231			/* Image start with cmd1, already wifi-only firmware */
   2232			if (!first_cmd) {
   2233				mwifiex_dbg(adapter, MSG,
   2234					    "input wifi-only firmware\n");
   2235				return 0;
   2236			}
   2237
   2238			if (!cmd7_before) {
   2239				mwifiex_dbg(adapter, ERROR,
   2240					    "no cmd7 before cmd1!\n");
   2241				ret = -1;
   2242				goto done;
   2243			}
   2244			offset += data_len;
   2245			break;
   2246		case MWIFIEX_FW_DNLD_CMD_5:
   2247			first_cmd = true;
   2248			/* Check for integer overflow */
   2249			if (offset + data_len < data_len) {
   2250				mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
   2251				ret = -1;
   2252				goto done;
   2253			}
   2254			offset += data_len;
   2255			break;
   2256		case MWIFIEX_FW_DNLD_CMD_6:
   2257			first_cmd = true;
   2258			/* Check for integer overflow */
   2259			if (offset + data_len < data_len) {
   2260				mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
   2261				ret = -1;
   2262				goto done;
   2263			}
   2264			offset += data_len;
   2265			if (offset >= firmware_len) {
   2266				mwifiex_dbg(adapter, ERROR,
   2267					    "extract wifi-only fw failure!\n");
   2268				ret = -1;
   2269			} else {
   2270				ret = offset;
   2271			}
   2272			goto done;
   2273		case MWIFIEX_FW_DNLD_CMD_7:
   2274			first_cmd = true;
   2275			cmd7_before = true;
   2276			break;
   2277		default:
   2278			mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n",
   2279				    dnld_cmd);
   2280			ret = -1;
   2281			goto done;
   2282		}
   2283	}
   2284
   2285done:
   2286	return ret;
   2287}
   2288
   2289/*
   2290 * This function downloads the firmware to the card.
   2291 *
   2292 * Firmware is downloaded to the card in blocks. Every block download
   2293 * is tested for CRC errors, and retried a number of times before
   2294 * returning failure.
   2295 */
   2296static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
   2297				    struct mwifiex_fw_image *fw)
   2298{
   2299	int ret;
   2300	u8 *firmware = fw->fw_buf;
   2301	u32 firmware_len = fw->fw_len;
   2302	u32 offset = 0;
   2303	struct sk_buff *skb;
   2304	u32 txlen, tx_blocks = 0, tries, len, val;
   2305	u32 block_retry_cnt = 0;
   2306	struct pcie_service_card *card = adapter->card;
   2307	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   2308
   2309	if (!firmware || !firmware_len) {
   2310		mwifiex_dbg(adapter, ERROR,
   2311			    "No firmware image found! Terminating download\n");
   2312		return -1;
   2313	}
   2314
   2315	mwifiex_dbg(adapter, INFO,
   2316		    "info: Downloading FW image (%d bytes)\n",
   2317		    firmware_len);
   2318
   2319	if (mwifiex_pcie_disable_host_int(adapter)) {
   2320		mwifiex_dbg(adapter, ERROR,
   2321			    "%s: Disabling interrupts failed.\n", __func__);
   2322		return -1;
   2323	}
   2324
   2325	skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
   2326	if (!skb) {
   2327		ret = -ENOMEM;
   2328		goto done;
   2329	}
   2330
   2331	ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val);
   2332	if (ret) {
   2333		mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n");
   2334		goto done;
   2335	}
   2336
   2337	/* PCIE FLR case: extract wifi part from combo firmware*/
   2338	if (val == MWIFIEX_PCIE_FLR_HAPPENS) {
   2339		ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len);
   2340		if (ret < 0) {
   2341			mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n");
   2342			goto done;
   2343		}
   2344		offset = ret;
   2345		mwifiex_dbg(adapter, MSG,
   2346			    "info: dnld wifi firmware from %d bytes\n", offset);
   2347	}
   2348
   2349	/* Perform firmware data transfer */
   2350	do {
   2351		u32 ireg_intr = 0;
   2352
   2353		/* More data? */
   2354		if (offset >= firmware_len)
   2355			break;
   2356
   2357		for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
   2358			ret = mwifiex_read_reg(adapter, reg->cmd_size,
   2359					       &len);
   2360			if (ret) {
   2361				mwifiex_dbg(adapter, FATAL,
   2362					    "Failed reading len from boot code\n");
   2363				goto done;
   2364			}
   2365			if (len)
   2366				break;
   2367			usleep_range(10, 20);
   2368		}
   2369
   2370		if (!len) {
   2371			break;
   2372		} else if (len > MWIFIEX_UPLD_SIZE) {
   2373			mwifiex_dbg(adapter, ERROR,
   2374				    "FW download failure @ %d, invalid length %d\n",
   2375				    offset, len);
   2376			ret = -1;
   2377			goto done;
   2378		}
   2379
   2380		txlen = len;
   2381
   2382		if (len & BIT(0)) {
   2383			block_retry_cnt++;
   2384			if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
   2385				mwifiex_dbg(adapter, ERROR,
   2386					    "FW download failure @ %d, over max\t"
   2387					    "retry count\n", offset);
   2388				ret = -1;
   2389				goto done;
   2390			}
   2391			mwifiex_dbg(adapter, ERROR,
   2392				    "FW CRC error indicated by the\t"
   2393				    "helper: len = 0x%04X, txlen = %d\n",
   2394				    len, txlen);
   2395			len &= ~BIT(0);
   2396			/* Setting this to 0 to resend from same offset */
   2397			txlen = 0;
   2398		} else {
   2399			block_retry_cnt = 0;
   2400			/* Set blocksize to transfer - checking for
   2401			   last block */
   2402			if (firmware_len - offset < txlen)
   2403				txlen = firmware_len - offset;
   2404
   2405			tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
   2406				    card->pcie.blksz_fw_dl;
   2407
   2408			/* Copy payload to buffer */
   2409			memmove(skb->data, &firmware[offset], txlen);
   2410		}
   2411
   2412		skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
   2413		skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
   2414
   2415		/* Send the boot command to device */
   2416		if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
   2417			mwifiex_dbg(adapter, ERROR,
   2418				    "Failed to send firmware download command\n");
   2419			ret = -1;
   2420			goto done;
   2421		}
   2422
   2423		/* Wait for the command done interrupt */
   2424		for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
   2425			if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
   2426					     &ireg_intr)) {
   2427				mwifiex_dbg(adapter, ERROR,
   2428					    "%s: Failed to read\t"
   2429					    "interrupt status during fw dnld.\n",
   2430					    __func__);
   2431				mwifiex_unmap_pci_memory(adapter, skb,
   2432							 DMA_TO_DEVICE);
   2433				ret = -1;
   2434				goto done;
   2435			}
   2436			if (!(ireg_intr & CPU_INTR_DOOR_BELL))
   2437				break;
   2438			usleep_range(10, 20);
   2439		}
   2440		if (ireg_intr & CPU_INTR_DOOR_BELL) {
   2441			mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
   2442				    __func__);
   2443			mwifiex_unmap_pci_memory(adapter, skb,
   2444						 DMA_TO_DEVICE);
   2445			ret = -1;
   2446			goto done;
   2447		}
   2448
   2449		mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
   2450
   2451		offset += txlen;
   2452	} while (true);
   2453
   2454	mwifiex_dbg(adapter, MSG,
   2455		    "info: FW download over, size %d bytes\n", offset);
   2456
   2457	ret = 0;
   2458
   2459done:
   2460	dev_kfree_skb_any(skb);
   2461	return ret;
   2462}
   2463
   2464/*
   2465 * This function checks the firmware status in card.
   2466 */
   2467static int
   2468mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
   2469{
   2470	int ret = 0;
   2471	u32 firmware_stat;
   2472	struct pcie_service_card *card = adapter->card;
   2473	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   2474	u32 tries;
   2475
   2476	/* Mask spurios interrupts */
   2477	if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
   2478			      HOST_INTR_MASK)) {
   2479		mwifiex_dbg(adapter, ERROR,
   2480			    "Write register failed\n");
   2481		return -1;
   2482	}
   2483
   2484	mwifiex_dbg(adapter, INFO,
   2485		    "Setting driver ready signature\n");
   2486	if (mwifiex_write_reg(adapter, reg->drv_rdy,
   2487			      FIRMWARE_READY_PCIE)) {
   2488		mwifiex_dbg(adapter, ERROR,
   2489			    "Failed to write driver ready signature\n");
   2490		return -1;
   2491	}
   2492
   2493	/* Wait for firmware initialization event */
   2494	for (tries = 0; tries < poll_num; tries++) {
   2495		if (mwifiex_read_reg(adapter, reg->fw_status,
   2496				     &firmware_stat))
   2497			ret = -1;
   2498		else
   2499			ret = 0;
   2500
   2501		mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>",
   2502			    tries, ret, firmware_stat);
   2503
   2504		if (ret)
   2505			continue;
   2506		if (firmware_stat == FIRMWARE_READY_PCIE) {
   2507			ret = 0;
   2508			break;
   2509		} else {
   2510			msleep(100);
   2511			ret = -1;
   2512		}
   2513	}
   2514
   2515	return ret;
   2516}
   2517
   2518/* This function checks if WLAN is the winner.
   2519 */
   2520static int
   2521mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
   2522{
   2523	u32 winner = 0;
   2524	int ret = 0;
   2525	struct pcie_service_card *card = adapter->card;
   2526	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   2527
   2528	if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) {
   2529		ret = -1;
   2530	} else if (!winner) {
   2531		mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n");
   2532		adapter->winner = 1;
   2533	} else {
   2534		mwifiex_dbg(adapter, ERROR,
   2535			    "PCI-E is not the winner <%#x>", winner);
   2536	}
   2537
   2538	return ret;
   2539}
   2540
   2541/*
   2542 * This function reads the interrupt status from card.
   2543 */
   2544static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
   2545				     int msg_id)
   2546{
   2547	u32 pcie_ireg;
   2548	unsigned long flags;
   2549	struct pcie_service_card *card = adapter->card;
   2550
   2551	if (card->msi_enable) {
   2552		spin_lock_irqsave(&adapter->int_lock, flags);
   2553		adapter->int_status = 1;
   2554		spin_unlock_irqrestore(&adapter->int_lock, flags);
   2555		return;
   2556	}
   2557
   2558	if (!mwifiex_pcie_ok_to_access_hw(adapter))
   2559		return;
   2560
   2561	if (card->msix_enable && msg_id >= 0) {
   2562		pcie_ireg = BIT(msg_id);
   2563	} else {
   2564		if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
   2565				     &pcie_ireg)) {
   2566			mwifiex_dbg(adapter, ERROR, "Read register failed\n");
   2567			return;
   2568		}
   2569
   2570		if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg)
   2571			return;
   2572
   2573
   2574		mwifiex_pcie_disable_host_int(adapter);
   2575
   2576		/* Clear the pending interrupts */
   2577		if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
   2578				      ~pcie_ireg)) {
   2579			mwifiex_dbg(adapter, ERROR,
   2580				    "Write register failed\n");
   2581			return;
   2582		}
   2583	}
   2584
   2585	if (!adapter->pps_uapsd_mode &&
   2586	    adapter->ps_state == PS_STATE_SLEEP &&
   2587	    mwifiex_pcie_ok_to_access_hw(adapter)) {
   2588		/* Potentially for PCIe we could get other
   2589		 * interrupts like shared. Don't change power
   2590		 * state until cookie is set
   2591		 */
   2592		adapter->ps_state = PS_STATE_AWAKE;
   2593		adapter->pm_wakeup_fw_try = false;
   2594		del_timer(&adapter->wakeup_timer);
   2595	}
   2596
   2597	spin_lock_irqsave(&adapter->int_lock, flags);
   2598	adapter->int_status |= pcie_ireg;
   2599	spin_unlock_irqrestore(&adapter->int_lock, flags);
   2600	mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
   2601}
   2602
   2603/*
   2604 * Interrupt handler for PCIe root port
   2605 *
   2606 * This function reads the interrupt status from firmware and assigns
   2607 * the main process in workqueue which will handle the interrupt.
   2608 */
   2609static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
   2610{
   2611	struct mwifiex_msix_context *ctx = context;
   2612	struct pci_dev *pdev = ctx->dev;
   2613	struct pcie_service_card *card;
   2614	struct mwifiex_adapter *adapter;
   2615
   2616	card = pci_get_drvdata(pdev);
   2617
   2618	if (!card->adapter) {
   2619		pr_err("info: %s: card=%p adapter=%p\n", __func__, card,
   2620		       card ? card->adapter : NULL);
   2621		goto exit;
   2622	}
   2623	adapter = card->adapter;
   2624
   2625	if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags))
   2626		goto exit;
   2627
   2628	if (card->msix_enable)
   2629		mwifiex_interrupt_status(adapter, ctx->msg_id);
   2630	else
   2631		mwifiex_interrupt_status(adapter, -1);
   2632
   2633	mwifiex_queue_main_work(adapter);
   2634
   2635exit:
   2636	return IRQ_HANDLED;
   2637}
   2638
   2639/*
   2640 * This function checks the current interrupt status.
   2641 *
   2642 * The following interrupts are checked and handled by this function -
   2643 *      - Data sent
   2644 *      - Command sent
   2645 *      - Command received
   2646 *      - Packets received
   2647 *      - Events received
   2648 *
   2649 * In case of Rx packets received, the packets are uploaded from card to
   2650 * host and processed accordingly.
   2651 */
   2652static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
   2653{
   2654	int ret;
   2655	u32 pcie_ireg = 0;
   2656	unsigned long flags;
   2657	struct pcie_service_card *card = adapter->card;
   2658
   2659	spin_lock_irqsave(&adapter->int_lock, flags);
   2660	if (!card->msi_enable) {
   2661		/* Clear out unused interrupts */
   2662		pcie_ireg = adapter->int_status;
   2663	}
   2664	adapter->int_status = 0;
   2665	spin_unlock_irqrestore(&adapter->int_lock, flags);
   2666
   2667	if (card->msi_enable) {
   2668		if (mwifiex_pcie_ok_to_access_hw(adapter)) {
   2669			if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
   2670					     &pcie_ireg)) {
   2671				mwifiex_dbg(adapter, ERROR,
   2672					    "Read register failed\n");
   2673				return -1;
   2674			}
   2675
   2676			if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
   2677				if (mwifiex_write_reg(adapter,
   2678						      PCIE_HOST_INT_STATUS,
   2679						      ~pcie_ireg)) {
   2680					mwifiex_dbg(adapter, ERROR,
   2681						    "Write register failed\n");
   2682					return -1;
   2683				}
   2684				if (!adapter->pps_uapsd_mode &&
   2685				    adapter->ps_state == PS_STATE_SLEEP) {
   2686					adapter->ps_state = PS_STATE_AWAKE;
   2687					adapter->pm_wakeup_fw_try = false;
   2688					del_timer(&adapter->wakeup_timer);
   2689				}
   2690			}
   2691		}
   2692	}
   2693
   2694	if (pcie_ireg & HOST_INTR_DNLD_DONE) {
   2695		mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n");
   2696		ret = mwifiex_pcie_send_data_complete(adapter);
   2697		if (ret)
   2698			return ret;
   2699	}
   2700	if (pcie_ireg & HOST_INTR_UPLD_RDY) {
   2701		mwifiex_dbg(adapter, INTR, "info: Rx DATA\n");
   2702		ret = mwifiex_pcie_process_recv_data(adapter);
   2703		if (ret)
   2704			return ret;
   2705	}
   2706	if (pcie_ireg & HOST_INTR_EVENT_RDY) {
   2707		mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n");
   2708		ret = mwifiex_pcie_process_event_ready(adapter);
   2709		if (ret)
   2710			return ret;
   2711	}
   2712	if (pcie_ireg & HOST_INTR_CMD_DONE) {
   2713		if (adapter->cmd_sent) {
   2714			mwifiex_dbg(adapter, INTR,
   2715				    "info: CMD sent Interrupt\n");
   2716			adapter->cmd_sent = false;
   2717		}
   2718		/* Handle command response */
   2719		ret = mwifiex_pcie_process_cmd_complete(adapter);
   2720		if (ret)
   2721			return ret;
   2722	}
   2723
   2724	mwifiex_dbg(adapter, INTR,
   2725		    "info: cmd_sent=%d data_sent=%d\n",
   2726		    adapter->cmd_sent, adapter->data_sent);
   2727	if (!card->msi_enable && !card->msix_enable &&
   2728				 adapter->ps_state != PS_STATE_SLEEP)
   2729		mwifiex_pcie_enable_host_int(adapter);
   2730
   2731	return 0;
   2732}
   2733
   2734/*
   2735 * This function downloads data from driver to card.
   2736 *
   2737 * Both commands and data packets are transferred to the card by this
   2738 * function.
   2739 *
   2740 * This function adds the PCIE specific header to the front of the buffer
   2741 * before transferring. The header contains the length of the packet and
   2742 * the type. The firmware handles the packets based upon this set type.
   2743 */
   2744static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
   2745				     struct sk_buff *skb,
   2746				     struct mwifiex_tx_param *tx_param)
   2747{
   2748	if (!skb) {
   2749		mwifiex_dbg(adapter, ERROR,
   2750			    "Passed NULL skb to %s\n", __func__);
   2751		return -1;
   2752	}
   2753
   2754	if (type == MWIFIEX_TYPE_DATA)
   2755		return mwifiex_pcie_send_data(adapter, skb, tx_param);
   2756	else if (type == MWIFIEX_TYPE_CMD)
   2757		return mwifiex_pcie_send_cmd(adapter, skb);
   2758
   2759	return 0;
   2760}
   2761
   2762/* Function to dump PCIE scratch registers in case of FW crash
   2763 */
   2764static int
   2765mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
   2766{
   2767	char *p = drv_buf;
   2768	char buf[256], *ptr;
   2769	int i;
   2770	u32 value;
   2771	struct pcie_service_card *card = adapter->card;
   2772	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   2773	int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
   2774				  PCIE_SCRATCH_14_REG,
   2775				  PCIE_SCRATCH_15_REG};
   2776
   2777	if (!p)
   2778		return 0;
   2779
   2780	mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
   2781
   2782	if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
   2783		mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
   2784		return 0;
   2785	}
   2786
   2787	ptr = buf;
   2788	mwifiex_dbg(adapter, MSG, "pcie scratch register:");
   2789	for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
   2790		mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
   2791		ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
   2792			       pcie_scratch_reg[i], value);
   2793	}
   2794
   2795	mwifiex_dbg(adapter, MSG, "%s\n", buf);
   2796	p += sprintf(p, "%s\n", buf);
   2797
   2798	mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
   2799
   2800	return p - drv_buf;
   2801}
   2802
   2803/* This function read/write firmware */
   2804static enum rdwr_status
   2805mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
   2806{
   2807	int ret, tries;
   2808	u8 ctrl_data;
   2809	u32 fw_status;
   2810	struct pcie_service_card *card = adapter->card;
   2811	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   2812
   2813	if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
   2814		return RDWR_STATUS_FAILURE;
   2815
   2816	ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
   2817				reg->fw_dump_host_ready);
   2818	if (ret) {
   2819		mwifiex_dbg(adapter, ERROR,
   2820			    "PCIE write err\n");
   2821		return RDWR_STATUS_FAILURE;
   2822	}
   2823
   2824	for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
   2825		mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
   2826		if (ctrl_data == FW_DUMP_DONE)
   2827			return RDWR_STATUS_SUCCESS;
   2828		if (doneflag && ctrl_data == doneflag)
   2829			return RDWR_STATUS_DONE;
   2830		if (ctrl_data != reg->fw_dump_host_ready) {
   2831			mwifiex_dbg(adapter, WARN,
   2832				    "The ctrl reg was changed, re-try again!\n");
   2833			ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
   2834						reg->fw_dump_host_ready);
   2835			if (ret) {
   2836				mwifiex_dbg(adapter, ERROR,
   2837					    "PCIE write err\n");
   2838				return RDWR_STATUS_FAILURE;
   2839			}
   2840		}
   2841		usleep_range(100, 200);
   2842	}
   2843
   2844	mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
   2845	return RDWR_STATUS_FAILURE;
   2846}
   2847
   2848/* This function dump firmware memory to file */
   2849static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
   2850{
   2851	struct pcie_service_card *card = adapter->card;
   2852	const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
   2853	unsigned int reg, reg_start, reg_end;
   2854	u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
   2855	u8 idx, i, read_reg, doneflag = 0;
   2856	enum rdwr_status stat;
   2857	u32 memory_size;
   2858	int ret;
   2859
   2860	if (!card->pcie.can_dump_fw)
   2861		return;
   2862
   2863	for (idx = 0; idx < adapter->num_mem_types; idx++) {
   2864		struct memory_type_mapping *entry =
   2865				&adapter->mem_type_mapping_tbl[idx];
   2866
   2867		if (entry->mem_ptr) {
   2868			vfree(entry->mem_ptr);
   2869			entry->mem_ptr = NULL;
   2870		}
   2871		entry->mem_size = 0;
   2872	}
   2873
   2874	mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
   2875
   2876	/* Read the number of the memories which will dump */
   2877	stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
   2878	if (stat == RDWR_STATUS_FAILURE)
   2879		return;
   2880
   2881	reg = creg->fw_dump_start;
   2882	mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
   2883
   2884	/* W8997 chipset firmware dump will be restore in single region*/
   2885	if (fw_dump_num == 0)
   2886		dump_num = 1;
   2887	else
   2888		dump_num = fw_dump_num;
   2889
   2890	/* Read the length of every memory which will dump */
   2891	for (idx = 0; idx < dump_num; idx++) {
   2892		struct memory_type_mapping *entry =
   2893				&adapter->mem_type_mapping_tbl[idx];
   2894		memory_size = 0;
   2895		if (fw_dump_num != 0) {
   2896			stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
   2897			if (stat == RDWR_STATUS_FAILURE)
   2898				return;
   2899
   2900			reg = creg->fw_dump_start;
   2901			for (i = 0; i < 4; i++) {
   2902				mwifiex_read_reg_byte(adapter, reg, &read_reg);
   2903				memory_size |= (read_reg << (i * 8));
   2904				reg++;
   2905			}
   2906		} else {
   2907			memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
   2908		}
   2909
   2910		if (memory_size == 0) {
   2911			mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
   2912			ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
   2913						creg->fw_dump_read_done);
   2914			if (ret) {
   2915				mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
   2916				return;
   2917			}
   2918			break;
   2919		}
   2920
   2921		mwifiex_dbg(adapter, DUMP,
   2922			    "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
   2923		entry->mem_ptr = vmalloc(memory_size + 1);
   2924		entry->mem_size = memory_size;
   2925		if (!entry->mem_ptr) {
   2926			mwifiex_dbg(adapter, ERROR,
   2927				    "Vmalloc %s failed\n", entry->mem_name);
   2928			return;
   2929		}
   2930		dbg_ptr = entry->mem_ptr;
   2931		end_ptr = dbg_ptr + memory_size;
   2932
   2933		doneflag = entry->done_flag;
   2934		mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
   2935			    entry->mem_name);
   2936
   2937		do {
   2938			stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
   2939			if (RDWR_STATUS_FAILURE == stat)
   2940				return;
   2941
   2942			reg_start = creg->fw_dump_start;
   2943			reg_end = creg->fw_dump_end;
   2944			for (reg = reg_start; reg <= reg_end; reg++) {
   2945				mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
   2946				if (dbg_ptr < end_ptr) {
   2947					dbg_ptr++;
   2948					continue;
   2949				}
   2950				mwifiex_dbg(adapter, ERROR,
   2951					    "pre-allocated buf not enough\n");
   2952				tmp_ptr =
   2953					vzalloc(memory_size + MWIFIEX_SIZE_4K);
   2954				if (!tmp_ptr)
   2955					return;
   2956				memcpy(tmp_ptr, entry->mem_ptr, memory_size);
   2957				vfree(entry->mem_ptr);
   2958				entry->mem_ptr = tmp_ptr;
   2959				tmp_ptr = NULL;
   2960				dbg_ptr = entry->mem_ptr + memory_size;
   2961				memory_size += MWIFIEX_SIZE_4K;
   2962				end_ptr = entry->mem_ptr + memory_size;
   2963			}
   2964
   2965			if (stat != RDWR_STATUS_DONE)
   2966				continue;
   2967
   2968			mwifiex_dbg(adapter, DUMP,
   2969				    "%s done: size=0x%tx\n",
   2970				    entry->mem_name, dbg_ptr - entry->mem_ptr);
   2971			break;
   2972		} while (true);
   2973	}
   2974	mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
   2975}
   2976
   2977static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
   2978{
   2979	adapter->devdump_data = vzalloc(MWIFIEX_FW_DUMP_SIZE);
   2980	if (!adapter->devdump_data) {
   2981		mwifiex_dbg(adapter, ERROR,
   2982			    "vzalloc devdump data failure!\n");
   2983		return;
   2984	}
   2985
   2986	mwifiex_drv_info_dump(adapter);
   2987	mwifiex_pcie_fw_dump(adapter);
   2988	mwifiex_prepare_fw_dump_info(adapter);
   2989	mwifiex_upload_device_dump(adapter);
   2990}
   2991
   2992static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter)
   2993{
   2994	struct pcie_service_card *card = adapter->card;
   2995
   2996	/* We can't afford to wait here; remove() might be waiting on us. If we
   2997	 * can't grab the device lock, maybe we'll get another chance later.
   2998	 */
   2999	pci_try_reset_function(card->dev);
   3000}
   3001
   3002static void mwifiex_pcie_work(struct work_struct *work)
   3003{
   3004	struct pcie_service_card *card =
   3005		container_of(work, struct pcie_service_card, work);
   3006
   3007	if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
   3008			       &card->work_flags))
   3009		mwifiex_pcie_device_dump_work(card->adapter);
   3010	if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
   3011			       &card->work_flags))
   3012		mwifiex_pcie_card_reset_work(card->adapter);
   3013}
   3014
   3015/* This function dumps FW information */
   3016static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
   3017{
   3018	struct pcie_service_card *card = adapter->card;
   3019
   3020	if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
   3021			      &card->work_flags))
   3022		schedule_work(&card->work);
   3023}
   3024
   3025static void mwifiex_pcie_card_reset(struct mwifiex_adapter *adapter)
   3026{
   3027	struct pcie_service_card *card = adapter->card;
   3028
   3029	if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags))
   3030		schedule_work(&card->work);
   3031}
   3032
   3033static int mwifiex_pcie_alloc_buffers(struct mwifiex_adapter *adapter)
   3034{
   3035	struct pcie_service_card *card = adapter->card;
   3036	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   3037	int ret;
   3038
   3039	card->cmdrsp_buf = NULL;
   3040	ret = mwifiex_pcie_create_txbd_ring(adapter);
   3041	if (ret) {
   3042		mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n");
   3043		goto err_cre_txbd;
   3044	}
   3045
   3046	ret = mwifiex_pcie_create_rxbd_ring(adapter);
   3047	if (ret) {
   3048		mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n");
   3049		goto err_cre_rxbd;
   3050	}
   3051
   3052	ret = mwifiex_pcie_create_evtbd_ring(adapter);
   3053	if (ret) {
   3054		mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n");
   3055		goto err_cre_evtbd;
   3056	}
   3057
   3058	ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
   3059	if (ret) {
   3060		mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n");
   3061		goto err_alloc_cmdbuf;
   3062	}
   3063
   3064	if (reg->sleep_cookie) {
   3065		ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
   3066		if (ret) {
   3067			mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n");
   3068			goto err_alloc_cookie;
   3069		}
   3070	} else {
   3071		card->sleep_cookie_vbase = NULL;
   3072	}
   3073
   3074	return 0;
   3075
   3076err_alloc_cookie:
   3077	mwifiex_pcie_delete_cmdrsp_buf(adapter);
   3078err_alloc_cmdbuf:
   3079	mwifiex_pcie_delete_evtbd_ring(adapter);
   3080err_cre_evtbd:
   3081	mwifiex_pcie_delete_rxbd_ring(adapter);
   3082err_cre_rxbd:
   3083	mwifiex_pcie_delete_txbd_ring(adapter);
   3084err_cre_txbd:
   3085	return ret;
   3086}
   3087
   3088static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter)
   3089{
   3090	struct pcie_service_card *card = adapter->card;
   3091	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   3092
   3093	if (reg->sleep_cookie)
   3094		mwifiex_pcie_delete_sleep_cookie_buf(adapter);
   3095
   3096	mwifiex_pcie_delete_cmdrsp_buf(adapter);
   3097	mwifiex_pcie_delete_evtbd_ring(adapter);
   3098	mwifiex_pcie_delete_rxbd_ring(adapter);
   3099	mwifiex_pcie_delete_txbd_ring(adapter);
   3100}
   3101
   3102/*
   3103 * This function initializes the PCI-E host memory space, WCB rings, etc.
   3104 */
   3105static int mwifiex_init_pcie(struct mwifiex_adapter *adapter)
   3106{
   3107	struct pcie_service_card *card = adapter->card;
   3108	int ret;
   3109	struct pci_dev *pdev = card->dev;
   3110
   3111	pci_set_drvdata(pdev, card);
   3112
   3113	ret = pci_enable_device(pdev);
   3114	if (ret)
   3115		goto err_enable_dev;
   3116
   3117	pci_set_master(pdev);
   3118
   3119	ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
   3120	if (ret) {
   3121		pr_err("dma_set_mask(32) failed: %d\n", ret);
   3122		goto err_set_dma_mask;
   3123	}
   3124
   3125	ret = pci_request_region(pdev, 0, DRV_NAME);
   3126	if (ret) {
   3127		pr_err("req_reg(0) error\n");
   3128		goto err_req_region0;
   3129	}
   3130	card->pci_mmap = pci_iomap(pdev, 0, 0);
   3131	if (!card->pci_mmap) {
   3132		pr_err("iomap(0) error\n");
   3133		ret = -EIO;
   3134		goto err_iomap0;
   3135	}
   3136	ret = pci_request_region(pdev, 2, DRV_NAME);
   3137	if (ret) {
   3138		pr_err("req_reg(2) error\n");
   3139		goto err_req_region2;
   3140	}
   3141	card->pci_mmap1 = pci_iomap(pdev, 2, 0);
   3142	if (!card->pci_mmap1) {
   3143		pr_err("iomap(2) error\n");
   3144		ret = -EIO;
   3145		goto err_iomap2;
   3146	}
   3147
   3148	pr_notice("PCI memory map Virt0: %pK PCI memory map Virt2: %pK\n",
   3149		  card->pci_mmap, card->pci_mmap1);
   3150
   3151	ret = mwifiex_pcie_alloc_buffers(adapter);
   3152	if (ret)
   3153		goto err_alloc_buffers;
   3154
   3155	if (pdev->device == PCIE_DEVICE_ID_MARVELL_88W8897)
   3156		adapter->ignore_btcoex_events = true;
   3157
   3158	return 0;
   3159
   3160err_alloc_buffers:
   3161	pci_iounmap(pdev, card->pci_mmap1);
   3162err_iomap2:
   3163	pci_release_region(pdev, 2);
   3164err_req_region2:
   3165	pci_iounmap(pdev, card->pci_mmap);
   3166err_iomap0:
   3167	pci_release_region(pdev, 0);
   3168err_req_region0:
   3169err_set_dma_mask:
   3170	pci_disable_device(pdev);
   3171err_enable_dev:
   3172	return ret;
   3173}
   3174
   3175/*
   3176 * This function cleans up the allocated card buffers.
   3177 */
   3178static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter)
   3179{
   3180	struct pcie_service_card *card = adapter->card;
   3181	struct pci_dev *pdev = card->dev;
   3182	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   3183	u32 fw_status;
   3184
   3185	/* Perform the cancel_work_sync() only when we're not resetting
   3186	 * the card. It's because that function never returns if we're
   3187	 * in reset path. If we're here when resetting the card, it means
   3188	 * that we failed to reset the card (reset failure path).
   3189	 */
   3190	if (!card->pci_reset_ongoing) {
   3191		mwifiex_dbg(adapter, MSG, "performing cancel_work_sync()...\n");
   3192		cancel_work_sync(&card->work);
   3193		mwifiex_dbg(adapter, MSG, "cancel_work_sync() done\n");
   3194	} else {
   3195		mwifiex_dbg(adapter, MSG,
   3196			    "skipped cancel_work_sync() because we're in card reset failure path\n");
   3197	}
   3198
   3199	mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
   3200	if (fw_status == FIRMWARE_READY_PCIE) {
   3201		mwifiex_dbg(adapter, INFO,
   3202			    "Clearing driver ready signature\n");
   3203		if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
   3204			mwifiex_dbg(adapter, ERROR,
   3205				    "Failed to write driver not-ready signature\n");
   3206	}
   3207
   3208	pci_disable_device(pdev);
   3209
   3210	pci_iounmap(pdev, card->pci_mmap);
   3211	pci_iounmap(pdev, card->pci_mmap1);
   3212	pci_release_region(pdev, 2);
   3213	pci_release_region(pdev, 0);
   3214
   3215	mwifiex_pcie_free_buffers(adapter);
   3216}
   3217
   3218static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
   3219{
   3220	int ret, i, j;
   3221	struct pcie_service_card *card = adapter->card;
   3222	struct pci_dev *pdev = card->dev;
   3223
   3224	if (card->pcie.reg->msix_support) {
   3225		for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
   3226			card->msix_entries[i].entry = i;
   3227		ret = pci_enable_msix_exact(pdev, card->msix_entries,
   3228					    MWIFIEX_NUM_MSIX_VECTORS);
   3229		if (!ret) {
   3230			for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) {
   3231				card->msix_ctx[i].dev = pdev;
   3232				card->msix_ctx[i].msg_id = i;
   3233
   3234				ret = request_irq(card->msix_entries[i].vector,
   3235						  mwifiex_pcie_interrupt, 0,
   3236						  "MWIFIEX_PCIE_MSIX",
   3237						  &card->msix_ctx[i]);
   3238				if (ret)
   3239					break;
   3240			}
   3241
   3242			if (ret) {
   3243				mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n",
   3244					    ret);
   3245				for (j = 0; j < i; j++)
   3246					free_irq(card->msix_entries[j].vector,
   3247						 &card->msix_ctx[i]);
   3248				pci_disable_msix(pdev);
   3249			} else {
   3250				mwifiex_dbg(adapter, MSG, "MSIx enabled!");
   3251				card->msix_enable = 1;
   3252				return 0;
   3253			}
   3254		}
   3255	}
   3256
   3257	if (pci_enable_msi(pdev) != 0)
   3258		pci_disable_msi(pdev);
   3259	else
   3260		card->msi_enable = 1;
   3261
   3262	mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
   3263
   3264	card->share_irq_ctx.dev = pdev;
   3265	card->share_irq_ctx.msg_id = -1;
   3266	ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
   3267			  "MRVL_PCIE", &card->share_irq_ctx);
   3268	if (ret) {
   3269		pr_err("request_irq failed: ret=%d\n", ret);
   3270		return -1;
   3271	}
   3272
   3273	return 0;
   3274}
   3275
   3276/*
   3277 * This function gets the firmware name for downloading by revision id
   3278 *
   3279 * Read revision id register to get revision id
   3280 */
   3281static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter)
   3282{
   3283	int revision_id = 0;
   3284	int version, magic;
   3285	struct pcie_service_card *card = adapter->card;
   3286
   3287	switch (card->dev->device) {
   3288	case PCIE_DEVICE_ID_MARVELL_88W8766P:
   3289		strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
   3290		break;
   3291	case PCIE_DEVICE_ID_MARVELL_88W8897:
   3292		mwifiex_write_reg(adapter, 0x0c58, 0x80c00000);
   3293		mwifiex_read_reg(adapter, 0x0c58, &revision_id);
   3294		revision_id &= 0xff00;
   3295		switch (revision_id) {
   3296		case PCIE8897_A0:
   3297			strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME);
   3298			break;
   3299		case PCIE8897_B0:
   3300			strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME);
   3301			break;
   3302		default:
   3303			strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME);
   3304
   3305			break;
   3306		}
   3307		break;
   3308	case PCIE_DEVICE_ID_MARVELL_88W8997:
   3309		mwifiex_read_reg(adapter, 0x8, &revision_id);
   3310		mwifiex_read_reg(adapter, 0x0cd0, &version);
   3311		mwifiex_read_reg(adapter, 0x0cd4, &magic);
   3312		revision_id &= 0xff;
   3313		version &= 0x7;
   3314		magic &= 0xff;
   3315		if (revision_id == PCIE8997_A1 &&
   3316		    magic == CHIP_MAGIC_VALUE &&
   3317		    version == CHIP_VER_PCIEUART)
   3318			strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4);
   3319		else
   3320			strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4);
   3321		break;
   3322	default:
   3323		break;
   3324	}
   3325}
   3326
   3327/*
   3328 * This function registers the PCIE device.
   3329 *
   3330 * PCIE IRQ is claimed, block size is set and driver data is initialized.
   3331 */
   3332static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
   3333{
   3334	struct pcie_service_card *card = adapter->card;
   3335
   3336	/* save adapter pointer in card */
   3337	card->adapter = adapter;
   3338
   3339	if (mwifiex_pcie_request_irq(adapter))
   3340		return -1;
   3341
   3342	adapter->tx_buf_size = card->pcie.tx_buf_size;
   3343	adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
   3344	adapter->num_mem_types = card->pcie.num_mem_types;
   3345	adapter->ext_scan = card->pcie.can_ext_scan;
   3346	mwifiex_pcie_get_fw_name(adapter);
   3347
   3348	return 0;
   3349}
   3350
   3351/*
   3352 * This function unregisters the PCIE device.
   3353 *
   3354 * The PCIE IRQ is released, the function is disabled and driver
   3355 * data is set to null.
   3356 */
   3357static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
   3358{
   3359	struct pcie_service_card *card = adapter->card;
   3360	struct pci_dev *pdev = card->dev;
   3361	int i;
   3362
   3363	if (card->msix_enable) {
   3364		for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
   3365			synchronize_irq(card->msix_entries[i].vector);
   3366
   3367		for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
   3368			free_irq(card->msix_entries[i].vector,
   3369				 &card->msix_ctx[i]);
   3370
   3371		card->msix_enable = 0;
   3372		pci_disable_msix(pdev);
   3373	} else {
   3374		mwifiex_dbg(adapter, INFO,
   3375			    "%s(): calling free_irq()\n", __func__);
   3376	       free_irq(card->dev->irq, &card->share_irq_ctx);
   3377
   3378		if (card->msi_enable)
   3379			pci_disable_msi(pdev);
   3380	}
   3381	card->adapter = NULL;
   3382}
   3383
   3384/*
   3385 * This function initializes the PCI-E host memory space, WCB rings, etc.,
   3386 * similar to mwifiex_init_pcie(), but without resetting PCI-E state.
   3387 */
   3388static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter)
   3389{
   3390	struct pcie_service_card *card = adapter->card;
   3391	struct pci_dev *pdev = card->dev;
   3392
   3393	/* tx_buf_size might be changed to 3584 by firmware during
   3394	 * data transfer, we should reset it to default size.
   3395	 */
   3396	adapter->tx_buf_size = card->pcie.tx_buf_size;
   3397
   3398	mwifiex_pcie_alloc_buffers(adapter);
   3399
   3400	pci_set_master(pdev);
   3401}
   3402
   3403/* This function cleans up the PCI-E host memory space. */
   3404static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter)
   3405{
   3406	struct pcie_service_card *card = adapter->card;
   3407	const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
   3408	struct pci_dev *pdev = card->dev;
   3409
   3410	if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
   3411		mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n");
   3412
   3413	pci_clear_master(pdev);
   3414
   3415	adapter->seq_num = 0;
   3416
   3417	mwifiex_pcie_free_buffers(adapter);
   3418}
   3419
   3420static struct mwifiex_if_ops pcie_ops = {
   3421	.init_if =			mwifiex_init_pcie,
   3422	.cleanup_if =			mwifiex_cleanup_pcie,
   3423	.check_fw_status =		mwifiex_check_fw_status,
   3424	.check_winner_status =          mwifiex_check_winner_status,
   3425	.prog_fw =			mwifiex_prog_fw_w_helper,
   3426	.register_dev =			mwifiex_register_dev,
   3427	.unregister_dev =		mwifiex_unregister_dev,
   3428	.enable_int =			mwifiex_pcie_enable_host_int,
   3429	.disable_int =			mwifiex_pcie_disable_host_int_noerr,
   3430	.process_int_status =		mwifiex_process_int_status,
   3431	.host_to_card =			mwifiex_pcie_host_to_card,
   3432	.wakeup =			mwifiex_pm_wakeup_card,
   3433	.wakeup_complete =		mwifiex_pm_wakeup_card_complete,
   3434
   3435	/* PCIE specific */
   3436	.cmdrsp_complete =		mwifiex_pcie_cmdrsp_complete,
   3437	.event_complete =		mwifiex_pcie_event_complete,
   3438	.update_mp_end_port =		NULL,
   3439	.cleanup_mpa_buf =		NULL,
   3440	.init_fw_port =			mwifiex_pcie_init_fw_port,
   3441	.clean_pcie_ring =		mwifiex_clean_pcie_ring_buf,
   3442	.card_reset =			mwifiex_pcie_card_reset,
   3443	.reg_dump =			mwifiex_pcie_reg_dump,
   3444	.device_dump =			mwifiex_pcie_device_dump,
   3445	.down_dev =			mwifiex_pcie_down_dev,
   3446	.up_dev =			mwifiex_pcie_up_dev,
   3447};
   3448
   3449module_pci_driver(mwifiex_pcie);
   3450
   3451MODULE_AUTHOR("Marvell International Ltd.");
   3452MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
   3453MODULE_VERSION(PCIE_VERSION);
   3454MODULE_LICENSE("GPL v2");