lkml.org 
[lkml]   [2017]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 299/370] [media] siano: make it work again with CONFIG_VMAP_STACK
    3.16.42-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mauro Carvalho Chehab <mchehab@s-opensource.com>

    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

    Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
    [bwh: Backported to 3.16: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/media/usb/siano/smsusb.c | 18 +++++++++++++-----
    1 file changed, 13 insertions(+), 5 deletions(-)

    --- a/drivers/media/usb/siano/smsusb.c
    +++ b/drivers/media/usb/siano/smsusb.c
    @@ -206,22 +206,30 @@ static int smsusb_start_streaming(struct
    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) {
    sms_debug("Device not active yet");
    return -ENOENT;
    }

    + phdr = kmalloc(size, GFP_KERNEL);
    + if (!phdr)
    + return -ENOMEM;
    + memcpy(phdr, buffer, size);
    +
    sms_debug("sending %s(%d) size: %d",
    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[] = {
    \
     
     \ /
      Last update: 2017-03-10 14:32    [W:2.584 / U:23.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site