[media] au6610: get rid of on-stack dma buffer

usb_control_msg initiates (and waits for completion of) a dma transfer using
the supplied buffer. That buffer thus has to be seperately allocated on
the heap.

In lib/dma_debug.c the function check_for_stack even warns about it:
	WARNING: at lib/dma-debug.c:866 check_for_stack

Signed-off-by: Florian Mickler <florian@mickler.org>
Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>
Tested-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Florian Mickler 2011-03-20 18:50:50 -03:00 committed by Mauro Carvalho Chehab
parent 029461dbea
commit 2a596f84e2
1 changed files with 16 additions and 6 deletions

View File

@ -33,8 +33,16 @@ static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr,
{ {
int ret; int ret;
u16 index; u16 index;
u8 usb_buf[6]; /* enough for all known requests, u8 *usb_buf;
read returns 5 and write 6 bytes */
/*
* allocate enough for all known requests,
* read returns 5 and write 6 bytes
*/
usb_buf = kmalloc(6, GFP_KERNEL);
if (!usb_buf)
return -ENOMEM;
switch (wlen) { switch (wlen) {
case 1: case 1:
index = wbuf[0] << 8; index = wbuf[0] << 8;
@ -45,14 +53,15 @@ static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr,
break; break;
default: default:
warn("wlen = %x, aborting.", wlen); warn("wlen = %x, aborting.", wlen);
return -EINVAL; ret = -EINVAL;
goto error;
} }
ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), operation, ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), operation,
USB_TYPE_VENDOR|USB_DIR_IN, addr << 1, index, USB_TYPE_VENDOR|USB_DIR_IN, addr << 1, index,
usb_buf, sizeof(usb_buf), AU6610_USB_TIMEOUT); usb_buf, 6, AU6610_USB_TIMEOUT);
if (ret < 0) if (ret < 0)
return ret; goto error;
switch (operation) { switch (operation) {
case AU6610_REQ_I2C_READ: case AU6610_REQ_I2C_READ:
@ -60,7 +69,8 @@ static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr,
/* requested value is always 5th byte in buffer */ /* requested value is always 5th byte in buffer */
rbuf[0] = usb_buf[4]; rbuf[0] = usb_buf[4];
} }
error:
kfree(usb_buf);
return ret; return ret;
} }