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

Commit 5c667d93 authored by Ahmad Masri's avatar Ahmad Masri Committed by Lior David
Browse files

wil6210: fix debugfs memory access alignment



All wil6210 device memory access should be 4 bytes aligned. In io
blob wil6210 did not force alignment for read function, this caused
alignment fault on some platforms.
Fixing that by accessing all 4 lower bytes and return to host the
requested data.

Change-Id: I1d87c9025accae908b3260d1a4d55492abe5887c
Signed-off-by: default avatarAhmad Masri <amasri@codeaurora.org>
Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Git-commit: 84ec040d0fb25197584d28a0dedc355503cd19b9
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git


Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
Signed-off-by: default avatarLior David <liord@codeaurora.org>
parent d82ea6f2
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -651,10 +651,10 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
	enum { max_count = 4096 };
	struct wil_blob_wrapper *wil_blob = file->private_data;
	struct wil6210_priv *wil = wil_blob->wil;
	loff_t pos = *ppos;
	loff_t aligned_pos, pos = *ppos;
	size_t available = wil_blob->blob.size;
	void *buf;
	size_t ret;
	size_t unaligned_bytes, aligned_count, ret;
	int rc;

	if (test_bit(wil_status_suspending, wil_blob->wil->status) ||
@@ -672,7 +672,12 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
	if (count > max_count)
		count = max_count;

	buf = kmalloc(count, GFP_KERNEL);
	/* set pos to 4 bytes aligned */
	unaligned_bytes = pos % 4;
	aligned_pos = pos - unaligned_bytes;
	aligned_count = count + unaligned_bytes;

	buf = kmalloc(aligned_count, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

@@ -683,9 +688,9 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
	}

	wil_memcpy_fromio_32(buf, (const void __iomem *)
			     wil_blob->blob.data + pos, count);
			     wil_blob->blob.data + aligned_pos, aligned_count);

	ret = copy_to_user(user_buf, buf, count);
	ret = copy_to_user(user_buf, buf + unaligned_bytes, count);

	wil_pm_runtime_put(wil);