97 lines
2.7 KiB
Diff
97 lines
2.7 KiB
Diff
|
commit 82e632009bb7d6b97f8cabe9918c82703f4e5cd2
|
||
|
Author: Josh Boyer <jwboyer@redhat.com>
|
||
|
Date: Tue Aug 2 08:37:53 2011 -0400
|
||
|
|
||
|
This patch changed rts51x_read_mem, rts51x_write_mem, and rts51x_read_status to
|
||
|
allocate temporary buffers with kmalloc. This way stack addresses are not used
|
||
|
for DMA when these functions call rts51x_bulk_transport.
|
||
|
|
||
|
Signed-off-by: Adam Cozzette <acozzette@cs.hmc.edu>
|
||
|
Backported-by: Josh Boyer <jwboyer@redhat.com>
|
||
|
|
||
|
diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c
|
||
|
index d509a4a..69a1bd3 100644
|
||
|
--- a/drivers/usb/storage/realtek_cr.c
|
||
|
+++ b/drivers/usb/storage/realtek_cr.c
|
||
|
@@ -285,6 +285,11 @@ static int rts51x_read_mem(struct us_data *us, u16 addr, u8 *data, u16 len)
|
||
|
{
|
||
|
int retval;
|
||
|
u8 cmnd[12] = {0};
|
||
|
+ u8 *buf;
|
||
|
+
|
||
|
+ buf = kmalloc(len, GFP_NOIO);
|
||
|
+ if (buf == NULL)
|
||
|
+ return USB_STOR_TRANSPORT_ERROR;
|
||
|
|
||
|
US_DEBUGP("%s, addr = 0x%x, len = %d\n", __func__, addr, len);
|
||
|
|
||
|
@@ -296,10 +301,14 @@ static int rts51x_read_mem(struct us_data *us, u16 addr, u8 *data, u16 len)
|
||
|
cmnd[5] = (u8)len;
|
||
|
|
||
|
retval = rts51x_bulk_transport(us, 0, cmnd, 12,
|
||
|
- data, len, DMA_FROM_DEVICE, NULL);
|
||
|
- if (retval != USB_STOR_TRANSPORT_GOOD)
|
||
|
+ buf, len, DMA_FROM_DEVICE, NULL);
|
||
|
+ if (retval != USB_STOR_TRANSPORT_GOOD) {
|
||
|
+ kfree(buf);
|
||
|
return -EIO;
|
||
|
+ }
|
||
|
|
||
|
+ memcpy(data, buf, len);
|
||
|
+ kfree(buf);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@@ -307,6 +316,12 @@ static int rts51x_write_mem(struct us_data *us, u16 addr, u8 *data, u16 len)
|
||
|
{
|
||
|
int retval;
|
||
|
u8 cmnd[12] = {0};
|
||
|
+ u8 *buf;
|
||
|
+
|
||
|
+ buf = kmalloc(len, GFP_NOIO);
|
||
|
+ if (buf == NULL)
|
||
|
+ return USB_STOR_TRANSPORT_ERROR;
|
||
|
+ memcpy(buf, data, len);
|
||
|
|
||
|
US_DEBUGP("%s, addr = 0x%x, len = %d\n", __func__, addr, len);
|
||
|
|
||
|
@@ -318,7 +333,8 @@ static int rts51x_write_mem(struct us_data *us, u16 addr, u8 *data, u16 len)
|
||
|
cmnd[5] = (u8)len;
|
||
|
|
||
|
retval = rts51x_bulk_transport(us, 0, cmnd, 12,
|
||
|
- data, len, DMA_TO_DEVICE, NULL);
|
||
|
+ buf, len, DMA_TO_DEVICE, NULL);
|
||
|
+ kfree(buf);
|
||
|
if (retval != USB_STOR_TRANSPORT_GOOD)
|
||
|
return -EIO;
|
||
|
|
||
|
@@ -330,6 +346,11 @@ static int rts51x_read_status(struct us_data *us,
|
||
|
{
|
||
|
int retval;
|
||
|
u8 cmnd[12] = {0};
|
||
|
+ u8 *buf;
|
||
|
+
|
||
|
+ buf = kmalloc(len, GFP_NOIO);
|
||
|
+ if (buf == NULL)
|
||
|
+ return USB_STOR_TRANSPORT_ERROR;
|
||
|
|
||
|
US_DEBUGP("%s, lun = %d\n", __func__, lun);
|
||
|
|
||
|
@@ -337,10 +358,14 @@ static int rts51x_read_status(struct us_data *us,
|
||
|
cmnd[1] = 0x09;
|
||
|
|
||
|
retval = rts51x_bulk_transport(us, lun, cmnd, 12,
|
||
|
- status, len, DMA_FROM_DEVICE, actlen);
|
||
|
- if (retval != USB_STOR_TRANSPORT_GOOD)
|
||
|
+ buf, len, DMA_FROM_DEVICE, actlen);
|
||
|
+ if (retval != USB_STOR_TRANSPORT_GOOD) {
|
||
|
+ kfree(buf);
|
||
|
return -EIO;
|
||
|
+ }
|
||
|
|
||
|
+ memcpy(status, buf, len);
|
||
|
+ kfree(buf);
|
||
|
return 0;
|
||
|
}
|
||
|
|