On Tue, 2 Apr 2024, Mark Pearson wrote:
On Tue, Apr 2, 2024, at 7:10 AM, Hans de Goede wrote:
From: Kenny Levinsen kl@kl.wtf
In af93a167eda9, i2c_hid_parse was changed to continue with reading the report descriptor before waiting for reset to be acknowledged.
This has lead to two regressions:
We fail to handle reset acknowledgment if it happens while reading the report descriptor. The transfer sets I2C_HID_READ_PENDING, which causes the IRQ handler to return without doing anything.
This affects both a Wacom touchscreen and a Sensel touchpad.
On a Sensel touchpad, reading the report descriptor this quickly after reset results in all zeroes or partial zeroes.
The issues were observed on the Lenovo Thinkpad Z16 Gen 2.
The change in question was made based on a Microsoft article[0] stating that Windows 8 *may* read the report descriptor in parallel with awaiting reset acknowledgment, intended as a slight reset performance optimization. Perhaps they only do this if reset is not completing quickly enough for their tastes?
As the code is not currently ready to read registers in parallel with a pending reset acknowledgment, and as reading quickly breaks the report descriptor on the Sensel touchpad, revert to waiting for reset acknowledgment before proceeding to read the report descriptor.
Fixes: af93a167eda9 ("HID: i2c-hid: Move i2c_hid_finish_hwreset() to after reading the report-descriptor") Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2271136 Cc: stable@vger.kernel.org Signed-off-by: Kenny Levinsen kl@kl.wtf Link: https://lore.kernel.org/r/20240331182440.14477-1-kl@kl.wtf [hdegoede@redhat.com Drop no longer necessary abort_reset error exit path] Signed-off-by: Hans de Goede hdegoede@redhat.com
[ .. snip .. ]
Tested on my Z13 G2 system and confirmed this fixes the issue.
Tested-by: Mark Pearson mpearson-lenovo@squebb.ca
Applied to hid.git#for-6.9/upstream-fixes. Thanks,