Linux Input/HID development
 help / color / mirror / Atom feed
From: Hans de Goede <hansg@kernel.org>
To: "Eren Çakar" <hey@erencakar.com>, jikos@kernel.org, bentiss@kernel.org
Cc: linux-input@vger.kernel.org
Subject: Re: [PATCH] HID: letsketch: skip string descriptors the firmware does not implement
Date: Fri, 13 Nov 2026 15:27:19 +0100	[thread overview]
Message-ID: <aa5ac70e-1d8b-4368-9453-cfc3bdbaa2c2@kernel.org> (raw)
In-Reply-To: <1794567868877069470.1794567868@erencakar.com>

Hi,

On 13-Nov-26 12:04, Eren Çakar wrote:
> The Starcom GC-422 is a rebranded LetSketch WP9620C with the same USB
> ID (6161:4d15), so it binds to this driver. Its firmware
> ("Vision_V201_180530") does not implement every string descriptor index
> that the raw mode handshake reads. For those indices usb_string() keeps
> returning an empty string or -EPIPE, letsketch_get_string() gives up
> after its retries, and the probe fails:
> 
>   letsketch ...: probe with driver letsketch failed with error -5
> 
> The tablet then does not work at all.
> 
> The handshake only needs the reads to happen, not their contents. Once
> the retries are used up, report an index that still reads as empty or
> STALLs as missing with -ENOENT, and let the probe skip it. Other errors
> still fail the probe as before, and the retries stay in place, so
> firmware that only fails a read now and then behaves as it did.
> 
> With this change the GC-422 completes the handshake, switches to raw
> mode and reports pen position, pressure and the five pad buttons.
> 
> The change and this message were written with the help of an AI coding
> assistant (Claude Code); I reviewed them and tested the result on the
> hardware.
> 
> Fixes: 33a5c2793451 ("HID: Add new Letsketch tablet driver")
> Signed-off-by: Eren Çakar <hey@erencakar.com>

Thanks, patch looks good to me:

Reviewed-by: Hans de Goede <johannes.goede@oss.qualcomm.com>

Regards,

Hans



> ---
>  drivers/hid/hid-letsketch.c | 21 +++++++++++++++++----
>  1 file changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/hid/hid-letsketch.c b/drivers/hid/hid-letsketch.c
> index b52e93a..6a93245 100644
> --- a/drivers/hid/hid-letsketch.c
> +++ b/drivers/hid/hid-letsketch.c
> @@ -213,6 +213,12 @@ static int letsketch_raw_event(struct hid_device *hdev,
>   * string descriptors. But the firmware is buggy and does not like it if
>   * we do this too fast. Even if we go slow sometimes the usb_string() call
>   * fails. Ignore errors and retry it a couple of times if necessary.
> + *
> + * Some firmware revisions (e.g. "Vision_V201_180530", sold as the Starcom
> + * GC-422) do not implement every string descriptor index the handshake
> + * reads. For those indices usb_string() keeps returning an empty string or
> + * -EPIPE (STALL). Report such an index as missing with -ENOENT once the
> + * retries are used up, so that the caller can skip it.
>   */
>  static int letsketch_get_string(struct usb_device *udev, int index, char *buf, int size)
>  {
> @@ -225,9 +231,14 @@ static int letsketch_get_string(struct usb_device *udev, int index, char *buf, i
>  			return 0;
>  	}
>  
> +	if (ret == 0 || ret == -EPIPE) {
> +		dev_dbg(&udev->dev, "String descriptor %d not implemented\n", index);
> +		return -ENOENT;
> +	}
> +
>  	dev_err(&udev->dev, "Max retries (%d) exceeded reading string descriptor %d\n",
>  		LETSKETCH_GET_STRING_RETRIES, index);
> -	return ret ? ret : -EIO;
> +	return ret;
>  }
>  
>  static int letsketch_probe(struct hid_device *hdev, const struct hid_device_id *id)
> @@ -256,6 +267,8 @@ static int letsketch_probe(struct hid_device *hdev, const struct hid_device_id *
>  	 */
>  	for (i = LETSKETCH_INFO_STR_IDX_BEGIN; i <= LETSKETCH_INFO_STR_IDX_END; i++) {
>  		ret = letsketch_get_string(udev, i, buf, sizeof(buf));
> +		if (ret == -ENOENT)
> +			continue;
>  		if (ret)
>  			return ret;
>  
> @@ -264,16 +277,16 @@ static int letsketch_probe(struct hid_device *hdev, const struct hid_device_id *
>  
>  	for (i = 1; i <= 250; i++) {
>  		ret = letsketch_get_string(udev, i, buf, sizeof(buf));
> -		if (ret)
> +		if (ret && ret != -ENOENT)
>  			return ret;
>  	}
>  
>  	ret = letsketch_get_string(udev, 0x64, buf, sizeof(buf));
> -	if (ret)
> +	if (ret && ret != -ENOENT)
>  		return ret;
>  
>  	ret = letsketch_get_string(udev, LETSKETCH_INFO_STR_IDX_BEGIN, buf, sizeof(buf));
> -	if (ret)
> +	if (ret && ret != -ENOENT)
>  		return ret;
>  
>  	/*


      reply	other threads:[~2026-11-13 14:27 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-13 11:05 [PATCH] HID: letsketch: skip string descriptors the firmware does not implement Eren Çakar
2026-11-13 14:27 ` Hans de Goede [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=aa5ac70e-1d8b-4368-9453-cfc3bdbaa2c2@kernel.org \
    --to=hansg@kernel.org \
    --cc=bentiss@kernel.org \
    --cc=hey@erencakar.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@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