mirror of https://gitee.com/openkylin/linux.git
[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:
parent
029461dbea
commit
2a596f84e2
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue