wil6210: minimize the time that mem_lock is held
authorAlexei Avshalom Lazar <ailizaro@codeaurora.org>
Wed, 18 Dec 2019 18:10:07 +0000 (20:10 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 19 Dec 2019 16:15:44 +0000 (18:15 +0200)
mem_lock is taken for the entire wil_reset().
Optimize this by taking mem_lock just before device is
being reset and release the lock after FW download.

Signed-off-by: Alexei Avshalom Lazar <ailizaro@codeaurora.org>
Signed-off-by: Maya Erez <merez@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/wil6210/main.c

index 06091d8..6d39547 100644 (file)
@@ -1654,6 +1654,8 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
        /* Disable device led before reset*/
        wmi_led_cfg(wil, false);
 
+       down_write(&wil->mem_lock);
+
        /* prevent NAPI from being scheduled and prevent wmi commands */
        mutex_lock(&wil->wmi_mutex);
        if (test_bit(wil_status_suspending, wil->status))
@@ -1702,6 +1704,7 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
 
                if  (wil->secured_boot) {
                        wil_err(wil, "secured boot is not supported\n");
+                       up_write(&wil->mem_lock);
                        return -ENOTSUPP;
                }
 
@@ -1737,6 +1740,8 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
 
        clear_bit(wil_status_resetting, wil->status);
 
+       up_write(&wil->mem_lock);
+
        if (load_fw) {
                wil_unmask_irq(wil);
 
@@ -1786,6 +1791,7 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
        return rc;
 
 out:
+       up_write(&wil->mem_lock);
        clear_bit(wil_status_resetting, wil->status);
        return rc;
 }
@@ -1811,9 +1817,7 @@ int __wil_up(struct wil6210_priv *wil)
 
        WARN_ON(!mutex_is_locked(&wil->mutex));
 
-       down_write(&wil->mem_lock);
        rc = wil_reset(wil, true);
-       up_write(&wil->mem_lock);
        if (rc)
                return rc;
 
@@ -1905,9 +1909,7 @@ int __wil_down(struct wil6210_priv *wil)
        wil_abort_scan_all_vifs(wil, false);
        mutex_unlock(&wil->vif_mutex);
 
-       down_write(&wil->mem_lock);
        rc = wil_reset(wil, false);
-       up_write(&wil->mem_lock);
 
        return rc;
 }