fec: Implement the SIOCGHWTSTAMP ioctl
This is untested. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
parent
7260899bde
commit
1d5244d0e4
|
@ -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)
|
||||||
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,
|
||||||
* @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)
|
||||||
-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
|
||||||
|
|
Loading…
Reference in New Issue