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. Signed-off-by: Ahmad Masri <amasri@codeaurora.org> Signed-off-by: Maya Erez <merez@codeaurora.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
ac0e541ab2
commit
84ec040d0f
@ -664,10 +664,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) ||
|
||||
@ -685,7 +685,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;
|
||||
|
||||
@ -696,9 +701,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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user