From nobody Mon Apr 27 10:05:31 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 A84D8CCA480 for ; Tue, 14 Jun 2022 12:29:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234634AbiFNM3K (ORCPT ); Tue, 14 Jun 2022 08:29:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58758 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243267AbiFNM2h (ORCPT ); Tue, 14 Jun 2022 08:28:37 -0400 Received: from mail-ej1-x62a.google.com (mail-ej1-x62a.google.com [IPv6:2a00:1450:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5AF0322B1A for ; Tue, 14 Jun 2022 05:28:29 -0700 (PDT) Received: by mail-ej1-x62a.google.com with SMTP id gl15so16860837ejb.4 for ; Tue, 14 Jun 2022 05:28:29 -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=c010hK3+ahAHRLBDp/YkH7ue/xhQVFHLKxwyUX7pT4nvITXGSPVRQWGtNe4e8BJlHw ShM/jdfA3dXz598QFtXn7PbLhrOdrk2wdQNOIpY9KXOhlDj4q93DryPdDogflmTdjgcy m2S75F2hujDTdCnjubcb0QdWgXbpIRBVFb6Cc= 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=WE9PiHF7NNCzRJpxGfK1C4f7ER5QIKFvY/zpTKvWyolEj0qFHYHyX1LMqPM/EhoUHD dPicA68JPtnNZHtrBIFoiYQjlMrISx7Angf3AqGSulWYqUgOkA7x2tO4tjDTAATEHphE o88R2X7gr7KUOK0X3ELrXtd+uqZAydc2aPKTa07r6sojT8VglfO/xK1124NDeSMoP+lo o62QagXusxv44GXPenD7bwBvZ1bHmgamzkX27c0g4YRNumShgpTF5S3h0WI+YUulPZ+9 EU3y8A0zURMcXjJTCi5sobGeiZDukV0A2iAHbcLG6+5hrJ+Oq7kG+0H+T71t9OtsphPQ HJfw== X-Gm-Message-State: AOAM530BbxfsWRYyV9ymv4+/sOKQ0g+hOMSdSWU1xfvsNQq79f3fSwO2 TAWUpgs799FFapBcuPWjtRHFTPCKIuSUtA== X-Google-Smtp-Source: ABdhPJyxoOzRWB1wnGAo214wBBP18qanXSZdV8l0hMrYApMdvZlin/orDEjVUZjgRmC43b03fTLNHg== X-Received: by 2002:a17:907:1c07:b0:711:c966:f02e with SMTP id nc7-20020a1709071c0700b00711c966f02emr4194683ejc.221.1655209707627; Tue, 14 Jun 2022 05:28:27 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:27 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 01/12] can: slcan: use the BIT() helper Date: Tue, 14 Jun 2022 14:28:10 +0200 Message-Id: <20220614122821.3646071-2-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 Mon Apr 27 10:05:31 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 04863CCA480 for ; Tue, 14 Jun 2022 12:31:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236047AbiFNM35 (ORCPT ); Tue, 14 Jun 2022 08:29:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58774 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243401AbiFNM2i (ORCPT ); Tue, 14 Jun 2022 08:28:38 -0400 Received: from mail-ed1-x530.google.com (mail-ed1-x530.google.com [IPv6:2a00:1450:4864:20::530]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C883A3C4A1 for ; Tue, 14 Jun 2022 05:28:30 -0700 (PDT) Received: by mail-ed1-x530.google.com with SMTP id 25so11369440edw.8 for ; Tue, 14 Jun 2022 05:28:30 -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=BiAOyZ/XYfnLieytaiCrXuW21pBo0n2NoPpY7GM5pLKNkdZ6mhfHALcly1gSTnfEe4 qI+fC3AE55af0rHC7Zuc7avKy26528oBP6WLx0X1+3NsDEO9wLlCCMNx981e7baQ+V2m AgWjAXSvqm6SDChs9xqMjy0WTm6kXzNF1eumE= 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=cv7o5veWqpFpGfpghYkKYLUrvIW+PmIdHbIUHiiekBNfpiigKahixpt9qxXrr0WMu2 qgR3cFG30vWiwgWL2PW3sp4yoOd2ouxtQqvRcpZz4h7U2mHp3IXqU+VK+OVKrlPKTpX/ Bkv46bRsQa+ta+MiZhbQOWPdEj4WOOWDArUop7ArqchI4eKSdCUzYk/roU8zYG9/hLYh 0zqFzH1jIEWD72dVZvCTgAnGtEsop4RI/y+Y7NO6m3zbwo5TDXcFFcQiEM2amUy2jeSS ggm+bD0Y44bPO7locmtzoB4csspcbB3R3UsnDx6c1v/STE3kJptteiCqwRnCNfwwNGRc tFNA== X-Gm-Message-State: AOAM533CIMTJHERpEA8AXtWBb0jwtZaR5epw7XiwVTll3vx/4ScxAwS/ k2zyy+TQNBL8gBSPlLQ1BUlbYK690w8CKg== X-Google-Smtp-Source: ABdhPJxY51V2+bRO3eItM3jvTt+mAR9YkliMJJzg3a6IzB/EvnBrA4haRAhoDvTT+4auNuo5PaeGfQ== X-Received: by 2002:a05:6402:100c:b0:42d:f407:b050 with SMTP id c12-20020a056402100c00b0042df407b050mr5652088edu.39.1655209708968; Tue, 14 Jun 2022 05:28:28 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:28 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 02/12] can: slcan: use netdev helpers to print out messages Date: Tue, 14 Jun 2022 14:28:11 +0200 Message-Id: <20220614122821.3646071-3-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 Mon Apr 27 10:05:31 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 7BA96C433EF for ; Tue, 14 Jun 2022 12:30:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242650AbiFNMaE (ORCPT ); Tue, 14 Jun 2022 08:30:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243448AbiFNM2i (ORCPT ); Tue, 14 Jun 2022 08:28:38 -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 038B2237DB for ; Tue, 14 Jun 2022 05:28:32 -0700 (PDT) Received: by mail-ed1-x52f.google.com with SMTP id x5so11418108edi.2 for ; Tue, 14 Jun 2022 05:28:31 -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=lA8lImzum331TJJHsTJ65jBz5jhNkv8tw3ezsIi7YzTZ4BvI2AM5rhz+aOgWERPVL8 wf6IQ/SDWFEwFigWABBsxv8ZrP5t/FPjJTo8+VozEf4XwRH8ChY7HINrKepv9pKwMjZZ 2tLBe1IhgdW/M3DVZLQDHV1wWR1udzWI6jLZQ= 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=f0rKEROsHAJ2KTFAVITduNnwowGGfSsSxZQdvZW0uML4Amd3CVeWS/UxNYWJiEBlwo 8+Q9VMgkjeTzqTwpVF/m2q4t+ki530lPn2TuVRk8E4GkbcCrutfF5PsClb7kpXTy78zr y+6BWWeZ4w0sv9ZqrbqaCPBfuFQ8C0vVGtxsGtACDZvVoDFPq5SG5NmFQbO6VYkbm5CI b0pM+hLdkxwQCBF2Dt+enHUHLIEZXsF66N7TB9IyOJoAMNu8UImBGkZq6HHpBP/i7Zyt oYejHAxjyL2h3AmG1jkz5Fc4NnNCLHLTKUP1WCN+Lb1R5oEbBID4SA4e4758cMZ5JB0A +vCw== X-Gm-Message-State: AOAM532ARf0Pg5rFlvjwcFHj3BLtnr8zuvQLDApqegGTP1Lx8Gdnu8Fc islJ18TbG6kdAVSWC80NKzWlk/mbqC4lsA== X-Google-Smtp-Source: ABdhPJzeyedu9lwFUMlzw7cFqiFQ1EtabbKKn8JVnjLWT5ry77nZm6Z0w1GeuZFjBuJt99IQJ8zumw== X-Received: by 2002:a05:6402:21a:b0:431:5c52:82bb with SMTP id t26-20020a056402021a00b004315c5282bbmr5877909edv.70.1655209710212; Tue, 14 Jun 2022 05:28:30 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:29 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 03/12] can: slcan: use the alloc_can_skb() helper Date: Tue, 14 Jun 2022 14:28:12 +0200 Message-Id: <20220614122821.3646071-4-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 Mon Apr 27 10:05:31 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 9B0BDCCA481 for ; Tue, 14 Jun 2022 12:29:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244862AbiFNM3N (ORCPT ); Tue, 14 Jun 2022 08:29:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243537AbiFNM2i (ORCPT ); Tue, 14 Jun 2022 08:28:38 -0400 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 49CF03E0F2 for ; Tue, 14 Jun 2022 05:28:33 -0700 (PDT) Received: by mail-ed1-x52d.google.com with SMTP id eo8so3179777edb.0 for ; Tue, 14 Jun 2022 05:28:33 -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=R7Zmyhhovdg7jA4sbkGr15373g5fZzWXwn/PzaeWDng=; b=oyKoCpe6Et5htQdcXy2fQRoA8XFpBI1ozrSVuX76KcLzpkF/2kSXD3WdLcabVUE7eK wz/QavsFVQPt0Z6e7JZF7qAuYQsULzhq2vmd84BnIiU215InQijl3uzf/UOXyQu3Sxbd qq2G8TGd56pKCf91XdJ6RN+wQRHq+oxfb60To= 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=R7Zmyhhovdg7jA4sbkGr15373g5fZzWXwn/PzaeWDng=; b=PUFZwpLgv/3HClv1jTZygfecQj70203b/UaRzYo0+jgL735C/qSZlhSa5KmfOFtZSn PJ+RxXo5xRa0v/WfebwfQLy6slnXmLtu9w7QjWrEJsEyjUUs80vw8wPph+296Dp6v2YV 6JgPi2fwuJQXcuvEdReTbb3/Huc9fORayC6gg2pA0zjwJPkDmpwjNQrZ/EOhquRvUO8c 7041sMhtAUqKFWKPZKbJlsYcw36DS3iJT/EVdYl52mSDHg8qVIeIMAJHOAf8DC9/7kAe mIVYNckShVfX1scZdvgZ5CMP+Y1BbOyyxWn4vEcRryhizwTb8CMotzCTsaZBd1j0BYXw JYcQ== X-Gm-Message-State: AJIora+/bdTOqWN5XaYPjZoVGQ7oLv6XYEwqbjRxVWnPdlSdGigxg4LB Hpoo25chUeDon1x0Up9aQ47GJ+iqqEK0Ag== X-Google-Smtp-Source: AGRyM1t+BFdrqvcBq6yfsdEGiIsmtskF8SSI6ppRrG78PCWZDjRV1IbsiR7l22djA+NvUN8mBOynNA== X-Received: by 2002:a05:6402:25c3:b0:434:dfbd:913e with SMTP id x3-20020a05640225c300b00434dfbd913emr5808884edb.27.1655209711597; Tue, 14 Jun 2022 05:28:31 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:31 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 04/12] can: netlink: dump bitrate 0 if can_priv::bittiming.bitrate is -1U Date: Tue, 14 Jun 2022 14:28:13 +0200 Message-Id: <20220614122821.3646071-5-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 --- 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 Mon Apr 27 10:05:31 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 AB02BCCA483 for ; Tue, 14 Jun 2022 12:29:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243594AbiFNM3Q (ORCPT ); Tue, 14 Jun 2022 08:29:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58702 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243705AbiFNM2j (ORCPT ); Tue, 14 Jun 2022 08:28:39 -0400 Received: from mail-ed1-x530.google.com (mail-ed1-x530.google.com [IPv6:2a00:1450:4864:20::530]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BAE7F41FB9 for ; Tue, 14 Jun 2022 05:28:34 -0700 (PDT) Received: by mail-ed1-x530.google.com with SMTP id 25so11369707edw.8 for ; Tue, 14 Jun 2022 05:28:34 -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=PCpFnoF0UtSjQMBZCRUGNujFKva7GVFTMHpSRjoSZYI=; b=p11hVCXeVpoI4jaYhEX2aVuViXksLsfnSUtDJVZ7CRjm8KtSuaDtexG36cDaB+SpVk xiEFrVK9L+OBageUvZuFE4GTlDySaY3MaD4RzB6dS5G/tQLHR/hDYmwYuIU3abi6egtz t2YusYMRTU9RbQiv1VpLYD/nFixv+2ABTvgLE= 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=PCpFnoF0UtSjQMBZCRUGNujFKva7GVFTMHpSRjoSZYI=; b=yJAXoXUjwLiSJsBntwMrkm3EtK3EywVDdlaCa/Lw6MkgATUvVHyApStozQAx5wdYAr ejbATXdGt4DA1eIVuyBxqSRhGlnY7WsjYPxiNqE8DJ+Hfpho3Y5pYUANJTmnBvf4yYj/ hs+d2UfhxAdD0bIy9fcB3Ex385Nm7fdAyIyPJPK5bbNViPfudRDrgXtIWRjSgwUgf3Ly ay+KzLBkkrfcZzbCxxM238yKAG+w+u/CJ4tbY9XWw8Z7f5QAoGKeTALasd0y/kUbkGB/ UjAQvihZKwDM+TnBGhsM6rOfK7vP8BhGD7IJF2kEcfNvfT8T+hsrSundQEb6tlKN/IA8 2uew== X-Gm-Message-State: AOAM533UH8kBOyWEuaKEZSkjWuvkrl4yLEygNy39BOBmiTpsAbEMc/d7 3mqkFus3ewZAEGJb2KhUNQJmHwdCxKT3KQ== X-Google-Smtp-Source: AGRyM1v5hqSfaAsHORrhfP+QmLrPijgXNMVZAVIwerpbvzkpUkK2MVtBWM7M6o3I1VatuxOFHpGv2A== X-Received: by 2002:a05:6402:254e:b0:431:35df:5e38 with SMTP id l14-20020a056402254e00b0043135df5e38mr5790736edb.385.1655209712935; Tue, 14 Jun 2022 05:28:32 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:32 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 05/12] can: slcan: use CAN network device driver API Date: Tue, 14 Jun 2022 14:28:14 +0200 Message-Id: <20220614122821.3646071-6-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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. The patch also changes the slcan_devs locking from rtnl to spin_lock. The change was tested with a kernel with the CONFIG_PROVE_LOCKING option enabled that did not show any errors. [1] commit 39549eef3587f ("can: CAN Network device driver and Netlink inter= face") Signed-off-by: Dario Binacchi Reported-by: kernel test robot --- 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 | 107 ++++++++++++++++++++-------------------- 2 files changed, 74 insertions(+), 73 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..c7ff11dd2278 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. */ @@ -100,6 +100,7 @@ struct slcan { }; =20 static struct net_device **slcan_devs; +static DEFINE_SPINLOCK(slcan_lock); =20 /************************************************************************ * SLCAN ENCAPSULATION FORMAT * @@ -394,6 +395,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 +408,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 +451,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 +513,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 +527,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; @@ -573,11 +567,7 @@ static int slcan_open(struct tty_struct *tty) if (tty->ops->write =3D=3D NULL) return -EOPNOTSUPP; =20 - /* RTnetlink lock is misused here to serialize concurrent - opens of slcan channels. There are better ways, but it is - the simplest one. - */ - rtnl_lock(); + spin_lock(&slcan_lock); =20 /* Collect hanged up channels. */ slc_sync(); @@ -605,13 +595,15 @@ static int slcan_open(struct tty_struct *tty) =20 set_bit(SLF_INUSE, &sl->flags); =20 - err =3D register_netdevice(sl->dev); - if (err) + err =3D register_candev(sl->dev); + if (err) { + pr_err("slcan: can't register candev\n"); goto err_free_chan; + } } =20 /* Done. We have linked the TTY line to a channel. */ - rtnl_unlock(); + spin_unlock(&slcan_lock); tty->receive_room =3D 65536; /* We don't flow control */ =20 /* TTY layer expects 0 on success */ @@ -621,14 +613,10 @@ static int slcan_open(struct tty_struct *tty) 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 */ - rtnl_unlock(); - free_netdev(sl->dev); - return err; + slc_dealloc(sl); =20 err_exit: - rtnl_unlock(); + spin_unlock(&slcan_lock); =20 /* Count references from TTY module */ return err; @@ -658,9 +646,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); + spin_lock(&slcan_lock); + slc_dealloc(sl); + spin_unlock(&slcan_lock); } =20 static void slcan_hangup(struct tty_struct *tty) @@ -768,18 +758,29 @@ 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"); - } + spin_lock(&slcan_lock); + dev =3D slcan_devs[i]; + if (dev) { + slcan_devs[i] =3D NULL; + spin_unlock(&slcan_lock); + 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); + } else { + spin_unlock(&slcan_lock); + } } =20 + spin_lock(&slcan_lock); kfree(slcan_devs); slcan_devs =3D NULL; + spin_unlock(&slcan_lock); =20 tty_unregister_ldisc(&slc_ldisc); } --=20 2.32.0 From nobody Mon Apr 27 10:05:31 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 AB40DCCA47E for ; Tue, 14 Jun 2022 12:31:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240978AbiFNM37 (ORCPT ); Tue, 14 Jun 2022 08:29:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58808 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243564AbiFNM2i (ORCPT ); Tue, 14 Jun 2022 08:28:38 -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 0153C25EB8 for ; Tue, 14 Jun 2022 05:28:36 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id o7so16868672eja.1 for ; Tue, 14 Jun 2022 05:28:35 -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=J7cAHYzHeqO4eieQ7T7B38pR/xwLeH3ndQgGNnjLG/E=; b=XSAUyZOWy5q2GWu3PLxoxE10G+1JlvepEjzvUqXBzxdLsTBIVBjyFLiLgEWy3AefaL qIDG5NM9+f+kytLuYuLs2tW2EsI8Oe9XkNrIgacbkXTyJzOsoPt9CE7Hzq9eDs+tiR0P oI4PRPXqGRbSBWCCi3Piai0AvOjG7IYUYM9KM= 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=J7cAHYzHeqO4eieQ7T7B38pR/xwLeH3ndQgGNnjLG/E=; b=WQ4dSrYRW8BMBX2I18oIdSbyygnop8wHdkUfO7lKXtgXKv1/l7wo+MKMypOOaerAbN 5XuY8fRT73eUevwvGHjBOfBGFrI3/4awpyPafKlnxTaw/1qn7mnOnm7dHipAn3jkDyDw o7gQvkLWo7WTNJHDDY/U9C3+VQdYjUquiKvFtsZ2W8XUWu2wLw7EJKuKX4sZbl7Xek+e xdQFiZ9XDVlQwy58Ahdwz413K7PJy7uNmIo+9OYphuVdoYzSnTYzmKBnMKSN4kqiD0+3 aFM6nlds1O+R5+IBBcowz8LV5MrIT1vEc66H/e4eYxyUJ35Hc5+NiN9q2lCn8Q3MtcHD BOtg== X-Gm-Message-State: AOAM533nV4lqW+UanuxW8ogGLeOMV5XNHfKRqV1E9lA29Iih6HfdN/6v cgUIwjzPiNQ0aKNQCk3sBga6Lw81NCqmHw== X-Google-Smtp-Source: ABdhPJw+07ZbLCl5Rx7GRphIBbK0PZ/uFC+9XZdj48PviEiLyXqTg7Fiq5dkX25nYqp4N27s+Jy1Ng== X-Received: by 2002:a17:906:7254:b0:6fe:5637:cbe6 with SMTP id n20-20020a170906725400b006fe5637cbe6mr4030190ejk.612.1655209714188; Tue, 14 Jun 2022 05:28:34 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:33 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 06/12] can: slcan: allow to send commands to the adapter Date: Tue, 14 Jun 2022 14:28:15 +0200 Message-Id: <20220614122821.3646071-7-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 --- 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 c7ff11dd2278..2afddaf62586 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; @@ -315,12 +318,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++; @@ -384,6 +397,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) { @@ -541,6 +584,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 Mon Apr 27 10:05:31 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 90A75C43334 for ; Tue, 14 Jun 2022 12:29:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245106AbiFNM3U (ORCPT ); Tue, 14 Jun 2022 08:29:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58898 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243679AbiFNM2j (ORCPT ); Tue, 14 Jun 2022 08:28:39 -0400 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 611F122BC5 for ; Tue, 14 Jun 2022 05:28:37 -0700 (PDT) Received: by mail-ed1-x532.google.com with SMTP id z7so11367057edm.13 for ; Tue, 14 Jun 2022 05:28:37 -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=AbbDKExzTnDRI7gbQZlSxolycHVQn9x05Wxw1nhoVAE=; b=Z/JIYpotFnOQ5zmb9SqzHVEaaztD0jqPK321kGQhBwM1TdUYaoJdCTkGfdGSfFJYZa frDZL3JcKyG8xgmE9rhb9P8I4rS5WPXeob6WzBVImIZ+gJyTtsCdBFxHgw6dJJo9fNTF qXCjtV+3R/aeZlAviiKig+1e0QRoK6hBQOzyE= 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=AbbDKExzTnDRI7gbQZlSxolycHVQn9x05Wxw1nhoVAE=; b=Msmye378VVT1pwbMuo2tXr+FFU+SsLJ7VjqGwH1I1d+p9R3EwEbQGsWEfUjcFcT0H1 COTer7j+bQcn4bEstcfckH0MXNsaVVP5wDw+NqeOb2ZSUiSJd2ehh8qcObfCP756asl0 VSZFOLIgLDwadfXl7Jb4NYC6hnKsZC2zLp22OVL5lwlH6mXJNuzQ8lIn24UjaI3uKSTU jgB64Ge3BSq+4WjQDqOU0bD8CVJcCqVSgPoGUh58VtP2gDV3HwFV//3j6dYsYkJGSD5a zLdPjrrworDmgHFzhON7+102BJLg5qf2LoPZbRT8aEZJWIYlrZ3n+bpLP0G4b8MNFUDp wt9A== X-Gm-Message-State: AOAM532rqurXDh+IYiolWl24+w9QIEODDT6MEidMumgSM1Kiyd+uFKpo ZGu5xNZoHETcU5MR96lvld0Mvii9cIIasA== X-Google-Smtp-Source: ABdhPJxWvv0UQGxo34L3K2DH3j2O0BoFNUhfPAMIIvrjLqObNb1fAAR6lM6qKR/AyYgwDmpo7SnhnQ== X-Received: by 2002:a05:6402:5193:b0:42e:2569:652c with SMTP id q19-20020a056402519300b0042e2569652cmr5733602edd.73.1655209715758; Tue, 14 Jun 2022 05:28:35 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:35 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 07/12] can: slcan: set bitrate by CAN device driver API Date: Tue, 14 Jun 2022 14:28:16 +0200 Message-Id: <20220614122821.3646071-8-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 --- 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 2afddaf62586..bd3cf53246c7 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -105,6 +105,11 @@ struct slcan { static struct net_device **slcan_devs; static DEFINE_SPINLOCK(slcan_lock); =20 +static const u32 slcan_bitrate_const[] =3D { + 10000, 20000, 50000, 100000, 125000, + 250000, 500000, 800000, 1000000 +}; + /************************************************************************ * SLCAN ENCAPSULATION FORMAT * ************************************************************************/ @@ -440,6 +445,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); @@ -451,7 +459,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; @@ -461,15 +470,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; } @@ -582,6 +615,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 Mon Apr 27 10:05:31 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 BD4A9C433EF for ; Tue, 14 Jun 2022 12:31:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243370AbiFNM3d (ORCPT ); Tue, 14 Jun 2022 08:29:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58584 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243885AbiFNM2k (ORCPT ); Tue, 14 Jun 2022 08:28:40 -0400 Received: from mail-ej1-x636.google.com (mail-ej1-x636.google.com [IPv6:2a00:1450:4864:20::636]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9ED4123148 for ; Tue, 14 Jun 2022 05:28:38 -0700 (PDT) Received: by mail-ej1-x636.google.com with SMTP id s12so16869140ejx.3 for ; Tue, 14 Jun 2022 05:28:38 -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=4Ikx/I3Y696YQQvJOfJvkR+b8+rk3mrxAawgjIDEUZ0=; b=fcozqSg6IKoKg9kPzNk4vgpeYJBfA6sRK6QUNqlE5NGhEPGgKBho033KaqjRspCizB SqJWccoggeLwKFyCo25eeFXDvXO1lQoxQGi/uhEkA0etpMW/1iDdWvYlaWea8rr6SYjB ASpWjX2+Vw4TGE6xjCOUb4HdAumC/gkcubYVs= 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=4Ikx/I3Y696YQQvJOfJvkR+b8+rk3mrxAawgjIDEUZ0=; b=XpMJRlIW1DwFAyvaq6nzGDKoPC6DDGzbou/bv/AY1omtvvw0hL4I1rfGGBmIdQf5mv NTA4K8BOL2n9TpGSkJW0mUDvVstjweGnJ9ogLvozOejTx7zs3orFMI+fgyICjUSFyZyD 241212BbQpLdOhOmuVuFFrnNMubgmjSICP1wIAYKzA1s1RedUVR+9vRaFEUP2d2Tk0W3 pKHsLe19X9462voINtWPGWJNuHMzQhQZfV49j1f7fSYVfS3DEfs/iWNX7MTLwelOknY2 EPcGCd7OWLq9MHXkC19gVW28ijPURVAv8GzfJ7oeXAdGmKBUK1tWcu7AOlHvhiy24DOA rshg== X-Gm-Message-State: AOAM5334TGOapXo+9ew2UpvzVP59LG4FjAHTTZ++u40h3AptY7JG5GDh cDAmgEZFZTLTbvEGonZwt+tGe90AqhUkXw== X-Google-Smtp-Source: AGRyM1uelCB/Qv4o1YlAs/EirN062K8SD18mCxEGk2AXw8TotOBNzQGInbqvWk0FaZZYTQfuTN2XLA== X-Received: by 2002:a17:906:73d4:b0:715:701c:ae96 with SMTP id n20-20020a17090673d400b00715701cae96mr4033479ejl.50.1655209716999; Tue, 14 Jun 2022 05:28:36 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:36 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 08/12] can: slcan: send the open/close commands to the adapter Date: Tue, 14 Jun 2022 14:28:17 +0200 Message-Id: <20220614122821.3646071-9-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 --- 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 bd3cf53246c7..b08e63f59b8e 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -436,9 +436,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); } @@ -497,14 +508,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 Mon Apr 27 10:05:31 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 1A0ACC43334 for ; Tue, 14 Jun 2022 12:31:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243044AbiFNM3b (ORCPT ); Tue, 14 Jun 2022 08:29:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243894AbiFNM2k (ORCPT ); Tue, 14 Jun 2022 08:28:40 -0400 Received: from mail-ej1-x62a.google.com (mail-ej1-x62a.google.com [IPv6:2a00:1450:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 43E5722B19 for ; Tue, 14 Jun 2022 05:28:39 -0700 (PDT) Received: by mail-ej1-x62a.google.com with SMTP id n10so16848118ejk.5 for ; Tue, 14 Jun 2022 05:28:39 -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=UeS+soY0woVEo83Ch9yUMn7BxrQO2Yv75mFq4TKV7j0bJ6wM6UVI092ssFHWDbXshb adHD3SMfqeSl+23u98d7JiRKp/d6bKikWqnFtSy/sff85hRQIIlNC/ZdZ8JOAN1Q2y60 P6buwedBe9Y+h4tvFvXNqJ9Rt1TsUGRy2pKDQ= 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=STo9oelKa54A6Q/0yAyib0XHuJDgixVTGAGTxD3Wa18Mmrrun0MZxLymz3Wl9Px6Uc wQoxo5knmr4uMPWWjtXR0hPJteaNkrHYXqaXmhxujaD0AdBf9ommtxWhQaoQ3vjmonlM UQsMGYNyBCQN5IXDtQTp7Z3EA3DQpLmewQMosDSBdaoSpjn7B7NQkS4svl7x2V4bnB85 HdNASXQQQv8wDWA+43TyHc2v5cOXhWEERFJwUH8LDRUzDvQu4ztm3iITSmTeElz4YjJ0 y9Y7nre4f2GdwvnrDpn8tSvR/ns1lo5Wr6HGooiSZkNugIPn0ocsRFmwauxENjsniGka B5AA== X-Gm-Message-State: AJIora80vdT++w+6HkD2YH9csmpu1dh2DNMMqyHVGrjCAiNi3BGh9reo I3SwdfG3g5W5E9/TWFtAeGIUdkCYFfVigQ== X-Google-Smtp-Source: ABdhPJw58NGvARca3elMl/B/Osx1t/HjZIS+sU69SssrBevkCMylAPhKq1550+OfLU7slAzFBfgsEQ== X-Received: by 2002:a17:906:74cc:b0:712:381:9c5a with SMTP id z12-20020a17090674cc00b0071203819c5amr4079949ejl.466.1655209718386; Tue, 14 Jun 2022 05:28:38 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:37 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 09/12] can: slcan: move driver into separate sub directory Date: Tue, 14 Jun 2022 14:28:18 +0200 Message-Id: <20220614122821.3646071-10-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 Mon Apr 27 10:05:31 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 A9E2EC433EF for ; Tue, 14 Jun 2022 12:29:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233658AbiFNM31 (ORCPT ); Tue, 14 Jun 2022 08:29:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243910AbiFNM2m (ORCPT ); Tue, 14 Jun 2022 08:28:42 -0400 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8850322BC8 for ; Tue, 14 Jun 2022 05:28:40 -0700 (PDT) Received: by mail-ed1-x52d.google.com with SMTP id eo8so3179777edb.0 for ; Tue, 14 Jun 2022 05:28:40 -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=XeYjdn9a4I+7ASW7s8Y7GsWrvaBO3fcqP0UZzQUkPdo=; b=JNHe/Rd3xGFz9IInBG2Hy0Pm2d3MVvP+X4Wukoxvlf641EooQhKNJ+NakxVF5Wom78 xZoN3RMIeNIooYOLeQOlAVAfBHjnR6ybL4+SfBzywFTS5ovnLDscFB9uHC23pcSfSpmC 6VGkJP6AkNy6mtmkdiNqzOqpyBXILnvebwLHY= 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=XeYjdn9a4I+7ASW7s8Y7GsWrvaBO3fcqP0UZzQUkPdo=; b=29ULUh10ynuKAwOAepDNXVPryI5Ny0MSisHu8cMI/3ksf69qLgIAbFVB/ydCcFH9/h QAmRHVGx0ebIMNU0pTh+lofrFBMCxTvluPGPVNatKDdImLeolQgcWyhtaHYBuzyiP1qq 8NJDlqJR5dO3cxgqQV0BrfkYAAbq6ce4CACvvidtXFmMR9x57MQaVEBNXJzfBIDwh2dl Tp2nSF+KojJN8bomRUgo2GSj5n8Mgjjvk+jOg1vb4aqwrqwNY3xPENy0TTOLqvJjPRhi qopoKi7N+U0s7b4Jhwg8+QeG/pX2Jv6jtjs29o0+xtvJu+nK32h3sECQ9m8Veo9fzEID aT8w== X-Gm-Message-State: AJIora/v+9ioi6Fy8VneqZcId/ibE0DcQRldFIYaKSLfvZ/Tw2/wAAw6 FXEHXKXkyfizRlIpS5VkyRS96Los0xbk4A== X-Google-Smtp-Source: ABdhPJyXdIRsXaLQQbGAQxvvELqbNihj8OdARByvUWbMOXO5BG5Gde1mUlfk/7MdRUD+koVfnaRC7w== X-Received: by 2002:a05:6402:2381:b0:42d:c8fe:d7fe with SMTP id j1-20020a056402238100b0042dc8fed7femr5766685eda.248.1655209719900; Tue, 14 Jun 2022 05:28:39 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:39 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 10/12] can: slcan: add ethtool support to reset adapter errors Date: Tue, 14 Jun 2022 14:28:19 +0200 Message-Id: <20220614122821.3646071-11-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 b08e63f59b8e..b4f29ab2ab72 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 */ }; @@ -110,6 +114,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 * ************************************************************************/ @@ -511,6 +537,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"); @@ -630,6 +665,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 Mon Apr 27 10:05:31 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 19D00CCA480 for ; Tue, 14 Jun 2022 12:31:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245349AbiFNM3g (ORCPT ); Tue, 14 Jun 2022 08:29:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58840 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243953AbiFNM2m (ORCPT ); Tue, 14 Jun 2022 08:28:42 -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 EBD7823BFF for ; Tue, 14 Jun 2022 05:28:41 -0700 (PDT) Received: by mail-ej1-x62f.google.com with SMTP id y19so16842608ejq.6 for ; Tue, 14 Jun 2022 05:28:41 -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=UY9xGJVeCuDiPWb4quL1k0Um37OolG5UZs6VBw/8AE4=; b=Ja543dMnsKVa7wE7vuA6UlJiYXkD9BavIblMmMDRdLnKW7bCJrM2IIjuTxTLUa4zc7 uVtITCAEoFl0NcEewAfa1WXTa70NjmLqNp/cbTZMmJprWmqvGUMBnmcIZIxbJAcdjIrj 0nAK46ia7vSr4W9Hz2eGoJjUjFYilr226hhXM= 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=UY9xGJVeCuDiPWb4quL1k0Um37OolG5UZs6VBw/8AE4=; b=WTIUqc/TxnCEnoyHhulZq8LcNN7Y6SLd3hp8JUg+uOy3aLK0iqmSDxeC41JG2XJ4ZQ om1q0c3QZMxjZYpULDJ8GazwBH7N8jkYkN4mn8lNVI0bLlM7lmkt2NdJwqhWq2M/KJY5 jUwOxB4DWsHcwxMxAVhGtbiSvhBBeDXcHUYqjnyEBfwGhYXfTEM/Ums9UC+y0O0i/Rir uvGWuH25HZnrOHzy8+9OVJf/aLNxHMuaXwppJXaUfQ/RtbW4xr4w8dqqx0pu6yggRvyh xkhtc4z78QYRBB5Eq/WHaJq3Efl+CkNje4dFuo4exqNiNhTSPux2ZL5I62JYCjMF2fA7 dmUg== X-Gm-Message-State: AOAM532Xp4WW4bL8XB67IP0bZmmYN09wgv7Chsxe9sD1WiqPbxF0y4+H 7ZAZNDe3YCKSkSJSSSE1Ix4ss70pvymm5g== X-Google-Smtp-Source: ABdhPJwKLJW79JRioqe4q4q0L5vsiJcGfGbq3CLDF09ftdlAWx5GCdDH3yrVc9h4vQzyecCO5U90UA== X-Received: by 2002:a17:906:4482:b0:70a:19e3:d18a with SMTP id y2-20020a170906448200b0070a19e3d18amr3911625ejo.510.1655209721319; Tue, 14 Jun 2022 05:28:41 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:40 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 11/12] can: slcan: extend the protocol with error info Date: Tue, 14 Jun 2022 14:28:20 +0200 Message-Id: <20220614122821.3646071-12-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 --- 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 b4f29ab2ab72..6c7c815eaf45 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -176,7 +176,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; @@ -255,6 +255,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 Mon Apr 27 10:05:31 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 7F592CCA47E for ; Tue, 14 Jun 2022 12:31:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243918AbiFNM3p (ORCPT ); Tue, 14 Jun 2022 08:29:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58802 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244154AbiFNM2p (ORCPT ); Tue, 14 Jun 2022 08:28:45 -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 7580123BDD for ; Tue, 14 Jun 2022 05:28:44 -0700 (PDT) Received: by mail-ed1-x533.google.com with SMTP id d14so11371166eda.12 for ; Tue, 14 Jun 2022 05:28:44 -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=jYzinqDMpP0ikE9sweLWXVziLbiFyEvA5RI0XjmyrwA=; b=Imdk9ZoAO7r/Y6UVbKyaxge6cRhAyLHgqo3qmRoll6SHjI2N9ANOIGfYQIMaeNGSth ra88H+SQDybPy9pjjuWUAgxHAjKq81PjEvGEpTd0lW60HFGyiaiObr2EsRI7CMA0w6v/ 227Sy3qPSjAcxRr+VJ96cM8sgfSp70zYhzT98= 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=jYzinqDMpP0ikE9sweLWXVziLbiFyEvA5RI0XjmyrwA=; b=l0WQNJ2icpj8pVNy7SoiGEQ6seukDEaGX0z+aJFU//P20vrTyf4uBFmANyBzyv/vr4 k/qqkxjsmSZ8AElMiW/o8J/1WrlhMDBUldm6+uM2u5OwRVAZAUE/G+ztdjaoAfj8V218 cg0yYGnAcZ++i2ydbwryJeUbL2WOC6K81vLZ9UC8m6Tly8kaa6pJ4fZkuLfJ3qA99iF4 71jnpdpq+iM2yWPVttpPsikBGbrtB68RRT/eEFtW/arUel1NxU4IUlSpMGiTSX2Su0ft TxVBLJxIeNtYm6cDjk+W7dZGzueZeG4wryfVpvHxv90QRdRwlhUwp+e9+ZeIvyXhud19 p7/A== X-Gm-Message-State: AJIora89gcHTNI9/Sj53RmmqqGXEoaTTzROA0MQBmQpxrm5MZ17wL6/X gV4SxAzJiyw6MCexl5MmDgTtqUaW3teLlw== X-Google-Smtp-Source: AGRyM1sdy+mQgJGKcTg6pr0d+IxotebryiK/R/VGzkIZerKFSEHj3SGvS1zYgLu1DOiAntsMFGuuxg== X-Received: by 2002:aa7:c604:0:b0:42d:cffb:f4dc with SMTP id h4-20020aa7c604000000b0042dcffbf4dcmr5869600edq.270.1655209722774; Tue, 14 Jun 2022 05:28:42 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.amarulasolutions.com (host-80-116-90-174.pool80116.interbusiness.it. [80.116.90.174]) by smtp.gmail.com with ESMTPSA id z22-20020a17090655d600b006f3ef214e2csm5087043ejp.146.2022.06.14.05.28.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jun 2022 05:28:42 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , Oliver Hartkopp , michael@amarulasolutions.com, 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 v4 12/12] can: slcan: extend the protocol with CAN state info Date: Tue, 14 Jun 2022 14:28:21 +0200 Message-Id: <20220614122821.3646071-13-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220614122821.3646071-1-dario.binacchi@amarulasolutions.com> References: <20220614122821.3646071-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 --- 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 6c7c815eaf45..e2d7645ff8d2 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; @@ -255,6 +259,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: @@ -388,6 +458,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