diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2013-11-18 18:05:27 -0500 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2013-11-21 12:17:38 -0500 |
commit | ca0c88c2897581fa70227d408c43fb4efb7b7631 (patch) | |
tree | b05cc6f6a204ec609dd14e14b8e73813b179fbd0 /drivers/net/ethernet/freescale/gianfar.c | |
parent | 1d5244d0e43b70565d3988a52c6461ee42d3927c (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.c | 22 |
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 | ||
798 | static int gfar_hwtstamp_ioctl(struct net_device *netdev, | 798 | static 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 */ | 847 | static 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 | |||
849 | static int gfar_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | 861 | static 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; |