diff options
author | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2016-10-10 07:28:26 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-10-14 11:52:27 -0400 |
commit | 45ae4a5220a43ae79dacb69054a2c7928dd91c94 (patch) | |
tree | 88bdc0d3765e5f795c4362a8686b8cd3e8bb163c | |
parent | 3dadf91cb830ac3a6992e539d82ec604fffe8671 (diff) |
[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: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
-rw-r--r-- | drivers/media/usb/cpia2/cpia2_usb.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/drivers/media/usb/cpia2/cpia2_usb.c b/drivers/media/usb/cpia2/cpia2_usb.c index 13620cdf0599..e9100a235831 100644 --- a/drivers/media/usb/cpia2/cpia2_usb.c +++ b/drivers/media/usb/cpia2/cpia2_usb.c | |||
@@ -545,18 +545,30 @@ static void free_sbufs(struct camera_data *cam) | |||
545 | static int write_packet(struct usb_device *udev, | 545 | static int write_packet(struct usb_device *udev, |
546 | u8 request, u8 * registers, u16 start, size_t size) | 546 | u8 request, u8 * registers, u16 start, size_t size) |
547 | { | 547 | { |
548 | unsigned char *buf; | ||
549 | int ret; | ||
550 | |||
548 | if (!registers || size <= 0) | 551 | if (!registers || size <= 0) |
549 | return -EINVAL; | 552 | return -EINVAL; |
550 | 553 | ||
551 | return usb_control_msg(udev, | 554 | buf = kmalloc(size, GFP_KERNEL); |
555 | if (!buf) | ||
556 | return -ENOMEM; | ||
557 | |||
558 | memcpy(buf, registers, size); | ||
559 | |||
560 | ret = usb_control_msg(udev, | ||
552 | usb_sndctrlpipe(udev, 0), | 561 | usb_sndctrlpipe(udev, 0), |
553 | request, | 562 | request, |
554 | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 563 | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
555 | start, /* value */ | 564 | start, /* value */ |
556 | 0, /* index */ | 565 | 0, /* index */ |
557 | registers, /* buffer */ | 566 | buf, /* buffer */ |
558 | size, | 567 | size, |
559 | HZ); | 568 | HZ); |
569 | |||
570 | kfree(buf); | ||
571 | return ret; | ||
560 | } | 572 | } |
561 | 573 | ||
562 | /**************************************************************************** | 574 | /**************************************************************************** |
@@ -567,18 +579,32 @@ static int write_packet(struct usb_device *udev, | |||
567 | static int read_packet(struct usb_device *udev, | 579 | static int read_packet(struct usb_device *udev, |
568 | u8 request, u8 * registers, u16 start, size_t size) | 580 | u8 request, u8 * registers, u16 start, size_t size) |
569 | { | 581 | { |
582 | unsigned char *buf; | ||
583 | int ret; | ||
584 | |||
570 | if (!registers || size <= 0) | 585 | if (!registers || size <= 0) |
571 | return -EINVAL; | 586 | return -EINVAL; |
572 | 587 | ||
573 | return usb_control_msg(udev, | 588 | buf = kmalloc(size, GFP_KERNEL); |
589 | if (!buf) | ||
590 | return -ENOMEM; | ||
591 | |||
592 | ret = usb_control_msg(udev, | ||
574 | usb_rcvctrlpipe(udev, 0), | 593 | usb_rcvctrlpipe(udev, 0), |
575 | request, | 594 | request, |
576 | USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_DEVICE, | 595 | USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_DEVICE, |
577 | start, /* value */ | 596 | start, /* value */ |
578 | 0, /* index */ | 597 | 0, /* index */ |
579 | registers, /* buffer */ | 598 | buf, /* buffer */ |
580 | size, | 599 | size, |
581 | HZ); | 600 | HZ); |
601 | |||
602 | if (ret >= 0) | ||
603 | memcpy(registers, buf, size); | ||
604 | |||
605 | kfree(buf); | ||
606 | |||
607 | return ret; | ||
582 | } | 608 | } |
583 | 609 | ||
584 | /****************************************************************************** | 610 | /****************************************************************************** |