Commit 45ae4a52 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Mauro Carvalho Chehab

[media] cpia2_usb: don't use stack for DMA

The USB control messages require DMA to work. We cannot pass
a stack-allocated buffer, as it is not warranted that the
stack would be into a DMA enabled area.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 3dadf91c
...@@ -545,18 +545,30 @@ static void free_sbufs(struct camera_data *cam) ...@@ -545,18 +545,30 @@ static void free_sbufs(struct camera_data *cam)
static int write_packet(struct usb_device *udev, static int write_packet(struct usb_device *udev,
u8 request, u8 * registers, u16 start, size_t size) u8 request, u8 * registers, u16 start, size_t size)
{ {
unsigned char *buf;
int ret;
if (!registers || size <= 0) if (!registers || size <= 0)
return -EINVAL; return -EINVAL;
return usb_control_msg(udev, buf = kmalloc(size, GFP_KERNEL);
if (!buf)
return -ENOMEM;
memcpy(buf, registers, size);
ret = usb_control_msg(udev,
usb_sndctrlpipe(udev, 0), usb_sndctrlpipe(udev, 0),
request, request,
USB_TYPE_VENDOR | USB_RECIP_DEVICE, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
start, /* value */ start, /* value */
0, /* index */ 0, /* index */
registers, /* buffer */ buf, /* buffer */
size, size,
HZ); HZ);
kfree(buf);
return ret;
} }
/**************************************************************************** /****************************************************************************
...@@ -567,18 +579,32 @@ static int write_packet(struct usb_device *udev, ...@@ -567,18 +579,32 @@ static int write_packet(struct usb_device *udev,
static int read_packet(struct usb_device *udev, static int read_packet(struct usb_device *udev,
u8 request, u8 * registers, u16 start, size_t size) u8 request, u8 * registers, u16 start, size_t size)
{ {
unsigned char *buf;
int ret;
if (!registers || size <= 0) if (!registers || size <= 0)
return -EINVAL; return -EINVAL;
return usb_control_msg(udev, buf = kmalloc(size, GFP_KERNEL);
if (!buf)
return -ENOMEM;
ret = usb_control_msg(udev,
usb_rcvctrlpipe(udev, 0), usb_rcvctrlpipe(udev, 0),
request, request,
USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_DEVICE, USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_DEVICE,
start, /* value */ start, /* value */
0, /* index */ 0, /* index */
registers, /* buffer */ buf, /* buffer */
size, size,
HZ); HZ);
if (ret >= 0)
memcpy(registers, buf, size);
kfree(buf);
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