Commit 0385c5ee authored by Bob Copeland's avatar Bob Copeland Committed by Dmitry Torokhov

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: default avatarBob Copeland <me@bobcopeland.com>
Reviewed-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 384318ec
...@@ -255,15 +255,22 @@ MODULE_PARM_DESC(debug, "Activate debugging output"); ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment