root/drivers/net/wireless/marvell/mwifiex/pcie.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mwifiex_pcie_probe_of
  2. mwifiex_map_pci_memory
  3. mwifiex_unmap_pci_memory
  4. mwifiex_write_reg
  5. mwifiex_read_reg
  6. mwifiex_read_reg_byte
  7. mwifiex_pcie_ok_to_access_hw
  8. mwifiex_pcie_suspend
  9. mwifiex_pcie_resume
  10. mwifiex_pcie_probe
  11. mwifiex_pcie_remove
  12. mwifiex_pcie_shutdown
  13. mwifiex_pcie_coredump
  14. mwifiex_pcie_reset_prepare
  15. mwifiex_pcie_reset_done
  16. mwifiex_pcie_dev_wakeup_delay
  17. mwifiex_delay_for_sleep_cookie
  18. mwifiex_pm_wakeup_card
  19. mwifiex_pm_wakeup_card_complete
  20. mwifiex_pcie_disable_host_int
  21. mwifiex_pcie_disable_host_int_noerr
  22. mwifiex_pcie_enable_host_int
  23. mwifiex_init_txq_ring
  24. mwifiex_init_rxq_ring
  25. mwifiex_pcie_init_evt_ring
  26. mwifiex_cleanup_txq_ring
  27. mwifiex_cleanup_rxq_ring
  28. mwifiex_cleanup_evt_ring
  29. mwifiex_pcie_create_txbd_ring
  30. mwifiex_pcie_delete_txbd_ring
  31. mwifiex_pcie_create_rxbd_ring
  32. mwifiex_pcie_delete_rxbd_ring
  33. mwifiex_pcie_create_evtbd_ring
  34. mwifiex_pcie_delete_evtbd_ring
  35. mwifiex_pcie_alloc_cmdrsp_buf
  36. mwifiex_pcie_delete_cmdrsp_buf
  37. mwifiex_pcie_alloc_sleep_cookie_buf
  38. mwifiex_pcie_delete_sleep_cookie_buf
  39. mwifiex_clean_pcie_ring_buf
  40. mwifiex_pcie_send_data_complete
  41. mwifiex_pcie_send_data
  42. mwifiex_pcie_process_recv_data
  43. mwifiex_pcie_send_boot_cmd
  44. mwifiex_pcie_init_fw_port
  45. mwifiex_pcie_send_cmd
  46. mwifiex_pcie_process_cmd_complete
  47. mwifiex_pcie_cmdrsp_complete
  48. mwifiex_pcie_process_event_ready
  49. mwifiex_pcie_event_complete
  50. mwifiex_extract_wifi_fw
  51. mwifiex_prog_fw_w_helper
  52. mwifiex_check_fw_status
  53. mwifiex_check_winner_status
  54. mwifiex_interrupt_status
  55. mwifiex_pcie_interrupt
  56. mwifiex_process_int_status
  57. mwifiex_pcie_host_to_card
  58. mwifiex_pcie_reg_dump
  59. mwifiex_pcie_rdwr_firmware
  60. mwifiex_pcie_fw_dump
  61. mwifiex_pcie_device_dump_work
  62. mwifiex_pcie_card_reset_work
  63. mwifiex_pcie_work
  64. mwifiex_pcie_device_dump
  65. mwifiex_pcie_card_reset
  66. mwifiex_pcie_alloc_buffers
  67. mwifiex_pcie_free_buffers
  68. mwifiex_init_pcie
  69. mwifiex_cleanup_pcie
  70. mwifiex_pcie_request_irq
  71. mwifiex_pcie_get_fw_name
  72. mwifiex_register_dev
  73. mwifiex_unregister_dev
  74. mwifiex_pcie_up_dev
  75. mwifiex_pcie_down_dev

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

/* [<][>][^][v][top][bottom][index][help] */