From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BC8C0C43334 for ; Tue, 28 Jun 2022 16:35:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229682AbiF1Qfv (ORCPT ); Tue, 28 Jun 2022 12:35:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50760 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235950AbiF1Qeq (ORCPT ); Tue, 28 Jun 2022 12:34:46 -0400 Received: from mail-ej1-x635.google.com (mail-ej1-x635.google.com [IPv6:2a00:1450:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6937B3205F for ; Tue, 28 Jun 2022 09:31:51 -0700 (PDT) Received: by mail-ej1-x635.google.com with SMTP id mf9so27027782ejb.0 for ; Tue, 28 Jun 2022 09:31:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bs1pDxoqSwxHo6PhPuLte63s3qeUlbVxYb0CgUg+DU4=; b=b0U8IUi53H55fQXPVpT7iWqKz2mI5/X9m8w4K55yp+aofkZ+sHFsvMtY/c+YH02gS+ C87rxW+fRKL1bImKBIRqvxd0JYMhVBSMJ3Vh3xkFvK08bpOK2Hj4TvEgeP+L22sApAOA rd0/6qM4ofM/J7pKsV9wkYxdeOO9hqSYmwfaU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bs1pDxoqSwxHo6PhPuLte63s3qeUlbVxYb0CgUg+DU4=; b=eKPArFj+sD9W+Tiy16t6AQBV1szPRM//xDXjfh0zZwbvtVUym0fxMRpQe5Q2jD50f4 oVX27GOuvqTubtejI06EUpeYxgcxjSaLmNPGxEuam456aFyEapF9f16SfLnrqx5+V7jf g+FyS3y4xQRn31Po/zNWkMsksvV0EiKRMFb20S3MiwgqpIE4dJDciu4I5cy0PePhFKOs wmsGopf1u7XHBz2pY6+Du23BQ70+koWl8MHQ8eg94+dPVZQpksXz3qSCIDucrDuz9dRe L6Y8dfyrlFvRVuPbKsF8RDQ6RB4EqwTUhs5TrhEVXeUrq308AylB9/88/y3NJyZl2thl L92g== X-Gm-Message-State: AJIora+yDTK1pfNxQW6KBgiqDMJNef3dusfqc2KsMyoaIG5JP1cvFpj8 /qK2aB54T0PbekzfA4gaoKzq61yX6VkpUw== X-Google-Smtp-Source: AGRyM1u8k6DgrYmdGpKNDatzVFC7pbSEg6/eS3j6frJXw1YqoEM06/Q9Nd4fEzKvJKZY3sHlHq7cvw== X-Received: by 2002:a17:906:604f:b0:718:e9e8:9d2a with SMTP id p15-20020a170906604f00b00718e9e89d2amr18166762ejj.315.1656433909538; Tue, 28 Jun 2022 09:31:49 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.31.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:31:48 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Marc Kleine-Budde , Paolo Abeni , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 01/12] can: slcan: use the BIT() helper Date: Tue, 28 Jun 2022 18:31:25 +0200 Message-Id: <20220628163137.413025-2-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Use the BIT() helper instead of an explicit shift. Signed-off-by: Dario Binacchi --- (no changes since v1) drivers/net/can/slcan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index 64a3aee8a7da..b37d35c2a23a 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -413,7 +413,7 @@ static int slc_open(struct net_device *dev) if (sl->tty =3D=3D NULL) return -ENODEV; =20 - sl->flags &=3D (1 << SLF_INUSE); + sl->flags &=3D BIT(SLF_INUSE); netif_start_queue(dev); return 0; } --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2494BC43334 for ; Tue, 28 Jun 2022 16:36:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239324AbiF1QgI (ORCPT ); Tue, 28 Jun 2022 12:36:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237975AbiF1Qeq (ORCPT ); Tue, 28 Jun 2022 12:34:46 -0400 Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1E5793206C for ; Tue, 28 Jun 2022 09:31:52 -0700 (PDT) Received: by mail-ej1-x631.google.com with SMTP id d2so15169658ejy.1 for ; Tue, 28 Jun 2022 09:31:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=El3W9x0OB1VE70B0Lt3SBVyO+pC/HDeoL5aPqYtLRdg=; b=npVyrA+/Jxlq6fQfSTCBYtF6RmczZxbWUN+tD+OAYyplLmUOvHpooBMDuJlKKO4PZJ yCZoY4jC/PAH7YPpacPIeDx58jw6tAJqfpGJC8HRQ+q5j8M0r5LiiQuEpXcF8XKwWMq+ JsMRX/RrrOZLybaPcnDecKT1rm1MJeKuhH3vY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=El3W9x0OB1VE70B0Lt3SBVyO+pC/HDeoL5aPqYtLRdg=; b=nXd41m90JQ8SPaURkfv4LGVYL5d0sgVh1rOrLmjsPzgTOX1VhRa99lwTnNFf9v0fW7 1skh5wUXasnfyU07TK9vdbBO8VehEx9/tjguW8r9mLlrUMZ9s4xxPzLeaJDWhWt507vm PdyLxIHUnenIw86k6frSE6s/2QUNe3Qikf+ddJc2ni7pLK71Yx3OT4VQLdwPwZRNlOiI kvNuSwmUhIbxZF/k0yYPOETgCFm5VRVSqzGDc04QCUrWY07MdlTltoKLzXzPS868TG3V 3HAU8e1oWhlS/f3tFFsscF8zh2UEqob7d09PqUI8TaUi7uH9S9CobaYL4UQSkftcBOgW FT+Q== X-Gm-Message-State: AJIora+0E9NUvSn7meE68BJ11Q0r6k2jxO8JKCJgsFa2TsYy0TBmRjtm BRdunqfIYJT/BEFBZr24cxSezqHhPrCs3A== X-Google-Smtp-Source: AGRyM1ug5KAKVeOz1cwMowwc8MY9LikfKxR5xcB86gl7L4gplcpPsJB7grN/of4FQuYTMReB9hEP3g== X-Received: by 2002:a17:907:7e90:b0:704:b67d:623e with SMTP id qb16-20020a1709077e9000b00704b67d623emr19098655ejc.634.1656433910961; Tue, 28 Jun 2022 09:31:50 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.31.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:31:50 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Marc Kleine-Budde , Paolo Abeni , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 02/12] can: slcan: use netdev helpers to print out messages Date: Tue, 28 Jun 2022 18:31:26 +0200 Message-Id: <20220628163137.413025-3-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Replace printk() calls with corresponding netdev helpers. Signed-off-by: Dario Binacchi --- (no changes since v1) drivers/net/can/slcan.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index b37d35c2a23a..6162a9c21672 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -365,7 +365,7 @@ static netdev_tx_t slc_xmit(struct sk_buff *skb, struct= net_device *dev) spin_lock(&sl->lock); if (!netif_running(dev)) { spin_unlock(&sl->lock); - printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name); + netdev_warn(dev, "xmit: iface is down\n"); goto out; } if (sl->tty =3D=3D NULL) { @@ -776,8 +776,7 @@ static void __exit slcan_exit(void) =20 sl =3D netdev_priv(dev); if (sl->tty) { - printk(KERN_ERR "%s: tty discipline still running\n", - dev->name); + netdev_err(dev, "tty discipline still running\n"); } =20 unregister_netdev(dev); --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7B8DC433EF for ; Tue, 28 Jun 2022 16:36:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238854AbiF1Qf5 (ORCPT ); Tue, 28 Jun 2022 12:35:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50732 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236373AbiF1Qeq (ORCPT ); Tue, 28 Jun 2022 12:34:46 -0400 Received: from mail-ej1-x62d.google.com (mail-ej1-x62d.google.com [IPv6:2a00:1450:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7FC163207E for ; Tue, 28 Jun 2022 09:31:53 -0700 (PDT) Received: by mail-ej1-x62d.google.com with SMTP id h23so26831376ejj.12 for ; Tue, 28 Jun 2022 09:31:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lfqn0geMWlo2m+epnZ6MFo0Gce8D/c5YwbUMrCOB20U=; b=hdJIVy+sH8SAoKYHCd0pK6GgiKA/ahM/vAB/B8teozlaamYqheunsZs7xFoeexFBo5 Q//2O2BW0K1zPYL27x7Xos72HdJS1VSW9cS0bDlSRac6Qx88hlTzme38l0Mgdb7RFMK2 oQs8Xx3Lioqg8OxdDWfNnFITPUgQBVb0ZoOSY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lfqn0geMWlo2m+epnZ6MFo0Gce8D/c5YwbUMrCOB20U=; b=kpABRJPD//6n40uqYjsyeAtC1NlXd7z8WP/JRf27l+VeOTn/tMvuPl9Bq7glcl5D9K 0OOu+VLQudUYGeVDgO1jhKS+4BVvjQtAMIXv58MD5G/VJfR5a/84el3Q1AJXpf/vwTiD T2gNAJTLZI2RA92K2af44Y4bMTzs6zAa61sfL41sHEeRRZyyvNMHYjXHPByC3qL0HqGd AVX0I95OlR/tU5Cn5aTHMF1qcjqgyWA9pDa9jGfYVZCsls7r6kcVNtvSioHST6iWMCmL WltaVP4vCxP/HNH54IcBSBlsPy5RajFXh5FIGulv5miv8tLLkih20S+4wYw4KtPiwyLh 65XQ== X-Gm-Message-State: AJIora/iGfvempGkAWJ5VeRq1N090/8wKyw0n5PJEtN0q5W1tb+uoXym JcVMUdpF7bJYesdIKVwMRtrJcmZXMjjNNA== X-Google-Smtp-Source: AGRyM1va/ANdVjEy/roqJmN6w30prNjI7JbBTV/MjmBAoyOEiqjmkf272znx6kVqX5sIAKnC+tiOkg== X-Received: by 2002:a17:907:948a:b0:726:f3d7:c7d6 with SMTP id dm10-20020a170907948a00b00726f3d7c7d6mr1288628ejc.2.1656433912584; Tue, 28 Jun 2022 09:31:52 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.31.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:31:51 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Marc Kleine-Budde , Paolo Abeni , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 03/12] can: slcan: use the alloc_can_skb() helper Date: Tue, 28 Jun 2022 18:31:27 +0200 Message-Id: <20220628163137.413025-4-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" It is used successfully by most (if not all) CAN device drivers. It allows to remove replicated code. Signed-off-by: Dario Binacchi --- (no changes since v3) Changes in v3: - Increment the error counter in case of decoding failure. Changes in v2: - Put the data into the allocated skb directly instead of first filling the "cf" on the stack and then doing a memcpy(). drivers/net/can/slcan.c | 70 +++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index 6162a9c21672..c39580b142e0 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -54,6 +54,7 @@ #include #include #include +#include #include #include =20 @@ -143,85 +144,80 @@ static struct net_device **slcan_devs; static void slc_bump(struct slcan *sl) { struct sk_buff *skb; - struct can_frame cf; + struct can_frame *cf; int i, tmp; u32 tmpid; char *cmd =3D sl->rbuff; =20 - memset(&cf, 0, sizeof(cf)); + skb =3D alloc_can_skb(sl->dev, &cf); + if (unlikely(!skb)) { + sl->dev->stats.rx_dropped++; + return; + } =20 switch (*cmd) { case 'r': - cf.can_id =3D CAN_RTR_FLAG; + cf->can_id =3D CAN_RTR_FLAG; fallthrough; case 't': /* store dlc ASCII value and terminate SFF CAN ID string */ - cf.len =3D sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN]; + cf->len =3D sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN]; sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN] =3D 0; /* point to payload data behind the dlc */ cmd +=3D SLC_CMD_LEN + SLC_SFF_ID_LEN + 1; break; case 'R': - cf.can_id =3D CAN_RTR_FLAG; + cf->can_id =3D CAN_RTR_FLAG; fallthrough; case 'T': - cf.can_id |=3D CAN_EFF_FLAG; + cf->can_id |=3D CAN_EFF_FLAG; /* store dlc ASCII value and terminate EFF CAN ID string */ - cf.len =3D sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN]; + cf->len =3D sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN]; sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN] =3D 0; /* point to payload data behind the dlc */ cmd +=3D SLC_CMD_LEN + SLC_EFF_ID_LEN + 1; break; default: - return; + goto decode_failed; } =20 if (kstrtou32(sl->rbuff + SLC_CMD_LEN, 16, &tmpid)) - return; + goto decode_failed; =20 - cf.can_id |=3D tmpid; + cf->can_id |=3D tmpid; =20 /* get len from sanitized ASCII value */ - if (cf.len >=3D '0' && cf.len < '9') - cf.len -=3D '0'; + if (cf->len >=3D '0' && cf->len < '9') + cf->len -=3D '0'; else - return; + goto decode_failed; =20 /* RTR frames may have a dlc > 0 but they never have any data bytes */ - if (!(cf.can_id & CAN_RTR_FLAG)) { - for (i =3D 0; i < cf.len; i++) { + if (!(cf->can_id & CAN_RTR_FLAG)) { + for (i =3D 0; i < cf->len; i++) { tmp =3D hex_to_bin(*cmd++); if (tmp < 0) - return; - cf.data[i] =3D (tmp << 4); + goto decode_failed; + + cf->data[i] =3D (tmp << 4); tmp =3D hex_to_bin(*cmd++); if (tmp < 0) - return; - cf.data[i] |=3D tmp; + goto decode_failed; + + cf->data[i] |=3D tmp; } } =20 - skb =3D dev_alloc_skb(sizeof(struct can_frame) + - sizeof(struct can_skb_priv)); - if (!skb) - return; - - skb->dev =3D sl->dev; - skb->protocol =3D htons(ETH_P_CAN); - skb->pkt_type =3D PACKET_BROADCAST; - skb->ip_summed =3D CHECKSUM_UNNECESSARY; - - can_skb_reserve(skb); - can_skb_prv(skb)->ifindex =3D sl->dev->ifindex; - can_skb_prv(skb)->skbcnt =3D 0; - - skb_put_data(skb, &cf, sizeof(struct can_frame)); - sl->dev->stats.rx_packets++; - if (!(cf.can_id & CAN_RTR_FLAG)) - sl->dev->stats.rx_bytes +=3D cf.len; + if (!(cf->can_id & CAN_RTR_FLAG)) + sl->dev->stats.rx_bytes +=3D cf->len; =20 netif_rx(skb); + return; + +decode_failed: + sl->dev->stats.rx_errors++; + dev_kfree_skb(skb); } =20 /* parse tty input stream */ --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92AADCCA479 for ; Tue, 28 Jun 2022 16:36:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232311AbiF1QgS (ORCPT ); Tue, 28 Jun 2022 12:36:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50992 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238169AbiF1Qer (ORCPT ); Tue, 28 Jun 2022 12:34:47 -0400 Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1355326DB for ; Tue, 28 Jun 2022 09:31:55 -0700 (PDT) Received: by mail-ed1-x52f.google.com with SMTP id n8so4413079eda.0 for ; Tue, 28 Jun 2022 09:31:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GV071olECEu2/Ezmqg7bgOsDRoG54OcMsrjIhEz/HxY=; b=Qa1Xsd/SAEcqOFctzhZ2ITrvHpAKlBNkgsWdWrlhWBDVG+phXclxnB3toeB+QEo1vx VGUq1VhpB/tqonLXMxOfbw2V5f+cUR5Iyi5u3Khqj3aDMwBL3FAydA+wz6At1EKQmIX4 zlj1nvDLFne26VH3rZUpS4UoTWBzFL2VKgsI0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GV071olECEu2/Ezmqg7bgOsDRoG54OcMsrjIhEz/HxY=; b=F684p9kKLx4PdQFokEGx6OruJkkHb6I2WGPGjjiUVCMAcal5Oqgd63tBqEiQgF59AK U9EAXOW7vXSXVDOX+0SxiK8Br6V2IVHFZ2oRbynLdSaOREeHaEyQ0rt1t/gpoy8ClfO1 8aiotQ7tdT2zF+T5ZoH6zR2dUmAmEmC/3rvOMxh8ig025mo4MWzuv/oiQgg9u8BzN6Wf GSsbF5MXi9bSviiXLVr+AlT0eT0I7HHuoIkbdyoTUPahbw73UEOSJ7JFzaYx7C8SVzfz 8oKqj+mr/WuHsjyPkBO82/qZ6ab8TZf0UT1HixERWE04QuC4ZFsbEANFccR0RR9iDPpb e12w== X-Gm-Message-State: AJIora9nAiQbSL/NgtZKx0eOg4CGhleeYC5r5OSIu1H/YxJm+LYMeawL tGbwq6i1qKZReZxb7Rn784SiNE5FC1gLQQ== X-Google-Smtp-Source: AGRyM1sBYiHVqvAao7ebFu6YzOjM0r/hZUSSLLp/29zzE6hCI/AyZi8PN6ZVXgdWM+yasPoaI9ooCA== X-Received: by 2002:a05:6402:4244:b0:437:726c:e1a with SMTP id g4-20020a056402424400b00437726c0e1amr22041449edb.107.1656433914004; Tue, 28 Jun 2022 09:31:54 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.31.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:31:53 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , Marc Kleine-Budde , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Vincent Mailhol , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 04/12] can: netlink: dump bitrate 0 if can_priv::bittiming.bitrate is -1U Date: Tue, 28 Jun 2022 18:31:28 +0200 Message-Id: <20220628163137.413025-5-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Upcoming changes on slcan driver will require you to specify a bitrate of value -1 to prevent the open_candev() from failing but at the same time highlighting that it is a fake value. In this case the command `ip --details -s -s link show' would print 4294967295 as the bitrate value. The patch change this value in 0. Suggested-by: Marc Kleine-Budde Signed-off-by: Dario Binacchi --- (no changes since v4) Changes in v4: - Move the patch in front of the patch "[v3,04/13] can: slcan: use CAN netw= ork device driver API". - Add the CAN_BITRATE_UNSET (0) and CAN_BITRATE_UNKNOWN (-1U) macros. - Simplify the bitrate check to dump it. - Update the commit description. drivers/net/can/dev/netlink.c | 3 ++- include/linux/can/bittiming.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c index 7633d98e3912..5427712fcf80 100644 --- a/drivers/net/can/dev/netlink.c +++ b/drivers/net/can/dev/netlink.c @@ -509,7 +509,8 @@ static int can_fill_info(struct sk_buff *skb, const str= uct net_device *dev) if (priv->do_get_state) priv->do_get_state(dev, &state); =20 - if ((priv->bittiming.bitrate && + if ((priv->bittiming.bitrate !=3D CAN_BITRATE_UNSET && + priv->bittiming.bitrate !=3D CAN_BITRATE_UNKNOWN && nla_put(skb, IFLA_CAN_BITTIMING, sizeof(priv->bittiming), &priv->bittiming)) || =20 diff --git a/include/linux/can/bittiming.h b/include/linux/can/bittiming.h index 7ae21c0f7f23..ef0a77173e3c 100644 --- a/include/linux/can/bittiming.h +++ b/include/linux/can/bittiming.h @@ -11,6 +11,8 @@ =20 #define CAN_SYNC_SEG 1 =20 +#define CAN_BITRATE_UNSET 0 +#define CAN_BITRATE_UNKNOWN (-1U) =20 #define CAN_CTRLMODE_TDC_MASK \ (CAN_CTRLMODE_TDC_AUTO | CAN_CTRLMODE_TDC_MANUAL) --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9F5E5C433EF for ; Tue, 28 Jun 2022 16:36:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236727AbiF1Qgq (ORCPT ); Tue, 28 Jun 2022 12:36:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50812 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229980AbiF1Qev (ORCPT ); Tue, 28 Jun 2022 12:34:51 -0400 Received: from mail-ej1-x632.google.com (mail-ej1-x632.google.com [IPv6:2a00:1450:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86FB633899 for ; Tue, 28 Jun 2022 09:31:57 -0700 (PDT) Received: by mail-ej1-x632.google.com with SMTP id ge10so26898574ejb.7 for ; Tue, 28 Jun 2022 09:31:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5bhO0o16CDU7mHwhFJvR1vi2tTSkwNkLZnvwcLoYiRw=; b=IiB8f+RtxlhRNOkn1i3FVhtmxLTgv3mPWHKd6LHY2/Vh1Re+GuYv4t4vvHsS+w/e1m 3KlGTNBUjUZvwy1RyvRVDkulUYGk9FC9lpJ0RjjpaCc8dGVLf9lwcVokRrjBCC1k2pPU a43iZRo3lx+HynF1bz0hSPngeKAG1HhvnWx4o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5bhO0o16CDU7mHwhFJvR1vi2tTSkwNkLZnvwcLoYiRw=; b=towWhhn3gl3WdMkHpcGo11yk9COcaDbEiGpiS6JsXY7qcNkidtAaiSkIOepiYPJ4DG zSSY1HjScUju/sFWUCcaE4CUjLPhjWPGux0uZhxMtSdDThVw5Mb1/+LHlLliGgImeEue YOki7H3pdHOqpKPKBdDceEWeXGJyTJSYNKCHYB/iWvEdTbZk8sgUZ30Y+H2nE7uWcQNy 2Nr4FgE6yXPdZhHpVRyQ0BcHyKbPLlIhE3cmeUP7Ao8NLYxXQtQde/HrKVRHoE05V6yO NlxcMYU16eIbS7rUsbkakOWntiKmDFP8NP96KzPSQ9J9AkHdpd05KCCLuIgo7J1/z//Q mf1Q== X-Gm-Message-State: AJIora8qiQM6O0bdP7A+/VQfYQ9JponKs62Pn+oFxgyQWgIA0hiNk8jp zzbw2QzFYF3HOccfgjaHWVj1q/GqpurIMw== X-Google-Smtp-Source: AGRyM1vusOxzzKlbAJJcAxRJ1IHRBdRZ2NSK2Q4SoNxpnA6I11skUooZAwFIivv1eHKp0QW4cJ8nAA== X-Received: by 2002:a17:907:1b25:b0:6da:8206:fc56 with SMTP id mp37-20020a1709071b2500b006da8206fc56mr286036ejc.81.1656433915553; Tue, 28 Jun 2022 09:31:55 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.31.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:31:55 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Marc Kleine-Budde , Paolo Abeni , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 05/12] can: slcan: use CAN network device driver API Date: Tue, 28 Jun 2022 18:31:29 +0200 Message-Id: <20220628163137.413025-6-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" As suggested by commit [1], now the driver uses the functions and the data structures provided by the CAN network device driver interface. Currently the driver doesn't implement a way to set bitrate for SLCAN based devices via ip tool, so you'll have to do this by slcand or slcan_attach invocation through the -sX parameter: - slcan_attach -f -s6 -o /dev/ttyACM0 - slcand -f -s8 -o /dev/ttyUSB0 where -s6 in will set adapter's bitrate to 500 Kbit/s and -s8 to 1Mbit/s. See the table below for further CAN bitrates: - s0 -> 10 Kbit/s - s1 -> 20 Kbit/s - s2 -> 50 Kbit/s - s3 -> 100 Kbit/s - s4 -> 125 Kbit/s - s5 -> 250 Kbit/s - s6 -> 500 Kbit/s - s7 -> 800 Kbit/s - s8 -> 1000 Kbit/s In doing so, the struct can_priv::bittiming.bitrate of the driver is not set and since the open_candev() checks that the bitrate has been set, it must be a non-zero value, the bitrate is set to a fake value (-1U) before it is called. Using the rtnl_lock()/rtnl_unlock() functions has become a bit more tricky as the register_candev() function indirectly calls rtnl_lock() via register_netdev(). To avoid a deadlock it is therefore necessary to call rtnl_unlock() before calling register_candev(). The same goes for the unregister_candev() function. [1] commit 39549eef3587f ("can: CAN Network device driver and Netlink inter= face") Signed-off-by: Dario Binacchi --- Changes in v5: - Update the commit message. - Restore the use of rtnl_lock() and rtnl_unlock(). Changes in v4: - Update the commit description. - Use the CAN_BITRATE_UNKNOWN macro. - Use kfree_skb() instead of can_put_echo_skb() in the slc_xmit(). - Remove the `if (slcan_devs)' check in the slc_dealloc(). Changes in v3: - Replace (-1) with (-1U) in the commit description. Changes in v2: - Move CAN_SLCAN Kconfig option inside CAN_DEV scope. - Improve the commit message. drivers/net/can/Kconfig | 40 ++++++++++---------- drivers/net/can/slcan.c | 82 ++++++++++++++++++++--------------------- 2 files changed, 60 insertions(+), 62 deletions(-) diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig index b2dcc1e5a388..45997d39621c 100644 --- a/drivers/net/can/Kconfig +++ b/drivers/net/can/Kconfig @@ -28,26 +28,6 @@ config CAN_VXCAN This driver can also be built as a module. If so, the module will be called vxcan. =20 -config CAN_SLCAN - tristate "Serial / USB serial CAN Adaptors (slcan)" - depends on TTY - help - CAN driver for several 'low cost' CAN interfaces that are attached - via serial lines or via USB-to-serial adapters using the LAWICEL - ASCII protocol. The driver implements the tty linediscipline N_SLCAN. - - As only the sending and receiving of CAN frames is implemented, this - driver should work with the (serial/USB) CAN hardware from: - www.canusb.com / www.can232.com / www.mictronics.de / www.canhack.de - - Userspace tools to attach the SLCAN line discipline (slcan_attach, - slcand) can be found in the can-utils at the linux-can project, see - https://github.com/linux-can/can-utils for details. - - The slcan driver supports up to 10 CAN netdevices by default which - can be changed by the 'maxdev=3Dxx' module option. This driver can - also be built as a module. If so, the module will be called slcan. - config CAN_DEV tristate "Platform CAN drivers with Netlink support" default y @@ -118,6 +98,26 @@ config CAN_KVASER_PCIEFD Kvaser Mini PCI Express HS v2 Kvaser Mini PCI Express 2xHS v2 =20 +config CAN_SLCAN + tristate "Serial / USB serial CAN Adaptors (slcan)" + depends on TTY + help + CAN driver for several 'low cost' CAN interfaces that are attached + via serial lines or via USB-to-serial adapters using the LAWICEL + ASCII protocol. The driver implements the tty linediscipline N_SLCAN. + + As only the sending and receiving of CAN frames is implemented, this + driver should work with the (serial/USB) CAN hardware from: + www.canusb.com / www.can232.com / www.mictronics.de / www.canhack.de + + Userspace tools to attach the SLCAN line discipline (slcan_attach, + slcand) can be found in the can-utils at the linux-can project, see + https://github.com/linux-can/can-utils for details. + + The slcan driver supports up to 10 CAN netdevices by default which + can be changed by the 'maxdev=3Dxx' module option. This driver can + also be built as a module. If so, the module will be called slcan. + config CAN_SUN4I tristate "Allwinner A10 CAN controller" depends on MACH_SUN4I || MACH_SUN7I || COMPILE_TEST diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index c39580b142e0..bf84698f1a81 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -56,7 +56,6 @@ #include #include #include -#include =20 MODULE_ALIAS_LDISC(N_SLCAN); MODULE_DESCRIPTION("serial line CAN interface"); @@ -79,6 +78,7 @@ MODULE_PARM_DESC(maxdev, "Maximum number of slcan interfa= ces"); #define SLC_EFF_ID_LEN 8 =20 struct slcan { + struct can_priv can; int magic; =20 /* Various fields. */ @@ -394,6 +394,8 @@ static int slc_close(struct net_device *dev) clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); } netif_stop_queue(dev); + close_candev(dev); + sl->can.state =3D CAN_STATE_STOPPED; sl->rcount =3D 0; sl->xleft =3D 0; spin_unlock_bh(&sl->lock); @@ -405,20 +407,34 @@ static int slc_close(struct net_device *dev) static int slc_open(struct net_device *dev) { struct slcan *sl =3D netdev_priv(dev); + int err; =20 if (sl->tty =3D=3D NULL) return -ENODEV; =20 + /* The baud rate is not set with the command + * `ip link set type can bitrate ' and therefore + * can.bittiming.bitrate is CAN_BITRATE_UNSET (0), causing + * open_candev() to fail. So let's set to a fake value. + */ + sl->can.bittiming.bitrate =3D CAN_BITRATE_UNKNOWN; + err =3D open_candev(dev); + if (err) { + netdev_err(dev, "failed to open can device\n"); + return err; + } + + sl->can.state =3D CAN_STATE_ERROR_ACTIVE; sl->flags &=3D BIT(SLF_INUSE); netif_start_queue(dev); return 0; } =20 -/* Hook the destructor so we can free slcan devs at the right point in tim= e */ -static void slc_free_netdev(struct net_device *dev) +static void slc_dealloc(struct slcan *sl) { - int i =3D dev->base_addr; + int i =3D sl->dev->base_addr; =20 + free_candev(sl->dev); slcan_devs[i] =3D NULL; } =20 @@ -434,24 +450,6 @@ static const struct net_device_ops slc_netdev_ops =3D { .ndo_change_mtu =3D slcan_change_mtu, }; =20 -static void slc_setup(struct net_device *dev) -{ - dev->netdev_ops =3D &slc_netdev_ops; - dev->needs_free_netdev =3D true; - dev->priv_destructor =3D slc_free_netdev; - - dev->hard_header_len =3D 0; - dev->addr_len =3D 0; - dev->tx_queue_len =3D 10; - - dev->mtu =3D CAN_MTU; - dev->type =3D ARPHRD_CAN; - - /* New-style flags. */ - dev->flags =3D IFF_NOARP; - dev->features =3D NETIF_F_HW_CSUM; -} - /****************************************** Routines looking at TTY side. ******************************************/ @@ -514,11 +512,8 @@ static void slc_sync(void) static struct slcan *slc_alloc(void) { int i; - char name[IFNAMSIZ]; struct net_device *dev =3D NULL; - struct can_ml_priv *can_ml; struct slcan *sl; - int size; =20 for (i =3D 0; i < maxdev; i++) { dev =3D slcan_devs[i]; @@ -531,16 +526,14 @@ static struct slcan *slc_alloc(void) if (i >=3D maxdev) return NULL; =20 - sprintf(name, "slcan%d", i); - size =3D ALIGN(sizeof(*sl), NETDEV_ALIGN) + sizeof(struct can_ml_priv); - dev =3D alloc_netdev(size, name, NET_NAME_UNKNOWN, slc_setup); + dev =3D alloc_candev(sizeof(*sl), 1); if (!dev) return NULL; =20 + snprintf(dev->name, sizeof(dev->name), "slcan%d", i); + dev->netdev_ops =3D &slc_netdev_ops; dev->base_addr =3D i; sl =3D netdev_priv(dev); - can_ml =3D (void *)sl + ALIGN(sizeof(*sl), NETDEV_ALIGN); - can_set_ml_priv(dev, can_ml); =20 /* Initialize channel control data */ sl->magic =3D SLCAN_MAGIC; @@ -605,26 +598,28 @@ static int slcan_open(struct tty_struct *tty) =20 set_bit(SLF_INUSE, &sl->flags); =20 - err =3D register_netdevice(sl->dev); - if (err) + rtnl_unlock(); + err =3D register_candev(sl->dev); + if (err) { + pr_err("slcan: can't register candev\n"); goto err_free_chan; + } + } else { + rtnl_unlock(); } =20 - /* Done. We have linked the TTY line to a channel. */ - rtnl_unlock(); tty->receive_room =3D 65536; /* We don't flow control */ =20 /* TTY layer expects 0 on success */ return 0; =20 err_free_chan: + rtnl_lock(); sl->tty =3D NULL; tty->disc_data =3D NULL; clear_bit(SLF_INUSE, &sl->flags); - slc_free_netdev(sl->dev); - /* do not call free_netdev before rtnl_unlock */ + slc_dealloc(sl); rtnl_unlock(); - free_netdev(sl->dev); return err; =20 err_exit: @@ -658,9 +653,11 @@ static void slcan_close(struct tty_struct *tty) synchronize_rcu(); flush_work(&sl->tx_work); =20 - /* Flush network side */ - unregister_netdev(sl->dev); - /* This will complete via sl_free_netdev */ + slc_close(sl->dev); + unregister_candev(sl->dev); + rtnl_lock(); + slc_dealloc(sl); + rtnl_unlock(); } =20 static void slcan_hangup(struct tty_struct *tty) @@ -768,14 +765,15 @@ static void __exit slcan_exit(void) dev =3D slcan_devs[i]; if (!dev) continue; - slcan_devs[i] =3D NULL; =20 sl =3D netdev_priv(dev); if (sl->tty) { netdev_err(dev, "tty discipline still running\n"); } =20 - unregister_netdev(dev); + slc_close(dev); + unregister_candev(dev); + slc_dealloc(sl); } =20 kfree(slcan_devs); --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id ECF03C43334 for ; Tue, 28 Jun 2022 16:36:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236090AbiF1Qga (ORCPT ); Tue, 28 Jun 2022 12:36:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50798 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231698AbiF1Qeu (ORCPT ); Tue, 28 Jun 2022 12:34:50 -0400 Received: from mail-ej1-x635.google.com (mail-ej1-x635.google.com [IPv6:2a00:1450:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B10FA34645 for ; Tue, 28 Jun 2022 09:31:57 -0700 (PDT) Received: by mail-ej1-x635.google.com with SMTP id mf9so27027782ejb.0 for ; Tue, 28 Jun 2022 09:31:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Zyw3StTTBZQE50VIbm/+yoJ4bqV04RBr+wi4S3Ganwc=; b=S41zUjUKFlhBCYHOrerU5Xli96L0AvUDZCtir9tl9KKhDeC8JN0+3ZNV+HKTkyOqCy h3eg+RxMKxD5a3XHNmdMZaq8L7ZqxdgDedkPkKoUBvQabLUnKEwbbvKjK2MSudgj7GP+ GftuGtwXXeo/ZzamCA1zlRh+75OmhWbo//6JY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Zyw3StTTBZQE50VIbm/+yoJ4bqV04RBr+wi4S3Ganwc=; b=Ox4CBmnlRz9mHKrVqjsesEBnFW7Mcfnij+k5FbaKXkkPG6ab8hBCbw5Wf1CwBRxyFL SS+8Ff2nmzX6gyGJfThy92TTODHvN5YN6cu0LrS+6/ahCVR9Oikm2qY02MtJd3TQCKB1 X4u/BKDkHDFauN6qH/0Sws3j0yrbGOFeDE8H0TvGtkY0wmviR70WE+7XJ4XcihlmtGtj ls/Y0hUz8bwZCqlE8qLCq6rDD093PCE+TaR3txXcUu+LEaRFLwu6Nsm1X6arCNopbH+H Khyoo7vg4zQie7ebXb8MOylLH0AkRPQQD7fYAeKvmyhXpanyiZvm6m6uLKPu8BgyYfzA woCQ== X-Gm-Message-State: AJIora9ONraeaQk7DTmgyEmImTijddjI3BH40rARqJePMBDg3GaDlx7P YuSltFHU7kOhXqfTy9YrZKRz0jnDldWmqw== X-Google-Smtp-Source: AGRyM1vBk2wMNW/HbxmnPsFpzK+heKZBIMg8aMv9NVyx6WCQ/nsUdgJrApjNpv2e8d6nEmWoA1gitA== X-Received: by 2002:a17:907:72c7:b0:722:f046:c9d9 with SMTP id du7-20020a17090772c700b00722f046c9d9mr18152763ejc.409.1656433916978; Tue, 28 Jun 2022 09:31:56 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.31.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:31:56 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Marc Kleine-Budde , Paolo Abeni , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 06/12] can: slcan: allow to send commands to the adapter Date: Tue, 28 Jun 2022 18:31:30 +0200 Message-Id: <20220628163137.413025-7-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This is a preparation patch for the upcoming support to change the bitrate via ip tool, reset the adapter error states via the ethtool API and, more generally, send commands to the adapter. Since the close command (i. e. "C\r") will be sent in the ndo_stop() where netif_running() returns false, a new flag bit (i. e. SLF_XCMD) for serial transmission has to be added. Signed-off-by: Dario Binacchi --- (no changes since v4) Changes in v4: - Replace `sl->tty =3D=3D NULL' with `!sl->tty'. Changes in v3: - Update the commit description. drivers/net/can/slcan.c | 46 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index bf84698f1a81..dfccf8d6c9a5 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -97,6 +97,9 @@ struct slcan { unsigned long flags; /* Flag values/ mode etc */ #define SLF_INUSE 0 /* Channel in use */ #define SLF_ERROR 1 /* Parity, etc. error */ +#define SLF_XCMD 2 /* Command transmission */ + wait_queue_head_t xcmd_wait; /* Wait queue for commands */ + /* transmission */ }; =20 static struct net_device **slcan_devs; @@ -314,12 +317,22 @@ static void slcan_transmit(struct work_struct *work) =20 spin_lock_bh(&sl->lock); /* First make sure we're connected. */ - if (!sl->tty || sl->magic !=3D SLCAN_MAGIC || !netif_running(sl->dev)) { + if (!sl->tty || sl->magic !=3D SLCAN_MAGIC || + (unlikely(!netif_running(sl->dev)) && + likely(!test_bit(SLF_XCMD, &sl->flags)))) { spin_unlock_bh(&sl->lock); return; } =20 if (sl->xleft <=3D 0) { + if (unlikely(test_bit(SLF_XCMD, &sl->flags))) { + clear_bit(SLF_XCMD, &sl->flags); + clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); + spin_unlock_bh(&sl->lock); + wake_up(&sl->xcmd_wait); + return; + } + /* Now serial buffer is almost free & we can start * transmission of another packet */ sl->dev->stats.tx_packets++; @@ -383,6 +396,36 @@ static netdev_tx_t slc_xmit(struct sk_buff *skb, struc= t net_device *dev) * Routines looking at netdevice side. ******************************************/ =20 +static int slcan_transmit_cmd(struct slcan *sl, const unsigned char *cmd) +{ + int ret, actual, n; + + spin_lock(&sl->lock); + if (!sl->tty) { + spin_unlock(&sl->lock); + return -ENODEV; + } + + n =3D snprintf(sl->xbuff, sizeof(sl->xbuff), "%s", cmd); + set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); + actual =3D sl->tty->ops->write(sl->tty, sl->xbuff, n); + sl->xleft =3D n - actual; + sl->xhead =3D sl->xbuff + actual; + set_bit(SLF_XCMD, &sl->flags); + spin_unlock(&sl->lock); + ret =3D wait_event_interruptible_timeout(sl->xcmd_wait, + !test_bit(SLF_XCMD, &sl->flags), + HZ); + clear_bit(SLF_XCMD, &sl->flags); + if (ret =3D=3D -ERESTARTSYS) + return ret; + + if (ret =3D=3D 0) + return -ETIMEDOUT; + + return 0; +} + /* Netdevice UP -> DOWN routine */ static int slc_close(struct net_device *dev) { @@ -540,6 +583,7 @@ static struct slcan *slc_alloc(void) sl->dev =3D dev; spin_lock_init(&sl->lock); INIT_WORK(&sl->tx_work, slcan_transmit); + init_waitqueue_head(&sl->xcmd_wait); slcan_devs[i] =3D dev; =20 return sl; --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 685FEC43334 for ; Tue, 28 Jun 2022 16:36:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232042AbiF1Qgh (ORCPT ); Tue, 28 Jun 2022 12:36:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50836 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230282AbiF1Qe5 (ORCPT ); Tue, 28 Jun 2022 12:34:57 -0400 Received: from mail-ej1-x62d.google.com (mail-ej1-x62d.google.com [IPv6:2a00:1450:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3078BB91 for ; Tue, 28 Jun 2022 09:31:59 -0700 (PDT) Received: by mail-ej1-x62d.google.com with SMTP id lw20so26938298ejb.4 for ; Tue, 28 Jun 2022 09:31:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=D6vzlwH+mLCbP3Rml9p5rdZQNkA778tyhjsV5pComus=; b=pmy2+RhTplY12KneO0Nn181HDQOT2OjS9wITVZRegWS0DqXCXMNLMylgs6h32PJoa9 TOzLqN0VpBkWGrITjxu4CKnKUbuNnenFJarLVORbntyuhLDbQllF4DhRioGbWUtIrCuB 4N0mE+8EXh4/vIGozPw04brqhCU9XgN8aJDVU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=D6vzlwH+mLCbP3Rml9p5rdZQNkA778tyhjsV5pComus=; b=RfBNAms4rr5kfa3lmaCQk5YLY0nfxAwYPTEQMX8wQDidAGXilb8+2fjurr2oBHxt9p MWTL9Jxwlz4F6p5ripT7FwuFoR7sUH8TtJQ0bhWdyAND407Tdrmlpysq4glP3VHLzJQm fowMBqCbZFpQJq/jK2vfqL+l2uUgVCcPkt9KgLkpBp57xoLo/UkFUdpcEaSFvKB9vvNV i/YWQv7oGbtJSnGXs9xY6CvvS7V5WdnLonpvvtmz1+SP9GB6NFjCtBccfA7BZIRVuGSQ C/pgY8akwy6bPPVJCZOR2BGDIB/FujbKzSwSfcc2NNvRwkGUfgzZlv7AHw21eCfXKgov aKNQ== X-Gm-Message-State: AJIora+ibvTe+ZjdoEyPanyFfbfxWo8nLzfT8XOD+BfCIWnqXe7ufKvE vQp6EujcS4t1bGneghd7610vwIOBlbD0xA== X-Google-Smtp-Source: AGRyM1tOReslV7cyI8mM9pR5XlUqudHGEV7zWPHJ1JyHiT6dKaD4e2FrrhtiXiJOlcVbv4iYgeuheQ== X-Received: by 2002:a17:907:1c1a:b0:726:2ce1:955e with SMTP id nc26-20020a1709071c1a00b007262ce1955emr17792937ejc.566.1656433918441; Tue, 28 Jun 2022 09:31:58 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.31.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:31:58 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Marc Kleine-Budde , Paolo Abeni , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 07/12] can: slcan: set bitrate by CAN device driver API Date: Tue, 28 Jun 2022 18:31:31 +0200 Message-Id: <20220628163137.413025-8-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" It allows to set the bitrate via ip tool, as it happens for the other CAN device drivers. It still remains possible to set the bitrate via slcand or slcan_attach utilities. In case the ip tool is used, the driver will send the serial command to the adapter. Signed-off-by: Dario Binacchi --- (no changes since v4) Changes in v4: - Use CAN_BITRATE_UNSET (0) and CAN_BITRATE_UNKNOWN (-1U) macros. - Don't reset the bitrate in ndo_stop() if it has been configured. Changes in v3: - Remove the slc_do_set_bittiming(). - Set the bitrate in the ndo_open(). - Replace -1UL with -1U in setting a fake value for the bitrate. Changes in v2: - Use the CAN framework support for setting fixed bit rates. drivers/net/can/slcan.c | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index dfccf8d6c9a5..74033e2d7097 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -104,6 +104,11 @@ struct slcan { =20 static struct net_device **slcan_devs; =20 +static const u32 slcan_bitrate_const[] =3D { + 10000, 20000, 50000, 100000, 125000, + 250000, 500000, 800000, 1000000 +}; + /************************************************************************ * SLCAN ENCAPSULATION FORMAT * ************************************************************************/ @@ -439,6 +444,9 @@ static int slc_close(struct net_device *dev) netif_stop_queue(dev); close_candev(dev); sl->can.state =3D CAN_STATE_STOPPED; + if (sl->can.bittiming.bitrate =3D=3D CAN_BITRATE_UNKNOWN) + sl->can.bittiming.bitrate =3D CAN_BITRATE_UNSET; + sl->rcount =3D 0; sl->xleft =3D 0; spin_unlock_bh(&sl->lock); @@ -450,7 +458,8 @@ static int slc_close(struct net_device *dev) static int slc_open(struct net_device *dev) { struct slcan *sl =3D netdev_priv(dev); - int err; + unsigned char cmd[SLC_MTU]; + int err, s; =20 if (sl->tty =3D=3D NULL) return -ENODEV; @@ -460,15 +469,39 @@ static int slc_open(struct net_device *dev) * can.bittiming.bitrate is CAN_BITRATE_UNSET (0), causing * open_candev() to fail. So let's set to a fake value. */ - sl->can.bittiming.bitrate =3D CAN_BITRATE_UNKNOWN; + if (sl->can.bittiming.bitrate =3D=3D CAN_BITRATE_UNSET) + sl->can.bittiming.bitrate =3D CAN_BITRATE_UNKNOWN; + err =3D open_candev(dev); if (err) { netdev_err(dev, "failed to open can device\n"); return err; } =20 - sl->can.state =3D CAN_STATE_ERROR_ACTIVE; sl->flags &=3D BIT(SLF_INUSE); + + if (sl->can.bittiming.bitrate !=3D CAN_BITRATE_UNKNOWN) { + for (s =3D 0; s < ARRAY_SIZE(slcan_bitrate_const); s++) { + if (sl->can.bittiming.bitrate =3D=3D slcan_bitrate_const[s]) + break; + } + + /* The CAN framework has already validate the bitrate value, + * so we can avoid to check if `s' has been properly set. + */ + + snprintf(cmd, sizeof(cmd), "C\rS%d\r", s); + err =3D slcan_transmit_cmd(sl, cmd); + if (err) { + netdev_err(dev, + "failed to send bitrate command 'C\\rS%d\\r'\n", + s); + close_candev(dev); + return err; + } + } + + sl->can.state =3D CAN_STATE_ERROR_ACTIVE; netif_start_queue(dev); return 0; } @@ -581,6 +614,8 @@ static struct slcan *slc_alloc(void) /* Initialize channel control data */ sl->magic =3D SLCAN_MAGIC; sl->dev =3D dev; + sl->can.bitrate_const =3D slcan_bitrate_const; + sl->can.bitrate_const_cnt =3D ARRAY_SIZE(slcan_bitrate_const); spin_lock_init(&sl->lock); INIT_WORK(&sl->tx_work, slcan_transmit); init_waitqueue_head(&sl->xcmd_wait); --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3348CC43334 for ; Tue, 28 Jun 2022 16:37:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233724AbiF1QhB (ORCPT ); Tue, 28 Jun 2022 12:37:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51844 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236789AbiF1Qe6 (ORCPT ); Tue, 28 Jun 2022 12:34:58 -0400 Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DCEB134BAD for ; Tue, 28 Jun 2022 09:32:00 -0700 (PDT) Received: by mail-ej1-x62f.google.com with SMTP id u12so26847421eja.8 for ; Tue, 28 Jun 2022 09:32:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Nio9Io5wePvGAcDSc6srKQ98uT3KtiBcW8y7c2FhYMU=; b=X7YljmFoA+Pbjbkk0RPtWOXAsrWDlX5lLpo+NIfWZSQ9xz6s63CHPPpeQUX3Dd+edg chqkljTxiAo6Tx5D2zlMCdqzpo//BQaRaPEvuQhdKRjeeSYYdfq/WpA0vX2BTKzDzuKx xkyxpx3F1ORYnqinncEaJI4/p4xAOTQ6QzcXY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Nio9Io5wePvGAcDSc6srKQ98uT3KtiBcW8y7c2FhYMU=; b=oq9biLhzNt6f+q9sXnUPuzs2lQNRloPQ8AfN+jFvH/U4nSEKVvACpcMGMH0+ot0m0h Mrlq9EfP/d8xD2v/J8SQsPgGwgSC14RBwVZXMCqEi6XyzM5wXwzVUgWTs3PFMy+8B0u5 9rSSCVKdodqZDlZYvBy3xZ0SkMGxjiN24UnIw4hPdJn8N3LqAey/ZqqblREiCvoJ6ArY BbxKLfsjggFCOyWY6fZTtqSvrT2Mp/dRyPsOKhOQo/m8k+zyuwL4O/5hh2+WRo2MwpMu +uRcxtLEaicIuK0ta6U9mzvl6EI5UOVVjjzwLdIoJUoU9ok3i7suIx86HV4aRDIg/2MD VLBg== X-Gm-Message-State: AJIora8EU1jqzB3POZu9j7IJsc6YaaEBHLMr6hx+00pAbgocvMMPQdlu kBlHajBKmALFs37lFPXGoeDj5oS0vpg3Jw== X-Google-Smtp-Source: AGRyM1si4nXdxEjqIXU5aRmZJLvPy2mhhad41u83reYLiAJ+SArzkZQjW+uWGFMwkZ7tUzGqmCXQBw== X-Received: by 2002:a17:907:7fa4:b0:726:b83d:6cbc with SMTP id qk36-20020a1709077fa400b00726b83d6cbcmr8359371ejc.49.1656433919982; Tue, 28 Jun 2022 09:31:59 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.31.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:31:59 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Marc Kleine-Budde , Paolo Abeni , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 08/12] can: slcan: send the open/close commands to the adapter Date: Tue, 28 Jun 2022 18:31:32 +0200 Message-Id: <20220628163137.413025-9-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" In case the bitrate has been set via ip tool, this patch changes the driver to send the open ("O\r") and close ("C\r) commands to the adapter. Signed-off-by: Dario Binacchi --- (no changes since v4) Changes in v4: - Squashed to the patch [v3,09/13] can: slcan: send the close command to th= e adapter. - Use the CAN_BITRATE_UNKNOWN macro. Changes in v2: - Improve the commit message. drivers/net/can/slcan.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index 74033e2d7097..249b5ade06fc 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -435,9 +435,20 @@ static int slcan_transmit_cmd(struct slcan *sl, const = unsigned char *cmd) static int slc_close(struct net_device *dev) { struct slcan *sl =3D netdev_priv(dev); + int err; =20 spin_lock_bh(&sl->lock); if (sl->tty) { + if (sl->can.bittiming.bitrate && + sl->can.bittiming.bitrate !=3D CAN_BITRATE_UNKNOWN) { + spin_unlock_bh(&sl->lock); + err =3D slcan_transmit_cmd(sl, "C\r"); + spin_lock_bh(&sl->lock); + if (err) + netdev_warn(dev, + "failed to send close command 'C\\r'\n"); + } + /* TTY discipline is running. */ clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); } @@ -496,14 +507,23 @@ static int slc_open(struct net_device *dev) netdev_err(dev, "failed to send bitrate command 'C\\rS%d\\r'\n", s); - close_candev(dev); - return err; + goto cmd_transmit_failed; + } + + err =3D slcan_transmit_cmd(sl, "O\r"); + if (err) { + netdev_err(dev, "failed to send open command 'O\\r'\n"); + goto cmd_transmit_failed; } } =20 sl->can.state =3D CAN_STATE_ERROR_ACTIVE; netif_start_queue(dev); return 0; + +cmd_transmit_failed: + close_candev(dev); + return err; } =20 static void slc_dealloc(struct slcan *sl) --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 96050CCA479 for ; Tue, 28 Jun 2022 16:40:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240822AbiF1Qhr (ORCPT ); Tue, 28 Jun 2022 12:37:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51850 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236956AbiF1Qe6 (ORCPT ); Tue, 28 Jun 2022 12:34:58 -0400 Received: from mail-ed1-x533.google.com (mail-ed1-x533.google.com [IPv6:2a00:1450:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 543E23526B for ; Tue, 28 Jun 2022 09:32:02 -0700 (PDT) Received: by mail-ed1-x533.google.com with SMTP id o10so18405450edi.1 for ; Tue, 28 Jun 2022 09:32:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=s1QllzXGCUo8JTE+hOZVBSnNVj6x3XTlbwu5/oui3J8=; b=DV/JgG9StAMjN5vbyosSc+Tz1ANvXg+nXIb8iIu03TwzUf+XAWtjO/GFjAG6hEeJMG nJ9r5+2xCIoIBz0v0nVkWT5ZJWFl0tABcnXp0o4PGc4ZPc2KnyBQdjS2Pg+9jVP6N1OI 4U2kwYJbqS2eQPi3lDsI154EmbPK3VQz0tOiw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=s1QllzXGCUo8JTE+hOZVBSnNVj6x3XTlbwu5/oui3J8=; b=PNdcmKm0rbHtxaE0BUoI1LktG5DMZd5c32/R+eMg5N9hYXQyIvQrDorwa7eucVnOzw FRG1OoZaCX26VHxKV3Q/fBp7gibvYHTPjcJYhxAwDhWurfjSFI6x5ccMXHD7zZ46JZz/ 6YwknNN+MiLS9Vx2kkjnECU58M2xEKB7IIMBZZcHPelkQjPW9vpxmcsZ7yjoHM+W3ODR tufz3upCCfNlKGdnW7Zqt0FFZR+jYD5bb36BWff8dzJBKI0X1d2jkBG6y6iNK9rmXIBA 9nFU3g5kZkJmRAQzgDpsB6FMMLfiS87EUZ7m/Rnrk4tJRYQtOkO1cQEs2Eez6MnbNRHr 8UdQ== X-Gm-Message-State: AJIora/LwZOjzol+qzuntRCYvUwM9xT3cho9qwLcp4zWCe/yqziqhC7c AVfLmk2Bn9yaTHFSCy+SpZTmlFnHOuTvIA== X-Google-Smtp-Source: AGRyM1s6gLZPSYO2oaziV5t5Vt0umQTthq84byZbwpX3hmbv/j6UzlpWvhzkgMgRnMCARNB87ghK4g== X-Received: by 2002:a05:6402:43c5:b0:435:89ee:578f with SMTP id p5-20020a05640243c500b0043589ee578fmr25080462edc.225.1656433921691; Tue, 28 Jun 2022 09:32:01 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.32.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:32:01 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Greg Kroah-Hartman , Jakub Kicinski , Jiri Slaby , Marc Kleine-Budde , Paolo Abeni , Sebastian Andrzej Siewior , Vincent Mailhol , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 09/12] can: slcan: move driver into separate sub directory Date: Tue, 28 Jun 2022 18:31:33 +0200 Message-Id: <20220628163137.413025-10-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch moves the slcan driver into a separate directory, a later patch will add more files. Signed-off-by: Dario Binacchi --- (no changes since v1) drivers/net/can/Makefile | 2 +- drivers/net/can/slcan/Makefile | 6 ++++++ drivers/net/can/{slcan.c =3D> slcan/slcan-core.c} | 0 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 drivers/net/can/slcan/Makefile rename drivers/net/can/{slcan.c =3D> slcan/slcan-core.c} (100%) diff --git a/drivers/net/can/Makefile b/drivers/net/can/Makefile index 0af85983634c..210354df273c 100644 --- a/drivers/net/can/Makefile +++ b/drivers/net/can/Makefile @@ -5,7 +5,7 @@ =20 obj-$(CONFIG_CAN_VCAN) +=3D vcan.o obj-$(CONFIG_CAN_VXCAN) +=3D vxcan.o -obj-$(CONFIG_CAN_SLCAN) +=3D slcan.o +obj-$(CONFIG_CAN_SLCAN) +=3D slcan/ =20 obj-y +=3D dev/ obj-y +=3D rcar/ diff --git a/drivers/net/can/slcan/Makefile b/drivers/net/can/slcan/Makefile new file mode 100644 index 000000000000..2e84f7bf7617 --- /dev/null +++ b/drivers/net/can/slcan/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_CAN_SLCAN) +=3D slcan.o + +slcan-objs :=3D +slcan-objs +=3D slcan-core.o diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan/slcan-core.c similarity index 100% rename from drivers/net/can/slcan.c rename to drivers/net/can/slcan/slcan-core.c --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E9043C43334 for ; Tue, 28 Jun 2022 16:37:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232431AbiF1QhI (ORCPT ); Tue, 28 Jun 2022 12:37:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50882 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231929AbiF1Qe7 (ORCPT ); Tue, 28 Jun 2022 12:34:59 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3093035870 for ; Tue, 28 Jun 2022 09:32:04 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id ay16so26921732ejb.6 for ; Tue, 28 Jun 2022 09:32:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=EnkldBizAbtcQ/b8PNuwOxdeNT2ej6ej+gjqsPyuyDo=; b=gVQ7SGJIOxgI5u4R2NQ9QXRVxbRCBtPjM2sUouafDkoZFdoLiHyKy1ppm66vtDeyE9 j0sOa94tlh9/HKZ6lDWNZXEmluoxMSYoTW/3HGUiHGiTxRpauDmHvWtEdU3SWsGKCNpy e59VXwNcPP6PZGG+pK3e4CCBURU7j6pDXIgyY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EnkldBizAbtcQ/b8PNuwOxdeNT2ej6ej+gjqsPyuyDo=; b=eiyzMuLbLN9zeEknl2rE0Q+8oOvJZMF3+hlsEf2Xpq/2jy3A7vfrNKz+eAKuTcKSki SmRuf4Ja3lra1Mx+Tav2m0oOHMIKCrl5u8YtFnAPE2nPqh8s2XTnfUUGFqB1m4lKEBMJ 3DVrfEJhFTpzao7i1X6xyRJZ32nErQFAYJgT5MKCn5a975EIt5n4fVNE6JQlewUwSX4K ig6rvKsWm/XNY/C6DXZc5B+PiL6GzaJnmnsQ1LTeA3H0MEgmFtr+E3DrplnnkAs9+jsY Vg7aI2LxMGBY74O4ATAP9a3zU1SD3EAptRKOFq3SdPBlj5AJNAU/cUROS/DVjxjsh2Rl ZEOA== X-Gm-Message-State: AJIora8gmP8F7pbo6H+RjGCe8SI6d73wBtkbx63MJ1f/u/WJEMqtVIJW Xn1vfZDQ5458al4DI2bP3/gP93juDkvmzA== X-Google-Smtp-Source: AGRyM1tW1JbfWs81rMrmsjJkHJY3Gdi0X1CVdqYT2uA/xYErOUijhCZ3mf/mW3c1ElGzh03RvxKiLQ== X-Received: by 2002:a17:906:c152:b0:726:35bd:b3bd with SMTP id dp18-20020a170906c15200b0072635bdb3bdmr18725435ejc.201.1656433923423; Tue, 28 Jun 2022 09:32:03 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.32.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:32:02 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Greg Kroah-Hartman , Jakub Kicinski , Jiri Slaby , Marc Kleine-Budde , Paolo Abeni , Sebastian Andrzej Siewior , Vincent Mailhol , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 10/12] can: slcan: add ethtool support to reset adapter errors Date: Tue, 28 Jun 2022 18:31:34 +0200 Message-Id: <20220628163137.413025-11-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch adds a private flag to the slcan driver to switch the "err-rst-on-open" setting on and off. "err-rst-on-open" on - Reset error states on opening command "err-rst-on-open" off - Don't reset error states on opening command (default) The setting can only be changed if the interface is down: ip link set dev can0 down ethtool --set-priv-flags can0 err-rst-on-open {off|on} ip link set dev can0 up Signed-off-by: Dario Binacchi --- (no changes since v1) drivers/net/can/slcan/Makefile | 1 + drivers/net/can/slcan/slcan-core.c | 36 +++++++++++++++ drivers/net/can/slcan/slcan-ethtool.c | 65 +++++++++++++++++++++++++++ drivers/net/can/slcan/slcan.h | 18 ++++++++ 4 files changed, 120 insertions(+) create mode 100644 drivers/net/can/slcan/slcan-ethtool.c create mode 100644 drivers/net/can/slcan/slcan.h diff --git a/drivers/net/can/slcan/Makefile b/drivers/net/can/slcan/Makefile index 2e84f7bf7617..8a88e484ee21 100644 --- a/drivers/net/can/slcan/Makefile +++ b/drivers/net/can/slcan/Makefile @@ -4,3 +4,4 @@ obj-$(CONFIG_CAN_SLCAN) +=3D slcan.o =20 slcan-objs :=3D slcan-objs +=3D slcan-core.o +slcan-objs +=3D slcan-ethtool.o diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slc= an-core.c index 249b5ade06fc..c1fd1e934d93 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -57,6 +57,8 @@ #include #include =20 +#include "slcan.h" + MODULE_ALIAS_LDISC(N_SLCAN); MODULE_DESCRIPTION("serial line CAN interface"); MODULE_LICENSE("GPL"); @@ -98,6 +100,8 @@ struct slcan { #define SLF_INUSE 0 /* Channel in use */ #define SLF_ERROR 1 /* Parity, etc. error */ #define SLF_XCMD 2 /* Command transmission */ + unsigned long cmd_flags; /* Command flags */ +#define CF_ERR_RST 0 /* Reset errors on open */ wait_queue_head_t xcmd_wait; /* Wait queue for commands */ /* transmission */ }; @@ -109,6 +113,28 @@ static const u32 slcan_bitrate_const[] =3D { 250000, 500000, 800000, 1000000 }; =20 +bool slcan_err_rst_on_open(struct net_device *ndev) +{ + struct slcan *sl =3D netdev_priv(ndev); + + return !!test_bit(CF_ERR_RST, &sl->cmd_flags); +} + +int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on) +{ + struct slcan *sl =3D netdev_priv(ndev); + + if (netif_running(ndev)) + return -EBUSY; + + if (on) + set_bit(CF_ERR_RST, &sl->cmd_flags); + else + clear_bit(CF_ERR_RST, &sl->cmd_flags); + + return 0; +} + /************************************************************************ * SLCAN ENCAPSULATION FORMAT * ************************************************************************/ @@ -510,6 +536,15 @@ static int slc_open(struct net_device *dev) goto cmd_transmit_failed; } =20 + if (test_bit(CF_ERR_RST, &sl->cmd_flags)) { + err =3D slcan_transmit_cmd(sl, "F\r"); + if (err) { + netdev_err(dev, + "failed to send error command 'F\\r'\n"); + goto cmd_transmit_failed; + } + } + err =3D slcan_transmit_cmd(sl, "O\r"); if (err) { netdev_err(dev, "failed to send open command 'O\\r'\n"); @@ -629,6 +664,7 @@ static struct slcan *slc_alloc(void) snprintf(dev->name, sizeof(dev->name), "slcan%d", i); dev->netdev_ops =3D &slc_netdev_ops; dev->base_addr =3D i; + slcan_set_ethtool_ops(dev); sl =3D netdev_priv(dev); =20 /* Initialize channel control data */ diff --git a/drivers/net/can/slcan/slcan-ethtool.c b/drivers/net/can/slcan/= slcan-ethtool.c new file mode 100644 index 000000000000..bf0afdc4e49d --- /dev/null +++ b/drivers/net/can/slcan/slcan-ethtool.c @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* Copyright (c) 2022 Amarula Solutions, Dario Binacchi + * + */ + +#include +#include +#include +#include +#include + +#include "slcan.h" + +static const char slcan_priv_flags_strings[][ETH_GSTRING_LEN] =3D { +#define SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN BIT(0) + "err-rst-on-open", +}; + +static void slcan_get_strings(struct net_device *ndev, u32 stringset, u8 *= data) +{ + switch (stringset) { + case ETH_SS_PRIV_FLAGS: + memcpy(data, slcan_priv_flags_strings, + sizeof(slcan_priv_flags_strings)); + } +} + +static u32 slcan_get_priv_flags(struct net_device *ndev) +{ + u32 flags =3D 0; + + if (slcan_err_rst_on_open(ndev)) + flags |=3D SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN; + + return flags; +} + +static int slcan_set_priv_flags(struct net_device *ndev, u32 flags) +{ + bool err_rst_op_open =3D !!(flags & SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN); + + return slcan_enable_err_rst_on_open(ndev, err_rst_op_open); +} + +static int slcan_get_sset_count(struct net_device *netdev, int sset) +{ + switch (sset) { + case ETH_SS_PRIV_FLAGS: + return ARRAY_SIZE(slcan_priv_flags_strings); + default: + return -EOPNOTSUPP; + } +} + +static const struct ethtool_ops slcan_ethtool_ops =3D { + .get_strings =3D slcan_get_strings, + .get_priv_flags =3D slcan_get_priv_flags, + .set_priv_flags =3D slcan_set_priv_flags, + .get_sset_count =3D slcan_get_sset_count, +}; + +void slcan_set_ethtool_ops(struct net_device *netdev) +{ + netdev->ethtool_ops =3D &slcan_ethtool_ops; +} diff --git a/drivers/net/can/slcan/slcan.h b/drivers/net/can/slcan/slcan.h new file mode 100644 index 000000000000..d463c8d99e22 --- /dev/null +++ b/drivers/net/can/slcan/slcan.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 + * slcan.h - serial line CAN interface driver + * + * Copyright (C) Laurence Culhane + * Copyright (C) Fred N. van Kempen + * Copyright (C) Oliver Hartkopp + * Copyright (C) 2022 Amarula Solutions, Dario Binacchi + * + */ + +#ifndef _SLCAN_H +#define _SLCAN_H + +bool slcan_err_rst_on_open(struct net_device *ndev); +int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on); +void slcan_set_ethtool_ops(struct net_device *ndev); + +#endif /* _SLCAN_H */ --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 265B7C43334 for ; Tue, 28 Jun 2022 16:40:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235574AbiF1QhU (ORCPT ); Tue, 28 Jun 2022 12:37:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52584 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231927AbiF1Qe7 (ORCPT ); Tue, 28 Jun 2022 12:34:59 -0400 Received: from mail-ej1-x635.google.com (mail-ej1-x635.google.com [IPv6:2a00:1450:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 99FD2B94 for ; Tue, 28 Jun 2022 09:32:05 -0700 (PDT) Received: by mail-ej1-x635.google.com with SMTP id mf9so27027782ejb.0 for ; Tue, 28 Jun 2022 09:32:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dlTOY2xvVGa6BOY+C/5W0PL43wDapCN5T2ZQIpzidGs=; b=FFGuQTgNFPUOJy7W7LyC6yuBr+1gnvvgi5oICNleFC9tYjsV7E65ZItYDQYG7QxPMu MYIGFHznp0t0+2QDquc6gaj6dHhvwNNv+YdX7n2h4XyOO0mGYF8/Tc+AeoWBnrTskmRA IKRfOaJ1/XK68brtxVVQKiW43xvrFYdzhNbLo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dlTOY2xvVGa6BOY+C/5W0PL43wDapCN5T2ZQIpzidGs=; b=10A4aT2evpwUclaMixaQ4j6qT5wEeK2a2i902wbc4xUCxkliV4I9Ceot5Xhi5dx59z x3VaFt969ScqQwa1FGpJRS1B7fAit7qP+pOhvpm65Da4bDaftTEkqhbM+QB0x2OKsdo7 MeZfKgwYSaOzb4zJBCEsmNiMY2GL7OTxg+w0jVC3mYdkKpRIMlGF03+G4m4kXjnVT0RZ YEDsunJjUCl5awWvZQdZQrDycE86LLayGLZYcvUgPC/ZvhHvvC5iI+0eKE24tJey1jzH tFfmHWdHHrA0ZQS2Lob4ohCzhGHLw6FB+8ffenNQujuHxlPVfNkNHk6HlnJCrSHbZDWZ kyng== X-Gm-Message-State: AJIora/vRnMkUOd90JYc4LJZ0275RWwkKo9ofTahxoyF5yuK/paDmAMH oq4vdyGeUts3bJAqv7LvNXL2efo1E7qFvQ== X-Google-Smtp-Source: AGRyM1vx3ooj/k5/B7RWpo8vUen0e+1A7wWHA37jOfUxzwtSR3c2Ip2cIO8jdB2tCXVi8ls/o9KiGw== X-Received: by 2002:a17:907:94d4:b0:722:e4b8:c2f2 with SMTP id dn20-20020a17090794d400b00722e4b8c2f2mr18565878ejc.527.1656433924935; Tue, 28 Jun 2022 09:32:04 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.32.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:32:04 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Greg Kroah-Hartman , Jakub Kicinski , Jiri Slaby , Marc Kleine-Budde , Paolo Abeni , Sebastian Andrzej Siewior , Vincent Mailhol , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 11/12] can: slcan: extend the protocol with error info Date: Tue, 28 Jun 2022 18:31:35 +0200 Message-Id: <20220628163137.413025-12-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" It extends the protocol to receive the adapter CAN communication errors and forward them to the netdev upper levels. Signed-off-by: Dario Binacchi --- (no changes since v4) Changes in v4: - Add description of slc_bump_err() function. - Remove check for the 'e' character at the beggining of the function. It was already checked by the caller function. - Protect decoding against the case the len value is longer than the received data. - Some small changes to make the decoding more readable. - Increment all the error counters at the end of the function. Changes in v2: - Protect decoding against the case the len value is longer than the received data. - Continue error handling even if no skb can be allocated. drivers/net/can/slcan/slcan-core.c | 140 ++++++++++++++++++++++++++++- 1 file changed, 139 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slc= an-core.c index c1fd1e934d93..4269b2267be2 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -175,7 +175,7 @@ int slcan_enable_err_rst_on_open(struct net_device *nde= v, bool on) ************************************************************************/ =20 /* Send one completely decapsulated can_frame to the network layer */ -static void slc_bump(struct slcan *sl) +static void slc_bump_frame(struct slcan *sl) { struct sk_buff *skb; struct can_frame *cf; @@ -254,6 +254,144 @@ static void slc_bump(struct slcan *sl) dev_kfree_skb(skb); } =20 +/* An error frame can contain more than one type of error. + * + * Examples: + * + * e1a : len 1, errors: ACK error + * e3bcO: len 3, errors: Bit0 error, CRC error, Tx overrun error + */ +static void slc_bump_err(struct slcan *sl) +{ + struct net_device *dev =3D sl->dev; + struct sk_buff *skb; + struct can_frame *cf; + char *cmd =3D sl->rbuff; + bool rx_errors =3D false, tx_errors =3D false, rx_over_errors =3D false; + int i, len; + + /* get len from sanitized ASCII value */ + len =3D cmd[1]; + if (len >=3D '0' && len < '9') + len -=3D '0'; + else + return; + + if ((len + SLC_CMD_LEN + 1) > sl->rcount) + return; + + skb =3D alloc_can_err_skb(dev, &cf); + + if (skb) + cf->can_id |=3D CAN_ERR_PROT | CAN_ERR_BUSERROR; + + cmd +=3D SLC_CMD_LEN + 1; + for (i =3D 0; i < len; i++, cmd++) { + switch (*cmd) { + case 'a': + netdev_dbg(dev, "ACK error\n"); + tx_errors =3D true; + if (skb) { + cf->can_id |=3D CAN_ERR_ACK; + cf->data[3] =3D CAN_ERR_PROT_LOC_ACK; + } + + break; + case 'b': + netdev_dbg(dev, "Bit0 error\n"); + tx_errors =3D true; + if (skb) + cf->data[2] |=3D CAN_ERR_PROT_BIT0; + + break; + case 'B': + netdev_dbg(dev, "Bit1 error\n"); + tx_errors =3D true; + if (skb) + cf->data[2] |=3D CAN_ERR_PROT_BIT1; + + break; + case 'c': + netdev_dbg(dev, "CRC error\n"); + rx_errors =3D true; + if (skb) { + cf->data[2] |=3D CAN_ERR_PROT_BIT; + cf->data[3] =3D CAN_ERR_PROT_LOC_CRC_SEQ; + } + + break; + case 'f': + netdev_dbg(dev, "Form Error\n"); + rx_errors =3D true; + if (skb) + cf->data[2] |=3D CAN_ERR_PROT_FORM; + + break; + case 'o': + netdev_dbg(dev, "Rx overrun error\n"); + rx_over_errors =3D true; + rx_errors =3D true; + if (skb) { + cf->can_id |=3D CAN_ERR_CRTL; + cf->data[1] =3D CAN_ERR_CRTL_RX_OVERFLOW; + } + + break; + case 'O': + netdev_dbg(dev, "Tx overrun error\n"); + tx_errors =3D true; + if (skb) { + cf->can_id |=3D CAN_ERR_CRTL; + cf->data[1] =3D CAN_ERR_CRTL_TX_OVERFLOW; + } + + break; + case 's': + netdev_dbg(dev, "Stuff error\n"); + rx_errors =3D true; + if (skb) + cf->data[2] |=3D CAN_ERR_PROT_STUFF; + + break; + default: + if (skb) + dev_kfree_skb(skb); + + return; + } + } + + if (rx_errors) + dev->stats.rx_errors++; + + if (rx_over_errors) + dev->stats.rx_over_errors++; + + if (tx_errors) + dev->stats.tx_errors++; + + if (skb) + netif_rx(skb); +} + +static void slc_bump(struct slcan *sl) +{ + switch (sl->rbuff[0]) { + case 'r': + fallthrough; + case 't': + fallthrough; + case 'R': + fallthrough; + case 'T': + return slc_bump_frame(sl); + case 'e': + return slc_bump_err(sl); + default: + return; + } +} + /* parse tty input stream */ static void slcan_unesc(struct slcan *sl, unsigned char s) { --=20 2.32.0 From nobody Sun Apr 26 12:18:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8084DC43334 for ; Tue, 28 Jun 2022 16:40:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240428AbiF1Qh3 (ORCPT ); Tue, 28 Jun 2022 12:37:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51904 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237868AbiF1QfA (ORCPT ); Tue, 28 Jun 2022 12:35:00 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5946BC19 for ; Tue, 28 Jun 2022 09:32:07 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id g26so26899393ejb.5 for ; Tue, 28 Jun 2022 09:32:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CuGBayQTKpzveprbko8jS+HWnVHJqO4mYljV1kMBj3A=; b=MtMhCSr/fei8ro6GAgFIQN2QNwArvDPswgWVA92bCcINrM3QNrv44Ufz8bcR70Hin9 d2E1yfK//6FaPHzSk22x2w3jobVMv2wtKrVGn9OdNqZB7u+60qS6jfZ1dys6YiZ5AtBI lBRrfoVADTV1DCY2tdEqS/CwfhNpHWI8tMDXg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CuGBayQTKpzveprbko8jS+HWnVHJqO4mYljV1kMBj3A=; b=Iqav+WvYDkB3g2zFiyKsQPlFSj7T2ezNlgfM+MoM8fR7gK/a60XgGfhvGQ5J1B2sFf 5vqrjp2Z25CkKrNYJTny+wpxXxHVq5qqcgKA+GOYijJuq1AId6g/2BVyuqloeRHuxka3 LBvbo+pPPpNfjUazY6wa4pKJbmqEYg1Nb5LJDNNztUjfN32dKcaAEgu4QoUxcVF/a304 oDiWxeNipreIDfnKiiAH64wq3y2mEtJeuDwnlXC0F0pA1VAOKOXabphk06h4EQUi+9hr PMAayhj7Taw9X/5UZQwqjRDX0vzR6Ry9QkIpysZMP8+0RxfhItyi5vZNIJfqY5bDyeAn xVTA== X-Gm-Message-State: AJIora8bVlYeXCQaWPKwXgjlwndXDjYgm+JK/w1Om7AmpUTsYeLJcE5E INWmO16MQODkupBVCo29cj/jF+SuvfksTw== X-Google-Smtp-Source: AGRyM1s72MC8BHF9j5Ha54DSEtE2W5iZoGmr+77mt8A8eJMZUG9x4pM48O9yrt22/OipX0MUoLoO3g== X-Received: by 2002:a17:906:c152:b0:726:3226:2e61 with SMTP id dp18-20020a170906c15200b0072632262e61mr18889180ejc.122.1656433926614; Tue, 28 Jun 2022 09:32:06 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id b20-20020a0564021f1400b0042e15364d14sm9916952edb.8.2022.06.28.09.32.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jun 2022 09:32:06 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: michael@amarulasolutions.com, Amarula patchwork , Oliver Hartkopp , Dario Binacchi , "David S. Miller" , Eric Dumazet , Greg Kroah-Hartman , Jakub Kicinski , Jiri Slaby , Marc Kleine-Budde , Paolo Abeni , Sebastian Andrzej Siewior , Vincent Mailhol , Wolfgang Grandegger , linux-can@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v5 12/12] can: slcan: extend the protocol with CAN state info Date: Tue, 28 Jun 2022 18:31:36 +0200 Message-Id: <20220628163137.413025-13-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> References: <20220628163137.413025-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" It extends the protocol to receive the adapter CAN state changes (warning, busoff, etc.) and forward them to the netdev upper levels. Signed-off-by: Dario Binacchi --- (no changes since v4) Changes in v4: - Add description of slc_bump_state() function. - Remove check for the 's' character at the beggining of the function. It was already checked by the caller function. - Protect decoding against the case the frame len is longer than the received data (add SLC_STATE_FRAME_LEN macro). - Set cf to NULL in case of alloc_can_err_skb() failure. - Some small changes to make the decoding more readable. - Use the character 'b' instead of 'f' for bus-off state. Changes in v3: - Drop the patch "can: slcan: simplify the device de-allocation". - Add the patch "can: netlink: dump bitrate 0 if can_priv::bittiming.bitrat= e is -1U". Changes in v2: - Continue error handling even if no skb can be allocated. drivers/net/can/slcan/slcan-core.c | 74 +++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slc= an-core.c index 4269b2267be2..54d29a410ad5 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -78,7 +78,11 @@ MODULE_PARM_DESC(maxdev, "Maximum number of slcan interf= aces"); #define SLC_CMD_LEN 1 #define SLC_SFF_ID_LEN 3 #define SLC_EFF_ID_LEN 8 - +#define SLC_STATE_LEN 1 +#define SLC_STATE_BE_RXCNT_LEN 3 +#define SLC_STATE_BE_TXCNT_LEN 3 +#define SLC_STATE_FRAME_LEN (1 + SLC_CMD_LEN + SLC_STATE_BE_RXCNT_LE= N + \ + SLC_STATE_BE_TXCNT_LEN) struct slcan { struct can_priv can; int magic; @@ -254,6 +258,72 @@ static void slc_bump_frame(struct slcan *sl) dev_kfree_skb(skb); } =20 +/* A change state frame must contain state info and receive and transmit + * error counters. + * + * Examples: + * + * sb256256 : state bus-off: rx counter 256, tx counter 256 + * sa057033 : state active, rx counter 57, tx counter 33 + */ +static void slc_bump_state(struct slcan *sl) +{ + struct net_device *dev =3D sl->dev; + struct sk_buff *skb; + struct can_frame *cf; + char *cmd =3D sl->rbuff; + u32 rxerr, txerr; + enum can_state state, rx_state, tx_state; + + switch (cmd[1]) { + case 'a': + state =3D CAN_STATE_ERROR_ACTIVE; + break; + case 'w': + state =3D CAN_STATE_ERROR_WARNING; + break; + case 'p': + state =3D CAN_STATE_ERROR_PASSIVE; + break; + case 'b': + state =3D CAN_STATE_BUS_OFF; + break; + default: + return; + } + + if (state =3D=3D sl->can.state || sl->rcount < SLC_STATE_FRAME_LEN) + return; + + cmd +=3D SLC_STATE_BE_RXCNT_LEN + SLC_CMD_LEN + 1; + cmd[SLC_STATE_BE_TXCNT_LEN] =3D 0; + if (kstrtou32(cmd, 10, &txerr)) + return; + + *cmd =3D 0; + cmd -=3D SLC_STATE_BE_RXCNT_LEN; + if (kstrtou32(cmd, 10, &rxerr)) + return; + + skb =3D alloc_can_err_skb(dev, &cf); + if (skb) { + cf->data[6] =3D txerr; + cf->data[7] =3D rxerr; + } else { + cf =3D NULL; + } + + tx_state =3D txerr >=3D rxerr ? state : 0; + rx_state =3D txerr <=3D rxerr ? state : 0; + can_change_state(dev, cf, tx_state, rx_state); + + if (state =3D=3D CAN_STATE_BUS_OFF) + can_bus_off(dev); + + if (skb) + netif_rx(skb); +} + /* An error frame can contain more than one type of error. * * Examples: @@ -387,6 +457,8 @@ static void slc_bump(struct slcan *sl) return slc_bump_frame(sl); case 'e': return slc_bump_err(sl); + case 's': + return slc_bump_state(sl); default: return; } --=20 2.32.0