mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 07:38:10 +00:00
can: kvaser_pciefd: Add function to set skb hwtstamps
[ Upstream commit2d55e9f9b4
] Add new function, kvaser_pciefd_set_skb_timestamp(), to set skb hwtstamps. Signed-off-by: Jimmy Assarsson <extja@kvaser.com> Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> Link: https://lore.kernel.org/all/20230529134248.752036-4-extja@kvaser.com Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> Stable-dep-of:ec681b91be
("can: kvaser_pciefd: Set hardware timestamp on transmitted packets") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
483a06ecd8
commit
9926e32be6
1 changed files with 10 additions and 17 deletions
|
@ -538,6 +538,13 @@ static int kvaser_pciefd_set_tx_irq(struct kvaser_pciefd_can *can)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void kvaser_pciefd_set_skb_timestamp(const struct kvaser_pciefd *pcie,
|
||||||
|
struct sk_buff *skb, u64 timestamp)
|
||||||
|
{
|
||||||
|
skb_hwtstamps(skb)->hwtstamp =
|
||||||
|
ns_to_ktime(div_u64(timestamp * 1000, pcie->freq_to_ticks_div));
|
||||||
|
}
|
||||||
|
|
||||||
static void kvaser_pciefd_setup_controller(struct kvaser_pciefd_can *can)
|
static void kvaser_pciefd_setup_controller(struct kvaser_pciefd_can *can)
|
||||||
{
|
{
|
||||||
u32 mode;
|
u32 mode;
|
||||||
|
@ -1171,7 +1178,6 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
|
||||||
struct canfd_frame *cf;
|
struct canfd_frame *cf;
|
||||||
struct can_priv *priv;
|
struct can_priv *priv;
|
||||||
struct net_device_stats *stats;
|
struct net_device_stats *stats;
|
||||||
struct skb_shared_hwtstamps *shhwtstamps;
|
|
||||||
u8 ch_id = (p->header[1] >> KVASER_PCIEFD_PACKET_CHID_SHIFT) & 0x7;
|
u8 ch_id = (p->header[1] >> KVASER_PCIEFD_PACKET_CHID_SHIFT) & 0x7;
|
||||||
|
|
||||||
if (ch_id >= pcie->nr_channels)
|
if (ch_id >= pcie->nr_channels)
|
||||||
|
@ -1214,12 +1220,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
|
||||||
stats->rx_bytes += cf->len;
|
stats->rx_bytes += cf->len;
|
||||||
}
|
}
|
||||||
stats->rx_packets++;
|
stats->rx_packets++;
|
||||||
|
kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp);
|
||||||
shhwtstamps = skb_hwtstamps(skb);
|
|
||||||
|
|
||||||
shhwtstamps->hwtstamp =
|
|
||||||
ns_to_ktime(div_u64(p->timestamp * 1000,
|
|
||||||
pcie->freq_to_ticks_div));
|
|
||||||
|
|
||||||
return netif_rx(skb);
|
return netif_rx(skb);
|
||||||
}
|
}
|
||||||
|
@ -1282,7 +1283,6 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
|
||||||
struct net_device *ndev = can->can.dev;
|
struct net_device *ndev = can->can.dev;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
struct can_frame *cf = NULL;
|
struct can_frame *cf = NULL;
|
||||||
struct skb_shared_hwtstamps *shhwtstamps;
|
|
||||||
struct net_device_stats *stats = &ndev->stats;
|
struct net_device_stats *stats = &ndev->stats;
|
||||||
|
|
||||||
old_state = can->can.state;
|
old_state = can->can.state;
|
||||||
|
@ -1323,10 +1323,7 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
shhwtstamps = skb_hwtstamps(skb);
|
kvaser_pciefd_set_skb_timestamp(can->kv_pcie, skb, p->timestamp);
|
||||||
shhwtstamps->hwtstamp =
|
|
||||||
ns_to_ktime(div_u64(p->timestamp * 1000,
|
|
||||||
can->kv_pcie->freq_to_ticks_div));
|
|
||||||
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
|
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
|
||||||
|
|
||||||
cf->data[6] = bec.txerr;
|
cf->data[6] = bec.txerr;
|
||||||
|
@ -1374,7 +1371,6 @@ static int kvaser_pciefd_handle_status_resp(struct kvaser_pciefd_can *can,
|
||||||
struct net_device *ndev = can->can.dev;
|
struct net_device *ndev = can->can.dev;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
struct can_frame *cf;
|
struct can_frame *cf;
|
||||||
struct skb_shared_hwtstamps *shhwtstamps;
|
|
||||||
|
|
||||||
skb = alloc_can_err_skb(ndev, &cf);
|
skb = alloc_can_err_skb(ndev, &cf);
|
||||||
if (!skb) {
|
if (!skb) {
|
||||||
|
@ -1394,10 +1390,7 @@ static int kvaser_pciefd_handle_status_resp(struct kvaser_pciefd_can *can,
|
||||||
cf->can_id |= CAN_ERR_RESTARTED;
|
cf->can_id |= CAN_ERR_RESTARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
shhwtstamps = skb_hwtstamps(skb);
|
kvaser_pciefd_set_skb_timestamp(can->kv_pcie, skb, p->timestamp);
|
||||||
shhwtstamps->hwtstamp =
|
|
||||||
ns_to_ktime(div_u64(p->timestamp * 1000,
|
|
||||||
can->kv_pcie->freq_to_ticks_div));
|
|
||||||
|
|
||||||
cf->data[6] = bec.txerr;
|
cf->data[6] = bec.txerr;
|
||||||
cf->data[7] = bec.rxerr;
|
cf->data[7] = bec.rxerr;
|
||||||
|
|
Loading…
Reference in a new issue