From nobody Sat Sep 26 13:07:53 2026 Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DBAED377EA2 for ; Tue, 1 Sep 2026 06:36:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244580; cv=none; b=gF6bLPO2J+HuiFvkm7/MwG5kSQWMtxcKVgpI8c/TXZRcrIP+oCQ8cuTVqMmtoteplPQXOLMjU1JHWKqRMWJVbmt4zG3Prz/v09PLSEsf32oSjm7lCv/kiA690V3jlqDuLPJ33Hs3H6os5BS9VTDgG4/pG78l2HKO+rYGFt+TB0A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244580; c=relaxed/simple; bh=reLdAq8P0t49kvDWPzWt8gweqMKLVAKU+JnfiiZyo8k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vl+pYdcT2MsWbdoQ9Fc/e2obEAOHgX4r5t09gT8h65VOJUkRXXoGeNLv9vP5BGGu4njAO8S7s/uFFNN1qx40TuC0NDq5mFZKkI7lmR3YztI6SpW2CA78czdV7M1f1kgR1yG/UBxFu/kt1R/5w2QusQjEsOzCCwKyqfNOzm4bYnA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FtSpiDIJ; arc=none smtp.client-ip=209.85.215.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FtSpiDIJ" Received: by mail-pg1-f171.google.com with SMTP id 41be03b00d2f7-cc1cf287ef8so4153412a12.3 for ; Mon, 31 Aug 2026 23:36:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788244578; x=1788849378; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=LxJQOF7esWYVaSzzh3UuNgbHtz6kTLWO9YCyNun8jQU=; b=FtSpiDIJPEgFZ7plO/7E82h1VqtthVqVzPO2N6F/U4mGIbUVQWKqf0IAiwvWfbhsnk Vpnfk5xLtrht2uuLSBMgNpmVYnIe/jD+cy9qwI+0xo7QvCxLauA0n3LKcfUf8z7UKcL5 OIgoJWbFQtSAO8ad8xn6ujseuwZ8JQsDE9yGHNOvnjOoeVEMs5U6CQAQjj1hB6sHWGfm GjOBSF7KJ5CBSC+Aa1vhBIK+RG/c/r3SqNovgtlcFJDuxbiVAhG4liDGszpCazWb+LiE SxnlnssdsCloWEgY/JzAWt8h/XDHi66ztJ0GO5qucr2/Lrp1rQK8UcdVLMfvJi32F7Qb VnqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788244578; x=1788849378; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=LxJQOF7esWYVaSzzh3UuNgbHtz6kTLWO9YCyNun8jQU=; b=eD8SeWIn1djJYvAWpuM9dCAJMn5jYKY26qPjEJFBQXhiuVAEBsEm+xf7Fgpsu/6h3R z5NohvrkTcSwpv6f56XVyLeYigrRYL1aYLegkooZG0mjqxlcRjw9LdAEzb7r4OwR1bWv COc4MQ3CCl09oMPb3mvGazNGERjd3lE9CS3xFrF+li1Ib7lW9TYmpeSp0JbRpi2ubOrB QxPvQK27Jhsv3xpmoxXVd/IZJnh71JBAglkNLwZVNXsygsIAkEaoeSiJ3B2dIm63IXUJ gVFRPw7CPqxGqnhJjMZ69+P08ajZF5rEDQt3PUkY93ygRar03D5UzBMB3OcNqQOFrBjv 3nlA== X-Forwarded-Encrypted: i=1; AKwUvBx5i9EpjLfKF24nSqqW5O8YEgePjVNZFAoDJz2ASGz8IEfuDYidkAPi2GsK8470SSNqaCTXHNSPbxmtUnE=@vger.kernel.org X-Gm-Message-State: AFuF++mqNnbjNuPOBoYOiyoT35F1A/8vdKC0hWV76sbRlWhSAwE7aJJQ 4RWmEV8cVrXird1nQPYNEApt9xETsAxgKSgW8Ji7puMbKxw583uOtJT7 X-Gm-Gg: AYBFou2p7T0AoQrojbG1neJY5YsdxIDR7gRSrYPJBsaCkSOUASf6M9KVfNakIrik/F3 Swpcad2Mh2pA1OH0QvvhaVG927GtRRTKi3JQWB3nU2GjqlD+hSHcXVXfm1PUX+0529MrkaFhCwG nIddk+Qs8T5n780a1MKvEGF+wd2J0s3J/y9za/eaJ1x6+TJE/PkI7JergFSqrTprG73Zt+blKGE UpMmTQRZuGSHog+nDgOq2+0vHn/pdER4cxtUAHjb//gKrOoKg0cdN9G247KFveiWxYWVokHNDde pAG9p4GjwJj2WV2twu78PauvcucOT1Ppi2097l9hozXQGZAhYrDT+Qx8wNkKgc+mkcZBI1BwJDT TN59Yjqan7e/EhK/Ne/jPXauT6cJM9wjhESHOOqud0NPqS4PdVarA1AC/EbO6RmYpElcKgbPF8O BgqiiptMQVDZq4j6WxlyQtEXzeHSvgCW26FDLEOtHVecK5AEl8a988kSXnrObW4+61inqs1WkMb 7bnVyNnyQuIbQ== X-Received: by 2002:a17:90a:e185:b0:37f:eafd:3505 with SMTP id 98e67ed59e1d1-396d0ecbdb9mr52394238a91.6.1788244578206; Mon, 31 Aug 2026 23:36:18 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.192]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0dc854dsm32694425c88.10.2026.08.31.23.36.15 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 23:36:17 -0700 (PDT) From: Aditya Dash To: Benjamin Tissoires , "Derek J. Clark" , Jiri Kosina , Mark Pearson Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/7] HID: hid-lenovo-go: use the correct calibration commands Date: Tue, 1 Sep 2026 12:06:02 +0530 Message-ID: X-Mailer: git-send-email 2.55.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The calibration attributes pass the calibration operation as the command and the configuration command as the sub-command. This sends each request with the two fields reversed. Swap the command and sub-command values for all six calibration attributes. For example, the malformed left joystick Start request is: 05 00 04 0c 03 01 ... The corrected request is: 05 00 0c 04 03 01 ... The bytes identify the output report, configuration group, command, sub-command, left controller, and Start action, in that order. Fixes: 995887a10da1 ("HID: hid-lenovo-go: Add Calibration Settings") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash Reviewed-by: Derek J. Clark Tested-by: Derek J. Clark --- drivers/hid/hid-lenovo-go.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index 318b1152ff8b..b8248bf8965c 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -1911,18 +1911,18 @@ LEGO_DEVICE_ATTR_RW(rumble_notification_left, "rumb= le_notification", static DEVICE_ATTR_RO_NAMED(rumble_notification_left_index, "rumble_notification_index"); =20 -static struct go_cfg_attr cal_trigg_left =3D { TRIGGER_CALIBRATE }; -LEGO_CAL_DEVICE_ATTR(cal_trigg_left, "calibrate_trigger", SET_TRIGGER_CFG, +static struct go_cfg_attr cal_trigg_left =3D { SET_TRIGGER_CFG }; +LEGO_CAL_DEVICE_ATTR(cal_trigg_left, "calibrate_trigger", TRIGGER_CALIBRAT= E, LEFT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_trigg_left_index, "calibrate_trigger_index= "); =20 -static struct go_cfg_attr cal_joy_left =3D { JOYSTICK_CALIBRATE }; -LEGO_CAL_DEVICE_ATTR(cal_joy_left, "calibrate_joystick", SET_JOYSTICK_CFG, +static struct go_cfg_attr cal_joy_left =3D { SET_JOYSTICK_CFG }; +LEGO_CAL_DEVICE_ATTR(cal_joy_left, "calibrate_joystick", JOYSTICK_CALIBRAT= E, LEFT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_joy_left_index, "calibrate_joystick_index"= ); =20 -static struct go_cfg_attr cal_gyro_left =3D { GYRO_CALIBRATE }; -LEGO_CAL_DEVICE_ATTR(cal_gyro_left, "calibrate_gyro", SET_GYRO_CFG, +static struct go_cfg_attr cal_gyro_left =3D { SET_GYRO_CFG }; +LEGO_CAL_DEVICE_ATTR(cal_gyro_left, "calibrate_gyro", GYRO_CALIBRATE, LEFT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_gyro_left_index, "calibrate_gyro_index"); =20 @@ -2018,18 +2018,18 @@ LEGO_DEVICE_ATTR_RW(rumble_notification_right, "rum= ble_notification", static DEVICE_ATTR_RO_NAMED(rumble_notification_right_index, "rumble_notification_index"); =20 -static struct go_cfg_attr cal_trigg_right =3D { TRIGGER_CALIBRATE }; -LEGO_CAL_DEVICE_ATTR(cal_trigg_right, "calibrate_trigger", SET_TRIGGER_CFG, +static struct go_cfg_attr cal_trigg_right =3D { SET_TRIGGER_CFG }; +LEGO_CAL_DEVICE_ATTR(cal_trigg_right, "calibrate_trigger", TRIGGER_CALIBRA= TE, RIGHT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_trigg_right_index, "calibrate_trigger_inde= x"); =20 -static struct go_cfg_attr cal_joy_right =3D { JOYSTICK_CALIBRATE }; -LEGO_CAL_DEVICE_ATTR(cal_joy_right, "calibrate_joystick", SET_JOYSTICK_CFG, +static struct go_cfg_attr cal_joy_right =3D { SET_JOYSTICK_CFG }; +LEGO_CAL_DEVICE_ATTR(cal_joy_right, "calibrate_joystick", JOYSTICK_CALIBRA= TE, RIGHT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_joy_right_index, "calibrate_joystick_index= "); =20 -static struct go_cfg_attr cal_gyro_right =3D { GYRO_CALIBRATE }; -LEGO_CAL_DEVICE_ATTR(cal_gyro_right, "calibrate_gyro", SET_GYRO_CFG, +static struct go_cfg_attr cal_gyro_right =3D { SET_GYRO_CFG }; +LEGO_CAL_DEVICE_ATTR(cal_gyro_right, "calibrate_gyro", GYRO_CALIBRATE, RIGHT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_gyro_right_index, "calibrate_gyro_index"); =20 --=20 2.55.0 From nobody Sat Sep 26 13:07:53 2026 Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 874BE365A02 for ; Tue, 1 Sep 2026 06:36:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244583; cv=none; b=du2p9s78orpyFjDkhVrAx2LLV3jm14xIuPZFuaEhq5cgdW/DlAVpWlGxE4yhNisskEpMZn+4NHn0LLxi6g6C1GsteexZOfJnFgT5SIJhYVo+tMuP1XpQHJqrr9uKj8Ix9ORJfVq6c6oDQPd2x+rBAImXnnDp74EjtNB9wXBfmcM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244583; c=relaxed/simple; bh=aEjxZJwZLa+q7K9xSjUy2o9VFRy7tyW3hxCACheKEzQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VMPIU6Pl54d/RIb7njfygZ89P9mqknfTEQxWu9MoOmMv4gu2SX0RPIHE6R1yn7qm2mclyEuw0QsYIxOLGng8BP52oP/PCMTiPXCRfATPCz4i5jc2cHZgW4bxTJs10ctUiktCIIZhfLQL6eDnDDHGJux+it8hbO4qfo8UxzbL0zU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LW0/eV0G; arc=none smtp.client-ip=209.85.216.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LW0/eV0G" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-38a0c7e841fso924318a91.2 for ; Mon, 31 Aug 2026 23:36:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788244582; x=1788849382; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xWOAHh0q81CutOvcz4kXnkwApjt4e2WZQIvquKf0gdA=; b=LW0/eV0GCjU5Q7Eegs7cRAqdww3dwYBE4QHdHXYHGB/jHl46hpsLwRe24TXaikARaK 7CokcoxkzO0uFk1arXsaLSiIK9wrWANM7+gNNkGjNihkUG0ORthzofRyGnLLiZm4k7eT Opj4ooTqYc6h0mNR0rrKLmA0EqsdgJC/Lv7tz8iR4tD3LJx1YxYhjSMKg0WE6NmRrD5T ify/7M91krvUx/TAGIAw47SnAeWQ5YmGv6805gsYxFbuWGDr5Dro4GGuKwCO0TmCAXeK 2PauxsYQMIQVOv02/6Yym03Qid8gLhYFWTFZ3BYWwfAkDqUAvfxTBmKIyQXvDL//H2ud FD0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788244582; x=1788849382; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=xWOAHh0q81CutOvcz4kXnkwApjt4e2WZQIvquKf0gdA=; b=VIphiRp3kMnv/CJuXoswN/ixYxUGyjozc5drW1DXxBqPVfAPDk0D/a8jTap8UECBjk TyCBZqukrX1Ey/edXj/RRupBwCGbEucWJKbrqNont22sfMZ2PWaCM8jIf034F42lWF3i ajXbCSjiRUmX2xjssN/klb5au829GaW/wwqaORllPLg+wcSzgPceyQo2rE9bu68qSoUQ HbtAzyuYFDqUZQ+S2JFCh+orwFD1DVFO0D0DmYi1PFX5GXvWsjGL+P4oLNGJQfTvo+8F 6Bnv5D/KkAMKA7nduYpXZUnbT5e57B0X1gGfUY1KId422HZJeDbHDiFrmjzbMnrE98OO lIFw== X-Forwarded-Encrypted: i=1; AKwUvBwvsM/4iA52biv2ug51U2K8s7UkrPvDhPPrn8RRLKoS8TDE7xcB54LRWd4NSuaKqnxoz31djAwu/C600iU=@vger.kernel.org X-Gm-Message-State: AFuF++mYXNFozVoG+lqPW2btcgLlA+KwDWS+wBlpzuGdc6gEBEGmYg89 wa4TdHSwbCtaWuCQ07GspHSZUwWiPLa8KnDQTKVG9sQBVQvjIEi1eI31 X-Gm-Gg: AYBFou3QQsVFSGGrLU7FzzL+BmEv3RCtO3UFpaf9keDzEIt/WhnyT+DmOprdidpHcRd AwOPrvUrg2qrAd5Rlc0gzxI87EecYkdQC8UXdCFSkz+KuHXtoYOju/nAU3HQ8Ouvaq4B8GEV2ka BgV9VNvkLLXOjCowiRzbo+ZsdLujwX//GqUfkyVKXVQZ//CIbShTNN5UO6vgMtKxidt1gop+VdD NlfzCIACQhwDk/swsw37mLrK75yxw55LRPOVdT2s4YKEl8O8aTZl9B0r7i6Y0P9/XCTVNpM5hfU zaV3CZqtyalnYKJNxUZLXdqYQbvPlNx37K+2+tOTTo/wlsWHHamRxFDXEi8Kma0sQW2ZjBWGEuv qATunN+yRMXkK+97tsStaB9JoqfYQ0g+5HfORzxYQ0EtGNue91DC9QCWytnHnwJ3j/o8ZXKQiYW cpRyal/+zDRUtNC9902HiQ5k5QdBE/eyP6Wuaa/49F8xMtgcv3S904woQjYixhAm4T5CKgBFgpY bi0nnpaxzsgUIWT3wNhgTCb X-Received: by 2002:a17:90b:164b:b0:38e:4f41:83df with SMTP id 98e67ed59e1d1-396d1007e54mr46589908a91.15.1788244581535; Mon, 31 Aug 2026 23:36:21 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.192]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0dc854dsm32694425c88.10.2026.08.31.23.36.18 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 23:36:20 -0700 (PDT) From: Aditya Dash To: Benjamin Tissoires , "Derek J. Clark" , Jiri Kosina , Mark Pearson Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/7] HID: hid-lenovo-go: use the right controller selectors Date: Tue, 1 Sep 2026 12:06:03 +0530 Message-ID: X-Mailer: git-send-email 2.55.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The right imu_enabled attribute selects FEATURE_IMU_BYPASS, and the right reset attribute targets the left controller. Select FEATURE_IMU_ENABLE for the right imu_enabled attribute. Target the right controller for a right reset. Fixes: 82cd9bc866e1 ("HID: hid-lenovo-go: Add Feature Status Attributes") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash Reviewed-by: Derek J. Clark Tested-by: Derek J. Clark --- drivers/hid/hid-lenovo-go.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index b8248bf8965c..b937d11dd6f6 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -1999,13 +1999,13 @@ LEGO_DEVICE_ATTR_RW(imu_bypass_right, "imu_bypass_e= nabled", RIGHT_CONTROLLER, index, feature_status); static DEVICE_ATTR_RO_NAMED(imu_bypass_right_index, "imu_bypass_enabled_in= dex"); =20 -static struct go_cfg_attr imu_enabled_right =3D { FEATURE_IMU_BYPASS }; +static struct go_cfg_attr imu_enabled_right =3D { FEATURE_IMU_ENABLE }; LEGO_DEVICE_ATTR_RW(imu_enabled_right, "imu_enabled", RIGHT_CONTROLLER, in= dex, feature_status); static DEVICE_ATTR_RO_NAMED(imu_enabled_right_index, "imu_enabled_index"); =20 static struct go_cfg_attr reset_right =3D { FEATURE_RESET_GAMEPAD }; -LEGO_DEVICE_ATTR_WO(reset_right, "reset", LEFT_CONTROLLER, feature_status); +LEGO_DEVICE_ATTR_WO(reset_right, "reset", RIGHT_CONTROLLER, feature_status= ); =20 static struct go_cfg_attr rumble_mode_right =3D { RUMBLE_MODE }; LEGO_DEVICE_ATTR_RW(rumble_mode_right, "rumble_mode", RIGHT_CONTROLLER, in= dex, --=20 2.55.0 From nobody Sat Sep 26 13:07:53 2026 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B9652372B2B for ; Tue, 1 Sep 2026 06:36:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244587; cv=none; b=PuLx86Yyqai9uWWLMGLcbcRQAf9Mas/iwNmqEkaJKxaIYp4+XjyQoye6cB+JDdUo1XenGg7asj2TpibbIYFSmLbPrt7X75jrOqj20KvEpiZaqUGsbcGEf38JNDXPkKJVRt06+GG4jbVsGy/O6A6mIffp5QueMduz+FF7D62yr/s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244587; c=relaxed/simple; bh=UPqoKv2odN2alKdKmCDWKQEX8FGs9CSOoE0x0PikD4w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gX9haw5hsSttBJ/80TpV0wcLqXiR1uEc70p9O4XlTHbClU5k1ALhId4hempt58s5o34olIyAdbfOQQBDYehbYz9jqRBhpKEj1cij8ojKBOwQ/6wmYQlFpB0qwifgukVhuzyK+y+/Cee3do6YKIYUA0bctYZ4XIqqZfAVapOmuS0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=L8srwwIS; arc=none smtp.client-ip=209.85.216.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="L8srwwIS" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-39647aa9d52so812885a91.0 for ; Mon, 31 Aug 2026 23:36:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788244585; x=1788849385; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=AWXzOdnKhbhpWmdwzC3tIWpczbOSi2dbzs4RTvDwpr0=; b=L8srwwISH37UTbJRP+eTmv5yFlTxRWqkozQ6Yas4sKgbkXEm1cNlwyygCtiA5CGyZh Q/CgkNxgMk7XNkemi4Lc9Df/bkR/spg0se4KsvqlhlXHH/Ck17jO3pNi0QTcWGyR0Pda 727AepTQtuflUFOYFf9g65dS2tDQzQ5H8wDUmKDPrIYhS9s3IjW+z4z/F6VzaZeW52UY Tsy5DKKsAq3YFl7d1GMCRwDHcp/0GvpTTmv9l9dVHK8bjExtVqWkUEn/dxS2C5NWpeCq 8r2lr9BTf/VV9TRsn8RHdef4f2o3obysYOeXrO0x4NxymIlkaBvP21CoqiaySKrO6Lp8 gRVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788244585; x=1788849385; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=AWXzOdnKhbhpWmdwzC3tIWpczbOSi2dbzs4RTvDwpr0=; b=jycRSU86uXahzEn+0IRrc+CHShf0CEqA+wJhXmzYEw4NNwXStu0dMZ12/S0pEazJ3o YIvIudryiCKHB87AHiIATmkH92p0X2XtD4jWLrSU7JH6ivoynqvCr41g3rXxruRPgGFu wevCGdWdq3zXAa/+8Bx5vbpx71yIAD4utH9vNiGROqWdsraouO2bUbLuhzbqNoqtMISg k3qj48F7W3Uk+300JVvojGjFL/tUaNIBxsoq2it4Xd/r1II6djLh+qvqhdYiZ/jpnskm l2r/KXPtaqNzGImWtrNrBny4sLI4bS2l28p9KYGE/pWVzkF40jLsEZwmBg1fyyQkXb4s 4bow== X-Forwarded-Encrypted: i=1; AKwUvBwIMLIvOZwZOuN5SbWiEqGdQ3AD7xzlCHuiJQftgIhOYOrQx21L2qpzSkcreolPCVAqJPmB4hb1s8iabqI=@vger.kernel.org X-Gm-Message-State: AFuF++l3U4D5tZXdVHRif16MpIsVlb1uJYa9eHqZLnxOuDrzu8qyqE54 20zczhm9ObHd1eDMefXARH2MZzeExwYL7op0EHy8+pa22nm+oy/RzBOQ X-Gm-Gg: AYBFou3bDGjf3viBBkRn1edE571Mn3qntpUqtnCArt+MJSgL805HS1eWvVAH1shaNDS 3qPPm2YHIn2tkr2B0lOyBcqY8H3qp195aCFIhspVEwFBYHpcJxf264PczaxXeJzYQ6PXH4t6z1/ Z4czPXZCKnKhqsVxrI0JxneujTzKe7mAyyIMDgd9VLfmleejUPtPvQZYSA8Q7lutw3rwOKG5CaJ n7GiPefw/5u812tyGqTx2wBMu57+wePeLAJ9RKPJb3VdrdSHkCwX/9GtpBZ9yKH1/GZmxfga92S 8SCtAE9jJPRSZt9cu8uL3NdkHcwNBRVO2QRYa/GN7wEnX0I8lzATKNz2RY10RzDkH2koWcUTw0m jR4lY1qn94rgqZPwFoELFwWUw+1baIcgovKj5I9KdcEJNo3ZZ31qPn0HqvfzRXSkRFuEu9+ree3 3/eqWMLZzkCt2ZNN/JOYesxjrbZgGFkZ+l64zpB8Iwj6xhLrnSfmpIoBU6zxj+HTMzekiI4FvKC 1IuwP/82KttXA== X-Received: by 2002:a17:90b:51c8:b0:394:ed5c:ff9f with SMTP id 98e67ed59e1d1-3990f890efamr3798410a91.17.1788244584948; Mon, 31 Aug 2026 23:36:24 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.192]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0dc854dsm32694425c88.10.2026.08.31.23.36.21 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 23:36:24 -0700 (PDT) From: Aditya Dash To: Benjamin Tissoires , "Derek J. Clark" , Jiri Kosina , Mark Pearson Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 3/7] HID: hid-lenovo-go: initialize command completion before hardware Date: Tue, 1 Sep 2026 12:06:04 +0530 Message-ID: <2421c0ebbe4a487acb20317d03e581b3438e4471.1788222001.git.mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The configuration interface initializes its command completion in cfg_probe(). The hardware starts and opens before this call. Keep the completion ready before hardware I/O becomes available. Identify the interface after parsing it. Initialize the completion for the configuration interface before starting and opening HID hardware. Keep the remaining configuration setup in cfg_probe(). Fixes: d69ccfcbc955 ("HID: hid-lenovo-go: Add Lenovo Legion Go Series HID D= river") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash --- drivers/hid/hid-lenovo-go.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index b937d11dd6f6..51e3112780e1 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -2388,8 +2388,6 @@ static int hid_go_cfg_probe(struct hid_device *hdev, =20 drvdata.led_cdev =3D &go_cdev_rgb.led_cdev; =20 - init_completion(&drvdata.send_cmd_complete); - /* Executing calls prior to returning from probe will lock the MCU. Sched= ule * initial data call after probe has completed and MCU can accept calls. */ @@ -2436,6 +2434,10 @@ static int hid_go_probe(struct hid_device *hdev, con= st struct hid_device_id *id) return ret; } =20 + ep =3D get_endpoint_address(hdev); + if (ep =3D=3D GO_GP_INTF_IN) + init_completion(&drvdata.send_cmd_complete); + ret =3D hid_hw_start(hdev, HID_CONNECT_DEFAULT); if (ret) { hid_err(hdev, "Failed to start HID device\n"); @@ -2449,7 +2451,6 @@ static int hid_go_probe(struct hid_device *hdev, cons= t struct hid_device_id *id) return ret; } =20 - ep =3D get_endpoint_address(hdev); if (ep !=3D GO_GP_INTF_IN) { dev_dbg(&hdev->dev, "Started interface %x as generic HID device\n", ep); return 0; --=20 2.55.0 From nobody Sat Sep 26 13:07:53 2026 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 821CC365A02 for ; Tue, 1 Sep 2026 06:36:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244592; cv=none; b=YvrfqTTnaHgLf34BIZGJRTih1jxy6ctlecq/jGWo1uHynnBfqASjSead7xBuUYCqMMtY2HTyFvJFoT2+yuewI3cft0QLiMi1/b4efJnxwrHTc36Uozu9vDTJIgWTc4qfxs4TbWnEajY2ojp2soy3f8xM5aeqn7k6ULWGSPoiT5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244592; c=relaxed/simple; bh=OK66Pj7nY5BbXH42rp4i9E2XMj8PlRkGTHWhbDbet0g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OYdWOEYTdWOpyhhr8X1FQflzBOvx8W9PzGi5wsFTIOSij5e82VHLjLs4ZQ3uNbRVRU2u7j8cW4pVvCbFaYV4wvUeJ/XfgSyuHkhB0SsOoiO1AiU435FLtQTyIQPqcfXb6aRDsEsZE6WGpRSgKh2PcYjuadtdSF94vrUIuvfg0l0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FEkJ3E/6; arc=none smtp.client-ip=209.85.215.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FEkJ3E/6" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-cc1d57602e8so4242465a12.3 for ; Mon, 31 Aug 2026 23:36:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788244589; x=1788849389; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=++ydc5oOA7Xjdiv/75GclRci10VVs2LubMQfzql8oQk=; b=FEkJ3E/6vjWDPiifd5GvJDXdxAcgXfVkTRF990he4IEFgzSk6QRImz4udeXWcdHBox LZgw2Cv56XGekrC09JMvXUJf/J0AQV25jA/0ZIAxsz/QyBxzcnnCROGQhOB/DgW68XKn xnnmwrcHOJiiuKYSvKhq4psduX051La9l4twKYnzrFg4YeRJZUP4Swj+CA9digB6DukV y8osC8I2bj3IcaRw1eUpxsPc4JcryHuicCYcrlmyp3ku22pOFgWNCurOesEhzzf6gtZg MdfXf8pNncn+E3JOQummaOHHzzNp1l4+0canCUQWs7d2LOr3SXUoiQ6oTXvl/9CqTqxb oKzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788244589; x=1788849389; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=++ydc5oOA7Xjdiv/75GclRci10VVs2LubMQfzql8oQk=; b=P8nSbp/X5JKPNysaBRZmlYoxwHZagpDIYzXQ3UgaKQZ1+jcTkEloTg5BMEkipyMERx UySqPixoMa66IUjkZQunT5FjlrN7SX4sV02zBbLRbhBQHIfIDGfNS+HZ6aXSnJj/GnbL JJwo17gvIoTbVUU/wIlCLTn1G3OW+2UN9BLtWKQxFxzG88dw3Ztgysg36junC1Chjmy1 CNKMUTapo9kR22+OzkTEg6yeApX6aJk//EfLHufHwViFuLZEtff7KZm5o/bmayFNEUZg h4sEUwsGHsZCi9pwI4Hu8j9m2i2j9qgzvqM8bFma3t+6SZgfFIo5nVRRfju5aV1spSMs G0tw== X-Forwarded-Encrypted: i=1; AKwUvBxX/c6uHXk1UlGg9+6jeIcRQuqfr/2bGjryFK6F6U8FO92JXuI8720Mb78jBnqtiefeRkRLU+OZa88urUQ=@vger.kernel.org X-Gm-Message-State: AFuF++kCp61rPowwe/u3HiqsAn6II/kajGj8weLowivTD9n465TIYSXa qCcS/kOzF8u5BzCGJtsQlWhSP2bJKeB5pr3yO/VkOmmuKdf4x4sQRDPK X-Gm-Gg: AYBFou1ScPGD4hRqHaLs/5B0atmgtxgDrllv/IWSi2+CYi5+/CbLm4m+JEFF0YvVlEr GP8PvCVO3vP/EerL5Or82QVxFWj2H4Y+d2cNMFDR1Tqurk3PsFS/zbFS17PM+qJHbps3OJ0cYnI 4+nwFbXFm8veixBkIjZYwKHWfs+UuAEIQ/BTfAsaB/KJ2DKrHJROznqcAVN0KxJzHqf59+1vvva BlBF0libA+wHIWSRRWZYgFxUksNSf/Ml6VvRFNKHfZnwHu8CwD9f8kqbC8qxsm7R+xdOaTTf+eN g7guviHkdGjMdkAJ+ow+YX+Z3PuZYS85x+sSk0DUkaI2RYMxbAeYxGCk/u8iuLUrjqGXyRn8FwY csPXFGBBcud4bGqxSYNZY6XJ2zzD3J9SIqTStThFi5OQG5tgUqB9VNgWxaieFnMn7RQkyJS0jWv ERATtigtF5YhWHazQnyftn79VIUOGZBennuXn5nE+hMLyy/0ZMqxC7SzNAygm9p6h4wbH2zYiz7 UudJtpXhmunzw== X-Received: by 2002:a17:90b:4c8a:b0:398:dcfe:967a with SMTP id 98e67ed59e1d1-398dcfe9ebfmr15735500a91.17.1788244588820; Mon, 31 Aug 2026 23:36:28 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.192]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0dc854dsm32694425c88.10.2026.08.31.23.36.25 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 23:36:28 -0700 (PDT) From: Aditya Dash To: Benjamin Tissoires , "Derek J. Clark" , Jiri Kosina , Mark Pearson Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 4/7] HID: hid-lenovo-go: return configuration request errors Date: Tue, 1 Sep 2026 12:06:05 +0530 Message-ID: <28ecf20c7406e9416d38bac1e7b89ac796b39a59.1788222001.git.mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Any decoded configuration reply completes the shared completion. The driver also ignores the result of its interruptible wait. An unrelated reply, a firmware error, an interrupted wait, or a timeout can therefore be reported as success. Add pending command state to the driver data. Match replies by command ID, command, sub-command, and device, and return request errors to the caller. Clear the pending request after an interruption or timeout so a late reply cannot replace that result. Keep the existing 50 ms wait for every configuration request. Corrected calibration requests on an Original Legion Go received their matching SET replies within 8 ms. The final calibration result remains asynchronous. The firmware has no sequence number. A late reply with the same tuple can still match a newer request. Fixes: d69ccfcbc955 ("HID: hid-lenovo-go: Add Lenovo Legion Go Series HID D= river") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash --- drivers/hid/hid-lenovo-go.c | 109 +++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 21 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index 51e3112780e1..deed7acd2dc4 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -31,13 +32,27 @@ #include "hid-ids.h" =20 #define GO_GP_INTF_IN 0x83 +#define GO_INPUT_REPORT_ID 0x04 #define GO_OUTPUT_REPORT_ID 0x05 #define GO_GP_RESET_SUCCESS 0x01 #define GO_PACKET_SIZE 64 +#define GO_COMMAND_TIMEOUT_MS 50 + +/* Lenovo replies identify a command and a sub-command, but have no sequen= ce. */ +struct hid_go_cmd { + struct completion done; + spinlock_t lock; /* protects fields below */ + bool pending; + u8 id; + u8 command; + u8 sub_command; + u8 device; + int result; +}; =20 static struct hid_go_cfg { struct delayed_work go_cfg_setup; - struct completion send_cmd_complete; + struct hid_go_cmd cmd; struct led_classdev *led_cdev; struct hid_device *hdev; struct mutex cfg_mutex; /*ensure single synchronous output report*/ @@ -331,6 +346,62 @@ static const char *const os_mode_text[] =3D { [LINUX] =3D "linux", }; =20 +static void hid_go_cmd_arm(u8 id, u8 command, u8 sub_command, u8 device) +{ + guard(spinlock_irqsave)(&drvdata.cmd.lock); + + reinit_completion(&drvdata.cmd.done); + drvdata.cmd.pending =3D true; + drvdata.cmd.id =3D id; + drvdata.cmd.command =3D command; + drvdata.cmd.sub_command =3D sub_command; + drvdata.cmd.device =3D device; +} + +static void hid_go_cmd_consume(const struct command_report *cmd_rep, int r= esult) +{ + guard(spinlock_irqsave)(&drvdata.cmd.lock); + + if (drvdata.cmd.pending && cmd_rep->id =3D=3D drvdata.cmd.id && + cmd_rep->cmd =3D=3D drvdata.cmd.command && + cmd_rep->sub_cmd =3D=3D drvdata.cmd.sub_command && + cmd_rep->device_type =3D=3D drvdata.cmd.device) { + drvdata.cmd.pending =3D false; + drvdata.cmd.result =3D result; + complete(&drvdata.cmd.done); + } +} + +static int hid_go_cmd_finish(long wait_result) +{ + guard(spinlock_irqsave)(&drvdata.cmd.lock); + + if (wait_result <=3D 0) { + drvdata.cmd.pending =3D false; + return wait_result < 0 ? wait_result : -ETIMEDOUT; + } + + return drvdata.cmd.result; +} + +static int hid_go_cmd_cancel(int result) +{ + guard(spinlock_irqsave)(&drvdata.cmd.lock); + + drvdata.cmd.pending =3D false; + return result; +} + +static int hid_go_send_output_report(struct hid_device *hdev, u8 *packet) +{ + int ret; + + ret =3D hid_hw_output_report(hdev, packet, GO_PACKET_SIZE); + if (ret < 0) + return ret; + return ret =3D=3D GO_PACKET_SIZE ? 0 : -EINVAL; +} + static int hid_go_version_event(struct command_report *cmd_rep) { switch (cmd_rep->sub_cmd) { @@ -654,7 +725,7 @@ static int hid_go_raw_event(struct hid_device *hdev, st= ruct hid_report *report, struct command_report *cmd_rep; int ep, ret; =20 - if (size !=3D GO_PACKET_SIZE) + if (size !=3D GO_PACKET_SIZE || data[0] !=3D GO_INPUT_REPORT_ID) goto passthrough; =20 ep =3D get_endpoint_address(hdev); @@ -707,7 +778,7 @@ static int hid_go_raw_event(struct hid_device *hdev, st= ruct hid_report *report, dev_dbg(&hdev->dev, "Rx data as raw input report: [%*ph]\n", GO_PACKET_SIZE, data); =20 - complete(&drvdata.send_cmd_complete); + hid_go_cmd_consume(cmd_rep, ret); return ret; =20 passthrough: @@ -722,7 +793,8 @@ static int mcu_property_out(struct hid_device *hdev, u8= id, u8 command, unsigned char *dmabuf __free(kfree) =3D NULL; u8 header[] =3D { GO_OUTPUT_REPORT_ID, id, command, index, device }; size_t header_size =3D ARRAY_SIZE(header); - int timeout =3D 50; + unsigned long timeout =3D msecs_to_jiffies(GO_COMMAND_TIMEOUT_MS); + long wait_result; int ret; =20 if (header_size + len > GO_PACKET_SIZE) @@ -740,22 +812,14 @@ static int mcu_property_out(struct hid_device *hdev, = u8 id, u8 command, dev_dbg(&hdev->dev, "Send data as raw output report: [%*ph]\n", GO_PACKET_SIZE, dmabuf); =20 - ret =3D hid_hw_output_report(hdev, dmabuf, GO_PACKET_SIZE); - if (ret < 0) - return ret; - - ret =3D ret =3D=3D GO_PACKET_SIZE ? 0 : -EINVAL; + hid_go_cmd_arm(id, command, index, device); + ret =3D hid_go_send_output_report(hdev, dmabuf); if (ret) - return ret; - - ret =3D wait_for_completion_interruptible_timeout(&drvdata.send_cmd_compl= ete, - msecs_to_jiffies(timeout)); - - if (ret =3D=3D 0) /* timeout occurred */ - ret =3D -EBUSY; + return hid_go_cmd_cancel(ret); =20 - reinit_completion(&drvdata.send_cmd_complete); - return 0; + wait_result =3D wait_for_completion_interruptible_timeout(&drvdata.cmd.do= ne, + timeout); + return hid_go_cmd_finish(wait_result); } =20 static ssize_t version_show(struct device *dev, struct device_attribute *a= ttr, @@ -2362,9 +2426,9 @@ static int hid_go_cfg_probe(struct hid_device *hdev, if (!buf) return -ENOMEM; =20 + mutex_init(&drvdata.cfg_mutex); hid_set_drvdata(hdev, &drvdata); drvdata.hdev =3D hdev; - mutex_init(&drvdata.cfg_mutex); =20 ret =3D sysfs_create_groups(&hdev->dev.kobj, top_level_attr_groups); if (ret) { @@ -2435,8 +2499,11 @@ static int hid_go_probe(struct hid_device *hdev, con= st struct hid_device_id *id) } =20 ep =3D get_endpoint_address(hdev); - if (ep =3D=3D GO_GP_INTF_IN) - init_completion(&drvdata.send_cmd_complete); + if (ep =3D=3D GO_GP_INTF_IN) { + init_completion(&drvdata.cmd.done); + spin_lock_init(&drvdata.cmd.lock); + drvdata.cmd.pending =3D false; + } =20 ret =3D hid_hw_start(hdev, HID_CONNECT_DEFAULT); if (ret) { --=20 2.55.0 From nobody Sat Sep 26 13:07:53 2026 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2BE6937EFEE for ; Tue, 1 Sep 2026 06:36:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244594; cv=none; b=Sy4sJhbs4ZTg23NTd7sQ4kuaFK/vpuyyxMN2rMBmC/anj68gRor/SFJl/WxUf20wI17XTXSpqEhkUxtrmgN35+zkZNbS9yZJTJbvJqGCZzWTubmCVbJ2r6Aby9QjchFaNJi2xsKjzPqW9PZDZbTXKcCiH1OT6Fhu+89qy4D+l/8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244594; c=relaxed/simple; bh=jp1mxh4u0k5EkhsGC+WkntxjcMOROSMx+LhpJ5PkGTc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ry8gyZssWmG4d9DU20rbJL42L3ou3+vEPimsTgMgVtPDOs7UueO+YwMzM6CobQVmauOZkytKQfXFpT5ne75gIPxGDqO8i3WNvW6YYTG+b65561q7OFueZiIzmzs0NND+ZuH2e/IYMTEAAUMh3Uox6oA6teUuozhA9eEurNic99I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PrRM9oaO; arc=none smtp.client-ip=209.85.216.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PrRM9oaO" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-3966791a6eeso5326009a91.3 for ; Mon, 31 Aug 2026 23:36:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788244592; x=1788849392; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=daPhvcx3JqOGViV9zMVaZQKBED8orEBgOrh4gs4v0qM=; b=PrRM9oaOD5oibbwf4boNBo6qcrkcXXq4jFqPpvjpgz1wZDdRmVru618TzQffasaUxb eaSuap16qutCl6uY7AalIBEQ8uypSfm8XluG6jsBsdyvBasPwX4Mfnyic/F0y2a2yesT vpnHeDEvMRfe+PIVtwtWTAwnFhMjWQ2KvOvoeianbltbMA7ux/Fh25hecUltdHWJzr4J AzwUjp3T+auuaHjxlFLZo0mHS1NJMkh0Nm8yzgCJkkjCQ9WMaiAFLETlE3ABi54Lq3q+ QOWhSsZPQwqaHqkwkUpLuCDdiXbcQEz5zai9t4d3uUslHOZ/rRNwvZZhViuj2LqHzXlM 7PbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788244592; x=1788849392; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=daPhvcx3JqOGViV9zMVaZQKBED8orEBgOrh4gs4v0qM=; b=HcSGWG/0jwuE11Rserp1EqW77WC031zq2VTwRY1F4Tmzgv0IP6HRixveB3gdHKDxkR Bdaz2vlf7E1VPLi8/1Srys7nkMQsx+lrF9IGOZTiY+EAe8P5lmKuJmARd3mJL0YYx4G7 BEIRAHELNwahil3hXPRgCvh6eMMwRQuAdZpnvgSMqcnV5x3+tDH52lCsKYBi+sN5rgjo drVyEVCaQ5bRWwq3nMtFL7ID63B9ejuss11qFmkoG11x/r1TL8mzH8h12a9ke8k1OVMh FnBVEL6bntZzuHwNupyxTkH4NXCEzLmBJY0YEmbdr5Z+NV0ac3Rtj3Jw/yEF48rUO2zX h4gw== X-Forwarded-Encrypted: i=1; AKwUvBxhbxAWOyhmLeWero+1kUFMWyIn+fwHv8RIs0abgOMD+J1/CBkZd3EDL9o77QCfN1QI51qjrY0vBMASPzM=@vger.kernel.org X-Gm-Message-State: AFuF++nyfrV/v/UPpQqUIGFOtW06m0Ur+oPdg4J0UgOoIag9Y+glir1l iOyWDNkWw9MF+J1bT/LQ2H8zxfxBINYOOX9c8ZHYuWIiayvvT3h67DFk X-Gm-Gg: AYBFou0DmUG2uXeBlWzSK0avlNM1GabQAE5TflwHmLSVwUIPMDFKdEZ6crum8vXxWlm CBzPk5uK6aCLioa1ZwoBXuAWqCi881UFAFYAYDwEXmuyS7/ZzimDpDwA6MyuSt4u/TPA9t5ofgw akaHN+tPENLovesg5o8uQLVsjus2gFsF07e6ib2C/Q9aGkMfhrykpEdLaAgDVyq8xEhK5hnQGuI qh6i39BcZZK1WPsRtBzW8YZy5FJsQIP5MUl4C6Eqlh8lntTyfCNqMXpsHIfETgbwCaG4yC/VzPb lPryV/4wjNPpxqKISbRAqxLeOqoD+ErY4+vIO8CkvuHYu1N7mCT/YJQymXAhm26esUQEm3ZfC2K AWOHDDjTCQgdsPKmCr6djyK6E5KTHBtqpwEDv9zuBSTajV+wc2h+1n2gdYhRvN7UtUkalfz1tAg U5nwOVwxstRi1A1yH6a5EKcxNLWa6SD/mCQBxJSScne/wD2kJE5gZhUt9Iy+BjA6PF7Vk49fOUP 611Hu+GI7oFqg== X-Received: by 2002:a17:90b:2e48:b0:398:e969:87ef with SMTP id 98e67ed59e1d1-39907ec6baamr9076075a91.24.1788244592502; Mon, 31 Aug 2026 23:36:32 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.192]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0dc854dsm32694425c88.10.2026.08.31.23.36.29 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 23:36:31 -0700 (PDT) From: Aditya Dash To: Benjamin Tissoires , "Derek J. Clark" , Jiri Kosina , Mark Pearson Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 5/7] HID: hid-lenovo-go: normalize calibration failure status Date: Tue, 1 Sep 2026 12:06:06 +0530 Message-ID: <49b6e07395d2fe555e844758bd8ccf34ac0cbf0c.1788222001.git.mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The driver stores the firmware result byte as an index into the calibration status text. A Legion Go 1 returned 0x08 after an idle Stop. The status table has only three entries, so a later read returns -EINVAL. Keep the defined values 0x00 through 0x02. Treat larger result values as failure before storing them. Fixes: 995887a10da1 ("HID: hid-lenovo-go: Add Calibration Settings") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash --- drivers/hid/hid-lenovo-go.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index deed7acd2dc4..59b457683357 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -648,17 +648,22 @@ static int hid_go_light_event(struct command_report *= cmd_rep) =20 static int hid_go_device_status_event(struct command_report *cmd_rep) { + u8 status =3D cmd_rep->data[1]; + + if (status > CAL_STAT_FAILURE) + status =3D CAL_STAT_FAILURE; + switch (cmd_rep->device_type) { case LEFT_CONTROLLER: switch (cmd_rep->data[0]) { case CALDEV_GYROSCOPE: - drvdata.gp_left_gyro_cal_status =3D cmd_rep->data[1]; + drvdata.gp_left_gyro_cal_status =3D status; return 0; case CALDEV_JOYSTICK: - drvdata.gp_left_joy_cal_status =3D cmd_rep->data[1]; + drvdata.gp_left_joy_cal_status =3D status; return 0; case CALDEV_TRIGGER: - drvdata.gp_left_trigg_cal_status =3D cmd_rep->data[1]; + drvdata.gp_left_trigg_cal_status =3D status; return 0; default: return -EINVAL; @@ -667,13 +672,13 @@ static int hid_go_device_status_event(struct command_= report *cmd_rep) case RIGHT_CONTROLLER: switch (cmd_rep->data[0]) { case CALDEV_GYROSCOPE: - drvdata.gp_right_gyro_cal_status =3D cmd_rep->data[1]; + drvdata.gp_right_gyro_cal_status =3D status; return 0; case CALDEV_JOYSTICK: - drvdata.gp_right_joy_cal_status =3D cmd_rep->data[1]; + drvdata.gp_right_joy_cal_status =3D status; return 0; case CALDEV_TRIGGER: - drvdata.gp_right_trigg_cal_status =3D cmd_rep->data[1]; + drvdata.gp_right_trigg_cal_status =3D status; return 0; default: return -EINVAL; --=20 2.55.0 From nobody Sat Sep 26 13:07:53 2026 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EA02E20D4F0 for ; Tue, 1 Sep 2026 06:36:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244598; cv=none; b=urqVwxTvgWCqwDDqeaaNsbdyvznYuKqfdl9l3ogsGHtrqf6Pzk3khG09CdtyteGSsx/SH/7iirJH5iPhGJSKqIcbepj3FK2QYzqHotKuFu2yuBG1Xr97zUQGyd3OfgjNHUPPO9aUSpP9tFEjDgZ2m2qr+rCf+qOf3u4MdXuFEWE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244598; c=relaxed/simple; bh=5ElyCADy86YGx8LmfNKyKR9rlYrYoGai5Bk7t6+Z1uU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=J1LVYB0iVISgVJ0Mx/eoyvuoPzAO4Ye1XLko5Zl31rMZ1uA83dbB/QfpY3R4aFIpfkPhj7PICFb6Bk0ZSogEXBb/nFDQFkeGpiZLA0dsYN7Ve4Mieune0rnd70ZGKhHv1AqRPl/zrRb0oBp1X7tVC1YNzMHuRjUfjW9fhk/iqqU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=a4BUXm0k; arc=none smtp.client-ip=209.85.215.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="a4BUXm0k" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-c9b373d5af0so3518422a12.2 for ; Mon, 31 Aug 2026 23:36:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788244596; x=1788849396; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xYHq+ZU5PMyiId4alqJVSCjs93dNyfWLqqb7EGDh7Zo=; b=a4BUXm0khJ3tMsvLHtPNaAregRJaCGoCReO3aeaQKT24194QrsN4zpDjT2FEdA3BTA aTRUc6oOrUD8aKT3S4zV75LXt20rQvZ5pwCzQuDbDtsXxakXHZKLCiEc8ZnuSJX03C4Z YnJO5IGSlRXOt17NX3o2YrL7WNrHb5KgnjeckVQLszwWeyGfmrcd5Qwz6wRjS5NapIhn mxLfkrN30zaEr3MnXhywrgcu6ccoeBqSOCtYCN6DHqp8+rniV/x3juFkDXK+hdmmKP2N KNAt+5XmXheGIlXl8m+qsko/VDLUxYwES20HEWFYHjWQyiD5tJrTQDaxndJef1NLh3xZ HrMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788244596; x=1788849396; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=xYHq+ZU5PMyiId4alqJVSCjs93dNyfWLqqb7EGDh7Zo=; b=AHujEOBnAif4AkNo2iHTuDWoYw5Bat8XvzIrI7IBqlcqfnJ/m4f8mpIkua6FCbd45H CWQCjwErTGZx7+Kllga5WlOGE2ICUKx7B0S6PuMrg4Ely2xFrGAGr613Z+tARbNweoHj DGFC+f9p1AmHHOgqwHGDXf1TiCeVtwlcfXEztPlL8LOO3kYVOcW/rJIGqSOzmazWppRx CyM+97EpbMmW7FzRbCE9Tu58vPSOGx3kjkFoO5t+L0ORJkwuSGUjXReNNY7BcqogzKKa E3PyS7Sp6hh3m6Lgj01ULgPgESvRubCrTpjo9RVUONxx5gIpIWdPz2CBWk1zjHRqSSKm eVPg== X-Forwarded-Encrypted: i=1; AHgh+RpkXVPxPDKy7v8Grq7+Lh8KfcpufF4lpi7wnHACJX99/1jRUMEAF1AbyIk0vbV71sw2/sjrhj+ViMX32vw=@vger.kernel.org X-Gm-Message-State: AFuF++nOXqlm1dpCV1q4yqoymtc71NeczNCI+Qr3FymUhD8p8saE5Stk deA2uyytgvDtWiC8cDP6iyuMuOE5t4Jo1qXsyzno4AU0WHbAQyayZby4 X-Gm-Gg: AR+sD131X/CpXQcsaRdD/nq+bTbr5XwBWB6EjdnWcZ+IVp8IKMktiteRLt3aCtucbDr gIGvNEB6raCgpkH4Ln20ofbToRqjeVncSbGUJ+LlQGFy25728K+jdvEtqQQE7ie9VnzVw8mL+El Qzjj/9X/sRHJM8LhFeE/56JBmAKR5thNRYnwTOtKQHRUzrWLp0V0XcCEuryzrmGNgQXIBNTq5XR Y28IUOy3M9qXEUjRlMOiTaRxMtnS16lTHWB8m5TnTQWH2JSDSKrc+r4TRedE628rdcffx74oZxK 06paFM6jOfdOUUt1IHNxpCRycktu1KWF4IC6VclzfAmBr0dW2uH5hWAqoJ6MuwhJbxlzrf4/Kme ITWw8i24edAZJYXkynlOBjeTXwsu95iFvtdmX3JL6yblmVx2HJ0ZJcg0PBu/52QZHhm24eR4/sO xXsgCYiWuf0LFdui1GpOjtJlM6l7dGjOdqnoNgGYFVAT2d2gG4VxRGugVaBlCQ1lSLx9AkuDIQl uYnVXRRN61wzw== X-Received: by 2002:a05:6a20:748b:b0:3c3:9070:96b3 with SMTP id adf61e73a8af0-3d265a3ec4bmr37708099637.3.1788244595913; Mon, 31 Aug 2026 23:36:35 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.192]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0dc854dsm32694425c88.10.2026.08.31.23.36.32 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 23:36:35 -0700 (PDT) From: Aditya Dash To: Benjamin Tissoires , "Derek J. Clark" , Jiri Kosina , Mark Pearson Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 6/7] HID: hid-lenovo-go: reject unknown calibration action Date: Tue, 1 Sep 2026 12:06:07 +0530 Message-ID: <0c37a763177a5b8b45e94ac678094165cd965bf1.1788222001.git.mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The calibration action table includes 'unknown' at index zero. The options attribute skips that entry and lists only 'start' and 'stop', but the store searches the full table. Writing 'unknown' sends a request without an action byte. Reject CAL_UNKNOWN before building the request. Start and Stop both use a one-byte action, so pass that size directly. Fixes: 995887a10da1 ("HID: hid-lenovo-go: Add Calibration Settings") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash --- drivers/hid/hid-lenovo-go.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index 59b457683357..a6dec5490d17 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -1412,20 +1412,18 @@ static ssize_t calibrate_config_store(struct device= *dev, const char *buf, u8 cmd, u8 sub_cmd, size_t count, enum dev_type device_type) { - size_t size =3D 1; - u8 val =3D 0; + u8 val; int ret; =20 ret =3D sysfs_match_string(cal_enabled_text, buf); if (ret < 0) return ret; + if (ret =3D=3D CAL_UNKNOWN) + return -EINVAL; =20 val =3D ret; - if (!val) - size =3D 0; - ret =3D mcu_property_out(drvdata.hdev, MCU_CONFIG_DATA, cmd, sub_cmd, - device_type, &val, size); + device_type, &val, sizeof(val)); if (ret < 0) return ret; =20 --=20 2.55.0 From nobody Sat Sep 26 13:07:53 2026 Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B53136B932 for ; Tue, 1 Sep 2026 06:36:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244601; cv=none; b=XCii0qbj+y3PqQ594DMLpVjTs8ACw/9+DQi6DfIaOu6G6/csi06u0ajRXDzqpj0/iK/Mvfr4DwXWbwZtDsrcJbhxIrpZ2K7lm7zBCoJI9rKElpGMj/06XokIeMX/QNr+sO+jG8Mi5P93SXTPBUAReBjsSP9Z38ry1V+f0eTzTFY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788244601; c=relaxed/simple; bh=NTyzz1tppaj+6o9zA66wVH4g6nKViE8xv5+rYVtAJLY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j33teJBRP89G+4Ed0nla8sXlyfV4a35UqHVzWwYCnHqbQXGdj1dPFJepwYjjpZktqZkPLox9aHY6sUz3IiJibd9o7jyH/Vtk9X71T1hMaVk7WoIrOdm2y0TZWRSelPqk9K/FDaTMvBUCoJ7dilEoUDbkyKM4zWS33YYY24WAgDY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PQUieViO; arc=none smtp.client-ip=209.85.215.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PQUieViO" Received: by mail-pg1-f171.google.com with SMTP id 41be03b00d2f7-cc1cc1b42b5so4663064a12.2 for ; Mon, 31 Aug 2026 23:36:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788244599; x=1788849399; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=9koJ5kLU6HxS0Wc8/5ifXaSo5oQLaBgI3WQL+B9qH7Y=; b=PQUieViOrfE1FGrtJI+GJRasHnJIrfm01jSoXqz9gOq/7f3haD+cVUltZyLXW0dOrq fNtSum22LEfB/YMjdax1cTvaAOGqLaWPwR9sZHAePRfby/RoOjxXDsMNJ8kxrLiR/WZn Ig8S7eqxa+ShlQo6HOeKa3iC71RnRo+Cd2sU9VB95u6SWR9fQZyqnAPHB0IIra+16dpV /YCz4xrr3nD7t0bIV60YReZCgFoqlHSEnlYYVJOldj9BUJ3bVkECSM8OPGVRGDSZnBsa k8i+dApC1weAkXrGiAz1fhU4xOn02KHdrLfAJP2EMBTPZawrDO+gXOgYqAtpZzPU7teu 5tsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788244599; x=1788849399; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=9koJ5kLU6HxS0Wc8/5ifXaSo5oQLaBgI3WQL+B9qH7Y=; b=eQPptCc/R+0GkP7uYyzUATiOE/u3xWMcH9L1IOc6U435nV/qIHB3xdwK8LHRvBtyKk nRDcJl8RNhRgETuAs5EljzsLMMakdOfszDDdC5PIljso+dxbS103zJs9KbgS9YF2wlb3 f0L59H9MjyLVd1wBm1wBFnzL3CEORhLR6P4CCu7+zY1J+Y5t70JFL21bWbNIEZ6IdKiY yn/tWB/dRopTU7xQ9yhedg6pqFIGlIfbui/OspBsgNyr1Ewu7jhhl7YC0EqKQmcpinFF VmlaCj+t6v/q71Jcxb2nPPNW8L1ZQsfHwVf5x8ABVDhsKhDbpfyRq/gay7mEhYaLy+8h 9yZg== X-Forwarded-Encrypted: i=1; AKwUvBz8Ihqh+ywrargY+DFn0M3HvwSAT5mZMGfxWLYIziY3yzsqLIAok2L25PcJA4j+6ODB7JfNLPYKZEmL0hc=@vger.kernel.org X-Gm-Message-State: AFuF++mQUbgVsF1/trANUEDA5pcG8JYGzZLT5vOXhFOdpXjciqjn2MYs WHgaejE+AaWrnot7u0YDOMCitC911oMVpaNN2UYZWsnG8lKBIEd8HEA9 X-Gm-Gg: AYBFou0NKuxjsxSVIhJjY5S9vZu6kT4nbgDXYwcdr0aciFg5ScQ7mbWazyhyC/El9x6 KpWbH6ej9gcWJ6RQCRlzR+dgG4t9qd4uJQOsm8Qq6ag83ZT68fcfG4uVtcbjvbcsWRQAg0MRqIQ ogDgOl665cF08TNPbXQrMNa/d8xwJuNzpmbGgPBnCCv6SCMOeVJo104fcSCYedfM2+/iKSZCo0G qQU6vmy6CxUyQqmO8CmrA0Q8TUAxUSq9xLqYSayWHgEAZAyYgjuB0jS/Pdap4jNCNWpcSj42L8y 5lGqNuSn4/MBcvMgivt4FeuUKkBQncakOC2aWHqCp9HlStCQDKIBwet1IygJr1OoeN082XKIQqm iqipZFa6g18xFFlMBWvNMXTBXtcxeiRu5xfhtR7fTzXISQx6CLSZ2yR1T1FNkr4pwC+nIK3STxe 8qy9ebwMpZi8ZvcLQI/owOebZyv1qs5UNKhLAIzF4y2dbJhS4c4RMq5KOjc9DYwv8cKL9LHxEXt 4tGhNEOyr4iZA== X-Received: by 2002:a17:90a:d44b:b0:38e:c7b0:84ad with SMTP id 98e67ed59e1d1-399074b6df0mr9147987a91.0.1788244599494; Mon, 31 Aug 2026 23:36:39 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.192]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0dc854dsm32694425c88.10.2026.08.31.23.36.36 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 31 Aug 2026 23:36:38 -0700 (PDT) From: Aditya Dash To: Benjamin Tissoires , "Derek J. Clark" , Jiri Kosina , Mark Pearson Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 7/7] HID: hid-lenovo-go: clear calibration status on start Date: Tue, 1 Sep 2026 12:06:08 +0530 Message-ID: <7d100dad9edf6fd6b161e361053372a732b32eb4.1788222001.git.mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" A completed calibration leaves success or failure in its status file. If the next calibration has the same result, userspace sees no change and cannot tell when the new attempt starts or finishes. Link each calibration action attribute to its status field. Set only that field to unknown before submitting Start. Stop leaves the status unchanged, and the next firmware result replaces unknown with success or failure. Fixes: 995887a10da1 ("HID: hid-lenovo-go: Add Calibration Settings") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash --- drivers/hid/hid-lenovo-go.c | 38 +++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index a6dec5490d17..749536e19d2d 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -111,6 +111,11 @@ struct go_cfg_attr { u8 index; }; =20 +struct go_cal_cfg_attr { + u8 index; + u8 *status; +}; + struct command_report { u8 report_id; u8 id; @@ -1410,7 +1415,8 @@ static ssize_t device_status_show(struct device *dev, static ssize_t calibrate_config_store(struct device *dev, struct device_attribute *attr, const char *buf, u8 cmd, u8 sub_cmd, - size_t count, enum dev_type device_type) + size_t count, enum dev_type device_type, + u8 *cal_status) { u8 val; int ret; @@ -1422,6 +1428,9 @@ static ssize_t calibrate_config_store(struct device *= dev, return -EINVAL; =20 val =3D ret; + if (val =3D=3D CAL_START) + *cal_status =3D CAL_STAT_UNKNOWN; + ret =3D mcu_property_out(drvdata.hdev, MCU_CONFIG_DATA, cmd, sub_cmd, device_type, &val, sizeof(val)); if (ret < 0) @@ -1818,7 +1827,8 @@ static void hid_go_brightness_set(struct led_classdev= *led_cdev, const char *buf, size_t count) \ { \ return calibrate_config_store(dev, attr, buf, _name.index, \ - _scmd, count, _dtype); \ + _scmd, count, _dtype, \ + _name.status); \ } \ static ssize_t _name##_##_rtype##_show( \ struct device *dev, struct device_attribute *attr, char *buf) \ @@ -1978,17 +1988,23 @@ LEGO_DEVICE_ATTR_RW(rumble_notification_left, "rumb= le_notification", static DEVICE_ATTR_RO_NAMED(rumble_notification_left_index, "rumble_notification_index"); =20 -static struct go_cfg_attr cal_trigg_left =3D { SET_TRIGGER_CFG }; +static struct go_cal_cfg_attr cal_trigg_left =3D { + SET_TRIGGER_CFG, &drvdata.gp_left_trigg_cal_status +}; LEGO_CAL_DEVICE_ATTR(cal_trigg_left, "calibrate_trigger", TRIGGER_CALIBRAT= E, LEFT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_trigg_left_index, "calibrate_trigger_index= "); =20 -static struct go_cfg_attr cal_joy_left =3D { SET_JOYSTICK_CFG }; +static struct go_cal_cfg_attr cal_joy_left =3D { + SET_JOYSTICK_CFG, &drvdata.gp_left_joy_cal_status +}; LEGO_CAL_DEVICE_ATTR(cal_joy_left, "calibrate_joystick", JOYSTICK_CALIBRAT= E, LEFT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_joy_left_index, "calibrate_joystick_index"= ); =20 -static struct go_cfg_attr cal_gyro_left =3D { SET_GYRO_CFG }; +static struct go_cal_cfg_attr cal_gyro_left =3D { + SET_GYRO_CFG, &drvdata.gp_left_gyro_cal_status +}; LEGO_CAL_DEVICE_ATTR(cal_gyro_left, "calibrate_gyro", GYRO_CALIBRATE, LEFT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_gyro_left_index, "calibrate_gyro_index"); @@ -2085,17 +2101,23 @@ LEGO_DEVICE_ATTR_RW(rumble_notification_right, "rum= ble_notification", static DEVICE_ATTR_RO_NAMED(rumble_notification_right_index, "rumble_notification_index"); =20 -static struct go_cfg_attr cal_trigg_right =3D { SET_TRIGGER_CFG }; +static struct go_cal_cfg_attr cal_trigg_right =3D { + SET_TRIGGER_CFG, &drvdata.gp_right_trigg_cal_status +}; LEGO_CAL_DEVICE_ATTR(cal_trigg_right, "calibrate_trigger", TRIGGER_CALIBRA= TE, RIGHT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_trigg_right_index, "calibrate_trigger_inde= x"); =20 -static struct go_cfg_attr cal_joy_right =3D { SET_JOYSTICK_CFG }; +static struct go_cal_cfg_attr cal_joy_right =3D { + SET_JOYSTICK_CFG, &drvdata.gp_right_joy_cal_status +}; LEGO_CAL_DEVICE_ATTR(cal_joy_right, "calibrate_joystick", JOYSTICK_CALIBRA= TE, RIGHT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_joy_right_index, "calibrate_joystick_index= "); =20 -static struct go_cfg_attr cal_gyro_right =3D { SET_GYRO_CFG }; +static struct go_cal_cfg_attr cal_gyro_right =3D { + SET_GYRO_CFG, &drvdata.gp_right_gyro_cal_status +}; LEGO_CAL_DEVICE_ATTR(cal_gyro_right, "calibrate_gyro", GYRO_CALIBRATE, RIGHT_CONTROLLER, index); static DEVICE_ATTR_RO_NAMED(cal_gyro_right_index, "calibrate_gyro_index"); --=20 2.55.0