Commit 1d5244d0 authored by Ben Hutchings's avatar Ben Hutchings

fec: Implement the SIOCGHWTSTAMP ioctl

This is untested.
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent 7260899b
...@@ -339,7 +339,8 @@ struct fec_enet_private { ...@@ -339,7 +339,8 @@ struct fec_enet_private {
void fec_ptp_init(struct platform_device *pdev); void fec_ptp_init(struct platform_device *pdev);
void fec_ptp_start_cyclecounter(struct net_device *ndev); void fec_ptp_start_cyclecounter(struct net_device *ndev);
int fec_ptp_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd); int fec_ptp_set(struct net_device *ndev, struct ifreq *ifr);
int fec_ptp_get(struct net_device *ndev, struct ifreq *ifr);
/****************************************************************************/ /****************************************************************************/
#endif /* FEC_H */ #endif /* FEC_H */
...@@ -1684,8 +1684,12 @@ static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) ...@@ -1684,8 +1684,12 @@ static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
if (!phydev) if (!phydev)
return -ENODEV; return -ENODEV;
if (cmd == SIOCSHWTSTAMP && fep->bufdesc_ex) if (fep->bufdesc_ex) {
return fec_ptp_ioctl(ndev, rq, cmd); if (cmd == SIOCSHWTSTAMP)
return fec_ptp_set(ndev, rq);
if (cmd == SIOCGHWTSTAMP)
return fec_ptp_get(ndev, rq);
}
return phy_mii_ioctl(phydev, rq, cmd); return phy_mii_ioctl(phydev, rq, cmd);
} }
......
...@@ -274,7 +274,7 @@ static int fec_ptp_enable(struct ptp_clock_info *ptp, ...@@ -274,7 +274,7 @@ static int fec_ptp_enable(struct ptp_clock_info *ptp,
* @ifreq: ioctl data * @ifreq: ioctl data
* @cmd: particular ioctl requested * @cmd: particular ioctl requested
*/ */
int fec_ptp_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd) int fec_ptp_set(struct net_device *ndev, struct ifreq *ifr)
{ {
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
...@@ -321,6 +321,20 @@ int fec_ptp_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd) ...@@ -321,6 +321,20 @@ int fec_ptp_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd)
-EFAULT : 0; -EFAULT : 0;
} }
int fec_ptp_get(struct net_device *ndev, struct ifreq *ifr)
{
struct fec_enet_private *fep = netdev_priv(ndev);
struct hwtstamp_config config;
config.flags = 0;
config.tx_type = fep->hwts_tx_en ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
config.rx_filter = (fep->hwts_rx_en ?
HWTSTAMP_FILTER_ALL : HWTSTAMP_FILTER_NONE);
return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
-EFAULT : 0;
}
/** /**
* fec_time_keep - call timecounter_read every second to avoid timer overrun * fec_time_keep - call timecounter_read every second to avoid timer overrun
* because ENET just support 32bit counter, will timeout in 4s * because ENET just support 32bit counter, will timeout in 4s
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment