linux/drivers/i2c
Robert Hancock 521da1e922 i2c: xiic: Wait for TX empty to avoid missed TX NAKs
Frequently an I2C write will be followed by a read, such as a register
address write followed by a read of the register value. In this driver,
when the TX FIFO half empty interrupt was raised and it was determined
that there was enough space in the TX FIFO to send the following read
command, it would do so without waiting for the TX FIFO to actually
empty.

Unfortunately it appears that in some cases this can result in a NAK
that was raised by the target device on the write, such as due to an
unsupported register address, being ignored and the subsequent read
being done anyway. This can potentially put the I2C bus into an
invalid state and/or result in invalid read data being processed.

To avoid this, once a message has been fully written to the TX FIFO,
wait for the TX FIFO empty interrupt before moving on to the next
message, to ensure NAKs are handled properly.

Fixes: e1d5b6598c ("i2c: Add support for Xilinx XPS IIC Bus Interface")
Signed-off-by: Robert Hancock <robert.hancock@calian.com>
Cc: <stable@vger.kernel.org> # v2.6.34+
Reviewed-by: Manikanta Guntupalli <manikanta.guntupalli@amd.com>
Acked-by: Michal Simek <michal.simek@amd.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
2024-09-11 22:21:07 +02:00
..
algos i2c: algo: bit: allow getsda to be NULL 2023-01-23 23:15:49 +01:00
busses i2c: xiic: Wait for TX empty to avoid missed TX NAKs 2024-09-11 22:21:07 +02:00
muxes i2c: mux: gpio: Add support for the 'settle-time-us' property 2024-07-20 03:07:55 +02:00
i2c-atr.c i2c: Annotate struct i2c_atr with __counted_by 2023-09-24 22:50:25 +02:00
i2c-boardinfo.c i2c: Remove support for dangling device properties 2021-04-10 21:43:02 +02:00
i2c-core-acpi.c i2c: acpi: Unbind mux adapters before delete 2024-05-06 09:17:38 +02:00
i2c-core-base.c Driver core changes for 6.11-rc1 2024-07-25 10:42:22 -07:00
i2c-core-of.c Char/Misc drivers for 6.4-rc1 2023-04-27 12:07:50 -07:00
i2c-core-slave.c i2c: add tracepoints for I2C slave events 2022-03-20 00:11:05 +01:00
i2c-core-smbus.c i2c: smbus: Check for parent device before dereference 2022-02-19 12:37:20 +01:00
i2c-core.h i2c: core: Fix atomic xfer check for non-preempt config 2024-01-06 14:10:10 +01:00
i2c-dev.c i2c: dev: Check for I2C_FUNC_I2C before calling i2c_transfer 2024-06-26 12:45:25 +02:00
i2c-mux.c i2c: mux: Remove class argument from i2c_mux_add_adapter() 2024-05-13 16:13:19 +02:00
i2c-slave-eeprom.c i2c: Convert drivers to new .probe() callback 2023-03-09 21:59:30 +01:00
i2c-slave-testunit.c i2c: testunit: match HostNotify test name with docs 2024-08-08 07:20:33 +02:00
i2c-smbus.c i2c: smbus: Send alert notifications to all devices if source not found 2024-08-04 16:29:34 +02:00
i2c-stub.c i2c: stub: Don't let i2c adapters declare I2C_CLASS_SPD support if they support I2C_CLASS_HWMON 2024-01-18 21:10:41 +01:00
Kconfig i2c: testunit: correct Kconfig description 2024-07-11 11:27:22 +02:00
Makefile media: i2c: add I2C Address Translator (ATR) support 2023-07-14 13:11:44 +02:00