From nobody Sat Feb 7 22:21:02 2026 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (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 765253904E5 for ; Thu, 22 Jan 2026 19:45:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769111160; cv=none; b=U4yumBZ7KCkNp5zJEhrS1PHUq2C2YShpk9Z89V6XkibH8Xx0KxuqGdbfgAUKsoGVi96F11n4Kl9zOc0c+0Nsf/qkH2fWZzr+++WJUt+szlnsRxeOTpyx65gYVi5/j2TTAs1VQDwsSycDcTLNaM9AxSv5A3mR2BIUmATsD1+SLE8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769111160; c=relaxed/simple; bh=qLMIT8Ws33pYlSoHCrt/RVncgm7aYhmOwxAU9uVlwHE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FDqZNOVtYo0LJiAPRHJdodVRYKdigSn7+THEB9e7cYeFsYyxGhHbX7XqUE5IdIR0GS35tGtvYHoOZM/B0cYbuW3WmsFlpTFngMmmz0oPZy7VP4RHn9N7lvhW4vmv/hofrI1MnFIdaSRbCLK1TqA2w8iSe5Cxu+4JtDckhZS6Mg8= 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=OLGJQwiu; arc=none smtp.client-ip=209.85.210.174 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="OLGJQwiu" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-7f89d0b37f0so1318253b3a.0 for ; Thu, 22 Jan 2026 11:45:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769111141; x=1769715941; 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; bh=h7W4ETZqG8skHoTE538RFRAe6Lb7JM/auRjP6xeCdlU=; b=OLGJQwiuwjtqA4L1o4PqCprASVac7a7gwkFqZofJAxRy16JaHKOaPk8YoWvEVCuQuh HYqlyjvjDZmPc0GH3Rslb7DNCIKcjRtTy76cQg7vuQX9GG3svJDQTqyRRWuaJe/WVba4 WWjK8Q6gc2M13p29OFjzVup+BH/E+TCcxXrw7MiuU8CEDjlU5mcYmXntbLc/xZyYXdRt zmCU1RqfdnEs02edkNdDjPYsgUpIpi7X+3sgSvJNdqE/t1r2+vUUDBcJv7Uak5eQAIOt fN9J0yYSMjw7V4lyocpseVdi/RTtr5TR+s05TM/ljrfKp9Ib+FMx1q/sNUd50WuNSxCZ qRUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769111141; x=1769715941; 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; bh=h7W4ETZqG8skHoTE538RFRAe6Lb7JM/auRjP6xeCdlU=; b=XZbpz/Ct+rH9Gh6SEz4XpJG19Xhd5L8b9bERli6HYwYhMJAZF4s+dbLzmDpVF0vhQL 0/PfzGD5xVaG2j05yM6qX5KTy5mROeVAcod61nPOSKawSq55gjOwCbl6MXXwZCRH3Ktm SIh6BPwPs0rBvUFrPM+mtU1LaObLC1yczkJkKgW2GNNQWiNIyiV7avhn5aEl9U9oq3ZY FQqN54rGbZ9e7k2nvjJmWNCZJWhqbgfaax+1G5iWit2zSFhpLI6+HiWSVCfRFixGdm/V ZKjXG9p5FAKurpGrQkUVg7PrPv4xFE2Y2RX8Rip/puRwEPxeAPccg9XlCQgavJfH81iI umuw== X-Forwarded-Encrypted: i=1; AJvYcCXIOM4MqlmzfjzgyJEmnJkMaFHOEzo2P6wVu2f6o/Y2ecHgRCR1DSceaAjRyWpPSdNNO3HAFTuP39vR5Jc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1Q/pi/ilW7rBEMhjbCOqzvcUvjZdBzcWQ5QcKqgGVFLkHu7kT g+2Or9cMYkoj5Ny5CqjaLO/kRJm9hULq0FlrpQZrsKQGcKlxfndNXqAv X-Gm-Gg: AZuq6aIJBpc1gXFVphNLFSqOCz3kzyT9u4Nwzd15Yw8cxdXgRfumsUkrp/Xvx2s1keL /wpKrINYaekkp9rSd5mt9V6v0Dq1sfURtLxxlGM6E8tXN8/vr0xDvSZdzB0tpRFDC9lYDbIwAKF jtKv84FaJh25suWqHSpxUeDjF3wN7VHduLNyjv4Oa+81BspYJCH8rOtxwDMg0hnG3XPbwX6cgrV ebem10ehWWb1VFGcgc4w8iPoh1zuNjIFxGcfR9sSPNnN5QH/QlVeHB3lUfqS91bWCeCLTklTmX4 wqF9ILUH/7KWWqMVNzzg6Txj1iduXsoBvJFAmmE9dcLeO4pbIx0M0YTwtaQBi1CzjgKffCRVtyk InOwHMqEZF842mps7vQXhT3H+ZrHShMEq9rtj6QtrfqqtHXxXavvIpVW2tiV74fFCnFu9EY9UGo J5Jf5O3ujEcrRi6cN3jWGHaYomlnzZ5FW76gsawOmCRYtD6O4xLy1MNg== X-Received: by 2002:a05:6a20:12c3:b0:342:2a1b:870f with SMTP id adf61e73a8af0-38e7005bcbdmr433235637.20.1769111140956; Thu, 22 Jan 2026 11:45:40 -0800 (PST) Received: from d.home.mmyangfl.tk ([2001:19f0:8001:1644:5400:5ff:fe3e:12b1]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c635a425254sm110441a12.29.2026.01.22.11.45.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jan 2026 11:45:40 -0800 (PST) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 1/2] net: dsa: tag_yt921x: fix priority support Date: Fri, 23 Jan 2026 03:42:29 +0800 Message-ID: <20260122194233.2777550-2-mmyangfl@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260122194233.2777550-1-mmyangfl@gmail.com> References: <20260122194233.2777550-1-mmyangfl@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 packet priority is embedded in the rx tag. It defaults to 0, but adding DCB support to the switch driver will break the tag driver by setting it to non-zero. Signed-off-by: David Yang --- net/dsa/tag_yt921x.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/dsa/tag_yt921x.c b/net/dsa/tag_yt921x.c index 6bbfd42dc5df..b93715a057c7 100644 --- a/net/dsa/tag_yt921x.c +++ b/net/dsa/tag_yt921x.c @@ -17,7 +17,8 @@ * 2: Rx Port * 15b: Rx Port Valid * 14b-11b: Rx Port - * 10b-0b: Cmd? + * 10b-8b: Priority + * 7b-0b: Cmd * 2: Tx Port(s) * 15b: Tx Port(s) Valid * 10b-0b: Tx Port(s) Mask @@ -33,7 +34,8 @@ =20 #define YT921X_TAG_PORT_EN BIT(15) #define YT921X_TAG_RX_PORT_M GENMASK(14, 11) -#define YT921X_TAG_RX_CMD_M GENMASK(10, 0) +#define YT921X_TAG_RX_PRIO_M GENMASK(10, 8) +#define YT921X_TAG_RX_CMD_M GENMASK(7, 0) #define YT921X_TAG_RX_CMD(x) FIELD_PREP(YT921X_TAG_RX_CMD_M, (x)) #define YT921X_TAG_RX_CMD_FORWARDED 0x80 #define YT921X_TAG_RX_CMD_UNK_UCAST 0xb2 @@ -98,6 +100,8 @@ yt921x_tag_rcv(struct sk_buff *skb, struct net_device *n= etdev) return NULL; } =20 + skb->priority =3D FIELD_GET(YT921X_TAG_RX_PRIO_M, rx); + cmd =3D FIELD_GET(YT921X_TAG_RX_CMD_M, rx); switch (cmd) { case YT921X_TAG_RX_CMD_FORWARDED: --=20 2.51.0 From nobody Sat Feb 7 22:21:02 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (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 55C9439CB53 for ; Thu, 22 Jan 2026 19:45:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769111168; cv=none; b=Bp8ayIcLVhfkPZVq5XwvE2Lo4a4Cm7IXpLhDk75VMVPkd2/uE/zUwWgu9u60YQIrDhKimiL3du3BMz2fBU4B1wlBfgld3SBteqS+yRyTABXG6D1N6DkRZVEIEaA5d5Jja20LYI7YE9ZSoz6yC+P8TAlG7Ycpi/mxaYzTQso0LwQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769111168; c=relaxed/simple; bh=hsMQoajZ+iDDBMF8bzWkJurYWQKdbihyPM5QYQcpH/s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s7CM2kihWr9BG30xbvIMndORtmK0rjQ+m/Xjxx8Nk4Va52kfGStF5p6v6m4zWSRgGck3vWU9xD14d59HTmgIH9ilIHrU+KBJx3uI86/qsVn/Uq34RuOmQ8/9LsqS+f+vH/ERjvJu5DSv//5q2cAqhHnMnUXRnA2vu6xrs5QxyHs= 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=WvzSxu/W; arc=none smtp.client-ip=209.85.210.172 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="WvzSxu/W" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-81f4e136481so787473b3a.3 for ; Thu, 22 Jan 2026 11:45:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769111146; x=1769715946; 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; bh=B4PUfDYdxzXlvUGxMP006PqE5pXnPQpjYp0re1XqPBI=; b=WvzSxu/WFtlHUn/YpkObw0nZX3fIZTV1+pxNwAiZiEN2dWl6iaFQxJk3AXdR1Ti4fw diMA4WoNNHRnUzQSepOzJtFqsdTDLj/6IxTP+9fOCGdF13ejz8fXgmwDOtlXG5ya9rc2 qUn+xh+3jndfriElGRGsxWqvIsbuaZOKL4BR7Wmahy0qhmsgzqxAIkYWnGGyiScuDRT4 X51adLjZWnBK9oXqIKG2eFniI6NPrbPUn7f26NQB2r22FW9Gr/UUNCyAdAiDwDZEx+yb QdHMmPHeVBbOTZ1VyviPs8DGdYutdRePuIlKVi4cGvHt2jIutI+2TtBThPjvckffSPsD ysNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769111146; x=1769715946; 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; bh=B4PUfDYdxzXlvUGxMP006PqE5pXnPQpjYp0re1XqPBI=; b=amlLfK0qHTDrTX8vKDs3dSuy5836BgY6uXBlrLM8ABRLr132+SOkGToiFxeLhY5tOS yntKeLawXTe8RqY/Xm8lIrWmg9v54IG0uJNbKS7xf7KhwcK9kbdCU37IDS61OhIVDoVU v2omrzwYo79YBE3vdjRTdhV5bHGW+dhADdMCJnqvwCpgupubC9Hc8ml6MXYeHN935HIV VCPx/4E0vY0ViL+keG2hY3EbZgOLmq1CkQR9bDQD4hIi2JPtJDtrLCrLxsvWeHsU7Bcj aZmuovQCmB50Q+JCanwyyuUB1C55VxamyZWw2K5I0s6NdUiQcWMh9w71YEV/AndxFFfI oSqg== X-Forwarded-Encrypted: i=1; AJvYcCVWwor5izo3q91sEWsK1Ae2al2H3A16WDtn2z6ob1I4U88v5NUNKrUUTriTIZapBe9KvVKCa9B7TfbA0Kc=@vger.kernel.org X-Gm-Message-State: AOJu0YwyepID3nEHFbz3S1t++RWCYbPLh5rHC/vVf89LeWSjFZFQGWCw ji8qwspkDSEKgvPP4rhQpoIc+eKupwXvbjPOWFC2qZP0Vr+i9Ua7TFtB X-Gm-Gg: AZuq6aJZTTHhg7ZfYUicT0NgJcB7njOiyUVeH3aI+/SaFhkEui1ECZB3pa74wkUxKe0 tdooxjT4nIMCJ9jJR9kXz1kMOm0NZyEnfFGUcdFQPb0CsokVLmPFYYfruaTjkhdV8Dn2THW9MB2 vGyYFWtbO91cy0IQApDYz8ly0V3v3tbLgAL33C+uLxqNHM+QVpQKix3jbdowaZ/MTTjQ7ZYGeJR OYJxVkR92vDWI0Nkyy2W4srlZF9YtWiDvybUbImC7r5fEQv2CW/kPC5z6XCVn+gifPv8OaF8v8q SvORoO1ubRG66+3eD4LMRNl+6mlfekAsiOeOHE7jK5kqd8aSxlJ+M8OtLYqYBGU6TIYQCe/VDIT Ap4e00LThO+Z+0M4a7Xe/368mnmm57ELW/gcV2mDvkcnZOfUnBO2Edqrlk3s7xo6TffQmnu66MJ rYGGENwFAfZGTQ2rjttqDdB0wzVQyeNUMXGFHwW59yAML2DrIf+/PSPQ== X-Received: by 2002:a05:6a20:1582:b0:38d:fc34:c887 with SMTP id adf61e73a8af0-38e6f824598mr674010637.65.1769111145417; Thu, 22 Jan 2026 11:45:45 -0800 (PST) Received: from d.home.mmyangfl.tk ([2001:19f0:8001:1644:5400:5ff:fe3e:12b1]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c635a425254sm110441a12.29.2026.01.22.11.45.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jan 2026 11:45:45 -0800 (PST) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 2/2] net: dsa: yt921x: Add DCB/priority support Date: Fri, 23 Jan 2026 03:42:30 +0800 Message-ID: <20260122194233.2777550-3-mmyangfl@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260122194233.2777550-1-mmyangfl@gmail.com> References: <20260122194233.2777550-1-mmyangfl@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" Set up global DSCP/PCP priority mappings and add related DSA methods. Signed-off-by: David Yang --- drivers/net/dsa/Kconfig | 2 + drivers/net/dsa/yt921x.c | 232 +++++++++++++++++++++++++++++++++++++++ drivers/net/dsa/yt921x.h | 54 +++++++-- 3 files changed, 278 insertions(+), 10 deletions(-) diff --git a/drivers/net/dsa/Kconfig b/drivers/net/dsa/Kconfig index 7eb301fd987d..d73d7fa7f7d2 100644 --- a/drivers/net/dsa/Kconfig +++ b/drivers/net/dsa/Kconfig @@ -158,6 +158,8 @@ config NET_DSA_VITESSE_VSC73XX_PLATFORM config NET_DSA_YT921X tristate "Motorcomm YT9215 ethernet switch chip support" select NET_DSA_TAG_YT921X + select NET_IEEE8021Q_HELPERS + select DCB help This enables support for the Motorcomm YT9215 ethernet switch chip. diff --git a/drivers/net/dsa/yt921x.c b/drivers/net/dsa/yt921x.c index a4b346ddf8dd..5f3287421c94 100644 --- a/drivers/net/dsa/yt921x.c +++ b/drivers/net/dsa/yt921x.c @@ -18,8 +18,11 @@ #include #include #include +#include =20 #include +#include +#include =20 #include "yt921x.h" =20 @@ -2391,6 +2394,140 @@ yt921x_dsa_port_stp_state_set(struct dsa_switch *ds= , int port, u8 state) port, res); } =20 +static int +yt921x_dsa_port_get_default_prio(struct dsa_switch *ds, int port) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + u32 val; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_reg_read(priv, YT921X_PORTn_QOS(port), &val); + mutex_unlock(&priv->reg_lock); + + if (res) + return res; + + return FIELD_GET(YT921X_PORT_QOS_PRIO_M, val); +} + +static int +yt921x_dsa_port_set_default_prio(struct dsa_switch *ds, int port, u8 prio) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + u32 mask; + u32 ctrl; + int res; + + if (prio >=3D YT921X_PRIO_NUM) + return -EINVAL; + + mutex_lock(&priv->reg_lock); + mask =3D YT921X_PORT_QOS_PRIO_M | YT921X_PORT_QOS_PRIO_EN; + ctrl =3D YT921X_PORT_QOS_PRIO(prio) | YT921X_PORT_QOS_PRIO_EN; + res =3D yt921x_reg_update_bits(priv, YT921X_PORTn_QOS(port), mask, ctrl); + mutex_unlock(&priv->reg_lock); + + return res; +} + +static const u8 yt921x_apps[] =3D { + 0, /* MAC SA */ + 0, /* MAC DA */ + 0, /* VID */ + 0, /* ACL */ + IEEE_8021QAZ_APP_SEL_DSCP, /* DSCP */ + DCB_APP_SEL_PCP, /* CVLAN PCP */ + 0, /* SVLAN PCP */ + 0, /* Port */ +}; + +static int appprios_cmp(const void *a, const void *b) +{ + return ((const u8 *)b)[1] - ((const u8 *)a)[1]; +} + +static int +yt921x_dsa_port_get_apptrust(struct dsa_switch *ds, int port, u8 *sel, + int *nselp) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + u8 appprios[ARRAY_SIZE(yt921x_apps)][2]; + int nsel; + u32 val; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_reg_read(priv, YT921X_PORTn_PRIO_ORD(port), &val); + mutex_unlock(&priv->reg_lock); + + if (res) + return res; + + for (int src =3D 0; src < ARRAY_SIZE(yt921x_apps); src++) { + appprios[src][0] =3D yt921x_apps[src]; + appprios[src][1] =3D (val >> (3 * src)) & 7; + } + sort(appprios, ARRAY_SIZE(appprios), sizeof(appprios[0]), appprios_cmp, + NULL); + + nsel =3D 0; + for (int i =3D 0; i < ARRAY_SIZE(appprios) && appprios[i][1]; i++) + if (appprios[i][0]) { + sel[nsel] =3D appprios[i][0]; + nsel++; + } + *nselp =3D nsel; + + return 0; +} + +static int +yt921x_dsa_port_set_apptrust(struct dsa_switch *ds, int port, const u8 *se= l, + int nsel) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + u8 prios[ARRAY_SIZE(yt921x_apps)] =3D {}; + u32 ctrl; + u8 prio; + int res; + + if (nsel > ARRAY_SIZE(yt921x_apps)) + return -EINVAL; + + /* always take the port prio (port_set_default_prio) into + * consideration, by giving it the lowest priority + */ + prios[7] =3D 1; + prio =3D 7; + for (int i =3D 0; i < nsel; i++) { + bool found =3D false; + + for (int src =3D 0; src < ARRAY_SIZE(yt921x_apps); src++) { + if (yt921x_apps[src] !=3D sel[i]) + continue; + + prios[src] =3D prio; + prio--; + found =3D true; + break; + } + + if (!found) + return -EOPNOTSUPP; + } + + ctrl =3D 0; + for (int src =3D 0; src < ARRAY_SIZE(yt921x_apps); src++) + ctrl |=3D YT921X_PORT_PRIO_ORD_SRCm(src, prios[src]); + + mutex_lock(&priv->reg_lock); + res =3D yt921x_reg_write(priv, YT921X_PORTn_PRIO_ORD(port), ctrl); + mutex_unlock(&priv->reg_lock); + + return res; +} + static int yt921x_port_down(struct yt921x_priv *priv, int port) { u32 mask; @@ -2759,6 +2896,58 @@ static int yt921x_dsa_port_setup(struct dsa_switch *= ds, int port) return res; } =20 +#define ipm_drop(prio) \ + YT921X_IPM_DROP_PRIO((prio) <=3D IEEE8021Q_TT_EE ? 2 : \ + (prio) <=3D IEEE8021Q_TT_VO ? 1 : 0) +#define ipm_ctrl(prio) (YT921X_IPM_PRIO(prio) | ipm_drop(prio)) + +static int +yt921x_dsa_port_get_dscp_prio(struct dsa_switch *ds, int port, u8 dscp) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + u32 val; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_reg_read(priv, YT921X_IPM_DSCPn(dscp), &val); + mutex_unlock(&priv->reg_lock); + + if (res) + return res; + + return FIELD_GET(YT921X_IPM_PRIO_M, val); +} + +static int +yt921x_dsa_port_del_dscp_prio(struct dsa_switch *ds, int port, u8 dscp, u8= prio) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_reg_write(priv, YT921X_IPM_DSCPn(dscp), + ipm_ctrl(IEEE8021Q_TT_BK)); + mutex_unlock(&priv->reg_lock); + + return res; +} + +static int +yt921x_dsa_port_add_dscp_prio(struct dsa_switch *ds, int port, u8 dscp, u8= prio) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + int res; + + if (prio >=3D YT921X_PRIO_NUM) + return -EINVAL; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_reg_write(priv, YT921X_IPM_DSCPn(dscp), ipm_ctrl(prio)); + mutex_unlock(&priv->reg_lock); + + return res; +} + static int yt921x_edata_wait(struct yt921x_priv *priv, u32 *valp) { u32 val =3D YT921X_EDATA_DATA_IDLE; @@ -2978,6 +3167,40 @@ static int yt921x_chip_setup(struct yt921x_priv *pri= v) if (res) return res; =20 + /* 802.1Q QoS to priority mapping table */ + for (u8 pcp =3D 0; pcp < 8; pcp++) { + u32 drop =3D ipm_drop(pcp); + + for (u8 dei =3D 0; dei < 2; dei++) { + ctrl =3D YT921X_IPM_PRIO(pcp); + if (!dei) + ctrl |=3D drop; + else + ctrl |=3D YT921X_IPM_DROP_PRIO(2); + + for (u8 svlan =3D 0; svlan < 2; svlan++) { + u32 reg =3D YT921X_IPM_PCPn(svlan, dei, pcp); + + res =3D yt921x_reg_write(priv, reg, ctrl); + if (res) + return res; + } + } + } + + /* DSCP to priority mapping table */ + for (u8 dscp =3D 0; dscp < DSCP_MAX; dscp++) { + int prio =3D ietf_dscp_to_ieee8021q_tt(dscp); + + if (prio < 0) + return prio; + + res =3D yt921x_reg_write(priv, YT921X_IPM_DSCPn(dscp), + ipm_ctrl(prio)); + if (res) + return res; + } + /* Miscellaneous */ res =3D yt921x_reg_set_bits(priv, YT921X_SENSOR, YT921X_SENSOR_TEMP); if (res) @@ -3087,10 +3310,19 @@ static const struct dsa_switch_ops yt921x_dsa_switc= h_ops =3D { .port_mst_state_set =3D yt921x_dsa_port_mst_state_set, .vlan_msti_set =3D yt921x_dsa_vlan_msti_set, .port_stp_state_set =3D yt921x_dsa_port_stp_state_set, + /* dcb */ + .port_get_default_prio =3D yt921x_dsa_port_get_default_prio, + .port_set_default_prio =3D yt921x_dsa_port_set_default_prio, + .port_get_apptrust =3D yt921x_dsa_port_get_apptrust, + .port_set_apptrust =3D yt921x_dsa_port_set_apptrust, /* port */ .get_tag_protocol =3D yt921x_dsa_get_tag_protocol, .phylink_get_caps =3D yt921x_dsa_phylink_get_caps, .port_setup =3D yt921x_dsa_port_setup, + /* dscp */ + .port_get_dscp_prio =3D yt921x_dsa_port_get_dscp_prio, + .port_del_dscp_prio =3D yt921x_dsa_port_del_dscp_prio, + .port_add_dscp_prio =3D yt921x_dsa_port_add_dscp_prio, /* chip */ .setup =3D yt921x_dsa_setup, }; diff --git a/drivers/net/dsa/yt921x.h b/drivers/net/dsa/yt921x.h index bacd4ccaa8e5..6c380bda38fb 100644 --- a/drivers/net/dsa/yt921x.h +++ b/drivers/net/dsa/yt921x.h @@ -269,6 +269,37 @@ #define YT921X_TPID_EGRn(x) (0x100300 + 4 * (x)) /* [0, 3] */ #define YT921X_TPID_EGR_TPID_M GENMASK(15, 0) =20 +#define YT921X_IPM_DSCPn(n) (0x180000 + 4 * (n)) /* Internal Priority Map= */ +#define YT921X_IPM_PCPn(map, dei, pcp) (0x180100 + 4 * (16 * (map) + 8 * (= dei) + (pcp))) +#define YT921X_IPM_PRIO_M GENMASK(4, 2) +#define YT921X_IPM_PRIO(x) FIELD_PREP(YT921X_IPM_PRIO_M, (x)) +#define YT921X_IPM_DROP_PRIO_M GENMASK(1, 0) +#define YT921X_IPM_DROP_PRIO(x) FIELD_PREP(YT921X_IPM_DROP_PRIO_M, (x)) +#define YT921X_PORTn_QOS(port) (0x180180 + 4 * (port)) +#define YT921X_PORT_QOS_CVLAN_PRIO_MAP_SEL BIT(5) +#define YT921X_PORT_QOS_SVLAN_PRIO_MAP_SEL BIT(4) +#define YT921X_PORT_QOS_PRIO_M GENMASK(3, 1) +#define YT921X_PORT_QOS_PRIO(x) FIELD_PREP(YT921X_PORT_QOS_PRIO_M, (x)) +#define YT921X_PORT_QOS_PRIO_EN BIT(0) +#define YT921X_PORTn_PRIO_ORD(port) (0x180200 + 4 * (port)) +#define YT921X_PORT_PRIO_ORD_SRCm_M(m) GENMASK(3 * (m) + 2, 3 * (m)) +#define YT921X_PORT_PRIO_ORD_SRCm(m, x) ((x) << (3 * (m))) +#define YT921X_PORT_PRIO_ORD_PORT_M GENMASK(23, 21) +#define YT921X_PORT_PRIO_ORD_PORT(x) FIELD_PREP(YT921X_PORT_PRIO_ORD_P= ORT_M, (x)) +#define YT921X_PORT_PRIO_ORD_SVLAN_M GENMASK(20, 18) +#define YT921X_PORT_PRIO_ORD_SVLAN(x) FIELD_PREP(YT921X_PORT_PRIO_ORD_= SVLAN_M, (x)) +#define YT921X_PORT_PRIO_ORD_CVLAN_M GENMASK(17, 15) +#define YT921X_PORT_PRIO_ORD_CVLAN(x) FIELD_PREP(YT921X_PORT_PRIO_ORD_= CVLAN_M, (x)) +#define YT921X_PORT_PRIO_ORD_DSCP_M GENMASK(14, 12) +#define YT921X_PORT_PRIO_ORD_DSCP(x) FIELD_PREP(YT921X_PORT_PRIO_ORD_D= SCP_M, (x)) +#define YT921X_PORT_PRIO_ORD_ACL_M GENMASK(11, 9) +#define YT921X_PORT_PRIO_ORD_ACL(x) FIELD_PREP(YT921X_PORT_PRIO_ORD_AC= L_M, (x)) +#define YT921X_PORT_PRIO_ORD_VID_M GENMASK(8, 6) +#define YT921X_PORT_PRIO_ORD_VID(x) FIELD_PREP(YT921X_PORT_PRIO_ORD_VI= D_M, (x)) +#define YT921X_PORT_PRIO_ORD_MAC_DA_M GENMASK(5, 3) +#define YT921X_PORT_PRIO_ORD_MAC_DA(x) FIELD_PREP(YT921X_PORT_PRIO_ORD_= MAC_DA_M, (x)) +#define YT921X_PORT_PRIO_ORD_MAC_SA_M GENMASK(2, 0) +#define YT921X_PORT_PRIO_ORD_MAC_SA(x) FIELD_PREP(YT921X_PORT_PRIO_ORD_= MAC_SA_M, (x)) #define YT921X_VLAN_IGR_FILTER 0x180280 #define YT921X_VLAN_IGR_FILTER_PORTn_BYPASS_IGMP(port) BIT((port) + 11) #define YT921X_VLAN_IGR_FILTER_PORTn(port) BIT(port) @@ -337,7 +368,7 @@ #define YT921X_FDB_OUT0 0x1804b0 #define YT921X_FDB_IO0_ADDR_HI4_M GENMASK(31, 0) #define YT921X_FDB_OUT1 0x1804b4 -#define YT921X_FDB_IO1_EGR_INT_PRI_EN BIT(31) +#define YT921X_FDB_IO1_EGR_PRIO_EN BIT(31) #define YT921X_FDB_IO1_STATUS_M GENMASK(30, 28) #define YT921X_FDB_IO1_STATUS(x) FIELD_PREP(YT921X_FDB_IO1_STATUS_M, (= x)) #define YT921X_FDB_IO1_STATUS_INVALID YT921X_FDB_IO1_STATUS(0) @@ -356,9 +387,9 @@ #define YT921X_FDB_IO2_EGR_PORTS(x) FIELD_PREP(YT921X_FDB_IO2_EGR_PORT= S_M, (x)) #define YT921X_FDB_IO2_EGR_DROP BIT(17) #define YT921X_FDB_IO2_COPY_TO_CPU BIT(16) -#define YT921X_FDB_IO2_IGR_INT_PRI_EN BIT(15) -#define YT921X_FDB_IO2_INT_PRI_M GENMASK(14, 12) -#define YT921X_FDB_IO2_INT_PRI(x) FIELD_PREP(YT921X_FDB_IO2_INT_PRI_M,= (x)) +#define YT921X_FDB_IO2_IGR_PRIO_EN BIT(15) +#define YT921X_FDB_IO2_PRIO_M GENMASK(14, 12) +#define YT921X_FDB_IO2_PRIO(x) FIELD_PREP(YT921X_FDB_IO2_PRIO_M, (x)) #define YT921X_FDB_IO2_NEW_VID_M GENMASK(11, 0) #define YT921X_FDB_IO2_NEW_VID(x) FIELD_PREP(YT921X_FDB_IO2_NEW_VID_M,= (x)) #define YT921X_FILTER_UNK_UCAST 0x180508 @@ -406,8 +437,9 @@ #define YT921X_VLAN_CTRL_FID_M GENMASK_ULL(34, 23) #define YT921X_VLAN_CTRL_FID(x) FIELD_PREP(YT921X_VLAN_CTRL_FID_M, (x)) #define YT921X_VLAN_CTRL_LEARN_DIS BIT_ULL(22) -#define YT921X_VLAN_CTRL_INT_PRI_EN BIT_ULL(21) -#define YT921X_VLAN_CTRL_INT_PRI_M GENMASK_ULL(20, 18) +#define YT921X_VLAN_CTRL_PRIO_EN BIT_ULL(21) +#define YT921X_VLAN_CTRL_PRIO_M GENMASK_ULL(20, 18) +#define YT921X_VLAN_CTRL_PRIO(x) FIELD_PREP(YT921X_VLAN_CTRL_PRIO_M, (= x)) #define YT921X_VLAN_CTRL_PORTS_M GENMASK_ULL(17, 7) #define YT921X_VLAN_CTRL_PORTS(x) FIELD_PREP(YT921X_VLAN_CTRL_PORTS_M,= (x)) #define YT921X_VLAN_CTRL_PORTn(port) BIT_ULL((port) + 7) @@ -433,14 +465,14 @@ #define YT921X_LAG_HASH_SRC_PORT BIT(0) =20 #define YT921X_PORTn_VLAN_CTRL(port) (0x230010 + 4 * (port)) -#define YT921X_PORT_VLAN_CTRL_SVLAN_PRI_EN BIT(31) -#define YT921X_PORT_VLAN_CTRL_CVLAN_PRI_EN BIT(30) +#define YT921X_PORT_VLAN_CTRL_SVLAN_PRIO_EN BIT(31) +#define YT921X_PORT_VLAN_CTRL_CVLAN_PRIO_EN BIT(30) #define YT921X_PORT_VLAN_CTRL_SVID_M GENMASK(29, 18) #define YT921X_PORT_VLAN_CTRL_SVID(x) FIELD_PREP(YT921X_PORT_VLAN_CTRL= _SVID_M, (x)) #define YT921X_PORT_VLAN_CTRL_CVID_M GENMASK(17, 6) #define YT921X_PORT_VLAN_CTRL_CVID(x) FIELD_PREP(YT921X_PORT_VLAN_CTRL= _CVID_M, (x)) -#define YT921X_PORT_VLAN_CTRL_SVLAN_PRI_M GENMASK(5, 3) -#define YT921X_PORT_VLAN_CTRL_CVLAN_PRI_M GENMASK(2, 0) +#define YT921X_PORT_VLAN_CTRL_SVLAN_PRIO_M GENMASK(5, 3) +#define YT921X_PORT_VLAN_CTRL_CVLAN_PRIO_M GENMASK(2, 0) #define YT921X_PORTn_VLAN_CTRL1(port) (0x230080 + 4 * (port)) #define YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_EN BIT(8) #define YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_PROFILE_ID_M GENMASK(7, 4) @@ -478,6 +510,8 @@ enum yt921x_fdb_entry_status { #define YT921X_LAG_NUM 2 #define YT921X_LAG_PORT_NUM 4 =20 +#define YT921X_PRIO_NUM 8 + #define YT9215_MAJOR 0x9002 #define YT9218_MAJOR 0x9001 =20 --=20 2.51.0