aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/freescale/gianfar.c
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2013-11-18 18:05:27 -0500
committerBen Hutchings <bhutchings@solarflare.com>2013-11-21 12:17:38 -0500
commitca0c88c2897581fa70227d408c43fb4efb7b7631 (patch)
treeb05cc6f6a204ec609dd14e14b8e73813b179fbd0 /drivers/net/ethernet/freescale/gianfar.c
parent1d5244d0e43b70565d3988a52c6461ee42d3927c (diff)
gianfar: Implement the SIOCGHWTSTAMP ioctl
This is untested. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/freescale/gianfar.c')
-rw-r--r--drivers/net/ethernet/freescale/gianfar.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
index b14d7904a075..365342d293e8 100644
--- a/drivers/net/ethernet/freescale/gianfar.c
+++ b/drivers/net/ethernet/freescale/gianfar.c
@@ -795,8 +795,7 @@ err_grp_init:
795 return err; 795 return err;
796} 796}
797 797
798static int gfar_hwtstamp_ioctl(struct net_device *netdev, 798static int gfar_hwtstamp_set(struct net_device *netdev, struct ifreq *ifr)
799 struct ifreq *ifr, int cmd)
800{ 799{
801 struct hwtstamp_config config; 800 struct hwtstamp_config config;
802 struct gfar_private *priv = netdev_priv(netdev); 801 struct gfar_private *priv = netdev_priv(netdev);
@@ -845,7 +844,20 @@ static int gfar_hwtstamp_ioctl(struct net_device *netdev,
845 -EFAULT : 0; 844 -EFAULT : 0;
846} 845}
847 846
848/* Ioctl MII Interface */ 847static int gfar_hwtstamp_get(struct net_device *netdev, struct ifreq *ifr)
848{
849 struct hwtstamp_config config;
850 struct gfar_private *priv = netdev_priv(netdev);
851
852 config.flags = 0;
853 config.tx_type = priv->hwts_tx_en ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF;
854 config.rx_filter = (priv->hwts_rx_en ?
855 HWTSTAMP_FILTER_ALL : HWTSTAMP_FILTER_NONE);
856
857 return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
858 -EFAULT : 0;
859}
860
849static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 861static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
850{ 862{
851 struct gfar_private *priv = netdev_priv(dev); 863 struct gfar_private *priv = netdev_priv(dev);
@@ -854,7 +866,9 @@ static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
854 return -EINVAL; 866 return -EINVAL;
855 867
856 if (cmd == SIOCSHWTSTAMP) 868 if (cmd == SIOCSHWTSTAMP)
857 return gfar_hwtstamp_ioctl(dev, rq, cmd); 869 return gfar_hwtstamp_set(dev, rq);
870 if (cmd == SIOCGHWTSTAMP)
871 return gfar_hwtstamp_get(dev, rq);
858 872
859 if (!priv->phydev) 873 if (!priv->phydev)
860 return -ENODEV; 874 return -ENODEV;