return ret;
 }
 
+int gfar_phc_index = -1;
+
+static int gfar_get_ts_info(struct net_device *dev,
+                           struct ethtool_ts_info *info)
+{
+       struct gfar_private *priv = netdev_priv(dev);
+
+       if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)) {
+               info->so_timestamping =
+                       SOF_TIMESTAMPING_RX_SOFTWARE |
+                       SOF_TIMESTAMPING_SOFTWARE;
+               info->phc_index = -1;
+               return 0;
+       }
+       info->so_timestamping =
+               SOF_TIMESTAMPING_TX_HARDWARE |
+               SOF_TIMESTAMPING_RX_HARDWARE |
+               SOF_TIMESTAMPING_RAW_HARDWARE;
+       info->phc_index = gfar_phc_index;
+       info->tx_types =
+               (1 << HWTSTAMP_TX_OFF) |
+               (1 << HWTSTAMP_TX_ON);
+       info->rx_filters =
+               (1 << HWTSTAMP_FILTER_NONE) |
+               (1 << HWTSTAMP_FILTER_ALL);
+       return 0;
+}
+
 const struct ethtool_ops gfar_ethtool_ops = {
        .get_settings = gfar_gsettings,
        .set_settings = gfar_ssettings,
 #endif
        .set_rxnfc = gfar_set_nfc,
        .get_rxnfc = gfar_get_nfc,
+       .get_ts_info = gfar_get_ts_info,
 };
 
                err = PTR_ERR(etsects->clock);
                goto no_clock;
        }
+       gfar_phc_clock = ptp_clock_index(etsects->clock);
 
        dev_set_drvdata(&dev->dev, etsects);
 
        gfar_write(&etsects->regs->tmr_temask, 0);
        gfar_write(&etsects->regs->tmr_ctrl,   0);
 
+       gfar_phc_clock = -1;
        ptp_clock_unregister(etsects->clock);
        iounmap(etsects->regs);
        release_resource(etsects->rsrc);