2019-05-20 10:19:02 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2010-07-17 12:49:36 +04: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 19:47:34 +04:00
# include <linux/export.h>
2010-07-17 12:49:36 +04:00
2010-12-06 23:50:09 +03:00
static unsigned int classify ( const struct sk_buff * skb )
2010-07-17 12:49:36 +04:00
{
2014-03-28 21:58:21 +04:00
if ( likely ( skb - > dev & & skb - > dev - > phydev & &
2019-12-26 05:16:15 +03:00
skb - > dev - > phydev - > mii_ts ) )
2014-03-28 21:58:22 +04:00
return ptp_classify_raw ( skb ) ;
2010-07-17 12:49:36 +04:00
else
return PTP_CLASS_NONE ;
}
void skb_clone_tx_timestamp ( struct sk_buff * skb )
{
2019-12-26 05:16:15 +03:00
struct mii_timestamper * mii_ts ;
2010-07-17 12:49:36 +04:00
struct sk_buff * clone ;
unsigned int type ;
2014-09-04 21:31:35 +04:00
if ( ! skb - > sk )
2010-07-17 12:49:36 +04:00
return ;
type = classify ( skb ) ;
2014-06-27 13:59:09 +04:00
if ( type = = PTP_CLASS_NONE )
return ;
2019-12-26 05:16:15 +03:00
mii_ts = skb - > dev - > phydev - > mii_ts ;
if ( likely ( mii_ts - > txtstamp ) ) {
2014-09-04 21:31:35 +04:00
clone = skb_clone_sk ( skb ) ;
if ( ! clone )
2014-06-27 13:59:09 +04:00
return ;
2019-12-26 05:16:15 +03:00
mii_ts - > txtstamp ( mii_ts , clone , type ) ;
2010-07-17 12:49:36 +04:00
}
}
2011-06-12 06:18:58 +04:00
EXPORT_SYMBOL_GPL ( skb_clone_tx_timestamp ) ;
2010-07-17 12:49:36 +04:00
bool skb_defer_rx_timestamp ( struct sk_buff * skb )
{
2019-12-26 05:16:15 +03:00
struct mii_timestamper * mii_ts ;
2010-07-17 12:49:36 +04:00
unsigned int type ;
2019-12-26 05:16:15 +03:00
if ( ! skb - > dev | | ! skb - > dev - > phydev | | ! skb - > dev - > phydev - > mii_ts )
2015-07-09 21:02:52 +03:00
return false ;
2010-12-05 21:50:32 +03:00
if ( skb_headroom ( skb ) < ETH_HLEN )
return false ;
2015-07-09 21:02:52 +03:00
2010-12-05 21:50:32 +03:00
__skb_push ( skb , ETH_HLEN ) ;
2010-07-17 12:49:36 +04:00
2015-07-09 21:02:52 +03:00
type = ptp_classify_raw ( skb ) ;
2010-07-17 12:49:36 +04:00
2010-12-05 21:50:32 +03:00
__skb_pull ( skb , ETH_HLEN ) ;
2010-07-17 12:49:36 +04:00
2014-06-27 13:59:09 +04:00
if ( type = = PTP_CLASS_NONE )
return false ;
2019-12-26 05:16:15 +03:00
mii_ts = skb - > dev - > phydev - > mii_ts ;
if ( likely ( mii_ts - > rxtstamp ) )
return mii_ts - > rxtstamp ( mii_ts , skb , type ) ;
2010-07-17 12:49:36 +04:00
return false ;
}
2011-06-20 01:51:23 +04:00
EXPORT_SYMBOL_GPL ( skb_defer_rx_timestamp ) ;