From nobody Tue Apr 28 01:11:08 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 F016CC43334 for ; Wed, 8 Jun 2022 16:55:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235933AbiFHQzc (ORCPT ); Wed, 8 Jun 2022 12:55:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243534AbiFHQxU (ORCPT ); Wed, 8 Jun 2022 12:53:20 -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 3C2D337F05D for ; Wed, 8 Jun 2022 09:51:27 -0700 (PDT) Received: by mail-ej1-x62d.google.com with SMTP id kq6so29583849ejb.11 for ; Wed, 08 Jun 2022 09:51:27 -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=f/RB/AADgG9sZPdH/FFOUOjP3DRCdWgEZkMCyF3Wrbhsdq21HPvBLY80JKH5KLQWx+ 6+x2um026CENOu0ajA+XBYLhJLbisgS+YtX6v51vRcba0N7G26i7I9TbyL5yV4qN/TeT depNj9mKPpvaNLgnb9VQwzA2JB3OKiiEM8vU0= 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=PtLCUIxHa4C6yBebJSajgWPTHgqEqf5lur4+gyDua+unIik6pL0OBr6dUi5gaJj5HS UHN/ZAvPxOa03lzktaEAYP7mkmxMplf21fM5BpoLAPet7Q9DcNGKElWGQF535vbv23yA 5lmyeR0Zt+4u4XvSYjxhh1ZoEE8V1dxpYEh6EXuqiTnENP8yHvOCLAZkn602lWAI0MnK HLAlHNFMGgDaVYCf63YoODGbV0//dntBDGPiD7pCoZzLJbZI0ONwtZjMGoaFdNZ0P7ZL DlbKjDwzEJkCRgYuquBzBjCUit0JZw8CK/ayb611/zvZf0ASOHf1g4J1bP8dGygVFE8W wRQg== X-Gm-Message-State: AOAM533N8JOLodToUXEvKnjxkMjkpuaWAe838B18/2y4afV1qLmS1isp VlQMNXHFdGaIW3KJ+bZLF2x9osVGn2U4fA== X-Google-Smtp-Source: ABdhPJxs+KHSiIY16R/4F/cW1agfC4LfsUa/2oSVYolckwJQXrxz201mbFu3QGgcEOO+6n5FaSJTKA== X-Received: by 2002:a17:907:3d8a:b0:70e:6b1:b004 with SMTP id he10-20020a1709073d8a00b0070e06b1b004mr27556484ejc.61.1654707085258; Wed, 08 Jun 2022 09:51:25 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:24 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 01/13] can: slcan: use the BIT() helper Date: Wed, 8 Jun 2022 18:51:04 +0200 Message-Id: <20220608165116.1575390-2-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 Tue Apr 28 01:11:08 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 355ABCCA47B for ; Wed, 8 Jun 2022 16:55:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242268AbiFHQzr (ORCPT ); Wed, 8 Jun 2022 12:55:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33752 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243655AbiFHQxZ (ORCPT ); Wed, 8 Jun 2022 12:53:25 -0400 Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 424D03C6D90 for ; Wed, 8 Jun 2022 09:51:28 -0700 (PDT) Received: by mail-ed1-x52c.google.com with SMTP id fd25so27931356edb.3 for ; Wed, 08 Jun 2022 09:51:28 -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=ofPeQ4nOnRiV0JF8uxnd4QmlVQSgooaO19HSVx/tZLG3+veOye/ByzTR/HcFO9Q/tI e/be3ODSpfzJ87HtXgq5GRVhFan097ZAlwFdRS38X7Ij3FvV8uj3ZLaqM62YLR1zPpU9 10bWbhJ5bH5BhdZB8EBUacC5a9qvqBgTQYHeQ= 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=wfk6dw74Ga7djSEcurE4fsIv0Sg+RUbKHYApean2wtV7mVGmuy1b7bpl40sYYpQ2FF n9IQVRgbmeXvDXyYoIo/xPYwN7ZAUnG4nXTt/1tQUqrwG0fiz+4FsucvvGOnwrjauglf 63ZGOaL+qqTB1L36qWTpMOCX+2ddKEEIKeE/iraTaPGPHFTzT7Y42VD1WeAK1oBEXe6O 6usXgRR32kTyE0HZuO4youKmFCtDCNq1SwrPtSkV8yVdcdqalwGO5Po9nV3zv82gmjXX w7/Tx8VUdVZF7Qh2n1hhtEwLliDMwfOV6M/uJq96fkGMzieqihCzmLF3rUcKO/O0a6Lh Emxg== X-Gm-Message-State: AOAM532RLvY6dZbwTv83Ng4J0hUK64MQFFoDzqUtG8Cs96KZUTULroOf jvobpV3+V6/H441mB0qw8bL/FHGlNj0Sxg== X-Google-Smtp-Source: ABdhPJwjP2b4f/NRRms4orlourt1Bsz3XkRyDBXTZTW4to64rEm6B+tMWyZgCtr9Yp4mnYOW5uSRiA== X-Received: by 2002:a05:6402:1cb5:b0:42d:ddda:7459 with SMTP id cz21-20020a0564021cb500b0042dddda7459mr41312011edb.16.1654707086472; Wed, 08 Jun 2022 09:51:26 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:26 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 02/13] can: slcan: use netdev helpers to print out messages Date: Wed, 8 Jun 2022 18:51:05 +0200 Message-Id: <20220608165116.1575390-3-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 Tue Apr 28 01:11:08 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 A7E21C43334 for ; Wed, 8 Jun 2022 16:56:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243198AbiFHQ4A (ORCPT ); Wed, 8 Jun 2022 12:56:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243679AbiFHQx1 (ORCPT ); Wed, 8 Jun 2022 12:53:27 -0400 Received: from mail-ej1-x634.google.com (mail-ej1-x634.google.com [IPv6:2a00:1450:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AAA0B3C6DB0 for ; Wed, 8 Jun 2022 09:51:29 -0700 (PDT) Received: by mail-ej1-x634.google.com with SMTP id o7so9330222eja.1 for ; Wed, 08 Jun 2022 09:51: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=I5VTRziMnkGl4xU+BjwtCkmgql6hb+Z7QIN+Rj1ilOY=; b=GL2/5+TAp2pCEdHfQjTf3qp6TnHIgDKiGZCM9GYA8KeppoGt7LaELuW2XfFj50OSGV +ms6qSWcZgedGSWQOsfL6aFERIBd8eSMCSsty6uIUF0t/ZMQtv+mfrB5sRhpMXrq+Se7 t375ns2CbOCjT/WTu6fER4CUTRIteo+P7v+KA= 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=I5VTRziMnkGl4xU+BjwtCkmgql6hb+Z7QIN+Rj1ilOY=; b=5+ioPmwOOkK0VcTKi9omVJdUgvkAw6agz8xwVYo4eEnpKoymKWHopUfg19uCA8r8KH Udgv8id+i/PbYOQy1fPMmjcT9B5vCXX//AErotI3bMH8iXSDkhvbDc6m4M+iglrlvjaP hkhQfQCTxZHDE6+8NMY+0wjHldFlv8y7jXtJ6ii0nKqrmriicwSQ0Fte9dzS+j5PXG/t hm/nUxv+EqJyoU/5J+1+/0bFixif10AB7XU2LCjr1SHcPgkbrsw0xgCZsS1FgB+Y71Dh VrNuRhWsQNm4XSm/pYZkcUXUyAcl4fB5q8o5MbqTLR46XLkajpahEyfSeCcNaJYNcFZK m5gA== X-Gm-Message-State: AOAM530tZeyiSAobyRablW3SsyGqU9n2tWOHrEmpRAbigK3TM374xkvF U+LeemXHXQZ8sTD5wWiR0PoId9H7w2100w== X-Google-Smtp-Source: ABdhPJyZoLJRVZQupGQWtXsIWh3QTK3xk6DJUkI7csBK98pda16YzwvC04ry6ZVCTx7GS1yDfbvy3g== X-Received: by 2002:a17:906:9f1c:b0:711:cdda:a01f with SMTP id fy28-20020a1709069f1c00b00711cddaa01fmr16104703ejc.372.1654707087890; Wed, 08 Jun 2022 09:51:27 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:27 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 03/13] can: slcan: use the alloc_can_skb() helper Date: Wed, 8 Jun 2022 18:51:06 +0200 Message-Id: <20220608165116.1575390-4-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 --- 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 | 69 +++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index 6162a9c21672..5d87e25e2285 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,79 @@ 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: + dev_kfree_skb(skb); } =20 /* parse tty input stream */ --=20 2.32.0 From nobody Tue Apr 28 01:11:08 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 E8DD4C43334 for ; Wed, 8 Jun 2022 16:56:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233052AbiFHQ4R (ORCPT ); Wed, 8 Jun 2022 12:56:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34436 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245569AbiFHQxg (ORCPT ); Wed, 8 Jun 2022 12:53:36 -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 29C5A3C7806 for ; Wed, 8 Jun 2022 09:51:30 -0700 (PDT) Received: by mail-ej1-x62d.google.com with SMTP id h23so31556924ejj.12 for ; Wed, 08 Jun 2022 09:51: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=c+3GCirlvyznBBrVu6oPXaX+KYWRV3Xhpy2k9G10VWo=; b=e2zOSGbKtXKLpefQa3BSp5hjNi+a3w6DM+GlBwxiTF4HJl02rGoJ4LTgVbT1qTE7Qn Ht8jCRGfUTwAWeYi3srFxn82SNxYVVMvCP2RKSBbbb7bXshDhajw8AiGAvJdcThhw98p mt42c6/ANt/1EYmXUWMQrcd3hff3Y7wHDx5Cc= 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=c+3GCirlvyznBBrVu6oPXaX+KYWRV3Xhpy2k9G10VWo=; b=1/UEdvVDl+YwTszhwLx6GwkWyaj56dlZs55YtbZURisQD0Gj4aoHuhdaDk/shCk9ll +VHYkP9IbKTcs3EMl15PcJuS1N/tjSwQfHD8HbiIcGQDEHDochJy9o1FcSikhg2mCIl/ JqGJayPCPFGZ1EuNhWU63tv1fdgggTBEPJX3bCRmbobkGLYmqaOYpN0xJ/2fFzUJ7am+ 3jfGf3LeX3MNsG6oe5NgjGnhNnv2RTJJvkXPlcWrQIG5MXopsZHyBOPoRHLIdekTn/aQ GiRSgasb1rUtZl9Ssl+jyiVGDeCFyyVmVUiZwh9qCWfmFs1MDLpnsp0KFSCURIMxIf7S A8FQ== X-Gm-Message-State: AOAM533I8ceznSWxqwgnh8JiDqiRds62WR3bkJX8lkflGamh+Uinm/X5 WajI0ch4Mr6sY7BBaYywP0V9YjhxOu1sFg== X-Google-Smtp-Source: ABdhPJxB2NOAkywI8QbxaLZM9M6JWilbjddIiYskmxN5RO7qX1o5TFGCkYi9XM+bzpilNd5AmET4YA== X-Received: by 2002:a17:907:1b25:b0:6da:8206:fc56 with SMTP id mp37-20020a1709071b2500b006da8206fc56mr32386194ejc.81.1654707089355; Wed, 08 Jun 2022 09:51:29 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:28 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 04/13] can: slcan: use CAN network device driver API Date: Wed, 8 Jun 2022 18:51:07 +0200 Message-Id: <20220608165116.1575390-5-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 (-1) before it is called. [1] 39549eef3587f ("can: CAN Network device driver and Netlink interface") Signed-off-by: Dario Binacchi --- 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 | 112 ++++++++++++++++++++-------------------- 2 files changed, 77 insertions(+), 75 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 5d87e25e2285..929cb55e08af 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 * @@ -373,7 +374,7 @@ static netdev_tx_t slc_xmit(struct sk_buff *skb, struct= net_device *dev) spin_unlock(&sl->lock); =20 out: - kfree_skb(skb); + can_put_echo_skb(skb, dev, 0, 0); return NETDEV_TX_OK; } =20 @@ -393,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); @@ -404,21 +407,36 @@ 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 0, causing open_candev() to fail. + * So let's set to a fake value. + */ + sl->can.bittiming.bitrate =3D -1; + 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 - slcan_devs[i] =3D NULL; + free_candev(sl->dev); + if (slcan_devs) + slcan_devs[i] =3D NULL; } =20 static int slcan_change_mtu(struct net_device *dev, int new_mtu) @@ -433,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. ******************************************/ @@ -513,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]; @@ -530,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; @@ -572,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(); @@ -604,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 */ @@ -620,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; @@ -657,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) @@ -767,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 Tue Apr 28 01:11:08 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 139FEC43334 for ; Wed, 8 Jun 2022 16:56:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243534AbiFHQ4g (ORCPT ); Wed, 8 Jun 2022 12:56:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245377AbiFHQxg (ORCPT ); Wed, 8 Jun 2022 12:53:36 -0400 Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 92CE332342B for ; Wed, 8 Jun 2022 09:51:32 -0700 (PDT) Received: by mail-ej1-x633.google.com with SMTP id u12so42644352eja.8 for ; Wed, 08 Jun 2022 09:51:32 -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=nVyQpX+Yrz3qKt1Nh+jQPIqCDb+sgmjzafkew5xQQck=; b=EbNQlONLEw3flg+v8r7QTPOnPPJjDqYyauDId67C9ZpX0EjOci3Gm9WoX8m07QgFXN w6dKi3IzR1XQuYf2Ngd5xSWYWTQKGu2/d+F0HuUqgO73NK+niApZ3J3YwyiUwkZaYgNP Ayn5woO2pi3yTGTM3n7s+1CmRBu6gpNEm1oWE= 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=nVyQpX+Yrz3qKt1Nh+jQPIqCDb+sgmjzafkew5xQQck=; b=wcF6HZr78cwzlsoYjmpr3BI41s4oi7y2PkKgg/hErBow4eQVYN26fVo11C5ooxeYQq olfpGWyDjkomF9qZtJ+Ubi40J29xBJ5Zk85i4NTPU0x5SNK6QTfT0Ugu38BjG8tK+mG3 7lWQGx6CdvTNjWtz2YfxGjajInJL5J4epgGifTc7clEyZJs+Y12TVmeKnKAqFXZfYzGI QMGnpF5+NhmASZiZKKqggHoGVqj6BzSVih6L1eJiI/5I6LloZiqSf8M3nEpKOAj2oAra 7Q1Q2ArSHgtfwS26YxoCkhaSfH/s6p9PRwNx4s7A2uAv0zI+R9tM8xPSCk2WpDh8Sdgz hkxg== X-Gm-Message-State: AOAM531MTGMBn2CNpvAJc0kJk5QjPUIoD4QC/0aG16fxOw9DF9NK984F zjHrnlQRIy7VB48LXZcFHqT0x0cEgIQflQ== X-Google-Smtp-Source: ABdhPJzS0WTgsEmT6o/MldkA0xQDsGfnejkAvMiaThfxPCarALGnI2DSJejx4G0f9/wXxWeUN+pCuw== X-Received: by 2002:a17:907:6e13:b0:711:c722:4fc with SMTP id sd19-20020a1709076e1300b00711c72204fcmr18014645ejc.253.1654707090839; Wed, 08 Jun 2022 09:51:30 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:30 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 05/13] can: slcan: simplify the device de-allocation Date: Wed, 8 Jun 2022 18:51:08 +0200 Message-Id: <20220608165116.1575390-6-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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" Since slcan_devs array contains the addresses of the created devices, I think it is more natural to use its address to remove it from the list. It is not necessary to store the index of the array that points to the device in the driver's private data. Signed-off-by: Dario Binacchi --- (no changes since v1) drivers/net/can/slcan.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index 929cb55e08af..cf05c30b8da5 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -432,11 +432,17 @@ static int slc_open(struct net_device *dev) =20 static void slc_dealloc(struct slcan *sl) { - int i =3D sl->dev->base_addr; + unsigned int i; =20 - free_candev(sl->dev); - if (slcan_devs) - slcan_devs[i] =3D NULL; + for (i =3D 0; i < maxdev; i++) { + if (sl->dev =3D=3D slcan_devs[i]) { + free_candev(sl->dev); + slcan_devs[i] =3D NULL; + return; + } + } + + pr_err("slcan: can't free %s resources\n", sl->dev->name); } =20 static int slcan_change_mtu(struct net_device *dev, int new_mtu) @@ -533,7 +539,6 @@ static struct slcan *slc_alloc(void) =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); =20 /* Initialize channel control data */ --=20 2.32.0 From nobody Tue Apr 28 01:11:08 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 970A4CCA482 for ; Wed, 8 Jun 2022 17:01:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242404AbiFHQ7R (ORCPT ); Wed, 8 Jun 2022 12:59:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57666 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236479AbiFHQzc (ORCPT ); Wed, 8 Jun 2022 12:55:32 -0400 Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CF9A73CAF43 for ; Wed, 8 Jun 2022 09:51:44 -0700 (PDT) Received: by mail-wr1-x431.google.com with SMTP id d14so20141877wra.10 for ; Wed, 08 Jun 2022 09:51: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=MTTwzX/aiA/HRTscWPld7sV0y4pSfK/bYOnDrdN63VI=; b=OSyMEpVoLY2gHejWkMk9SCxrTmHFgHLaZDyBg2ojZQlfFiKUmG6vVhu2pb0EN62d4y XWAcHLQr18NR0yAc/EVfYRCOzh73nKlABEU9WIfbyoXNMp3D40jTiZd/7DcR3gXz3idz 8rByJjSs0u69EFn5sr/zghXbyFofFSOrFApak= 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=MTTwzX/aiA/HRTscWPld7sV0y4pSfK/bYOnDrdN63VI=; b=q8sxHQCKOTzcgrJErGjtr01/HMy61DW7ogHxXobkDN8hcZAcxd9+lJ5mC8kRnRDAvW ysQWsZFVqNW0UWbUJX7oDwBNRvYSblK1gqWfjCNkgUdC/Heyvik6SZUbkhCGX6fyq9Ul opnmUuxTryEF4HUlJRk4lqKh9ZMXiMOALlvux72K0GftXE3lOdIzPwp2oUMi8lbyx8i3 gAkV5kRNb+zRBGAjo7IGoFu1kxtqffM3+pyXha0oMimopdW+Uo9jk6Opsx39PHQQSbhS vDeBYU7iqo0xjuI66G3AgCmaJNFUcjHx+QcSDYZxzy6NIHiwjtRvd2qazgVuQFZ27zAd qQOQ== X-Gm-Message-State: AOAM530pYtuOgUjC3Kbi9tFFXB0oWFzlsctYejNHGHYMWF46RPEFk2Lj sUwVRwiveKh4bhhfPRUEdBt3V7zs4RhZKQ== X-Google-Smtp-Source: ABdhPJxAr2mTP/F9B9ZnVXAL2CsYGfXcBzPWLp0fZ9ItNEGjJoTX1tLRSK3GZKYtPy3itMuQYlLMOQ== X-Received: by 2002:a05:6402:f97:b0:431:8d1d:397d with SMTP id eh23-20020a0564020f9700b004318d1d397dmr11248102edb.423.1654707092277; Wed, 08 Jun 2022 09:51:32 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:31 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 06/13] can: slcan: allow to send commands to the adapter Date: Wed, 8 Jun 2022 18:51:09 +0200 Message-Id: <20220608165116.1575390-7-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 some commands (e. g. setting the bitrate) will be sent before calling the open_candev(), the netif_running() will return false and so a new flag bit (i. e. SLF_XCMD) for serial transmission has to be added. Signed-off-by: Dario Binacchi --- (no changes since v1) 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 cf05c30b8da5..cab0a2a8c84c 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 =3D=3D NULL) { + 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) { @@ -546,6 +589,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 Tue Apr 28 01:11:08 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 D080CC43334 for ; Wed, 8 Jun 2022 16:57:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237394AbiFHQ5E (ORCPT ); Wed, 8 Jun 2022 12:57:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59664 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343805AbiFHQyM (ORCPT ); Wed, 8 Jun 2022 12:54:12 -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 6B90A3C8810 for ; Wed, 8 Jun 2022 09:51:35 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id u12so42644593eja.8 for ; Wed, 08 Jun 2022 09:51: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=5gQL+PBjKdFRbWGXqCko2W4l6SNrb34I5/OqJqVjfAw=; b=orhsCgXR3r1BmMaiVIHHK+Nuz2maix0QOkibEQtFMj7JRULKjQ2TmKUbzmsWiWQ11f 21BhhDfSH1+my9PR/jKLCnwF+cYEaKsxeuQPyHr8hcVFqIz/2yMZeN3Es3ervF0Xs9D8 1LHxBlsXpg62lhf6PtkztHFd5z6kFnbmH94kM= 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=5gQL+PBjKdFRbWGXqCko2W4l6SNrb34I5/OqJqVjfAw=; b=HI3xPEtlB4mv2cZ62u3ijdfQIRu5MBnCwpEV6VQsAFbNMEbWVIdOiAkRTRh/23u2si jRAvDi4xohakD5nQEcPEkHdLDJuAhjoyCcyg4KbTsdunxCbXMesWqhSe9DFGiFftyCz/ 62RNT4u1N1uAtfMfm6Q/5pFV0OG5C3xJv8MgAXfRf60KR/DVxv63hfpIMICu4SwwQP9N z4KZIvm4or8BEUFhf6PvtqCJfeMPPTXEaTLvt7QwdPmecSvqBYtSLXuo6c0zPnIIuoby rUoYHiWGx60d4+XWO3hgW+463wfMBSlRY78hV9OlJ3PraknytqWYQs9QluBJkZsOcgPj actQ== X-Gm-Message-State: AOAM530H+WSoueHunZJU5F4oeXlLSeL1yrfn9nq+5YuyDQ07mYXSbSMf pzniwQZX+113QqGxcXl/Yp0AnwAdXmxf2g== X-Google-Smtp-Source: ABdhPJwEWkc0e/hCdf76+OadjT0fOD3L09SgEiHoy/8QJAHWuIGxJFru4kyaMAMn9hO2kGZVrovw3Q== X-Received: by 2002:a17:907:6d9b:b0:711:d26b:f5ba with SMTP id sb27-20020a1709076d9b00b00711d26bf5bamr13923231ejc.135.1654707093625; Wed, 08 Jun 2022 09:51:33 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:33 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 07/13] can: slcan: set bitrate by CAN device driver API Date: Wed, 8 Jun 2022 18:51:10 +0200 Message-Id: <20220608165116.1575390-8-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 v2: - Use the CAN framework support for setting fixed bit rates. drivers/net/can/slcan.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index cab0a2a8c84c..8561bcee81ba 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -439,6 +439,7 @@ static int slc_close(struct net_device *dev) netif_stop_queue(dev); close_candev(dev); sl->can.state =3D CAN_STATE_STOPPED; + sl->can.bittiming.bitrate =3D 0; sl->rcount =3D 0; sl->xleft =3D 0; spin_unlock_bh(&sl->lock); @@ -460,7 +461,9 @@ static int slc_open(struct net_device *dev) * can.bittiming.bitrate is 0, causing open_candev() to fail. * So let's set to a fake value. */ - sl->can.bittiming.bitrate =3D -1; + if (sl->can.bittiming.bitrate =3D=3D 0) + sl->can.bittiming.bitrate =3D -1UL; + err =3D open_candev(dev); if (err) { netdev_err(dev, "failed to open can device\n"); @@ -558,6 +561,37 @@ static void slc_sync(void) } } =20 +static const u32 slcan_bitrate_const[] =3D { + 10000, 20000, 50000, 100000, 125000, + 250000, 500000, 800000, 1000000 +}; + +static int slc_do_set_bittiming(struct net_device *dev) +{ + struct slcan *sl =3D netdev_priv(dev); + unsigned char cmd[SLC_MTU]; + int s, err; + + 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) { + sl->can.bittiming.bitrate =3D 0; + netdev_err(sl->dev, + "failed to send bitrate command 'C\\rS%d\\r'\n", s); + } + + return err; +} + /* Find a free SLCAN channel, and link in this `tty' line. */ static struct slcan *slc_alloc(void) { @@ -587,6 +621,9 @@ 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); + sl->can.do_set_bittiming =3D slc_do_set_bittiming; spin_lock_init(&sl->lock); INIT_WORK(&sl->tx_work, slcan_transmit); init_waitqueue_head(&sl->xcmd_wait); --=20 2.32.0 From nobody Tue Apr 28 01:11:08 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 9146AC433EF for ; Wed, 8 Jun 2022 16:57:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244944AbiFHQ5e (ORCPT ); Wed, 8 Jun 2022 12:57:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52990 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343830AbiFHQyY (ORCPT ); Wed, 8 Jun 2022 12:54:24 -0400 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3A9353C8834 for ; Wed, 8 Jun 2022 09:51:37 -0700 (PDT) Received: by mail-ej1-x62c.google.com with SMTP id n10so42664783ejk.5 for ; Wed, 08 Jun 2022 09:51: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=IHEZAJdjR8GiF2rcZjyRDsrMR8WF0LYSErHxMnZ6s20=; b=MZKbWtENK8RJ8mhEjef9zX1yTSZS9BgXM713QnAIg2L5afXoz8jXYkkuBHY/6qGvq2 Xe/QJ8v++KscQsY1vp5+FFXyjT5O8ONPWQHFmXAXNoZICKoiCOJhQrjDn+sSrZffVhnr COMtwcIGOuyD8SJi3niX6Nfuh82Vs1jbao2PA= 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=IHEZAJdjR8GiF2rcZjyRDsrMR8WF0LYSErHxMnZ6s20=; b=kngJyN6hufuoajw9cbYfyBaLz3H2XM4RSASftAtIeRXy3f+bPTBf5uuuU8WJraudYQ cfmutCZuAVYnpRvStdPYcBQocc2945j+prPaGKGJWlEk1mV+a/lBnnDkSuvXV/XIlX/K EzzS/6UAUS34OZ29M3iTzp2+cHHgNqsOBT9ZT9xDUqLA1sWOxKEidBa6NlX8eDGVCInd 8XCyT4TyJRQk3r4ewSsb+WqrPyfAlpRIaAAHtZ5W66RLJejiET4ZMo1ILUN78vo/qSFg a6VJERTyIyuRYTp34IFdrLUL61JrvzjoM1ObUScCP3EH4Xlos0fcFP6Ewik1s880XGQN AT4Q== X-Gm-Message-State: AOAM533Wm7e1rg6f1NCROVATtEfovXVKn1rEen1ExUl25GXtA+6QtU+E vRj/20jlWefCx00r0VSUR5TgWZX22ba9kQ== X-Google-Smtp-Source: ABdhPJz1QODapFEAg4YigkTF2RHGdIx+/6uauzW1WsQ+9FsAAZvY0lK1/PlsjrZhGolAZLbjarVnZA== X-Received: by 2002:a17:906:4a83:b0:70b:156f:9098 with SMTP id x3-20020a1709064a8300b0070b156f9098mr31951137eju.109.1654707095099; Wed, 08 Jun 2022 09:51:35 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:34 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 08/13] can: slcan: send the open command to the adapter Date: Wed, 8 Jun 2022 18:51:11 +0200 Message-Id: <20220608165116.1575390-9-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 command ("O\r") to the adapter. Signed-off-by: Dario Binacchi --- Changes in v2: - Improve the commit message. drivers/net/can/slcan.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index 8561bcee81ba..ec682715ce99 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -461,8 +461,15 @@ static int slc_open(struct net_device *dev) * can.bittiming.bitrate is 0, causing open_candev() to fail. * So let's set to a fake value. */ - if (sl->can.bittiming.bitrate =3D=3D 0) + if (sl->can.bittiming.bitrate =3D=3D 0) { sl->can.bittiming.bitrate =3D -1UL; + } else { + err =3D slcan_transmit_cmd(sl, "O\r"); + if (err) { + netdev_err(dev, "failed to send open command 'O\\r'\n"); + return err; + } + } =20 err =3D open_candev(dev); if (err) { --=20 2.32.0 From nobody Tue Apr 28 01:11:08 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 B84B8C433EF for ; Wed, 8 Jun 2022 16:57:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243672AbiFHQ5S (ORCPT ); Wed, 8 Jun 2022 12:57:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59916 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343822AbiFHQyT (ORCPT ); Wed, 8 Jun 2022 12:54:19 -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 322283C9648 for ; Wed, 8 Jun 2022 09:51:38 -0700 (PDT) Received: by mail-ej1-x62a.google.com with SMTP id bg6so22808795ejb.0 for ; Wed, 08 Jun 2022 09:51: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=1tzR7s1CZMuNvxGPj/IhGD4aqO3yLek4cvJPPvYidL8=; b=nl01/m/isEBb2/WNGaE5pGOzAFS/toNd1+LgNOGNZiEkDpKuikHikABfUn9ZLLFPOL Gx97Wxzgo2utKjJ6X8raUKMZ81A7Is2ahwrwoU25iEOTU31KJ44ByK4r7BZwibqIoGKI Kv6camtC5L5z3yyn4hEue1FIxVwz9NM2rl6nA= 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=1tzR7s1CZMuNvxGPj/IhGD4aqO3yLek4cvJPPvYidL8=; b=2aT8mXy3X/Pi4O5bkMu31LB/dEesK4kwEmtlq+mbIFCzvpocDITwixLGFbHiFrj0zo YIzftkv1WErA6QZwLlOYCNv6sm5RsWbwuG8tgm0tCa5loIiaXkh6nXClulBCkHwtgPB7 lCZho7Msg7Dh3cUukmo8N8H6zY6i4ZX2r42aahDXI1aYstp+q7EqPRZdUtQNavpKzNfp qQA8mBmdVjsl62FxUtd2I2WPsmeLNP/bXCy3YKVbA6/8mJfjFbqRVYkSLUyLaigYmIsg HDRJFQIWXC3lydgc7VFVbrJDYG4MM8fxtqrIkM5TO3ubc6ejKOmw+52AR5ig/G1Inqzp PsEQ== X-Gm-Message-State: AOAM5308DEfdvTrqwXi4MLdZEjJgqoNzPFmkDMYMELc5ei1f5E7GLQdH FB3L4Uob2FxM7lHXYDNxNd8IJ68H4Q/6dg== X-Google-Smtp-Source: ABdhPJwgGIMnqb4IUHl6OCZQla++DSzXUH1qm1ke5AQ6QOBqDujMj5QQe1ZbiuE8xIZN1AD0+RMe9Q== X-Received: by 2002:a17:906:79ca:b0:705:111f:12dc with SMTP id m10-20020a17090679ca00b00705111f12dcmr32096475ejo.602.1654707096469; Wed, 08 Jun 2022 09:51:36 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:36 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 09/13] can: slcan: send the close command to the adapter Date: Wed, 8 Jun 2022 18:51:12 +0200 Message-Id: <20220608165116.1575390-10-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 close command ("C\r") to the adapter. Signed-off-by: Dario Binacchi --- Changes in v2: - Improve the commit message. drivers/net/can/slcan.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index ec682715ce99..0722e7820564 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -430,9 +430,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 -1) { + 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); } --=20 2.32.0 From nobody Tue Apr 28 01:11:08 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 B00B8C433EF for ; Wed, 8 Jun 2022 16:58:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231755AbiFHQ5v (ORCPT ); Wed, 8 Jun 2022 12:57:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60424 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343850AbiFHQyb (ORCPT ); Wed, 8 Jun 2022 12:54:31 -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 AA8973C9661 for ; Wed, 8 Jun 2022 09:51:38 -0700 (PDT) Received: by mail-ej1-x62d.google.com with SMTP id gl15so28761732ejb.4 for ; Wed, 08 Jun 2022 09:51: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=s1QllzXGCUo8JTE+hOZVBSnNVj6x3XTlbwu5/oui3J8=; b=PkT9jSzS4isGLZXYztnm7o7vihYHoIHdoouV2PmxWHm+ZtkDJguI+SyPGHfY3BlHN0 eex2ws/05yiq4L48cvhQazSfP/UoXuMi+2wqtFGQAWA+C6Cu9CdGYqxHroe3UBakK7Mv wEzRRXTa/ZhUMrwFiKB0Sd8oI4DuYGM3i1pF8= 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=XhYJPgO+s2UrOF8YvgoOyN5mHiSQDE7mlqhfH760xLx1Xo/xeE+iyYl5EeIbAVGoBR PUmORT6n7HxK63rWqX77e6T7Yhy1V81JDdboPMAECNlW4FRHOPSdt0xd4c+aXl2wdmsK qm44HeTRHawj0ZLLLd2ilR4jYN3Dc3va8jaT5gUQDhLx4lE68uubPZKT2iUBoW2RIHJB 14p93pMNAqNRutz7OyUPeYjixBUCxAOmP9R3UCUPaWF17GwrBa3GizGWjcUVvzov0dLu jN7VHTFXHleyTs8dwapYgMXyQqcpYpGQ5YSbDa81LqY1dN6G3yYxsOccP1BMSTCjjHk0 gsPw== X-Gm-Message-State: AOAM531oazsjoZHdaXGtEA2Eq84RGdrgRY+XpLR5554mmQTOu1MY8Q1x ArQ/sY3OuJZi6JdTKhNM4QfQGzG6LmfWHg== X-Google-Smtp-Source: ABdhPJxJpwfsJG+G/dyZuB393+fk2YFC3C7TABhD1j9gPxpe7Tw5UdZQXyQmWlzzVjmkyyTU0PEJbw== X-Received: by 2002:a17:907:9482:b0:6f5:171d:f7f5 with SMTP id dm2-20020a170907948200b006f5171df7f5mr33336054ejc.68.1654707098018; Wed, 08 Jun 2022 09:51:38 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:37 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 10/13] can: slcan: move driver into separate sub directory Date: Wed, 8 Jun 2022 18:51:13 +0200 Message-Id: <20220608165116.1575390-11-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 Tue Apr 28 01:11:08 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 C4C88CCA485 for ; Wed, 8 Jun 2022 17:01:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231616AbiFHQ6T (ORCPT ); Wed, 8 Jun 2022 12:58:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229983AbiFHQyy (ORCPT ); Wed, 8 Jun 2022 12:54:54 -0400 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7996E1A8820 for ; Wed, 8 Jun 2022 09:51:40 -0700 (PDT) Received: by mail-ej1-x629.google.com with SMTP id s12so35408186ejx.3 for ; Wed, 08 Jun 2022 09:51: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=D347QqdRdrFNo4P9Em/ayvZ1ba87O9qPIqi6sUOPlwQ=; b=G6FtfoTZaFiA0jXaBcblD832125eqRUc5l3XTcBdsf085JsJ26DMjuxuWXmW5PwA72 b35wcybrpyifY/9G8E80xzDz8b58Xz4d7v12Zos/iYvShYsN3Lvkj36l8PJoM0hOfH/Z MGSirWJK1sQEe1FBxA2OTLwbm8aLSUDcLDZrg= 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=D347QqdRdrFNo4P9Em/ayvZ1ba87O9qPIqi6sUOPlwQ=; b=b6CUQjverArkr9gtnQ5Kmgrw5NO2CQWZDWcAmAe4uPoq8tFsIWM052HXBQT5O7qUjW 13TePpX7LuyQnKtgFvPJnmS9K5ZiphEsIBLZzxM0KBqawIfciRWU5tJL6e0QhzF8Q+rB 3z29vJoXWTnGEKYADz7d58qGLIAy/fNaAnvmFuE4G4Om2ehcpIc8ZOEvMpz91FhS553e MRHmLkpvlRpH2fti/N1eqKrgb5CcwwFM0u/f8P2NPZuWf6M8xYy5YuddYEpwMKb6RJrQ LE6RAY5ihHPt8pxYkGB+243Pcpcl6SeTrJ59PPBCWxIHFr7tPMe0J0qBf+tPvFjMGVvw 5gDQ== X-Gm-Message-State: AOAM533QziUKUL6kBigVdzZsZnPsyZCZEHdOD+xoRBRlX5+eoBfYdCG9 duADOwK5Bx8NOIybcjpBMubq4/s5Nnh1lA== X-Google-Smtp-Source: ABdhPJw/5gQRquX+8U8LHLxsUqC3Jb6chyypr2FpdQFo+oZulkTugELneeLct3wkrvpM6/Qc7BZOCg== X-Received: by 2002:a17:907:2cc7:b0:709:f1e1:7b17 with SMTP id hg7-20020a1709072cc700b00709f1e17b17mr31394072ejc.498.1654707099497; Wed, 08 Jun 2022 09:51:39 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:39 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 11/13] can: slcan: add ethtool support to reset adapter errors Date: Wed, 8 Jun 2022 18:51:14 +0200 Message-Id: <20220608165116.1575390-12-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 0722e7820564..038ce7c25d42 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 */ }; @@ -105,6 +109,28 @@ struct slcan { static struct net_device **slcan_devs; static DEFINE_SPINLOCK(slcan_lock); =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 * ************************************************************************/ @@ -475,6 +501,15 @@ static int slc_open(struct net_device *dev) if (sl->can.bittiming.bitrate =3D=3D 0) { sl->can.bittiming.bitrate =3D -1UL; } else { + if (test_bit(CF_ERR_RST, &sl->cmd_flags)) { + err =3D slcan_transmit_cmd(sl, "F\r"); + if (err) { + netdev_err(sl->dev, + "failed to send error command 'F\\r'\n"); + return err; + } + } + err =3D slcan_transmit_cmd(sl, "O\r"); if (err) { netdev_err(dev, "failed to send open command 'O\\r'\n"); @@ -634,6 +669,7 @@ static struct slcan *slc_alloc(void) =20 snprintf(dev->name, sizeof(dev->name), "slcan%d", i); dev->netdev_ops =3D &slc_netdev_ops; + 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 Tue Apr 28 01:11:08 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 600B3CCA47B for ; Wed, 8 Jun 2022 17:01:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236867AbiFHQ6l (ORCPT ); Wed, 8 Jun 2022 12:58:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50958 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231215AbiFHQy7 (ORCPT ); Wed, 8 Jun 2022 12:54: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 C7F023CA2D3 for ; Wed, 8 Jun 2022 09:51:41 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id q1so42639238ejz.9 for ; Wed, 08 Jun 2022 09:51: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=r56OkRGS+scgiov9hraSbcrm1/dO+C0ISd2zgdsHS2U=; b=fOek92UJg6uOVWRQgugew1DRpDVhrJOSH+LH2ckhtwtc/to81tI0cdC7SvceF5zOAG UplhYkxagPGq+KtCwSUVP4SWg32V69zususPIYoIqO23c8TzOEkhXgvhtucRqj1CaJFV Gl8IogK6CQTY1UC+0NOnims7v3I8M5QhswyWU= 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=r56OkRGS+scgiov9hraSbcrm1/dO+C0ISd2zgdsHS2U=; b=pn5JgOcEjFBe0N5Ba2AgAI3iAkR+JJw89AfPp/HSS0zQsSx62QRfjLmvCHbl218TDD BaNkIki5CEDBPvjQepX5cXtap1nnO2iuqjHd8k/QUCpXhbhsy58pt+4u0CtGcghQyuCR VMfDOoLiaRjijLLu5sR1Xq9A4vbXYGa6HIpGdEziCp9E0wha8ZpN5vMzZpy8nPpYwtle OXkd5i5xWCU2XR/g5zZMZoKNdgflzhQM6tZ3HtNxfkgG51dDNi4962QcDdNK1/3zcktU P7WZvJjUAUgnlRIV9HByys3r8uwscrsQ6pG8iXuay4F+mWhoThyE0dhIVmRjr9OL4HW1 dCLw== X-Gm-Message-State: AOAM531u9pg3R45puXrzu2bCS3BE03V71DSFvtxONODjJJTZiOAssnnk 2Vgd3Ef6nTUoZuVsIQwLXW8mGEvxUjHSdQ== X-Google-Smtp-Source: ABdhPJxOrh7uNoFiv4QEt1dF+0ccXnsitPoDYnkvFbaj2vUGNEGN/OHPrC1gI/BAF8mijHB7GrisQw== X-Received: by 2002:a17:906:51c5:b0:711:f4ee:6574 with SMTP id v5-20020a17090651c500b00711f4ee6574mr3748661ejk.509.1654707100906; Wed, 08 Jun 2022 09:51:40 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:40 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 12/13] can: slcan: extend the protocol with error info Date: Wed, 8 Jun 2022 18:51:15 +0200 Message-Id: <20220608165116.1575390-13-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 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 | 130 ++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slc= an-core.c index 038ce7c25d42..aba42e284274 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -170,8 +170,118 @@ int slcan_enable_err_rst_on_open(struct net_device *n= dev, bool on) * STANDARD SLCAN DECAPSULATION * ************************************************************************/ =20 +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; + int i, len; + + if (*cmd !=3D 'e') + return; + + cmd +=3D SLC_CMD_LEN; + /* get len from sanitized ASCII value */ + len =3D *cmd++; + if (len >=3D '0' && len < '9') + len -=3D '0'; + else + return; + + skb =3D alloc_can_err_skb(dev, &cf); + + if (skb) + cf->can_id |=3D CAN_ERR_PROT | CAN_ERR_BUSERROR; + + 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"); + dev->stats.rx_over_errors++; + dev->stats.rx_errors++; + 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"); + dev->stats.tx_errors++; + 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 (tx_errors) + dev->stats.tx_errors++; + + if (skb) + netif_rx(skb); +} + /* 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; @@ -249,6 +359,24 @@ static void slc_bump(struct slcan *sl) dev_kfree_skb(skb); } =20 +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 Tue Apr 28 01:11:08 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 86F76CCA483 for ; Wed, 8 Jun 2022 17:01:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241239AbiFHQ7C (ORCPT ); Wed, 8 Jun 2022 12:59:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57550 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234542AbiFHQz3 (ORCPT ); Wed, 8 Jun 2022 12:55:29 -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 27A8F232BF4 for ; Wed, 8 Jun 2022 09:51:43 -0700 (PDT) Received: by mail-ej1-x62f.google.com with SMTP id y19so42627538ejq.6 for ; Wed, 08 Jun 2022 09:51:43 -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=bwNtXSOCw0XDwGW95Gh6yPmxJxefcbSMC7JInqj3ttk=; b=Rxct20WgTboHnwH6PqKtW7++pYKV4s6f8/GuPXFckXJWce5FIdhfIQjxWy+stF5YKO Z0lSYKKnLg4ig8ICRK5K7peNL8aWc5ImcFuv4Gjqo7Iv9OG5FXoD7Oi4HhTY6l2eab/k L/YnwAZQTcZMu6AHxHXzQqODUsZ8QOjIewHYo= 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=bwNtXSOCw0XDwGW95Gh6yPmxJxefcbSMC7JInqj3ttk=; b=ybY0AB4l1dqR8xh/Dt0U+QwMrhK5kdz65s8FGDso9bmRbcnkoIe3cD4IJPXUS1v5cK f5VKNCzTXeh3rMnU+wSGczubVy2FfbjrBSNPW2KAdg3ND6voP1Sn2NYeDh4bHiCmSUK5 FSKRsOVA9nZp6v8wAjA5puisDyZvK/PLsZyQLdX17+2w2QJzHJ9lln19d3ezaeqCWjrn HKxQEkCpmfJxrqLtpNcZJBe6nkvmN/22VRfPhbD7bFuiDEwY08PxwWRr8lOkFJSSJqog oxpNwlrT6sbXHhc/1UyWLT18awg0rIULiAMmmZDM4j7WVT/FYHQEqZEr6zn4Sol266ic 45XA== X-Gm-Message-State: AOAM530QC+8mHMRO7kxWD+btvMx7HmYLN2u5penWym62JyFNt7SWkQq3 bfv8xUR+WDK1qHG1SePj2zG16dba2mkX3w== X-Google-Smtp-Source: ABdhPJyT8syNmYvc4wjS5820GR82CNi66QN6ll0aO6zF7OVFq0JN2AvnN9uxOFrQ28Ic89FJ0rsAGA== X-Received: by 2002:a17:907:90c4:b0:710:456a:6981 with SMTP id gk4-20020a17090790c400b00710456a6981mr23907500ejb.484.1654707102377; Wed, 08 Jun 2022 09:51:42 -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 c22-20020a17090654d600b0070587f81bcfsm9569071ejp.19.2022.06.08.09.51.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jun 2022 09:51:41 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Amarula patchwork , 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 v2 13/13] can: slcan: extend the protocol with CAN state info Date: Wed, 8 Jun 2022 18:51:16 +0200 Message-Id: <20220608165116.1575390-14-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220608165116.1575390-1-dario.binacchi@amarulasolutions.com> References: <20220608165116.1575390-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 v2: - Continue error handling even if no skb can be allocated. drivers/net/can/slcan/slcan-core.c | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slc= an-core.c index aba42e284274..22a261f2477c 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -78,6 +78,9 @@ MODULE_PARM_DESC(maxdev, "Maximum number of slcan interfa= ces"); #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 =20 struct slcan { struct can_priv can; @@ -170,6 +173,67 @@ int slcan_enable_err_rst_on_open(struct net_device *nd= ev, bool on) * STANDARD SLCAN DECAPSULATION * ************************************************************************/ =20 +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; + + if (*cmd !=3D 's') + return; + + cmd +=3D SLC_CMD_LEN; + switch (*cmd) { + 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 'f': + state =3D CAN_STATE_BUS_OFF; + break; + default: + return; + } + + if (state =3D=3D sl->can.state) + return; + + cmd +=3D SLC_STATE_BE_RXCNT_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; + } + + tx_state =3D txerr >=3D rxerr ? state : 0; + rx_state =3D txerr <=3D rxerr ? state : 0; + can_change_state(dev, skb ? cf : NULL, tx_state, rx_state); + + if (state =3D=3D CAN_STATE_BUS_OFF) + can_bus_off(dev); + + if (skb) + netif_rx(skb); +} + static void slc_bump_err(struct slcan *sl) { struct net_device *dev =3D sl->dev; @@ -372,6 +436,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