2019-05-20 09:19:02 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2010-07-17 08:49:36 +00:00
/*
* PTP 1588 clock support - support for timestamping in PHY devices
*
* Copyright ( C ) 2010 OMICRON electronics GmbH
*/
# include <linux/errqueue.h>
# include <linux/phy.h>
# include <linux/ptp_classify.h>
# include <linux/skbuff.h>
2011-07-15 11:47:34 -04:00
# include <linux/export.h>
2010-07-17 08:49:36 +00:00
2010-12-06 20:50:09 +00:00
static unsigned int classify ( const struct sk_buff * skb )
2010-07-17 08:49:36 +00:00
{
2014-03-28 18:58:21 +01:00
if ( likely ( skb - > dev & & skb - > dev - > phydev & &
2019-12-25 18:16:15 -08:00
skb - > dev - > phydev - > mii_ts ) )
2014-03-28 18:58:22 +01:00
return ptp_classify_raw ( skb ) ;
2010-07-17 08:49:36 +00:00
else
return PTP_CLASS_NONE ;
}
void skb_clone_tx_timestamp ( struct sk_buff * skb )
{
2019-12-25 18:16:15 -08:00
struct mii_timestamper * mii_ts ;
2010-07-17 08:49:36 +00:00
struct sk_buff * clone ;
unsigned int type ;
2014-09-04 13:31:35 -04:00
if ( ! skb - > sk )
2010-07-17 08:49:36 +00:00
return ;
type = classify ( skb ) ;
2014-06-27 11:59:09 +02:00
if ( type = = PTP_CLASS_NONE )
return ;
2019-12-25 18:16:15 -08:00
mii_ts = skb - > dev - > phydev - > mii_ts ;
if ( likely ( mii_ts - > txtstamp ) ) {
2014-09-04 13:31:35 -04:00
clone = skb_clone_sk ( skb ) ;
if ( ! clone )
2014-06-27 11:59:09 +02:00
return ;
2019-12-25 18:16:15 -08:00
mii_ts - > txtstamp ( mii_ts , clone , type ) ;
2010-07-17 08:49:36 +00:00
}
}
2011-06-12 02:18:58 +00:00
EXPORT_SYMBOL_GPL ( skb_clone_tx_timestamp ) ;
2010-07-17 08:49:36 +00:00
bool skb_defer_rx_timestamp ( struct sk_buff * skb )
{
2019-12-25 18:16:15 -08:00
struct mii_timestamper * mii_ts ;
2010-07-17 08:49:36 +00:00
unsigned int type ;
2019-12-25 18:16:15 -08:00
if ( ! skb - > dev | | ! skb - > dev - > phydev | | ! skb - > dev - > phydev - > mii_ts )
2015-07-09 11:02:52 -07:00
return false ;
2010-12-05 18:50:32 +00:00
if ( skb_headroom ( skb ) < ETH_HLEN )
return false ;
2015-07-09 11:02:52 -07:00
2010-12-05 18:50:32 +00:00
__skb_push ( skb , ETH_HLEN ) ;
2010-07-17 08:49:36 +00:00
2015-07-09 11:02:52 -07:00
type = ptp_classify_raw ( skb ) ;
2010-07-17 08:49:36 +00:00
2010-12-05 18:50:32 +00:00
__skb_pull ( skb , ETH_HLEN ) ;
2010-07-17 08:49:36 +00:00
2014-06-27 11:59:09 +02:00
if ( type = = PTP_CLASS_NONE )
return false ;
2019-12-25 18:16:15 -08:00
mii_ts = skb - > dev - > phydev - > mii_ts ;
if ( likely ( mii_ts - > rxtstamp ) )
return mii_ts - > rxtstamp ( mii_ts , skb , type ) ;
2010-07-17 08:49:36 +00:00
return false ;
}
2011-06-19 21:51:23 +00:00
EXPORT_SYMBOL_GPL ( skb_defer_rx_timestamp ) ;