enetc: add get_ts_info interface for ethtool
authorY.b. Lu <yangbo.lu@nxp.com>
Thu, 23 May 2019 02:33:33 +0000 (02:33 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 May 2019 20:16:32 +0000 (13:16 -0700)
This patch is to add get_ts_info interface for ethtool
to support getting timestamping capability.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/enetc/enetc.h
drivers/net/ethernet/freescale/enetc/enetc_ethtool.c
drivers/net/ethernet/freescale/enetc/enetc_ptp.c

index 281bb43..ea44326 100644 (file)
@@ -209,6 +209,9 @@ struct enetc_msg_cmd_set_primary_mac {
 
 #define ENETC_CBDR_TIMEOUT     1000 /* usecs */
 
+/* PTP driver exports */
+extern int enetc_phc_index;
+
 /* SI common */
 int enetc_pci_probe(struct pci_dev *pdev, const char *name, int sizeof_priv);
 void enetc_pci_remove(struct pci_dev *pdev);
index b9519b6..fcb52ef 100644 (file)
@@ -555,6 +555,35 @@ static void enetc_get_ringparam(struct net_device *ndev,
        }
 }
 
+static int enetc_get_ts_info(struct net_device *ndev,
+                            struct ethtool_ts_info *info)
+{
+       int *phc_idx;
+
+       phc_idx = symbol_get(enetc_phc_index);
+       if (phc_idx) {
+               info->phc_index = *phc_idx;
+               symbol_put(enetc_phc_index);
+       } else {
+               info->phc_index = -1;
+       }
+
+#ifdef CONFIG_FSL_ENETC_HW_TIMESTAMPING
+       info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE |
+                               SOF_TIMESTAMPING_RX_HARDWARE |
+                               SOF_TIMESTAMPING_RAW_HARDWARE;
+
+       info->tx_types = (1 << HWTSTAMP_TX_OFF) |
+                        (1 << HWTSTAMP_TX_ON);
+       info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
+                          (1 << HWTSTAMP_FILTER_ALL);
+#else
+       info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
+                               SOF_TIMESTAMPING_SOFTWARE;
+#endif
+       return 0;
+}
+
 static const struct ethtool_ops enetc_pf_ethtool_ops = {
        .get_regs_len = enetc_get_reglen,
        .get_regs = enetc_get_regs,
@@ -571,6 +600,7 @@ static const struct ethtool_ops enetc_pf_ethtool_ops = {
        .get_link_ksettings = phy_ethtool_get_link_ksettings,
        .set_link_ksettings = phy_ethtool_set_link_ksettings,
        .get_link = ethtool_op_get_link,
+       .get_ts_info = enetc_get_ts_info,
 };
 
 static const struct ethtool_ops enetc_vf_ethtool_ops = {
@@ -586,6 +616,7 @@ static const struct ethtool_ops enetc_vf_ethtool_ops = {
        .set_rxfh = enetc_set_rxfh,
        .get_ringparam = enetc_get_ringparam,
        .get_link = ethtool_op_get_link,
+       .get_ts_info = enetc_get_ts_info,
 };
 
 void enetc_set_ethtool_ops(struct net_device *ndev)
index 8c1497e..2fd2586 100644 (file)
@@ -7,6 +7,9 @@
 
 #include "enetc.h"
 
+int enetc_phc_index = -1;
+EXPORT_SYMBOL(enetc_phc_index);
+
 static struct ptp_clock_info enetc_ptp_caps = {
        .owner          = THIS_MODULE,
        .name           = "ENETC PTP clock",
@@ -96,6 +99,7 @@ static int enetc_ptp_probe(struct pci_dev *pdev,
        if (err)
                goto err_no_clock;
 
+       enetc_phc_index = ptp_qoriq->phc_index;
        pci_set_drvdata(pdev, ptp_qoriq);
 
        return 0;
@@ -119,6 +123,7 @@ static void enetc_ptp_remove(struct pci_dev *pdev)
 {
        struct ptp_qoriq *ptp_qoriq = pci_get_drvdata(pdev);
 
+       enetc_phc_index = -1;
        ptp_qoriq_free(ptp_qoriq);
        kfree(ptp_qoriq);