• S
    i2c: tegra: proper handling of error cases · 77821b46
    Shardar Shariff Md 提交于
    To summarize the issue observed in error cases:
    
    SW Flow: For i2c message transfer, packet header and data payload is
    posted and then required error/packet completion interrupts are enabled
    later.
    
    HW flow: HW process the packet just after packet header is posted, if
    ARB lost/NACK error occurs (SW will not handle immediately when error
    happens as error interrupts are not enabled at this point). HW assumes
    error is acknowledged and clears current data in FIFO, But SW here posts
    the remaining data payload which still stays in FIFO as stale data
    (data without packet header).
    
    Now once the interrupts are enabled, SW handles ARB lost/NACK error by
    clearing the ARB lost/NACK interrupt. Now HW assumes that SW attended
    the error and will parse/process stale data (data without packet header)
    present in FIFO which causes invalid NACK errors.
    
    Fix: Enable the error interrupts before posting the packet into FIFO
    which make sure HW to not clear the fifo. Also disable the packet mode
    before acknowledging errors (ARB lost/NACK error) to not process any
    stale data. As error interrupts are enabled before posting the packet
    header use spinlock to avoid preempting.
    Signed-off-by: NShardar Shariff Md <smohammed@nvidia.com>
    Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
    77821b46
i2c-tegra.c 30.4 KB