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)
|
||||
{
|
||||
char data[8];
|
||||
char *data;
|
||||
int size;
|
||||
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),
|
||||
ATP_GEYSER_MODE_READ_REQUEST_ID,
|
||||
USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||
ATP_GEYSER_MODE_REQUEST_VALUE,
|
||||
ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
|
||||
ATP_GEYSER_MODE_REQUEST_INDEX, data, 8, 5000);
|
||||
|
||||
if (size != 8) {
|
||||
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]);
|
||||
|
||||
err("Failed to read mode from device.");
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
/* Apply the mode switch */
|
||||
|
@ -281,7 +289,7 @@ static int atp_geyser_init(struct usb_device *udev)
|
|||
ATP_GEYSER_MODE_WRITE_REQUEST_ID,
|
||||
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||
ATP_GEYSER_MODE_REQUEST_VALUE,
|
||||
ATP_GEYSER_MODE_REQUEST_INDEX, &data, 8, 5000);
|
||||
ATP_GEYSER_MODE_REQUEST_INDEX, data, 8, 5000);
|
||||
|
||||
if (size != 8) {
|
||||
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]);
|
||||
|
||||
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