mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
Input: appletouch - fix DMA to/from stack buffer
CONFIG_DMA_API_DEBUG spotted an instance of appletouch using an array on the stack as a DMA buffer for certain hardware. Change it to use a kmalloc()ed buffer instead. Signed-off-by: Bob Copeland <me@bobcopeland.com> Reviewed-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
384318ecd2
commit
0385c5ee3c
1 changed files with 18 additions and 6 deletions
|
@ -255,15 +255,22 @@ MODULE_PARM_DESC(debug, "Activate debugging output");
|
||||||
*/
|
*/
|
||||||
static int atp_geyser_init(struct usb_device *udev)
|
static int atp_geyser_init(struct usb_device *udev)
|
||||||
{
|
{
|
||||||
char data[8];
|
char *data;
|
||||||
int size;
|
int size;
|
||||||
int i;
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
data = kmalloc(8, GFP_KERNEL);
|
||||||
|
if (!data) {
|
||||||
|
err("Out of memory");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
||||||
ATP_GEYSER_MODE_READ_REQUEST_ID,
|
ATP_GEYSER_MODE_READ_REQUEST_ID,
|
||||||
USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||||
ATP_GEYSER_MODE_REQUEST_VALUE,
|
ATP_GEYSER_MODE_REQUEST_VALUE,
|
||||||
ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
|
ATP_GEYSER_MODE_REQUEST_INDEX, data, 8, 5000);
|
||||||
|
|
||||||
if (size != 8) {
|
if (size != 8) {
|
||||||
dprintk("atp_geyser_init: read error\n");
|
dprintk("atp_geyser_init: read error\n");
|
||||||
|
@ -271,7 +278,8 @@ static int atp_geyser_init(struct usb_device *udev)
|
||||||
dprintk("appletouch[%d]: %d\n", i, data[i]);
|
dprintk("appletouch[%d]: %d\n", i, data[i]);
|
||||||
|
|
||||||
err("Failed to read mode from device.");
|
err("Failed to read mode from device.");
|
||||||
return -EIO;
|
ret = -EIO;
|
||||||
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Apply the mode switch */
|
/* Apply the mode switch */
|
||||||
|
@ -281,7 +289,7 @@ static int atp_geyser_init(struct usb_device *udev)
|
||||||
ATP_GEYSER_MODE_WRITE_REQUEST_ID,
|
ATP_GEYSER_MODE_WRITE_REQUEST_ID,
|
||||||
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||||
ATP_GEYSER_MODE_REQUEST_VALUE,
|
ATP_GEYSER_MODE_REQUEST_VALUE,
|
||||||
ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
|
ATP_GEYSER_MODE_REQUEST_INDEX, data, 8, 5000);
|
||||||
|
|
||||||
if (size != 8) {
|
if (size != 8) {
|
||||||
dprintk("atp_geyser_init: write error\n");
|
dprintk("atp_geyser_init: write error\n");
|
||||||
|
@ -289,9 +297,13 @@ static int atp_geyser_init(struct usb_device *udev)
|
||||||
dprintk("appletouch[%d]: %d\n", i, data[i]);
|
dprintk("appletouch[%d]: %d\n", i, data[i]);
|
||||||
|
|
||||||
err("Failed to request geyser raw mode");
|
err("Failed to request geyser raw mode");
|
||||||
return -EIO;
|
ret = -EIO;
|
||||||
|
goto out_free;
|
||||||
}
|
}
|
||||||
return 0;
|
ret = 0;
|
||||||
|
out_free:
|
||||||
|
kfree(data);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue