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
->mii_ts
))
17 return ptp_classify_raw(skb
);
19 return PTP_CLASS_NONE
;
22 void skb_clone_tx_timestamp(struct sk_buff
*skb
)
24 struct mii_timestamper
*mii_ts
;
25 struct sk_buff
*clone
;
28 if (!skb
->sk
|| !skb
->dev
||
29 !phy_is_default_hwtstamp(skb
->dev
->phydev
))
33 if (type
== PTP_CLASS_NONE
)
36 mii_ts
= skb
->dev
->phydev
->mii_ts
;
37 if (likely(mii_ts
->txtstamp
)) {
38 clone
= skb_clone_sk(skb
);
41 mii_ts
->txtstamp(mii_ts
, clone
, type
);
44 EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp
);
46 bool skb_defer_rx_timestamp(struct sk_buff
*skb
)
48 struct mii_timestamper
*mii_ts
;
51 if (!skb
->dev
|| !phy_is_default_hwtstamp(skb
->dev
->phydev
))
54 if (skb_headroom(skb
) < ETH_HLEN
)
57 __skb_push(skb
, ETH_HLEN
);
59 type
= ptp_classify_raw(skb
);
61 __skb_pull(skb
, ETH_HLEN
);
63 if (type
== PTP_CLASS_NONE
)
66 mii_ts
= skb
->dev
->phydev
->mii_ts
;
67 if (likely(mii_ts
->rxtstamp
))
68 return mii_ts
->rxtstamp(mii_ts
, skb
, type
);
72 EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp
);