linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sultan Alsawaf <sultan@kerneltoast.com>
To: linux-i2c@vger.kernel.org
Cc: jikos@kernel.org, aaron.ma@canonical.com, admin@kryma.net,
	andriy.shevchenko@linux.intel.com, benjamin.tissoires@redhat.com,
	hdegoede@redhat.com, hn.chen@weidahitech.com,
	jarkko.nikula@linux.intel.com, kai.heng.feng@canonical.com,
	linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	mika.westerberg@linux.intel.com, vicamo.yang@canonical.com,
	wsa@kernel.org, Sultan Alsawaf <sultan@kerneltoast.com>
Subject: [PATCH v2 1/4] i2c: designware: Fix transfer failures for invalid SMBus block reads
Date: Wed, 16 Sep 2020 22:22:53 -0700	[thread overview]
Message-ID: <20200917052256.5770-2-sultan@kerneltoast.com> (raw)
In-Reply-To: <20200917052256.5770-1-sultan@kerneltoast.com>

From: Sultan Alsawaf <sultan@kerneltoast.com>

SMBus block reads can be broken because the read function will just skip
over bytes it doesn't like until reaching a byte that conforms to the
length restrictions for block reads. This is problematic when it isn't
known if the incoming payload is indeed a conforming block read.

According to the SMBus specification, block reads will only send the
payload length in the first byte, so we can fix this by only considering
the first byte in a sequence for block read length purposes.

In addition, when the length byte is invalid, the original transfer
length still needs to be adjusted to avoid a controller timeout.

Fixes: c3ae106050b9 ("i2c: designware: Implement support for SMBus block read and write")
Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com>
---
 drivers/i2c/busses/i2c-designware-master.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c
index d6425ad6e6a3..d78f48ca4886 100644
--- a/drivers/i2c/busses/i2c-designware-master.c
+++ b/drivers/i2c/busses/i2c-designware-master.c
@@ -430,10 +430,12 @@ i2c_dw_read(struct dw_i2c_dev *dev)
 			u32 flags = msgs[dev->msg_read_idx].flags;
 
 			regmap_read(dev->map, DW_IC_DATA_CMD, &tmp);
-			/* Ensure length byte is a valid value */
-			if (flags & I2C_M_RECV_LEN &&
-			    tmp <= I2C_SMBUS_BLOCK_MAX && tmp > 0) {
-				len = i2c_dw_recv_len(dev, tmp);
+			if (flags & I2C_M_RECV_LEN) {
+				/* Ensure length byte is a valid value */
+				if (tmp <= I2C_SMBUS_BLOCK_MAX && tmp > 0)
+					len = i2c_dw_recv_len(dev, tmp);
+				else
+					len = i2c_dw_recv_len(dev, len);
 			}
 			*buf++ = tmp;
 			dev->rx_outstanding--;
-- 
2.28.0


  reply	other threads:[~2020-09-17  5:23 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-17  5:22 [PATCH v2 0/4] i2c-hid: Save power by reducing i2c xfers with block reads Sultan Alsawaf
2020-09-17  5:22 ` Sultan Alsawaf [this message]
2020-09-17  5:22 ` [PATCH v2 2/4] i2c: designware: Ensure tx_buf_len is nonzero for SMBus " Sultan Alsawaf
2020-09-17 12:47   ` Andy Shevchenko
2020-09-17 13:44   ` Jarkko Nikula
2020-09-17 14:45     ` Andy Shevchenko
2020-09-17  5:22 ` [PATCH v2 3/4] i2c: designware: Allow SMBus block reads up to 255 bytes in length Sultan Alsawaf
2020-09-17 20:57   ` Wolfram Sang
2020-09-17 23:12     ` Sultan Alsawaf
2020-09-17  5:22 ` [PATCH v2 4/4] HID: i2c-hid: Use block reads when possible to save power Sultan Alsawaf
2020-09-17 14:02 ` [PATCH v2 0/4] i2c-hid: Save power by reducing i2c xfers with block reads Andy Shevchenko
2020-09-23 13:59   ` Jarkko Nikula
2020-09-22  9:19 ` Jiri Kosina
2020-09-22 11:36   ` Wolfram Sang
2020-09-22 19:59     ` Jiri Kosina
2020-09-23  6:02       ` Sultan Alsawaf
2020-10-16 11:16   ` Hans de Goede
2020-10-16 15:24     ` Sultan Alsawaf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200917052256.5770-2-sultan@kerneltoast.com \
    --to=sultan@kerneltoast.com \
    --cc=aaron.ma@canonical.com \
    --cc=admin@kryma.net \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=benjamin.tissoires@redhat.com \
    --cc=hdegoede@redhat.com \
    --cc=hn.chen@weidahitech.com \
    --cc=jarkko.nikula@linux.intel.com \
    --cc=jikos@kernel.org \
    --cc=kai.heng.feng@canonical.com \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=vicamo.yang@canonical.com \
    --cc=wsa@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).