]> www.infradead.org Git - linux-platform-drivers-x86.git/commitdiff
wil6210: take mem_lock for writing in crash dump collection
authorAlexei Avshalom Lazar <ailizaro@codeaurora.org>
Wed, 18 Dec 2019 18:10:10 +0000 (20:10 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 19 Dec 2019 16:15:56 +0000 (18:15 +0200)
On some crash dump cases mem_lock is already taken, error
returns and crash dump copy fails.
In this case wait until mem_lock available instead of failing
the operation.
Also take the mem_lock for writing to prevent other threads from
altering the state of the device while collecting crash dump.

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/wil_crash_dump.c

index 1332eb8c831ff8c3a92719e4a39e024c625d07ca..89c12cb2aaab2b3a576559c271a5604050f70543 100644 (file)
@@ -46,7 +46,7 @@ static int wil_fw_get_crash_dump_bounds(struct wil6210_priv *wil,
 
 int wil_fw_copy_crash_dump(struct wil6210_priv *wil, void *dest, u32 size)
 {
-       int i, rc;
+       int i;
        const struct fw_map *map;
        void *data;
        u32 host_min, dump_size, offset, len;
@@ -62,9 +62,15 @@ int wil_fw_copy_crash_dump(struct wil6210_priv *wil, void *dest, u32 size)
                return -EINVAL;
        }
 
-       rc = wil_mem_access_lock(wil);
-       if (rc)
-               return rc;
+       down_write(&wil->mem_lock);
+
+       if (test_bit(wil_status_suspending, wil->status) ||
+           test_bit(wil_status_suspended, wil->status)) {
+               wil_err(wil,
+                       "suspend/resume in progress. cannot copy crash dump\n");
+               up_write(&wil->mem_lock);
+               return -EBUSY;
+       }
 
        /* copy to crash dump area */
        for (i = 0; i < ARRAY_SIZE(fw_mapping); i++) {
@@ -84,7 +90,8 @@ int wil_fw_copy_crash_dump(struct wil6210_priv *wil, void *dest, u32 size)
                wil_memcpy_fromio_32((void * __force)(dest + offset),
                                     (const void __iomem * __force)data, len);
        }
-       wil_mem_access_unlock(wil);
+
+       up_write(&wil->mem_lock);
 
        return 0;
 }