can: mcp251xfd: add HW timestamp to RX, TX and error CAN frames
authorMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 2 Mar 2021 14:58:18 +0000 (15:58 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 30 Mar 2021 09:14:50 +0000 (11:14 +0200)
This patch uses the previously added mcp251xfd_skb_set_timestamp()
function to convert the timestamp done by the CAN controller into a
proper skb hw timestamp.

Link: https://lore.kernel.org/r/20210304161209.2754463-1-mkl@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c

index 6cdc05b..142eb45 100644 (file)
@@ -1265,7 +1265,8 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
                           const struct mcp251xfd_hw_tef_obj *hw_tef_obj)
 {
        struct net_device_stats *stats = &priv->ndev->stats;
-       u32 seq, seq_masked, tef_tail_masked;
+       struct sk_buff *skb;
+       u32 seq, seq_masked, tef_tail_masked, tef_tail;
 
        seq = FIELD_GET(MCP251XFD_OBJ_FLAGS_SEQ_MCP2518FD_MASK,
                        hw_tef_obj->flags);
@@ -1281,9 +1282,13 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
        if (seq_masked != tef_tail_masked)
                return mcp251xfd_handle_tefif_recover(priv, seq);
 
+       tef_tail = mcp251xfd_get_tef_tail(priv);
+       skb = priv->can.echo_skb[tef_tail];
+       if (skb)
+               mcp251xfd_skb_set_timestamp(priv, skb, hw_tef_obj->ts);
        stats->tx_bytes +=
                can_rx_offload_get_echo_skb(&priv->offload,
-                                           mcp251xfd_get_tef_tail(priv),
+                                           tef_tail,
                                            hw_tef_obj->ts, NULL);
        stats->tx_packets++;
        priv->tef->tail++;
@@ -1442,7 +1447,7 @@ mcp251xfd_rx_ring_update(const struct mcp251xfd_priv *priv,
 }
 
 static void
-mcp251xfd_hw_rx_obj_to_skb(const struct mcp251xfd_priv *priv,
+mcp251xfd_hw_rx_obj_to_skb(struct mcp251xfd_priv *priv,
                           const struct mcp251xfd_hw_rx_obj_canfd *hw_rx_obj,
                           struct sk_buff *skb)
 {
@@ -1485,6 +1490,8 @@ 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(priv, skb, hw_rx_obj->ts);
 }
 
 static int
@@ -1598,16 +1605,21 @@ static int mcp251xfd_handle_rxif(struct mcp251xfd_priv *priv)
 }
 
 static struct sk_buff *
-mcp251xfd_alloc_can_err_skb(const struct mcp251xfd_priv *priv,
+mcp251xfd_alloc_can_err_skb(struct mcp251xfd_priv *priv,
                            struct can_frame **cf, u32 *timestamp)
 {
+       struct sk_buff *skb;
        int err;
 
        err = mcp251xfd_get_timestamp(priv, timestamp);
        if (err)
                return NULL;
 
-       return alloc_can_err_skb(priv->ndev, cf);
+       skb = alloc_can_err_skb(priv->ndev, cf);
+       if (skb)
+               mcp251xfd_skb_set_timestamp(priv, skb, *timestamp);
+
+       return skb;
 }
 
 static int mcp251xfd_handle_rxovif(struct mcp251xfd_priv *priv)
@@ -1759,6 +1771,7 @@ static int mcp251xfd_handle_ivmif(struct mcp251xfd_priv *priv)
        if (!cf)
                return 0;
 
+       mcp251xfd_skb_set_timestamp(priv, skb, timestamp);
        err = can_rx_offload_queue_sorted(&priv->offload, skb, timestamp);
        if (err)
                stats->rx_fifo_errors++;