wil6210: take mem_lock for writing in crash dump collection
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>
This commit is contained in:
parent
d3214d4280
commit
c715b38473
drivers/net/wireless/ath/wil6210
|
@ -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 wil_fw_copy_crash_dump(struct wil6210_priv *wil, void *dest, u32 size)
|
||||||
{
|
{
|
||||||
int i, rc;
|
int i;
|
||||||
const struct fw_map *map;
|
const struct fw_map *map;
|
||||||
void *data;
|
void *data;
|
||||||
u32 host_min, dump_size, offset, len;
|
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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = wil_mem_access_lock(wil);
|
down_write(&wil->mem_lock);
|
||||||
if (rc)
|
|
||||||
return rc;
|
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 */
|
/* copy to crash dump area */
|
||||||
for (i = 0; i < ARRAY_SIZE(fw_mapping); i++) {
|
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),
|
wil_memcpy_fromio_32((void * __force)(dest + offset),
|
||||||
(const void __iomem * __force)data, len);
|
(const void __iomem * __force)data, len);
|
||||||
}
|
}
|
||||||
wil_mem_access_unlock(wil);
|
|
||||||
|
up_write(&wil->mem_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue