Thread (17 messages) 17 messages, 3 authors, 2020-06-03

Re: [PATCH 3/3] net: stmmac: Support coarse mode through ioctl

From: Richard Cochran <richardcochran@gmail.com>
Date: 2020-05-27 03:55:16

On Thu, May 14, 2020 at 12:28:08PM +0200, Olivier Dautricourt wrote:
The required time adjustment is written in the Timestamp Update registers
while the Sub-second increment register is programmed with the period
of the clock, which is the precision of our correction.
I don't see in this patch where the "required time adjustment is
written in the Timestamp Update registers".

What am I missing?

Thanks,
Richard

quoted hunk ↗ jump to hunk
The fine adjutment mode is always the default behavior of the driver.
One should use the HWTSAMP_FLAG_ADJ_COARSE flag while calling
SIOCGHWTSTAMP ioctl to enable coarse mode for stmmac driver.

Signed-off-by: Olivier Dautricourt <redacted>
---
 .../net/ethernet/stmicro/stmmac/stmmac_main.c   | 17 +++++++++++++----
 .../net/ethernet/stmicro/stmmac/stmmac_ptp.c    |  3 +++
 2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index c39fafe69b12..f46503b086f4 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -541,9 +541,12 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
 	netdev_dbg(priv->dev, "%s config flags:0x%x, tx_type:0x%x, rx_filter:0x%x\n",
 		   __func__, config.flags, config.tx_type, config.rx_filter);
 
-	/* reserved for future extensions */
-	if (config.flags)
-		return -EINVAL;
+	if (config.flags != HWTSTAMP_FLAGS_ADJ_COARSE) {
+		/* Defaulting to fine adjustment for compatibility */
+		netdev_dbg(priv->dev, "%s defaulting to fine adjustment mode\n",
+			   __func__);
+		config.flags = HWTSTAMP_FLAGS_ADJ_FINE;
+	}
 
 	if (config.tx_type != HWTSTAMP_TX_OFF &&
 	    config.tx_type != HWTSTAMP_TX_ON)
@@ -689,10 +692,16 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
 		stmmac_set_hw_tstamping(priv, priv->ptpaddr, 0);
 	else {
 		stmmac_get_hw_tstamping(priv, priv->ptpaddr, &value);
-		value |= (PTP_TCR_TSENA | PTP_TCR_TSCFUPDT | PTP_TCR_TSCTRLSSR |
+		value |= (PTP_TCR_TSENA |  PTP_TCR_TSCTRLSSR |
 			 tstamp_all | ptp_v2 | ptp_over_ethernet |
 			 ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en |
 			 ts_master_en | snap_type_sel);
+
+		if (config.flags == HWTSTAMP_FLAGS_ADJ_FINE)
+			value |= PTP_TCR_TSCFUPDT;
+		else
+			value &= ~PTP_TCR_TSCFUPDT;
+
 		stmmac_set_hw_tstamping(priv, priv->ptpaddr, value);
 
 		/* program Sub Second Increment reg */
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
index 920f0f3ebbca..7fb318441015 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
@@ -27,6 +27,9 @@ static int stmmac_adjust_freq(struct ptp_clock_info *ptp, s32 ppb)
 	int neg_adj = 0;
 	u64 adj;
 
+	if (priv->tstamp_config.flags != HWTSTAMP_FLAGS_ADJ_FINE)
+		return -EPERM;
+
 	if (ppb < 0) {
 		neg_adj = 1;
 		ppb = -ppb;
-- 
2.17.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help