From: Miao Wang <[email protected]>

When the device is being removeed, the work queue should be canceled to
avoid any pending work to be executed after the device is removed.

Fixes: d952bba3fbb5 ("mfd: ls2kbmc: Add Loongson-2K BMC reset function support")
Signed-off-by: Miao Wang <[email protected]>
---
 drivers/mfd/ls2k-bmc-core.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/mfd/ls2k-bmc-core.c b/drivers/mfd/ls2k-bmc-core.c
index 
a5465c42a77b8b7b81e3ad787d6036679c6ba6df..1466b314fc4e577fe5e31404444648b5b0447ebb
 100644
--- a/drivers/mfd/ls2k-bmc-core.c
+++ b/drivers/mfd/ls2k-bmc-core.c
@@ -375,6 +375,12 @@ static void ls2k_bmc_save_pci_data(struct pci_dev *pdev, 
struct ls2k_bmc_ddata *
        pci_read_config_dword(pdev, PCI_INTERRUPT_LINE, 
&ddata->bmc_pci_data.interrupt_line);
 }
 
+static void ls2k_bmc_cancel_wq(void *data)
+{
+       struct ls2k_bmc_ddata *ddata = data;
+       (void) cancel_work_sync(&ddata->bmc_reset_work);
+}
+
 static int ls2k_bmc_init(struct ls2k_bmc_ddata *ddata)
 {
        struct pci_dev *pdev = to_pci_dev(ddata->dev);
@@ -385,6 +391,10 @@ static int ls2k_bmc_init(struct ls2k_bmc_ddata *ddata)
 
        INIT_WORK(&ddata->bmc_reset_work, ls2k_bmc_events_fn);
 
+       ret = devm_add_action_or_reset(ddata->dev, ls2k_bmc_cancel_wq, ddata);
+       if (ret)
+               return ret;
+
        ret = devm_request_irq(&pdev->dev, pdev->irq, ls2k_bmc_interrupt,
                               IRQF_SHARED | IRQF_TRIGGER_FALLING, "ls2kbmc 
pcie", ddata);
        if (ret) {

-- 
2.49.0




_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer

Reply via email to