From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qk1-f182.google.com (mail-qk1-f182.google.com [209.85.222.182]) (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 C929E304BDF for ; Tue, 19 May 2026 04:58:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.182 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779166708; cv=none; b=fEhmIHezG/ZigRvin1wL91ZLbj7yDOFIh3UiWe2rDJbARtwu3FiHY6v5J9X8m9EyxnCIC3UPOKIxMYXfKRufvgLnX9bQ5FwpR3u+JPJqbG7km+fe8/T6UQgncMzV5bjW6dULpk9qdmkrS6/n24S0UXyfzOM/qwBs0mm+g4vfN38= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779166708; c=relaxed/simple; bh=hMAGhmqHDyXPih7XwdU10TC/NFpFrguGzuIpkV2/cAE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fP7OrHhMLsVOezQ0xWbTFGIXkZIrgZW196s3eun834pf4ddld2RsFSbTs9dncRMRyWyTm3ljpZf7dWKTlb+Buoc8aCSoXspU/Xq0NOdzhpKHPiwRDBN94EADKImiGUgZ7llu5kfnkOwU+6XQGRgnx2AF4qMRSOZ8uXogdxcuENU= 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=KdqQQzKg; arc=none smtp.client-ip=209.85.222.182 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="KdqQQzKg" Received: by mail-qk1-f182.google.com with SMTP id af79cd13be357-911449d9d03so384096385a.1 for ; Mon, 18 May 2026 21:58:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779166706; x=1779771506; 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=FxmDMyxKH6wofU6MgwFcS09w4WkrV6gsi3er7J60bO4=; b=KdqQQzKgDF6H163n57wzhpvESKc4S+rHKqJ2+auMreDRLi8OOF653QCnBGYG+3W9Jh xqRJX7hxG9nhUGu7DPgWdR08mu8t7tmYv3CRaubgBQdEKQG3s2u0pDGoPyzpm/q65p99 vab7HZCEO0so5SXbOEP1O8j+4QGPrDXSCjW99vY++mEt7JFuaHKVZNVtSt10MSJ48gl2 xsrRGJ7YGuH0iyxlRY5SVV62CGA12RNgjVgbV3kdouQtew+/rjC5F/7jtAj0swrffz9M e0nFxE1Kj4aDOST5JNAkdvWUXiqqXSartiRwjCZn4TriCFqWMALmoMF7ZTeZXn+/6iBD cdEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779166706; x=1779771506; 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=FxmDMyxKH6wofU6MgwFcS09w4WkrV6gsi3er7J60bO4=; b=AHPucqNfTRGmRWdLDXH/QeP/ikKJLgHbPVdL2bjgHTYjEh1IzLX2E6Y6YskwGfQqgE 18qgFXaJVP/YP0sPtwAE//QkgeFUVW8CH5SrbDm9AbJEwAKK4ngK5PzjD9OTMr6Sn5Wh Rq8Mb+maBwPSDJHrpiFtRCLdI262eWAD1y7l+aHp1cbZacswCY7798HpG2fV4CPZIiNc OfztcMKymhAmNNlYiyMCu70Wp3QR+rgHc8zEeZSUnhtP4TRhpsqqd3fbjZ0blN/DMV7i osGNtKYi6PKYiZYbYu7j6Lrm1yRMpiLu4YbK8Sq9IXfXZMV9DMNFtIeN/VcKPmC5B+Pc wHKg== X-Forwarded-Encrypted: i=1; AFNElJ+oYeTm1KHwhuzF5r1/QqME6RSKrOlY92pu/Vmisn+TGnwfr0xcm5ny9AuzrS5ud2h5fVes1SCsDIeMJa8=@vger.kernel.org X-Gm-Message-State: AOJu0YyYhopvMc6Da5RNWLPcvlbE2eOIOw1quxO18gCxS8Bm9E8AyNJ4 Qsj3/ZMPwKjVzTTHh32vE+FUOsxXUozlNLtLzFnQDJ9a5Rr/QMte/q94 X-Gm-Gg: Acq92OHpzrxvJ2Mnrdd1J5n26/IhR9ZP1LMViEL/nPPxy7YAK8QB9gVpMgcnsgjlc0c J39KkTeLp5m0HBJzGolReHgTVnexnsDx2Gq0Hmh0yvoM6w+Fj0LUIYnKtUV7k/y9BR2geY2SKsU Vj/MQO0y0xnBiTIkL8Ofnji2LJE4XW4vf+cW4ERYkuXSa9iSTdzH1MQOsf3iTf+9nQO/fhT1r8B LbisWJS+7pLayazW1GcYYhMQiOUwijQYB/nPwsozbinQUmU+4P6oXxMI3yk85dcYXGg7huuj/1X 9JHtGf5IRyOVkMZLqUDhYzu7ljKa+YkvT3BEFbaRdbCloMJujxJF0GtOZZyHWd+E2rqDtQDjy4Q 8Qz8XnpGdAbsFidDCIjbJiINjbb0TQASxuhQOBVur0BTC+0rlUUCcy3Hp3wMwkQm6zMmz/D16Ej yXYCmJ4/+yXCu6rp7sJgRYOstRCVd2QJZkp9vq6Rw= X-Received: by 2002:a05:620a:1793:b0:910:8089:4909 with SMTP id af79cd13be357-911ce3327f9mr2663369985a.23.1779166705722; Mon, 18 May 2026 21:58:25 -0700 (PDT) Received: from tresc054937.tre-sc.gov.br ([187.65.210.13]) by smtp.gmail.com with ESMTPSA id af79cd13be357-9114edfd3ebsm1588593185a.23.2026.05.18.21.58.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2026 21:58:25 -0700 (PDT) From: Luiz Angelo Daros de Luca Date: Tue, 19 May 2026 01:57:57 -0300 Subject: [net-next PATCH v5 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: <20260519-realtek_forward-v5-2-cb9f702c1782@gmail.com> References: <20260519-realtek_forward-v5-0-cb9f702c1782@gmail.com> In-Reply-To: <20260519-realtek_forward-v5-0-cb9f702c1782@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 includes all user ports as traffic was being blocked in some scenarios (suggested by Abdulkader Alrezej). The driver bails out if a DSA port is detected as the driver was not tested in a cascading setup. Suggested-by: Abdulkader Alrezej Reviewed-by: Linus Walleij Signed-off-by: Luiz Angelo Daros de Luca --- drivers/net/dsa/realtek/rtl8365mb.c | 142 +++++++++++++++++++++++------------- 1 file changed, 92 insertions(+), 50 deletions(-) diff --git a/drivers/net/dsa/realtek/rtl8365mb.c b/drivers/net/dsa/realtek/rtl8365mb.c index c04786be3f79..60a21a428e13 100644 --- a/drivers/net/dsa/realtek/rtl8365mb.c +++ b/drivers/net/dsa/realtek/rtl8365mb.c @@ -1554,18 +1554,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); @@ -1581,13 +1578,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); } @@ -1646,6 +1640,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); } @@ -1709,13 +1706,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) { @@ -1744,8 +1742,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"); @@ -1815,9 +1813,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); @@ -1832,8 +1832,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); @@ -1841,9 +1842,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); @@ -1961,10 +1964,11 @@ static int rtl8365mb_setup(struct dsa_switch *ds) { struct realtek_priv *priv = ds->priv; struct rtl8365mb_cpu *cpu; - struct dsa_port *cpu_dp; + u32 downports_mask = 0; + u32 upports_mask = 0; struct rtl8365mb *mb; + struct dsa_port *dp; int ret; - int i; mb = priv->chip_data; cpu = &mb->cpu; @@ -1991,46 +1995,84 @@ static int rtl8365mb_setup(struct dsa_switch *ds) else if (ret) dev_info(priv->dev, "no interrupt support\n"); - /* Configure CPU tagging */ - dsa_switch_for_each_cpu_port(cpu_dp, ds) { - cpu->mask |= BIT(cpu_dp->index); + /* Start with all ports blocked, including unused ports */ + dsa_switch_for_each_port(dp, ds) { + struct rtl8365mb_port *p = &mb->ports[dp->index]; - if (cpu->trap_port == RTL8365MB_MAX_NUM_PORTS) - cpu->trap_port = cpu_dp->index; - } - 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_port_is_dsa(dp)) { + dev_err(ds->dev, "Cascading(DSA link) not supported\n"); + ret = -EOPNOTSUPP; + goto out_teardown_irq; + } - if (dsa_is_unused_port(ds, i)) - continue; + /* 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); - /* Forward only to the CPU */ - ret = rtl8365mb_port_set_isolation(priv, i, cpu->mask); + /* 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, i, false); + ret = rtl8365mb_port_set_learning(priv, dp->index, 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; + p->index = dp->index; + + /* Collect CPU ports. If we support cascade switches, it should + * also include the upstream DSA ports. + */ + if (!dsa_port_is_cpu(dp)) + continue; + + upports_mask |= BIT(dp->index); } + /* Configure user ports */ + dsa_switch_for_each_port(dp, ds) { + if (!dsa_port_is_user(dp)) + continue; + + /* Forward only to the CPU */ + ret = rtl8365mb_port_set_isolation(priv, dp->index, upports_mask); + if (ret) + goto out_teardown_irq; + + /* If we support cascade switches, it should also include the + * downstream DSA ports. + */ + downports_mask |= BIT(dp->index); + } + + /* Configure CPU tagging */ + /* If we support cascade switches, it should also include the upstream + * DSA ports. + */ + dsa_switch_for_each_cpu_port(dp, ds) { + /* Use the first CPU port as trap_port */ + if (cpu->trap_port == RTL8365MB_MAX_NUM_PORTS) + cpu->trap_port = dp->index; + + /* Forward to all user ports */ + ret = rtl8365mb_port_set_isolation(priv, dp->index, + downports_mask); + if (ret) + goto out_teardown_irq; + } + + cpu->mask = upports_mask; + cpu->enable = cpu->mask > 0; + + ret = rtl8365mb_cpu_config(priv); + if (ret) + goto out_teardown_irq; + ret = rtl8365mb_port_change_mtu(ds, cpu->trap_port, ETH_DATA_LEN); if (ret) goto out_teardown_irq; -- 2.54.0