From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f50.google.com (mail-dl1-f50.google.com [74.125.82.50]) (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 739952C0282 for ; Thu, 7 May 2026 02:58:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.50 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778122726; cv=none; b=Z7DtyRYfBg27kLIDwvAhgteO/kCEim8MRKx3JQzHOWCi1leiQ3QaVFi3I+WCCqBy0p6BaZJgLCN54bU00XRiVb2i+jwWb8yXkNHd2UOeAjo6deIgxzlPW2IeUmZYJqB/H45t0hr1yW5CkDn1zTsxGeS1I81+E9g3pOuvTL6HEnE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778122726; c=relaxed/simple; bh=dgpQsNkKADGV8s+92naskib3EVb3gkNYU31XNjWFc88=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rhze0aeqIabZa/TUZYxPQSDgfqeL/5sIxbZMy84UfXSjE7+JaIAwcri5qttQEFcnpsTNP4MCkpDaNUD2pOGPfXP72UNir+Jg4nmp9P1LpGOt+te6ok/8CzrzoIM7d3AYBGFdK/IkK4YcAQabseeVoFX9AMpVuT2dXS+pscxS/wo= 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=fHk6kbr2; arc=none smtp.client-ip=74.125.82.50 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="fHk6kbr2" Received: by mail-dl1-f50.google.com with SMTP id a92af1059eb24-12c45281a06so685859c88.1 for ; Wed, 06 May 2026 19:58:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778122724; x=1778727524; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=z4KoOpyEc9o6S/LrD6WQS+XI6ueOOXXtH3KeEmS5GBU=; b=fHk6kbr2thmQPQPiL5mkDmMo7LRhTs8aA2ODt30aFs6mEY8KT8j3l10BFnZ8BwXAsX Clzoiac3DTQAOuPh6jA0WC+1bBiXyxQ3E+PSGb/pQ+aOJOvcb95b/q+WqX/Wk2D8HEbt sI/xIO9wbKuFdKTgv1z6F3zQZyHUKeS3ZF125TCF9+HgoIwSPSKKZEKz6Ax3yL47hymE 6Ju7zpNpjkybZTmD4NhL/lPAl9vmrGNOMaQ+RBecAC1CG6EeGaEw532/Qs7Cs1JNYjDl 9rE6hpoZnlJfJkBiHEuf1hkaUxg/Ke9UgRiAYrkpjGMkQghHYf6jjdD/g+33TA7f9wYc aBNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778122724; x=1778727524; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=z4KoOpyEc9o6S/LrD6WQS+XI6ueOOXXtH3KeEmS5GBU=; b=Zobu+04HklADS0Sy0nE1ljAPyBUaHY1RQKeHfaHeivKfSW+Ebmep+sEF4oafAc/93q SWDhTkHIuI6VBJhWYPWAj2zrC7Ea+CLseAebevHl5QzL6OjQ1liD+aX6HFO9mIwPlwZH BKTYBO+Skkh6weZl4YsgkbNoopC2ox52gMPnXapPzgwZ6RUe9sVxNXFsCv9y5SqPiPQj +hMPH/5GkIMIP6haodIaLJevGTvYqVx70JpwIk9V8rufK2HzID8sDMf8JN5ChLxppEBl I1ugqo+jv88m+eRTS2PWorbZvUlVpFpRqnwsV/mvOUlosY2Fm8JiF9Zal6XmKU81V90A c5UA== X-Forwarded-Encrypted: i=1; AFNElJ+HLVDUywUAcWeyO96IaVYFrO/XlJNR1+sK5wV+Fsxn/NofZ0ePPkF2uEwiAHZ/F8ovHH33ryIChU4VDaI=@vger.kernel.org X-Gm-Message-State: AOJu0YxyIGB8naQHFXPBmGs2S2Q0I2XaH8KiV+nA+Zly5p69Nh5dxanv CEj86hvZC9sA4sQDEkbaN/gj6pDUIdJuv1fjE9PvaVlaPYcUDdEhGLld X-Gm-Gg: AeBDievKEZGGS/2r465aUh8FSh5Bt92SrHstOxwb811dkCYt80UKf+veIOgFICi+Bwn ahsDFoX00V7ZD3H0N6PqPn3yKzsDoZ/OOIjvQXp5sL29ngw+/4JK1Swv/P5O1pgfQ+Oeqe6SNMC YIwUfD3lXrJ6uc1L6y8h5kGZxrhU76LuafirGe5NcoSMQMD7DQuS+Wn1d4q+QBm3F+aZvbjPq18 OJFeg8/I7EuRLrILZLyLXdpYPYMTpqzEyMW5r6be7a/EgtL7jkFwp8XvNXmA7RRlKbIj1HAVfQm YJyrCIbC5eV677z1MK0mOBt99HC9SxQWusG2DyQiwbH4t8VxUR2f+ZHekjZvu0WhgEH7vQK+GGM DAX8/VglqyhOM0/XXT14I8dvjd/tuDZEJcRIM0ZrIehTeB9++/4I7z064y6jxmCzCrdKACvgNQv Ku4KXI9AEl2OdQ/66yZ8FQmq4vTQ5Fg/hGliZQsPOV4wkrQjhAWA== X-Received: by 2002:a05:7022:f005:b0:12c:8b9:7208 with SMTP id a92af1059eb24-1318e811fffmr2977863c88.26.1778122724290; Wed, 06 May 2026 19:58:44 -0700 (PDT) Received: from tresc054937.tre-sc.gov.br ([187.65.210.13]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-131f9789e3dsm6561267c88.8.2026.05.06.19.58.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2026 19:58:43 -0700 (PDT) From: Luiz Angelo Daros de Luca Date: Wed, 06 May 2026 23:58:19 -0300 Subject: [net-next PATCH v3 2/8] net: dsa: realtek: rtl8365mb: use dsa helpers for port iteration Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260506-realtek_forward-v3-2-1d87c5f85a3b@gmail.com> References: <20260506-realtek_forward-v3-0-1d87c5f85a3b@gmail.com> In-Reply-To: <20260506-realtek_forward-v3-0-1d87c5f85a3b@gmail.com> To: Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Linus Walleij , =?utf-8?q?Alvin_=C5=A0ipraga?= , Yury Norov , Rasmus Villemoes , Russell King Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Abdulkader Alrezej , Luiz Angelo Daros de Luca X-Mailer: b4 0.15.2 Use dsa_switch_for_each_*() whenever possible. For port setup(), a new blocking setup phase was added for all ports, including unused ones, before the user and CPU port setup. CPU isolation now includes all user ports as traffic was being blocked in some scenarios (suggested by Abdulkader Alrezej). Suggested-by: Abdulkader Alrezej Reviewed-by: Linus Walleij Signed-off-by: Luiz Angelo Daros de Luca --- drivers/net/dsa/realtek/rtl8365mb.c | 115 +++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 49 deletions(-) diff --git a/drivers/net/dsa/realtek/rtl8365mb.c b/drivers/net/dsa/realtek/rtl8365mb.c index edbc16345d0d..7ddb82fcd026 100644 --- a/drivers/net/dsa/realtek/rtl8365mb.c +++ b/drivers/net/dsa/realtek/rtl8365mb.c @@ -1540,18 +1540,15 @@ static void rtl8365mb_stats_setup(struct realtek_priv *priv) { struct rtl8365mb *mb = priv->chip_data; struct dsa_switch *ds = &priv->ds; - int i; + struct dsa_port *dp; /* Per-chip global mutex to protect MIB counter access, since doing * so requires accessing a series of registers in a particular order. */ mutex_init(&mb->mib_lock); - for (i = 0; i < priv->num_ports; i++) { - struct rtl8365mb_port *p = &mb->ports[i]; - - if (dsa_is_unused_port(ds, i)) - continue; + dsa_switch_for_each_available_port(dp, ds) { + struct rtl8365mb_port *p = &mb->ports[dp->index]; /* Per-port spinlock to protect the stats64 data */ spin_lock_init(&p->stats_lock); @@ -1567,13 +1564,10 @@ static void rtl8365mb_stats_teardown(struct realtek_priv *priv) { struct rtl8365mb *mb = priv->chip_data; struct dsa_switch *ds = &priv->ds; - int i; - - for (i = 0; i < priv->num_ports; i++) { - struct rtl8365mb_port *p = &mb->ports[i]; + struct dsa_port *dp; - if (dsa_is_unused_port(ds, i)) - continue; + dsa_switch_for_each_available_port(dp, ds) { + struct rtl8365mb_port *p = &mb->ports[dp->index]; cancel_delayed_work_sync(&p->mib_work); } @@ -1632,6 +1626,9 @@ static irqreturn_t rtl8365mb_irq(int irq, void *data) for_each_set_bit(line, &line_changes, priv->num_ports) { int child_irq = irq_find_mapping(priv->irqdomain, line); + if (!child_irq) + continue; + handle_nested_irq(child_irq); } @@ -1695,13 +1692,14 @@ static int rtl8365mb_irq_disable(struct realtek_priv *priv) static int rtl8365mb_irq_setup(struct realtek_priv *priv) { struct rtl8365mb *mb = priv->chip_data; + struct dsa_switch *ds = &priv->ds; struct device_node *intc; + struct dsa_port *dp; u32 irq_trig; int virq; int irq; u32 val; int ret; - int i; intc = of_get_child_by_name(priv->dev->of_node, "interrupt-controller"); if (!intc) { @@ -1727,8 +1725,8 @@ static int rtl8365mb_irq_setup(struct realtek_priv *priv) goto out_put_node; } - for (i = 0; i < priv->num_ports; i++) { - virq = irq_create_mapping(priv->irqdomain, i); + dsa_switch_for_each_available_port(dp, ds) { + virq = irq_create_mapping(priv->irqdomain, dp->index); if (!virq) { dev_err(priv->dev, "failed to create irq domain mapping\n"); @@ -1798,9 +1796,11 @@ static int rtl8365mb_irq_setup(struct realtek_priv *priv) mb->irq = 0; out_remove_irqdomain: - for (i = 0; i < priv->num_ports; i++) { - virq = irq_find_mapping(priv->irqdomain, i); - irq_dispose_mapping(virq); + dsa_switch_for_each_available_port(dp, ds) { + virq = irq_find_mapping(priv->irqdomain, dp->index); + + if (virq) + irq_dispose_mapping(virq); } irq_domain_remove(priv->irqdomain); @@ -1815,8 +1815,9 @@ static int rtl8365mb_irq_setup(struct realtek_priv *priv) static void rtl8365mb_irq_teardown(struct realtek_priv *priv) { struct rtl8365mb *mb = priv->chip_data; + struct dsa_switch *ds = &priv->ds; + struct dsa_port *dp; int virq; - int i; if (mb->irq) { free_irq(mb->irq, priv); @@ -1824,9 +1825,11 @@ static void rtl8365mb_irq_teardown(struct realtek_priv *priv) } if (priv->irqdomain) { - for (i = 0; i < priv->num_ports; i++) { - virq = irq_find_mapping(priv->irqdomain, i); - irq_dispose_mapping(virq); + dsa_switch_for_each_available_port(dp, ds) { + virq = irq_find_mapping(priv->irqdomain, dp->index); + + if (virq) + irq_dispose_mapping(virq); } irq_domain_remove(priv->irqdomain); @@ -1943,11 +1946,11 @@ static int rtl8365mb_reset_chip(struct realtek_priv *priv) static int rtl8365mb_setup(struct dsa_switch *ds) { struct realtek_priv *priv = ds->priv; + struct dsa_port *cpu_dp, *dp; struct rtl8365mb_cpu *cpu; - struct dsa_port *cpu_dp; struct rtl8365mb *mb; + u32 userports_mask; int ret; - int i; mb = priv->chip_data; cpu = &mb->cpu; @@ -1974,44 +1977,58 @@ static int rtl8365mb_setup(struct dsa_switch *ds) else if (ret) dev_info(priv->dev, "no interrupt support\n"); + /* Start with all ports blocked, including unused ports */ + dsa_switch_for_each_port(dp, ds) { + struct rtl8365mb_port *p = &mb->ports[dp->index]; + + /* Set the initial STP state of all ports to DISABLED, otherwise + * ports will still forward frames to the CPU despite being + * administratively down by default. + */ + rtl8365mb_port_stp_state_set(ds, dp->index, BR_STATE_DISABLED); + + /* Start with all port completely isolated */ + ret = rtl8365mb_port_set_isolation(priv, dp->index, 0); + if (ret) + goto out_teardown_irq; + + /* Disable learning */ + ret = rtl8365mb_port_set_learning(priv, dp->index, false); + if (ret) + goto out_teardown_irq; + + /* Set up per-port private data */ + p->priv = priv; + p->index = dp->index; + } + + userports_mask = dsa_user_ports(ds); + /* Configure CPU tagging */ dsa_switch_for_each_cpu_port(cpu_dp, ds) { - cpu->mask |= BIT(cpu_dp->index); - + /* Use the first CPU port as trap_port */ if (cpu->trap_port == RTL8365MB_MAX_NUM_PORTS) cpu->trap_port = cpu_dp->index; + + /* Forward to all user ports */ + ret = rtl8365mb_port_set_isolation(priv, cpu_dp->index, + userports_mask); + if (ret) + goto out_teardown_irq; } + + cpu->mask = dsa_cpu_ports(ds); cpu->enable = cpu->mask > 0; ret = rtl8365mb_cpu_config(priv); if (ret) goto out_teardown_irq; - /* Configure ports */ - for (i = 0; i < priv->num_ports; i++) { - struct rtl8365mb_port *p = &mb->ports[i]; - - if (dsa_is_unused_port(ds, i)) - continue; - + /* Configure user ports */ + dsa_switch_for_each_user_port(dp, ds) { /* Forward only to the CPU */ - ret = rtl8365mb_port_set_isolation(priv, i, cpu->mask); + ret = rtl8365mb_port_set_isolation(priv, dp->index, cpu->mask); if (ret) goto out_teardown_irq; - - /* Disable learning */ - ret = rtl8365mb_port_set_learning(priv, i, false); - if (ret) - goto out_teardown_irq; - - /* Set the initial STP state of all ports to DISABLED, otherwise - * ports will still forward frames to the CPU despite being - * administratively down by default. - */ - rtl8365mb_port_stp_state_set(ds, i, BR_STATE_DISABLED); - - /* Set up per-port private data */ - p->priv = priv; - p->index = i; } ret = rtl8365mb_port_change_mtu(ds, cpu->trap_port, ETH_DATA_LEN); -- 2.54.0