1010 * - Transition from CAN_STATE_ERROR_WARNING to CAN_STATE_ERROR_ACTIVE is only
1111 * reported after a call to do_get_berr_counter(), since firmware does not
1212 * distinguish between ERROR_WARNING and ERROR_ACTIVE.
13- * - Hardware timestamps are not set for CAN Tx frames.
1413 */
1514
1615#include <linux/completion.h>
@@ -261,6 +260,15 @@ struct kvaser_cmd_tx_can {
261260 u8 reserved [11 ];
262261} __packed ;
263262
263+ struct kvaser_cmd_tx_ack {
264+ __le32 id ;
265+ u8 data [8 ];
266+ u8 dlc ;
267+ u8 flags ;
268+ __le16 timestamp [3 ];
269+ u8 reserved0 [8 ];
270+ } __packed ;
271+
264272struct kvaser_cmd_header {
265273 u8 cmd_no ;
266274 /* The destination HE address is stored in 0..5 of he_addr.
@@ -297,6 +305,7 @@ struct kvaser_cmd {
297305
298306 struct kvaser_cmd_rx_can rx_can ;
299307 struct kvaser_cmd_tx_can tx_can ;
308+ struct kvaser_cmd_tx_ack tx_ack ;
300309 } __packed ;
301310} __packed ;
302311
@@ -522,23 +531,25 @@ kvaser_usb_hydra_net_priv_from_cmd(const struct kvaser_usb *dev,
522531 return priv ;
523532}
524533
525- static ktime_t
526- kvaser_usb_hydra_ktime_from_rx_cmd (const struct kvaser_usb_dev_cfg * cfg ,
527- const struct kvaser_cmd * cmd )
534+ static ktime_t kvaser_usb_hydra_ktime_from_cmd (const struct kvaser_usb_dev_cfg * cfg ,
535+ const struct kvaser_cmd * cmd )
528536{
529- u64 ticks ;
537+ ktime_t hwtstamp = 0 ;
530538
531539 if (cmd -> header .cmd_no == CMD_EXTENDED ) {
532540 struct kvaser_cmd_ext * cmd_ext = (struct kvaser_cmd_ext * )cmd ;
533541
534- ticks = le64_to_cpu (cmd_ext -> rx_can .timestamp );
535- } else {
536- ticks = le16_to_cpu (cmd -> rx_can .timestamp [0 ]);
537- ticks += (u64 )(le16_to_cpu (cmd -> rx_can .timestamp [1 ])) << 16 ;
538- ticks += (u64 )(le16_to_cpu (cmd -> rx_can .timestamp [2 ])) << 32 ;
542+ if (cmd_ext -> cmd_no_ext == CMD_RX_MESSAGE_FD )
543+ hwtstamp = kvaser_usb_timestamp64_to_ktime (cfg , cmd_ext -> rx_can .timestamp );
544+ else if (cmd_ext -> cmd_no_ext == CMD_TX_ACKNOWLEDGE_FD )
545+ hwtstamp = kvaser_usb_timestamp64_to_ktime (cfg , cmd_ext -> tx_ack .timestamp );
546+ } else if (cmd -> header .cmd_no == CMD_RX_MESSAGE ) {
547+ hwtstamp = kvaser_usb_timestamp48_to_ktime (cfg , cmd -> rx_can .timestamp );
548+ } else if (cmd -> header .cmd_no == CMD_TX_ACKNOWLEDGE ) {
549+ hwtstamp = kvaser_usb_timestamp48_to_ktime (cfg , cmd -> tx_ack .timestamp );
539550 }
540551
541- return ns_to_ktime ( div_u64 ( ticks * 1000 , cfg -> timestamp_freq )) ;
552+ return hwtstamp ;
542553}
543554
544555static int kvaser_usb_hydra_send_simple_cmd (struct kvaser_usb * dev ,
@@ -1175,6 +1186,7 @@ static void kvaser_usb_hydra_tx_acknowledge(const struct kvaser_usb *dev,
11751186 bool one_shot_fail = false;
11761187 bool is_err_frame = false;
11771188 u16 transid = kvaser_usb_hydra_get_cmd_transid (cmd );
1189+ struct sk_buff * skb ;
11781190
11791191 priv = kvaser_usb_hydra_net_priv_from_cmd (dev , cmd );
11801192 if (!priv )
@@ -1201,6 +1213,9 @@ static void kvaser_usb_hydra_tx_acknowledge(const struct kvaser_usb *dev,
12011213
12021214 spin_lock_irqsave (& priv -> tx_contexts_lock , irq_flags );
12031215
1216+ skb = priv -> can .echo_skb [context -> echo_index ];
1217+ if (skb )
1218+ skb_hwtstamps (skb )-> hwtstamp = kvaser_usb_hydra_ktime_from_cmd (dev -> cfg , cmd );
12041219 len = can_get_echo_skb (priv -> netdev , context -> echo_index , NULL );
12051220 context -> echo_index = dev -> max_tx_urbs ;
12061221 -- priv -> active_tx_contexts ;
@@ -1234,7 +1249,7 @@ static void kvaser_usb_hydra_rx_msg_std(const struct kvaser_usb *dev,
12341249 stats = & priv -> netdev -> stats ;
12351250
12361251 flags = cmd -> rx_can .flags ;
1237- hwtstamp = kvaser_usb_hydra_ktime_from_rx_cmd (dev -> cfg , cmd );
1252+ hwtstamp = kvaser_usb_hydra_ktime_from_cmd (dev -> cfg , cmd );
12381253
12391254 if (flags & KVASER_USB_HYDRA_CF_FLAG_ERROR_FRAME ) {
12401255 kvaser_usb_hydra_error_frame (priv , & cmd -> rx_can .err_frame_data ,
@@ -1302,7 +1317,7 @@ static void kvaser_usb_hydra_rx_msg_ext(const struct kvaser_usb *dev,
13021317 KVASER_USB_KCAN_DATA_DLC_SHIFT ;
13031318
13041319 flags = le32_to_cpu (cmd -> rx_can .flags );
1305- hwtstamp = kvaser_usb_hydra_ktime_from_rx_cmd (dev -> cfg , std_cmd );
1320+ hwtstamp = kvaser_usb_hydra_ktime_from_cmd (dev -> cfg , std_cmd );
13061321
13071322 if (flags & KVASER_USB_HYDRA_CF_FLAG_ERROR_FRAME ) {
13081323 kvaser_usb_hydra_error_frame (priv , & cmd -> rx_can .err_frame_data ,
0 commit comments