lkml.org 
[lkml]   [2022]   [Apr]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 212/219] i2c: pasemi: Wait for write xfers to finish
    Date
    From: Martin Povišer <povik+lin@cutebit.org>

    commit bd8963e602c77adc76dbbbfc3417c3cf14fed76b upstream.

    Wait for completion of write transfers before returning from the driver.
    At first sight it may seem advantageous to leave write transfers queued
    for the controller to carry out on its own time, but there's a couple of
    issues with it:

    * Driver doesn't check for FIFO space.

    * The queued writes can complete while the driver is in its I2C read
    transfer path which means it will get confused by the raising of
    XEN (the 'transaction ended' signal). This can cause a spurious
    ENODATA error due to premature reading of the MRXFIFO register.

    Adding the wait fixes some unreliability issues with the driver. There's
    some efficiency cost to it (especially with pasemi_smb_waitready doing
    its polling), but that will be alleviated once the driver receives
    interrupt support.

    Fixes: beb58aa39e6e ("i2c: PA Semi SMBus driver")
    Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
    Reviewed-by: Sven Peter <sven@svenpeter.dev>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/i2c/busses/i2c-pasemi-core.c | 6 ++++++
    1 file changed, 6 insertions(+)

    --- a/drivers/i2c/busses/i2c-pasemi-core.c
    +++ b/drivers/i2c/busses/i2c-pasemi-core.c
    @@ -137,6 +137,12 @@ static int pasemi_i2c_xfer_msg(struct i2

    TXFIFO_WR(smbus, msg->buf[msg->len-1] |
    (stop ? MTXFIFO_STOP : 0));
    +
    + if (stop) {
    + err = pasemi_smb_waitready(smbus);
    + if (err)
    + goto reset_out;
    + }
    }

    return 0;

    \
     
     \ /
      Last update: 2022-04-18 14:38    [W:4.486 / U:0.308 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site