From nobody Mon Sep 28 12:33:37 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 0EC813D331A for ; Fri, 21 Aug 2026 21:48:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348902; cv=none; b=ie1c4yAdqMAnM3ILU4hLL1nfnOQ0MZDA/zqzoP8JqCJjMkXTcL1qHT+JEzo/PzDnBNuUTVc6GTgvq7GfwvOYdNhawZitN+RuUT2XUJClCKLJX5TaGyPg4Tx9VxNEX0d5P7JDpbeWBtb21C3eJw3TREBMfo9I545HF7FWSxBQ3Sc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348902; c=relaxed/simple; bh=UCET5S5NKpQ4SV1oHGApbVNd7sDijesynYSaPBJb9mA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k/VfB5MIgWtK2HwA1GnEfdP17LyiYmPdZLLGGSXrupRLuv/URJeIenApw/wBj7+hQE7etFN03P5tDZwos1IpdI59xkoC5o5rqk579C1F/amo8Wq5T64VHy4ueT3dpYdPKAdi2JKWfzC1PxiWAmvjwC5fh6NwVXNtnfrDr29ceMA= 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=dbT/TZAx; arc=none smtp.client-ip=209.85.214.170 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="dbT/TZAx" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2cc891373e0so17726745ad.2 for ; Fri, 21 Aug 2026 14:48:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787348900; x=1787953700; 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=Zx7wjrhyCH8x4R64vWer8c0Rup12kGYxxXYV7VJC0EQ=; b=dbT/TZAxVJTsUN4lFriyoKtEeMaqf5cjbqEoc/1DLJNvi8P+LOPLKBTWOHVs7p7saE wgGBK0HrpP/mtnySujVOtkdX530ck56ohs6uXP4f1TjM1JATAIendg/coH+t0LydkvNI TcFtVQBFJhIMsMBxTIeOONgzQtOORlGwMaRh1Ba62Z1JdP2ZDM9rjxw8aosrApeIvnG0 y77S5q1bbJsnoYQCPSGA2Ibk8xvXWrZSk2lvYc+697+yXw+jGWzZvp50fbTUyk0OzmrQ sO3mRzlocRY47m75uCvjupBAzKWxKkW/lUxmwUj5Zd3lG6xE3MDiCx5fvhE5aSNzIa+B RSIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787348900; x=1787953700; 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=Zx7wjrhyCH8x4R64vWer8c0Rup12kGYxxXYV7VJC0EQ=; b=h9PhsVE2cgkU20ZIZPrWuCiFZUWdo/Lw8sL5zFUeakbsEVfSFZjy9ryVp8RzUEGgeA bGGBT4FoSb6CkPRJX0VV33Hb1xKmUxRI2Y8Ir38DOAaNDBJKPctMNfXPvVrk8qEDgKqh JqAqCxgJA4J87OWho6PlTvEX4SaaeWO+NrJOFumXGKtcO+nIVtK48lh+N8o6rXgixB43 HRhBtwdfE6v4+aCKc3kqc9/vT5He+3IEBGb8oy3S0JPJIK3NBvA3JHOR+KLe6ffz58Zo rwbwlY5xpbiCMEB8WOJ/relHREhwexpY2zgJnQpzAavKyhR8yJBkum+5pJkRczTxJax9 xdvg== X-Forwarded-Encrypted: i=1; AHgh+RqLygO+C21KvNWzmfFhtwpmRI4Jpo8l/nUpcWOuWkJjxSb12vxpEnw0vdq8HJQVp58GOd0urnPLNbfDF7w=@vger.kernel.org X-Gm-Message-State: AFuF++kpd1M9sIct8/PbSGQIh3lvUIe2eDEwmwr/1AUXPOMevLaYvYzf PyKG7LToMV1MXLBoqnxgRCTHFt6Ek1YObMCGJp831gvmaAVkolCCdK6p X-Gm-Gg: AR+sD10pO7CG+8nzy45san/EuqzrMGSBwa640pQjXlmuk8Pqk80OE3TngS7CNCwbOmE Mognjj0awu+VUm6OECh19RAPyqpQSHt+5r0h0jgGx/a5DYd6JPH8o9aiJ506gRp1xwT32BR3yHN VOh6DdmHbooHWsF3Ncw3d07EBq9n7YljP/f/IBFpmWbZPyaHan/EYfLf6mTbJU8mYiUVmSpcg85 zIQqF+J2BOPaGwtdKfsayoSOXjJJCsi9dDwVTECH9C+3vCYOiBHhxWaRsbgrGIkaWU2GX4TnwKs 0GNoG+zTB0/s0aDlZ59N8UefFdIkeVROchhWL4Ii3W/Qixz+gqgVuw/I/04Utb5B9hr8YwIGrsK OqaE9PyxLUpdc4BxUSUyPe3QfNiXUD6liCM219nx1n6+SDG6AyJGsEAg+joS6Y+k23d7nSMzmwJ 5wIkQCEYuqSK36D02iOZ7ay2Lod8CTlFL2vd6Gwof10FmmGgMLcYZv3UIwKDZzFj5BEROwkUB9A CNgUePthZvF09MmNvE= X-Received: by 2002:a17:903:1108:b0:2cf:a108:7605 with SMTP id d9443c01a7336-2d670cc180fmr19489855ad.11.1787348900112; Fri, 21 Aug 2026 14:48:20 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.193]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327bef3bb46sm27276942eec.3.2026.08.21.14.48.17 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 21 Aug 2026 14:48:19 -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 1/5] HID: hid-lenovo-go: use the correct calibration commands Date: Sat, 22 Aug 2026 03:18:06 +0530 Message-ID: <20260821214810.87826-2-mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260821214810.87826-1-mradityadash@gmail.com> References: <20260821214810.87826-1-mradityadash@gmail.com> 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 Mon Sep 28 12:33:37 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.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 63F193CFF61 for ; Fri, 21 Aug 2026 21:48:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348905; cv=none; b=p+QXsoPNZQK7lVqMM8IVGqczxv2IQVFuLWOM+mkdUiP2GiT+F8iG5heIPOXIS7nsN2hU/C/i9uLuPBEQVMaYbm3z+PFpLjWy2Bch7iA04WN/K3l/6nUNu1M2+ehQAFnaDCNhnG2kQvLzn4GPU05DaiTasMi1gh9325Npkgzbc9s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348905; c=relaxed/simple; bh=+2Hg1z6ae7Nutrs41m3MhRVfWr94UqLJ44+dKJ8FaU4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Uj9IdelU0SJvEPca/yNw6/yNk1vf+a6f/4oVgKu8w0BI/fWIt3DqFiZ6NImRbwaazmQDyAJ6utNhsLFHA/wcvw5vUlhqOftYdCDDovPf9ezfLh+AfB69LMiI0arwGWfEjWOjAGVPcmr9Dgve+EQgT+4yYcQOQD6Abwup/Q/VZnc= 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=W7cPUqlK; arc=none smtp.client-ip=209.85.214.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="W7cPUqlK" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-2cf27856f9cso16563445ad.2 for ; Fri, 21 Aug 2026 14:48:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787348903; x=1787953703; 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=1E0HqiFZR2YgW/ELzdI5r6SrFe75z7a+6PDQwhx3kuw=; b=W7cPUqlK5IcpSARiSay7yBXx5Xb+ff7TStt7NaI6kRU9UmukPlhQg7JBcagPh0A0TX /7fdTzKUtAmpN9XbyrzqiQX29wTTrUzHktLOlgORJFbPklPMKNJ4ITrcypTALL3CTqCJ Fw2liXBz7+otK0GUv9FAvTNZappHrME2xszX1jseA5qDMglAvNbi/byWEzZub1TzLloI Dons/67AEDph55XMMFHCbtDACM4BXalYrd2PIXBhrLw44R03d+w8aTINyH7/X5aDuDlm v0ciM/oy8pwT5votuxCdCuMGPQ6sEEZvmXuOc44U2PIq5UVq9hvBwhE4dTurqZpLYLa2 JRuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787348903; x=1787953703; 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=1E0HqiFZR2YgW/ELzdI5r6SrFe75z7a+6PDQwhx3kuw=; b=UhJlRGc0Xi09tKuVeh1wRg/1Ph2z3zVVcpfC7r1Dyc4pbUEhiVI6oJM6ywRn0a4alS p8vCPn+GWoWpJ7vXQZWKrrxPJ+hnPLMXv7Ep+HCVzLLn7vjPtMlKLwbwlCc1TCrJ93d5 zyhTj5L3T05/nZc1O91saJhWQJevLOC5IMWBVXFqVB13XHFrK0WJ/qf9x/tC5tWYCyOi SaWebwQwQ0pFgQTP8IUzJFC97P4ydMqjgcTivl+tBOV5bCnQf7ZhZ0vjMo1p2gN6ZR3w Df9V3YtUejiHSkoKIGZ3aTRCfAE+vqtnAyPSqiCjFOvHGJuii4CrHSsPdQ7tJZ7UTgTF ZyEg== X-Forwarded-Encrypted: i=1; AHgh+RpIol45FFxmjddh6VPiaW7ME7orRJxsHqU+q6v+SlXcMwW58VjXcW+9G8q28eREQBvx80NKgMpHl8rb3Ao=@vger.kernel.org X-Gm-Message-State: AFuF++kwey6tQ1LL1UyyRp3wbTo2qnP1uSnBN4qjUDrEh8f2qorIjA63 CKK6DKwcnrl0w43plbh7SI9rjnur4m2neFXe5+l6od7GESK3HRJM+64q X-Gm-Gg: AR+sD125Eb0GiItloIad3/o+fKe5SWsrgVxtUNNFPu/bomLgvgNCG/J52JlxTBKrs+L 83pg3N5iGFlbtNejQHTv5+2HCoLfVyyxvyIJHj2AnDPbfuG+0hUUXPLGsoidkAEqLilXWVz1tGu 17x8AGkRbtLMqI5HWIWlo/JHhXOWmc/RexNjB7bpNUBYL7Y+Efk2KOYynz7QEuoxvEpW5Akedbl oYCSOAUd7pMqFXHLbiCuZJkZ4Wd7lXonTQCZ1SUnGyc2GlHLptjaUsak+gkxsRHKacht2DqK40D rkylEtnwTJH+Rn7A2wrCRk2TcRGn/IiKBita2uh1MxGlLWTSXJbx/+vBwkaaj54wC19K0j+rtXX VkywDdk3psBNUaLB78mBtwY69bz4U0zWlkoGkr4/fCK2wsEPPEbOiakbeobnyD+UkwoBLI/uy8w UlKLSQZg2qyjmaZmqn4A+POHv8pZ/OrNLkkTy6LHj9uluxxivtWR2V3+aoIz0JBLD0bFlcAVzk4 FxwEeGfj3s+bNwyzDWx9stNCU743w== X-Received: by 2002:a17:902:ce08:b0:2cc:9179:32e with SMTP id d9443c01a7336-2d64afe9569mr176987765ad.10.1787348903625; Fri, 21 Aug 2026 14:48:23 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.193]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327bef3bb46sm27276942eec.3.2026.08.21.14.48.20 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 21 Aug 2026 14:48:22 -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 2/5] HID: hid-lenovo-go: fix the FPS mode DPI request Date: Sat, 22 Aug 2026 03:18:07 +0530 Message-ID: <20260821214810.87826-3-mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260821214810.87826-1-mradityadash@gmail.com> References: <20260821214810.87826-1-mradityadash@gmail.com> 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" mcu_property_out() adds the five-byte request header used by most configuration commands. For FPS mode DPI writes, this inserts a device byte before the four-byte DPI value. The FPS mode DPI request does not contain a device byte. Its little-endian DPI value starts immediately after the command and sub-command. Use the four-byte header only for FPS mode DPI writes. Keep the common header for all other requests. Fixes: f0bedee60607 ("HID: hid-lenovo-go: Add FPS Mode DPI settings") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash --- The corrected FPS mode DPI write was not tested on hardware. drivers/hid/hid-lenovo-go.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index b8248bf8965c..a6e9a130ad41 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -725,6 +725,11 @@ static int mcu_property_out(struct hid_device *hdev, u= 8 id, u8 command, int timeout =3D 50; int ret; =20 + /* The FPS mode DPI request does not contain a device byte. */ + if (id =3D=3D MCU_CONFIG_DATA && command =3D=3D SET_DPI_CFG && + index =3D=3D FPS_MODE_DPI) + header_size--; + if (header_size + len > GO_PACKET_SIZE) return -EINVAL; =20 --=20 2.55.0 From nobody Mon Sep 28 12:33:37 2026 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (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 0AEC23148D9 for ; Fri, 21 Aug 2026 21:48:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348910; cv=none; b=q0enyOThygfDjcS55RpEHGk1ybNs4ZZvb7egVg+9koh8wvoUjJ5a8jl7Tme4MXdtBq73rtgCeO0VgDKHZp5g8AoHDwaAanFvGYL0Bw55DaDqN6KOODQE40wicAMvW8K6tLBTT+7MVb5Q0sQ5UcViUoSYXQeNnkcbj4eVkObKvag= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348910; c=relaxed/simple; bh=Q9+jME9VJAGMwbs5dL+qzw2sN4dhcaFkxpJUEyVEaG0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nY0y02F6gqM84p23x3D+iUo8xISgGZ+K8U31NspMLXuoKX1UbKSLs6oYmWQuRdG90ylRxMXLfHyPctJRjnIpNDhNrQrStPGaurwCexFPAO3ggBBhTfzcG5x4MsfYtxCjh6OCs1NTuu8jUbYBJa4gfz/YsecIV3AA7+Mj971Id4A= 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=kGTrpOgX; arc=none smtp.client-ip=209.85.210.182 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="kGTrpOgX" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-84a4d8fd6ecso1555130b3a.1 for ; Fri, 21 Aug 2026 14:48:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787348908; x=1787953708; 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=5voLgM5slHX2FHecq7U0sNP2etbB1183FHydBmLAB6E=; b=kGTrpOgXz1h+JPRUNCp6iUcNUE2BFhdwtjvMovufiQ1wBxIOLUJpFtwYsfWKkIqzzx FEUl9B9MS1Sky7RlBdImlrDTTx1lWkitXabYFzIJQqUAA7Un1/ROR9bzENmZ9G6eJ77m 7Va18COFHnWqG1ieZ5WCHs2SbSY9ckEXuqbzdyQ3cKikQXBwZbX5UEpOeZGRuv1dub7x 6X2A/3SH39deoqHWuqLmFKfLb6+JXA1yIqV0fscUd8hP3h5pZp4VVYxcXEFi2AQAJC4C i3sEmAOo2lb8RuNq3tzv4HqYeSZotMc2ZjmQ6I3zTg/UwJ3CviZpwzpt9bJgqkkPq1BL MzbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787348908; x=1787953708; 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=5voLgM5slHX2FHecq7U0sNP2etbB1183FHydBmLAB6E=; b=gFig0FHXN30y6VwNDs9pjkcMvOBnoaWw+b9lKNFpE86vpOMsR1o0Xg7QIpwgsL08Pe v9HL0gRrAmwB9UPqA0kvogMLrQYGrye0Mybw5xYZ2gzoHFUsY80J9mnwpv1rvkx5PFvd VQkYL3Nzm1pOW8dF0FVHJ+sxs3QCTMxqr2quGDs42970H3HZKnsAqD9JooWLs5HCfpeC pt/NIdvSArP51KnF4tYUD1MuIYCj3eR2tf+0lVZ1Fa+PYRL1cIKmw7PI15xFG0LN324d gEipKlslqk7Iy5gvLXyNEOLXrUBT0hJuCr2Ze7GAGS1V9nNnoLK09aMmkKyF6U5pteqg i4zQ== X-Forwarded-Encrypted: i=1; AHgh+Rq8a4ovY+vDlNiQ24hD0uHQXXoXT9R8nwCVtEunwFeWmCNSb3ZHu7xEAnE9dPQwNxMQ3/KhxBEjxe3u4HA=@vger.kernel.org X-Gm-Message-State: AFuF++lRVlXR3YTcogvClBv4PnttObR/gRh+rsSD5wIZM69SEcZNCg3Z ItuBKWzNQJ/7tfTVloVrLRrrzL07wxeRLbGx/v16EMCLrY65YAh6i3Kz X-Gm-Gg: AR+sD12Jmgj0CRWo9olNBZHCaNDlfIAfaCVJ2+Jt0WKCpqaAqhRk5RquacIxs9Osynl hsxFWVXDfCB2gTUYhwOXoiAGr/kcs1t5t74dBqp+2VMCLA8QTOJxOVmZ/mtKQ9ZclizOiS+bi6D 8OWZfFoEzAKqzGm5aoOw+a4yiXJ3qZppA6yBgubdYKL6xu2aiu/+kT4M1Su/rxce3SBq7wVGCC9 OMGJhBWph3rB+gc2f8kL795WSjyUgN3FTK6z1I2UJ1lwJgjEQE06C5f3yGuB+/1nDjBJ2ZEfKCY fnkKtu2pfLw/G4gwggAQPCFg5AMmU0gAcZPJ526ZQMH+LKnhPk03waoQv6NwB1QYLTNxA/nIV1k tzY7lRqUdKW0L7gZHyVS2VaZSvJK4n+lURjCFo3pXCGJt2SPFch0mS4lZ58fnyk3dS9es9TUp5V 2wgnKoeSbxJEXuxkHH0ZrjWCqvNWNj6Uy4gP18nAHYqz7os37lMCyNdX/FedyOuBwEX3lo7aKXu XjW9XxoYxyYbKBg1/5ZrSyq4xQplGc= X-Received: by 2002:a05:6a20:9d96:b0:3bf:6237:4d3f with SMTP id adf61e73a8af0-3cd4bc45418mr3436077637.18.1787348908325; Fri, 21 Aug 2026 14:48:28 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.193]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327bef3bb46sm27276942eec.3.2026.08.21.14.48.24 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 21 Aug 2026 14:48:27 -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 3/5] HID: hid-lenovo-go: record calibration completion state Date: Sat, 22 Aug 2026 03:18:08 +0530 Message-ID: <20260821214810.87826-4-mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260821214810.87826-1-mradityadash@gmail.com> References: <20260821214810.87826-1-mradityadash@gmail.com> 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 firmware uses result value 0 for failure and 1 for success. The driver stores this value directly as a state index. Index 0 means unknown, so the driver reports a firmware failure as unknown. Map the result value to the matching failure or success state. Fixes: 995887a10da1 ("HID: hid-lenovo-go: Add Calibration Settings") Assisted-by: Pi:gpt-5.6-sol Signed-off-by: Aditya Dash --- A successful calibration completion was tested on hardware. No final failure completion was captured. drivers/hid/hid-lenovo-go.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index a6e9a130ad41..d2d134873dd1 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -577,17 +577,19 @@ 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] ? CAL_STAT_SUCCESS : 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; @@ -596,13 +598,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 Mon Sep 28 12:33:37 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.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 3409334D4E9 for ; Fri, 21 Aug 2026 21:48:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348913; cv=none; b=T2VoGp1F1ak5XyFmdK6SEhxtuvneIxwrYgjKLOwm2uO6A3MsCwFPS3r4EYqkpETWJqlsYvQguTgDiS4SjYGQ3HxLPPO3F0mIvbP1YjEcUR/0gGUh8ogZyFmjJN16XGLzMlcuKj+jEhXhyfkAWk+iVFMK2We5KB3HedFbjVGlm8M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348913; c=relaxed/simple; bh=9tTCiBsEdE1dnHRkaKwHZ7kfO8yZ8iy3I5fruJqkqPE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RUHkDwgwfb9L8Oiiuw5QiFAYLTbHulu8BPvKD9NVYVLddjjddyyAV2ESER2B26gJ2BIyRnipSwJ3UzdXuQVecQeKYs9FzH3vDeHlbJN9kUr/jNfAJD8NrY0JTm/GgEvBcapnyzrQUPrj9/5y941/vdcBLVVjScYn/bsxNab52T8= 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=OCrtFZ66; arc=none smtp.client-ip=209.85.214.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="OCrtFZ66" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-2cacf197759so20670005ad.2 for ; Fri, 21 Aug 2026 14:48:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787348912; x=1787953712; 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=8EgesNwgmXg6jThwtN+Qswez/+1KXP6V1AeHyV0DsAA=; b=OCrtFZ66QmJBobrZim4TdCELaMJAsquZLD4frrn6Sc87qW2WRsPOkQxb+CAlqE5Td6 wwCBTmmgTHFJGzRdG19pjoiL3wGDpeHSaO/94Qh0mO2tx0Tw+PPevJtuTbOLP5P3xTIU pC+6k+TOJodUEFoo5rSJyaGqnDvViuACsYcsHbzdyg/T75S6q1TKi2zUydbSchv6+zpd mT4mcHHQSjArb+XfE4lcIWqVbBQbHSJ/yp44VrBzykdqbaa+dVqKBu/E64vXVsQ1c5dD hAXSgJqK5seNkwVglQFIEO++loIkJBvaM7UeseX17VUDNpnqp7UZ75TueS6f8R8dbpJJ b9zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787348912; x=1787953712; 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=8EgesNwgmXg6jThwtN+Qswez/+1KXP6V1AeHyV0DsAA=; b=Kch1Lq/3CAm6FfS0bu5aXvPdhEuain2Qc+vLmLPMFo/TXdJ/rXeBZ5dtkbB+Wen++h B0qtGRxf4Y/fBdAhXCozkmrBskjatd+sJoxsvIke8ejAC3qD+uzr+sJgnx1eNoW2zlYI Hbv3wq2UzQWvVId0FU3ezFPTpjsbyWrF2ZGd3JAsvZZSFbhS+VMh+fF3YNoVgn1pNTdg 4Psk1bRWiZbGgxxiuPcc+e6N6i9UrKHnRqoleBAdXHJuidwMb8L2tiOfNGPBkDXKPsPx iCc9xYjBMrsumG08BGSVPr74a5vKV8sEyYVy3ojWIJRIWfMLaTrwiCPuNH1epc8JnLko rWag== X-Forwarded-Encrypted: i=1; AHgh+Ro2cnoxF24a005yxqtnTUHifJ4PD8+296nV5BbQRYPRhbRdtQCELK33iAaF2MST5D4zdHWm1a/CtGZVnIA=@vger.kernel.org X-Gm-Message-State: AFuF++lqEU9Qc2P7zIRt9nZSx0xcJyuz5EJ1mJ0VW7lWK51C+EeFWHwY nhg0xMCh0iSbTb0P2pwrwnMwF9bsbXpfb35c4JFryCqLkFs96mSIwu4JBdX1HaFx X-Gm-Gg: AR+sD12vG1h4cg2mZ3p5mHHzcBb0W5lVWDasSaPSzj8lMhNkNZOIpKhIboZVAEbdZwb EzgGEeQ8C5AaE9w1HZ6l+SGIcb2PepNfYlFfyhmuhZlCnmaQb+Z7mnXFaSecbkSLGlkixGfyNLM C93vq/IdvBE7G7VN6Yc34sif8DbYAFhnHjATJjnqAE5neNP/ravkNlW2076xldrr/wjESIxn8TG 0/tWLSRymNqDnt+EO9BtZzBVaMN0IKpz/tX+k9KTm6/hYHeAwt8v+VzkwjZHJgfgS4o5qR74pIe dVWpjXkizYWblj2mvetS0pzP9P0LkhDViJ3nwusiuNseGe7DTcmkwfIE1aITKwQOj9SZzqa8zcG rS462bgb3a6o0KQ+5Gfc0XE5zfWGAw73GlqkZisy9XL3dRkVxaDvaqcKaEQsGUPja9T+NDjRTAU wAcYUHK5xUPGfL5aAHWv3wO8LKTkS9S3x4AAIdHkx/XCE7HYeO00Qx5Yy3W9AbJx8RCKp2mCn3d w4JZFkD7i3Gfzq+DWo= X-Received: by 2002:a17:902:da82:b0:2ca:61bc:317c with SMTP id d9443c01a7336-2d64b17b564mr162561685ad.13.1787348911614; Fri, 21 Aug 2026 14:48:31 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.193]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327bef3bb46sm27276942eec.3.2026.08.21.14.48.28 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 21 Aug 2026 14:48: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 4/5] HID: hid-lenovo-go: use the right controller selectors Date: Sat, 22 Aug 2026 03:18:09 +0530 Message-ID: <20260821214810.87826-5-mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260821214810.87826-1-mradityadash@gmail.com> References: <20260821214810.87826-1-mradityadash@gmail.com> 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 --- The corrected right reset and right IMU writes were not tested on hardware. 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 d2d134873dd1..1e6915c969d8 100644 --- a/drivers/hid/hid-lenovo-go.c +++ b/drivers/hid/hid-lenovo-go.c @@ -2006,13 +2006,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 Mon Sep 28 12:33:37 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (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 A174F3DAABA for ; Fri, 21 Aug 2026 21:48:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348917; cv=none; b=J29mrqZN3eZ3aDoSOoQ2vaH+y0/ly36WnR1fZumW7Y2CBudCbZ18uZuYw0zsDwL4bS5c45WOraregLindfkwM7A3PRgPeMVyQz0wpkRupCk4BI2+Z9NFOmyxsBOCf2YuMX2hVIRBoOQTpQkPumlxm0FKalEJottOmBElMuruWxE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787348917; c=relaxed/simple; bh=CfZT21P85GEFf8O8Ncaky7KiVbD3FZFYVMHqL0pmP0E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ShYIN2sbn0NDCoj3SHs8oqHLRsmYdR3oGi+IDGqGK7CqhiIB4P9qiCU1yXjbgEXf+5c06ir8vf6AWHv93nnT89R03//I/XHq3FlTDHlcZz4CnEd2N6mpPvxUs99OwegV6M283Bmu7ALJt1GaFAfcL8AZgILwku+UTXdQoNDfANQ= 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=UYO82/v6; arc=none smtp.client-ip=209.85.216.53 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="UYO82/v6" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-38dc69c74b8so1585642a91.0 for ; Fri, 21 Aug 2026 14:48:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787348915; x=1787953715; 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=A/zTx8W+lWqDDj6Gv0eCWp/oq1vmj6sVAKi6L2a7La8=; b=UYO82/v6mrUr9LYbSRltXMOVzEC+CdKgXSnBK7Wbzks5cmHn2aasJ493ZRE+jY+JKl pnELy+cNf4VUPNiUxrLijyXKvK7Ezny4esO0jq8lvSo7Bh+zW21Q+qKDW60GpDIs5eTY LmHS9P+RuNUqPWSM4SaAABxZikVB44evaVK5N/i6S6ihZw0CwKGltIwPGF0hkEhwT5Dr q962GVR4UzUwPTVKWekbb2Nis7lULwwCSLYIJFzgbtDIXBXH64vC7Yzj2uQqU6YP1cBA PePhnM3nKSqgdIxgHfv97RQnS3SUB03zYT7Ldwun+Xe9KefhdfFGKo0apNj/q/f3Jya9 EJWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787348915; x=1787953715; 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=A/zTx8W+lWqDDj6Gv0eCWp/oq1vmj6sVAKi6L2a7La8=; b=G4BrLwVX9GIZjbpjEImqh+wOYDpOYJ88iqWFMVEfGQ2k0sbdvfKO/ubh9FDZvUngrO 17+OfEfSh5PzrEa2S7KRt0j3Lognqn6757ukiQIuZIo7Y6YW3xGp/rX7bCTXQLQC0DpL FeF5LrXCHLCBHfkPcdDRQI4ZjKzrcGDFNOQEqZfmwYL24qn2c/QINMo8vVdHOXcucvMu pVDnY78U1w7/csNYDjQoaPLd68y5XxxI68RLk/JgNKXdPGuSHukXj0bUTFdDeqMJRWpl vuWlsBju0uTGbdvUPac2iOj0AlPhzMeuxu95mNasP9uzA4iv9IhwXLAjJRNGChUPERj9 faOA== X-Forwarded-Encrypted: i=1; AHgh+Rrlp+ZbEg2pcWoQxNPr8CK33Tq8dHoRyxlOGtWzAqWg0gGFhrQwFofDpcGXvCwtTls0FOCPFtOb24cC5Eg=@vger.kernel.org X-Gm-Message-State: AFuF++mKoxhBKQt+jdJ0GH6zwsc23WUv6VRXoNEmwTkpOVMwD1kMNeMu x0ednlkgU5tQ/EStWpmnIxOqrXWtRAmLbPpMihZpndBIyLj4lbBf1LTd X-Gm-Gg: AR+sD11iu28Byu8LkDPebceNElLIKtkACZhelG4VqJ3niRFmtrUzDvGGYOzIhfVGv2r PhrfHDX6msM5EB91wY3fAGiZaThzTcGhpdgVCR1fRMkSgUiiZW4IVrpOHtCCUMAHef6oiaqTkiH 1op6rRnJ5TUkg+P4t1NvoOyjgkQIBo5oKR233VmhhQrTns2MPuIgp610oMhnksI9pwz2B43jtDT BycNuRXotfupFpjD49jsDUK/07WKoLLmDdcTLRVLsHkDR3qqXTKIRG1vgMbFT7nOJnwzsLXbQmE po0HMtwctgHN2h9PjVSWiWcG8gdw3MDA+NO2GPrbxxRgVoT+ayEQ/dLG64WhLg10QxMgoaOoYVO 35fiTDWW8OyV6vZoUvRBkn2f06KJ4xNn6pHSEFWhmGn+M7SYVSZ4G7Vxc0nI+KLtaKr9ASIp6Jv LNp2REeOMO3Pj162TG2xTpRxlMF8XI6lBB/f3nNErvlgSf2Hqb//cBKhP0aQZ/VsNVXLFACVRus QbQJP8UtLH7KrJ51Yk= X-Received: by 2002:a17:90b:164a:b0:390:b41a:b92a with SMTP id 98e67ed59e1d1-395deeaa2dfmr2561703a91.4.1787348914967; Fri, 21 Aug 2026 14:48:34 -0700 (PDT) Received: from localhost.localdomain ([103.16.69.193]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327bef3bb46sm27276942eec.3.2026.08.21.14.48.32 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 21 Aug 2026 14:48:34 -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 5/5] HID: hid-lenovo-go: return configuration request errors Date: Sat, 22 Aug 2026 03:18:10 +0530 Message-ID: <20260821214810.87826-6-mradityadash@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260821214810.87826-1-mradityadash@gmail.com> References: <20260821214810.87826-1-mradityadash@gmail.com> 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 completes a pending request when it receives any decoded configuration reply. It also discards the result of its interruptible wait. A configuration operation can therefore report success after an unrelated reply, firmware error, interrupted wait, or timeout. Track one pending request and match replies by command ID, command, sub-command, and device. Return output errors, firmware errors, interrupted waits, and timeouts to the caller. Treat a timeout or interruption as final if a matching reply arrives after the wait finishes. Calibration completion is asynchronous, and some Start commands do not send an immediate reply. Submit each exact calibration command and sub-command pair once and return its HID output status without a synchronous wait. The firmware does not include a sequence number. A late reply with the same complete 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 --- On an Original Legion Go, left-joystick Start did not return an immediate reply in two controller sessions although firmware began calibration. A focused target-kernel KUnit test covered timeout, interruption, firmware error, and reply ownership. No natural firmware rejection was reproduced. drivers/hid/hid-lenovo-go.c | 118 ++++++++++++++++++++++++++++++------ 1 file changed, 100 insertions(+), 18 deletions(-) diff --git a/drivers/hid/hid-lenovo-go.c b/drivers/hid/hid-lenovo-go.c index 1e6915c969d8..a1a255c28e2d 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,30 @@ #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 =20 +/* 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; +}; + +static struct hid_go_cmd go_cmd =3D { + .done =3D COMPLETION_INITIALIZER(go_cmd.done), + .lock =3D __SPIN_LOCK_UNLOCKED(go_cmd.lock), +}; + static struct hid_go_cfg { struct delayed_work go_cfg_setup; - struct completion send_cmd_complete; struct led_classdev *led_cdev; struct hid_device *hdev; struct mutex cfg_mutex; /*ensure single synchronous output report*/ @@ -331,6 +349,72 @@ 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) +{ + unsigned long flags; + + spin_lock_irqsave(&go_cmd.lock, flags); + reinit_completion(&go_cmd.done); + go_cmd.pending =3D true; + go_cmd.id =3D id; + go_cmd.command =3D command; + go_cmd.sub_command =3D sub_command; + go_cmd.device =3D device; + spin_unlock_irqrestore(&go_cmd.lock, flags); +} + +static void hid_go_cmd_consume(const struct command_report *cmd_rep, int r= esult) +{ + unsigned long flags; + + spin_lock_irqsave(&go_cmd.lock, flags); + if (go_cmd.pending && cmd_rep->id =3D=3D go_cmd.id && + cmd_rep->cmd =3D=3D go_cmd.command && + cmd_rep->sub_cmd =3D=3D go_cmd.sub_command && + cmd_rep->device_type =3D=3D go_cmd.device) { + go_cmd.pending =3D false; + go_cmd.result =3D result; + complete(&go_cmd.done); + } + spin_unlock_irqrestore(&go_cmd.lock, flags); +} + +static int hid_go_cmd_finish(long wait_result) +{ + unsigned long flags; + int ret; + + spin_lock_irqsave(&go_cmd.lock, flags); + if (wait_result <=3D 0) { + go_cmd.pending =3D false; + ret =3D wait_result < 0 ? wait_result : -ETIMEDOUT; + } else { + ret =3D go_cmd.result; + } + spin_unlock_irqrestore(&go_cmd.lock, flags); + return ret; +} + +static int hid_go_cmd_cancel(int result) +{ + unsigned long flags; + + spin_lock_irqsave(&go_cmd.lock, flags); + go_cmd.pending =3D false; + spin_unlock_irqrestore(&go_cmd.lock, flags); + 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) { @@ -658,6 +742,8 @@ static int hid_go_raw_event(struct hid_device *hdev, st= ruct hid_report *report, =20 if (size !=3D GO_PACKET_SIZE) goto passthrough; + if (data[0] !=3D GO_INPUT_REPORT_ID) + goto passthrough; =20 ep =3D get_endpoint_address(hdev); if (ep !=3D GO_GP_INTF_IN) @@ -709,7 +795,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: @@ -725,6 +811,7 @@ static int mcu_property_out(struct hid_device *hdev, u8= id, u8 command, u8 header[] =3D { GO_OUTPUT_REPORT_ID, id, command, index, device }; size_t header_size =3D ARRAY_SIZE(header); int timeout =3D 50; + long wait_result; int ret; =20 /* The FPS mode DPI request does not contain a device byte. */ @@ -747,22 +834,19 @@ 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; + if (id =3D=3D MCU_CONFIG_DATA && + ((command =3D=3D SET_TRIGGER_CFG && index =3D=3D TRIGGER_CALIBRATE) || + (command =3D=3D SET_JOYSTICK_CFG && index =3D=3D JOYSTICK_CALIBRATE)= || + (command =3D=3D SET_GYRO_CFG && index =3D=3D GYRO_CALIBRATE))) + return hid_go_send_output_report(hdev, dmabuf); =20 - 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; - - reinit_completion(&drvdata.send_cmd_complete); - return 0; + return hid_go_cmd_cancel(ret); + wait_result =3D wait_for_completion_interruptible_timeout(&go_cmd.done, + msecs_to_jiffies(timeout)); + return hid_go_cmd_finish(wait_result); } =20 static ssize_t version_show(struct device *dev, struct device_attribute *a= ttr, @@ -2395,8 +2479,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. */ --=20 2.55.0