mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-23 07:23:12 +02:00
i2c: qup: jump out of the loop in case of timeout
Original logic only sets the return value but doesn't jump out of the
loop if the bus is kept active by a client. This is not expected. A
malicious or buggy i2c client can hang the kernel in this case and
should be avoided. This is observed during a long time test with a
PCA953x GPIO extender.
Fix it by changing the logic to not only sets the return value, but also
jumps out of the loop and return to the caller with -ETIMEDOUT.
Fixes: fbfab1ab06
("i2c: qup: reorganization of driver code to remove polling for qup v1")
Signed-off-by: Yang Xiwen <forbidden405@outlook.com>
Cc: <stable@vger.kernel.org> # v4.17+
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20250616-qca-i2c-v1-1-2a8d37ee0a30@outlook.com
This commit is contained in:
parent
a663b3c47a
commit
a7982a14b3
|
@ -452,8 +452,10 @@ static int qup_i2c_bus_active(struct qup_i2c_dev *qup, int len)
|
||||||
if (!(status & I2C_STATUS_BUS_ACTIVE))
|
if (!(status & I2C_STATUS_BUS_ACTIVE))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (time_after(jiffies, timeout))
|
if (time_after(jiffies, timeout)) {
|
||||||
ret = -ETIMEDOUT;
|
ret = -ETIMEDOUT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
usleep_range(len, len * 2);
|
usleep_range(len, len * 2);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user