Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 544ffd37 authored by Alexei Avshalom Lazar's avatar Alexei Avshalom Lazar
Browse files

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.

Change-Id: I2ae74fba77e39161e33a7c5302916d1c9254fa05
Signed-off-by: default avatarAlexei Avshalom Lazar <ailizaro@codeaurora.org>
parent 28f9be0b
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -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;
}