]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
can: peak_canfd: provide hw timestamps in rx skbs
authorStephane Grosjean <s.grosjean@peak-system.com>
Mon, 16 Sep 2019 14:15:44 +0000 (16:15 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 11 Nov 2019 20:58:09 +0000 (21:58 +0100)
PEAK-System's CAN FD interfaces based on an IP core provide a timestamp
for each CAN and STATUS message received. This patch transfers these
received timestamps (clocked in microseconds) to hardware timestamps
(clocked in nanoseconds) in the corresponding skbs raised to the network
layer.

Signed-off-by: Stephane Grosjean <s.grosjean@peak-system.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/peak_canfd/peak_canfd.c

index 1ffcd63f5a8610680d40cd20c6309067b70b8c44..10aa3e457c33d48fe2055a422c6399b56798b9e3 100644 (file)
@@ -232,6 +232,20 @@ static int pucan_setup_rx_barrier(struct peak_canfd_priv *priv)
        return pucan_write_cmd(priv);
 }
 
+static int pucan_netif_rx(struct sk_buff *skb, __le32 ts_low, __le32 ts_high)
+{
+       struct skb_shared_hwtstamps *hwts = skb_hwtstamps(skb);
+       u64 ts_us;
+
+       ts_us = (u64)le32_to_cpu(ts_high) << 32;
+       ts_us |= le32_to_cpu(ts_low);
+
+       /* IP core timestamps are µs. */
+       hwts->hwtstamp = ns_to_ktime(ts_us * NSEC_PER_USEC);
+
+       return netif_rx(skb);
+}
+
 /* handle the reception of one CAN frame */
 static int pucan_handle_can_rx(struct peak_canfd_priv *priv,
                               struct pucan_rx_msg *msg)
@@ -299,7 +313,7 @@ static int pucan_handle_can_rx(struct peak_canfd_priv *priv,
        stats->rx_bytes += cf->len;
        stats->rx_packets++;
 
-       netif_rx(skb);
+       pucan_netif_rx(skb, msg->ts_low, msg->ts_high);
 
        return 0;
 }
@@ -392,7 +406,7 @@ static int pucan_handle_status(struct peak_canfd_priv *priv,
 
        stats->rx_packets++;
        stats->rx_bytes += cf->can_dlc;
-       netif_rx(skb);
+       pucan_netif_rx(skb, msg->ts_low, msg->ts_high);
 
        return 0;
 }