From 688818c547266cd84636fad1eeb707148199d03b Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Mon, 6 Apr 2020 14:20:52 -0700 Subject: [PATCH] cnss2: Handle race between register driver and reboot properly Register driver should be skipped if reboot is already in progress. Also firmware boot timer should be stopped if register driver work has been scheduled but gets killed later to avoid timing out because of the reboot. Change-Id: Iae4de860329a82416bfa58967095a4de7b509813 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/pci.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index adacb1cfe523..170a4f1c6bb6 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -2113,6 +2113,10 @@ register_driver: CNSS_DRIVER_EVENT_REGISTER_DRIVER, CNSS_EVENT_SYNC_UNINTERRUPTIBLE, driver_ops); + if (ret == -EINTR) { + cnss_pr_dbg("Register driver work is killed\n"); + del_timer(&plat_priv->fw_boot_timer); + } return ret; } @@ -2168,6 +2172,11 @@ int cnss_pci_register_driver_hdlr(struct cnss_pci_data *pci_priv, int ret = 0; struct cnss_plat_data *plat_priv = pci_priv->plat_priv; + if (test_bit(CNSS_IN_REBOOT, &plat_priv->driver_state)) { + cnss_pr_dbg("Reboot or shutdown is in progress, ignore register driver\n"); + return -EINVAL; + } + set_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state); pci_priv->driver_ops = data;