| From 067eba800ef14951d6f1d49efd171e24b3bbfff6 Mon Sep 17 00:00:00 2001 |
| From: Mauro Carvalho Chehab <mchehab@s-opensource.com> |
| Date: Tue, 14 Feb 2017 17:47:57 -0200 |
| Subject: [PATCH] [media] siano: make it work again with CONFIG_VMAP_STACK |
| |
| commit f9c85ee67164b37f9296eab3b754e543e4e96a1c upstream. |
| |
| Reported as a Kaffeine bug: |
| https://bugs.kde.org/show_bug.cgi?id=375811 |
| |
| 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. |
| |
| On Kernel 4.9, the default is to not accept DMA on stack anymore |
| on x86 architecture. On other architectures, this has been a |
| requirement since Kernel 2.2. So, after this patch, this driver |
| should likely work fine on all archs. |
| |
| Tested with USB ID 2040:5510: Hauppauge Windham |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/media/usb/siano/smsusb.c b/drivers/media/usb/siano/smsusb.c |
| index c2e25876e93b..18b41b9dc2e4 100644 |
| --- a/drivers/media/usb/siano/smsusb.c |
| +++ b/drivers/media/usb/siano/smsusb.c |
| @@ -218,22 +218,30 @@ static int smsusb_start_streaming(struct smsusb_device_t *dev) |
| static int smsusb_sendrequest(void *context, void *buffer, size_t size) |
| { |
| struct smsusb_device_t *dev = (struct smsusb_device_t *) context; |
| - struct sms_msg_hdr *phdr = (struct sms_msg_hdr *) buffer; |
| - int dummy; |
| + struct sms_msg_hdr *phdr; |
| + int dummy, ret; |
| |
| if (dev->state != SMSUSB_ACTIVE) { |
| pr_debug("Device not active yet\n"); |
| return -ENOENT; |
| } |
| |
| + phdr = kmalloc(size, GFP_KERNEL); |
| + if (!phdr) |
| + return -ENOMEM; |
| + memcpy(phdr, buffer, size); |
| + |
| pr_debug("sending %s(%d) size: %d\n", |
| smscore_translate_msg(phdr->msg_type), phdr->msg_type, |
| phdr->msg_length); |
| |
| smsendian_handle_tx_message((struct sms_msg_data *) phdr); |
| - smsendian_handle_message_header((struct sms_msg_hdr *)buffer); |
| - return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2), |
| - buffer, size, &dummy, 1000); |
| + smsendian_handle_message_header((struct sms_msg_hdr *)phdr); |
| + ret = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2), |
| + phdr, size, &dummy, 1000); |
| + |
| + kfree(phdr); |
| + return ret; |
| } |
| |
| static char *smsusb1_fw_lkup[] = { |
| -- |
| 2.12.0 |
| |