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: Stephane Grosjean <s.grosjean@peak-system.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
108194666a
commit
28e0a70ced
@ -205,6 +205,19 @@ int peak_usb_netif_rx(struct sk_buff *skb,
|
|||||||
return netif_rx(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
|
* callback for bulk Rx urb
|
||||||
*/
|
*/
|
||||||
|
@ -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);
|
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,
|
int peak_usb_netif_rx(struct sk_buff *skb,
|
||||||
struct peak_time_ref *time_ref, u32 ts_low);
|
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_async_complete(struct urb *urb);
|
||||||
void peak_usb_restart_complete(struct peak_usb_device *dev);
|
void peak_usb_restart_complete(struct peak_usb_device *dev);
|
||||||
|
|
||||||
|
@ -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_packets++;
|
||||||
netdev->stats.rx_bytes += cfd->len;
|
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;
|
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_packets++;
|
||||||
netdev->stats.rx_bytes += cf->len;
|
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;
|
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->can_id |= CAN_ERR_CRTL;
|
||||||
cf->data[1] |= CAN_ERR_CRTL_RX_OVERFLOW;
|
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_over_errors++;
|
||||||
netdev->stats.rx_errors++;
|
netdev->stats.rx_errors++;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user