devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marc Kleine-Budde <mkl@pengutronix.de>
To: kernel@pengutronix.de,
	Vincent Mailhol <mailhol.vincent@wanadoo.fr>,
	 "David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	 Jakub Kicinski <kuba@kernel.org>,
	Paolo Abeni <pabeni@redhat.com>,  Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	 Conor Dooley <conor+dt@kernel.org>,
	Heiko Stuebner <heiko@sntech.de>,
	 Philipp Zabel <p.zabel@pengutronix.de>,
	 Elaine Zhang <zhangqing@rock-chips.com>,
	 David Jander <david.jander@protonic.nl>
Cc: linux-can@vger.kernel.org, netdev@vger.kernel.org,
	 devicetree@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	 linux-rockchip@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	 Marc Kleine-Budde <mkl@pengutronix.de>
Subject: [PATCH can-next 09/21] can: rockchip_canfd: rkcanfd_handle_rx_int_one(): implement workaround for erratum 5: check for empty FIFO
Date: Mon, 29 Jul 2024 15:05:40 +0200	[thread overview]
Message-ID: <20240729-rockchip-canfd-v1-9-fa1250fd6be3@pengutronix.de> (raw)
In-Reply-To: <20240729-rockchip-canfd-v1-0-fa1250fd6be3@pengutronix.de>

The rk3568 CAN-FD errata sheet as of Tue 07 Nov 2023 11:25:31 +08:00
says:

| Erratum 5: Counters related to the TXFIFO and RXFIFO exhibit
| abnormal counting behavior.
|
| Due to a bug in the cross-asynchronous logic of the enable signals
| for rx_fifo_cnt and txe_fifo_frame_cnt counters, the counts of these
| two counters become inaccurate. This issue has resulted in the
| inability to use the TXFIFO and RXFIFO functions.

The errata sheet mentioned above states that only the rk3568v2 is
affected by this erratum, but tests with the rk3568v2 and rk3568v3
show that the RX_FIFO_CNT is sometimes too high. This leads to CAN
frames being read from the FIFO, which is then already empty.

Further tests on the rk3568v2 and rk3568v3 show that in this
situation (i.e. empty FIFO) all elements of the FIFO
header (frameinfo, id, ts) contain the same data.

On the rk3568v2 and rk3568v3, this problem only occurs extremely
rarely with the standard clock of 300 MHz, but almost immediately at
80 MHz.

To workaround this problem, check for empty FIFO with
rkcanfd_fifo_header_empty() in rkcanfd_handle_rx_int_one() and exit
early.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/rockchip/rockchip_canfd-rx.c | 14 ++++++++++++++
 drivers/net/can/rockchip/rockchip_canfd.h    | 22 ++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/drivers/net/can/rockchip/rockchip_canfd-rx.c b/drivers/net/can/rockchip/rockchip_canfd-rx.c
index affb89a956ee..c7b316e52580 100644
--- a/drivers/net/can/rockchip/rockchip_canfd-rx.c
+++ b/drivers/net/can/rockchip/rockchip_canfd-rx.c
@@ -47,6 +47,16 @@ rkcanfd_fifo_header_to_cfd_header(const struct rkcanfd_priv *priv,
 	return len + cfd->len;
 }
 
