From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C2AFB4252A0; Mon, 20 Jul 2026 13:48:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555316; cv=none; b=BjIZxsEb3rswmUU0os6VvNy9s6/9Jlzine61+SkxzbLQou8Nsbmm2+kd2O8rP59T3a28R1mnIOri+Ae8wllyJDMqJXKVzUCvtajFKsGPDF2QJeOJdh+djke82MvJHxIHY+8nakT0z52yNDGKH54ARrDecGJZLYSdDKkSn818QQU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555316; c=relaxed/simple; bh=dRlHuxFXBm+cO5QQ3/v5INi6PVHQolLYJrM80xvbn38=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=A4pMnoH6yaT9ddzKdKmrOZAs/j00NP7IHemIaD8LZI2xs2Ow0LmVyYYrtYDxMhG0Gqb+SuuBgoTf8q2f9QU8EM59Ii8TTdXNMEDnRpUWnfBUps2j8xdYSp+Bd5A0NgJzPlUo1MA7NNgIAoER2zi/Ze2eZYgFyhL9E8YeqCjzlW8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 0F8EA2028D4; Mon, 20 Jul 2026 15:48:26 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM5-000PmU-36; Mon, 20 Jul 2026 15:48:25 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 788AC56E51E; Mon, 20 Jul 2026 13:48:25 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:02 +0200 Subject: [PATCH can-next 01/13] can: gs_usb: remove unused define GS_CAN_MODE_NORMAL Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-1-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=758; i=mkl@pengutronix.de; h=from:subject:message-id; bh=dRlHuxFXBm+cO5QQ3/v5INi6PVHQolLYJrM80xvbn38=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKUxdf+YuZT0X5X3X6kZmPdY8p+p+POSyt/vrPQs2Mc i6LNfN1O0pZGMS4GGTFFFmW/jihKBDoUNr7MmESzBxWJpAhDFycAjARlVSGvzLr3/BZnV2zZPv/ S+Ibjj8SvdAlMstgw8/e93aimzWn+S9g+O8178RG45Yj5Y82vt3q+Mbs4tFXL5tDVzXxn8+6eOt YljU3AA== X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 The value GS_CAN_MODE_NORMAL was part of the initial commit d08e973a77d1 ("can: gs_usb: Added support for the GS_USB CAN devices") of the gs_usb driver, but never used. Remove it. Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index ec9a7cbbbc69..c8bb6eeff667 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -127,7 +127,6 @@ struct gs_device_config { __le32 hw_version; } __packed; =20 -#define GS_CAN_MODE_NORMAL 0 #define GS_CAN_MODE_LISTEN_ONLY BIT(0) #define GS_CAN_MODE_LOOP_BACK BIT(1) #define GS_CAN_MODE_TRIPLE_SAMPLE BIT(2) --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C42C422558; Mon, 20 Jul 2026 13:48:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555318; cv=none; b=FN2RCZhoALtDzs6jkgo43iHKH1/R3LE9+JWXgr8eZ02QFuDox0XP1PpZ1qaCMhFWV0E7AbJWxJTnLpgB5l8e3lSqU7Lh228a2FJjnnklQ9BJ23eSguGfRVaNh6c5x5i6JInTjJGNCZFwwVSX8YeF4ngZwPR8prR4o9H028EyUro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555318; c=relaxed/simple; bh=vHGDWfgrCVCk7ndp2ooFqyZLm638GrOopzetugJNxsk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gDzsFIEHMR7JPIy2I1yolfQw0NugsLL/hl0Qo9S1NoGicokO+lW7pz2WJgGaajzFs2Koroi1OQ5JMslgcfcumxRD5xC8T4dMh8tW9h62qJXvo3dTBd17RqBIM8+UYahSWZG8zqZ/rwT3gbTRECblp6ueATBkaDuY80qjHT1JZ4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 677272028D7; Mon, 20 Jul 2026 15:48:26 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM6-000PmZ-13; Mon, 20 Jul 2026 15:48:26 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id D932456E51F; Mon, 20 Jul 2026 13:48:25 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:03 +0200 Subject: [PATCH can-next 02/13] can: gs_usb: replace all GS_CAN_MODE_* by GS_CAN_FEATURE_* Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-2-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2779; i=mkl@pengutronix.de; h=from:subject:message-id; bh=vHGDWfgrCVCk7ndp2ooFqyZLm638GrOopzetugJNxsk=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU5cQvSlYEJy/+Kug9yt3S3nnC3GNcUXX90oZnQ6d7 Sz8Ok20o5SFQYyLQVZMkWXpjxOKAoEOpb0vEybBzGFlAhnCwMUpABPRfMrIsG6OBW+W3YtLXHFB a3cmv10fZeHznevvTa25bpyuwX7r+hgZnk711NRMKXJPdZ6oIKD7+LG5ouXRfzN+2nQp6t+K/7q THQA= X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 The values for the defines GS_CAN_MODE_* and GS_CAN_FEATURE_* are intentionally identical. The device signals its capabilities with GS_CAN_FEATURE_* in struct gs_device_bt_const::feature and the driver activates them with GS_CAN_MODE_* in struct gs_device_mode::flags. Standardize on GS_CAN_FEATURE_* to eliminate redundant macro definitions and align the driver with the candlelight firmware implementation (commit cdadf34281c7 ("gs_usb: replace all GS_CAN_MODE_xxx by GS_CAN_FEATURE_xxx"). Link: https://github.com/candle-usb/candleLight_fw/commit/cdadf34281c777740= 229b152ce928ca9a819d727 Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index c8bb6eeff667..2f55030a21a5 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -127,21 +127,6 @@ struct gs_device_config { __le32 hw_version; } __packed; =20 -#define GS_CAN_MODE_LISTEN_ONLY BIT(0) -#define GS_CAN_MODE_LOOP_BACK BIT(1) -#define GS_CAN_MODE_TRIPLE_SAMPLE BIT(2) -#define GS_CAN_MODE_ONE_SHOT BIT(3) -#define GS_CAN_MODE_HW_TIMESTAMP BIT(4) -/* GS_CAN_FEATURE_IDENTIFY BIT(5) */ -/* GS_CAN_FEATURE_USER_ID BIT(6) */ -#define GS_CAN_MODE_PAD_PKTS_TO_MAX_PKT_SIZE BIT(7) -#define GS_CAN_MODE_FD BIT(8) -/* GS_CAN_FEATURE_REQ_USB_QUIRK_LPC546XX BIT(9) */ -/* GS_CAN_FEATURE_BT_CONST_EXT BIT(10) */ -/* GS_CAN_FEATURE_TERMINATION BIT(11) */ -#define GS_CAN_MODE_BERR_REPORTING BIT(12) -/* GS_CAN_FEATURE_GET_STATE BIT(13) */ - struct gs_device_mode { __le32 mode; __le32 flags; @@ -1033,26 +1018,26 @@ static int gs_can_open(struct net_device *netdev) =20 /* flags */ if (ctrlmode & CAN_CTRLMODE_LOOPBACK) - flags |=3D GS_CAN_MODE_LOOP_BACK; + flags |=3D GS_CAN_FEATURE_LOOP_BACK; =20 if (ctrlmode & CAN_CTRLMODE_LISTENONLY) - flags |=3D GS_CAN_MODE_LISTEN_ONLY; + flags |=3D GS_CAN_FEATURE_LISTEN_ONLY; =20 if (ctrlmode & CAN_CTRLMODE_3_SAMPLES) - flags |=3D GS_CAN_MODE_TRIPLE_SAMPLE; + flags |=3D GS_CAN_FEATURE_TRIPLE_SAMPLE; =20 if (ctrlmode & CAN_CTRLMODE_ONE_SHOT) - flags |=3D GS_CAN_MODE_ONE_SHOT; + flags |=3D GS_CAN_FEATURE_ONE_SHOT; =20 if (ctrlmode & CAN_CTRLMODE_BERR_REPORTING) - flags |=3D GS_CAN_MODE_BERR_REPORTING; + flags |=3D GS_CAN_FEATURE_BERR_REPORTING; =20 if (ctrlmode & CAN_CTRLMODE_FD) - flags |=3D GS_CAN_MODE_FD; + flags |=3D GS_CAN_FEATURE_FD; =20 /* if hardware supports timestamps, enable it */ if (dev->feature & GS_CAN_FEATURE_HW_TIMESTAMP) - flags |=3D GS_CAN_MODE_HW_TIMESTAMP; + flags |=3D GS_CAN_FEATURE_HW_TIMESTAMP; =20 rc =3D gs_usb_set_bittiming(dev); if (rc) { --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 67DAB417BCC; Mon, 20 Jul 2026 13:48:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555317; cv=none; b=R6/g8arxH/C7V6dAV7CuA5a74sEYzm0Kis0+BPR7L5batggM+OP9QKvgXr4y2UIZdg8JjoBvwpMUUpXSnc6q8vLurGrJy1jolCgce+XRc2GV4OUHMAbaGm/MN8LAmxjhPiNl2DL9Mc9HJBSVloBZ+udjMxxA+5xK2d4rFrGEtLw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555317; c=relaxed/simple; bh=SNHleqaZ2q2R2o8p2sR3JoQnTLPD8QnYbeOMnJeue0Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CluutTSO8OlLrwtyB5qrM4JAsQd8SgRekD4SdA01s3rT5C8QP7BRpdMxHZ5u6TGPnn2K3P4jiPM8jaB3FzxzMRky9fPAdaHPU9r55ONeILsauOv+2nMqCKZkVP5cwiVgQK0EsoqiXPtV19Xk8Gz5w0kAby/zRoJ6ukPgAwdL/rM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id C46542028D8; Mon, 20 Jul 2026 15:48:26 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM6-000Pmd-2G; Mon, 20 Jul 2026 15:48:26 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 3BD4256E520; Mon, 20 Jul 2026 13:48:26 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:04 +0200 Subject: [PATCH can-next 03/13] can: gs_usb: update USB protocol definitions contributed by Elmue firmware Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-3-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2179; i=mkl@pengutronix.de; h=from:subject:message-id; bh=SNHleqaZ2q2R2o8p2sR3JoQnTLPD8QnYbeOMnJeue0Y=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU5d8fEYrXdwvidtXeOOWyWeM0pXDewuE/L4+ONpgs /yTY8azjlIWBjEuBlkxRZalP04oCgQ6lPa+TJgEM4eVCWQIAxenAEwkbBYjw+Pszb2nVTKTFLZZ 2Uw+XKsV92hDTs3nkm7X6zO9OLSYzzD84b/+1X3C9R038yKY9wo8vP369rJ1dXlGtx9p+i5znM7 pwgsA X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 The gs_usb compatible firmware by Elmue extended the USB protocol. Document the newly added GS_CAN_FEATURE_ELM_* bits and the new GS_USB_BREQ_ELM_GET_* USB requests along with some placeholders for future extensions. Link: https://github.com/Elmue/CANable-2.5-firmware-Slcan-and-Candlelight Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 2f55030a21a5..57062983b148 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -72,6 +72,23 @@ enum gs_usb_breq { GS_USB_BREQ_SET_TERMINATION, GS_USB_BREQ_GET_TERMINATION, GS_USB_BREQ_GET_STATE, + __GS_USB_BREQ_PLACEHOLDER_15, + __GS_USB_BREQ_PLACEHOLDER_16, + __GS_USB_BREQ_PLACEHOLDER_17, + __GS_USB_BREQ_PLACEHOLDER_18, + __GS_USB_BREQ_PLACEHOLDER_19, + GS_USB_BREQ_ELM_GET_BOARDINFO =3D 20, + GS_USB_BREQ_ELM_SET_FILTER, + GS_USB_BREQ_ELM_GET_LASTERROR, + GS_USB_BREQ_ELM_SET_BUSLOADREPORT, + GS_USB_BREQ_ELM_SET_PINSTATUS, + GS_USB_BREQ_ELM_GET_PINSTATUS, + GS_USB_BREQ_ELM_READ_FLASH, + GS_USB_BREQ_ELM_WRITE_FLASH, + __GS_USB_BREQ_ELM_PLACEHOLDER_28, + __GS_USB_BREQ_ELM_PLACEHOLDER_29, + __GS_USB_BREQ_ELM_PLACEHOLDER_30, + __GS_USB_BREQ_ELM_PLACEHOLDER_31, }; =20 enum gs_can_mode { @@ -168,7 +185,14 @@ struct gs_device_termination_state { #define GS_CAN_FEATURE_TERMINATION BIT(11) #define GS_CAN_FEATURE_BERR_REPORTING BIT(12) #define GS_CAN_FEATURE_GET_STATE BIT(13) -#define GS_CAN_FEATURE_MASK GENMASK(13, 0) +#define GS_CAN_FEATURE_ELM_PROTOCOL BIT(14) +/* supported by Elmue firmware until 0x260528 (including) */ +#define GS_CAN_FEATURE_ELM_DISABLE_TX_ECHO BIT(15) +/* supported by Elmue firmware since 0x260529 (including) */ +#define GS_CAN_FEATURE_ELM_DEV_FLAG_SEND_USB_BLOBS BIT(15) +/* supported by Elmue firmware 0x260528 only */ +#define GS_CAN_FEATURE_ELM_DEV_FLAG_SEND_USB_BLOBS_260528 BIT(16) +#define GS_CAN_FEATURE_MASK GENMASK(16, 0) =20 /* internal quirks - keep in GS_CAN_FEATURE space for now */ =20 --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60D0A426432; Mon, 20 Jul 2026 13:48:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555317; cv=none; b=tUXojaV9f1qY6ojtBmodOxUKm6OMOOUJx7ke0XevzkY6XQ2R++bx9epwumJ9W/cZP7ybFLtZb2K7LXzsnwrLC1IHhuAmXnWJTR+FwzfdMqBnpRhRikgoPS4IYm2zOEhIt6AXKvM0KsX9QIGDMnJPLSRhHM1wtypJrPZOq4rv92s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555317; c=relaxed/simple; bh=S9wrOEJ5JCczZJ76JEv65xY/YI097d4nfOjEqW8oxQU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S1VITbvfgSbGbilQmt7Bt/aBrlCC/7BINGx4kqli0AjV+e8W8aBjZXtIrne6ZHG25iFofOzTHehqqOHvAm5Vho7J6cKuY52y/BfBFuLtCq9Kimq9vD+LllHsCWWmR0go70q+oV1NWQex9HU9eSHS726zZ1m9OIJ/a7ryUaZ28cA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 2AD182028D9; Mon, 20 Jul 2026 15:48:27 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM7-000Pmh-0G; Mon, 20 Jul 2026 15:48:27 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 97DED56E521; Mon, 20 Jul 2026 13:48:26 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:05 +0200 Subject: [PATCH can-next 04/13] can: gs_usb: document GS_CAN_FEATURE_FILTER Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-4-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2491; i=mkl@pengutronix.de; h=from:subject:message-id; bh=S9wrOEJ5JCczZJ76JEv65xY/YI097d4nfOjEqW8oxQU=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU5e6MXNtxR9+xzVy13c819k2kffstJYtrvdMu6/Nu D7FX26iTUcpC4MYF4OsmCLL0h8nFAUCHUp7XyZMgpnDygQyhIGLUwAmcsSdkWG9mMp07yy96Xln 3dwTjxdJnMzewHQ1KZ9NuWql/M5pmqYM/0utXn7rj13g1JWle8Xl+Zd1h956/DQpUjj14KH0AWa THk4A X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 Document the feature ("GS_CAN_FEATURE_FILTER") that indicates that the CAN controller supports querying CAN filter capabilities with the GS_USB_BREQ_GET_FILTER control message and setting CAN filter with the GS_USB_BREQ_SET_FILTER control message. Link: https://github.com/candle-usb/candleLight_fw/pull/204 Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 57062983b148..82be2db76fe7 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -72,8 +72,8 @@ enum gs_usb_breq { GS_USB_BREQ_SET_TERMINATION, GS_USB_BREQ_GET_TERMINATION, GS_USB_BREQ_GET_STATE, - __GS_USB_BREQ_PLACEHOLDER_15, - __GS_USB_BREQ_PLACEHOLDER_16, + GS_USB_BREQ_SET_FILTER, + GS_USB_BREQ_GET_FILTER, __GS_USB_BREQ_PLACEHOLDER_17, __GS_USB_BREQ_PLACEHOLDER_18, __GS_USB_BREQ_PLACEHOLDER_19, @@ -120,6 +120,10 @@ enum gs_can_termination_state { #define GS_USB_TERMINATION_DISABLED CAN_TERMINATION_DISABLED #define GS_USB_TERMINATION_ENABLED 120 =20 +enum gs_device_filter_dev { + GS_DEVICE_FILTER_DEV_BXCAN =3D 1, /* bxcan, 14 filters */ +}; + /* data types passed between host and device */ =20 /* The firmware on the original USB2CAN by Geschwister Schneider @@ -171,6 +175,27 @@ struct gs_device_termination_state { __le32 state; } __packed; =20 +struct gs_device_filter_info { + u8 dev; /* enum gs_device_filter_dev */ + u8 reserved[3]; +} __packed __aligned(4); + +struct gs_device_filter_bxcan { + __le32 fs1r; + __le32 fm1r; + __le32 ffa1r; + __le32 fa1r; + __le32 fr1[14]; + __le32 fr2[14]; +} __packed __aligned(4); + +struct gs_device_filter { + struct gs_device_filter_info info; + union { + struct gs_device_filter_bxcan bxcan; + }; +} __packed __aligned(4); + #define GS_CAN_FEATURE_LISTEN_ONLY BIT(0) #define GS_CAN_FEATURE_LOOP_BACK BIT(1) #define GS_CAN_FEATURE_TRIPLE_SAMPLE BIT(2) @@ -192,6 +217,7 @@ struct gs_device_termination_state { #define GS_CAN_FEATURE_ELM_DEV_FLAG_SEND_USB_BLOBS BIT(15) /* supported by Elmue firmware 0x260528 only */ #define GS_CAN_FEATURE_ELM_DEV_FLAG_SEND_USB_BLOBS_260528 BIT(16) +#define GS_CAN_FEATURE_FILTER BIT(16) #define GS_CAN_FEATURE_MASK GENMASK(16, 0) =20 /* internal quirks - keep in GS_CAN_FEATURE space for now */ --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0A15F426EB9; Mon, 20 Jul 2026 13:48:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555323; cv=none; b=IBQVWAKe0FFp2hSJPnOPYkoXl2IcI9qAKGnB+U3PVLhsq0epzBxsUV/a2fZxsMR43lrhT+l/Woq2PPTmGsvp4XD+g8O6+RslegLHzqCFP6kjmF3fC3q4/O2VDMTngmi7/2xeD/Su8SdBfS1yEbryqic/623JCz482/Qzjr588wY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555323; c=relaxed/simple; bh=+OQxfRMhE5NxxN2dF0McGZRHhVPQS9xVQyKtSl+hQ9I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JLXmLDbeCPCwlxtbrCrN5RqspHpgV+C2HkD38iN1iZPQv5sElca3Mq25wky4ZQJfRlT4Bh6SFTLBuNbnEHmWvyxXSg5aUcATc7U+h/56XH2riGC2lOFMYt4SD5WAUpBN1NB4yZ0tpoNNOAVN+r594A20RUWnDjiOGfmkCqJIMyc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 8F9562028DA; Mon, 20 Jul 2026 15:48:27 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM7-000Pml-1a; Mon, 20 Jul 2026 15:48:27 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id F350356E522; Mon, 20 Jul 2026 13:48:26 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:06 +0200 Subject: [PATCH can-next 05/13] can: gs_usb: gs_make_candev(): reduce scope of variable bt_const_extended Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-5-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1097; i=mkl@pengutronix.de; h=from:subject:message-id; bh=+OQxfRMhE5NxxN2dF0McGZRHhVPQS9xVQyKtSl+hQ9I=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU5dmWyO9SJ4n7sBB2bMRy1RVIo9Z6zJO2j+n3fhn3 MSn8+z/dpSyMIhxMciKKbIs/XFCUSDQobT3ZcIkmDmsTCBDGLg4BWAixQ8ZGb79+nNfx3aJ4aKI +7PLTf1ydR+yyy/XuWq1rzHF4aW88E9GhmVnhXb/EOuz2zc5mzE+XqNn9epXLSJ6+/mbVt3WSv8 ylRcA X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 To improve readability of the code, reduce the scope of the variable bt_const_extended. Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 82be2db76fe7..d049ae20b53d 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -1355,7 +1355,6 @@ static struct gs_can *gs_make_candev(unsigned int cha= nnel, struct gs_can *dev; struct net_device *netdev; int rc; - struct gs_device_bt_const_extended bt_const_extended; struct gs_device_bt_const bt_const; u32 feature; =20 @@ -1495,6 +1494,8 @@ static struct gs_can *gs_make_candev(unsigned int cha= nnel, */ if (feature & GS_CAN_FEATURE_FD && feature & GS_CAN_FEATURE_BT_CONST_EXT) { + struct gs_device_bt_const_extended bt_const_extended; + rc =3D usb_control_msg_recv(interface_to_usbdev(intf), 0, GS_USB_BREQ_BT_CONST_EXT, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 66A503B3892; Mon, 20 Jul 2026 13:48:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555323; cv=none; b=Qv1DcRWANZDltq7z1ND/ThXVhx6vG4uwhFXQNsIKyfWyL34ifWL6qxFa89jwdvJ5Q/UgqCZrQ1LWDBPNWFVrwY1YAsB73X//jINGvZdlYv0WhyeuYczeOBxwP7J88igJ9qI8IZ2fh70A9oPoOZYqyjGa6JdIw1OUj8MImdaxogE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555323; c=relaxed/simple; bh=HFfuf93yQbIFax5XUlCbnfLMmkMLsGHEpFKHAlnuWZ4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qqoQ9rcwPH21CrLJJVBLNjkDVV+l/h6EOZc4wr4gdCofP9AQwjJydKP+06/hPmvclKYGEm1dK5YXjLWwT/1NrhNWLcJ9ibkchcjyWJWqJ2SSJnLeQXOot6RFJeqK+FmBmyM8whDkFcoybVgMIOOkUKvoCF+BE/N772Oq8v+OIjQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 0121E2028DC; Mon, 20 Jul 2026 15:48:28 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM7-000Pmp-2v; Mon, 20 Jul 2026 15:48:27 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 6942A56E523; Mon, 20 Jul 2026 13:48:27 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:07 +0200 Subject: [PATCH can-next 06/13] can: gs_usb: gs_make_candev(): sort evaluation of device features Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-6-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4012; i=mkl@pengutronix.de; h=from:subject:message-id; bh=HFfuf93yQbIFax5XUlCbnfLMmkMLsGHEpFKHAlnuWZ4=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU5dd83baL73SjNZP7j0yRgmfZdI/5Wvy6AflLWW+o FGcoLOlo5SFQYyLQVZMkWXpjxOKAoEOpb0vEybBzGFlAhnCwMUpABOZuYThr6zZUzOGJ/03jyo+ ePjxR4rF+a7Eq2Fy6ab77whXq5tonmD4p5r7NFn6boF16CTbpO1XnmzeaW5q+4zhmWDUlruvl3i IcQMA X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 To simplify maintenance and improve readability, sort the evaluation of the device features by the value of each feature. Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 54 +++++++++++++++++++++++-----------------= ---- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index d049ae20b53d..d77f0940c035 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -1420,6 +1420,8 @@ static struct gs_can *gs_make_candev(unsigned int cha= nnel, =20 feature =3D le32_to_cpu(bt_const.feature); dev->feature =3D FIELD_GET(GS_CAN_FEATURE_MASK, feature); + + /* keep sorted by GS_CAN_FEATURE */ if (feature & GS_CAN_FEATURE_LISTEN_ONLY) dev->can.ctrlmode_supported |=3D CAN_CTRLMODE_LISTENONLY; =20 @@ -1432,6 +1434,11 @@ static struct gs_can *gs_make_candev(unsigned int ch= annel, if (feature & GS_CAN_FEATURE_ONE_SHOT) dev->can.ctrlmode_supported |=3D CAN_CTRLMODE_ONE_SHOT; =20 + /* GS_CAN_FEATURE_IDENTIFY is only supported for sw_version > 1 */ + if (!(le32_to_cpu(dconf->sw_version) > 1 && + feature & GS_CAN_FEATURE_IDENTIFY)) + dev->feature &=3D ~GS_CAN_FEATURE_IDENTIFY; + if (feature & GS_CAN_FEATURE_FD) { dev->can.ctrlmode_supported |=3D CAN_CTRLMODE_FD; /* The data bit timing will be overwritten, if @@ -1440,27 +1447,6 @@ static struct gs_can *gs_make_candev(unsigned int ch= annel, dev->can.fd.data_bittiming_const =3D &dev->bt_const; } =20 - if (feature & GS_CAN_FEATURE_TERMINATION) { - rc =3D gs_usb_get_termination(netdev, &dev->can.termination); - if (rc) { - dev->feature &=3D ~GS_CAN_FEATURE_TERMINATION; - - dev_info(&intf->dev, - "Disabling termination support for channel %d (%pe)\n", - channel, ERR_PTR(rc)); - } else { - dev->can.termination_const =3D gs_usb_termination_const; - dev->can.termination_const_cnt =3D ARRAY_SIZE(gs_usb_termination_const); - dev->can.do_set_termination =3D gs_usb_set_termination; - } - } - - if (feature & GS_CAN_FEATURE_BERR_REPORTING) - dev->can.ctrlmode_supported |=3D CAN_CTRLMODE_BERR_REPORTING; - - if (feature & GS_CAN_FEATURE_GET_STATE) - dev->can.do_get_berr_counter =3D gs_usb_can_get_berr_counter; - /* The CANtact Pro from LinkLayer Labs is based on the * LPC54616 =C2=B5C, which is affected by the NXP LPC USB transfer * erratum. However, the current firmware (version 2) doesn't @@ -1484,11 +1470,6 @@ static struct gs_can *gs_make_candev(unsigned int ch= annel, dev->feature |=3D GS_CAN_FEATURE_REQ_USB_QUIRK_LPC546XX | GS_CAN_FEATURE_QUIRK_BREQ_CANTACT_PRO; =20 - /* GS_CAN_FEATURE_IDENTIFY is only supported for sw_version > 1 */ - if (!(le32_to_cpu(dconf->sw_version) > 1 && - feature & GS_CAN_FEATURE_IDENTIFY)) - dev->feature &=3D ~GS_CAN_FEATURE_IDENTIFY; - /* fetch extended bit timing constants if device has feature * GS_CAN_FEATURE_FD and GS_CAN_FEATURE_BT_CONST_EXT */ @@ -1522,6 +1503,27 @@ static struct gs_can *gs_make_candev(unsigned int ch= annel, dev->can.fd.data_bittiming_const =3D &dev->data_bt_const; } =20 + if (feature & GS_CAN_FEATURE_TERMINATION) { + rc =3D gs_usb_get_termination(netdev, &dev->can.termination); + if (rc) { + dev->feature &=3D ~GS_CAN_FEATURE_TERMINATION; + + dev_info(&intf->dev, + "Disabling termination support for channel %d (%pe)\n", + channel, ERR_PTR(rc)); + } else { + dev->can.termination_const =3D gs_usb_termination_const; + dev->can.termination_const_cnt =3D ARRAY_SIZE(gs_usb_termination_const); + dev->can.do_set_termination =3D gs_usb_set_termination; + } + } + + if (feature & GS_CAN_FEATURE_BERR_REPORTING) + dev->can.ctrlmode_supported |=3D CAN_CTRLMODE_BERR_REPORTING; + + if (feature & GS_CAN_FEATURE_GET_STATE) + dev->can.do_get_berr_counter =3D gs_usb_can_get_berr_counter; + can_rx_offload_add_manual(netdev, &dev->offload, GS_NAPI_WEIGHT); SET_NETDEV_DEV(netdev, &intf->dev); =20 --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 44F4A428463; Mon, 20 Jul 2026 13:48:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555325; cv=none; b=NY3QA2pU1cJDh34gu7bVDGWpMvVg6YHrO/FdrJo3c4VTUT16OIikbVVbcxaXNq+72GTaro3/lgU3CDET6veS8MXE8bCMnS/CC+DlU4LV98lIuDXNGz6YsBXUdGV5dCUErJ5Ce51cTVJNVhRJKlJ8SAp//XtLm2srA/Ydf8EPPgM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555325; c=relaxed/simple; bh=m93Tn6a3VPp7Ec8B5ez7OpvUxCFFb4wOlk9IKU6yK8E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RGipvYF2bbxMKl4idRbou57Jct+X7pHn1yz6vOoSh6TNYh433+1iSP8Fs3EBW2btXjEuGVdSCUeyiWgIwwlQJm+hmzabbOEK43jOzLFy/wm5k5KcZLx8RxSSGjKYEbULBi18iaoKdMRrPgYZsIHxuoS4W0iUPx74tNo0rghDomc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 67B452028DD; Mon, 20 Jul 2026 15:48:28 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM8-000Pmt-12; Mon, 20 Jul 2026 15:48:28 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id D010056E524; Mon, 20 Jul 2026 13:48:27 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:08 +0200 Subject: [PATCH can-next 07/13] can: gs_usb: gs_usb_receive_bulk_callback(): reduce scope of several variables Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-7-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1956; i=mkl@pengutronix.de; h=from:subject:message-id; bh=m93Tn6a3VPp7Ec8B5ez7OpvUxCFFb4wOlk9IKU6yK8E=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU5fbuPmLzt2WNdt1fbZukGx4yWoTrOGQVdtssHeKq 6mcV0Z5RykLgxgXg6yYIsvSHycUBQIdSntfJkyCmcPKBDKEgYtTACayT5Xhn2ogx4a8cDddA7Wo WqdDW/kdVve+5XglsWjqiYkrsvwmHWL4H/bZYrFr+JLiqR9naoq+O73thf1noUClQxeEDiX9fDj 7OScA X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 To improve readability of the code, reduce the scope of the variables txc, cf and cfd and skb. Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index d77f0940c035..473f125e20d8 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -649,10 +649,6 @@ static void gs_usb_receive_bulk_callback(struct urb *u= rb) struct net_device_stats *stats; struct gs_host_frame *hf =3D urb->transfer_buffer; unsigned int minimum_length, data_length; - struct gs_tx_context *txc; - struct can_frame *cf; - struct canfd_frame *cfd; - struct sk_buff *skb; =20 BUG_ON(!parent); =20 @@ -705,7 +701,11 @@ static void gs_usb_receive_bulk_callback(struct urb *u= rb) } =20 if (hf->echo_id =3D=3D GS_HOST_FRAME_ECHO_ID_RX) { /* normal rx */ + struct sk_buff *skb; + if (hf->flags & GS_CAN_FLAG_FD) { + struct canfd_frame *cfd; + skb =3D alloc_canfd_skb(netdev, &cfd); if (!skb) return; @@ -719,6 +719,8 @@ static void gs_usb_receive_bulk_callback(struct urb *ur= b) =20 memcpy(cfd->data, hf->canfd->data, data_length); } else { + struct can_frame *cf; + skb =3D alloc_can_skb(netdev, &cf); if (!skb) return; @@ -735,6 +737,9 @@ static void gs_usb_receive_bulk_callback(struct urb *ur= b) =20 gs_usb_rx_offload(dev, skb, hf); } else { /* echo_id =3D=3D hf->echo_id */ + struct gs_tx_context *txc; + struct sk_buff *skb; + if (hf->echo_id >=3D GS_MAX_TX_URBS) { netdev_err(netdev, "Unexpected out of range echo id %u\n", @@ -763,6 +768,9 @@ static void gs_usb_receive_bulk_callback(struct urb *ur= b) } =20 if (hf->flags & GS_CAN_FLAG_OVERFLOW) { + struct can_frame *cf; + struct sk_buff *skb; + stats->rx_over_errors++; stats->rx_errors++; =20 --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E5CE3C553C; Mon, 20 Jul 2026 13:48:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555324; cv=none; b=UGPy6gRXWG/+BZmR0nelJtifMYUT/RizDQk8nxZvOZghJ0ylFpM2xDa62EFZXbBY9tOjnPUb38q18i5dHEHnt7p+sIgAP4UrQGubkTwvsT9gu+l5UkhVEsV9G2ijiXgsowxdXv1wFBL5Je3nVLodrjp/YO10c1Cc67yLoO3R2Vs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555324; c=relaxed/simple; bh=Txe5O5T5elBjcyJRedXKsdRrhV72hIsg2q3KQM0yjfY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=W2M1Mxgluc7yu2PlgTkc5YJLuSXrnzVIg4Hms5VdPFpBNkQDPoaWR5wK3dx1EJAiTlUVS6XUf7tg9/nNZTt7Rpkz2hw4RNha/OYIiIsmI9ohbXJEdz2X+cQFFlP5BRwJRqmbbCfM4TYyDcaPKDQYSUi4zxBp57Bwb9o/0hAaSxw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id CC6DD2028DE; Mon, 20 Jul 2026 15:48:28 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM8-000Pmx-2O; Mon, 20 Jul 2026 15:48:28 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 3B07656E525; Mon, 20 Jul 2026 13:48:28 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:09 +0200 Subject: [PATCH can-next 08/13] can: gs_usb: gs_update_state(): convert CAN state handling to can_change_state() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-8-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6845; i=mkl@pengutronix.de; h=from:subject:message-id; bh=Txe5O5T5elBjcyJRedXKsdRrhV72hIsg2q3KQM0yjfY=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU5evM2D+7bP3/K1Fa3dtF7v15yJH4FKTqKvZnUXnG 013PxH62lHKwiDGxSArpsiy9McJRYFAh9LelwmTYOawMoEMYeDiFICJcBQx/E+bsu/EXetNb2q6 1yduj5vuuiqokbug8251zuVdx0x+dlxlZFgTIvxa7oqYgoXUiXdbY9nvfLDL/+9XUOdd3m7ycla iFxsA X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 The gs_usb compatible firmware signals CAN state changes via CAN error frames to the kernel. As the kernel tracks the state of the CAN device, the driver has to parse the CAN state from these CAN error frames. Since the driver has been written, the can_change_state() helper was introduced to the kernel, in order to send more uniform CAN state error frames to the user space. Convert the driver to make use of the can_change_state() helper. Implement gs_usb_state_get_by_hf() to figure TX and RX state by parsing the received struct gs_host_frame. If the CAN error counters are not 0, some firmware repeatedly send CAN state error frames, even if the CAN state does not change. Implement gs_usb_should_handle_can_error() to drop these, but keep other CAN error frames. Update gs_update_state() to make use of can_change_state(), clear all CAN state information from the CAN frame (which will be send to user space) and let can_change_state() populate it consistently from the previously parsed CAN TX and RX state information. Some firmware does automatically CAN bus off recovery, without signaling this via CAN_ERR_RESTARTED. If the CAN state changes from Bus Off to Error Active, Warning or Passive, treat this also as a restart of the CAN controller. Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 114 +++++++++++++++++++++++++++++++++++----= ---- 1 file changed, 95 insertions(+), 19 deletions(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 473f125e20d8..e41f91b56ab8 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -529,29 +529,31 @@ static void gs_usb_timestamp_stop(struct gs_usb *pare= nt) cancel_delayed_work_sync(&parent->timestamp); } =20 -static void gs_update_state(struct gs_can *dev, struct can_frame *cf) +static void gs_update_state(struct gs_can *dev, struct can_frame *cf, + enum can_state tx_state, enum can_state rx_state) { struct can_device_stats *can_stats =3D &dev->can.can_stats; =20 - if (cf->can_id & CAN_ERR_RESTARTED) { - dev->can.state =3D CAN_STATE_ERROR_ACTIVE; + /* clear CAN state information, will be set consistently by can_change_st= ate() below */ + cf->can_id &=3D ~(CAN_ERR_CRTL | CAN_ERR_BUSOFF | CAN_ERR_RESTARTED); + cf->data[1] &=3D ~(CAN_ERR_CRTL_RX_WARNING | CAN_ERR_CRTL_TX_WARNING | + CAN_ERR_CRTL_RX_PASSIVE | CAN_ERR_CRTL_TX_PASSIVE | + CAN_ERR_CRTL_ACTIVE); + + const enum can_state new_state =3D max(rx_state, tx_state); + + if (new_state =3D=3D dev->can.state) + return; + + /* some firmware does automatically CAN bus off recovery, account for thi= s */ + if (cf->can_id & CAN_ERR_RESTARTED || + (dev->can.state =3D=3D CAN_STATE_BUS_OFF && new_state < CAN_STATE_BUS= _OFF)) { can_stats->restarts++; - } else if (cf->can_id & CAN_ERR_BUSOFF) { - dev->can.state =3D CAN_STATE_BUS_OFF; - can_stats->bus_off++; - } else if (cf->can_id & CAN_ERR_CRTL) { - if ((cf->data[1] & CAN_ERR_CRTL_TX_WARNING) || - (cf->data[1] & CAN_ERR_CRTL_RX_WARNING)) { - dev->can.state =3D CAN_STATE_ERROR_WARNING; - can_stats->error_warning++; - } else if ((cf->data[1] & CAN_ERR_CRTL_TX_PASSIVE) || - (cf->data[1] & CAN_ERR_CRTL_RX_PASSIVE)) { - dev->can.state =3D CAN_STATE_ERROR_PASSIVE; - can_stats->error_passive++; - } else { - dev->can.state =3D CAN_STATE_ERROR_ACTIVE; - } + /* some firmware doesn't set CAN_ERR_RESTARTED, fixup */ + cf->can_id |=3D CAN_ERR_RESTARTED; } + + can_change_state(dev->can.dev, cf, tx_state, rx_state); } =20 static u32 gs_usb_set_timestamp(struct gs_can *dev, struct sk_buff *skb, @@ -640,6 +642,75 @@ gs_usb_get_minimum_rx_length(const struct gs_can *dev,= const struct gs_host_fram return minimum_length; } =20 +static void +gs_usb_state_get_by_hf(const struct gs_can *dev, const struct gs_host_fram= e *hf, + enum can_state *tx_state_p, enum can_state *rx_state_p) +{ + enum can_state tx_state, rx_state; + + /* extract CAN state from frame */ + if (hf->can_id & cpu_to_le32(CAN_ERR_CRTL | CAN_ERR_BUSOFF)) { + const u8 err_crtl =3D hf->classic_can->data[1]; + + if (hf->can_id & cpu_to_le32(CAN_ERR_BUSOFF)) { + tx_state =3D CAN_STATE_BUS_OFF; + rx_state =3D CAN_STATE_BUS_OFF; + } else { + if (err_crtl & CAN_ERR_CRTL_RX_PASSIVE) + rx_state =3D CAN_STATE_ERROR_PASSIVE; + else if (err_crtl & CAN_ERR_CRTL_RX_WARNING) + rx_state =3D CAN_STATE_ERROR_WARNING; + else + rx_state =3D CAN_STATE_ERROR_ACTIVE; + + if (err_crtl & CAN_ERR_CRTL_TX_PASSIVE) + tx_state =3D CAN_STATE_ERROR_PASSIVE; + else if (err_crtl & CAN_ERR_CRTL_TX_WARNING) + tx_state =3D CAN_STATE_ERROR_WARNING; + else + tx_state =3D CAN_STATE_ERROR_ACTIVE; + } + } else { + tx_state =3D dev->can.state; + rx_state =3D dev->can.state; + } + + *tx_state_p =3D tx_state; + *rx_state_p =3D rx_state; +} + +static bool +gs_usb_should_handle_can_error(const struct gs_can *dev, const struct gs_h= ost_frame *hf, + enum can_state *tx_state_p, enum can_state *rx_state_p) +{ + gs_usb_state_get_by_hf(dev, hf, tx_state_p, rx_state_p); + + /* If the CAN error counters are not 0, some firmware repeatedly send CAN= state error + * frames, even if the CAN state does not change. Handle changed CAN stat= es. + */ + const enum can_state new_state =3D max(*tx_state_p, *rx_state_p); + + if (new_state !=3D dev->can.state) + return true; + + /* handle RX and TX overflow */ + const u8 err_crtl =3D hf->classic_can->data[1]; + + if ((hf->can_id & cpu_to_le32(CAN_ERR_CRTL)) && + err_crtl & (CAN_ERR_CRTL_RX_OVERFLOW | CAN_ERR_CRTL_TX_OVERFLOW)) + return true; + + /* handle TX timeout */ + if (hf->can_id & cpu_to_le32(CAN_ERR_TX_TIMEOUT)) + return true; + + /* handle CAN bus errors */ + if (hf->can_id & cpu_to_le32(CAN_ERR_LOSTARB | CAN_ERR_PROT | CAN_ERR_TRX= | CAN_ERR_ACK)) + return true; + + return false; +} + static void gs_usb_receive_bulk_callback(struct urb *urb) { struct gs_usb *parent =3D urb->context; @@ -719,8 +790,13 @@ static void gs_usb_receive_bulk_callback(struct urb *u= rb) =20 memcpy(cfd->data, hf->canfd->data, data_length); } else { + enum can_state tx_state, rx_state; struct can_frame *cf; =20 + if (hf->can_id & cpu_to_le32(CAN_ERR_FLAG) && + !gs_usb_should_handle_can_error(dev, hf, &tx_state, &rx_state)) + goto resubmit_urb; + skb =3D alloc_can_skb(netdev, &cf); if (!skb) return; @@ -732,7 +808,7 @@ static void gs_usb_receive_bulk_callback(struct urb *ur= b) =20 /* ERROR frames tell us information about the controller */ if (le32_to_cpu(hf->can_id) & CAN_ERR_FLAG) - gs_update_state(dev, cf); + gs_update_state(dev, cf, tx_state, rx_state); } =20 gs_usb_rx_offload(dev, skb, hf); --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C548428859; Mon, 20 Jul 2026 13:48:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555325; cv=none; b=bPir542rAKqHKl+bKorNf/6drdRsDQD130EMkwIGzb8QY9c2Ic0TCETu4iONCkzrHBeA8vZcuSO0tv+3RJMVlj3+hN33HBEut8btkFxjUcDNBVuIElIfaeOy6mTMgPMcdVIROpMKk+q0iZvAg0GMeRJPa420FRiJffgivvhaagg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555325; c=relaxed/simple; bh=MqHYo++apWD+T6h1LHWkcPl3hZ3jJu5XwcSk9HXDZjQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tf6aED8cVijcgoB8eSMg8RYIkbqk4JQaU8ulq4loBd0vJd0/JJqulFCul6u2jwZOnGjF8YKTfPV+OKaiiY4LtoNkqVgax3pffd6vm6kU/ynkG9SH6myWA4aqYrF5sTJkYXGg/6MicL2RQCsh7o/HqqTR+96POOs350JdhjXgfU0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 412DD2028DF; Mon, 20 Jul 2026 15:48:29 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM9-000Pn1-0Y; Mon, 20 Jul 2026 15:48:29 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id A480956E526; Mon, 20 Jul 2026 13:48:28 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:10 +0200 Subject: [PATCH can-next 09/13] can: gs_usb: gs_usb_state_get_by_hf(): optionally print recived CAN error frames Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-9-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1739; i=mkl@pengutronix.de; h=from:subject:message-id; bh=MqHYo++apWD+T6h1LHWkcPl3hZ3jJu5XwcSk9HXDZjQ=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU1dIWHWlyrpPYDfzwpB52u1RMdXLpj/899CvMXrx7 JM6th+OdJSyMIhxMciKKbIs/XFCUSDQobT3ZcIkmDmsTCBDGLg4BWAiHgcZGY40S5w4IzS1ZMq5 TDORp4ytirZZP6fP+lZ1tU5A1mUd80NGhvmvA6SUJW7scXjreXZDa3HwlFr5FXuOb7nREytXfqC YnRkA X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 The previous commit introduced gs_usb_state_get_by_hf() to parse the current CAN error state from the received CAN error frame. As there are several gs_usb compatible implementations which slightly differ in their CAN state and CAN error frame handling add a netdev_dbg() that prints the received CAN error frame for easier future debugging. Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index e41f91b56ab8..2848cb1a75f0 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -670,6 +670,21 @@ gs_usb_state_get_by_hf(const struct gs_can *dev, const= struct gs_host_frame *hf, else tx_state =3D CAN_STATE_ERROR_ACTIVE; } + + const u8 tx_err =3D hf->classic_can->data[6]; + const u8 rx_err =3D hf->classic_can->data[7]; + + netdev_dbg(dev->netdev, "host_frame: TX-state=3D'%s/%u' RX-state=3D'%s/%= u' %s%s%s%s%s%s%s", + can_get_state_str(tx_state), tx_err, + can_get_state_str(rx_state), rx_err, + hf->can_id & cpu_to_le32(CAN_ERR_BUSOFF) ? "bus-off " : "", + hf->can_id & cpu_to_le32(CAN_ERR_RESTARTED) ? + "restarted-after-bus-off " : "", + err_crtl & CAN_ERR_CRTL_RX_PASSIVE ? "rx-error-passive " : "", + err_crtl & CAN_ERR_CRTL_RX_WARNING ? "rx-error-warning " : "", + err_crtl & CAN_ERR_CRTL_TX_PASSIVE ? "tx-error-passive " : "", + err_crtl & CAN_ERR_CRTL_TX_WARNING ? "tx-error-warning " : "", + err_crtl & CAN_ERR_CRTL_ACTIVE ? "back-to-error-active " : ""); } else { tx_state =3D dev->can.state; rx_state =3D dev->can.state; --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A797242668B; Mon, 20 Jul 2026 13:48:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555325; cv=none; b=Vnm+O1qviKDkKfMj8MjZxaRRaIXhrrDUw8rHeeI0ooEA5S1uqwk0WePhf8LjZBLtYCCkatVK0JFUWp00on2I1EAn1KcEzH7o3JXCDPziERg13NUeo6WNa9ipAuZ0SMpGVaMjjUUizuuxP58puHVT6SDhc7c0xzGhxm0HsO+GEMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555325; c=relaxed/simple; bh=6E7hFTRSFelsYB949Wf8RtYAc7VuJ6L3GuSCf3VtYpQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NjXBlqKBOLlOy69xwaalHE4MEr8Y73yUJ0AQFESHEMvcs27FjQ9D/MMTceM8zMOyPiBVk9oIWD8DgkRjEonyjBoK5QE3PySWeQymlhoGOXV4qLWmLMHSBWBKsv9cJ+AT5HnrFlCBFiHdEEzjPHUcGDiKWkN+era3Sy+SXBFp/Fk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id AFCBE2028E0; Mon, 20 Jul 2026 15:48:29 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloM9-000Pn5-1z; Mon, 20 Jul 2026 15:48:29 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 1723956E52A; Mon, 20 Jul 2026 13:48:29 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:11 +0200 Subject: [PATCH can-next 10/13] can: gs_usb: gs_update_state(): set CAN_ERR_CNT if device sends CAN error counters Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-10-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=996; i=mkl@pengutronix.de; h=from:subject:message-id; bh=6E7hFTRSFelsYB949Wf8RtYAc7VuJ6L3GuSCf3VtYpQ=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU1dUexdUvWB144OlsVOk/xh2ODr+uelh//7s5VYB+ Zz175uZOkpZGMS4GGTFFFmW/jihKBDoUNr7MmESzBxWJpAhDFycAnCTZzP8s5Sa0SVYG2G4/bPb r5I927Pt3n04ZKo5u3z1ARu+8lB7Zob/XkZW2XIair9cZjSHrfRuWnvB9ZKk04nVH+d7G54oLbn CCQA= X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 Some gs_usb compatible firmware send the CAN error counters in CAN error frames, but doesn't set CAN_ERR_CNT in can_id. Fixup the CAN error frame by setting CAN_ERR_CNT, if RX or TX error counters are greater than 0. Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 2848cb1a75f0..186abc95c977 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -540,6 +540,10 @@ static void gs_update_state(struct gs_can *dev, struct= can_frame *cf, CAN_ERR_CRTL_RX_PASSIVE | CAN_ERR_CRTL_TX_PASSIVE | CAN_ERR_CRTL_ACTIVE); =20 + /* some firmware sends CAN error counters but doesn't set CAN_ERR_CNT, fi= xup */ + if (cf->data[6] || cf->data[7]) + cf->can_id |=3D CAN_ERR_CNT; + const enum can_state new_state =3D max(rx_state, tx_state); =20 if (new_state =3D=3D dev->can.state) --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8BD8537FF5C; Mon, 20 Jul 2026 13:48:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555324; cv=none; b=a/9pBTSMpKD5f9Oq94v25iVsznsZ61sIfY8fYcGR+zUNj3Lfjd+pXmoz+CU60ABXRZmnBEjv07I2yEq8PRq7ZQiPVabwIrqTYXiyY6zcaj2Fn3J/PIGaRTCwE4vpbd0cnfxDHG9WofM07L3djuTdjzI3MfZAX1YLwarabOAZ+iA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555324; c=relaxed/simple; bh=VGDIUVBKISgogud9BjBBAC7hCLcMWsVB5mLvEJttnwA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lZrt6oJhyIv6a0bw1mMRcTSSZH0iZxEyan2sjwUjOAj0vwvYahtGzDNVnN+lL5TF93/2I1f1QkoRNDeGJjqnclz0zhUqtcL5nXW2SwThsvOyJN8KMe4KtrSaZ/A2c9RYsSti/rUAMYZehY6fPKozixOB60MbEc3OYgXCcC1ZvoM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 207802028E1; Mon, 20 Jul 2026 15:48:30 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloMA-000Pn9-07; Mon, 20 Jul 2026 15:48:30 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 84A0F56E52C; Mon, 20 Jul 2026 13:48:29 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:12 +0200 Subject: [PATCH can-next 11/13] can: gs_usb: implement CAN_CTRLMODE_BERR_REPORTING for devices without native support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-11-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3159; i=mkl@pengutronix.de; h=from:subject:message-id; bh=VGDIUVBKISgogud9BjBBAC7hCLcMWsVB5mLvEJttnwA=; b=kA0DAAoWzDpk+q6ZrdIByyZiAGpeJyOiqkvP5+g5otLSdG7Mhs8PIu1+zdjPooe0Q0xbVesYS oh1BAAWCgAdFiEEpfjIIRBRQHWN6WCSzDpk+q6ZrdIFAmpeJyMACgkQzDpk+q6ZrdJM8gEA/B8l HOqa5zLSpX4FDzgJVdXsKCi5f6GceWqnvU9JLWEA/jfzPJSXc7KwDz5y9ub2ZLDtHGWg9aopSxu AfX/HzswB X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 RX or TX problems on the CAN bus are signaled by the controller in the form of CAN bus error. Each bus error increases the CAN error counters (successful RX or TX decreases the counters). When certain limits are crossed the controller changes into a different state. As CAN bus errors might come at a very high rate (>1 KHz), they are disabled in Linux by default. Commit 2f3cdad1c616 ("can: gs_usb: add ability to enable / disable berr reporting") added support to disable CAN bus error reporting if the firmware supports it. The candlelight firmware recently added support for this. Implement CAN_CTRLMODE_BERR_REPORTING for devices that don't support disabling CAN bus error reporting. In gs_usb_receive_bulk_callback(), check if the driver received a CAN error message. If CAN bus error reporting is disabled, drop CAN bus errors, but process CAN state changes. Unconditionally announce that the driver supports CAN bus error reporting by setting CAN_CTRLMODE_BERR_REPORTING in ctrlmode_supported. But only request CAN bus error reporting from the device if the firmware supports it and the user space has configured it. Link: https://github.com/candle-usb/candleLight_fw/pull/303 Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 186abc95c977..bc69e6b3c512 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -724,7 +724,8 @@ gs_usb_should_handle_can_error(const struct gs_can *dev= , const struct gs_host_fr return true; =20 /* handle CAN bus errors */ - if (hf->can_id & cpu_to_le32(CAN_ERR_LOSTARB | CAN_ERR_PROT | CAN_ERR_TRX= | CAN_ERR_ACK)) + if (dev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING && + hf->can_id & cpu_to_le32(CAN_ERR_LOSTARB | CAN_ERR_PROT | CAN_ERR_TRX= | CAN_ERR_ACK)) return true; =20 return false; @@ -1182,7 +1183,7 @@ static int gs_can_open(struct net_device *netdev) if (ctrlmode & CAN_CTRLMODE_ONE_SHOT) flags |=3D GS_CAN_FEATURE_ONE_SHOT; =20 - if (ctrlmode & CAN_CTRLMODE_BERR_REPORTING) + if (ctrlmode & CAN_CTRLMODE_BERR_REPORTING && dev->feature & GS_CAN_FEATU= RE_BERR_REPORTING) flags |=3D GS_CAN_FEATURE_BERR_REPORTING; =20 if (ctrlmode & CAN_CTRLMODE_FD) @@ -1519,7 +1520,8 @@ static struct gs_can *gs_make_candev(unsigned int cha= nnel, dev->can.clock.freq =3D le32_to_cpu(bt_const.fclk_can); dev->can.bittiming_const =3D &dev->bt_const; =20 - dev->can.ctrlmode_supported =3D CAN_CTRLMODE_CC_LEN8_DLC; + dev->can.ctrlmode_supported =3D CAN_CTRLMODE_BERR_REPORTING | + CAN_CTRLMODE_CC_LEN8_DLC; =20 feature =3D le32_to_cpu(bt_const.feature); dev->feature =3D FIELD_GET(GS_CAN_FEATURE_MASK, feature); @@ -1621,9 +1623,6 @@ static struct gs_can *gs_make_candev(unsigned int cha= nnel, } } =20 - if (feature & GS_CAN_FEATURE_BERR_REPORTING) - dev->can.ctrlmode_supported |=3D CAN_CTRLMODE_BERR_REPORTING; - if (feature & GS_CAN_FEATURE_GET_STATE) dev->can.do_get_berr_counter =3D gs_usb_can_get_berr_counter; =20 --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C122426D07; Mon, 20 Jul 2026 13:48:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555323; cv=none; b=DQHNF8N9hFji5NhtpsYxyXc2tMjKnMZ0l2zqF9FE3A8P/73t824tzHRpPlh2v5yJDjC4FSxiVnlnmlWGlcxJhtxTVyu0WoihStfNqNWQZ2MDYY1fY7Xw+VmVb+SDcUZW8WBruzfVfzO7WvgUfQe3H293Km8Jg/3kdekz3jnkz8o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555323; c=relaxed/simple; bh=9To91hPxgPnCHohNZ5HQ8prM96DS0vnszY4R+gCqvps=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sESZiywRerHHDy7mz+omGvIBLC33AaTTdXKf8KBxmoKXu4thl/vBLVYlU75wYbmY7mSxn3QSKTHRRNW3GDAYEnCJOAfFY81sa2Za9rd5OzL/mhbTsGAPAGFzZ1qLOnz9CFNamoa4eBVvtU5miUaokbP/3Owg0Nh1D04RnEWOA80= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id 884892028E2; Mon, 20 Jul 2026 15:48:30 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloMA-000PnD-1U; Mon, 20 Jul 2026 15:48:30 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id EF32156E530; Mon, 20 Jul 2026 13:48:29 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:13 +0200 Subject: [PATCH can-next 12/13] can: gs_usb: implement Transceiver Delay Compensation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-12-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6890; i=mkl@pengutronix.de; h=from:subject:message-id; bh=9To91hPxgPnCHohNZ5HQ8prM96DS0vnszY4R+gCqvps=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU1dRXG580iXFrUs/3GSmYpPjJZ9XB2uEP55K8r1UG xXSWb+so5SFQYyLQVZMkWXpjxOKAoEOpb0vEybBzGFlAhnCwMUpABOpZWVkOMAQJpTn5HAiz2nz s/syLzmMr5VdSqnrK/ykZLBiJ7eFAcP/oEMBC9zYZKbLuul6evxYxv1E4o4cU7eDtGjp3BCWBa0 sAA== X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 For CAN-FD with data bitrate of more than 1...2 mbit/s, a transceiver delay compensation (TDC) must be configured. Recent candleLight firmware added support to control TDC via USB. Extend gs_make_candev(): if the device signals TDC support with GS_CAN_FEATURE_TDC, get struct gs_device_tdc_const from the device with the USB request GS_USB_BREQ_GET_TDC_CONST and pass it to CAN device layer. In gs_can_open() configure the TDC with USB request GS_USB_BREQ_SET_TDC and activate TDC by setting flags GS_CAN_FEATURE_TDC. Add the gs_usb_get_auto_tdcv() function that reads the current TDCV value from the device (USB request GS_USB_BREQ_GET_TDC) and pass it to the CAN device layer. Link: https://github.com/candle-usb/candleLight_fw/pull/318 Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 117 +++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 113 insertions(+), 4 deletions(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index bc69e6b3c512..6355d05e4a16 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -74,9 +74,9 @@ enum gs_usb_breq { GS_USB_BREQ_GET_STATE, GS_USB_BREQ_SET_FILTER, GS_USB_BREQ_GET_FILTER, - __GS_USB_BREQ_PLACEHOLDER_17, - __GS_USB_BREQ_PLACEHOLDER_18, - __GS_USB_BREQ_PLACEHOLDER_19, + GS_USB_BREQ_GET_TDC_CONST, + GS_USB_BREQ_SET_TDC, + GS_USB_BREQ_GET_TDC, GS_USB_BREQ_ELM_GET_BOARDINFO =3D 20, GS_USB_BREQ_ELM_SET_FILTER, GS_USB_BREQ_ELM_GET_LASTERROR, @@ -196,6 +196,27 @@ struct gs_device_filter { }; } __packed __aligned(4); =20 +#define GS_CAN_TDC_MODE_OFF BIT(0) +#define GS_CAN_TDC_MODE_AUTO BIT(1) +#define GS_CAN_TDC_MODE_MANUAL BIT(2) + +struct gs_device_tdc_const { + __le32 tdcv_min; + __le32 tdcv_max; + __le32 tdco_min; + __le32 tdco_max; + __le32 tdcf_min; + __le32 tdcf_max; + __le32 mode; +} __packed __aligned(4); + +struct gs_device_tdc { + __le32 tdcv; + __le32 tdco; + __le32 tdcf; + __le32 mode; +} __packed __aligned(4); + #define GS_CAN_FEATURE_LISTEN_ONLY BIT(0) #define GS_CAN_FEATURE_LOOP_BACK BIT(1) #define GS_CAN_FEATURE_TRIPLE_SAMPLE BIT(2) @@ -218,7 +239,8 @@ struct gs_device_filter { /* supported by Elmue firmware 0x260528 only */ #define GS_CAN_FEATURE_ELM_DEV_FLAG_SEND_USB_BLOBS_260528 BIT(16) #define GS_CAN_FEATURE_FILTER BIT(16) -#define GS_CAN_FEATURE_MASK GENMASK(16, 0) +#define GS_CAN_FEATURE_TDC BIT(17) +#define GS_CAN_FEATURE_MASK GENMASK(17, 0) =20 /* internal quirks - keep in GS_CAN_FEATURE space for now */ =20 @@ -345,6 +367,7 @@ struct gs_can { struct usb_device *udev; =20 struct can_bittiming_const bt_const, data_bt_const; + struct can_tdc_const tdc_const; unsigned int channel; /* channel number */ =20 u32 feature; @@ -1086,6 +1109,30 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff = *skb, return NETDEV_TX_OK; } =20 +static int gs_usb_set_tdc(const struct gs_can *dev) +{ + const struct can_tdc *tdc =3D &dev->can.fd.tdc; + struct gs_device_tdc device_tdc =3D { + .tdcv =3D cpu_to_le32(tdc->tdcv), + .tdco =3D cpu_to_le32(tdc->tdco), + .tdcf =3D cpu_to_le32(tdc->tdcf), + }; + + const u32 ctrlmode =3D dev->can.ctrlmode; + + if (ctrlmode & CAN_CTRLMODE_TDC_AUTO) + device_tdc.mode =3D cpu_to_le32(GS_CAN_TDC_MODE_AUTO); + else if (ctrlmode & CAN_CTRLMODE_TDC_MANUAL) + device_tdc.mode =3D cpu_to_le32(GS_CAN_TDC_MODE_MANUAL); + else + device_tdc.mode =3D cpu_to_le32(GS_CAN_TDC_MODE_OFF); + + return usb_control_msg_send(dev->udev, 0, GS_USB_BREQ_SET_TDC, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, + dev->channel, 0, &device_tdc, sizeof(device_tdc), + USB_CTRL_SET_TIMEOUT, GFP_KERNEL); +} + static int gs_can_open(struct net_device *netdev) { struct gs_can *dev =3D netdev_priv(netdev); @@ -1193,6 +1240,9 @@ static int gs_can_open(struct net_device *netdev) if (dev->feature & GS_CAN_FEATURE_HW_TIMESTAMP) flags |=3D GS_CAN_FEATURE_HW_TIMESTAMP; =20 + if (dev->feature & GS_CAN_FEATURE_TDC) + flags |=3D GS_CAN_FEATURE_TDC; + rc =3D gs_usb_set_bittiming(dev); if (rc) { netdev_err(netdev, "failed to set bittiming: %pe\n", ERR_PTR(rc)); @@ -1207,6 +1257,14 @@ static int gs_can_open(struct net_device *netdev) } } =20 + if (dev->feature & GS_CAN_FEATURE_TDC) { + rc =3D gs_usb_set_tdc(dev); + if (rc) { + netdev_err(netdev, "failed to set TDC: %pe\n", ERR_PTR(rc)); + goto out_usb_kill_anchored_urbs; + } + } + /* finally start device */ dev->can.state =3D CAN_STATE_ERROR_ACTIVE; dm.flags =3D cpu_to_le32(flags); @@ -1452,6 +1510,25 @@ static const u16 gs_usb_termination_const[] =3D { GS_USB_TERMINATION_ENABLED }; =20 +static int gs_usb_get_auto_tdcv(const struct net_device *netdev, u32 *tdcv) +{ + struct gs_can *dev =3D netdev_priv(netdev); + struct gs_device_tdc tdc; + int rc; + + rc =3D usb_control_msg_recv(dev->udev, 0, GS_USB_BREQ_GET_TDC, + USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, + dev->channel, 0, + &tdc, sizeof(tdc), USB_CTRL_GET_TIMEOUT, + GFP_KERNEL); + if (rc) + return rc; + + *tdcv =3D le32_to_cpu(tdc.tdcv); + + return 0; +} + static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface *intf, struct gs_device_config *dconf) @@ -1626,6 +1703,38 @@ static struct gs_can *gs_make_candev(unsigned int ch= annel, if (feature & GS_CAN_FEATURE_GET_STATE) dev->can.do_get_berr_counter =3D gs_usb_can_get_berr_counter; =20 + if (feature & GS_CAN_FEATURE_TDC) { + struct gs_device_tdc_const tdc_const; + + rc =3D usb_control_msg_recv(interface_to_usbdev(intf), 0, + GS_USB_BREQ_GET_TDC_CONST, + USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, + channel, 0, &tdc_const, + sizeof(tdc_const), + 1000, GFP_KERNEL); + if (rc) { + dev_err(&intf->dev, + "Couldn't get TDC const for channel %d (%pe)\n", + channel, ERR_PTR(rc)); + goto out_free_candev; + } + + dev->tdc_const.tdcv_min =3D le32_to_cpu(tdc_const.tdcv_min); + dev->tdc_const.tdcv_max =3D le32_to_cpu(tdc_const.tdcv_max); + dev->tdc_const.tdco_min =3D le32_to_cpu(tdc_const.tdco_min); + dev->tdc_const.tdco_max =3D le32_to_cpu(tdc_const.tdco_max); + dev->tdc_const.tdcf_min =3D le32_to_cpu(tdc_const.tdcf_min); + dev->tdc_const.tdcf_max =3D le32_to_cpu(tdc_const.tdcf_max); + + if (tdc_const.mode & cpu_to_le32(GS_CAN_TDC_MODE_MANUAL)) + dev->can.ctrlmode_supported |=3D CAN_CTRLMODE_TDC_MANUAL; + if (tdc_const.mode & cpu_to_le32(GS_CAN_TDC_MODE_AUTO)) + dev->can.ctrlmode_supported |=3D CAN_CTRLMODE_TDC_AUTO; + + dev->can.fd.tdc_const =3D &dev->tdc_const; + dev->can.fd.do_get_auto_tdcv =3D gs_usb_get_auto_tdcv; + } + can_rx_offload_add_manual(netdev, &dev->offload, GS_NAPI_WEIGHT); SET_NETDEV_DEV(netdev, &intf->dev); =20 --=20 2.53.0 From nobody Sat Jul 25 02:37:11 2026 Received: from mx1.white.stw.pengutronix.de (mx1.white.stw.pengutronix.de [185.203.200.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DEB743D34BC; Mon, 20 Jul 2026 13:48:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.200.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555327; cv=none; b=FZFkf9/RY65ICJZ2/f1SYcl/1kBHmqbbM2O2DzoHCXXKVfZmybiMa/XybuyWFZQ8fHiZgMbvlk00c2/cYRVJDgiBT2xrWbMDJK4SZuKwUlv8PL3v7MtoyKRnUdwnc09HF8qkOHtxxDhVht2Kv/XuuzOQI0S1uIBvjxhFVuBK6M0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784555327; c=relaxed/simple; bh=0AJI/pKCyaXwABlN95c4VoE1LkAgFi7Ks7IBI0DP7gA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PJdyvQ0zBCatRcpiPXzmDB5+8OJv1FSncitbj9CGPjJv/J8fIVGmPIz65RJOfuNAm/UGuRLT+aAOu/f0Q1ZZXcID0U76wGzwGwD/fLbGQfYsBbTKFNldxT46fsJhT+H+LsG4zRbtL3vYbzUDplop4dGq6amv8dD0mkmDLJcdQcw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.200.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de (drehscheibe.grey.stw.pengutronix.de [IPv6:2a0a:edc0:0:c01:1d::a2]) (Authenticated sender: relay-from-drehscheibe.grey.stw.pengutronix.de) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPSA id EE1792028E3; Mon, 20 Jul 2026 15:48:30 +0200 (CEST) Received: from moin.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::7b] helo=bjornoya.blackshift.org) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wloMA-000PnH-2q; Mon, 20 Jul 2026 15:48:30 +0200 Received: from hardanger.blackshift.org (unknown [IPv6:2001:678:ed0:ff00::a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519MLKEM768 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mkl-all@blackshift.org) by smtp.blackshift.org (Postfix) with ESMTPSA id 5D09E56E532; Mon, 20 Jul 2026 13:48:30 +0000 (UTC) From: Marc Kleine-Budde Date: Mon, 20 Jul 2026 15:48:14 +0200 Subject: [PATCH can-next 13/13] can: gs_usb: implement CAN bus off recovery Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-gs_usb-new-features-v1-13-427a8013c380@pengutronix.de> References: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> In-Reply-To: <20260720-gs_usb-new-features-v1-0-427a8013c380@pengutronix.de> To: Vincent Mailhol Cc: linux-can@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Marc Kleine-Budde X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5146; i=mkl@pengutronix.de; h=from:subject:message-id; bh=0AJI/pKCyaXwABlN95c4VoE1LkAgFi7Ks7IBI0DP7gA=; b=owGbwMvMwCV2xirl17qZay8xnlZLYsiKU1c958B2y7viSKTa65A1/y64ct0uNLBSsDpVLbjNV fjz8ZKGjlIWBjEuBlkxRZalP04oCgQ6lPa+TJgEM4eVCWQIAxenAEykspSR4Z9wXGXuPDZLTtV0 thMa796wRzyf9off9WTktaOvRe43fmdk+Havad/Wfha57ltK8toW1VZHOR5wHv+1RWxT26YJC93 +MgEA X-Developer-Key: i=mkl@pengutronix.de; a=openpgp; fpr=C1400BA0B3989E6FBC7D5B5C2B5EE211C58AEA54 Traditionally gs_usb compatible CAN devices implement automatic CAN bus off recovery. Either supported by the CAN IP core in hardware or in the device firmware. This turned out to be inflexible, the USB host and thus the user space has no control over the CAN bus recovery of behaviour. The gs_usb has not implemented the struct can_priv::do_set_mode that's used to restart the CAN controller after a CAN bus off. Recent candleLight firmware closes the gap by implementing the GS_CAN_FEATURE_BUS_OFF_RECOVERY feature. If the host sets GS_CAN_FEATURE_BUS_OFF_RECOVERY flag is set device disables automatic CAN bus off recovery, a manual recovery can be started with the USB request GS_USB_BREQ_BUS_OFF_RECOVERY. Implement gs_usb_set_mode() to recover the device via the GS_USB_BREQ_BUS_OFF_RECOVERY USB request. Extend gs_make_candev(): if the device signals GS_CAN_FEATURE_BUS_OFF_RECOVERY support, set the struct can_priv::do_set_mode callback. In gs_can_open() activate GS_CAN_FEATURE_BUS_OFF_RECOVERY if supported. Update gs_update_state() to use the default can_bus_off() handler if the device goes bus off and GS_CAN_FEATURE_BUS_OFF_RECOVERY. Link: https://github.com/candle-usb/candleLight_fw/pull/317 Signed-off-by: Marc Kleine-Budde --- drivers/net/can/usb/gs_usb.c | 47 ++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 6355d05e4a16..e4ee9a1ef3f6 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -89,6 +89,7 @@ enum gs_usb_breq { __GS_USB_BREQ_ELM_PLACEHOLDER_29, __GS_USB_BREQ_ELM_PLACEHOLDER_30, __GS_USB_BREQ_ELM_PLACEHOLDER_31, + GS_USB_BREQ_BUS_OFF_RECOVERY =3D 32, }; =20 enum gs_can_mode { @@ -217,6 +218,10 @@ struct gs_device_tdc { __le32 mode; } __packed __aligned(4); =20 +struct gs_device_bus_off_recovery { + u32 unused; +} __packed __aligned(4); + #define GS_CAN_FEATURE_LISTEN_ONLY BIT(0) #define GS_CAN_FEATURE_LOOP_BACK BIT(1) #define GS_CAN_FEATURE_TRIPLE_SAMPLE BIT(2) @@ -240,7 +245,8 @@ struct gs_device_tdc { #define GS_CAN_FEATURE_ELM_DEV_FLAG_SEND_USB_BLOBS_260528 BIT(16) #define GS_CAN_FEATURE_FILTER BIT(16) #define GS_CAN_FEATURE_TDC BIT(17) -#define GS_CAN_FEATURE_MASK GENMASK(17, 0) +#define GS_CAN_FEATURE_BUS_OFF_RECOVERY BIT(18) +#define GS_CAN_FEATURE_MASK GENMASK(18, 0) =20 /* internal quirks - keep in GS_CAN_FEATURE space for now */ =20 @@ -573,14 +579,22 @@ static void gs_update_state(struct gs_can *dev, struc= t can_frame *cf, return; =20 /* some firmware does automatically CAN bus off recovery, account for thi= s */ - if (cf->can_id & CAN_ERR_RESTARTED || - (dev->can.state =3D=3D CAN_STATE_BUS_OFF && new_state < CAN_STATE_BUS= _OFF)) { + if (!(dev->feature & GS_CAN_FEATURE_BUS_OFF_RECOVERY) && + (cf->can_id & CAN_ERR_RESTARTED || + (dev->can.state =3D=3D CAN_STATE_BUS_OFF && new_state < CAN_STATE_BU= S_OFF))) { can_stats->restarts++; /* some firmware doesn't set CAN_ERR_RESTARTED, fixup */ cf->can_id |=3D CAN_ERR_RESTARTED; } =20 can_change_state(dev->can.dev, cf, tx_state, rx_state); + + /* If device supports explicit CAN bus off recovery by the host, use defa= ult CAN bus off + * handler. Otherwise the device will recover itself. + */ + if (new_state =3D=3D CAN_STATE_BUS_OFF && + dev->feature & GS_CAN_FEATURE_BUS_OFF_RECOVERY) + can_bus_off(dev->netdev); } =20 static u32 gs_usb_set_timestamp(struct gs_can *dev, struct sk_buff *skb, @@ -1243,6 +1257,9 @@ static int gs_can_open(struct net_device *netdev) if (dev->feature & GS_CAN_FEATURE_TDC) flags |=3D GS_CAN_FEATURE_TDC; =20 + if (dev->feature & GS_CAN_FEATURE_BUS_OFF_RECOVERY) + flags |=3D GS_CAN_FEATURE_BUS_OFF_RECOVERY; + rc =3D gs_usb_set_bittiming(dev); if (rc) { netdev_err(netdev, "failed to set bittiming: %pe\n", ERR_PTR(rc)); @@ -1330,6 +1347,27 @@ static int gs_usb_get_state(const struct net_device = *netdev, return 0; } =20 +static int gs_usb_set_mode(struct net_device *netdev, enum can_mode mode) +{ + struct gs_can *dev =3D netdev_priv(netdev); + + switch (mode) { + case CAN_MODE_START: { + struct gs_device_bus_off_recovery bus_off_recovery =3D { 0 }; + + return usb_control_msg_send(dev->udev, 0, GS_USB_BREQ_BUS_OFF_RECOVERY, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, + dev->channel, 0, + &bus_off_recovery, sizeof(bus_off_recovery), + USB_CTRL_SET_TIMEOUT, GFP_KERNEL); + } + default: + return -EOPNOTSUPP; + } + + return 0; +} + static int gs_usb_can_get_berr_counter(const struct net_device *netdev, struct can_berr_counter *bec) { @@ -1735,6 +1773,9 @@ static struct gs_can *gs_make_candev(unsigned int cha= nnel, dev->can.fd.do_get_auto_tdcv =3D gs_usb_get_auto_tdcv; } =20 + if (feature & GS_CAN_FEATURE_BUS_OFF_RECOVERY) + dev->can.do_set_mode =3D gs_usb_set_mode; + can_rx_offload_add_manual(netdev, &dev->offload, GS_NAPI_WEIGHT); SET_NETDEV_DEV(netdev, &intf->dev); =20 --=20 2.53.0