mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-15 17:14:00 +08:00
can: mcp251xfd: add HW timestamp to RX, TX and error CAN frames
This patch uses the previously added mcp251xfd_skb_set_timestamp() function to convert the timestamp done by the CAN controller into a proper skb hw timestamp. Link: https://lore.kernel.org/r/20210304161209.2754463-1-mkl@pengutronix.de Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
efd8d98dfb
commit
5f02a49c66
@ -1265,7 +1265,8 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
|
||||
const struct mcp251xfd_hw_tef_obj *hw_tef_obj)
|
||||
{
|
||||
struct net_device_stats *stats = &priv->ndev->stats;
|
||||
u32 seq, seq_masked, tef_tail_masked;
|
||||
struct sk_buff *skb;
|
||||
u32 seq, seq_masked, tef_tail_masked, tef_tail;
|
||||
|
||||
seq = FIELD_GET(MCP251XFD_OBJ_FLAGS_SEQ_MCP2518FD_MASK,
|
||||
hw_tef_obj->flags);
|
||||
@ -1281,9 +1282,13 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
|
||||
if (seq_masked != tef_tail_masked)
|
||||
return mcp251xfd_handle_tefif_recover(priv, seq);
|
||||
|
||||
tef_tail = mcp251xfd_get_tef_tail(priv);
|
||||
skb = priv->can.echo_skb[tef_tail];
|
||||
if (skb)
|
||||
mcp251xfd_skb_set_timestamp(priv, skb, hw_tef_obj->ts);
|
||||
stats->tx_bytes +=
|
||||
can_rx_offload_get_echo_skb(&priv->offload,
|
||||
mcp251xfd_get_tef_tail(priv),
|
||||
tef_tail,
|
||||
hw_tef_obj->ts, NULL);
|
||||
stats->tx_packets++;
|
||||
priv->tef->tail++;
|
||||
@ -1442,7 +1447,7 @@ mcp251xfd_rx_ring_update(const struct mcp251xfd_priv *priv,
|
||||
}
|
||||
|
||||
static void
|
||||
mcp251xfd_hw_rx_obj_to_skb(const struct mcp251xfd_priv *priv,
|
||||
mcp251xfd_hw_rx_obj_to_skb(struct mcp251xfd_priv *priv,
|
||||
const struct mcp251xfd_hw_rx_obj_canfd *hw_rx_obj,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
@ -1485,6 +1490,8 @@ mcp251xfd_hw_rx_obj_to_skb(const struct mcp251xfd_priv *priv,
|
||||
|
||||
if (!(hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_RTR))
|
||||
memcpy(cfd->data, hw_rx_obj->data, cfd->len);
|
||||
|
||||
mcp251xfd_skb_set_timestamp(priv, skb, hw_rx_obj->ts);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1598,16 +1605,21 @@ static int mcp251xfd_handle_rxif(struct mcp251xfd_priv *priv)
|
||||
}
|
||||
|
||||
static struct sk_buff *
|
||||
mcp251xfd_alloc_can_err_skb(const struct mcp251xfd_priv *priv,
|
||||
mcp251xfd_alloc_can_err_skb(struct mcp251xfd_priv *priv,
|
||||
struct can_frame **cf, u32 *timestamp)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
int err;
|
||||
|
||||
err = mcp251xfd_get_timestamp(priv, timestamp);
|
||||
if (err)
|
||||
return NULL;
|
||||
|
||||
return alloc_can_err_skb(priv->ndev, cf);
|
||||
skb = alloc_can_err_skb(priv->ndev, cf);
|
||||
if (skb)
|
||||
mcp251xfd_skb_set_timestamp(priv, skb, *timestamp);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static int mcp251xfd_handle_rxovif(struct mcp251xfd_priv *priv)
|
||||
@ -1759,6 +1771,7 @@ static int mcp251xfd_handle_ivmif(struct mcp251xfd_priv *priv)
|
||||
if (!cf)
|
||||
return 0;
|
||||
|
||||
mcp251xfd_skb_set_timestamp(priv, skb, timestamp);
|
||||
err = can_rx_offload_queue_sorted(&priv->offload, skb, timestamp);
|
||||
if (err)
|
||||
stats->rx_fifo_errors++;
|
||||
|
Loading…
Reference in New Issue
Block a user