driver: spi: spidev: Variable length support
Update the transfer length based on kernel space buffer,
not from the userspace buffer. This is required for
variable length support. Without this change, It will
send wrong transferred data and count to userspace.
Bug 200084260
Change-Id: I56a9b87ae93d772e0864a18728e117c84d56863a
Signed-off-by: Sanket Parmar <sparmer@nvidia.com>
Reviewed-on: http://git-master/r/753167
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Amlan Kundu <akundu@nvidia.com>
Reviewed-by: Sumeet Gupta <sumeetg@nvidia.com>
(cherry picked from commit f6f7d9b53758553c476961d0cf156fe21667a666)
Signed-off-by: Amlan Kundu <akundu@nvidia.com>
Reviewed-on: http://git-master/r/1241459
GVS: Gerrit_Virtual_Submit
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
index d0e7dfc..9a67a56 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -302,16 +302,23 @@
/* copy any rx data out of bounce buffer */
rx_buf = spidev->rx_buffer;
- for (n = n_xfers, u_tmp = u_xfers; n; n--, u_tmp++) {
+ total = 0;
+ u_tmp = u_xfers;
+ k_tmp = k_xfers;
+ for (n = n_xfers; n; n--) {
if (u_tmp->rx_buf) {
if (__copy_to_user((u8 __user *)
(uintptr_t) u_tmp->rx_buf, rx_buf,
- u_tmp->len)) {
+ k_tmp->len)) {
status = -EFAULT;
goto done;
}
- rx_buf += u_tmp->len;
+ u_tmp->len = k_tmp->len;
}
+ rx_buf += k_tmp->len;
+ total += k_tmp->len;
+ u_tmp++;
+ k_tmp++;
}
status = total;