[PATCH net-next 7/8] net: stmmac: do not overwrite other flags when writing timestamp control
alexis.lothore at bootlin.com
alexis.lothore at bootlin.com
Fri Jun 16 03:04:08 PDT 2023
From: Alexis Lothoré <alexis.lothore at bootlin.com>
On some versions of GMAC IP, for example, DWMAC1000, we may overwrite some
other flags like ATSEN0 when writing Timestamp Control register.
Avoid overwriting those additional flags by setting a read-write-modify
process only on flags of interest
Signed-off-by: Alexis Lothoré <alexis.lothore at bootlin.com>
---
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 528d2e010926..ba483adf4e1a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -616,6 +616,10 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
*/
static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
{
+ u32 reset_mask = PTP_TCR_SNAPTYPSEL_1 | PTP_TCR_TSIPV4ENA |
+ PTP_TCR_TSIPV6ENA | PTP_TCR_TSEVNTENA |
+ PTP_TCR_TSMSTRENA | PTP_TCR_TSVER2ENA |
+ PTP_TCR_TSIPENA | PTP_TCR_TSENALL;
struct stmmac_priv *priv = netdev_priv(dev);
struct hwtstamp_config config;
u32 ptp_v2 = 0;
@@ -783,7 +787,9 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
priv->hwts_rx_en = ((config.rx_filter == HWTSTAMP_FILTER_NONE) ? 0 : 1);
priv->hwts_tx_en = config.tx_type == HWTSTAMP_TX_ON;
- priv->systime_flags = STMMAC_HWTS_ACTIVE;
+ priv->systime_flags = stmmac_config_hw_tstamping_get(priv, priv->ptpaddr);
+ priv->systime_flags &= ~reset_mask;
+ priv->systime_flags |= STMMAC_HWTS_ACTIVE;
if (priv->hwts_tx_en || priv->hwts_rx_en) {
priv->systime_flags |= tstamp_all | ptp_v2 |
--
2.41.0
More information about the linux-arm-kernel
mailing list