mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: chitranshmandhaniya@gmail.com
To: hansg@kernel.org, ilpo.jarvinen@linux.intel.com
Cc: platform-driver-x86@vger.kernel.org,
	linux-kernel@vger.kernel.org, Chitransh_Mandhaniya@dell.com
Subject: [PATCH v4 2/2] platform/x86: dell-uart-backlight: recover from stray EC response byte
Date: Sat, 17 Oct 2026 13:07:04 +0530	[thread overview]
Message-ID: <20261017073704.606497-3-chitranshmandhaniya@gmail.com> (raw)
In-Reply-To: <20261017073704.606497-1-chitranshmandhaniya@gmail.com>

From: Chitransh Mandhaniya <Chitransh_Mandhaniya@dell.com>

On some Dell All-in-One machines the EC occasionally inserts a spurious
byte after the command echo in UART backlight response frames. For
example a get-brightness reply that should be "04 0c 0a e5" arrives as
"04 0c 0d 0a e5". The length field still reflects the original frame
size, so the parser treats the stray byte as payload and the real
payload as the checksum, producing a spurious -EIO.

Add single-attempt recovery inside dell_uart_bl_receive_data(): on a
checksum mismatch for a frame longer than the minimum size, drop the
byte at the first payload offset, shift the remaining data down by one,
and decrement resp_idx so serdev re-delivers the real checksum byte on
the next callback. Status remains -EBUSY, so no special handling is
needed in the caller.

A per-transaction resync_used flag, cleared at the start of each
command, limits recovery to one attempt. A second mismatch is a hard
-EIO. Well-formed frames never enter the recovery path.

Tested on Dell OptiPlex AIO 7410 65W (board 0TKWC4) where the EC
inserts a stray byte on every get-brightness response.

Signed-off-by: Chitransh Mandhaniya <Chitransh_Mandhaniya@dell.com>
---
 drivers/platform/x86/dell/dell-uart-backlight.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/platform/x86/dell/dell-uart-backlight.c b/drivers/platform/x86/dell/dell-uart-backlight.c
index 5f01ad108338..1243c191c5b0 100644
--- a/drivers/platform/x86/dell/dell-uart-backlight.c
+++ b/drivers/platform/x86/dell/dell-uart-backlight.c
@@ -60,6 +60,7 @@ struct dell_uart_backlight {
 	u8 resp_len;
 	u8 resp_max_len;
 	u8 pending_cmd;
+	bool resync_used;
 	int status;
 	int power;
 };
@@ -91,6 +92,7 @@ static int dell_uart_bl_command(struct dell_uart_backlight *dell_bl,
 	dell_bl->resp_len = -1; /* Invalid / unset */
 	dell_bl->resp_max_len = resp_max_len;
 	dell_bl->pending_cmd = cmd[1];
+	dell_bl->resync_used = false;
 
 	/* The TTY buffer should be big enough to take the entire cmd in one go */
 	ret = serdev_device_write_buf(to_serdev_device(dell_bl->dev), cmd, cmd_len);
@@ -245,6 +247,14 @@ static size_t dell_uart_bl_receive_data(struct dell_uart_backlight *dell_bl,
 	csum = dell_uart_checksum(dell_bl->resp, dell_bl->resp_len - 1);
 	if (dell_bl->resp[dell_bl->resp_len - 1] == csum) {
 		dell_bl->status = 0; /* Success */
+	} else if (!dell_bl->resync_used && dell_bl->resp_len > MIN_RESP_LEN) {
+		/* Stray byte after cmd-echo? Drop it, let serdev re-deliver checksum. */
+		dell_bl->resync_used = true;
+		dev_dbg(dell_bl->dev, "Resync: dropping stray byte 0x%02x at offset %d\n",
+			dell_bl->resp[RESP_DATA], RESP_DATA);
+		memmove(&dell_bl->resp[RESP_DATA], &dell_bl->resp[RESP_DATA + 1],
+			dell_bl->resp_len - RESP_DATA - 1);
+		dell_bl->resp_idx = dell_bl->resp_len - 1;
 	} else {
 		dev_err(dell_bl->dev, "Checksum mismatch got 0x%02x expected 0x%02x\n",
 			dell_bl->resp[dell_bl->resp_len - 1], csum);
-- 
2.43.0


      parent reply	other threads:[~2026-10-17  7:37 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-04 11:03 [PATCH] " chitranshmandhaniya
2026-10-14 11:50 ` Ilpo Järvinen
2026-10-15  7:43 ` [PATCH v2 0/2] " chitranshmandhaniya
2026-10-15  7:43   ` [PATCH v2 1/2] platform/x86: dell-uart-backlight: extract dell_uart_bl_receive_data() helper chitranshmandhaniya
2026-10-15  7:43   ` [PATCH v2 2/2] platform/x86: dell-uart-backlight: recover from stray EC response byte chitranshmandhaniya
2026-10-15 10:12     ` Ilpo Järvinen
2026-10-15 10:24     ` Ilpo Järvinen
2026-10-16  9:33 ` [PATCH v3 0/2] platform/x86: dell-uart-backlight: stray byte recovery and cleanup chitranshmandhaniya
2026-10-16  9:33   ` [PATCH v3 1/2] platform/x86: dell-uart-backlight: extract chitranshmandhaniya
2026-10-16  9:33   ` [PATCH v3 2/2] platform/x86: dell-uart-backlight: recover from stray chitranshmandhaniya
2026-10-16 10:07     ` Ilpo Järvinen
2026-10-17  7:37 ` [PATCH v4 0/2] platform/x86: dell-uart-backlight: handle stray EC byte in responses chitranshmandhaniya
2026-10-17  7:37   ` [PATCH v4 1/2] platform/x86: dell-uart-backlight: extract dell_uart_bl_receive_data() helper chitranshmandhaniya
2026-10-17  7:37   ` chitranshmandhaniya [this message]

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=20261017073704.606497-3-chitranshmandhaniya@gmail.com \
    --to=chitranshmandhaniya@gmail.com \
    --cc=Chitransh_Mandhaniya@dell.com \
    --cc=hansg@kernel.org \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=platform-driver-x86@vger.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

all inboxes | Powered by JetHome®