Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp332927pxb; Mon, 16 Aug 2021 06:31:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJynsikzDhKvFkM2B/4OhGNffmBA3/+WlnPi8FzSBSgy9C+vj8kmDKTeFd3nw3dZlTm9sOLF X-Received: by 2002:a17:906:c831:: with SMTP id dd17mr6858351ejb.21.1629120704705; Mon, 16 Aug 2021 06:31:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629120704; cv=none; d=google.com; s=arc-20160816; b=T7xFIMXv3j/5mDS1loI/azzo7iQgnnHaZvbNcGP8Yg1qGpRSk27mHFyy5Sbh+0Sp5/ 6ERt2LovbDLyzkbKzaov/adeRTV+OpWIdOKE9QaEtStPUQq2tYBL5t5BlhSMJgN626Pg axbjI/wKBYJ4C9zCack8ZIQn2Yw8LXPls+GdYoaxd6pcoPu2Jq7rXx8MJrd1wIBFD9Wu 4+o4aGIfMchHQf/j/JsedDfiRZlOLAQfN+KNHQxiHEOVUN1abO28IEuUl7KSqA/DdYpW ifpwD2JTvBRv89+T7waIN23p5cwdHcEpvGUBgIqLvvfrbCREUzU3M3RJCwe3ZyS3GtoI YbmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=in+yQwUbIKvKN4KmbeO/Nm5mD938SaU4SacfvDtlvsw=; b=iSsTtJbNlKfjpJHXSlEjM0JH8szU2cHC6yY5CrIYJl0FkY9+0y9j6+KC6xsH+aFJ+L C9PFRB8QspjHWMgnXZxzPREzfsYciSN7HBJxj+cLuwlAZrZ5wM5g2DOYHPxuo5g0cEPK 9P/OH2y32sGDFF1oxpDmY+2Tw2L309ySGWTzxdP26KBcYHoUcb6xbqz7AF3Fvb+iEgrT iikzEiqojpiYLD5kJ2d4rydrP4N8kBGUxmx5jEaefXv2LFkjj7B5FFFpqQS+LgrJWB5T IDXg98TfkZCqCCgSseAGUmkguPYy+OpB1h3iWDv05vzUyWiFp+kfnkluvKGYRtGYHvWY A5gg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=aBdUn271; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id co10si10089647edb.200.2021.08.16.06.31.21; Mon, 16 Aug 2021 06:31:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=aBdUn271; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240396AbhHPN2e (ORCPT + 99 others); Mon, 16 Aug 2021 09:28:34 -0400 Received: from mail.kernel.org ([198.145.29.99]:44230 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239656AbhHPNSK (ORCPT ); Mon, 16 Aug 2021 09:18:10 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 758C8632F9; Mon, 16 Aug 2021 13:13:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1629119625; bh=X8NKRLGz8e8PimhZQl7d/Gas/88Ik0dokun3w6gMjN8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aBdUn271/k5tb1yUw3+ry9L221XmAAiFOq1nsD29sQWpu+Aa7/LqjBZxicXdo/qkz G/W77NwM90Jucqor9ceZBrWM5hg0BZ3k61hnqQi9cWTAnu1XmH4HRIqSwKgbggg26v VQSSeeVhLlPb4KpTZmfUA7gLH7dYmg32DYExgYeU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Oleksij Rempel , "David S. Miller" , Sasha Levin Subject: [PATCH 5.13 065/151] net: dsa: qca: ar9331: make proper initial port defaults Date: Mon, 16 Aug 2021 15:01:35 +0200 Message-Id: <20210816125446.205760045@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210816125444.082226187@linuxfoundation.org> References: <20210816125444.082226187@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Oleksij Rempel [ Upstream commit 47fac45600aafc5939d9620055c3c46f7135d316 ] Make sure that all external port are actually isolated from each other, so no packets are leaked. Fixes: ec6698c272de ("net: dsa: add support for Atheros AR9331 built-in switch") Signed-off-by: Oleksij Rempel Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/dsa/qca/ar9331.c | 73 +++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/qca/ar9331.c b/drivers/net/dsa/qca/ar9331.c index 6686192e1883..563d8a279030 100644 --- a/drivers/net/dsa/qca/ar9331.c +++ b/drivers/net/dsa/qca/ar9331.c @@ -101,6 +101,23 @@ AR9331_SW_PORT_STATUS_RX_FLOW_EN | AR9331_SW_PORT_STATUS_TX_FLOW_EN | \ AR9331_SW_PORT_STATUS_SPEED_M) +#define AR9331_SW_REG_PORT_CTRL(_port) (0x104 + (_port) * 0x100) +#define AR9331_SW_PORT_CTRL_HEAD_EN BIT(11) +#define AR9331_SW_PORT_CTRL_PORT_STATE GENMASK(2, 0) +#define AR9331_SW_PORT_CTRL_PORT_STATE_DISABLED 0 +#define AR9331_SW_PORT_CTRL_PORT_STATE_BLOCKING 1 +#define AR9331_SW_PORT_CTRL_PORT_STATE_LISTENING 2 +#define AR9331_SW_PORT_CTRL_PORT_STATE_LEARNING 3 +#define AR9331_SW_PORT_CTRL_PORT_STATE_FORWARD 4 + +#define AR9331_SW_REG_PORT_VLAN(_port) (0x108 + (_port) * 0x100) +#define AR9331_SW_PORT_VLAN_8021Q_MODE GENMASK(31, 30) +#define AR9331_SW_8021Q_MODE_SECURE 3 +#define AR9331_SW_8021Q_MODE_CHECK 2 +#define AR9331_SW_8021Q_MODE_FALLBACK 1 +#define AR9331_SW_8021Q_MODE_NONE 0 +#define AR9331_SW_PORT_VLAN_PORT_VID_MEMBER GENMASK(25, 16) + /* MIB registers */ #define AR9331_MIB_COUNTER(x) (0x20000 + ((x) * 0x100)) @@ -371,12 +388,60 @@ static int ar9331_sw_mbus_init(struct ar9331_sw_priv *priv) return 0; } -static int ar9331_sw_setup(struct dsa_switch *ds) +static int ar9331_sw_setup_port(struct dsa_switch *ds, int port) { struct ar9331_sw_priv *priv = (struct ar9331_sw_priv *)ds->priv; struct regmap *regmap = priv->regmap; + u32 port_mask, port_ctrl, val; int ret; + /* Generate default port settings */ + port_ctrl = FIELD_PREP(AR9331_SW_PORT_CTRL_PORT_STATE, + AR9331_SW_PORT_CTRL_PORT_STATE_FORWARD); + + if (dsa_is_cpu_port(ds, port)) { + /* CPU port should be allowed to communicate with all user + * ports. + */ + port_mask = dsa_user_ports(ds); + /* Enable Atheros header on CPU port. This will allow us + * communicate with each port separately + */ + port_ctrl |= AR9331_SW_PORT_CTRL_HEAD_EN; + } else if (dsa_is_user_port(ds, port)) { + /* User ports should communicate only with the CPU port. + */ + port_mask = BIT(dsa_upstream_port(ds, port)); + } else { + /* Other ports do not need to communicate at all */ + port_mask = 0; + } + + val = FIELD_PREP(AR9331_SW_PORT_VLAN_8021Q_MODE, + AR9331_SW_8021Q_MODE_NONE) | + FIELD_PREP(AR9331_SW_PORT_VLAN_PORT_VID_MEMBER, port_mask); + + ret = regmap_write(regmap, AR9331_SW_REG_PORT_VLAN(port), val); + if (ret) + goto error; + + ret = regmap_write(regmap, AR9331_SW_REG_PORT_CTRL(port), port_ctrl); + if (ret) + goto error; + + return 0; +error: + dev_err(priv->dev, "%s: error: %i\n", __func__, ret); + + return ret; +} + +static int ar9331_sw_setup(struct dsa_switch *ds) +{ + struct ar9331_sw_priv *priv = (struct ar9331_sw_priv *)ds->priv; + struct regmap *regmap = priv->regmap; + int ret, i; + ret = ar9331_sw_reset(priv); if (ret) return ret; @@ -402,6 +467,12 @@ static int ar9331_sw_setup(struct dsa_switch *ds) if (ret) goto error; + for (i = 0; i < ds->num_ports; i++) { + ret = ar9331_sw_setup_port(ds, i); + if (ret) + goto error; + } + ds->configure_vlan_while_not_filtering = false; return 0; -- 2.30.2