From nobody Fri Sep 25 16:51:05 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CA0EF41B354 for ; Thu, 10 Sep 2026 08:10:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789027836; cv=none; b=Ofk4NL5uWh9Xh5UoNxVhrwM6xBJOT8jbZrAO85pG4Gzx+ICkFNGYbEDQy+/e1rlU/M81lstGTcbMpYtgRs7bKnpGpshdsKQXmpvqO5ekRGywKUkVAcFFmQnYq6/VoPHioRd8htgJcgYKr6lcJMJ5s3aXubk2+mpzzYmwndXdl/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789027836; c=relaxed/simple; bh=7A+U+74WGkXsYGVAmxIitnef1L1YpX9QdK0dK/NlEMc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=hc1sy7i/w6HivMjHKRetPi92pLt5Q5qe/G/ScWSp/5eY8j7B5+fArw4vQVSezImxCKBpjUx+62FkgKWG3KBKYq31KFXT87g85TCiCv1TwfVw4pxl8cFxMA7o74N9IgLPAZMjkIsy6kNImXQfcGajvo4iBoWqgmP0exbWK9Gma+g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Kosq5C2r; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Kosq5C2r" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-39b24d114d4so7414757a91.3 for ; Thu, 10 Sep 2026 01:10:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789027834; x=1789632634; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=31zePXVLBWNEdCU+Xr18Au8ugINcScI/iDLGt4y6SQ0=; b=Kosq5C2rlL8LfUgyjd9vm3IYVSY7Iq4dygWi4aGgKoQLmoPmYqkZEasKLH5w+uF1Ui EEs4ofaSNYqS/QlKDpUPXJxJRhhCDzb4zS8qjzA5g3D3+7Gwm6i+NDveSxtOueHSTbMK t/pP5q2vMP9tMWSAHu8xLGXFiesPAL1AxCvk0CZ49IH2MKTnx+g2nXTkigGOSUBon9Ss /fiEb5t5bvraftAb+/TldzUgBjwpATgEGa+maCRJ5PcUZlBQFHvhnH1e9v+tzNcqGKvd xvVK5veRu1HlKbYLO49F+S06e/0RR39Zvoz2tkGz9jJNzVm6pqhHyFUeLgaQ9y4qXoh6 ugbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789027834; x=1789632634; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=31zePXVLBWNEdCU+Xr18Au8ugINcScI/iDLGt4y6SQ0=; b=oI9kQclVwMmrrjnWAvjh9Llj28oaitNR38YhQTWzhExl9/KG/9U9StoDGDBiNZKtGz 7PdrIJL6ZwgCgMpJZB99e9TPHO0qTIL343yv04gu4O5r9FBoWxe4+CQ2RsUa2L9VIQLQ 7WS7fNveWGMo6whCHttiILZJGCd/0VR2qoXFeCYVOaUSVWCyE3mVyN33XQEzRePjNTWj aaufrDExOut53E+lOEAK10tLSMj9cczacsd77jOY9uCOLleMGhwet81EI0TFUM+T4+nD XdgIST0yK8v3ou1HljyVMx6Uqs7yoOiPGCCfTrU6OaAd7oGP2SiK0IsBQ0LYY7S3H4yW vnhw== X-Forwarded-Encrypted: i=1; AKwUvBx0QTDHpwDxbV5U5eH2joZiuRTIEUF39N6cwKYUWuIh4I1AFCgy/WO67yWfZ2iz8XZx8610O1sSVleNDSg=@vger.kernel.org X-Gm-Message-State: AFuF++m6vODKw4yaWM3L7h93r50Z4fXVORrPCC6iFPEvUOMU/VV5yVW6 Y74N4aZA9CZ4sW2d/Be66DlJGITMaw/v5+o4VRw7zna1YFSQ3VVaQqT2 X-Gm-Gg: AYBFou3pfPx4QZupyzfgz12dkGyGrWMWaTMqHirbN/LBHwakB9mhhEPBwBpIvquC73S UFkvWacP2foDjOki6BKD6JL6IVvLNXPhQI5CmY4RaTBpSRy3ztmrfLr8SIbzHix+ioyl8KxIMYe 2CMfJMf9+N9/o9KfK0zK0sv+q/Mp5XNqFhjdc3Q2/cyuCxtJOXUGYLyZITUs4gxovHOsrtNrizn slNYi8JrXfx/flYmCRo+4s+QjGdF/M/FNFJnnUouDSyYPN8jEFH0DILucL6nnAPOwqyZ8n3Cezp oogjEIAkK/VNFbEP1tuRJlOJmljW5k/6fbHXvQ1MaXlMH0I8WcSNNCSlUtRfuvGEDA9NNoxCCAS X6hXlzuhvpEx05Vi4KfQcwqvBMO+5oqimMyaMHnanvefftWTn6t+LBWNtoN08XXnXbgR9MSqyjA dSJkdbUUr29TMqLr6uR8nlO+PWMmqtibgLJL8NdFIaaAsVeg4LtDkRXOXjbS8yilkIEaN9kOELa no4MZs6 X-Received: by 2002:a17:90b:1d52:b0:398:dcef:c040 with SMTP id 98e67ed59e1d1-39b26242a20mr59997599a91.19.1789027834038; Thu, 10 Sep 2026 01:10:34 -0700 (PDT) Received: from server227.. ([39.170.101.209]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39d770bc9f5sm4442434a91.2.2026.09.10.01.10.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 01:10:32 -0700 (PDT) From: Zxyan Zhu To: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: mcoquelin.stm32@gmail.com, alexandre.torgue@foss.st.com, richardcochran@gmail.com, maxime.chevallier@bootlin.com, muhammad.nazim.amirul.nazle.asmade@altera.com, rohan.g.thomas@altera.com, netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Zxyan Zhu Subject: [PATCH net-next v5 1/2] net: stmmac: dwmac-socfpga: complete cross-timestamp on ATSNS Date: Thu, 10 Sep 2026 16:10:19 +0800 Message-Id: <20260910081020.86227-2-zxyan0222@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260910081020.86227-1-zxyan0222@gmail.com> References: <20260910081020.86227-1-zxyan0222@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The Agilex5 smtg_crosststamp() handler arms an internal auxiliary snapshot, toggles GPO0 and then polls XGMAC_INT_STATUS for TSIS to learn that the snapshot is ready. TSIS is a transient, read-to-clear status bit: it is set by any MAC timestamp event and cleared the moment XGMAC_TIMESTAMP_STATUS is read. That makes the TSIS poll racy in two ways. A stale TSIS latched by an unrelated event satisfies the poll immediately, before the auxiliary snapshot is latched, so the FIFO comes back empty and *device is never written even though the call returns 0. Conversely a concurrent reader of XGMAC_TIMESTAMP_STATUS, such as the TX timestamp completion path, can clear TSIS while the poll is waiting and make it time out with "Wait for time sync operation timeout". The auxiliary snapshot FIFO is also reported by the persistent ATSNS count in XGMAC_TIMESTAMP_STATUS. ATSNS is cleared only when the FIFO clear bit (PTP_ACR_ATSFC) is set, so it is immune to the destructive reads above. Poll ATSNS instead of TSIS, wait for the ATSFC clear to complete first so a stale ATSNS cannot be observed, and derive the count for the FIFO pop loop from the value the poll read back so it is guaranteed non-zero on the success path. Signed-off-by: Zxyan Zhu --- .../ethernet/stmicro/stmmac/dwmac-socfpga.c | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/= net/ethernet/stmicro/stmmac/dwmac-socfpga.c index 1d7f0a57d288..ee6f28637878 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c @@ -340,6 +340,18 @@ static int smtg_crosststamp(ktime_t *device, struct sy= stem_counterval_t *system, /* Release the mutex */ mutex_unlock(&priv->aux_ts_lock); =20 + /* Wait for the FIFO clear to complete so a stale ATSNS count from + * a previous snapshot cannot satisfy the poll below before the new + * snapshot is latched. + */ + ret =3D readl_poll_timeout(ptpaddr + PTP_ACR, acr_value, + !(acr_value & PTP_ACR_ATSFC), 10, 10000); + if (ret) { + netdev_err(priv->dev, "%s: Failed to clear snapshot FIFO\n", + __func__); + return ret; + } + /* Trigger Internal snapshot signal. Create a rising edge by just toggle * the GPO0 to low and back to high. */ @@ -349,9 +361,17 @@ static int smtg_crosststamp(ktime_t *device, struct sy= stem_counterval_t *system, gpio_value |=3D XGMAC_GPIO_GPO0; writel(gpio_value, ioaddr + XGMAC_GPIO_STATUS); =20 - /* Poll for time sync operation done */ - ret =3D readl_poll_timeout(priv->ioaddr + XGMAC_INT_STATUS, v, - (v & XGMAC_INT_TSIS), 100, 10000); + /* Wait for the auxiliary snapshot to be latched. TSIS is a + * transient status bit that is set by any MAC timestamp event and + * cleared by reading XGMAC_TIMESTAMP_STATUS, so it is not a + * reliable completion condition. Poll the persistent ATSNS count + * instead: it is cleared only by setting PTP_ACR_ATSFC, so + * nothing can clear it while we wait, and it reflects exactly the + * snapshot latched by this trigger. + */ + ret =3D readl_poll_timeout(ioaddr + XGMAC_TIMESTAMP_STATUS, v, + FIELD_GET(XGMAC_TIMESTAMP_ATSNS_MASK, v), + 100, 10000); if (ret) { netdev_err(priv->dev, "%s: Wait for time sync operation timeout\n", __func__); @@ -364,8 +384,7 @@ static int smtg_crosststamp(ktime_t *device, struct sys= tem_counterval_t *system, .use_nsecs =3D false, }; =20 - num_snapshot =3D FIELD_GET(XGMAC_TIMESTAMP_ATSNS_MASK, - readl(ioaddr + XGMAC_TIMESTAMP_STATUS)); + num_snapshot =3D FIELD_GET(XGMAC_TIMESTAMP_ATSNS_MASK, v); =20 /* Repeat until the timestamps are from the FIFO last segment */ for (i =3D 0; i < num_snapshot; i++) { --=20 2.34.1 From nobody Fri Sep 25 16:51:05 2026 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D414A41B354 for ; Thu, 10 Sep 2026 08:10:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789027841; cv=none; b=uB9CpnmsjznbXB8TxJH/oqQgk2GOcm7huUREHtdXRCeYRt/4vRRlZIP1008xblWGFOQJhfxZuViEL027AkcWgZkvS9Mf2ZsFL144PPJgGUM/c5rhlbfWmM51jUVfNtcJldqiBr33TqKZ/Ui8Vc+Vd0UIGxzf16or741ayOCFHtk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789027841; c=relaxed/simple; bh=9WBU4UV+7UtsnX768TqabQ63Pb0Bd1MZ4nCo0ppSUks=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TCXucMTSkCWE022iUXtpY5VOxgY1m2EJhl7VWXZ05YMjlHSuhY6kpYHlhxTqBwdmveuxeATO59Db4DATqkuG9/G2RBt0uKzeBi7Eh+5q2eMdzJaBR2CALwHzhCBa0uc/IEUfxDoPSBATuBB+rcytcXBzQC8J5GNPcwQRQbC1DHI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LcaX0uwr; arc=none smtp.client-ip=209.85.215.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LcaX0uwr" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-cbee846deecso766316a12.1 for ; Thu, 10 Sep 2026 01:10:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789027839; x=1789632639; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=V7icB+mFn47r22Tll8dVKEqXUZ7IexWk6IFOaTVD/4o=; b=LcaX0uwrRcpUkDjAmwE/h2QwPXo3/iPOPyCd7Qgl9V16NuJbtbiFNuhFlnXaoJ3sTK kkDyUyWkoVGTaH/BaeJvAn5DNpklWVMuQ4XQHAYB7+32RywsFOS/rIM8fB+IPpOXwTSh nlMCXjMqWtUah6Laz09Yx64cKcqZD2/I3ZRruHaGQkQiwvyqJn9opSpjreCqfaxrc7ev lPsH4hIy5I4m3wY6HtV9FdeLtwzgFGwV+NoQZfuJ4Jio/JbM5c5dDgLyoY8gsofbaW9M +xAEQin+4M6DcL5waCWkOm5hZmNXOGeEdzelsI0n6KmKtwjtN4jUPXDiKmwIFboMcuUy c6Qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789027839; x=1789632639; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=V7icB+mFn47r22Tll8dVKEqXUZ7IexWk6IFOaTVD/4o=; b=rNVbbyAhaGVScLJngz8NkeF8yykSiVQH6tmenvR1kEMwrq3fsoMRUesK+0QY5nunJR w71q3mqiIwFt703cBmuIBQUWOlEb8chaIJ8AvE4iXDg0ynCBL/hZvYaOMFr+XmqZ1J9y jemGc1sXUP7OKZD3PJd0ejfXwWa6nUX//IdJPj9SUZA2f9afymL4jyuwQE7jP134eaZ0 j9Tz9kzAuGn991+ySVuJX3vfjTzky/Nkaa+2hNgswUUp650VCyPQL2vf7e3+42QS9g17 eK4hsgZvC3w52VpNoI5xtS4GycnL1RoDgisMzYQPZJT81nSJthPV/jw1vfiSVZfNxe7C KNHw== X-Forwarded-Encrypted: i=1; AKwUvBzYtkNLM/wVKB6DpOYeMmGs66pVQrMdqaPb9EeBDmeWaeK6JMgNg46McdDop6bBUTAfc1Z29W/W0WFL0xQ=@vger.kernel.org X-Gm-Message-State: AFuF++nYvzLMjuZk+uZ2bZUFKtQMhI1WXAmPI+5L0WqUzh3r5Vmc85pq X2WQxzDfUHMBxPCosWTJeL4Lfu5y5uHECaZqM6379AzSk2wRTpI3SSAm X-Gm-Gg: AYBFou3MdmRLnJpWmw1WRtS7mRCPJz+XMS8vg28WNFsWokXAPtotqogM6Z3+I2Ff5p3 3e5+g7qwmTGDnQLAGerO9DS4fuOg1BPfkRsDmNCnNBgGe1pSEpbXwPNlrRd1iHxh/PpHBnxpLVY lQkM5+3o0A+ZFuO9s63piE9nIoJ8oPmiOO+lHYGToyjMTBPBEvOfB/e2SMRSRayD7F9kol9HkPJ +oyu6n8x7Uki9bwbXG/bMB3Z9OOR+N8b77dCcMl80HzUevvF77hs61OLAEMob9W8quN2EqeZt3I EVkDGTYgYdCqNzrM40vGP8h4YIH4khFfvBly6I/C7De+JThkm0d7GuiSFiaVtZ262OGwHGron6i r5l3ZWGoWePjhewlLyI2rK5EbmeO9fZLEFGQ3Lih/6yK9etzSCLezpPDDvugAQAiRmPZGwSgsbu m6f1p9m8uXR0VyoTqId4p4SXyy9FneflZ4U+yAy7Q1Pkx7B0uzg8/hQ5pBJwAgMqYFZb9FIQ== X-Received: by 2002:a17:90b:1e51:b0:399:ecd:d68d with SMTP id 98e67ed59e1d1-39b26260f7dmr54760856a91.22.1789027839049; Thu, 10 Sep 2026 01:10:39 -0700 (PDT) Received: from server227.. ([39.170.101.209]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39d770bc9f5sm4442434a91.2.2026.09.10.01.10.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 01:10:38 -0700 (PDT) From: Zxyan Zhu To: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: mcoquelin.stm32@gmail.com, alexandre.torgue@foss.st.com, richardcochran@gmail.com, maxime.chevallier@bootlin.com, muhammad.nazim.amirul.nazle.asmade@altera.com, rohan.g.thomas@altera.com, netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Zxyan Zhu Subject: [PATCH net-next v5 2/2] net: stmmac: dwxgmac2: add XGMAC timestamp interrupt support Date: Thu, 10 Sep 2026 16:10:20 +0800 Message-Id: <20260910081020.86227-3-zxyan0222@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260910081020.86227-1-zxyan0222@gmail.com> References: <20260910081020.86227-1-zxyan0222@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" DWXGMAC2 uses XGMAC_TIMESTAMP_STATUS at offset 0xd20, while the generic stmmac PTP handler reads the dwmac4 offset GMAC_TIMESTAMP_STATUS (0xb20). Before this change, the DWXGMAC2 and DWXLGMAC2 hwif entries used &stmmac_ptp, whose timestamp_interrupt callback read the wrong register and whose config_hw_tstamping callback never enabled the XGMAC timestamp interrupt (XGMAC_TSIE was not in XGMAC_INT_DEFAULT_EN). As a result, auxiliary snapshot events were never reported on XGMAC platforms. Add a dedicated DWXGMAC2 timestamp interrupt handler that: - reads XGMAC_TIMESTAMP_STATUS before checking STMMAC_FLAG_EXT_SNAPSHOT_EN, so that the timestamp interrupt status is cleared even when auxiliary snapshots are disabled - derives the pending auxiliary snapshot count from the persistent ATSNS field instead of the transient AUXTSTRIG status bit - generates the corresponding PTP_CLOCK_EXTTS events Also enable XGMAC_TSIE in XGMAC_INT_DEFAULT_EN and hook the new handler into the DWXGMAC2 and DWXLGMAC2 hwif entries. Signed-off-by: Zxyan Zhu --- .../net/ethernet/stmicro/stmmac/dwxgmac2.h | 2 +- .../ethernet/stmicro/stmmac/dwxgmac2_core.c | 43 +++++++++++++++++++ drivers/net/ethernet/stmicro/stmmac/hwif.c | 4 +- drivers/net/ethernet/stmicro/stmmac/hwif.h | 1 + .../ethernet/stmicro/stmmac/stmmac_hwtstamp.c | 12 ++++++ .../net/ethernet/stmicro/stmmac/stmmac_ptp.h | 1 + 6 files changed, 60 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h b/drivers/net/e= thernet/stmicro/stmmac/dwxgmac2.h index f8ab347f7b5b..03cbae326995 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h @@ -87,7 +87,7 @@ #define XGMAC_TSIE BIT(12) #define XGMAC_LPIIE BIT(5) #define XGMAC_PMTIE BIT(4) -#define XGMAC_INT_DEFAULT_EN (XGMAC_LPIIE | XGMAC_PMTIE) +#define XGMAC_INT_DEFAULT_EN (XGMAC_LPIIE | XGMAC_PMTIE | XGMAC_TSIE) #define XGMAC_Qx_TX_FLOW_CTRL(x) (0x00000070 + (x) * 4) #define XGMAC_PT GENMASK(31, 16) #define XGMAC_TFE BIT(1) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c b/drivers/= net/ethernet/stmicro/stmmac/dwxgmac2_core.c index 1a88cbaed70c..891b7ceea2d4 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c @@ -1154,6 +1154,49 @@ static int dwxgmac2_get_mac_tx_timestamp(struct mac_= device_info *hw, u64 *ts) return 0; } =20 +void dwxgmac2_timestamp_interrupt(struct stmmac_priv *priv) +{ + u32 ts_status, pending_snapshots, acr_value, channel; + struct ptp_clock_event event; + unsigned long flags; + u64 ptp_time; + int i; + + /* Read XGMAC_TIMESTAMP_STATUS to get the AUX snapshot + * count. This read also clears the TSIS bit in + * XGMAC_INT_STATUS. + * TX timestamp polling may have already cleared TSIS + * and AUXTSTRIG, so rely on ATSNS instead. + * TXTSC is cleared by XGMAC_TXTIMESTAMP_SEC, not by + * this register, so there is no conflict. + */ + ts_status =3D readl(priv->ioaddr + XGMAC_TIMESTAMP_STATUS); + + if (!(priv->plat->flags & STMMAC_FLAG_EXT_SNAPSHOT_EN)) + return; + + pending_snapshots =3D FIELD_GET(XGMAC_TIMESTAMP_ATSNS_MASK, ts_status); + if (!pending_snapshots) + return; + + acr_value =3D readl(priv->ptpaddr + PTP_ACR); + channel =3D FIELD_GET(PTP_ACR_MASK, acr_value); + if (!channel) + return; + channel =3D ilog2(channel); + + for (i =3D 0; i < pending_snapshots; i++) { + read_lock_irqsave(&priv->ptp_lock, flags); + stmmac_get_ptptime(priv, priv->ptpaddr, &ptp_time); + read_unlock_irqrestore(&priv->ptp_lock, flags); + + event.type =3D PTP_CLOCK_EXTTS; + event.index =3D channel; + event.timestamp =3D ptp_time; + ptp_clock_event(priv->ptp_clock, &event); + } +} + static int dwxgmac2_flex_pps_config(void __iomem *ioaddr, int index, struct stmmac_pps_cfg *cfg, bool enable, u32 sub_second_inc, u32 systime_flags) diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.c b/drivers/net/ether= net/stmicro/stmmac/hwif.c index 265671170bf6..eba87410f985 100644 --- a/drivers/net/ethernet/stmicro/stmmac/hwif.c +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.c @@ -258,7 +258,7 @@ static const struct stmmac_hwif_entry { .dma =3D &dwxgmac210_dma_ops, .mac =3D &dwxgmac210_ops, .vlan =3D &dwxgmac210_vlan_ops, - .hwtimestamp =3D &stmmac_ptp, + .hwtimestamp =3D &dwxgmac2_ptp, .ptp =3D &stmmac_ptp_clock_ops, .mode =3D NULL, .tc =3D &dwmac510_tc_ops, @@ -280,7 +280,7 @@ static const struct stmmac_hwif_entry { .dma =3D &dwxgmac210_dma_ops, .mac =3D &dwxlgmac2_ops, .vlan =3D &dwxlgmac2_vlan_ops, - .hwtimestamp =3D &stmmac_ptp, + .hwtimestamp =3D &dwxgmac2_ptp, .ptp =3D &stmmac_ptp_clock_ops, .mode =3D NULL, .tc =3D &dwmac510_tc_ops, diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.h b/drivers/net/ether= net/stmicro/stmmac/hwif.h index fe18f98fae45..5a308e79db4a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/hwif.h +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.h @@ -672,6 +672,7 @@ extern const struct stmmac_desc_ops ndesc_ops; =20 extern const struct stmmac_hwtimestamp stmmac_ptp; extern const struct stmmac_hwtimestamp dwmac1000_ptp; +extern const struct stmmac_hwtimestamp dwxgmac2_ptp; =20 extern const struct stmmac_mode_ops ring_mode_ops; extern const struct stmmac_mode_ops chain_mode_ops; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c b/driver= s/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c index b9a985fa772c..9d7d24259abd 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c @@ -277,3 +277,15 @@ const struct stmmac_hwtimestamp dwmac1000_ptp =3D { .get_ptptime =3D dwmac1000_get_ptptime, .timestamp_interrupt =3D dwmac1000_timestamp_interrupt, }; + +const struct stmmac_hwtimestamp dwxgmac2_ptp =3D { + .config_hw_tstamping =3D config_hw_tstamping, + .init_systime =3D init_systime, + .config_sub_second_increment =3D config_sub_second_increment, + .config_addend =3D config_addend, + .adjust_systime =3D adjust_systime, + .get_systime =3D get_systime, + .get_ptptime =3D get_ptptime, + .timestamp_interrupt =3D dwxgmac2_timestamp_interrupt, + .hwtstamp_correct_latency =3D hwtstamp_correct_latency, +}; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h b/drivers/net= /ethernet/stmicro/stmmac/stmmac_ptp.h index 3fe0e3a80e80..dade09614163 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h @@ -103,6 +103,7 @@ int dwmac1000_ptp_enable(struct ptp_clock_info *ptp, =20 void dwmac1000_get_ptptime(void __iomem *ptpaddr, u64 *ptp_time); void dwmac1000_timestamp_interrupt(struct stmmac_priv *priv); +void dwxgmac2_timestamp_interrupt(struct stmmac_priv *priv); =20 extern const struct ptp_clock_info stmmac_ptp_clock_ops; extern const struct ptp_clock_info dwmac1000_ptp_clock_ops; --=20 2.34.1