]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mwifiex: support sysfs initiated device coredump
authorArend Van Spriel <arend.vanspriel@broadcom.com>
Wed, 16 May 2018 12:12:00 +0000 (14:12 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 23 May 2018 15:51:49 +0000 (18:51 +0300)
Since commit 3c47d19ff4dc ("drivers: base: add coredump driver ops")
it is possible to initiate a device coredump from user-space. This
patch adds support for it adding the .coredump() driver callback.
As there is no longer a need to initiate it through debugfs remove
that code.

Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/cmdevt.c
drivers/net/wireless/marvell/mwifiex/debugfs.c
drivers/net/wireless/marvell/mwifiex/pcie.c
drivers/net/wireless/marvell/mwifiex/sdio.c
drivers/net/wireless/marvell/mwifiex/usb.c

index 9cfcdf6bec52c1b24fe67001b77a369a5f7a7ad2..8be1e69657a74993a443fe2870c4ae421d97b0fc 100644 (file)
@@ -674,6 +674,7 @@ int mwifiex_send_cmd(struct mwifiex_private *priv, u16 cmd_no,
 
        return ret;
 }
+EXPORT_SYMBOL_GPL(mwifiex_send_cmd);
 
 /*
  * This function queues a command to the command pending queue.
index db2872daae97c19a375daff62ae938eb64f5dc64..07453932f7038ca76bc089aa04b8ef5f12a8fec8 100644 (file)
@@ -153,34 +153,6 @@ mwifiex_info_read(struct file *file, char __user *ubuf,
        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.
  *
@@ -980,7 +952,6 @@ static const struct file_operations mwifiex_dfs_##name##_fops = {       \
 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);
@@ -1011,7 +982,7 @@ mwifiex_dev_debugfs_init(struct mwifiex_private *priv)
        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);
index 7538543d46fa9612c9f43ca3a5052d239cf7bb25..0c42b7296ddd15d89d58f8e1a0470447f4c1e3d0 100644 (file)
@@ -320,6 +320,19 @@ static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
        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,
@@ -415,11 +428,12 @@ static struct pci_driver __refdata mwifiex_pcie = {
        .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,
 };
index a82880132af409a79e0dd6076843e92ad7987bc7..47d2dcc3f28fb0cb10f6e84ed1aca0a086d5601e 100644 (file)
@@ -466,6 +466,17 @@ static int mwifiex_sdio_suspend(struct device *dev)
        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 */
@@ -515,6 +526,7 @@ static struct sdio_driver mwifiex_sdio = {
        .remove = mwifiex_sdio_remove,
        .drv = {
                .owner = THIS_MODULE,
+               .coredump = mwifiex_sdio_coredump,
                .pm = &mwifiex_sdio_pm_ops,
        }
 };
index 4bc244801636902860e3ee9542af3ceada1a41d6..7aa39878ce496318337dbdb8245af34498df5d44 100644 (file)
@@ -653,6 +653,16 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf)
        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,
@@ -661,6 +671,9 @@ static struct usb_driver mwifiex_usb_driver = {
        .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,