From patchwork Thu Oct 15 14:55:01 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Thompson X-Patchwork-Id: 3629 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sto.lore.kernel.org (sto.lore.kernel.org [172.232.135.74]) by mxe881.netcup.net (Postfix) with ESMTPS id 6C2731C23AE for ; Thu, 15 Oct 2026 17:10:10 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=riscstar-com.20251104.gappssmtp.com; spf=pass (sender IP is 172.232.135.74) smtp.mailfrom=linux-sunxi+bounces-26671-noreply=patchwork.local@lists.linux.dev smtp.helo=sto.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.232.135.74 as permitted sender) client-ip=172.232.135.74; envelope-from=linux-sunxi+bounces-26671-noreply=patchwork.local@lists.linux.dev; helo=sto.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sto.lore.kernel.org (Postfix) with ESMTP id 57F1D606245 for ; Thu, 15 Oct 2026 15:01:11 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5454553B5ED; Thu, 15 Oct 2026 14:58:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=riscstar-com.20251104.gappssmtp.com header.i=@riscstar-com.20251104.gappssmtp.com header.b="rMZGooCx" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 73B893BE632 for ; Thu, 15 Oct 2026 14:58:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792076302; cv=none; b=nn8kw/XlDCBrziQW8Zl3JsTcaAagSqIUSRu2LPxEo0zt/evWI7DRNLB0Rw3avfU+kJrAUk6MuX1kmgxlpHYLYkblJk1wzXXMX05jo0t+C7ZJxv4i6cZyqJqwlMb8okBenRyKv7ZXXItVA5iaeDsmQtCEZm6X0ez8kS3grfnrYQI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792076302; c=relaxed/simple; bh=1Xb3fJ7DRTRY19rNYNeO6Dwme3HMA8kT8BWjh0UFPBM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QMBRPD63QDQx18/GwiI3+av6LO8X6A87+V2SPfMdeFr9cnaI1SRIESbdil2qwwF1jwDwNsMgVVAqqCbdAf+09krb/MK+D1gEReP1asuAqOdsGdLe4WMcZ2OjYKNFMhH5cIA1fYFlH6lEYIMZTa6Y4298bss4xFxDwOxxzQeVPsA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=riscstar.com; spf=pass smtp.mailfrom=riscstar.com; dkim=pass (2048-bit key) header.d=riscstar-com.20251104.gappssmtp.com header.i=@riscstar-com.20251104.gappssmtp.com header.b=rMZGooCx; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=riscstar.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=riscstar.com Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-4a180fbeef5so49377365e9.1 for ; Thu, 15 Oct 2026 07:58:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=riscstar-com.20251104.gappssmtp.com; s=20251104; t=1792076294; x=1792681094; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=P//yg+b2gnuEyhEoTs+D2xO6ThJI9Dnp4w6O39bw46g=; b=rMZGooCxq43CI/W4Zj+SbcID6odmjBLm2/4QsI7rY6h7kPhMHqOKGfKVk95IRYmrVf EuDD8OVt1TIbfiQlFslujhegZCfm7gF/fDZWJqBi/0YDadImgApm7tXzjLy5NVckh//4 JMnqTV6s9Zf+ckotOc9XUixuAwURraZ8U5pJCtxSRzGz8BgHgldMm44MT8MoGgJ9rggH eEFFMhwKtiJGJdo4FKsliqlNhTkZGDVvVVietsSSJtuSk0ZfI5BKAA+5KQ1oAL2YYfr3 mzf7H6rpQ5xL1QRVdxNdZFfL0fHdmnHqyL/8joSZzKNAIEE2Sk8UB2uG+PUx1Q+rbtA9 TkgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792076294; x=1792681094; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=P//yg+b2gnuEyhEoTs+D2xO6ThJI9Dnp4w6O39bw46g=; b=So9+Jt4qwFtQ7il8MQMG6gUftLuF3ZOZtePDxgjogLjgbdl7NOJdblTT8YStVOMOhS PpYjwlDpzFxvRFTs6EpZ3HB5buo8cTFypSbl5kUZWui6BqGZxxT5NlHUBI0ychSvFA1B Rr8iMXdUuGgVkkyp3BKCPMEFICb+e8O2W4JK2pLgmTyMwZ4QgH+cHpk7Tns5wpD/B5El hkyZlXxt9o8zARExTOMa4e/N5ZsnYjOjSWtUAiz5GtZL0EvDWdp8pVIIua/gTaZS0cNV 06RhvD+Re8kuKemxjAOQHYz5KDAmISFXPRLGM+y2ATvNZ6tmjR4Ag2ioHIBa7vr+q/ht t1xA== X-Forwarded-Encrypted: i=1; AKwUvBwLGgHkd/xVFC3OejG1E5o34o6Jx7io7dpK1sik/2pJVZWosdblSeWgHO/nhk844uXVjv+5aPRt7oRJcg==@lists.linux.dev X-Gm-Message-State: AFq9FYJxJdWP3cPPc1j9U4vvAsdEJCyGKW+FgGUdK3pIdhWn+HIh4p46 GwA3Xkjcgq2mio5+gUuYmQfifrRPgiCY0gE/uAJ+HkKw1sDLsIECGqyLMYDChFs+4ts= X-Gm-Gg: AYBFou0J47PIPn5XEOqHAhjm/BYwP+3vy89/Hyk7mSUFGDjTUJDTy1Y5PNSQVt71Fud xStaUE2esIl704mIWSwBRgxLeT5uaD2e+4Jz17Zc7EU5O2Qul+ZplKlOB3i5G//W/EUbGDNabfJ n5pw/c+xSaFoaAKLchm3kbJ+/3p/gG3BTnXkCl1ymKTQz+ZLPw0Pgsk9dfbbbTG6cQp0CAcv5Gi W1Palm7AHZIYSpmCurvaBogeMCLoN4NI8loTQorpYPqQ2otE0EVqUdYsjiSNqJdV4xDx+7nSyaR iVZZxsYxm8lYbLF9qzqZ+5WjMqKZGPJFPY7Ly9dWahJ3LZ7meaGvZ7sIHPDFgmhJrZtpfiurPDS JyIjFgWmk3Wsn6C2rl9AA6ljKvQX9g0AvQNBV4bbVfSjuvPF0h8k8uBDjPYpMOlsJPmfEkmK4WS ApLJynqQwT0nAFOzuOtz9kN5w7PCDncTxOr4IPq0Al0tO2o/ZN5owysU4+jkDXnFPeRaGM/iiMa 6wdPFRqiOtZLmx3W+ZBC1Zw9BW+WiP5+g6xdB5eppVH0fqMHASJfEUVtDF9Z1aLTbUoNTDGhMoi NtsEDdMpZVPNRIokVcjPg8BFlvFe3RPumYIO9aljApQdyU7gOHsKoYc/2VZf X-Received: by 2002:a05:600c:628d:b0:4a1:c5eb:b445 with SMTP id 5b1f17b1804b1-4a1c5ebb599mr16894025e9.35.1792076293476; Thu, 15 Oct 2026 07:58:13 -0700 (PDT) Received: from aspen.lan (aztw-33-b2-v4wan-169864-cust3247.vm26.cable.virginm.net. [92.239.204.176]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48de0ac4fd7sm19738293f8f.40.2026.10.15.07.58.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 07:58:13 -0700 (PDT) From: Daniel Thompson Date: Thu, 15 Oct 2026 15:55:01 +0100 Subject: [PATCH net-next v3 1/2] net: stmmac: Introduce group arguments for enable/disable_dma_irq Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20261015-tc956x-stmmac-no_irq_teardown-v3-1-8189870be545@riscstar.com> References: <20261015-tc956x-stmmac-no_irq_teardown-v3-0-8189870be545@riscstar.com> In-Reply-To: <20261015-tc956x-stmmac-no_irq_teardown-v3-0-8189870be545@riscstar.com> To: Andrew Lunn , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Maxime Coquelin , Alexandre Torgue , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Maxime Chevallier , Eric Dumazet , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Eric Dumazet Cc: Alex Elder , netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-sunxi@lists.linux.dev, Daniel Thompson X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=16729; i=daniel@riscstar.com; h=from:subject:message-id; bh=1Xb3fJ7DRTRY19rNYNeO6Dwme3HMA8kT8BWjh0UFPBM=; b=owEBbQKS/ZANAwAKAXzjJV0594ihAcsmYgBq0OnldKy/ZpiW4qnaBP3+CdA4DhBRl9k5GGlzC aIRzEhgG5mJAjMEAAEKAB0WIQQvNUFTUPeVarpwrPB84yVdOfeIoQUCatDp5QAKCRB84yVdOfeI oT98EACPJZ4wwOnAX2SzRaPT1mwPXqX/puS+H3E0hOyM8LSHaPV1t3H9/l2dFVjdt8C0nZE1dex hVwlx5KvuUH6xJYQTCFP+981ov14q+lvria9nkl3nDDgUVs6mh15uJYfBZI0YuIEhALbrhzmvn5 LkOuafudpYnkyeJuCVSozjiEUniRqu8zf+Co8Xgr26/WhUAtTGz14OLoel33uaa8xLn+jgOs/zK Cij7/B1nFRg3ZfR7oMYKpRAvpAtPu2XH+g5F9fOMeYUOQAlMYSanaQCxyLG0lyDJw/wqm9oLW8W AQK/Dg3QikpNx8hbYCilwF+oh5lgLjKvI6pKhdMlh1vvGJmHafTHWCAJBUujpGDC++um11JG2Uj Ip/rWZOk+e/9tngbTekB88cFTYOaK3+GXo4RBSGLxKSU2S0UHxWSJoPBEiR9Y5xwEiDc92Axt8c SdagVsfCt6beVcf+qdyvFLJQKsxUuofhmeLLjUAlQPJ12P7A2iONrlfJekXt6MoNytnwkgbEcSL pCVwSaaDVZ2IZJz8v2snw3umLOU4YGMiXQIjooP7MTLUmaER+KRahoOiSnC+nBrZF6HW+AWloIJ /D2czylDaAYoUIQoXWtBYgRvrYu1OvZOOP7NyaYcqcxI1zZjTf6YPkuYazzerGy7jBL07C64Yhs aXOiUm5O4BZzQSw== X-Developer-Key: i=daniel@riscstar.com; a=openpgp; fpr=E38BE19861669213F6E2661AA8A4E3BC5B7B28BE X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= The enable_dma_irq/disasble_dma_irq functions take two booleans, rx and tx that identify which interrupts should be disabled. Replace these with a single bitflag argument, group. This allows a third group to be added which is used to enable/disable other sources of DMA interrupt, specifically normal and abnormal summary interrupts which are grouped together as "other". These changes certainly improve callsite readability, although the real motivation for the change if to support future changes that need to mask "other" DMA IRQ interrupts. There is a very subtle difference introduced by this patch. The sites that use STMMAC_DMA_IRQ_ALL would previously only have enabled STMMAC_DMA_IRQ_RXTX. This will not cause any change of behaviour because the other interrupts are already enabled in all these cases. STMMAC_DMA_IRQ_ALL has been used in each of these cases to provide clarify of intent. Signed-off-by: Daniel Thompson --- drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 12 ++++----- drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h | 4 +-- drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 29 ++++++++++++++-------- drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h | 4 +-- drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c | 29 ++++++++++++++-------- drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c | 29 ++++++++++++++-------- drivers/net/ethernet/stmicro/stmmac/hwif.h | 10 ++++++-- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 26 +++++++++---------- 8 files changed, 88 insertions(+), 55 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c index 48c52eb9623356b12b39e5c0105d745e237007d6..af7acfc7a26fa4f00bad0901b9fb91d9ce532854 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c @@ -347,13 +347,13 @@ static void sun8i_dwmac_dump_mac_regs(struct mac_device_info *hw, static void sun8i_dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan, - bool rx, bool tx) + u32 flags) { u32 value = readl(ioaddr + EMAC_INT_EN); - if (rx) + if (flags & STMMAC_DMA_IRQ_RX) value |= EMAC_RX_INT; - if (tx) + if (flags & STMMAC_DMA_IRQ_TX) value |= EMAC_TX_INT; writel(value, ioaddr + EMAC_INT_EN); @@ -361,13 +361,13 @@ static void sun8i_dwmac_enable_dma_irq(struct stmmac_priv *priv, static void sun8i_dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan, - bool rx, bool tx) + u32 flags) { u32 value = readl(ioaddr + EMAC_INT_EN); - if (rx) + if (flags & STMMAC_DMA_IRQ_RX) value &= ~EMAC_RX_INT; - if (tx) + if (flags & STMMAC_DMA_IRQ_TX) value &= ~EMAC_TX_INT; writel(value, ioaddr + EMAC_INT_EN); diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h index 43b036d4e95bdde882ab79e57e7cf6e0b9cb2e39..ca8caade68079252de0d2c4805387f8e07a56f22 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h @@ -175,9 +175,9 @@ static inline u32 dma_chanx_base_addr(const struct dwmac4_addrs *addrs, int dwmac4_dma_reset(void __iomem *ioaddr); void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx); + u32 chan, u32 group); void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx); + u32 chan, u32 group); void dwmac4_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan); void dwmac4_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr, diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c index a0249715fafafdf8c93d1535a15b73daed1168cb..7c5881ca61e8bb586b6d6f791a3fb1c122c814bb 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c @@ -109,30 +109,39 @@ void dwmac4_set_rx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr, writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(dwmac4_addrs, chan)); } +static u32 dwmac4_enable_dma_mask(u32 group) +{ + u32 mask = 0; + + if (group & STMMAC_DMA_IRQ_RX) + mask |= DMA_CHAN_INTR_ENA_RIE; + if (group & STMMAC_DMA_IRQ_TX) + mask |= DMA_CHAN_INTR_ENA_TIE; + if (group & STMMAC_DMA_IRQ_OTHER) + mask |= DMA_CHAN_INTR_DEFAULT_MASK & + ~(DMA_CHAN_INTR_ENA_RIE | DMA_CHAN_INTR_ENA_TIE); + + return mask; +} + void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx) + u32 chan, u32 group) { const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan)); - if (rx) - value |= DMA_CHAN_INTR_ENA_RIE; - if (tx) - value |= DMA_CHAN_INTR_ENA_TIE; + value |= dwmac4_enable_dma_mask(group); writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan)); } void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx) + u32 chan, u32 group) { const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan)); - if (rx) - value &= ~DMA_CHAN_INTR_ENA_RIE; - if (tx) - value &= ~DMA_CHAN_INTR_ENA_TIE; + value &= ~dwmac4_enable_dma_mask(group); writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan)); } diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h b/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h index e1c37ac2c99d2ff5be3aa64cab4812821ec60e91..6b4cad57610ca7f391a9baa0871ef7060df29896 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h @@ -145,9 +145,9 @@ static inline u32 dma_chan_base_addr(u32 base, u32 chan) void dwmac_enable_dma_transmission(void __iomem *ioaddr, u32 chan); void dwmac_enable_dma_reception(void __iomem *ioaddr, u32 chan); void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx); + u32 chan, u32 group); void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx); + u32 chan, u32 group); void dwmac_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan); void dwmac_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr, diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c b/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c index a0383f9486c2db08bff5a62006857c335721966a..d7465271985466c6cbd867c35ebc57a661fce64b 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac_lib.c @@ -38,28 +38,37 @@ void dwmac_enable_dma_reception(void __iomem *ioaddr, u32 chan) writel(1, ioaddr + DMA_CHAN_RCV_POLL_DEMAND(chan)); } +static u32 dwmac_enable_dma_mask(u32 group) +{ + u32 mask = 0; + + if (group & STMMAC_DMA_IRQ_RX) + mask |= DMA_INTR_DEFAULT_RX; + if (group & STMMAC_DMA_IRQ_TX) + mask |= DMA_INTR_DEFAULT_TX; + if (group & STMMAC_DMA_IRQ_OTHER) + mask |= DMA_INTR_DEFAULT_MASK & + ~(DMA_INTR_DEFAULT_RX | DMA_INTR_DEFAULT_TX); + + return mask; +} + void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx) + u32 chan, u32 group) { u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan)); - if (rx) - value |= DMA_INTR_DEFAULT_RX; - if (tx) - value |= DMA_INTR_DEFAULT_TX; + value |= dwmac_enable_dma_mask(group); writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan)); } void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx) + u32 chan, u32 group) { u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan)); - if (rx) - value &= ~DMA_INTR_DEFAULT_RX; - if (tx) - value &= ~DMA_INTR_DEFAULT_TX; + value &= ~dwmac_enable_dma_mask(group); writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan)); } diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c index ff83858ebc1f33aa8092a2d83018bd5f96b7eead..63459d1a73a95b4fecedc39dbcde31c21a87dc47 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c @@ -228,30 +228,39 @@ static void dwxgmac2_dma_tx_mode(struct stmmac_priv *priv, void __iomem *ioaddr, writel(value, ioaddr + XGMAC_MTL_TXQ_OPMODE(channel)); } +static u32 dwxgmac2_enable_dma_mask(u32 group) +{ + u32 mask = 0; + + if (group & STMMAC_DMA_IRQ_RX) + mask |= XGMAC_DMA_INT_DEFAULT_RX; + if (group & STMMAC_DMA_IRQ_TX) + mask |= XGMAC_DMA_INT_DEFAULT_TX; + if (group & STMMAC_DMA_IRQ_OTHER) + mask |= XGMAC_DMA_INT_DEFAULT_EN & + ~(XGMAC_DMA_INT_DEFAULT_RX | XGMAC_DMA_INT_DEFAULT_TX); + + return mask; +} + static void dwxgmac2_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan, - bool rx, bool tx) + u32 group) { u32 value = readl(ioaddr + XGMAC_DMA_CH_INT_EN(chan)); - if (rx) - value |= XGMAC_DMA_INT_DEFAULT_RX; - if (tx) - value |= XGMAC_DMA_INT_DEFAULT_TX; + value |= dwxgmac2_enable_dma_mask(group); writel(value, ioaddr + XGMAC_DMA_CH_INT_EN(chan)); } static void dwxgmac2_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan, - bool rx, bool tx) + u32 group) { u32 value = readl(ioaddr + XGMAC_DMA_CH_INT_EN(chan)); - if (rx) - value &= ~XGMAC_DMA_INT_DEFAULT_RX; - if (tx) - value &= ~XGMAC_DMA_INT_DEFAULT_TX; + value &= ~dwxgmac2_enable_dma_mask(group); writel(value, ioaddr + XGMAC_DMA_CH_INT_EN(chan)); } diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.h b/drivers/net/ethernet/stmicro/stmmac/hwif.h index 5e2654c91b4171da0e6143671dade4d62c750e2f..766a36e4fab6619a031e0baeae965f3794b1cbe1 100644 --- a/drivers/net/ethernet/stmicro/stmmac/hwif.h +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.h @@ -163,6 +163,12 @@ struct stmmac_desc_ops { struct stmmac_dma_cfg; struct dma_features; +#define STMMAC_DMA_IRQ_RX BIT(0) +#define STMMAC_DMA_IRQ_TX BIT(1) +#define STMMAC_DMA_IRQ_OTHER BIT(2) +#define STMMAC_DMA_IRQ_TXRX (STMMAC_DMA_IRQ_TX | STMMAC_DMA_IRQ_RX) +#define STMMAC_DMA_IRQ_ALL (STMMAC_DMA_IRQ_TXRX | STMMAC_DMA_IRQ_OTHER) + /* Specific DMA helpers */ struct stmmac_dma_ops { /* DMA core initialization */ @@ -194,9 +200,9 @@ struct stmmac_dma_ops { void (*enable_dma_transmission)(void __iomem *ioaddr, u32 chan); void (*enable_dma_reception)(void __iomem *ioaddr, u32 chan); void (*enable_dma_irq)(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx); + u32 chan, u32 group); void (*disable_dma_irq)(struct stmmac_priv *priv, void __iomem *ioaddr, - u32 chan, bool rx, bool tx); + u32 chan, u32 group); void (*start_tx)(struct stmmac_priv *priv, void __iomem *ioaddr, u32 chan); void (*stop_tx)(struct stmmac_priv *priv, void __iomem *ioaddr, diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index b837e8e27a352e15c0967cc12773fe18a100a2a5..7b80fe66cf199adbd31b79a484b2970aef211b51 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -2515,7 +2515,7 @@ static void stmmac_enable_all_dma_irq(struct stmmac_priv *priv) unsigned long flags; spin_lock_irqsave(&ch->lock, flags); - stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 1, 1); + stmmac_enable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_ALL); spin_unlock_irqrestore(&ch->lock, flags); } } @@ -3088,7 +3088,7 @@ static int stmmac_napi_check(struct stmmac_priv *priv, u32 chan, u32 dir) if ((status & handle_rx) && (chan < priv->plat->rx_queues_to_use)) { if (napi_schedule_prep(rx_napi)) { spin_lock_irqsave(&ch->lock, flags); - stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 0); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_RX); spin_unlock_irqrestore(&ch->lock, flags); __napi_schedule(rx_napi); } @@ -3097,7 +3097,7 @@ static int stmmac_napi_check(struct stmmac_priv *priv, u32 chan, u32 dir) if ((status & handle_tx) && (chan < priv->plat->tx_queues_to_use)) { if (napi_schedule_prep(tx_napi)) { spin_lock_irqsave(&ch->lock, flags); - stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 0, 1); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TX); spin_unlock_irqrestore(&ch->lock, flags); __napi_schedule(tx_napi); } @@ -3291,7 +3291,7 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv) /* DMA CSR Channel configuration */ for (chan = 0; chan < dma_csr_ch; chan++) { stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan); - stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 1); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TXRX); } /* DMA RX Channel Configuration */ @@ -3365,7 +3365,7 @@ static enum hrtimer_restart stmmac_tx_timer(struct hrtimer *t) unsigned long flags; spin_lock_irqsave(&ch->lock, flags); - stmmac_disable_dma_irq(priv, priv->ioaddr, ch->index, 0, 1); + stmmac_disable_dma_irq(priv, priv->ioaddr, ch->index, STMMAC_DMA_IRQ_TX); spin_unlock_irqrestore(&ch->lock, flags); __napi_schedule(napi); } @@ -6013,7 +6013,7 @@ static int stmmac_napi_poll_rx(struct napi_struct *napi, int budget) unsigned long flags; spin_lock_irqsave(&ch->lock, flags); - stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 1, 0); + stmmac_enable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_RX); spin_unlock_irqrestore(&ch->lock, flags); } @@ -6042,7 +6042,7 @@ static int stmmac_napi_poll_tx(struct napi_struct *napi, int budget) unsigned long flags; spin_lock_irqsave(&ch->lock, flags); - stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 0, 1); + stmmac_enable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TX); spin_unlock_irqrestore(&ch->lock, flags); } @@ -6095,7 +6095,7 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget) /* Both RX and TX work done are complete, * so enable both RX & TX IRQs. */ - stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 1, 1); + stmmac_enable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TXRX); spin_unlock_irqrestore(&ch->lock, flags); } @@ -7032,7 +7032,7 @@ void stmmac_disable_rx_queue(struct stmmac_priv *priv, u32 queue) unsigned long flags; spin_lock_irqsave(&ch->lock, flags); - stmmac_disable_dma_irq(priv, priv->ioaddr, queue, 1, 0); + stmmac_disable_dma_irq(priv, priv->ioaddr, queue, STMMAC_DMA_IRQ_RX); spin_unlock_irqrestore(&ch->lock, flags); stmmac_stop_rx_dma(priv, queue); @@ -7072,7 +7072,7 @@ void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue) stmmac_start_rx_dma(priv, queue); spin_lock_irqsave(&ch->lock, flags); - stmmac_enable_dma_irq(priv, priv->ioaddr, queue, 1, 0); + stmmac_enable_dma_irq(priv, priv->ioaddr, queue, STMMAC_DMA_IRQ_RX); spin_unlock_irqrestore(&ch->lock, flags); } @@ -7082,7 +7082,7 @@ void stmmac_disable_tx_queue(struct stmmac_priv *priv, u32 queue) unsigned long flags; spin_lock_irqsave(&ch->lock, flags); - stmmac_disable_dma_irq(priv, priv->ioaddr, queue, 0, 1); + stmmac_disable_dma_irq(priv, priv->ioaddr, queue, STMMAC_DMA_IRQ_TX); spin_unlock_irqrestore(&ch->lock, flags); stmmac_stop_tx_dma(priv, queue); @@ -7123,7 +7123,7 @@ void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue) stmmac_start_tx_dma(priv, queue); spin_lock_irqsave(&ch->lock, flags); - stmmac_enable_dma_irq(priv, priv->ioaddr, queue, 0, 1); + stmmac_enable_dma_irq(priv, priv->ioaddr, queue, STMMAC_DMA_IRQ_TX); spin_unlock_irqrestore(&ch->lock, flags); } @@ -7191,7 +7191,7 @@ int stmmac_xdp_open(struct net_device *dev) /* DMA CSR Channel configuration */ for (chan = 0; chan < dma_csr_ch; chan++) { stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan); - stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 1); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TXRX); } /* Adjust Split header */ From patchwork Thu Oct 15 14:55:02 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Thompson X-Patchwork-Id: 3630 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sto.lore.kernel.org (sto.lore.kernel.org [172.232.135.74]) by mxe881.netcup.net (Postfix) with ESMTPS id 9928F1C2277 for ; Thu, 15 Oct 2026 17:17:28 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=riscstar-com.20251104.gappssmtp.com; spf=pass (sender IP is 172.232.135.74) smtp.mailfrom=linux-sunxi+bounces-26672-noreply=patchwork.local@lists.linux.dev smtp.helo=sto.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.232.135.74 as permitted sender) client-ip=172.232.135.74; envelope-from=linux-sunxi+bounces-26672-noreply=patchwork.local@lists.linux.dev; helo=sto.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sto.lore.kernel.org (Postfix) with ESMTP id 81C3661CC0A for ; Thu, 15 Oct 2026 15:01:17 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 42E2653C3B3; Thu, 15 Oct 2026 14:58:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=riscstar-com.20251104.gappssmtp.com header.i=@riscstar-com.20251104.gappssmtp.com header.b="siNHpLFS" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (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 6A3FE3D6CC3 for ; Thu, 15 Oct 2026 14:58:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792076302; cv=none; b=QYZS+BhP8ZBIk2fvwrP66ZZH3CTzMraz0h5bYL5AWx1gWu0i2adIdZCUh2dDrlp1tNbmhylqWoUJ03bor+xvVXSWy5frT8h6vOYUVjjq4Jsq0aecmrdE9h0dik8LgvDnH6R1YZmNdcbfopvo6h2I9vpsk8POJeECcweu1Z4oJbo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792076302; c=relaxed/simple; bh=Xmsh8vLkxa+urAg9ZzBey5HhQUknHpXB+xWvp5JB6io=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bksxxxltbbKoQKXtcNJgELc5VNMJB6B0MsKWaPPKZH+Eb6J1+t2wk3C3lUC9NNnj4saHZyXTnlNxa/RXKFhRIjJ6LsxaK1PpV2tg26E9tgVjYPG2GdM63+rapOkjilDztanAS+aAzbvzHffVFNpHvMbVb5xYZxUHKNkphHoMTNs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=riscstar.com; spf=pass smtp.mailfrom=riscstar.com; dkim=pass (2048-bit key) header.d=riscstar-com.20251104.gappssmtp.com header.i=@riscstar-com.20251104.gappssmtp.com header.b=siNHpLFS; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=riscstar.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=riscstar.com Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-48c4be28b82so545134f8f.2 for ; Thu, 15 Oct 2026 07:58:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=riscstar-com.20251104.gappssmtp.com; s=20251104; t=1792076295; x=1792681095; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HM+R+mbJK8RLBqpDdx1wr25PKa74we7OacPAq9nMC0I=; b=siNHpLFSghf/vUoWdY4Q4k3sBp710oDzps63YP1TwKn5kKCBM1xx8xpz61SMfcubNE UWRI/msDfGVynwYIRQ8hVzOmUAO06zMCvsGxPNxmW7b64JoW1KopAWz37GVF11KgiyuG I/TrFYFSBchpInmSk4cfPqpEzT/xLUF5nxZMx8cg9G+BZAStoDX4b5nlyHIo4CB4Fm0S orPNyNBXqamOMhLNMTyLsfoOZZttHc9Tp3eaDLQR5lIg0bwzLBs3eFImK449/fW9fDKH 4a140OMkLCCs8McFwmC9PN5pO0jO7X5qb1AdBked1i8yg2vrZ1k+OAdGXkhFSuuIUrIv Ex9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792076295; x=1792681095; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=HM+R+mbJK8RLBqpDdx1wr25PKa74we7OacPAq9nMC0I=; b=fEbUIOg7jpU59SFy8Cs26lqjvkFKvN6eCzBsCTYCACdHkXppjLy2uu/BEZu/Qmv5BV V7thGaCCshASqtuHPKYYmh6jK+QfdAo5FlNP1EtHPunPWqKuoVCvQR2NAYsUd6iKQH7U 7KwEwg+zC+iE5O6LAROK9Y62mug89TFNidBHYyPMN2aalxf934nMMnSBBLhMbDmvdJ1u Wbmi6WsRyoz7CDUsr4KJATtLzngL1odN9tLcEV9+VO1JteuIq7WvcccITccbI6I6IRVE yzOFJsjiNmFprchPMJdiPUofy7IURdcefYdQcn+v/xcsfiWAi9yRybaZMhs6XWUxGn2J Cqew== X-Forwarded-Encrypted: i=1; AKwUvBzZHWQml+kqWM9IbsOE+lx6SZ7oOnxIC+qF+osCbWpIac7CL9OC/xjmICrsGkzO836H8UK7wB+kiqb0xw==@lists.linux.dev X-Gm-Message-State: AFq9FYKNhKdEZ7S4YTuRfGzA5PGEdIKL0Wvxzlu7g4GcqoL0w8oVppVy Ka9aMsPN2WWp+mIcHhTZtyvfdEpvSRE+F6AD59fs3Ul1tt14uF/TzBWncfcXTX0RAzU= X-Gm-Gg: AYBFou0Mnp1Vv+nOy0v7apleOWHLSEqgDOtTq5I2bM2O/asMaawr2063AtoHxRtaQa7 7qkaz9wAaUMnFlOJQg4l55jsU7kT1Aw6mxOkWsNkfHC8yuZQZyh5sdwGaehbbyo/PfFTamsz9Wt pvKt3tf1vm3VwRxkKzrGRI7I1kceml5xr1EqW9krc4YvcfDt/kYbcUHKB+0Iqm1qRE4v4ObVcbM O2PScP8KKZGJVCgvOI9GVffuZIDoJNNK4v1GdNq4U7xkBYZYoazKQb1fuy2b+j2aYq1QMXBgYqv 2+TqJUjuPZaCeWrvXC+OwV/nUgneHQj3WMzDXIsNNLR5SADD6vf3djFQXSeIiHYcCNq/mAgkagN 2srGYu7aCJBxMhzTSH5I3yQPcCWudathgxQrv8a4tpL23gJFe9KjSrepPDUBEP39Vp58/JPuchS 8buQ3Db95+Bwm7VrJs08YgzBwaeuwxUZYDRIelzaOvyUgcqmSJ2r1SdktGMk6c234f/pAa+Qkng U+QdyWu8CuscizHEVVEJzuk5ttE/+bv+3Pvljy5J34CHevq2XqIAD0+/FOrWJxeOpAoJb/wpu8j dCbFwsrNIXthu9noT6mtU67JAzm9+t3KDIN8eku82Rmvn8BxfkjDHiNjZaQKccx1uok1Cw== X-Received: by 2002:a5d:43c4:0:b0:48d:ba3b:af36 with SMTP id ffacd0b85a97d-48dbaae8e33mr30543201f8f.37.1792076295196; Thu, 15 Oct 2026 07:58:15 -0700 (PDT) Received: from aspen.lan (aztw-33-b2-v4wan-169864-cust3247.vm26.cable.virginm.net. [92.239.204.176]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48de0ac4fd7sm19738293f8f.40.2026.10.15.07.58.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 07:58:14 -0700 (PDT) From: Daniel Thompson Date: Thu, 15 Oct 2026 15:55:02 +0100 Subject: [PATCH net-next v3 2/2] net: stmmac: Avoid freeing and re-requesting IRQ during XDP set prog Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20261015-tc956x-stmmac-no_irq_teardown-v3-2-8189870be545@riscstar.com> References: <20261015-tc956x-stmmac-no_irq_teardown-v3-0-8189870be545@riscstar.com> In-Reply-To: <20261015-tc956x-stmmac-no_irq_teardown-v3-0-8189870be545@riscstar.com> To: Andrew Lunn , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Maxime Coquelin , Alexandre Torgue , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Maxime Chevallier , Eric Dumazet , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Eric Dumazet Cc: Alex Elder , netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-sunxi@lists.linux.dev, Daniel Thompson X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5397; i=daniel@riscstar.com; h=from:subject:message-id; bh=Xmsh8vLkxa+urAg9ZzBey5HhQUknHpXB+xWvp5JB6io=; b=owEBbQKS/ZANAwAKAXzjJV0594ihAcsmYgBq0On0886l08HHREvWrJqdn0hcWlbVy9OPSK05v 3jBqmxmICCJAjMEAAEKAB0WIQQvNUFTUPeVarpwrPB84yVdOfeIoQUCatDp9AAKCRB84yVdOfeI oVUJD/9PRRiCUW/mNpgCqony21Y+ly09GrfxL7uqhj8q7gbv3J7MfZzTgMES0M6JKRyOUTAWMbW mdRzY0OHRDgRt01w5WKjbMjHKriUKKfk40tc7BLkyYmI2DRz3uAYVE5e5Nh7GLXylUtF9z/QtF9 YjFgKjuhdfSknG+uoXjgTwASLwOAjFHoHdkgOE3Q+8akX0b99GZb+WRvbNxXVEnTrgBjd65cMvK U49YCfVG3Y4LkLOhZHNWRjs+NzvBvU0DqHF93X9cMQzzaFG47gaWbzwIcUEgsvTm5U0U+wbwLKS zFccajtkdEBVDGQdvdtLre3N+JRcuyEM///kbv4u/PgqFeTrcnpjiwuQXOaFHz4dX5fgRVGXSGM RxRl/xUENymJW+9VIdG4SDmIsKVrZ+K9K4smCGuki9lHJm2ev5j5ruLxN8ePCOZx+hhzi3ODiX7 sPkd0pIyACcYwhdR264p7xgILqRgTjje1USdjq+0TiVtd9hTSbIsW+/8BtC0JDxOBI1lfZwOtzW lPy/dGg/KH02/QaJYKzf0KIxxiVIk62+9KMYdt7JH9IIMY4HjVrq67ocMu09Fs+hB9V4u1+jusd TOBMZnXTwmhsWV+nTxj6CloIkRFtCsiUncePB8XlUuKBOBuFiF4iOzGL2Ip6bmD25BIV+jdKDSN +q/Y6jCTmK2tnHg== X-Developer-Key: i=daniel@riscstar.com; a=openpgp; fpr=E38BE19861669213F6E2661AA8A4E3BC5B7B28BE X-Rspamd-Server: rspamd-worker-8404 X-Spamd-Result: default: False [-1.16 / 15.00]; BAYES_HAM(-5.50)[100.00%]; RBL_SENDERSCORE(2.00)[172.232.135.74:from]; SUSPICIOUS_RECIPS(1.50)[]; DMARC_POLICY_SOFTFAIL(1.00)[riscstar.com : SPF not aligned (relaxed), No valid DKIM,none]; MAILLIST(-0.15)[generic]; BAD_REP_POLICIES(0.10)[]; MIME_GOOD(-0.10)[text/plain]; HAS_LIST_UNSUB(-0.01)[]; FROM_HAS_DN(0.00)[]; ARC_ALLOW(0.00)[subspace.kernel.org:s=arc-20240116:i=1]; PRECEDENCE_BULK(0.00)[]; TAGGED_RCPT(0.00)[netdev]; FORGED_SENDER_MAILLIST(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[riscstar.com:email,sto.lore.kernel.org:rdns,sto.lore.kernel.org:helo]; RCPT_COUNT_TWELVE(0.00)[25]; RCVD_COUNT_FIVE(0.00)[6]; ASN(0.00)[asn:63949, ipnet:172.232.128.0/19, country:SG]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(0.00)[+ip4:172.232.135.74]; RECEIVED_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[92.239.204.176:received,100.90.174.1:received,209.85.221.46:received]; RBL_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[172.232.135.74:from]; FROM_NEQ_ENVFROM(0.00)[daniel@riscstar.com,linux-sunxi@lists.linux.dev]; FREEMAIL_TO(0.00)[lunn.ch,davemloft.net,kernel.org,redhat.com,gmail.com,foss.st.com,iogearbox.net,fomichev.me,bootlin.com,sholland.org]; MIME_TRACE(0.00)[0:+]; TAGGED_FROM(0.00)[bounces-26672-noreply=patchwork.local]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_TLS_LAST(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[] X-Rspamd-Queue-Id: 9928F1C2277 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= Currently stmmac will run a full cycle of IRQ tear down and setup when setting up a new XDP program. This makes tuning TSN systems difficult because whenever a new XDP program is installed then the irq threads will be stopped and restarted which will undo any thread tuning. The problem is avoided by removing stmmac_free_irq()/stmmac_request_irq() from stmmac_xdp_release()/stmmac_xdp_open(). stmmac_free_irq() implicitly synchronizes interrupts and, with that removed, nothing else disables interrupts or makes later actions by stmmac_xdp_release() safe when there are concurrent interrupts. Thus we must replace the code to free the IRQ with code to disable (and sync) DMA interrupts. We also need to avoid re-initializing the DMA channel. Happily the reinit is redundant, it is sufficient to rely on the re-enabling of interrupts at the end of stmmac_xdp_open(). Signed-off-by: Daniel Thompson --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 65 +++++++++++++++++------ 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 7b80fe66cf199adbd31b79a484b2970aef211b51..f1359637007e211b505dd74577232cdc079baf46 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -144,6 +144,7 @@ static const char *stmmac_dwxgmac_phyif[4] = { [PHY_INTF_RGMII] = "RGMII", }; +static void stmmac_synchronize_irq(struct net_device *dev); static irqreturn_t stmmac_interrupt(int irq, void *dev_id); /* For MSI interrupts handling */ static irqreturn_t stmmac_mac_interrupt(int irq, void *dev_id); @@ -2520,6 +2521,23 @@ static void stmmac_enable_all_dma_irq(struct stmmac_priv *priv) } } +static void stmmac_disable_all_dma_irq(struct stmmac_priv *priv) +{ + u8 rx_channels_count = priv->plat->rx_queues_to_use; + u8 tx_channels_count = priv->plat->tx_queues_to_use; + u8 dma_csr_ch = max(rx_channels_count, tx_channels_count); + u8 chan; + + for (chan = 0; chan < dma_csr_ch; chan++) { + struct stmmac_channel *ch = &priv->channel[chan]; + unsigned long flags; + + spin_lock_irqsave(&ch->lock, flags); + stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_ALL); + spin_unlock_irqrestore(&ch->lock, flags); + } +} + /** * stmmac_start_all_dma - start all RX and TX DMA channels * @priv: driver private structure @@ -3816,6 +3834,33 @@ static void stmmac_free_irq(struct net_device *dev, } } +static void stmmac_synchronize_irq(struct net_device *dev) +{ + struct stmmac_priv *priv = netdev_priv(dev); + struct stmmac_msi *msi = priv->msi; + int j; + + for (j = priv->plat->tx_queues_to_use - 1; msi && j >= 0; j--) { + if (msi->tx_irq[j] > 0) + synchronize_irq(msi->tx_irq[j]); + } + + for (j = priv->plat->rx_queues_to_use - 1; msi && j >= 0; j--) { + if (msi->rx_irq[j] > 0) + synchronize_irq(msi->rx_irq[j]); + } + + if (msi && msi->sfty_ue_irq > 0 && msi->sfty_ue_irq != dev->irq) + synchronize_irq(msi->sfty_ue_irq); + if (msi && msi->sfty_ce_irq > 0 && msi->sfty_ce_irq != dev->irq) + synchronize_irq(msi->sfty_ce_irq); + if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) + synchronize_irq(priv->wol_irq); + if (priv->sfty_irq > 0 && priv->sfty_irq != dev->irq) + synchronize_irq(priv->sfty_irq); + synchronize_irq(dev->irq); +} + static int stmmac_msi_init(struct stmmac_priv *priv, struct stmmac_resources *res) { @@ -7141,8 +7186,9 @@ void stmmac_xdp_release(struct net_device *dev) for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); - /* Free the IRQ lines */ - stmmac_free_irq(dev, REQ_IRQ_ERR_ALL, 0); + /* Silence DMA interrupts */ + stmmac_disable_all_dma_irq(priv); + stmmac_synchronize_irq(dev); /* Stop TX/RX DMA channels */ stmmac_stop_all_dma(priv); @@ -7165,7 +7211,6 @@ int stmmac_xdp_open(struct net_device *dev) struct stmmac_priv *priv = netdev_priv(dev); u8 rx_cnt = priv->plat->rx_queues_to_use; u8 tx_cnt = priv->plat->tx_queues_to_use; - u8 dma_csr_ch = max(rx_cnt, tx_cnt); struct stmmac_rx_queue *rx_q; struct stmmac_tx_queue *tx_q; bool sph_en; @@ -7188,12 +7233,6 @@ int stmmac_xdp_open(struct net_device *dev) stmmac_reset_queues_param(priv); - /* DMA CSR Channel configuration */ - for (chan = 0; chan < dma_csr_ch; chan++) { - stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan); - stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TXRX); - } - /* Adjust Split header */ sph_en = (priv->hw->rx_csum > 0) && priv->sph_active; @@ -7230,10 +7269,6 @@ int stmmac_xdp_open(struct net_device *dev) /* Start Rx & Tx DMA Channels */ stmmac_start_all_dma(priv); - ret = stmmac_request_irq(dev); - if (ret) - goto irq_error; - /* Enable NAPI process*/ stmmac_enable_all_queues(priv); netif_carrier_on(dev); @@ -7242,10 +7277,6 @@ int stmmac_xdp_open(struct net_device *dev) return 0; -irq_error: - for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) - hrtimer_cancel(&priv->dma_conf.tx_queue[chan].txtimer); - init_error: free_dma_desc_resources(priv, &priv->dma_conf); dma_desc_error: