• Michael Zaidman's avatar
    HID: ft260: missed NACK from big i2c read · 728b117e
    Michael Zaidman authored
    The FT260 controller does not return NACK when performing a big
    read (of multiple hid reports size) from a non-existing device
    or from the device responding with NACK when it is not ready
    to serve the request. However, it responds correctly with NACK
    to a read of up to a single hid report size.
    
    To overcome this issue, we split the muli-report read request
    into a read of a single HID report of 60 bytes size and a
    multi-report read.
    
    Big read of 256 bytes with first read of 60 bytes:
    
    $ sudo ./i2cperf -d 2 -o 2 -s 256 -r 0-0xff 1 0x50 -S
    
    [  +5.633280] ft260_i2c_write_read: off 0x0 rlen 255 wlen 2
    [  +0.000006] ft260_i2c_write: rep 0xd0 addr 0x50 off 0 len 2 wlen 2 flag 0x2 d[0] 0x0
    [  +0.013205] ft260_xfer_status: bus_status 0x20, clock 100
    [  +0.000007] ft260_i2c_read: rep 0xc2 addr 0x50 len 255 rlen 60 flag 0x3
    [  +0.010932] ft260_raw_event: i2c resp: rep 0xde len 60
    [  +0.004733] ft260_xfer_status: bus_status 0x40, clock 100
    [  +0.000006] ft260_i2c_read: rep 0xc2 addr 0x50 len 195 rlen 128 flag 0x0
    [  +0.012572] ft260_raw_event: i2c resp: rep 0xde len 60
    [  +0.005789] ft260_raw_event: i2c resp: rep 0xde len 60
    [  +0.003189] ft260_raw_event: i2c resp: rep 0xd1 len 8
    [  +0.004092] ft260_xfer_status: bus_status 0x40, clock 100
    [  +0.000010] ft260_i2c_read: rep 0xc2 addr 0x50 len 67 rlen 67 flag 0x4
    [  +0.011688] ft260_raw_event: i2c resp: rep 0xde len 60
    [  +0.004700] ft260_raw_event: i2c resp: rep 0xd1 len 7
    [  +0.004858] ft260_xfer_status: bus_status 0x20, clock 100
    
    Read from non-existing device at address 8. The first 60 read responded
    with NACK.
    
    $ sudo ./i2cperf -d 2 -o 2 -s 256 -r 0-0xff 1 0x8 -S
    [Oct19 15:37] ft260_i2c_write_read: off 0x0 rlen 255 wlen 2
    [  +0.000007] ft260_i2c_write: rep 0xd0 addr 0x8 off 0 len 2 wlen 2 flag 0x2 d[0] 0x0
    [  +0.022820] ft260_xfer_status: bus_status 0x20, clock 100
    [  +0.000007] ft260_i2c_read: rep 0xc2 addr 0x8 len 255 rlen 60 flag 0x3
    [  +0.010658] ft260_raw_event: i2c resp: rep 0xde len 60
    [  +0.005965] ft260_xfer_status: bus_status 0x46, clock 100  <-- NACK
    [  +0.000009] ft260 0003:0403:6030.0004: i2c bus error: 0x46
    [  +0.007784] ft260_i2c_reset: done
    Co-developed-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
    Signed-off-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
    Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    728b117e
hid-ft260.c 26.8 KB