return ret;
 }
+EXPORT_SYMBOL_GPL(mwifiex_send_cmd);
 
 /*
  * This function queues a command to the command pending queue.
 
        return ret;
 }
 
-/*
- * Proc device dump read handler.
- *
- * This function is called when the 'device_dump' file is opened for
- * reading.
- * This function dumps driver information and firmware memory segments
- * (ex. DTCM, ITCM, SQRAM etc.) for
- * debugging.
- */
-static ssize_t
-mwifiex_device_dump_read(struct file *file, char __user *ubuf,
-                        size_t count, loff_t *ppos)
-{
-       struct mwifiex_private *priv = file->private_data;
-
-       /* For command timeouts, USB firmware will automatically emit
-        * firmware dump events, so we don't implement device_dump().
-        * For user-initiated dumps, we trigger it ourselves.
-        */
-       if (priv->adapter->iface_type == MWIFIEX_USB)
-               mwifiex_send_cmd(priv, HostCmd_CMD_FW_DUMP_EVENT,
-                                HostCmd_ACT_GEN_SET, 0, NULL, true);
-       else
-               priv->adapter->if_ops.device_dump(priv->adapter);
-
-       return 0;
-}
-
 /*
  * Proc getlog file read handler.
  *
 MWIFIEX_DFS_FILE_READ_OPS(info);
 MWIFIEX_DFS_FILE_READ_OPS(debug);
 MWIFIEX_DFS_FILE_READ_OPS(getlog);
-MWIFIEX_DFS_FILE_READ_OPS(device_dump);
 MWIFIEX_DFS_FILE_OPS(regrdwr);
 MWIFIEX_DFS_FILE_OPS(rdeeprom);
 MWIFIEX_DFS_FILE_OPS(memrw);
        MWIFIEX_DFS_ADD_FILE(getlog);
        MWIFIEX_DFS_ADD_FILE(regrdwr);
        MWIFIEX_DFS_ADD_FILE(rdeeprom);
-       MWIFIEX_DFS_ADD_FILE(device_dump);
+
        MWIFIEX_DFS_ADD_FILE(memrw);
        MWIFIEX_DFS_ADD_FILE(hscfg);
        MWIFIEX_DFS_ADD_FILE(histogram);
 
        return;
 }
 
+static void mwifiex_pcie_coredump(struct device *dev)
+{
+       struct pci_dev *pdev;
+       struct pcie_service_card *card;
+
+       pdev = container_of(dev, struct pci_dev, dev);
+       card = pci_get_drvdata(pdev);
+
+       if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
+                             &card->work_flags))
+               schedule_work(&card->work);
+}
+
 static const struct pci_device_id mwifiex_ids[] = {
        {
                PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
        .id_table = mwifiex_ids,
        .probe    = mwifiex_pcie_probe,
        .remove   = mwifiex_pcie_remove,
-#ifdef CONFIG_PM_SLEEP
        .driver   = {
+               .coredump = mwifiex_pcie_coredump,
+#ifdef CONFIG_PM_SLEEP
                .pm = &mwifiex_pcie_pm_ops,
-       },
 #endif
+       },
        .shutdown = mwifiex_pcie_shutdown,
        .err_handler = &mwifiex_pcie_err_handler,
 };
 
        return ret;
 }
 
+static void mwifiex_sdio_coredump(struct device *dev)
+{
+       struct sdio_func *func = dev_to_sdio_func(dev);
+       struct sdio_mmc_card *card;
+
+       card = sdio_get_drvdata(func);
+       if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
+                             &card->work_flags))
+               schedule_work(&card->work);
+}
+
 /* Device ID for SD8786 */
 #define SDIO_DEVICE_ID_MARVELL_8786   (0x9116)
 /* Device ID for SD8787 */
        .remove = mwifiex_sdio_remove,
        .drv = {
                .owner = THIS_MODULE,
+               .coredump = mwifiex_sdio_coredump,
                .pm = &mwifiex_sdio_pm_ops,
        }
 };
 
        usb_put_dev(interface_to_usbdev(intf));
 }
 
+static void mwifiex_usb_coredump(struct device *dev)
+{
+       struct usb_interface *intf = to_usb_interface(dev);
+       struct usb_card_rec *card = usb_get_intfdata(intf);
+
+       mwifiex_send_cmd(mwifiex_get_priv(card->adapter, MWIFIEX_BSS_ROLE_ANY),
+                        HostCmd_CMD_FW_DUMP_EVENT, HostCmd_ACT_GEN_SET, 0,
+                        NULL, true);
+}
+
 static struct usb_driver mwifiex_usb_driver = {
        .name = "mwifiex_usb",
        .probe = mwifiex_usb_probe,
        .suspend = mwifiex_usb_suspend,
        .resume = mwifiex_usb_resume,
        .soft_unbind = 1,
+       .drvwrap.driver = {
+               .coredump = mwifiex_usb_coredump,
+       },
 };
 
 static int mwifiex_write_data_sync(struct mwifiex_adapter *adapter, u8 *pbuf,