+static inline bool
+rkcanfd_fifo_header_empty(const struct rkcanfd_fifo_header *header)
+{
+	/* Erratum 5: If the FIFO is empty, we read the same value for
+	 * all elements.
+	 */
+	return header->frameinfo == header->id &&
+		header->frameinfo == header->ts;
+}
+
 static int rkcanfd_handle_rx_int_one(struct rkcanfd_priv *priv)
 {
 	struct net_device_stats *stats = &priv->ndev->stats;
@@ -63,6 +73,10 @@ static int rkcanfd_handle_rx_int_one(struct rkcanfd_priv *priv)
 	rkcanfd_read_rep(priv, RKCANFD_REG_RX_FIFO_RDATA,
 			 cfd->data, sizeof(cfd->data));
 
+	/* Erratum 5: Counters for TXEFIFO and RXFIFO may be wrong */
+	if (rkcanfd_fifo_header_empty(header))
+		return 0;
+
 	len = rkcanfd_fifo_header_to_cfd_header(priv, header, cfd);
 
 	/* Drop any received CAN-FD frames if CAN-FD mode is not
diff --git a/drivers/net/can/rockchip/rockchip_canfd.h b/drivers/net/can/rockchip/rockchip_canfd.h
index b5ad8633a8a6..09369ea62797 100644
--- a/drivers/net/can/rockchip/rockchip_canfd.h
+++ b/drivers/net/can/rockchip/rockchip_canfd.h
@@ -314,6 +314,28 @@
 
 /* Erratum 5: Counters related to the TXFIFO and RXFIFO exhibit
  * abnormal counting behavior.
+ *
+ * The rk3568 CAN-FD errata sheet as of Tue 07 Nov 2023 11:25:31 +08:00
+ * states that only the rk3568v2 is affected by this erratum, but
+ * tests with the rk3568v2 and rk3568v3 show that the RX_FIFO_CNT is
+ * sometimes too high. This leads to CAN frames being read from the
+ * FIFO, which is then already empty.
+ *
+ * Further tests on the rk3568v2 and rk3568v3 show that in this
+ * situation (i.e. empty FIFO) all elements of the FIFO header
+ * (frameinfo, id, ts) contain the same data.
+ *
+ * On the rk3568v2 and rk3568v3, this problem only occurs extremely
+ * rarely with the standard clock of 300 MHz, but almost immediately
+ * at 80 MHz.
+ *
+ * To workaround this problem, check for empty FIFO with
+ * rkcanfd_fifo_header_empty() in rkcanfd_handle_rx_int_one() and exit
+ * early.
+ *
+ * To reproduce:
+ * assigned-clocks = <&cru CLK_CANx>;
+ * assigned-clock-rates = <80000000>;
  */
 #define RKCANFD_QUIRK_RK3568_ERRATUM_5 BIT(4)
 

-- 
2.43.0



  parent reply	other threads:[~2024-07-29 13:07 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-29 13:05 [PATCH can-next 00/21] can: rockchip_canfd: add support for CAN-FD IP core found on Rockchip RK3568 Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 01/21] dt-bindings: can: rockchip_canfd: add binding for rockchip CAN-FD controller Marc Kleine-Budde
2024-07-30 19:21   ` Rob Herring
2024-07-31  8:44     ` Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 02/21] arm64: dts: rockchip: add CAN-FD controller nodes to rk3568 Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 03/21] arm64: dts: rockchip: mecsbc: add CAN0 and CAN1 interfaces Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 04/21] can: rockchip_canfd: add driver for Rockchip CAN-FD controller Marc Kleine-Budde
2024-07-30 16:34   ` Simon Horman
2024-07-31  8:02     ` Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 05/21] can: rockchip_canfd: add quirks for errata workarounds Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 06/21] can: rockchip_canfd: add quirk for broken CAN-FD support Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 07/21] can: rockchip_canfd: add support for rk3568v3 Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 08/21] can: rockchip_canfd: add notes about known issues Marc Kleine-Budde
2024-07-29 13:05 ` Marc Kleine-Budde [this message]
2024-07-29 13:05 ` [PATCH can-next 10/21] can: rockchip_canfd: rkcanfd_register_done(): add warning for erratum 5 Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 11/21] can: rockchip_canfd: add functions to check if CAN-FD frames are equal Marc Kleine-Budde
2024-07-30 16:37   ` Simon Horman
2024-07-31  8:02     ` Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 12/21] can: rockchip_canfd: add TX PATH Marc Kleine-Budde
2024-07-30 16:44   ` Simon Horman
2024-07-31  8:01     ` Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 13/21] can: rockchip_canfd: implement workaround for erratum 6 Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 14/21] can: rockchip_canfd: implement workaround for erratum 12 Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 15/21] can: rockchip_canfd: rkcanfd_get_berr_counter_corrected(): work around broken {RX,TX}ERRORCNT register Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 16/21] can: rockchip_canfd: add stats support for errata workarounds Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 17/21] can: rockchip_canfd: prepare to use full TX-FIFO depth Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 18/21] can: rockchip_canfd: enable full TX-FIFO depth of 2 Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 19/21] can: rockchip_canfd: add hardware timestamping support Marc Kleine-Budde
2024-07-30 16:30   ` Simon Horman
2024-07-31  8:00     ` Marc Kleine-Budde
2024-07-31  9:04       ` Simon Horman
2024-07-29 13:05 ` [PATCH can-next 20/21] can: rockchip_canfd: add support for CAN_CTRLMODE_LOOPBACK Marc Kleine-Budde
2024-07-29 13:05 ` [PATCH can-next 21/21] can: rockchip_canfd: add support for CAN_CTRLMODE_BERR_REPORTING Marc Kleine-Budde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240729-rockchip-canfd-v1-9-fa1250fd6be3@pengutronix.de \
    --to=mkl@pengutronix.de \
    --cc=conor+dt@kernel.org \
    --cc=davem@davemloft.net \
    --cc=david.jander@protonic.nl \
    --cc=devicetree@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=heiko@sntech.de \
    --cc=kernel@pengutronix.de \
    --cc=krzk+dt@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-can@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=mailhol.vincent@wanadoo.fr \
    --cc=netdev@vger.kernel.org \
    --cc=p.zabel@pengutronix.de \
    --cc=pabeni@redhat.com \
    --cc=robh@kernel.org \
    --cc=zhangqing@rock-chips.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).