10
10
* - Transition from CAN_STATE_ERROR_WARNING to CAN_STATE_ERROR_ACTIVE is only
11
11
* reported after a call to do_get_berr_counter(), since firmware does not
12
12
* distinguish between ERROR_WARNING and ERROR_ACTIVE.
13
- * - Hardware timestamps are not set for CAN Tx frames.
14
13
*/
15
14
16
15
#include <linux/completion.h>
@@ -261,6 +260,15 @@ struct kvaser_cmd_tx_can {
261
260
u8 reserved [11 ];
262
261
} __packed ;
263
262
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
+
264
272
struct kvaser_cmd_header {
265
273
u8 cmd_no ;
266
274
/* The destination HE address is stored in 0..5 of he_addr.
@@ -297,6 +305,7 @@ struct kvaser_cmd {
297
305
298
306
struct kvaser_cmd_rx_can rx_can ;
299
307
struct kvaser_cmd_tx_can tx_can ;
308
+ struct kvaser_cmd_tx_ack tx_ack ;
300
309
} __packed ;
301
310
} __packed ;
302
311
@@ -522,23 +531,25 @@ kvaser_usb_hydra_net_priv_from_cmd(const struct kvaser_usb *dev,
522
531
return priv ;
523
532
}
524
533
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 )
528
536
{
529
- u64 ticks ;
537
+ ktime_t hwtstamp = 0 ;
530
538
531
539
if (cmd -> header .cmd_no == CMD_EXTENDED ) {
532
540
struct kvaser_cmd_ext * cmd_ext = (struct kvaser_cmd_ext * )cmd ;
533
541
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 );
539
550
}
540
551
541
- return ns_to_ktime ( div_u64 ( ticks * 1000 , cfg -> timestamp_freq )) ;
552
+ return hwtstamp ;
542
553
}
543
554
544
555
static 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,
1175
1186
bool one_shot_fail = false;
1176
1187
bool is_err_frame = false;
1177
1188
u16 transid = kvaser_usb_hydra_get_cmd_transid (cmd );
1189
+ struct sk_buff * skb ;
1178
1190
1179
1191
priv = kvaser_usb_hydra_net_priv_from_cmd (dev , cmd );
1180
1192
if (!priv )
@@ -1201,6 +1213,9 @@ static void kvaser_usb_hydra_tx_acknowledge(const struct kvaser_usb *dev,
1201
1213
1202
1214
spin_lock_irqsave (& priv -> tx_contexts_lock , irq_flags );
1203
1215
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 );
1204
1219
len = can_get_echo_skb (priv -> netdev , context -> echo_index , NULL );
1205
1220
context -> echo_index = dev -> max_tx_urbs ;
1206
1221
-- priv -> active_tx_contexts ;
@@ -1234,7 +1249,7 @@ static void kvaser_usb_hydra_rx_msg_std(const struct kvaser_usb *dev,
1234
1249
stats = & priv -> netdev -> stats ;
1235
1250
1236
1251
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 );
1238
1253
1239
1254
if (flags & KVASER_USB_HYDRA_CF_FLAG_ERROR_FRAME ) {
1240
1255
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,
1302
1317
KVASER_USB_KCAN_DATA_DLC_SHIFT ;
1303
1318
1304
1319
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 );
1306
1321
1307
1322
if (flags & KVASER_USB_HYDRA_CF_FLAG_ERROR_FRAME ) {
1308
1323
kvaser_usb_hydra_error_frame (priv , & cmd -> rx_can .err_frame_data ,
0 commit comments