gianfar: Support the get_ts_info ethtool method.
authorRichard Cochran <richardcochran@gmail.com>
Tue, 3 Apr 2012 22:59:19 +0000 (22:59 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 Apr 2012 09:28:45 +0000 (05:28 -0400)
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/gianfar.h
drivers/net/ethernet/freescale/gianfar_ethtool.c
drivers/net/ethernet/freescale/gianfar_ptp.c

index 4c9f8d487dbbf4825e10fc2e3ee25199662e7517..2136c7ff5e6d2331bf22195194b7f8b028f98587 100644 (file)
@@ -1210,4 +1210,7 @@ struct filer_table {
        struct gfar_filer_entry fe[MAX_FILER_CACHE_IDX + 20];
 };
 
+/* The gianfar_ptp module will set this variable */
+extern int gfar_phc_index;
+
 #endif /* __GIANFAR_H */
index 8d74efd04bb9bc478a0a576d27740d5f22dcb385..27f49c7f1d54be59bf320914fcb11283832dc1fc 100644 (file)
@@ -1739,6 +1739,34 @@ static int gfar_get_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
        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,
@@ -1761,4 +1789,5 @@ const struct ethtool_ops gfar_ethtool_ops = {
 #endif
        .set_rxnfc = gfar_set_nfc,
        .get_rxnfc = gfar_get_nfc,
+       .get_ts_info = gfar_get_ts_info,
 };
index 5fd620bec15cfeb993313b9052fc64894967cd74..c08e5d40fecb425c7f6c26b8de269d270bac727f 100644 (file)
@@ -515,6 +515,7 @@ static int gianfar_ptp_probe(struct platform_device *dev)
                err = PTR_ERR(etsects->clock);
                goto no_clock;
        }
+       gfar_phc_clock = ptp_clock_index(etsects->clock);
 
        dev_set_drvdata(&dev->dev, etsects);
 
@@ -538,6 +539,7 @@ static int gianfar_ptp_remove(struct platform_device *dev)
        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);