Commit 28e0a70c authored by Stephane Grosjean's avatar Stephane Grosjean Committed by Marc Kleine-Budde
Browse files

can: peak_usb: CANFD: store 64-bits hw timestamps

This patch allows to use the whole 64-bit timestamps received from the
CAN-FD device (expressed in µs) rather than only its low part, in the
hwtstamp structure of the skb transferred to the network layer, when a
CAN/CANFD frame has been received.

Link: https://lore.kernel.org/all/20210930094603.23134-1-s.grosjean@peak-system.com


Signed-off-by: default avatarStephane Grosjean <s.grosjean@peak-system.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent 10819466
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -205,6 +205,19 @@ int peak_usb_netif_rx(struct sk_buff *skb,
	return netif_rx(skb);
}

/* post received skb with native 64-bit hw timestamp */
int peak_usb_netif_rx_64(struct sk_buff *skb, u32 ts_low, u32 ts_high)
{
	struct skb_shared_hwtstamps *hwts = skb_hwtstamps(skb);
	u64 ns_ts;

	ns_ts = (u64)ts_high << 32 | ts_low;
	ns_ts *= NSEC_PER_USEC;
	hwts->hwtstamp = ns_to_ktime(ns_ts);

	return netif_rx(skb);
}

/*
 * callback for bulk Rx urb
 */
+1 −0
Original line number Diff line number Diff line
@@ -143,6 +143,7 @@ void peak_usb_set_ts_now(struct peak_time_ref *time_ref, u32 ts_now);
void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *tv);
int peak_usb_netif_rx(struct sk_buff *skb,
		      struct peak_time_ref *time_ref, u32 ts_low);
int peak_usb_netif_rx_64(struct sk_buff *skb, u32 ts_low, u32 ts_high);
void peak_usb_async_complete(struct urb *urb);
void peak_usb_restart_complete(struct peak_usb_device *dev);

+6 −3
Original line number Diff line number Diff line
@@ -515,7 +515,8 @@ static int pcan_usb_fd_decode_canmsg(struct pcan_usb_fd_if *usb_if,
	netdev->stats.rx_packets++;
	netdev->stats.rx_bytes += cfd->len;

	peak_usb_netif_rx(skb, &usb_if->time_ref, le32_to_cpu(rm->ts_low));
	peak_usb_netif_rx_64(skb, le32_to_cpu(rm->ts_low),
			     le32_to_cpu(rm->ts_high));

	return 0;
}
@@ -579,7 +580,8 @@ static int pcan_usb_fd_decode_status(struct pcan_usb_fd_if *usb_if,
	netdev->stats.rx_packets++;
	netdev->stats.rx_bytes += cf->len;

	peak_usb_netif_rx(skb, &usb_if->time_ref, le32_to_cpu(sm->ts_low));
	peak_usb_netif_rx_64(skb, le32_to_cpu(sm->ts_low),
			     le32_to_cpu(sm->ts_high));

	return 0;
}
@@ -629,7 +631,8 @@ static int pcan_usb_fd_decode_overrun(struct pcan_usb_fd_if *usb_if,
	cf->can_id |= CAN_ERR_CRTL;
	cf->data[1] |= CAN_ERR_CRTL_RX_OVERFLOW;

	peak_usb_netif_rx(skb, &usb_if->time_ref, le32_to_cpu(ov->ts_low));
	peak_usb_netif_rx_64(skb, le32_to_cpu(ov->ts_low),
			     le32_to_cpu(ov->ts_high));

	netdev->stats.rx_over_errors++;
	netdev->stats.rx_errors++;