summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBalachandra C S <balacs@codeaurora.org>2018-05-24 19:46:25 +0530
committerBalachandra C S <balacs@codeaurora.org>2018-07-19 19:02:29 +0530
commiteb119bcb2aa86a2847efe3bc43e9af59db8059ed (patch)
tree57a7fc2302bb746f58d6c6bcc81a311119c54168
parent6a1dd530efe846d3ffabfe7bc65506377e52e226 (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.c21
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) {