drm/tests: hdmi: Fix memory leaks in drm_display_mode_from_cea_vic()
[drm/drm-misc.git] / net / core / timestamping.c
blob3717fb152ecc4f8b81aeb6252b9f4d8a2242da69
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * PTP 1588 clock support - support for timestamping in PHY devices
5 * Copyright (C) 2010 OMICRON electronics GmbH
6 */
7 #include <linux/errqueue.h>
8 #include <linux/phy.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);
18 else
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;
26 unsigned int type;
28 if (!skb->sk || !skb->dev ||
29 !phy_is_default_hwtstamp(skb->dev->phydev))
30 return;
32 type = classify(skb);
33 if (type == PTP_CLASS_NONE)
34 return;
36 mii_ts = skb->dev->phydev->mii_ts;
37 if (likely(mii_ts->txtstamp)) {
38 clone = skb_clone_sk(skb);
39 if (!clone)
40 return;
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;
49 unsigned int type;
51 if (!skb->dev || !phy_is_default_hwtstamp(skb->dev->phydev))
52 return false;
54 if (skb_headroom(skb) < ETH_HLEN)
55 return false;
57 __skb_push(skb, ETH_HLEN);
59 type = ptp_classify_raw(skb);
61 __skb_pull(skb, ETH_HLEN);
63 if (type == PTP_CLASS_NONE)
64 return false;
66 mii_ts = skb->dev->phydev->mii_ts;
67 if (likely(mii_ts->rxtstamp))
68 return mii_ts->rxtstamp(mii_ts, skb, type);
70 return false;
72 EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp);