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 23/31] technisat-usb2: use DMA buffers for I2C transfers
    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.

    On this driver, most of the transfers are OK, but the I2C
    one was using stack.

    Reviewed-By: Patrick Boettcher <patrick.boettcher@posteo.de>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
    ---
    drivers/media/usb/dvb-usb/technisat-usb2.c | 16 +++++++++++-----
    1 file changed, 11 insertions(+), 5 deletions(-)

    diff --git a/drivers/media/usb/dvb-usb/technisat-usb2.c b/drivers/media/usb/dvb-usb/technisat-usb2.c
    index d9f3262bf071..4706628a3ed5 100644
    --- a/drivers/media/usb/dvb-usb/technisat-usb2.c
    +++ b/drivers/media/usb/dvb-usb/technisat-usb2.c
    @@ -89,9 +89,13 @@ struct technisat_usb2_state {
    static int technisat_usb2_i2c_access(struct usb_device *udev,
    u8 device_addr, u8 *tx, u8 txlen, u8 *rx, u8 rxlen)
    {
    - u8 b[64];
    + u8 *b;
    int ret, actual_length;

    + b = kmalloc(64, GFP_KERNEL);
    + if (!b)
    + return -ENOMEM;
    +
    deb_i2c("i2c-access: %02x, tx: ", device_addr);
    debug_dump(tx, txlen, deb_i2c);
    deb_i2c(" ");
    @@ -123,7 +127,7 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,

    if (ret < 0) {
    err("i2c-error: out failed %02x = %d", device_addr, ret);
    - return -ENODEV;
    + goto err;
    }

    ret = usb_bulk_msg(udev,
    @@ -131,7 +135,7 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,
    b, 64, &actual_length, 1000);
    if (ret < 0) {
    err("i2c-error: in failed %02x = %d", device_addr, ret);
    - return -ENODEV;
    + goto err;
    }

    if (b[0] != I2C_STATUS_OK) {
    @@ -140,7 +144,7 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,
    if (!(b[0] == I2C_STATUS_NAK &&
    device_addr == 0x60
    /* && device_is_technisat_usb2 */))
    - return -ENODEV;
    + goto err;
    }

    deb_i2c("status: %d, ", b[0]);
    @@ -154,7 +158,9 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,

    deb_i2c("\n");

    - return 0;
    +err:
    + kfree(b);
    + return ret;
    }

    static int technisat_usb2_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
    --
    2.7.4

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