drivers: nfc: nq-nci: Retry I2C writes on failures

In certain scenarios I2C writes fail with ENOTCONN errors, but
succeed if retried shortly after.

Change-Id: Ie151caca66298e5361c2d932206165f9be08d3a6
Signed-off-by: danielml <daniel@danielml.es>
This commit is contained in:
danielml
2025-06-30 18:04:12 +02:00
committed by Nolen Johnson
parent d4cb769b58
commit cffd4b845d

View File

@ -362,6 +362,7 @@ static ssize_t nfc_write(struct file *filp, const char __user *buf,
struct nqx_dev *nqx_dev = filp->private_data;
char *tmp = NULL;
int ret = 0;
int retry_cnt;
if (!nqx_dev) {
ret = -ENODEV;
@ -382,10 +383,18 @@ static ssize_t nfc_write(struct file *filp, const char __user *buf,
goto out;
}
ret = i2c_master_send(nqx_dev->client, tmp, count);
if (ret != count) {
retry_cnt = 0;
while (retry_cnt < MAX_RETRY_COUNT &&
(ret = i2c_master_send(nqx_dev->client, tmp, count)) != count) {
dev_err(&nqx_dev->client->dev,
"%s: failed to write %d\n", __func__, ret);
"%s: failed to write %d\n", __func__, retry_cnt);
usleep_range(10000, 11000);
retry_cnt++;
}
if (retry_cnt >= MAX_RETRY_COUNT) {
dev_err(&nqx_dev->client->dev,
"%s: failed to write after %d retries\n", __func__, retry_cnt);
ret = -EIO;
goto out_free;
}