Linux CAN drivers development
 help / color / mirror / Atom feed
From: Marc Kleine-Budde <mkl@pengutronix.de>
To: linux-can@vger.kernel.org
Cc: "Manivannan Sadhasivam" <mani@kernel.org>,
	"Thomas Kopp" <thomas.kopp@microchip.com>,
	"Stefan Althöfer" <Stefan.Althoefer@janztec.com>,
	kernel@pengutroniux.de, "Marc Kleine-Budde" <mkl@pengutronix.de>
Subject: [PATCH 5/5] can: mcp251xfd: implement workaround for double-RX erratum
Date: Wed, 11 Jan 2023 23:20:42 +0100	[thread overview]
Message-ID: <20230111222042.1139027-6-mkl@pengutronix.de> (raw)
In-Reply-To: <20230111222042.1139027-1-mkl@pengutronix.de>

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 .../net/can/spi/mcp251xfd/mcp251xfd-ring.c    |  1 +
 drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c  | 26 ++++++++++++++++---
 drivers/net/can/spi/mcp251xfd/mcp251xfd.h     |  3 +++
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
index cbfba958e3b5..f90a83390db2 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
@@ -196,6 +196,7 @@ mcp251xfd_ring_init_rx(struct mcp251xfd_priv *priv, u16 *base, u8 *fifo_nr)
 	int i, j;
 
 	mcp251xfd_for_each_rx_ring(priv, rx_ring, i) {
+		rx_ring->last_valid = timecounter_read(&priv->tc);
 		rx_ring->head = 0;
 		rx_ring->tail = 0;
 		rx_ring->base = *base;
diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c
index 811c4487c6fe..b9c4f7148b53 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c
@@ -175,8 +175,6 @@ mcp251xfd_hw_rx_obj_to_skb(const struct mcp251xfd_priv *priv,
 
 	if (!(hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_RTR))
 		memcpy(cfd->data, hw_rx_obj->data, cfd->len);
-
-	mcp251xfd_skb_set_timestamp_from_tbc(priv, skb, hw_rx_obj->ts);
 }
 
 static int
@@ -187,8 +185,21 @@ mcp251xfd_handle_rxif_one(struct mcp251xfd_priv *priv,
 	struct net_device_stats *stats = &priv->ndev->stats;
 	struct sk_buff *skb;
 	struct canfd_frame *cfd;
+	u64 timestamp;
 	int err;
 
+	timestamp = timecounter_cyc2time(&priv->tc, hw_rx_obj->ts);
+	if (timestamp <= ring->last_valid ) {
+		netdev_dbg(priv->ndev, "%s: last_valid=0x%016llx ts=0x%016llx d=0x%016llx data=%*ph - Dropping\n", __func__,
+			   ring->last_valid, timestamp,
+			   timestamp - ring->last_valid,
+			   8, hw_rx_obj->data);
+		stats->rx_fifo_errors++;
+
+		return -EBADMSG;
+	}
+	ring->last_valid = timestamp;
+
 	if (hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_FDF)
 		skb = alloc_canfd_skb(priv->ndev, &cfd);
 	else
@@ -199,6 +210,7 @@ mcp251xfd_handle_rxif_one(struct mcp251xfd_priv *priv,
 		return 0;
 	}
 
+	mcp251xfd_skb_set_timestamp(skb, timestamp);
 	mcp251xfd_hw_rx_obj_to_skb(priv, hw_rx_obj, skb);
 	err = can_rx_offload_queue_timestamp(&priv->offload, skb, hw_rx_obj->ts);
 	if (err)
@@ -281,7 +293,15 @@ mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv,
 			err = mcp251xfd_handle_rxif_one(priv, ring,
 							(void *)hw_rx_obj +
 							i * ring->obj_size);
-			if (err)
+			/* -EBADMSG means we're affected by an
+			 * erratum, i.e. that timestamp in the RX
+			 * object is older that the last valid
+			 * received CAN frame. Don't process any
+			 * further.
+			 */
+			if (err == -EBADMSG)
+				return mcp251xfd_handle_rxif_ring_uinc(priv, ring, i);
+			else if (err)
 				return err;
 		}
 
diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
index 11f6e1c6fc60..d973a89cf7f8 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
@@ -546,6 +546,9 @@ struct mcp251xfd_rx_ring {
 	unsigned int head;
 	unsigned int tail;
 
+	/* timestamp of the last valid received CAN frame */
+	u64 last_valid;
+
 	u16 base;
 	u8 nr;
 	u8 fifo_nr;
-- 
2.39.0



  parent reply	other threads:[~2023-01-11 22:22 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-11 22:20 [PATCH 0/5] can: mcp251xfd: workaround double-RX erratum Marc Kleine-Budde
2023-01-11 22:20 ` [PATCH 1/5] can: mcp251xfd: setup cycle counter before mcp251xfd_ring_init() Marc Kleine-Budde
2023-01-11 22:20 ` [PATCH 2/5] can: mcp251xfd: introduce mcp251xfd_skb_set_timestamp_from_tbc() and make use of it Marc Kleine-Budde
2023-01-11 22:20 ` [PATCH 3/5] can: mcp251xfd: mcp251xfd_handle_rxif_ring_uinc(): factor out in separate function Marc Kleine-Budde
2023-01-11 22:20 ` [PATCH 4/5] can: mcp251xfd: rx: mcp251xfd_handle_rxif_ring() Marc Kleine-Budde
2023-01-11 22:20 ` Marc Kleine-Budde [this message]
2023-01-11 22:30 ` [PATCH 0/5] can: mcp251xfd: workaround double-RX erratum Marc Kleine-Budde
2023-01-12  7:54   ` Marc Kleine-Budde
2023-01-13 12:39     ` AW: " Stefan Althöfer
2023-01-13 13:08       ` Marc Kleine-Budde
2023-01-16  7:19         ` Thomas.Kopp
2023-01-25  5:41   ` Tom Evans
2023-01-25  6:59     ` Thomas.Kopp
2023-01-25  7:42     ` Marc Kleine-Budde
2023-01-25  9:21       ` AW: " Stefan Althöfer
2023-01-16  8:43 ` Stefan Althöfer
2023-01-18 23:11   ` Marc Kleine-Budde
2023-01-16 19:49 ` Stefan Althöfer
2023-01-16 22:15   ` Marc Kleine-Budde
2023-01-19  7:47     ` AW: " Stefan Althöfer
2023-01-19 12:02       ` 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=20230111222042.1139027-6-mkl@pengutronix.de \
    --to=mkl@pengutronix.de \
    --cc=Stefan.Althoefer@janztec.com \
    --cc=kernel@pengutroniux.de \
    --cc=linux-can@vger.kernel.org \
    --cc=mani@kernel.org \
    --cc=thomas.kopp@microchip.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