diff options
author | Florian Mickler <florian@mickler.org> | 2011-03-20 17:50:50 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-05-20 08:28:18 -0400 |
commit | 2a596f84e2e368a3167947b32c8ea51125f87c58 (patch) | |
tree | 283fd9095e0ecffbf1d8e9cbdbdc325191032655 /drivers/media/dvb | |
parent | 029461dbea04f4b6943bd24b6ae7906f28593a2f (diff) |
[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>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r-- | drivers/media/dvb/dvb-usb/au6610.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/media/dvb/dvb-usb/au6610.c b/drivers/media/dvb/dvb-usb/au6610.c index eb34cc3894e0..2351077ff2b3 100644 --- a/drivers/media/dvb/dvb-usb/au6610.c +++ b/drivers/media/dvb/dvb-usb/au6610.c | |||
@@ -33,8 +33,16 @@ static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr, | |||
33 | { | 33 | { |
34 | int ret; | 34 | int ret; |
35 | u16 index; | 35 | u16 index; |
36 | u8 usb_buf[6]; /* enough for all known requests, | 36 | u8 *usb_buf; |
37 | read returns 5 and write 6 bytes */ | 37 | |
38 | /* | ||
39 | * allocate enough for all known requests, | ||
40 | * read returns 5 and write 6 bytes | ||
41 | */ | ||
42 | usb_buf = kmalloc(6, GFP_KERNEL); | ||
43 | if (!usb_buf) | ||
44 | return -ENOMEM; | ||
45 | |||
38 | switch (wlen) { | 46 | switch (wlen) { |
39 | case 1: | 47 | case 1: |
40 | index = wbuf[0] << 8; | 48 | index = wbuf[0] << 8; |
@@ -45,14 +53,15 @@ static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr, | |||
45 | break; | 53 | break; |
46 | default: | 54 | default: |
47 | warn("wlen = %x, aborting.", wlen); | 55 | warn("wlen = %x, aborting.", wlen); |
48 | return -EINVAL; | 56 | ret = -EINVAL; |
57 | goto error; | ||
49 | } | 58 | } |
50 | 59 | ||
51 | ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), operation, | 60 | ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), operation, |
52 | USB_TYPE_VENDOR|USB_DIR_IN, addr << 1, index, | 61 | USB_TYPE_VENDOR|USB_DIR_IN, addr << 1, index, |
53 | usb_buf, sizeof(usb_buf), AU6610_USB_TIMEOUT); | 62 | usb_buf, 6, AU6610_USB_TIMEOUT); |
54 | if (ret < 0) | 63 | if (ret < 0) |
55 | return ret; | 64 | goto error; |
56 | 65 | ||
57 | switch (operation) { | 66 | switch (operation) { |
58 | case AU6610_REQ_I2C_READ: | 67 | case AU6610_REQ_I2C_READ: |
@@ -60,7 +69,8 @@ static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr, | |||
60 | /* requested value is always 5th byte in buffer */ | 69 | /* requested value is always 5th byte in buffer */ |
61 | rbuf[0] = usb_buf[4]; | 70 | rbuf[0] = usb_buf[4]; |
62 | } | 71 | } |
63 | 72 | error: | |
73 | kfree(usb_buf); | ||
64 | return ret; | 74 | return ret; |
65 | } | 75 | } |
66 | 76 | ||