From: Lovekesh Solanki <lovekeshsolanki00@gmail.com>
To: Roman Stingler <roman.stingler@gmail.com>
Cc: Jiri Kosina <jikos@kernel.org>,
Benjamin Tissoires <bentiss@kernel.org>,
Erik Hakansson <erikhakan@gmail.com>,
Filipe Lains <lains@riseup.net>,
Bastien Nocera <hadess@hadess.net>,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
regressions@lists.linux.dev
Subject: Re: [REGRESSION 7.3-rc1] HID: logitech-hidpp: hi-res scroll mode forcibly re-enabled on every reconnect for Bolt devices, overriding userspace
Date: Tue, 22 Sep 2026 21:03:24 +0530 [thread overview]
Message-ID: <arJs7GjCP3r4IaM-@eggarch> (raw)
In-Reply-To: <20260920205058.11958-1-roman.stingler@gmail.com>
On Sun, Sep 20, 2026 at 10:50:53PM +0200, Roman Stingler wrote:
> diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
> index 1504de32b1c8..ffc7cef49b59 100644
> --- a/drivers/hid/hid-logitech-hidpp.c
> +++ b/drivers/hid/hid-logitech-hidpp.c
> @@ -2044,6 +2044,7 @@ static int hidpp_hrs_set_highres_scrolling_mode(struct hidpp_device *hidpp,
> #define HIDPP_PAGE_HIRES_WHEEL 0x2121
>
> #define CMD_HIRES_WHEEL_GET_WHEEL_CAPABILITY 0x00
> +#define CMD_HIRES_WHEEL_GET_WHEEL_MODE 0x10
> #define CMD_HIRES_WHEEL_SET_WHEEL_MODE 0x20
>
> static int hidpp_hrw_get_wheel_capability(struct hidpp_device *hidpp,
> @@ -2072,12 +2073,10 @@ static int hidpp_hrw_get_wheel_capability(struct hidpp_device *hidpp,
> return ret;
> }
>
> -static int hidpp_hrw_set_wheel_mode(struct hidpp_device *hidpp, bool invert,
> - bool high_resolution, bool use_hidpp)
> +static int hidpp_hrw_get_wheel_mode(struct hidpp_device *hidpp, u8 *mode)
> {
> u8 feature_index;
> int ret;
> - u8 params[1];
> struct hidpp_report response;
>
> ret = hidpp_root_get_feature(hidpp, HIDPP_PAGE_HIRES_WHEEL,
> @@ -2085,13 +2084,14 @@ static int hidpp_hrw_set_wheel_mode(struct hidpp_device *hidpp, bool invert,
> if (ret)
> return ret;
>
> - params[0] = (invert ? BIT(2) : 0) |
> - (high_resolution ? BIT(1) : 0) |
> - (use_hidpp ? BIT(0) : 0);
> + ret = hidpp_send_fap_command_sync(hidpp, feature_index,
> + CMD_HIRES_WHEEL_GET_WHEEL_MODE,
> + NULL, 0, &response);
> + if (ret)
> + return ret;
>
> - return hidpp_send_fap_command_sync(hidpp, feature_index,
> - CMD_HIRES_WHEEL_SET_WHEEL_MODE,
> - params, sizeof(params), &response);
> + *mode = response.fap.params[0];
> + return 0;
> }
>
> /* -------------------------------------------------------------------------- */
> @@ -3910,8 +3910,16 @@ static int hi_res_scroll_enable(struct hidpp_device *hidpp)
> u8 multiplier = 1;
>
> if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_WHEEL) {
> - ret = hidpp_hrw_set_wheel_mode(hidpp, false, true, false);
> - if (ret == 0)
> + u8 mode;
> +
> + /*
> + * The wheel mode is persistent state in the device, so read it
> + * rather than overwriting it, and scale to match. A device
> + * left in hi-res still gets the multiplier it needs; one the
> + * user configured for low resolution is left alone.
> + */
> + ret = hidpp_hrw_get_wheel_mode(hidpp, &mode);
> + if (ret == 0 && (mode & BIT(1)))
> ret = hidpp_hrw_get_wheel_capability(hidpp, &multiplier);
> } else if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_HI_RES_SCROLL) {
> ret = hidpp_hrs_set_highres_scrolling_mode(hidpp, true,
>
> Tested on top of 7.3-rc3, installed via DKMS so it is the module loaded at
> boot. Results against the same device:
>
> stock your patch this
> suspend/resume no yes yes
> solaar write sticks no yes yes
> module reload no no yes
> cold boot no no yes
I didn't think of this, your patch seems like a better solution.
I think you should format and send it.
Regards,
Lovekesh
prev parent reply other threads:[~2026-09-22 15:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-20 9:44 [REGRESSION 7.3-rc1] HID: logitech-hidpp: hi-res scroll mode forcibly re-enabled on every reconnect for Bolt devices, overriding userspace Roman Stingler
2026-09-20 18:31 ` Lovekesh Solanki
2026-09-20 20:50 ` Roman Stingler
2026-09-20 21:24 ` Erik Håkansson
2026-09-22 15:33 ` Lovekesh Solanki [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=arJs7GjCP3r4IaM-@eggarch \
--to=lovekeshsolanki00@gmail.com \
--cc=bentiss@kernel.org \
--cc=erikhakan@gmail.com \
--cc=hadess@hadess.net \
--cc=jikos@kernel.org \
--cc=lains@riseup.net \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=regressions@lists.linux.dev \
--cc=roman.stingler@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.