diff options
| author | Balachandra C S <balacs@codeaurora.org> | 2018-05-24 19:46:25 +0530 |
|---|---|---|
| committer | Balachandra C S <balacs@codeaurora.org> | 2018-07-19 19:02:29 +0530 |
| commit | eb119bcb2aa86a2847efe3bc43e9af59db8059ed (patch) | |
| tree | 57a7fc2302bb746f58d6c6bcc81a311119c54168 | |
| parent | 6a1dd530efe846d3ffabfe7bc65506377e52e226 (diff) | |
drivers: net: can: Add timestamp adjustment for frames in qti-can
Correct the frame timestamp based on the controller and host
time difference.
Change-Id: I6c60b943d18779a9bd9f221a2344dcea90b9fb5a
Signed-off-by: Balachandra C S <balacs@codeaurora.org>
| -rw-r--r-- | drivers/net/can/spi/qti-can.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/net/can/spi/qti-can.c b/drivers/net/can/spi/qti-can.c index 27294c74fcd6..7083d0011b18 100644 --- a/drivers/net/can/spi/qti-can.c +++ b/drivers/net/can/spi/qti-can.c @@ -70,6 +70,7 @@ struct qti_can { bool can_fw_cmd_timeout_req; u32 rem_all_buffering_timeout_ms; u32 can_fw_cmd_timeout_ms; + s64 time_diff; }; struct qti_can_netdev_privdata { @@ -119,6 +120,7 @@ struct spi_miso { /* TLV for MISO line */ #define CMD_BOOT_ROM_UPGRADE_DATA 0x9A #define CMD_END_BOOT_ROM_UPGRADE 0x9B #define CMD_END_FW_UPDATE_FILE 0x9C +#define CMD_UPDATE_TIME_INFO 0x9D #define IOCTL_RELEASE_CAN_BUFFER (SIOCDEVPRIVATE + 0) #define IOCTL_ENABLE_BUFFERING (SIOCDEVPRIVATE + 1) @@ -165,7 +167,7 @@ struct can_add_filter_resp { struct can_receive_frame { u8 can_if; - u32 ts; + __le64 ts; u32 mid; u8 dlc; u8 data[8]; @@ -180,6 +182,10 @@ struct can_config_bit_timing { u32 brp; } __packed; +struct can_time_info { + __le64 time; +} __packed; + static struct can_bittiming_const rh850_bittiming_const = { .name = "qti_can", .tseg1_min = 1, @@ -293,7 +299,7 @@ static void qti_can_receive_frame(struct qti_can *priv_data, return; } - LOGDI("rcv frame %d %d %x %d %x %x %x %x %x %x %x %x\n", + LOGDI("rcv frame %d %llu %x %d %x %x %x %x %x %x %x %x\n", frame->can_if, frame->ts, frame->mid, frame->dlc, frame->data[0], frame->data[1], frame->data[2], frame->data[3], frame->data[4], frame->data[5], frame->data[6], frame->data[7]); @@ -303,7 +309,8 @@ static void qti_can_receive_frame(struct qti_can *priv_data, for (i = 0; i < cf->can_dlc; i++) cf->data[i] = frame->data[i]; - nsec = ms_to_ktime(le32_to_cpu(frame->ts)); + nsec = ms_to_ktime(le64_to_cpu(frame->ts) + priv_data->time_diff); + skt = skb_hwtstamps(skb); skt->hwtstamp = nsec; LOGDI(" hwtstamp %lld\n", ktime_to_ms(skt->hwtstamp)); @@ -356,6 +363,8 @@ static int qti_can_process_response(struct qti_can *priv_data, struct spi_miso *resp, int length) { int ret = 0; + u64 mstime; + ktime_t ktime_now; LOGDI("<%x %2d [%d]\n", resp->cmd, resp->len, resp->seq); if (resp->cmd == CMD_CAN_RECEIVE_FRAME) { @@ -404,6 +413,12 @@ static int qti_can_process_response(struct qti_can *priv_data, ret |= (fw_resp->br_min & 0xFF) << 16; ret |= (fw_resp->maj & 0xF) << 8; ret |= (fw_resp->min & 0xFF); + } else if (resp->cmd == CMD_UPDATE_TIME_INFO) { + struct can_time_info *time_data = + (struct can_time_info *)resp->data; + ktime_now = ktime_get_boottime(); + mstime = ktime_to_ms(ktime_now); + priv_data->time_diff = mstime - (le64_to_cpu(time_data->time)); } if (resp->cmd == priv_data->wait_cmd) { |
