lkml.org 
[lkml]   [2016]   [Oct]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 11/31] digitv: don't do DMA on stack
    Date
    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.

    Reviewed-By: Patrick Boettcher <patrick.boettcher@posteo.de>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
    ---
    drivers/media/usb/dvb-usb/digitv.c | 20 +++++++++++---------
    drivers/media/usb/dvb-usb/digitv.h | 3 +++
    2 files changed, 14 insertions(+), 9 deletions(-)

    diff --git a/drivers/media/usb/dvb-usb/digitv.c b/drivers/media/usb/dvb-usb/digitv.c
    index 63134335c994..09f8c28bd4db 100644
    --- a/drivers/media/usb/dvb-usb/digitv.c
    +++ b/drivers/media/usb/dvb-usb/digitv.c
    @@ -28,20 +28,22 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
    static int digitv_ctrl_msg(struct dvb_usb_device *d,
    u8 cmd, u8 vv, u8 *wbuf, int wlen, u8 *rbuf, int rlen)
    {
    + struct digitv_state *st = d->priv;
    int wo = (rbuf == NULL || rlen == 0); /* write-only */
    - u8 sndbuf[7],rcvbuf[7];
    - memset(sndbuf,0,7); memset(rcvbuf,0,7);

    - sndbuf[0] = cmd;
    - sndbuf[1] = vv;
    - sndbuf[2] = wo ? wlen : rlen;
    + memset(st->sndbuf, 0, 7);
    + memset(st->rcvbuf, 0, 7);
    +
    + st->sndbuf[0] = cmd;
    + st->sndbuf[1] = vv;
    + st->sndbuf[2] = wo ? wlen : rlen;

    if (wo) {
    - memcpy(&sndbuf[3],wbuf,wlen);
    - dvb_usb_generic_write(d,sndbuf,7);
    + memcpy(&st->sndbuf[3], wbuf, wlen);
    + dvb_usb_generic_write(d, st->sndbuf, 7);
    } else {
    - dvb_usb_generic_rw(d,sndbuf,7,rcvbuf,7,10);
    - memcpy(rbuf,&rcvbuf[3],rlen);
    + dvb_usb_generic_rw(d, st->sndbuf, 7, st->rcvbuf, 7, 10);
    + memcpy(rbuf, &st->rcvbuf[3], rlen);
    }
    return 0;
    }
    diff --git a/drivers/media/usb/dvb-usb/digitv.h b/drivers/media/usb/dvb-usb/digitv.h
    index 908c09f4966b..cf104689bdff 100644
    --- a/drivers/media/usb/dvb-usb/digitv.h
    +++ b/drivers/media/usb/dvb-usb/digitv.h
    @@ -6,6 +6,9 @@

    struct digitv_state {
    int is_nxt6000;
    +
    + unsigned char sndbuf[7];
    + unsigned char rcvbuf[7];
    };

    /* protocol (from usblogging and the SDK:
    --
    2.7.4

    \
     
     \ /
      Last update: 2016-10-11 12:17    [W:3.081 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site