1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * PTP 1588 clock support - support for timestamping in PHY devices
5 * Copyright (C) 2010 OMICRON electronics GmbH
7 #include <linux/errqueue.h>
9 #include <linux/ptp_classify.h>
10 #include <linux/skbuff.h>
11 #include <linux/export.h>
13 static unsigned int classify(const struct sk_buff
*skb
)
15 if (likely(skb
->dev
&& skb
->dev
->phydev
&&
16 skb
->dev
->phydev
->drv
))
17 return ptp_classify_raw(skb
);
19 return PTP_CLASS_NONE
;
22 void skb_clone_tx_timestamp(struct sk_buff
*skb
)
24 struct phy_device
*phydev
;
25 struct sk_buff
*clone
;
32 if (type
== PTP_CLASS_NONE
)
35 phydev
= skb
->dev
->phydev
;
36 if (likely(phydev
->drv
->txtstamp
)) {
37 clone
= skb_clone_sk(skb
);
40 phydev
->drv
->txtstamp(phydev
, clone
, type
);
43 EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp
);
45 bool skb_defer_rx_timestamp(struct sk_buff
*skb
)
47 struct phy_device
*phydev
;
50 if (!skb
->dev
|| !skb
->dev
->phydev
|| !skb
->dev
->phydev
->drv
)
53 if (skb_headroom(skb
) < ETH_HLEN
)
56 __skb_push(skb
, ETH_HLEN
);
58 type
= ptp_classify_raw(skb
);
60 __skb_pull(skb
, ETH_HLEN
);
62 if (type
== PTP_CLASS_NONE
)
65 phydev
= skb
->dev
->phydev
;
66 if (likely(phydev
->drv
->rxtstamp
))
67 return phydev
->drv
->rxtstamp(phydev
, skb
, type
);
71 EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp
);