diff options
author | Florian Mickler <florian@mickler.org> | 2011-03-20 17:50:52 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-05-20 08:28:19 -0400 |
commit | 945b876600054081911d31bdb4f47b172c8a48ae (patch) | |
tree | c846af5263d26033818c0ff49435d7e44f88b23f /drivers/media/dvb/dvb-usb/lmedm04.c | |
parent | 2a596f84e2e368a3167947b32c8ea51125f87c58 (diff) |
[media] lmedm04: get rid of on-stack dma buffers
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
Tested-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Florian Mickler <florian@mickler.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/dvb-usb/lmedm04.c')
-rw-r--r-- | drivers/media/dvb/dvb-usb/lmedm04.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/media/dvb/dvb-usb/lmedm04.c b/drivers/media/dvb/dvb-usb/lmedm04.c index b47ec3055ff7..a4457e4c1246 100644 --- a/drivers/media/dvb/dvb-usb/lmedm04.c +++ b/drivers/media/dvb/dvb-usb/lmedm04.c | |||
@@ -329,13 +329,19 @@ static int lme2510_int_read(struct dvb_usb_adapter *adap) | |||
329 | static int lme2510_return_status(struct usb_device *dev) | 329 | static int lme2510_return_status(struct usb_device *dev) |
330 | { | 330 | { |
331 | int ret = 0; | 331 | int ret = 0; |
332 | u8 data[10] = {0}; | 332 | u8 *data; |
333 | |||
334 | data = kzalloc(10, GFP_KERNEL); | ||
335 | if (!data) | ||
336 | return -ENOMEM; | ||
333 | 337 | ||
334 | ret |= usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), | 338 | ret |= usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), |
335 | 0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200); | 339 | 0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200); |
336 | info("Firmware Status: %x (%x)", ret , data[2]); | 340 | info("Firmware Status: %x (%x)", ret , data[2]); |
337 | 341 | ||
338 | return (ret < 0) ? -ENODEV : data[2]; | 342 | ret = (ret < 0) ? -ENODEV : data[2]; |
343 | kfree(data); | ||
344 | return ret; | ||
339 | } | 345 | } |
340 | 346 | ||
341 | static int lme2510_msg(struct dvb_usb_device *d, | 347 | static int lme2510_msg(struct dvb_usb_device *d, |
@@ -655,7 +661,7 @@ static int lme2510_download_firmware(struct usb_device *dev, | |||
655 | const struct firmware *fw) | 661 | const struct firmware *fw) |
656 | { | 662 | { |
657 | int ret = 0; | 663 | int ret = 0; |
658 | u8 data[512] = {0}; | 664 | u8 *data; |
659 | u16 j, wlen, len_in, start, end; | 665 | u16 j, wlen, len_in, start, end; |
660 | u8 packet_size, dlen, i; | 666 | u8 packet_size, dlen, i; |
661 | u8 *fw_data; | 667 | u8 *fw_data; |
@@ -663,6 +669,11 @@ static int lme2510_download_firmware(struct usb_device *dev, | |||
663 | packet_size = 0x31; | 669 | packet_size = 0x31; |
664 | len_in = 1; | 670 | len_in = 1; |
665 | 671 | ||
672 | data = kzalloc(512, GFP_KERNEL); | ||
673 | if (!data) { | ||
674 | info("FRM Could not start Firmware Download (Buffer allocation failed)"); | ||
675 | return -ENOMEM; | ||
676 | } | ||
666 | 677 | ||
667 | info("FRM Starting Firmware Download"); | 678 | info("FRM Starting Firmware Download"); |
668 | 679 | ||
@@ -706,7 +717,7 @@ static int lme2510_download_firmware(struct usb_device *dev, | |||
706 | else | 717 | else |
707 | info("FRM Firmware Download Completed - Resetting Device"); | 718 | info("FRM Firmware Download Completed - Resetting Device"); |
708 | 719 | ||
709 | 720 | kfree(data); | |
710 | return (ret < 0) ? -ENODEV : 0; | 721 | return (ret < 0) ? -ENODEV : 0; |
711 | } | 722 | } |
712 | 723 | ||