From nobody Wed Sep 17 10:51:36 2025 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 50F3CC4167B for ; Wed, 21 Dec 2022 15:27:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234748AbiLUP1N (ORCPT ); Wed, 21 Dec 2022 10:27:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57176 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234713AbiLUP0L (ORCPT ); Wed, 21 Dec 2022 10:26:11 -0500 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 34C1C248DD for ; Wed, 21 Dec 2022 07:25:55 -0800 (PST) Received: by mail-ed1-x529.google.com with SMTP id a16so22456746edb.9 for ; Wed, 21 Dec 2022 07:25:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=r4xNKyUsvaXfBc3iUbNwfQj7kGAAWBTHhrvCBFQZpUU=; b=52QxhYPs+F0QvgoHcjHqY2chLRIcLMl5FPqqhjr7XB5Ej9buMkkxpu8jvstKww3K54 XRlrPL2+JVczIXnXWD2+OK602DyWULP+nVUjTvdv6QmjZ5G4AJzZTtD/2OHeOQIBvPM7 w/IRTWH2VKuTb74lJpnZiIg5gJY8Om9ZEiMcshUulCrCV2TEqvfxAuM2yao+jIQ7FEEd 5J9VVmiAP3dC0mEzwPg+6JrgUiq7aOqV36VBIzeXm9IQSeNUE1vbmUjjzuKHznpUxL94 P2hqzIk+NhRZOW49LrKUrrI5OJm6ZciFHb7YJlkaafCpgpU+IH0eY+J27Ivkq3JF32L6 NQKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=r4xNKyUsvaXfBc3iUbNwfQj7kGAAWBTHhrvCBFQZpUU=; b=pgt8ZdVfQPQMk+Zlrm1sMr9QXHvdtEoAJbJ5pn5ui2zgv3grg29w+hnB0lYIYgdwgq W4GDB2e6DsXjKKChp4fBzB/ZopzsK0VxTICDa2OrpxuFbnljCvPk7aQafQ12mp9ht4rt 3/Zqjz0bgctWWPbAeeSSD1xxIFG5JsjWVnlTDYmToHvF5RwerlkCLQhjnxHBnYtoL8zF c/imS3OrPXSL5qYKJm0YPvZ1CDT0CuSXDjVbGj1gRz7nOuCQNx39QZy86jI/ni1SQ6Cx OCtMiDVAY4x+OERW0Gru010/S2I0JD1e+DsOZ69b1GAflu+Ji4h2Q//8IXQlBZ13JACz VYhw== X-Gm-Message-State: AFqh2koo4fof0L9mAz0onLoP4PqnfkkdDogWBit3Z68WA31CffM5HEWL GHzrhFEyWZCpmZhxEhYXhK74iA== X-Google-Smtp-Source: AMrXdXtOB58SBo1VGw1iWE3fwCZx07Rucqu1xCppcsfwv2RMOFP9Mcc6zIxb3bZU8SiaSNp18tExKg== X-Received: by 2002:aa7:dd13:0:b0:47b:a6e:6b69 with SMTP id i19-20020aa7dd13000000b0047b0a6e6b69mr2080871edv.2.1671636354717; Wed, 21 Dec 2022 07:25:54 -0800 (PST) Received: from blmsp.fritz.box ([2001:4091:a245:805c:8713:84e4:2a9e:cbe8]) by smtp.gmail.com with ESMTPSA id n19-20020aa7c793000000b0045cf4f72b04sm7105428eds.94.2022.12.21.07.25.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Dec 2022 07:25:54 -0800 (PST) From: Markus Schneider-Pargmann To: Marc Kleine-Budde , Chandrasekar Ramakrishnan , Wolfgang Grandegger Cc: Vincent MAILHOL , linux-can@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Markus Schneider-Pargmann Subject: [PATCH 15/18] can: m_can: Introduce a tx_fifo_in_flight counter Date: Wed, 21 Dec 2022 16:25:34 +0100 Message-Id: <20221221152537.751564-16-msp@baylibre.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221221152537.751564-1-msp@baylibre.com> References: <20221221152537.751564-1-msp@baylibre.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" Keep track of the number of transmits in flight. This patch prepares the driver to control the network interface queue based on this counter. By itself this counter be implemented with an atomic, but as we need to do other things in the critical sections later I am using a spinlock instead. Signed-off-by: Markus Schneider-Pargmann --- drivers/net/can/m_can/m_can.c | 27 ++++++++++++++++++++++++++- drivers/net/can/m_can/m_can.h | 4 ++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index 42cde31fc0a8..90c9ff474149 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c @@ -452,6 +452,10 @@ static void m_can_clean(struct net_device *net) =20 for (int i =3D 0; i !=3D cdev->can.echo_skb_max; ++i) can_free_echo_skb(cdev->net, i, NULL); + + spin_lock(&cdev->tx_handling_spinlock); + cdev->tx_fifo_in_flight =3D 0; + spin_unlock(&cdev->tx_handling_spinlock); } =20 /* For peripherals, pass skb to rx-offload, which will push skb from @@ -1022,6 +1026,7 @@ static int m_can_echo_tx_event(struct net_device *dev) int i =3D 0; int err =3D 0; unsigned int msg_mark; + int processed =3D 0; =20 struct m_can_classdev *cdev =3D netdev_priv(dev); =20 @@ -1051,12 +1056,17 @@ static int m_can_echo_tx_event(struct net_device *d= ev) =20 /* update stats */ m_can_tx_update_stats(cdev, msg_mark, timestamp); + ++processed; } =20 if (ack_fgi !=3D -1) m_can_write(cdev, M_CAN_TXEFA, FIELD_PREP(TXEFA_EFAI_MASK, ack_fgi)); =20 + spin_lock(&cdev->tx_handling_spinlock); + cdev->tx_fifo_in_flight -=3D processed; + spin_unlock(&cdev->tx_handling_spinlock); + return err; } =20 @@ -1821,11 +1831,26 @@ static netdev_tx_t m_can_start_peripheral_xmit(stru= ct m_can_classdev *cdev, } =20 netif_stop_queue(cdev->net); + + spin_lock(&cdev->tx_handling_spinlock); + ++cdev->tx_fifo_in_flight; + spin_unlock(&cdev->tx_handling_spinlock); + m_can_tx_queue_skb(cdev, skb); =20 return NETDEV_TX_OK; } =20 +static netdev_tx_t m_can_start_fast_xmit(struct m_can_classdev *cdev, + struct sk_buff *skb) +{ + spin_lock(&cdev->tx_handling_spinlock); + ++cdev->tx_fifo_in_flight; + spin_unlock(&cdev->tx_handling_spinlock); + + return m_can_tx_handler(cdev, skb); +} + static netdev_tx_t m_can_start_xmit(struct sk_buff *skb, struct net_device *dev) { @@ -1837,7 +1862,7 @@ static netdev_tx_t m_can_start_xmit(struct sk_buff *s= kb, if (cdev->is_peripheral) return m_can_start_peripheral_xmit(cdev, skb); else - return m_can_tx_handler(cdev, skb); + return m_can_start_fast_xmit(cdev, skb); } =20 static int m_can_open(struct net_device *dev) diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h index bf2d710c982f..adbd4765accc 100644 --- a/drivers/net/can/m_can/m_can.h +++ b/drivers/net/can/m_can/m_can.h @@ -109,6 +109,10 @@ struct m_can_classdev { // Store this internally to avoid fetch delays on peripheral chips int tx_fifo_putidx; =20 + /* Protects shared state between start_xmit and m_can_isr */ + spinlock_t tx_handling_spinlock; + int tx_fifo_in_flight; + struct m_can_tx_op *tx_ops; int nr_tx_ops; int next_tx_op; --=20 2.38.1