Skip to content

Commit 8a52e5a

Browse files
Jimmy Assarssonmarckleinebudde
authored andcommitted
can: kvaser_usb: leaf: Add hardware timestamp support to leaf based devices
Add hardware timestamp support to leaf based devices (M32C and leafimx). Signed-off-by: Jimmy Assarsson <[email protected]> Reviewed-by: Vincent Mailhol <[email protected]> Link: https://lore.kernel.org/all/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent 7f38237 commit 8a52e5a

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,28 +106,31 @@ static const struct kvaser_usb_driver_info kvaser_usb_driver_info_usbcan = {
106106
};
107107

108108
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf = {
109-
.quirks = KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
109+
.quirks = KVASER_USB_QUIRK_IGNORE_CLK_FREQ |
110+
KVASER_USB_QUIRK_HAS_HARDWARE_TIMESTAMP,
110111
.family = KVASER_LEAF,
111112
.ops = &kvaser_usb_leaf_dev_ops,
112113
};
113114

114115
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err = {
115116
.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS |
116-
KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
117+
KVASER_USB_QUIRK_IGNORE_CLK_FREQ |
118+
KVASER_USB_QUIRK_HAS_HARDWARE_TIMESTAMP,
117119
.family = KVASER_LEAF,
118120
.ops = &kvaser_usb_leaf_dev_ops,
119121
};
120122

121123
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err_listen = {
122124
.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS |
123125
KVASER_USB_QUIRK_HAS_SILENT_MODE |
124-
KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
126+
KVASER_USB_QUIRK_IGNORE_CLK_FREQ |
127+
KVASER_USB_QUIRK_HAS_HARDWARE_TIMESTAMP,
125128
.family = KVASER_LEAF,
126129
.ops = &kvaser_usb_leaf_dev_ops,
127130
};
128131

129132
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leafimx = {
130-
.quirks = 0,
133+
.quirks = KVASER_USB_QUIRK_HAS_HARDWARE_TIMESTAMP,
131134
.family = KVASER_LEAF,
132135
.ops = &kvaser_usb_leaf_dev_ops,
133136
};

drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,8 @@ static void kvaser_usb_leaf_tx_acknowledge(const struct kvaser_usb *dev,
915915
struct kvaser_usb_net_priv *priv;
916916
unsigned long flags;
917917
u8 channel, tid;
918+
struct sk_buff *skb;
919+
ktime_t hwtstamp = 0;
918920

919921
channel = cmd->u.tx_acknowledge_header.channel;
920922
tid = cmd->u.tx_acknowledge_header.tid;
@@ -954,9 +956,19 @@ static void kvaser_usb_leaf_tx_acknowledge(const struct kvaser_usb *dev,
954956

955957
priv->can.state = CAN_STATE_ERROR_ACTIVE;
956958
}
959+
switch (dev->driver_info->family) {
960+
case KVASER_LEAF:
961+
hwtstamp = kvaser_usb_timestamp48_to_ktime(dev->cfg, cmd->u.leaf.tx_ack.time);
962+
break;
963+
case KVASER_USBCAN:
964+
break;
965+
}
957966

958967
spin_lock_irqsave(&priv->tx_contexts_lock, flags);
959968

969+
skb = priv->can.echo_skb[context->echo_index];
970+
if (skb)
971+
skb_hwtstamps(skb)->hwtstamp = hwtstamp;
960972
stats->tx_packets++;
961973
stats->tx_bytes += can_get_echo_skb(priv->netdev,
962974
context->echo_index, NULL);
@@ -1334,6 +1346,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
13341346
struct net_device_stats *stats;
13351347
u8 channel = cmd->u.rx_can_header.channel;
13361348
const u8 *rx_data = NULL; /* GCC */
1349+
ktime_t hwtstamp = 0;
13371350

13381351
if (channel >= dev->nchannels) {
13391352
dev_err(&dev->intf->dev,
@@ -1364,6 +1377,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
13641377
switch (dev->driver_info->family) {
13651378
case KVASER_LEAF:
13661379
rx_data = cmd->u.leaf.rx_can.data;
1380+
hwtstamp = kvaser_usb_timestamp48_to_ktime(dev->cfg, cmd->u.leaf.rx_can.time);
13671381
break;
13681382
case KVASER_USBCAN:
13691383
rx_data = cmd->u.usbcan.rx_can.data;
@@ -1410,6 +1424,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
14101424
memcpy(cf->data, &rx_data[6], cf->len);
14111425
}
14121426

1427+
skb_hwtstamps(skb)->hwtstamp = hwtstamp;
14131428
stats->rx_packets++;
14141429
if (!(cf->can_id & CAN_RTR_FLAG))
14151430
stats->rx_bytes += cf->len;

0 commit comments

Comments
 (0)