From patchwork Wed Apr 3 10:37:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615777 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.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 556CB13958A; Wed, 3 Apr 2024 10:37:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140674; cv=none; b=mg7KUEtibpjXvub1dS/FWGBsPu/FSL4Xr9SBw6z6cPWw7iGeEfA2H/pk9IuRE1Q/b0IM8XnP3e7hXX09Mx1DIuOs2udvjCHaZj8uoK9GTn617gJyf1Xaq4DzSO4L52v0qvlFixGEooxdXn89XX5uUf8RfpgkNGKsP2Dxc9NAGRQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140674; c=relaxed/simple; bh=NEqzIM5bhXOMyShh8NovoHydAS2pG4mVH0/rNoV63CA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DgTdKSmgGDiRq/ca3ZZPDe7bx1CEAisquKk7pr6VJzNEwq+6gUcLDhOZpaaszmMzGZs2ekMSZTF4WYrGng04onDP0HLf6z877tyaOlxdWo+8za9SGtUTmBmfpA07BVATnAwCKc3ATc7h4HDGJe0L53I3Q1s26+OQdk5yGj18nRY= 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=UA0fKj7F; arc=none smtp.client-ip=209.85.208.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="UA0fKj7F" Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-56e06116eb4so662228a12.3; Wed, 03 Apr 2024 03:37:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140670; x=1712745470; 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=whafif4/IiKhd9fS47gOJyRBUsqdTIZqNGil9vLxZwE=; b=UA0fKj7FzMCGbjzSJz2tLmINcBFgIstH3N1RHWMMFxBzGffdwcLLbIN6rkq7+a7SpJ 3BQS/IXUL2uKjf3jGRsBPBcKpQ/mflgzH4DjuPSOdDzFAPt8gEnn/FlhLc6Z9fIoSjdu aS/NbRukh1QIUj1dKe8t4GxKrk46s5M0YlRxPRoxWKz84dncshsUXkpqaa9o1MaCqS7/ q3BxWWbx+Yx0WJhA/inbeTsZOHbeN+f+4loRT8B40S1Mn00vpdhuaBTACUnPTPbcQu1N HIOAl5kf4R0fJ5LOp82NGIqrd7f3NZ10JH/5DmDn228yvwHdmbqepqFMHmNaTnG3lZW+ 0viw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140670; x=1712745470; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=whafif4/IiKhd9fS47gOJyRBUsqdTIZqNGil9vLxZwE=; b=GthgoUx+EQnYY6e/mJ42z9COMzT69PR+CLQ2f4tHxZKqF5L7ASGyKNFBkt36UmzsML 6LVrHvv7mU05WJyDyP3F8qC5aQ5Inbsp2IWE9Qe9Xio+bb7SZE5Jn2bmv7mq64ZqTlxo QVN6vLesd6E1cpO460Mq9QUcu2UmZaB7ZuIdA96XzAA54/9dHQnjP0/ZrxS2OlGFwSxP B1y62iA5bdwXBwNRBW6zNS7PAPfAkfy65EH1+VEAhRzmeyW+R75sfvAgs0NOzDot+/Ac yqo8EWn9rBzDk68z4zEzrTOPRXWPoWPl+M1P34pfW6W0VwY2IHaK4x59PU77SrWW7m42 z30Q== X-Forwarded-Encrypted: i=1; AJvYcCUHRWw0TRmgZkJ22G8C9IkEY2ZekEOalZm50NOt9Q5eIio5iMVyUJSrJYP2bie5vPXG95ToyajYq/RxQLhmJrBIlnY6IbUDvevse5/U X-Gm-Message-State: AOJu0Yw7XHvgEp0xqy2pJDPMuhDXNhIwpfRh2JsKA6hgO6SEV22731hy zF6P+IKsXZhXB995urj/GeHLUq9lplhuUisGxrvqAPGfBStZqOKkBS4xWOpaDfg= X-Google-Smtp-Source: AGHT+IGg+Soh0OpIGA9gJVVkEYdQ5aCywZ7/pT7hhDShjFIipLmHSNkUBKoRZVBHVEFRaqiTwffCMA== X-Received: by 2002:a17:906:2882:b0:a4e:b3f:1dda with SMTP id o2-20020a170906288200b00a4e0b3f1ddamr1518235ejd.74.1712140670331; Wed, 03 Apr 2024 03:37:50 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.37.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:37:49 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Russell King , Andrew Lunn , Florian Fainelli , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 01/16] net: dsa: vsc73xx: use read_poll_timeout instead delay loop Date: Wed, 3 Apr 2024 12:37:17 +0200 Message-Id: <20240403103734.3033398-2-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Switch the delay loop during the Arbiter empty check from vsc73xx_adjust_link() to use read_poll_timeout(). Functionally, one msleep() call is eliminated at the end of the loop in the timeout case. As Russell King suggested: "This [change] avoids the issue that on the last iteration, the code reads the register, tests it, finds the condition that's being waiting for is false, _then_ waits and end up printing the error message - that last wait is rather useless, and as the arbiter state isn't checked after waiting, it could be that we had success during the last wait." Suggested-by: Russell King Reviewed-by: Andrew Lunn Reviewed-by: Linus Walleij Reviewed-by: Florian Fainelli Signed-off-by: Pawel Dembicki Reviewed-by: Vladimir Oltean --- v8,v7,v6: - resend only v5: - improved commit description - added two defines instead magic numbers - added include with iopoll.h v4: - resend patch v3: - added "Reviewed-by" to commit message only v2: - introduced patch drivers/net/dsa/vitesse-vsc73xx-core.c | 30 ++++++++++++++------------ 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index ae70eac3be28..ab5771d4d828 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -268,6 +269,9 @@ #define IS_7398(a) ((a)->chipid == VSC73XX_CHIPID_ID_7398) #define IS_739X(a) (IS_7395(a) || IS_7398(a)) +#define VSC73XX_POLL_SLEEP_US 1000 +#define VSC73XX_POLL_TIMEOUT_US 10000 + struct vsc73xx_counter { u8 counter; const char *name; @@ -779,7 +783,7 @@ static void vsc73xx_adjust_link(struct dsa_switch *ds, int port, * after a PHY or the CPU port comes up or down. */ if (!phydev->link) { - int maxloop = 10; + int ret, err; dev_dbg(vsc->dev, "port %d: went down\n", port); @@ -794,19 +798,17 @@ static void vsc73xx_adjust_link(struct dsa_switch *ds, int port, VSC73XX_ARBDISC, BIT(port), BIT(port)); /* Wait until queue is empty */ - vsc73xx_read(vsc, VSC73XX_BLOCK_ARBITER, 0, - VSC73XX_ARBEMPTY, &val); - while (!(val & BIT(port))) { - msleep(1); - vsc73xx_read(vsc, VSC73XX_BLOCK_ARBITER, 0, - VSC73XX_ARBEMPTY, &val); - if (--maxloop == 0) { - dev_err(vsc->dev, - "timeout waiting for block arbiter\n"); - /* Continue anyway */ - break; - } - } + ret = read_poll_timeout(vsc73xx_read, err, + err < 0 || (val & BIT(port)), + VSC73XX_POLL_SLEEP_US, + VSC73XX_POLL_TIMEOUT_US, false, + vsc, VSC73XX_BLOCK_ARBITER, 0, + VSC73XX_ARBEMPTY, &val); + if (ret) + dev_err(vsc->dev, + "timeout waiting for block arbiter\n"); + else if (err < 0) + dev_err(vsc->dev, "error reading arbiter\n"); /* Put this port into reset */ vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, From patchwork Wed Apr 3 10:37:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615778 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (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 BA1221411F2; Wed, 3 Apr 2024 10:37:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140677; cv=none; b=ZCZvlj6GZkYcH7yj4t+1432bXzBgJ1wIc8Nw+nTr4Q7VDLM0o7xcVwDG9HAv+yKqDtm/Zad5bInvmGp5x4tXsP8rrtgUjT3y2Ha6edYXYESQA8c4/YtSQGkAbH4b7NfTUMFRRCjP2UnQWzbnd64XLOhuIIwaN54ROXeh7D6qcKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140677; c=relaxed/simple; bh=RNzWaV0YS7Bu2UB99RZuHOoMtzT5XBda5tMY+XPplUI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ad+/3KmTD4BWFI9JJ+ptwvN3zRag9A6/Q4AgZNWpq9JDRMaiS7cCMGKSTwU/8rKa33RrB2+1uJAiEwZHULHVSNa9hjMl9164cogMLFEmXKvbP5NQdugFhYrjucC21swt5M62l6ORPZvlg5nBuI9OUpCVkx5qybksvg32k62WfBg= 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=haLxy8zZ; arc=none smtp.client-ip=209.85.208.45 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="haLxy8zZ" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-56c0a249bacso7638625a12.1; Wed, 03 Apr 2024 03:37:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140674; x=1712745474; 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=3Ck2CqR/iyiP+BpiyWMgFyaN9K8n1DvbHV7cUnb3niw=; b=haLxy8zZ7MXza4LhD5ex+sO6EkTDaJVh62lHHnxBDu8lguGmJuntYKhajVur1brjWE Dwx69PsIBUqQ8uvk4xI8ShS+6a8uDu7qKiM7AePo/shrhG8XA8rBlwaNpbhEPRCiZqlK YgRRpvNghcdXLYsyXoQTCnCHDfmGI9ywND/cjWA49Dbrlg+uBEGd/K6Ord5OR2oziekW h2oG1NbldI56+KBmonoXs5DHBF1FuZfbHY0qkqWhGVKQci92qQ71+vwA8PmivRZfYucR tgGAYBAT+RszEZIlSDo+/48Ctp6EhWwazzOg5K68UfpGVdZMVCUvS3k64xArPeheO+iC Ysqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140674; x=1712745474; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3Ck2CqR/iyiP+BpiyWMgFyaN9K8n1DvbHV7cUnb3niw=; b=qss7owkxIVcR4A8Y9E5ENnfih/wqYAgMR0+jy861bnp3SVU/Me0XNNvHHi/8ougxdL To+pJMaN/JCBjocH4OjyE2VQxhUk6KeAYz0vWBzXyjr4RxsUPrG1o289BXmRj/9FNWv7 +Uj1/CdoFOr9RuNN0jwy2vUMeN3o28A6aEyzTCkdT8mfVA5yGoa+nrCiUUZEYV8Y+LmO qxmu6HjFJXyx2Lv+QXtbynyJ2eLIKW1uQqlEIyu89L7gGEPEGToZF/xy/IXGQd5dL9L3 1nFpKMcu8v5L44Ij9d45zqYLPbGYAbDxREFuzjCBpWS99yInoWupW5nVTLj+VWg6RKq8 hX0w== X-Forwarded-Encrypted: i=1; AJvYcCXPPPmpiHksJn39NlzGAGKPmK4byU5istgyUwf/QoHs4/DTlDSSsnaQlFdfgooUuF1scfK7SkBvuSRKzLUz6RtukgiXkDcdMZ6vqUKH X-Gm-Message-State: AOJu0YxbTapYtxsPsLTzvyHbs1BbX0QBUozXMXrN5JMFOrvBQs539bYM MNbdj5rxwnlA5+y2ei2wcpNuzk7+IZeBM5ktBu6ddy6v2g0XnjXFOSg0BmZVB0s= X-Google-Smtp-Source: AGHT+IFkdedKV06hMFtbNYf9Z0MaCMYO9TzWwMVd3NQppfz1sx6N8yIKDEk1JB5ix62QDPWbQbM8gA== X-Received: by 2002:a17:906:30c4:b0:a4e:fe3:ceff with SMTP id b4-20020a17090630c400b00a4e0fe3ceffmr7538433ejb.57.1712140673848; Wed, 03 Apr 2024 03:37:53 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.37.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:37:53 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Florian Fainelli , Russell King , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 02/16] net: dsa: vsc73xx: convert to PHYLINK Date: Wed, 3 Apr 2024 12:37:18 +0200 Message-Id: <20240403103734.3033398-3-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch replaces the adjust_link api with the phylink apis that provide equivalent functionality. The remaining functionality from the adjust_link is now covered in the phylink_mac_link_* and phylink_mac_config. Removes: .adjust_link Adds: .phylink_mac_config .phylink_mac_link_up .phylink_mac_link_down Signed-off-by: Pawel Dembicki Reviewed-by: Florian Fainelli Reviewed-by: Linus Walleij Reviewed-by: Russell King (Oracle) --- v8: - resend only v7: - added 'Reviewed-by' to commit message only v6: - resend only v5: - introduce MAC reset function with procedure described in datasheet - reorganise routines - move 'Accept packets again' routine to 'phylink_mac_link_up' - fix one FIXME v4: - update commit descripion - remove phylink_get_caps after rebase to current net-next/main v3: - remove legacy_pre_march2020 after rebase v2: - replace switch to if and get rid of macros in vsc73xx_phylink_mac_link_up function drivers/net/dsa/vitesse-vsc73xx-core.c | 235 ++++++++++++------------- 1 file changed, 109 insertions(+), 126 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index ab5771d4d828..cb2e7e256279 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -717,52 +717,43 @@ static void vsc73xx_init_port(struct vsc73xx *vsc, int port) port, VSC73XX_C_RX0, 0); } -static void vsc73xx_adjust_enable_port(struct vsc73xx *vsc, - int port, struct phy_device *phydev, - u32 initval) +static void vsc73xx_reset_port(struct vsc73xx *vsc, int port, u32 initval) { - u32 val = initval; - u8 seed; - - /* Reset this port FIXME: break out subroutine */ - val |= VSC73XX_MAC_CFG_RESET; - vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, val); - - /* Seed the port randomness with randomness */ - get_random_bytes(&seed, 1); - val |= seed << VSC73XX_MAC_CFG_SEED_OFFSET; - val |= VSC73XX_MAC_CFG_SEED_LOAD; - val |= VSC73XX_MAC_CFG_WEXC_DIS; - vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, val); + int ret, err; + u32 val; - /* Flow control for the PHY facing ports: - * Use a zero delay pause frame when pause condition is left - * Obey pause control frames - * When generating pause frames, use 0xff as pause value - */ - vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_FCCONF, - VSC73XX_FCCONF_ZERO_PAUSE_EN | - VSC73XX_FCCONF_FLOW_CTRL_OBEY | - 0xff); + /* Disable RX on this port */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_MAC_CFG, + VSC73XX_MAC_CFG_RX_EN, 0); - /* Disallow backward dropping of frames from this port */ + /* Discard packets */ vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, - VSC73XX_SBACKWDROP, BIT(port), 0); + VSC73XX_ARBDISC, BIT(port), BIT(port)); + + /* Wait until queue is empty */ + ret = read_poll_timeout(vsc73xx_read, err, + err < 0 || (val & BIT(port)), + VSC73XX_POLL_SLEEP_US, + VSC73XX_POLL_TIMEOUT_US, false, + vsc, VSC73XX_BLOCK_ARBITER, 0, + VSC73XX_ARBEMPTY, &val); + if (ret) + dev_err(vsc->dev, + "timeout waiting for block arbiter\n"); + else if (err < 0) + dev_err(vsc->dev, "error reading arbiter\n"); - /* Enable TX, RX, deassert reset, stop loading seed */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, - VSC73XX_MAC_CFG, - VSC73XX_MAC_CFG_RESET | VSC73XX_MAC_CFG_SEED_LOAD | - VSC73XX_MAC_CFG_TX_EN | VSC73XX_MAC_CFG_RX_EN, - VSC73XX_MAC_CFG_TX_EN | VSC73XX_MAC_CFG_RX_EN); + /* Put this port into reset */ + vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, + VSC73XX_MAC_CFG_RESET | initval); } -static void vsc73xx_adjust_link(struct dsa_switch *ds, int port, - struct phy_device *phydev) +static void vsc73xx_phylink_mac_config(struct dsa_switch *ds, int port, + unsigned int mode, + const struct phylink_link_state *state) { struct vsc73xx *vsc = ds->priv; - u32 val; - /* Special handling of the CPU-facing port */ if (port == CPU_PORT) { /* Other ports are already initialized but not this one */ @@ -778,102 +769,92 @@ static void vsc73xx_adjust_link(struct dsa_switch *ds, int port, VSC73XX_ADVPORTM_ENA_GTX | VSC73XX_ADVPORTM_DDR_MODE); } +} + +static void vsc73xx_phylink_mac_link_down(struct dsa_switch *ds, int port, + unsigned int mode, + phy_interface_t interface) +{ + struct vsc73xx *vsc = ds->priv; - /* This is the MAC confiuration that always need to happen - * after a PHY or the CPU port comes up or down. + /* This routine is described in the datasheet (below ARBDISC register + * description) */ - if (!phydev->link) { - int ret, err; - - dev_dbg(vsc->dev, "port %d: went down\n", - port); - - /* Disable RX on this port */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, - VSC73XX_MAC_CFG, - VSC73XX_MAC_CFG_RX_EN, 0); - - /* Discard packets */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, - VSC73XX_ARBDISC, BIT(port), BIT(port)); - - /* Wait until queue is empty */ - ret = read_poll_timeout(vsc73xx_read, err, - err < 0 || (val & BIT(port)), - VSC73XX_POLL_SLEEP_US, - VSC73XX_POLL_TIMEOUT_US, false, - vsc, VSC73XX_BLOCK_ARBITER, 0, - VSC73XX_ARBEMPTY, &val); - if (ret) - dev_err(vsc->dev, - "timeout waiting for block arbiter\n"); - else if (err < 0) - dev_err(vsc->dev, "error reading arbiter\n"); - - /* Put this port into reset */ - vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, - VSC73XX_MAC_CFG_RESET); - - /* Accept packets again */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, - VSC73XX_ARBDISC, BIT(port), 0); - - /* Allow backward dropping of frames from this port */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, - VSC73XX_SBACKWDROP, BIT(port), BIT(port)); - - /* Receive mask (disable forwarding) */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, - VSC73XX_RECVMASK, BIT(port), 0); + vsc73xx_reset_port(vsc, port, 0); - return; - } + /* Allow backward dropping of frames from this port */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, + VSC73XX_SBACKWDROP, BIT(port), BIT(port)); - /* Figure out what speed was negotiated */ - if (phydev->speed == SPEED_1000) { - dev_dbg(vsc->dev, "port %d: 1000 Mbit mode full duplex\n", - port); - - /* Set up default for internal port or external RGMII */ - if (phydev->interface == PHY_INTERFACE_MODE_RGMII) - val = VSC73XX_MAC_CFG_1000M_F_RGMII; - else - val = VSC73XX_MAC_CFG_1000M_F_PHY; - vsc73xx_adjust_enable_port(vsc, port, phydev, val); - } else if (phydev->speed == SPEED_100) { - if (phydev->duplex == DUPLEX_FULL) { - val = VSC73XX_MAC_CFG_100_10M_F_PHY; - dev_dbg(vsc->dev, - "port %d: 100 Mbit full duplex mode\n", - port); - } else { - val = VSC73XX_MAC_CFG_100_10M_H_PHY; - dev_dbg(vsc->dev, - "port %d: 100 Mbit half duplex mode\n", - port); - } - vsc73xx_adjust_enable_port(vsc, port, phydev, val); - } else if (phydev->speed == SPEED_10) { - if (phydev->duplex == DUPLEX_FULL) { - val = VSC73XX_MAC_CFG_100_10M_F_PHY; - dev_dbg(vsc->dev, - "port %d: 10 Mbit full duplex mode\n", - port); - } else { - val = VSC73XX_MAC_CFG_100_10M_H_PHY; - dev_dbg(vsc->dev, - "port %d: 10 Mbit half duplex mode\n", - port); - } - vsc73xx_adjust_enable_port(vsc, port, phydev, val); - } else { - dev_err(vsc->dev, - "could not adjust link: unknown speed\n"); - } + /* Receive mask (disable forwarding) */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_RECVMASK, BIT(port), 0); +} + +static void vsc73xx_phylink_mac_link_up(struct dsa_switch *ds, int port, + unsigned int mode, + phy_interface_t interface, + struct phy_device *phydev, + int speed, int duplex, + bool tx_pause, bool rx_pause) +{ + struct vsc73xx *vsc = ds->priv; + u32 val; + u8 seed; + + if (speed == SPEED_1000) + val = VSC73XX_MAC_CFG_GIGA_MODE | VSC73XX_MAC_CFG_TX_IPG_1000M; + else + val = VSC73XX_MAC_CFG_TX_IPG_100_10M; + + if (interface == PHY_INTERFACE_MODE_RGMII) + val |= VSC73XX_MAC_CFG_CLK_SEL_1000M; + else + val |= VSC73XX_MAC_CFG_CLK_SEL_EXT; + + if (duplex == DUPLEX_FULL) + val |= VSC73XX_MAC_CFG_FDX; + + /* This routine is described in the datasheet (below ARBDISC register + * description) + */ + vsc73xx_reset_port(vsc, port, val); + + /* Seed the port randomness with randomness */ + get_random_bytes(&seed, 1); + val |= seed << VSC73XX_MAC_CFG_SEED_OFFSET; + val |= VSC73XX_MAC_CFG_SEED_LOAD; + val |= VSC73XX_MAC_CFG_WEXC_DIS; + vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, val); + + /* Flow control for the PHY facing ports: + * Use a zero delay pause frame when pause condition is left + * Obey pause control frames + * When generating pause frames, use 0xff as pause value + */ + vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_FCCONF, + VSC73XX_FCCONF_ZERO_PAUSE_EN | + VSC73XX_FCCONF_FLOW_CTRL_OBEY | + 0xff); + + /* Accept packets again */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, + VSC73XX_ARBDISC, BIT(port), 0); /* Enable port (forwarding) in the receieve mask */ vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_RECVMASK, BIT(port), BIT(port)); + + /* Disallow backward dropping of frames from this port */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, + VSC73XX_SBACKWDROP, BIT(port), 0); + + /* Enable TX, RX, deassert reset, stop loading seed */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_MAC_CFG, + VSC73XX_MAC_CFG_RESET | VSC73XX_MAC_CFG_SEED_LOAD | + VSC73XX_MAC_CFG_TX_EN | VSC73XX_MAC_CFG_RX_EN, + VSC73XX_MAC_CFG_TX_EN | VSC73XX_MAC_CFG_RX_EN); } static int vsc73xx_port_enable(struct dsa_switch *ds, int port, @@ -1060,7 +1041,9 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .setup = vsc73xx_setup, .phy_read = vsc73xx_phy_read, .phy_write = vsc73xx_phy_write, - .adjust_link = vsc73xx_adjust_link, + .phylink_mac_config = vsc73xx_phylink_mac_config, + .phylink_mac_link_down = vsc73xx_phylink_mac_link_down, + .phylink_mac_link_up = vsc73xx_phylink_mac_link_up, .get_strings = vsc73xx_get_strings, .get_ethtool_stats = vsc73xx_get_ethtool_stats, .get_sset_count = vsc73xx_get_sset_count, From patchwork Wed Apr 3 10:37:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615779 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (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 98ED21420C4; Wed, 3 Apr 2024 10:37:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140681; cv=none; b=kAngya11DEb40HNu8BOa7cNmQQLedfv97F9EUnZbrxa8xzI3zOd2+Q+UCT4trKBcUicFdivo+Y5Di/gOSRV8WhoTlbbsETAq16SgkHe+VbLRLVdBcdXsUzaznGygHt1R+iN+kykQEOnndB9/hPrzdIPOiKSa0XxRQxOB5O6Cs9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140681; c=relaxed/simple; bh=t3bwAabuZAkVWJLP6p2Sai+axAPa856q+m+ZpJxFDFs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=i20iHMhb7HHy8LQ3VQJOmhAn3D3O13F7IeiYnOVOIkavSLRrUuBuRgCnrS6sddrYYdBbi0LfOhzYZ3JsarSaLbKt18XYrHUnO7yFv6mInFQ6zdOdXcbDVnbuB2wIotpGkHGWuSYVErUfrMv8rRp9JUBevo7wm/sN117J0pKrEi4= 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=HdW0a3WY; arc=none smtp.client-ip=209.85.167.48 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="HdW0a3WY" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-51381021af1so8637066e87.0; Wed, 03 Apr 2024 03:37:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140677; x=1712745477; 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=wqdRvG7HCmMVrAK+ZpkIEKtbg+m59HnhG1C3SXg/kTY=; b=HdW0a3WYU5qzoUf4Ke6a62XsgAuoEgM4ioCQMfSQLkISNFv0eWt6ych2V1TrJsQKwG 2THXRMBbBZv1eJo+ZjwPVHoIABxRaa4mAT7qX6/+zKarhcXc6et6ErfDnKYvXYaLMleb hh/sl46DBcJUxMgQkWT2FQuYcAcr9w7NCQtBKNk99cPJl6jwqsbbc8wQov8DwbOS8Ler R7JJmn1T7mO/VtkaQVlfmSP+MlhXwmRR18MfXxrsbXxrAlMTL3d9pq45iVCMix6loFr9 FIWq2IGLR1o/pQmJu2K1Ywb+MaxnqSe1tpTeFwIjY+dsDe9ys/wYGqrDyEf48wXN26qO Xy/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140677; x=1712745477; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wqdRvG7HCmMVrAK+ZpkIEKtbg+m59HnhG1C3SXg/kTY=; b=UPlUlFazjZG7I00A74fUQjc/HsO+j1WIyx7kGJGsYO5t7YzdnjGP+yqBwplKyMoq1/ F/qVuG6n+N64vWl4HKxFcCeZrQeu4VBIgkd1eY7scpybRlrwR5jj51lP4qLreMyFyEdr r8vTKwvpzZ0TpqcHZHhKc4jYGH36JECVXRcJCxFv6E944KbOzSF1e7E5bZB0g4pfAjOT kaASTz/txyCmCo2peMUoV7r3hKiI3YH4hAUQtqaiFIGcCh2J+rLsYhGm904/82tBlJDE 9ofi7gmx58PaFIZTuyh85duM9wu/WE3Y6QN5kNHDUBV2CjnKe6wl22sxGSH35SbzpSxI Swjw== X-Forwarded-Encrypted: i=1; AJvYcCUjIgpckcARpi3RK1jPXfP01TNJGfVfcdJOokMu13iS54z6atjAlQlfW0A19E1L7mUvczwGp2vVvxthh9vV+52jGasQ0gYAPie7NgEm X-Gm-Message-State: AOJu0YzAx5JIzLX+xIoKOriGp/bUcWvZJrWiGaEMVvJEcKMTKQwumoVj zYxdJBwgKbg5+lv6LqdpzzOic80Yim/BoXaeDrNoqeRRmM5HA9jweKaYxDpLpAo= X-Google-Smtp-Source: AGHT+IEqvmm9A2+zbcgp9m+T421x8gaJu75WdKF0aH61bGlBotbFkmVzcoDkSQL1ag94CyAoKzWkZQ== X-Received: by 2002:ac2:4839:0:b0:516:c1b9:316b with SMTP id 25-20020ac24839000000b00516c1b9316bmr37248lft.15.1712140677259; Wed, 03 Apr 2024 03:37:57 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.37.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:37:56 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Russell King , Florian Fainelli , Vladimir Oltean , Andrew Lunn , Florian Fainelli , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 03/16] net: dsa: vsc73xx: use macros for rgmii recognition Date: Wed, 3 Apr 2024 12:37:19 +0200 Message-Id: <20240403103734.3033398-4-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org It's preparation for future use. At this moment, the RGMII port is used only for a connection to the MAC interface, but in the future, someone could connect a PHY to it. Using the "phy_interface_mode_is_rgmii" macro allows for the proper recognition of all RGMII modes. Suggested-by: Russell King (Oracle) Signed-off-by: Pawel Dembicki Reviewed-by: Linus Walleij Reviewed-by: Florian Fainelli Reviewed-by: Vladimir Oltean Reviewed-by: Russell King (Oracle) --- v8: - resend only v7: - added 'Reviewed-by' and fix 'Suggested-by' in commit message v6: - resend only v5: - added 'Reviewed-by' only v4: - introduced patch drivers/net/dsa/vitesse-vsc73xx-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index cb2e7e256279..8ed8fc997d6d 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -807,7 +807,7 @@ static void vsc73xx_phylink_mac_link_up(struct dsa_switch *ds, int port, else val = VSC73XX_MAC_CFG_TX_IPG_100_10M; - if (interface == PHY_INTERFACE_MODE_RGMII) + if (phy_interface_mode_is_rgmii(interface)) val |= VSC73XX_MAC_CFG_CLK_SEL_1000M; else val |= VSC73XX_MAC_CFG_CLK_SEL_EXT; From patchwork Wed Apr 3 10:37:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615780 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) (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 EA75A14389D; Wed, 3 Apr 2024 10:38:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140684; cv=none; b=cQm96Dv01tlMpFeWX4ttDMV7VKmSxbrE01n7pccQY2L8Qbz4cz/ZSxOtJnBxrGeZhoUjzmeFZs94SFpQUUvUi2rxPT5+gdsPBD/x5rE8DvkSxSVFKMVDgKlfNMFjXjvrxCsiWnHKizSCdoaii103bWbp7PONDkd99HFC7Ddo72c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140684; c=relaxed/simple; bh=O0gHDM0xgUueH7DwBUIjDd0mL0nkucXtLHYMM4BNWPE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=A5uUUa4g7YsjtCO1alduLoI7YPUzGY4cA8BPK7sFAZ07fqDD2oZKYrlk5V0ycJFuasdLnVgc+LFAp7QfdpZTqRf7KGkQlckJrVzCfgXi2+VrjRBIBysQUVpeglgBURxjWYp07eHH/pRj5DaE3VsH7LeqdMVvlb4RRSIkKQWDJ+0= 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=BudPPXSE; arc=none smtp.client-ip=209.85.218.43 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="BudPPXSE" Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-a450bedffdfso712054066b.3; Wed, 03 Apr 2024 03:38:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140681; x=1712745481; 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=+bxKD9iMqvGSst570xxVI68A/yARVoT0X5vNdiXsHRg=; b=BudPPXSEkIyXjk7YbOcxa5xaLmfbJfvI6BM7SKA8rUSt296nhWwALfw/s7BfpBS8iH SbAtdivYJZg3Jejfag6/SIlRF20nP5tCaGwks+aAkfzLe9trqS0TMBYSOzOO9tG7DQjk oQc5Gth9hsFQTeIcgCZ7K2N8cNyX05NM/7WD6poc5wxY7tDB4gTsRFdCSN0HXR5aatpF iyRdlyZVOdQjhtHT+Q1t5vkWqrOGxXm1WKwgo93D8APrsxBw//RHOKwzNASl5B638Pih 3F/BgBvWn6b9rY1oMfp8KRcka9faBXfELvqGyDn3bDEBMgJ7pFp1EoFq8DdhAZi4+00x bzOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140681; x=1712745481; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+bxKD9iMqvGSst570xxVI68A/yARVoT0X5vNdiXsHRg=; b=P05ru4CrjeJ+PbW0Ta2sBadIKtlV92bHmQC1VL8IRQmPjHY1Suq5gXmUlVW6N+DH5u 5PwgUjWJ371qCFsn91C/RWqWfcAy29t7E9NbNEwYZGaUPqNtLjLU15ei3+ScmQilqMKZ C9kEB6sor2W43tpFV4nCb7weDaT7Ur5I4kgeZrn33O6wVS2GNdrtnqd8goKA/4OBVot0 uAAe2YUy969kyciHS6mc04QL25nmLR+d+sQ9G+KCX3Mgm94T4b9q1JxFDlUFfd07x0mP p9JxZvTT+ivtK2BCgfprZ5gIMaeNJnmDqOXGhjOQceOnXZBKXNgJF+eJbvL2DPC0lQk3 dhfQ== X-Forwarded-Encrypted: i=1; AJvYcCUe5IIK/rWP4+cbpKVdzr10akjFqFHvod39NDRlyE2kCRyQJzUuardcC30tyQseqMCUfqf6XKwip53May6hwfBNFkT4R7pOwIjmrhva X-Gm-Message-State: AOJu0YzcNWIRciA6pT7gLd7ONnrUPP3bw8LxZjFDElL/x7rOznmDv+Cm zAcM3lWnB6saueltwf0eH9fRzKV/jbpDBYy3AvcyRVA8pOC7bt9uBcZjdadoU/g= X-Google-Smtp-Source: AGHT+IF+UBYNRuU4Ji0qhdJmxh1w4QT2JfShwA9t+CSnMqVfUJOsObm7sSpm5Wl36D/lDzuERRqQ1w== X-Received: by 2002:a17:906:7cd:b0:a4e:802c:a7a2 with SMTP id m13-20020a17090607cd00b00a4e802ca7a2mr1635685ejc.38.1712140680710; Wed, 03 Apr 2024 03:38:00 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.37.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:00 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Vladimir Oltean , Florian Fainelli , Andrew Lunn , Florian Fainelli , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 04/16] net: dsa: vsc73xx: Add define for max num of ports Date: Wed, 3 Apr 2024 12:37:20 +0200 Message-Id: <20240403103734.3033398-5-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch introduces a new define: VSC73XX_MAX_NUM_PORTS, which can be used in the future instead of a hardcoded value. Currently, the only hardcoded value is vsc->ds->num_ports. It is being replaced with the new define. Suggested-by: Vladimir Oltean Signed-off-by: Pawel Dembicki Reviewed-by: Vladimir Oltean Reviewed-by: Linus Walleij Reviewed-by: Florian Fainelli --- v8: - resend only v7: - added 'Reviewed-by' only v6: - resend only v5: - added 'Reviewed-by' only v4: - Resend patch v3: - Introduce patch drivers/net/dsa/vitesse-vsc73xx-core.c | 13 +------------ drivers/net/dsa/vitesse-vsc73xx.h | 11 +++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 8ed8fc997d6d..425999d7bf41 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -1180,23 +1180,12 @@ int vsc73xx_probe(struct vsc73xx *vsc) vsc->addr[0], vsc->addr[1], vsc->addr[2], vsc->addr[3], vsc->addr[4], vsc->addr[5]); - /* The VSC7395 switch chips have 5+1 ports which means 5 - * ordinary ports and a sixth CPU port facing the processor - * with an RGMII interface. These ports are numbered 0..4 - * and 6, so they leave a "hole" in the port map for port 5, - * which is invalid. - * - * The VSC7398 has 8 ports, port 7 is again the CPU port. - * - * We allocate 8 ports and avoid access to the nonexistant - * ports. - */ vsc->ds = devm_kzalloc(dev, sizeof(*vsc->ds), GFP_KERNEL); if (!vsc->ds) return -ENOMEM; vsc->ds->dev = dev; - vsc->ds->num_ports = 8; + vsc->ds->num_ports = VSC73XX_MAX_NUM_PORTS; vsc->ds->priv = vsc; vsc->ds->ops = &vsc73xx_ds_ops; diff --git a/drivers/net/dsa/vitesse-vsc73xx.h b/drivers/net/dsa/vitesse-vsc73xx.h index 30b1f0a36566..fee1378508b5 100644 --- a/drivers/net/dsa/vitesse-vsc73xx.h +++ b/drivers/net/dsa/vitesse-vsc73xx.h @@ -3,6 +3,17 @@ #include #include +/* The VSC7395 switch chips have 5+1 ports which means 5 ordinary ports and + * a sixth CPU port facing the processor with an RGMII interface. These ports + * are numbered 0..4 and 6, so they leave a "hole" in the port map for port 5, + * which is invalid. + * + * The VSC7398 has 8 ports, port 7 is again the CPU port. + * + * We allocate 8 ports and avoid access to the nonexistent ports. + */ +#define VSC73XX_MAX_NUM_PORTS 8 + /** * struct vsc73xx - VSC73xx state container */ From patchwork Wed Apr 3 10:37:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615781 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.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 DFC77145FF3; Wed, 3 Apr 2024 10:38:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140687; cv=none; b=qfDtL8E89S1Fn3WoFL7y7cYUzUK9N121kWnxGboPKQ8R70YYarUN1gVbax4J58V2kJnwFqKTIGpk1yXikBZ9c7g+bb/C1kVmTqZbBaMkaP11i6EzgP7/tePbx7UQkDzOVfXUM7UdD2LPXr9+eDZjqptcifJGG6LsYPKICI1/GKg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140687; c=relaxed/simple; bh=49XTMBVLCc0luVNpQKQJKHeoXxvxs4Z19mqiiTT9zl8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Z+Pg/TeEpleqn3yJQuKWeFoFGOWyux67ZkLb7mXLnCR6sIzOeop7ULscQg14vQXd5w7Ea/6QyTP5+yoJ7V4/M2WavsGxuzXi6MnIMIuUsJ3eJsJwaMtRQkl3W1svaTkVPwORIEte5JnqDW33deRMC+35OUS+uIf4wt+IjxRDqfU= 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=Vg3mreAj; arc=none smtp.client-ip=209.85.218.46 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="Vg3mreAj" Received: by mail-ej1-f46.google.com with SMTP id a640c23a62f3a-a467d8efe78so773392166b.3; Wed, 03 Apr 2024 03:38:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140684; x=1712745484; 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=J2Y2nxXQnAz5msKA/w9YeANFjXdiyUIanf+P6OBS2YQ=; b=Vg3mreAjtGFArmdgrdbOeAWrFtC7TiTjtPluXhD6zqwrQnr0VcNC+BMiMDAHZHj3zy jml+23hzHMlBVwL9bgxGC1kgg6aIiYxFf08aXowfHuhUyghiE0iEfgr88TAvBAg9+mmc iF6+R/w4IX5rKgbJ3j/SbzavIwMRiL9rO+VUmiFBPSgcEWUojxW1Ev/q7tq5RMweo0U/ QY9gFfJWUUG5KtmOBT82OgDGUovfbgh3aoURBfewKgSswous4BIgch0Cd96B/rpx5DBX 12Q6Phc2RM+2HkplMIPunnN9/8PcMctQbDiYwIvjsRSnB1WGAQnTZorVCAp8KyrZ4maM Qcyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140684; x=1712745484; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=J2Y2nxXQnAz5msKA/w9YeANFjXdiyUIanf+P6OBS2YQ=; b=CFH1lq0GkvQvCx/mvlYRllUI0lvzP9PEXVm9mYsHJojafALT9+mfgiC0QiNGyOSko/ dbTtpi4Jzatzd6bvAepdpqpp2asNhCTVKsKV3l4m1o/WoXWRpOZM8OBBGiQf+B++afu6 N3N5WOj2ibSjs+aVY0E6s3ERY/GBal5uT6i7QR/PY1KbAolT63xe4pN1yeiAOJ1FTm/j Kr6n/bA2NPpnPlsF7+AfFTB542Gzm2mTe7zvH4xxOX8bppTfc6C2fNJHMASbE2fAcgh+ S5KlNaLMAn0utW+ilzO43xf9fMftD6H0nCSIgpLrn+9sPO9DsHgQY3erN3TWHfpuVTkA nMtw== X-Forwarded-Encrypted: i=1; AJvYcCXFyzvsYeCNMEi0P2an41sHbNmQMYXM49qoZGtyWOYVpMIaVigHpmwRJOa/5hWCMxRQ37YOKyv815twmmWrc/h2+GBxJ7DNp/rmv6an X-Gm-Message-State: AOJu0Yzp6RQOdS6z3M7UfYWEWpfKK8IonwhPJhkBprpTGFd+8MVfsv47 DY+W0BUzj+d6vO1ANelk7v/wrSYNaMqbgmyPJapNke3tdcX3qOqFVimFJxvSCKA= X-Google-Smtp-Source: AGHT+IELbNEoZeGq6rM5Zip/h7WQueJ73Ay9pbr1lXyS8bsGQsTN4JMy65HUqKiTvQYtLv14bFa7kw== X-Received: by 2002:a17:906:b211:b0:a4e:61c8:a744 with SMTP id p17-20020a170906b21100b00a4e61c8a744mr7263429ejz.47.1712140684007; Wed, 03 Apr 2024 03:38:04 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:03 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Florian Fainelli , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 05/16] net: dsa: vsc73xx: add structure descriptions Date: Wed, 3 Apr 2024 12:37:21 +0200 Message-Id: <20240403103734.3033398-6-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This commit adds updates to the documentation describing the structures used in vsc73xx. This will help prevent kdoc-related issues in the future. Reviewed-by: Linus Walleij Reviewed-by: Florian Fainelli Signed-off-by: Pawel Dembicki Reviewed-by: Vladimir Oltean --- v8,v7,v6: - resend only v5: - improved description and stick to 80 characters per line v4: - introduced patch drivers/net/dsa/vitesse-vsc73xx.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx.h b/drivers/net/dsa/vitesse-vsc73xx.h index fee1378508b5..e7b08599a625 100644 --- a/drivers/net/dsa/vitesse-vsc73xx.h +++ b/drivers/net/dsa/vitesse-vsc73xx.h @@ -15,7 +15,16 @@ #define VSC73XX_MAX_NUM_PORTS 8 /** - * struct vsc73xx - VSC73xx state container + * struct vsc73xx - VSC73xx state container: main data structure + * @dev: The device pointer + * @reset: The descriptor for the GPIO line tied to the reset pin + * @ds: Pointer to the DSA core structure + * @gc: Main structure of the GPIO controller + * @chipid: Storage for the Chip ID value read from the CHIPID register of the + * sswitch + * @addr: MAC address used in flow control frames + * @ops: Structure with hardware-dependent operations + * @priv: Pointer to the configuration interface structure */ struct vsc73xx { struct device *dev; @@ -28,6 +37,11 @@ struct vsc73xx { void *priv; }; +/** + * struct vsc73xx_ops - VSC73xx methods container + * @read: Method for register reading over the hardware-dependent interface + * @write: Method for register writing over the hardware-dependent interface + */ struct vsc73xx_ops { int (*read)(struct vsc73xx *vsc, u8 block, u8 subblock, u8 reg, u32 *val); From patchwork Wed Apr 3 10:37:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615782 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.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 16CFC139CF3; Wed, 3 Apr 2024 10:38:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140690; cv=none; b=ngNjZ7ZAvtCdiOTz780dkGJyYDgnz0nhe7p9sA7O39xk47POIoaiZ6FjP6lcndk+0DSAN/N/EvyaSCR31/2lDcGTJeEF2noyO0OInPOoQAaPXH1a0qWZWX7al4DJteZ9hXD2SEtUJi6fLl0KOCgr/noE30AWj/MZrscD25dLMw4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140690; c=relaxed/simple; bh=auxB+6+vqSgfl8jAhbv72KSeilVDU0oDt++0lC5sFK8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=fytZUz0n4Tgha+y5tbJ41smFvq8hhHN572UZE72ANpy2n330oEswH/QpeeFVZVanFt3C9L6aff6FcF+Wz7CMCD/rBAOL9azt7t1zytI6rPsvBuf4NGsA1PuWS1CIdNok+mSo+CH86tCGhQTjKL1+mR8mcHj3OGJZuCCSh1hLiw4= 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=YWczJYb6; arc=none smtp.client-ip=209.85.218.46 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="YWczJYb6" Received: by mail-ej1-f46.google.com with SMTP id a640c23a62f3a-a4a387ff7acso753931666b.2; Wed, 03 Apr 2024 03:38:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140687; x=1712745487; 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=qyJMqLNwYKzMWVCjPB1/HkePnJei0qr+ZbKH0COL8dA=; b=YWczJYb6Y/y8ulrCYjww55v3PrkfrZEZCz6e4vlIz0jsvIy5DfMifFdkeN8ZWks/Zz J3kt6Bi2w0n47eTf/cKVTauDDXE2OYWoaObpGQ7FI6yQlLjUDcjhkEUFgx5SOYMysVcu olrdqOAdmcp8ztNN+F65cgmaI+wvKs/mDfIzymXWyBko4SgTXHI6tSciWjp0mWSw16Yo lZ3IVGkI4C5rw+wBng/IEeULdpPDV1i6h2Ar7qAu8zN9QAbi93rvF87xGO2xWJf9iFAc g3TZnWz9ngMh7mPjXqVzgzb44vtJe8KfKcsHcudJWcN81jA3gLakZSBZ8oBiPzYLIIV7 0FWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140687; x=1712745487; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qyJMqLNwYKzMWVCjPB1/HkePnJei0qr+ZbKH0COL8dA=; b=tdhORDgD3MbFq99nSTcHqswymd51wpZyjJ7Gyi3YXeQvwtIG73lDiYrxwMdpcutFm4 ooylzhDcbS4hReEN49CGP+TKF8g+ebmvjze0ChW1oJSKNMYNSKtLndmt3bnSEBU3sbUe d+krzkfK0KNTKItGMjWpBF+dwahepLTsQTp017+4KaPgc6kALKQvgvoCF32ywGrPzgwo NHZlChLXygo5JHA1SCM2O2bdEjI8IxxA8/poj0456NMpEgiXBnCogxIsOuVK9/qWIWHu UZZLaN5yltrWO9akh8ExF8/Sdru/H2O2RwxKui/V7PrOzl4cg4mpw/czlpzAjP1WO+Pq YHZg== X-Forwarded-Encrypted: i=1; AJvYcCUDjtiy3kG0XIF4mroQtYbCPDpJ9krzQL7oU9j8m1YpGZ4KK54eMuvaW0XD04XeNFm6UJAqJKTuDZkneDh5c4FNAwxWJKbM5Kwuau94 X-Gm-Message-State: AOJu0Yytlb9aXhF1yOzCqV/iBjRY4BOruCUDtwv30loE0CYL3omQewvR 8F04wgU9BGbFYOHRRkq7iF3t75UQ7PMwvJ2+r5MQRYPp3Xi3Oxs8ltf8srVogOg= X-Google-Smtp-Source: AGHT+IH3wHdBzbm/GQWdmEEltBktXDdIgpfWIzLv0dfZvgE2zfmvYc0qaiit0dy9u0NrHslfNGdXRg== X-Received: by 2002:a17:906:30c1:b0:a4e:2a62:7eb6 with SMTP id b1-20020a17090630c100b00a4e2a627eb6mr1421685ejb.51.1712140687354; Wed, 03 Apr 2024 03:38:07 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:06 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Florian Fainelli , Vladimir Oltean , Andrew Lunn , Florian Fainelli , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 06/16] net: dsa: vsc73xx: add port_stp_state_set function Date: Wed, 3 Apr 2024 12:37:22 +0200 Message-Id: <20240403103734.3033398-7-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This isn't a fully functional implementation of 802.1D, but port_stp_state_set is required for a future tag8021q operations. This implementation handles properly all states, but vsc73xx doesn't forward STP packets. Reviewed-by: Linus Walleij Reviewed-by: Florian Fainelli Reviewed-by: Vladimir Oltean Signed-off-by: Pawel Dembicki --- v8: - resend only v7: - implement 'vsc73xx_refresh_fwd_map' simplification v6: - fix inconsistent indenting v5: - remove unneeded 'RECVMASK' operations - reorganise vsc73xx_refresh_fwd_map function v4: - fully reworked port_stp_state_set v3: - use 'VSC73XX_MAX_NUM_PORTS' define - add 'state == BR_STATE_DISABLED' condition - fix style issues v2: - fix kdoc drivers/net/dsa/vitesse-vsc73xx-core.c | 96 +++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 11 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 425999d7bf41..07f982cf62dd 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -164,6 +164,10 @@ #define VSC73XX_AGENCTRL 0xf0 #define VSC73XX_CAPRST 0xff +#define VSC73XX_SRCMASKS_CPU_COPY BIT(27) +#define VSC73XX_SRCMASKS_MIRROR BIT(26) +#define VSC73XX_SRCMASKS_PORTS_MASK GENMASK(7, 0) + #define VSC73XX_MACACCESS_CPU_COPY BIT(14) #define VSC73XX_MACACCESS_FWD_KILL BIT(13) #define VSC73XX_MACACCESS_IGNORE_VLAN BIT(12) @@ -623,9 +627,6 @@ static int vsc73xx_setup(struct dsa_switch *ds) vsc73xx_write(vsc, VSC73XX_BLOCK_SYSTEM, 0, VSC73XX_GMIIDELAY, VSC73XX_GMIIDELAY_GMII0_GTXDELAY_2_0_NS | VSC73XX_GMIIDELAY_GMII0_RXDELAY_2_0_NS); - /* Enable reception of frames on all ports */ - vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_RECVMASK, - 0x5f); /* IP multicast flood mask (table 144) */ vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_IFLODMSK, 0xff); @@ -785,10 +786,6 @@ static void vsc73xx_phylink_mac_link_down(struct dsa_switch *ds, int port, /* Allow backward dropping of frames from this port */ vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, VSC73XX_SBACKWDROP, BIT(port), BIT(port)); - - /* Receive mask (disable forwarding) */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, - VSC73XX_RECVMASK, BIT(port), 0); } static void vsc73xx_phylink_mac_link_up(struct dsa_switch *ds, int port, @@ -841,10 +838,6 @@ static void vsc73xx_phylink_mac_link_up(struct dsa_switch *ds, int port, vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, VSC73XX_ARBDISC, BIT(port), 0); - /* Enable port (forwarding) in the receieve mask */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, - VSC73XX_RECVMASK, BIT(port), BIT(port)); - /* Disallow backward dropping of frames from this port */ vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ARBITER, 0, VSC73XX_SBACKWDROP, BIT(port), 0); @@ -1036,6 +1029,86 @@ static void vsc73xx_phylink_get_caps(struct dsa_switch *dsa, int port, config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | MAC_1000; } +static void vsc73xx_refresh_fwd_map(struct dsa_switch *ds, int port, u8 state) +{ + struct dsa_port *other_dp, *dp = dsa_to_port(ds, port); + struct vsc73xx *vsc = ds->priv; + u16 mask; + + if (state != BR_STATE_FORWARDING) { + /* Ports that aren't in the forwarding state must not + * forward packets anywhere. + */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + port, + VSC73XX_SRCMASKS_PORTS_MASK, 0); + + dsa_switch_for_each_available_port(other_dp, ds) { + if (other_dp == dp) + continue; + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + other_dp->index, + BIT(port), 0); + } + + return; + } + + /* Forwarding ports must forward to the CPU and to other ports + * in the same bridge + */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + CPU_PORT, BIT(port), BIT(port)); + + mask = BIT(CPU_PORT); + + dsa_switch_for_each_user_port(other_dp, ds) { + int other_port = other_dp->index; + + if (port == other_port || !dsa_port_bridge_same(dp, other_dp) || + other_dp->stp_state != BR_STATE_FORWARDING) + continue; + + mask |= BIT(other_port); + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + other_port, + BIT(port), BIT(port)); + } + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + port, + VSC73XX_SRCMASKS_PORTS_MASK, mask); +} + +/* FIXME: STP frames aren't forwarded at this moment. BPDU frames are + * forwarded only from and to PI/SI interface. For more info see chapter + * 2.7.1 (CPU Forwarding) in datasheet. + * This function is required for tag_8021q operations. + */ +static void vsc73xx_port_stp_state_set(struct dsa_switch *ds, int port, + u8 state) +{ + struct vsc73xx *vsc = ds->priv; + u32 val; + + val = (state == BR_STATE_BLOCKING || state == BR_STATE_DISABLED) ? + 0 : BIT(port); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_RECVMASK, BIT(port), val); + + val = (state == BR_STATE_LEARNING || state == BR_STATE_FORWARDING) ? + BIT(port) : 0; + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_LEARNMASK, BIT(port), val); + + /* CPU Port should always forward packets when user ports are forwarding + * so let's configure it from other ports only. + */ + if (port != CPU_PORT) + vsc73xx_refresh_fwd_map(ds, port, state); +} + static const struct dsa_switch_ops vsc73xx_ds_ops = { .get_tag_protocol = vsc73xx_get_tag_protocol, .setup = vsc73xx_setup, @@ -1051,6 +1124,7 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .port_disable = vsc73xx_port_disable, .port_change_mtu = vsc73xx_change_mtu, .port_max_mtu = vsc73xx_get_max_mtu, + .port_stp_state_set = vsc73xx_port_stp_state_set, .phylink_get_caps = vsc73xx_phylink_get_caps, }; From patchwork Wed Apr 3 10:37:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615783 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.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 7CDFD146A9D; Wed, 3 Apr 2024 10:38:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140696; cv=none; b=ijjcUSwC7Z7FoxEM8XuxMZoSxjbPzg1uVSBK7tbGUVNS/k2zOtY+MIkGjtcVLExQETr9ZU9nEV0Pej46h0WYpgkigJkKgrhPhcj+6iTBM4C7OzKkbvazseAhMXipO1PrWpZhJpptq0oVI+MyVctguEp/Roqpp6S9L6+k9+njj6Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140696; c=relaxed/simple; bh=rnY+cCtNMoXLjaxY0ForNaORLT90w5+ndaRME2CQa9Q=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=T7IZ80hlMwTsiyduCz/iIo64gY2gaicKAFDjrsC/N3GE4q776XUdENPS7dZL2oRtNYJ5bPDHMkcRjNImycD0S5MQkl7HpeQXOmRZldmo9AJD8v68ZKG5iyr8pM+U+IUfVQAthWgJrC2SyXb2Y1b3nr4aPaUEp4G9L1vzCX6J48A= 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=VbX4CYWY; arc=none smtp.client-ip=209.85.167.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="VbX4CYWY" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-513e6777af4so10231553e87.2; Wed, 03 Apr 2024 03:38:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140691; x=1712745491; 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=B1eUz821Rsmmp3GT55xyp+NROU6XLGF51PaLaRHs81Q=; b=VbX4CYWYGJUZjeHXCySf+DO7HPQQltV1yuJB3YEM4261kcOnRyJ5OJTY8PUwoAuV7M txSExXTqrS3uAuBfGcI6DH5BH9ODmuFOmYiU7zjZWLr9MT3xY/yd/F2QejxrhxRidzXG yydszTe+Jh7Y/mf6IvZ3HGbzGbM7+LQEeBzX9ACRoMrWCN1+hM9R3wDTWCIMy96eACP7 mzXEACBy+09rIKk/oPNJj7anuHlwioELogj77A91/x0vPH6p4o58Y58wMFtrRNQAwkE5 9fVT0vytvHxCadBjhJVsxsvB6iTIyseSmG4B/0iegE8+J5fuT9swh9weqSWX9Zwr72eX 7SWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140691; x=1712745491; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=B1eUz821Rsmmp3GT55xyp+NROU6XLGF51PaLaRHs81Q=; b=sEcImehadAeHnznPcbq+o5PdGFyLT+8P7SU88ul1GJrkupOZyUWeOv3xzsyhrgI5q/ M1CwTjiWY/H70wPNCMCVb8yo2BHDF8bFOyMdCKYFuBWM6F9mQbSh30lq8UAELoQgRaZe T8YtS3TrEPwdJhgvDluqcMd9p8JhEyoodFJvhzUYfyFJ3Gf3hbauiNCOQOcbWs/mworC 7DRVkEGi8/P8nkrg4ij7xoT2NM4QJLRaaqQAnxGXfYOAEOm0FTLLxEJodr5C6B3ChHOV /NDF/rLbs9n4CCZrTmxSubf9iATAkM7W/zN/JSRKG31y3/OlxR4V8XYhKu1LFJ1v1hI4 DRLg== X-Forwarded-Encrypted: i=1; AJvYcCWSQauI4T1kv7P6c/ABEhrOWaGmfKCDKLSLP2H3yb+U+9NpCm4XidcG49/vzihujDEUoVTkrT5mPOrgR9Ru3OdPosb4V8f6hqtwSkZ5 X-Gm-Message-State: AOJu0YwRtZjirKmyDTeYe6B7KyY/BRYj5Ay5ZAy2Iz1Dq/pU9vV1Crw7 sVwJF6wjUw0SA/EVEIAwmWIqSvwVpi25D/3f6KMh/zdeLOfyDJbqfoArsfXMu+k= X-Google-Smtp-Source: AGHT+IHux5Vw/3FbnxMw2EaITLCJaX36IJp620ir8Izdw5HfWGG9keLaFYsRQjvvnDVHYY3WgyWn+w== X-Received: by 2002:a05:6512:ea6:b0:516:a13c:da5b with SMTP id bi38-20020a0565120ea600b00516a13cda5bmr4159688lfb.65.1712140690911; Wed, 03 Apr 2024 03:38:10 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:10 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 07/16] net: dsa: vsc73xx: Add vlan filtering Date: Wed, 3 Apr 2024 12:37:23 +0200 Message-Id: <20240403103734.3033398-8-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch implements VLAN filtering for the vsc73xx driver. After starting VLAN filtering, the switch is reconfigured from QinQ to a simple VLAN aware mode. This is required because VSC73XX chips do not support inner VLAN tag filtering. Signed-off-by: Pawel Dembicki --- v8: - set init value of 'ret' in 'vsc73xx_port_vlan_add' v7: - rework pvid and untagged configuration routines - introduce portinfo structure which should make pvid/untagged procedures simpler - introduce 'vsc73xx_vlan_summary' structure - replace tagged/untagged count functions with 'vsc73xx_bridge_vlan_summary' - fix VSC73XX_VLANMASK configuration. It was copy from existing code. - stop configuring pvid/untagged registers whed pvid/untagged is disabled v6: - resend only v5: - fix possible leak in 'vsc73xx_port_vlan_add' - use proper variable in statement from 'vsc73xx_port_vlan_filtering' - change 'vlan_no' name to 'vid' - codding style improvements - comment improvements - handle return of 'vsc73xx_update_bits' - reduce I/O operations - use 'size_t' for counting variables v4: - reworked most of conditional register configs - simplified port_vlan function - move vlan table clearing from port_setup to setup - pvid configuration simplified (now kernel take care about no of pvids per port) - port vlans are stored in list now - introduce implementation of all untagged vlans state - many minor changes v3: - reworked all vlan commits - added storage variables for pvid and untagged vlans - move length extender settings to port setup - remove vlan table cleaning in wrong places v2: - no changes done drivers/net/dsa/vitesse-vsc73xx-core.c | 545 ++++++++++++++++++++++++- drivers/net/dsa/vitesse-vsc73xx.h | 42 ++ 2 files changed, 585 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 07f982cf62dd..433ffd4f44fd 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -22,9 +22,11 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -62,6 +64,8 @@ #define VSC73XX_CAT_DROP 0x6e #define VSC73XX_CAT_PR_MISC_L2 0x6f #define VSC73XX_CAT_PR_USR_PRIO 0x75 +#define VSC73XX_CAT_VLAN_MISC 0x79 +#define VSC73XX_CAT_PORT_VLAN 0x7a #define VSC73XX_Q_MISC_CONF 0xdf /* MAC_CFG register bits */ @@ -122,6 +126,17 @@ #define VSC73XX_ADVPORTM_IO_LOOPBACK BIT(1) #define VSC73XX_ADVPORTM_HOST_LOOPBACK BIT(0) +/* TXUPDCFG transmit modify setup bits */ +#define VSC73XX_TXUPDCFG_DSCP_REWR_MODE GENMASK(20, 19) +#define VSC73XX_TXUPDCFG_DSCP_REWR_ENA BIT(18) +#define VSC73XX_TXUPDCFG_TX_INT_TO_USRPRIO_ENA BIT(17) +#define VSC73XX_TXUPDCFG_TX_UNTAGGED_VID GENMASK(15, 4) +#define VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA BIT(3) +#define VSC73XX_TXUPDCFG_TX_UPDATE_CRC_CPU_ENA BIT(1) +#define VSC73XX_TXUPDCFG_TX_INSERT_TAG BIT(0) + +#define VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_SHIFT 4 + /* CAT_DROP categorizer frame dropping register bits */ #define VSC73XX_CAT_DROP_DROP_MC_SMAC_ENA BIT(6) #define VSC73XX_CAT_DROP_FWD_CTRL_ENA BIT(4) @@ -135,6 +150,15 @@ #define VSC73XX_Q_MISC_CONF_EARLY_TX_512 (1 << 1) #define VSC73XX_Q_MISC_CONF_MAC_PAUSE_MODE BIT(0) +/* CAT_VLAN_MISC categorizer VLAN miscellaneous bits */ +#define VSC73XX_CAT_VLAN_MISC_VLAN_TCI_IGNORE_ENA BIT(8) +#define VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA BIT(7) + +/* CAT_PORT_VLAN categorizer port VLAN */ +#define VSC73XX_CAT_PORT_VLAN_VLAN_CFI BIT(15) +#define VSC73XX_CAT_PORT_VLAN_VLAN_USR_PRIO GENMASK(14, 12) +#define VSC73XX_CAT_PORT_VLAN_VLAN_VID GENMASK(11, 0) + /* Frame analyzer block 2 registers */ #define VSC73XX_STORMLIMIT 0x02 #define VSC73XX_ADVLEARN 0x03 @@ -189,7 +213,8 @@ #define VSC73XX_VLANACCESS_VLAN_MIRROR BIT(29) #define VSC73XX_VLANACCESS_VLAN_SRC_CHECK BIT(28) #define VSC73XX_VLANACCESS_VLAN_PORT_MASK GENMASK(9, 2) -#define VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK GENMASK(2, 0) +#define VSC73XX_VLANACCESS_VLAN_PORT_MASK_SHIFT 2 +#define VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK GENMASK(1, 0) #define VSC73XX_VLANACCESS_VLAN_TBL_CMD_IDLE 0 #define VSC73XX_VLANACCESS_VLAN_TBL_CMD_READ_ENTRY 1 #define VSC73XX_VLANACCESS_VLAN_TBL_CMD_WRITE_ENTRY 2 @@ -347,6 +372,17 @@ static const struct vsc73xx_counter vsc73xx_tx_counters[] = { { 29, "TxQoSClass3" }, /* non-standard counter */ }; +struct vsc73xx_vlan_summary { + size_t num_tagged; + size_t num_untagged; +}; + +enum vsc73xx_port_vlan_conf { + VSC73XX_VLAN_FILTER, + VSC73XX_VLAN_FILTER_UNTAG_ALL, + VSC73XX_VLAN_IGNORE, +}; + int vsc73xx_is_addr_valid(u8 block, u8 subblock) { switch (block) { @@ -564,6 +600,90 @@ static enum dsa_tag_protocol vsc73xx_get_tag_protocol(struct dsa_switch *ds, return DSA_TAG_PROTO_NONE; } +static int vsc73xx_wait_for_vlan_table_cmd(struct vsc73xx *vsc) +{ + int ret, err; + u32 val; + + ret = read_poll_timeout(vsc73xx_read, err, + err < 0 || + ((val & VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK) == + VSC73XX_VLANACCESS_VLAN_TBL_CMD_IDLE), + VSC73XX_POLL_SLEEP_US, VSC73XX_POLL_TIMEOUT_US, + false, vsc, VSC73XX_BLOCK_ANALYZER, + 0, VSC73XX_VLANACCESS, &val); + if (ret) + return ret; + return err; +} + +static int +vsc73xx_read_vlan_table_entry(struct vsc73xx *vsc, u16 vid, u8 *portmap) +{ + u32 val; + int ret; + + vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANTIDX, vid); + + ret = vsc73xx_wait_for_vlan_table_cmd(vsc); + if (ret) + return ret; + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANACCESS, + VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK, + VSC73XX_VLANACCESS_VLAN_TBL_CMD_READ_ENTRY); + + ret = vsc73xx_wait_for_vlan_table_cmd(vsc); + if (ret) + return ret; + + vsc73xx_read(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANACCESS, &val); + *portmap = (val & VSC73XX_VLANACCESS_VLAN_PORT_MASK) >> + VSC73XX_VLANACCESS_VLAN_PORT_MASK_SHIFT; + + return 0; +} + +static int +vsc73xx_write_vlan_table_entry(struct vsc73xx *vsc, u16 vid, u8 portmap) +{ + int ret; + + vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANTIDX, vid); + + ret = vsc73xx_wait_for_vlan_table_cmd(vsc); + if (ret) + return ret; + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANACCESS, + VSC73XX_VLANACCESS_VLAN_TBL_CMD_MASK | + VSC73XX_VLANACCESS_VLAN_SRC_CHECK | + VSC73XX_VLANACCESS_VLAN_PORT_MASK, + VSC73XX_VLANACCESS_VLAN_TBL_CMD_WRITE_ENTRY | + VSC73XX_VLANACCESS_VLAN_SRC_CHECK | + (portmap << VSC73XX_VLANACCESS_VLAN_PORT_MASK_SHIFT)); + + return vsc73xx_wait_for_vlan_table_cmd(vsc); +} + +static int +vsc73xx_update_vlan_table(struct vsc73xx *vsc, int port, u16 vid, bool set) +{ + u8 portmap; + int ret; + + ret = vsc73xx_read_vlan_table_entry(vsc, vid, &portmap); + if (ret) + return ret; + + if (set) + portmap |= BIT(port); + else + portmap &= ~BIT(port); + + return vsc73xx_write_vlan_table_entry(vsc, vid, portmap); +} + static int vsc73xx_setup(struct dsa_switch *ds) { struct vsc73xx *vsc = ds->priv; @@ -598,7 +718,7 @@ static int vsc73xx_setup(struct dsa_switch *ds) VSC73XX_MACACCESS, VSC73XX_MACACCESS_CMD_CLEAR_TABLE); - /* Clear VLAN table */ + /* Set VLAN table to default values */ vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANACCESS, VSC73XX_VLANACCESS_VLAN_TBL_CMD_CLEAR_TABLE); @@ -627,6 +747,9 @@ static int vsc73xx_setup(struct dsa_switch *ds) vsc73xx_write(vsc, VSC73XX_BLOCK_SYSTEM, 0, VSC73XX_GMIIDELAY, VSC73XX_GMIIDELAY_GMII0_GTXDELAY_2_0_NS | VSC73XX_GMIIDELAY_GMII0_RXDELAY_2_0_NS); + /* Ingess VLAN reception mask (table 145) */ + vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_VLANMASK, + 0xff); /* IP multicast flood mask (table 144) */ vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_IFLODMSK, 0xff); @@ -639,6 +762,12 @@ static int vsc73xx_setup(struct dsa_switch *ds) udelay(4); + /* Clear VLAN table */ + for (i = 0; i < VLAN_N_VID; i++) + vsc73xx_write_vlan_table_entry(vsc, i, 0); + + INIT_LIST_HEAD(&vsc->vlans); + return 0; } @@ -822,6 +951,12 @@ static void vsc73xx_phylink_mac_link_up(struct dsa_switch *ds, int port, val |= seed << VSC73XX_MAC_CFG_SEED_OFFSET; val |= VSC73XX_MAC_CFG_SEED_LOAD; val |= VSC73XX_MAC_CFG_WEXC_DIS; + + /* Those bits are responsible for MTU only. Kernel takes care about MTU, + * let's enable +8 bytes frame length unconditionally. + */ + val |= VSC73XX_MAC_CFG_VLAN_AWR | VSC73XX_MAC_CFG_VLAN_DBLAWR; + vsc73xx_write(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, val); /* Flow control for the PHY facing ports: @@ -1029,6 +1164,408 @@ static void vsc73xx_phylink_get_caps(struct dsa_switch *dsa, int port, config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | MAC_1000; } +static bool vsc73xx_tag_8021q_active(struct dsa_port *dp) +{ + return !dsa_port_is_vlan_filtering(dp); +} + +static void +vsc73xx_set_vlan_conf(struct vsc73xx *vsc, int port, + enum vsc73xx_port_vlan_conf port_vlan_conf) +{ + u32 val = 0; + + if (port_vlan_conf == VSC73XX_VLAN_IGNORE) + val = VSC73XX_CAT_VLAN_MISC_VLAN_TCI_IGNORE_ENA | + VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA; + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_CAT_VLAN_MISC, + VSC73XX_CAT_VLAN_MISC_VLAN_TCI_IGNORE_ENA | + VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA, val); + + val = (port_vlan_conf == VSC73XX_VLAN_FILTER) ? + VSC73XX_TXUPDCFG_TX_INSERT_TAG : 0; + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_TXUPDCFG, + VSC73XX_TXUPDCFG_TX_INSERT_TAG, val); +} + +static int vsc73xx_vlan_change_untagged_hw(struct vsc73xx *vsc, int port, + u16 vid, bool set) +{ + u32 val = 0; + + if (set) + val = VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA | + ((vid << VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_SHIFT) & + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID); + + return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_TXUPDCFG, + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA | + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID, val); +} + +static int vsc73xx_vlan_set_untagged_hw(struct vsc73xx *vsc, int port, u16 vid) +{ + return vsc73xx_vlan_change_untagged_hw(vsc, port, vid, true); +} + +static int +vsc73xx_vlan_change_pvid_hw(struct vsc73xx *vsc, int port, u16 vid, bool set) +{ + u32 val = 0; + int ret; + + val = set ? 0 : VSC73XX_CAT_DROP_UNTAGGED_ENA; + + ret = vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_CAT_DROP, + VSC73XX_CAT_DROP_UNTAGGED_ENA, val); + if (!set || ret) + return ret; + + return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_CAT_PORT_VLAN, + VSC73XX_CAT_PORT_VLAN_VLAN_VID, + vid & VSC73XX_CAT_PORT_VLAN_VLAN_VID); +} + +static int vsc73xx_vlan_change_pvid(struct vsc73xx *vsc, int port, u16 vid, + bool valid, bool operate_on_storage, + bool tag_8021q_mode) +{ + struct vsc73xx_portinfo *portinfo = &vsc->portinfo[port]; + + if (tag_8021q_mode) { + portinfo->pvid_tag_8021q_configured = valid; + portinfo->pvid_tag_8021q = vid; + } else { + portinfo->pvid_vlan_filtering_configured = valid; + portinfo->pvid_vlan_filtering = vid; + } + + if (operate_on_storage) + return 0; + + return vsc73xx_vlan_change_pvid_hw(vsc, port, vid, valid); +} + +static int vsc73xx_vlan_clear_pvid(struct vsc73xx *vsc, int port, + bool operate_on_storage, bool tag_8021q_mode) +{ + return vsc73xx_vlan_change_pvid(vsc, port, 0, false, + operate_on_storage, tag_8021q_mode); +} + +static int vsc73xx_vlan_set_pvid(struct vsc73xx *vsc, int port, u16 vid, + bool operate_on_storage, bool tag_8021q_mode) +{ + return vsc73xx_vlan_change_pvid(vsc, port, vid, true, + operate_on_storage, tag_8021q_mode); +} + +static bool vsc73xx_port_get_pvid(struct vsc73xx *vsc, int port, u16 *vid, + bool tag_8021q_mode) +{ + struct vsc73xx_portinfo *portinfo = &vsc->portinfo[port]; + + if (tag_8021q_mode) { + if (portinfo->pvid_tag_8021q_configured) + *vid = portinfo->pvid_tag_8021q; + return portinfo->pvid_tag_8021q_configured; + } + + if (portinfo->pvid_vlan_filtering_configured) + *vid = portinfo->pvid_vlan_filtering; + return portinfo->pvid_vlan_filtering_configured; +} + +static struct vsc73xx_bridge_vlan * +vsc73xx_bridge_vlan_find(struct vsc73xx *vsc, u16 vid) +{ + struct vsc73xx_bridge_vlan *vlan; + + list_for_each_entry(vlan, &vsc->vlans, list) + if (vlan->vid == vid) + return vlan; + + return NULL; +} + +static void vsc73xx_bridge_vlan_summary(struct vsc73xx *vsc, int port, + struct vsc73xx_vlan_summary *summary, + u16 ignored_vid) +{ + size_t num_tagged = 0, num_untagged = 0; + struct vsc73xx_bridge_vlan *vlan; + + list_for_each_entry(vlan, &vsc->vlans, list) { + if (!(vlan->portmask & BIT(port)) || vlan->vid == ignored_vid) + continue; + + if (vlan->untagged & BIT(port)) + num_untagged++; + else + num_tagged++; + } + + summary->num_untagged = num_untagged; + summary->num_tagged = num_tagged; +} + +static u16 vsc73xx_find_first_vlan_untagged(struct vsc73xx *vsc, int port) +{ + struct vsc73xx_bridge_vlan *vlan; + + list_for_each_entry(vlan, &vsc->vlans, list) + if ((vlan->portmask & BIT(port)) && + (vlan->untagged & BIT(port))) + return vlan->vid; + + return VLAN_N_VID; +} + +static int +vsc73xx_port_vlan_filtering(struct dsa_switch *ds, int port, + bool vlan_filtering, struct netlink_ext_ack *extack) +{ + enum vsc73xx_port_vlan_conf port_vlan_conf = VSC73XX_VLAN_IGNORE; + u16 vid_pvid = 0, vid_untagged = 0; + struct vsc73xx_portinfo *portinfo; + struct vsc73xx *vsc = ds->priv; + bool set_untagged = false; + bool set_pvid = false; + + portinfo = &vsc->portinfo[port]; + + /* The swap processed below is required because vsc73xx is using + * tag_8021q. When vlan_filtering is disabled, tag_8021q uses + * pvid/untagged vlans for port recognition. The values configured for + * vlans and pvid/untagged states are stored in portinfo structure. + * When vlan_filtering is enabled, we need to restore pvid/untagged from + * portinfo structure. Analogic routine is processed when vlan_filtering + * is disabled, but values used for tag_8021q are restored. + */ + if (vlan_filtering) { + struct vsc73xx_vlan_summary summary; + + /* Use VLAN_N_VID to count all vlans */ + vsc73xx_bridge_vlan_summary(vsc, port, &summary, VLAN_N_VID); + + port_vlan_conf = (summary.num_untagged > 1) ? + VSC73XX_VLAN_FILTER_UNTAG_ALL : + VSC73XX_VLAN_FILTER; + + if (summary.num_untagged == 1) { + vid_untagged = vsc73xx_find_first_vlan_untagged(vsc, + port); + set_untagged = true; + } + + vid_pvid = portinfo->pvid_vlan_filtering; + set_pvid = portinfo->pvid_vlan_filtering_configured; + } else { + vid_untagged = portinfo->untagged_tag_8021q; + set_untagged = portinfo->untagged_tag_8021q_configured; + vid_pvid = portinfo->pvid_tag_8021q; + set_pvid = portinfo->pvid_tag_8021q_configured; + } + + vsc73xx_vlan_change_untagged_hw(vsc, port, vid_untagged, set_untagged); + vsc73xx_vlan_change_pvid_hw(vsc, port, vid_pvid, set_pvid); + vsc73xx_set_vlan_conf(vsc, port, port_vlan_conf); + + return 0; +} + +static int vsc73xx_port_vlan_add(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_vlan *vlan, + struct netlink_ext_ack *extack) +{ + bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; + bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; + struct dsa_port *dp = dsa_to_port(ds, port); + enum vsc73xx_port_vlan_conf port_vlan_conf; + struct vsc73xx_bridge_vlan *vsc73xx_vlan; + struct vsc73xx_vlan_summary summary; + struct vsc73xx *vsc = ds->priv; + bool operate_on_storage; + int ret = 0; + u16 vid; + + /* Be sure to deny alterations to the configuration done by tag_8021q. + */ + if (vid_is_dsa_8021q(vlan->vid)) { + NL_SET_ERR_MSG_MOD(extack, + "Range 3072-4095 reserved for dsa_8021q operation"); + return -EBUSY; + } + + /* The processed vlan->vid is excluded from the search because the VLAN + * can be re-added with a different set of flags, so it's easiest to + * ignore its old flags from the VLAN database software copy. + */ + vsc73xx_bridge_vlan_summary(vsc, port, &summary, vlan->vid); + + /* VSC73XX allow only three untagged states: none, one or all */ + if ((untagged && summary.num_tagged > 0 && summary.num_untagged > 0) || + (!untagged && summary.num_untagged > 1)) { + NL_SET_ERR_MSG_MOD(extack, + "Port can have only none, one or all untagged vlan"); + return -EBUSY; + } + + vsc73xx_vlan = vsc73xx_bridge_vlan_find(vsc, vlan->vid); + + if (!vsc73xx_vlan) { + vsc73xx_vlan = kzalloc(sizeof(*vsc73xx_vlan), GFP_KERNEL); + if (!vsc73xx_vlan) + return -ENOMEM; + + vsc73xx_vlan->vid = vlan->vid; + vsc73xx_vlan->portmask = 0; + vsc73xx_vlan->untagged = 0; + + INIT_LIST_HEAD(&vsc73xx_vlan->list); + list_add_tail(&vsc73xx_vlan->list, &vsc->vlans); + } + + vsc73xx_vlan->portmask |= BIT(port); + + if (untagged) + vsc73xx_vlan->untagged |= BIT(port); + else + vsc73xx_vlan->untagged &= ~BIT(port); + + /* CPU port must be always tagged because port separation is based on + * tag_8021q. + */ + if (port == CPU_PORT) + goto update_vlan_table; + + operate_on_storage = vsc73xx_tag_8021q_active(dp); + + if (pvid) + ret = vsc73xx_vlan_set_pvid(vsc, port, vlan->vid, + operate_on_storage, false); + else if (vsc73xx_port_get_pvid(vsc, port, &vid, false) && + vid == vlan->vid) + ret = vsc73xx_vlan_clear_pvid(vsc, port, operate_on_storage, + false); + if (ret) + goto err; + + if (operate_on_storage) + goto update_vlan_table; + + port_vlan_conf = VSC73XX_VLAN_FILTER; + + if (summary.num_tagged == 0 && untagged) + port_vlan_conf = VSC73XX_VLAN_FILTER_UNTAG_ALL; + vsc73xx_set_vlan_conf(vsc, port, port_vlan_conf); + + if (port_vlan_conf == VSC73XX_VLAN_FILTER_UNTAG_ALL) + goto update_vlan_table; + + if (untagged) { + ret = vsc73xx_vlan_set_untagged_hw(vsc, port, vlan->vid); + } else if (summary.num_untagged == 1) { + vid = vsc73xx_find_first_vlan_untagged(vsc, port); + ret = vsc73xx_vlan_set_untagged_hw(vsc, port, vid); + } + if (ret) + goto err; + +update_vlan_table: + ret = vsc73xx_update_vlan_table(vsc, port, vlan->vid, true); + if (!ret) + return 0; +err: + list_del(&vsc73xx_vlan->list); + kfree(vsc73xx_vlan); + return ret; +} + +static int vsc73xx_port_vlan_del(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_vlan *vlan) +{ + struct vsc73xx_bridge_vlan *vsc73xx_vlan; + struct vsc73xx_vlan_summary summary; + struct vsc73xx *vsc = ds->priv; + bool operate_on_storage; + int ret; + u16 vid; + + vsc73xx_bridge_vlan_summary(vsc, port, &summary, vlan->vid); + + ret = vsc73xx_update_vlan_table(vsc, port, vlan->vid, false); + if (ret) + return ret; + + operate_on_storage = vsc73xx_tag_8021q_active(dsa_to_port(ds, port)); + + if (!operate_on_storage) { + enum vsc73xx_port_vlan_conf port_vlan_conf = + VSC73XX_VLAN_FILTER; + + if (summary.num_tagged == 0) + port_vlan_conf = VSC73XX_VLAN_FILTER_UNTAG_ALL; + vsc73xx_set_vlan_conf(vsc, port, port_vlan_conf); + + if (summary.num_untagged <= 1) { + vid = vsc73xx_find_first_vlan_untagged(vsc, port); + vsc73xx_vlan_change_untagged_hw(vsc, port, vid, + summary.num_untagged); + } + } + + if (vsc73xx_port_get_pvid(vsc, port, &vid, false) && vid == vlan->vid) + vsc73xx_vlan_clear_pvid(vsc, port, operate_on_storage, false); + + vsc73xx_vlan = vsc73xx_bridge_vlan_find(vsc, vlan->vid); + + if (vsc73xx_vlan) { + vsc73xx_vlan->portmask &= ~BIT(port); + + if (vsc73xx_vlan->portmask) + return 0; + + list_del(&vsc73xx_vlan->list); + kfree(vsc73xx_vlan); + } + + return 0; +} + +static int vsc73xx_port_setup(struct dsa_switch *ds, int port) +{ + struct vsc73xx_portinfo *portinfo; + struct vsc73xx *vsc = ds->priv; + + portinfo = &vsc->portinfo[port]; + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_CAT_DROP, + VSC73XX_CAT_DROP_TAGGED_ENA | + VSC73XX_CAT_DROP_UNTAGGED_ENA, + VSC73XX_CAT_DROP_UNTAGGED_ENA); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_TXUPDCFG, + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA | + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID, 0); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_CAT_PORT_VLAN, + VSC73XX_CAT_PORT_VLAN_VLAN_VID, 0); + + if (port == CPU_PORT) + vsc73xx_set_vlan_conf(vsc, port, VSC73XX_VLAN_FILTER); + else + vsc73xx_set_vlan_conf(vsc, port, VSC73XX_VLAN_IGNORE); + + portinfo->pvid_vlan_filtering_configured = false; + portinfo->pvid_tag_8021q_configured = false; + portinfo->untagged_tag_8021q_configured = false; + + return 0; +} + static void vsc73xx_refresh_fwd_map(struct dsa_switch *ds, int port, u8 state) { struct dsa_port *other_dp, *dp = dsa_to_port(ds, port); @@ -1120,11 +1657,15 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .get_strings = vsc73xx_get_strings, .get_ethtool_stats = vsc73xx_get_ethtool_stats, .get_sset_count = vsc73xx_get_sset_count, + .port_setup = vsc73xx_port_setup, .port_enable = vsc73xx_port_enable, .port_disable = vsc73xx_port_disable, .port_change_mtu = vsc73xx_change_mtu, .port_max_mtu = vsc73xx_get_max_mtu, .port_stp_state_set = vsc73xx_port_stp_state_set, + .port_vlan_filtering = vsc73xx_port_vlan_filtering, + .port_vlan_add = vsc73xx_port_vlan_add, + .port_vlan_del = vsc73xx_port_vlan_del, .phylink_get_caps = vsc73xx_phylink_get_caps, }; diff --git a/drivers/net/dsa/vitesse-vsc73xx.h b/drivers/net/dsa/vitesse-vsc73xx.h index e7b08599a625..ce007273eafe 100644 --- a/drivers/net/dsa/vitesse-vsc73xx.h +++ b/drivers/net/dsa/vitesse-vsc73xx.h @@ -14,6 +14,27 @@ */ #define VSC73XX_MAX_NUM_PORTS 8 +/** + * struct vsc73xx_portinfo - port data structure: contains storage data + * @pvid_vlan_filtering_configured: imforms if port have configured pvid in vlan + * fitering mode + * @pvid_vlan_filtering: pvid vlan number used in vlan fitering mode + * @pvid_tag_8021q_configured: imforms if port have configured pvid in tag_8021q + * mode + * @pvid_tag_8021q: pvid vlan number used in tag_8021q mode + * @untagged_tag_8021q_configured: imforms if port have configured untagged vlan + * in tag_8021q mode + * @untagged_tag_8021q: untagged vlan number used in tag_8021q mode + */ +struct vsc73xx_portinfo { + bool pvid_vlan_filtering_configured; + u16 pvid_vlan_filtering; + bool pvid_tag_8021q_configured; + u16 pvid_tag_8021q; + bool untagged_tag_8021q_configured; + u16 untagged_tag_8021q; +}; + /** * struct vsc73xx - VSC73xx state container: main data structure * @dev: The device pointer @@ -25,6 +46,10 @@ * @addr: MAC address used in flow control frames * @ops: Structure with hardware-dependent operations * @priv: Pointer to the configuration interface structure + * @portinfo: Storage table portinfo structructures + * @vlans: List of configured vlans. Contains port mask and untagged status of + * every vlan configured in port vlan operation. It doesn't cover tag_8021q + * vlans. */ struct vsc73xx { struct device *dev; @@ -35,6 +60,8 @@ struct vsc73xx { u8 addr[ETH_ALEN]; const struct vsc73xx_ops *ops; void *priv; + struct vsc73xx_portinfo portinfo[VSC73XX_MAX_NUM_PORTS]; + struct list_head vlans; }; /** @@ -49,6 +76,21 @@ struct vsc73xx_ops { u32 val); }; +/** + * struct vsc73xx_bridge_vlan - VSC73xx driver structure which keeps vlan + * database copy + * @vid: VLAN number + * @portmask: each bit represents one port + * @untagged: each bit represents one port configured with @vid untagged + * @list: list structure + */ +struct vsc73xx_bridge_vlan { + u16 vid; + u8 portmask; + u8 untagged; + struct list_head list; +}; + int vsc73xx_is_addr_valid(u8 block, u8 subblock); int vsc73xx_probe(struct vsc73xx *vsc); void vsc73xx_remove(struct vsc73xx *vsc); From patchwork Wed Apr 3 10:37:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615784 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f48.google.com (mail-ej1-f48.google.com [209.85.218.48]) (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 335CB146D5E; Wed, 3 Apr 2024 10:38:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140698; cv=none; b=Pzs4L4X7rY8C0EJKnTodr+ggCM760lx7IwVjLfjM3A84fT+Zs2aqyLliGwevTKJN/eIwDS1zBvsCbxDF4oTWg/7TiWQ8kMuws77VCSrahNAS+OFmYCQKTPU3L0AjOHtc7jWzlg5Cl+/yEZCql31OZ1uX2ofritwGL4gLMM3WUqU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140698; c=relaxed/simple; bh=GZjXmqsxTl886s48CtB/uBgr4u+1gG1/6bdKIonGezg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rpBmvaH1jbBFwJmS4xvr0UbuVxkQxlQXRq6urwAEtMhjB+eZSM7P6kbNc8iE+cUCXmQaaN5gVygmEkL2jcP/Bcmk48RrZgiFTsIl80fAkIERJrt8YxbZ1tBeX0/SHp5fvuiOBBhpiFJuL62pjkZE+t9+sP0om3OVaUQocIUmDNU= 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=NI/LdOUp; arc=none smtp.client-ip=209.85.218.48 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="NI/LdOUp" Received: by mail-ej1-f48.google.com with SMTP id a640c23a62f3a-a4a387ff7acso753948366b.2; Wed, 03 Apr 2024 03:38:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140694; x=1712745494; 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=Msw6XT9KO7yx5p18PrVia4phRl71DU7zcjCvgmrHJ+k=; b=NI/LdOUpCYDTyMoM4bGhRn9HHQGLeEwzKitVWmV+BLyXxjfq9HKG+VCwdX8qodEjup 9YDD37yU7Lwp+2WsNoze1i4nziu65gtYcJLinufeDuTEiV+s4Cu4rdWcCikJ9BXU4hyH ivCxPZbcDqbE6siEhoBatHkybYhPjvq9i6aFmLo2zz8mXBEdUZIILnLxRnv68zB1S30d k0cVmvWEh4Obaoo1NXiDa9rz53ZRc4KJY1Ubt9QPo1GoJcHvFR75d1cOhfmnQ+iv90q8 CIu0ZaxsQUWYj3xUZxfk3vOT9SaZ+3hjvBdWYpMPNYPJfqk6kzq3rEqKvlWxdx0CMUoB GsnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140694; x=1712745494; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Msw6XT9KO7yx5p18PrVia4phRl71DU7zcjCvgmrHJ+k=; b=bVaiYH5uEE/2fDWuHeuXCWIG9zv3vHex92F99DxBKArbXb0A77kRDysWJosTq3gxf+ WxloVfg5AxzKPp/1XfBC8x679Ef8Z7BLEKxMT5mcskNgWMKswnAiBbPOC+CWZKmSFIxI tKAQxL72Km237C+te+WfvUhn/PcIK0qb1K9SVGid4qHFLkE9szRy2ZU5p8+dpXa9SXEk 5zpqfDUmoXEK20T8hP0BWi17uD/iZDt3l3Jflvd/ljWo83nZuoOZNoKHxqg1CXb27l2l 0xW07EP9IdIz2cT459/uSSjDQkECxU+rspl+B5245ziS2/LA3HoCYF73a3m1EyjrY2UV jYGQ== X-Forwarded-Encrypted: i=1; AJvYcCXwMh+YG7QXhlQopEIxUFJogropdmAK6bbfQNblYkNjt+2pjjLwCjAonRkYvub08YRNMD6iLj0Ls4mR2+sMCTEMUXE5OoJAEL3t3qnK X-Gm-Message-State: AOJu0YxqDHaKAuqro/5Rk1kftljFFiTIGShjHPjuFinqsSJK1/tz5d5v CN/0Axb3QF6iiPVjG2s/dcR/3/MGKoXh71+0qczvXh4kKUyIRUtgJUxokm8lhSE= X-Google-Smtp-Source: AGHT+IHWqya/PqeDmwRmotS0YDYDb/yYj0rY27pQLSyCl7ZKXU+UZUlVImdTPzmhSBwJB0tWtkigdQ== X-Received: by 2002:a17:906:1c4b:b0:a44:1fcf:9b97 with SMTP id l11-20020a1709061c4b00b00a441fcf9b97mr1531020ejg.24.1712140694239; Wed, 03 Apr 2024 03:38:14 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:13 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Vladimir Oltean , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 08/16] net: dsa: tag_sja1105: absorb logic for not overwriting precise info into dsa_8021q_rcv() Date: Wed, 3 Apr 2024 12:37:24 +0200 Message-Id: <20240403103734.3033398-9-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Vladimir Oltean In both sja1105_rcv() and sja1110_rcv(), we may have precise source port information coming from parallel hardware mechanisms, in addition to the tag_8021q header. Only sja1105_rcv() has extra logic to not overwrite that precise info with what's present in the VLAN tag. This is because sja1110_rcv() gets by, by having a reversed set of checks when assigning skb->dev. When the source port is imprecise (vbid >=1), source_port and switch_id will be set to zeroes by dsa_8021q_rcv(), which might be problematic. But by checking for vbid >= 1 first, sja1110_rcv() fends that off. We would like to make more code common between sja1105_rcv() and sja1110_rcv(), and for that, we need to make sure that sja1110_rcv() also goes through the precise source port preservation logic. Signed-off-by: Vladimir Oltean Signed-off-by: Pawel Dembicki --- v8, v7, v6: - resend only v5: - add missing SoB v4: - introduced patch net/dsa/tag_8021q.c | 32 +++++++++++++++++++++++++++++--- net/dsa/tag_sja1105.c | 23 +++-------------------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/net/dsa/tag_8021q.c b/net/dsa/tag_8021q.c index 71b26ae6db39..3cb0293793a5 100644 --- a/net/dsa/tag_8021q.c +++ b/net/dsa/tag_8021q.c @@ -497,9 +497,21 @@ struct net_device *dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit, } EXPORT_SYMBOL_GPL(dsa_tag_8021q_find_port_by_vbid); +/** + * dsa_8021q_rcv - Decode source information from tag_8021q header + * @skb: RX socket buffer + * @source_port: pointer to storage for precise source port information. + * If this is known already from outside tag_8021q, the pre-initialized + * value is preserved. If not known, pass -1. + * @switch_id: similar to source_port. + * @vbid: pointer to storage for imprecise bridge ID. Must be pre-initialized + * with -1. If a positive value is returned, the source_port and switch_id + * are invalid. + */ void dsa_8021q_rcv(struct sk_buff *skb, int *source_port, int *switch_id, int *vbid) { + int tmp_source_port, tmp_switch_id, tmp_vbid; u16 vid, tci; if (skb_vlan_tag_present(skb)) { @@ -513,11 +525,25 @@ void dsa_8021q_rcv(struct sk_buff *skb, int *source_port, int *switch_id, vid = tci & VLAN_VID_MASK; - *source_port = dsa_8021q_rx_source_port(vid); - *switch_id = dsa_8021q_rx_switch_id(vid); + tmp_source_port = dsa_8021q_rx_source_port(vid); + tmp_switch_id = dsa_8021q_rx_switch_id(vid); + tmp_vbid = dsa_tag_8021q_rx_vbid(vid); + + /* Precise source port information is unknown when receiving from a + * VLAN-unaware bridging domain, and tmp_source_port and tmp_switch_id + * are zeroes in this case. + * + * Preserve the source information from hardware-specific mechanisms, + * if available. This allows us to not overwrite a valid source port + * and switch ID with less precise values. + */ + if (tmp_vbid == 0 && *source_port == -1) + *source_port = tmp_source_port; + if (tmp_vbid == 0 && *switch_id == -1) + *switch_id = tmp_switch_id; if (vbid) - *vbid = dsa_tag_8021q_rx_vbid(vid); + *vbid = tmp_vbid; skb->priority = (tci & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; } diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c index 1aba1d05c27a..48886d4b7e3e 100644 --- a/net/dsa/tag_sja1105.c +++ b/net/dsa/tag_sja1105.c @@ -524,30 +524,13 @@ static struct sk_buff *sja1105_rcv(struct sk_buff *skb, /* Normal data plane traffic and link-local frames are tagged with * a tag_8021q VLAN which we have to strip */ - if (sja1105_skb_has_tag_8021q(skb)) { - int tmp_source_port = -1, tmp_switch_id = -1; - - sja1105_vlan_rcv(skb, &tmp_source_port, &tmp_switch_id, &vbid, - &vid); - /* Preserve the source information from the INCL_SRCPT option, - * if available. This allows us to not overwrite a valid source - * port and switch ID with zeroes when receiving link-local - * frames from a VLAN-unaware bridged port (non-zero vbid) or a - * VLAN-aware bridged port (non-zero vid). Furthermore, the - * tag_8021q source port information is only of trust when the - * vbid is 0 (precise port). Otherwise, tmp_source_port and - * tmp_switch_id will be zeroes. - */ - if (vbid == 0 && source_port == -1) - source_port = tmp_source_port; - if (vbid == 0 && switch_id == -1) - switch_id = tmp_switch_id; - } else if (source_port == -1 && switch_id == -1) { + if (sja1105_skb_has_tag_8021q(skb)) + sja1105_vlan_rcv(skb, &source_port, &switch_id, &vbid, &vid); + else if (source_port == -1 && switch_id == -1) /* Packets with no source information have no chance of * getting accepted, drop them straight away. */ return NULL; - } if (source_port != -1 && switch_id != -1) skb->dev = dsa_conduit_find_user(netdev, switch_id, source_port); From patchwork Wed Apr 3 10:37:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615785 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) (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 6C1B8147C94; Wed, 3 Apr 2024 10:38:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140701; cv=none; b=udYAEAK+fLUcMx9PzOOjcfBp0cyDzEl8n1l9FA/JKQ5yVKG3ldMbzfucVew824BwP0zGhw8gkTjVv1SXxysDgWrVWBxz01sKP38VpA17IfCXdQPrZbH5XHL6+SkYKfadOoltbh7gerHfK6hGn8AKQrzvQ0JYRBNnui8aKwjswzw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140701; c=relaxed/simple; bh=/1PYhY8+2O5h3/1dpp5yGpsQ3rsJbn94bpYR2AU12xc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kWfVXVllesnA2g6OS8hSj65l9K6gwiPdrUjy6gJXWnuJQum58qe+0J2ioxbL4svJbKXGj2TZzIP/A/qv3gLfhxdAjlpSzVDWzaqWguIVKvwyiXgGC5aIl0oWjsBCxCX92szmT44diAWApGSj2PPtvkgtAsatzv8u0bpqgmVJYoA= 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=Gx4CqlzS; arc=none smtp.client-ip=209.85.218.53 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="Gx4CqlzS" Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-a44ad785a44so710710366b.3; Wed, 03 Apr 2024 03:38:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140697; x=1712745497; 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=63Sv42NZ4UQ21VsUCZjz4D7LimPpZB9TqWKZW2m0UhA=; b=Gx4CqlzSzxxocRJJG/hRuPNwHWWw/fmxDMTHZrW7QPftAn6Mgli+o2kvesfmXawT4p 3fc7AsBlmL2bwya7ZCQpX2u1eQONPub3mAx61klyEQF4tBi7319zvVWMw2FQZ1XAfv7v SnNMm1lWHHB9eKZi+1ijzPpsorh03TN4vaXRGtSc9Sf0Ra3jaEn1FoSE+F+n4DALInLc mvShlV19oMBM/36BxdhWD9gaA6uDV6dN1ZFlje/MzO7YP03hOU0LBL0uniN0ATHBXSDJ n0MBlC98z2t9DZuN1uL081a6DW2eLqjfPAuib35zAwrNDPBj7+c3rraqNPSvfrEWNFU9 qvpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140697; x=1712745497; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=63Sv42NZ4UQ21VsUCZjz4D7LimPpZB9TqWKZW2m0UhA=; b=Bfzxq8//RlhgOTIdjUyB1rWZfKYTo0Cd+9IIxSSP+GjLSK8GnDkJyqa7bQ7TOfQwjd gyVB2SUgDa3SOnhyrNNqAWNeZdrnEYN4sA9sCWL1YwptZowOWrZwM3/BRz80hJaCHxfj z2HS4ZyVbcyHH50UJ4a5jNqpUQh90UhMOIPSinb+aJav68qtFAnOdycn+uomY0Caf7u2 WlX5uBO32Qpvl2OgvRS03y9j1UvSXMEIgq0hkKh7daBXCsRfG5lNSaT4EhYLB+wElWsm T5DgQmMkOLsYiL5aFN4HUmaCLsGLkeCU9GKb+tWOnzANsJ7EM6T7KjmRKz/gkjr7TnS8 3fmQ== X-Forwarded-Encrypted: i=1; AJvYcCWwbVexRiIVj2K7E+5KoPvDrmlDqRsctJEhdLmWoICq/zFDVMr0G5SRGbUnuqGtIeRb3/QsLFvSlX9N6M96Pckp5IcvwILqEL79Rq41 X-Gm-Message-State: AOJu0YzOXf2LvzhM5CmDg7COBvPjpYNiIdfuW8SRdYciKUkg7NbssKZy JQtvQbdZ7lUEccEm4pyqLRGQ9axvy5iM9nBWsOnxnCMKWZ9QFM4hp7znqM21KNU= X-Google-Smtp-Source: AGHT+IEReqsxkMC1HywoA3Hap9Dg/HfcE9vt/Jd6gu61bvvTo+O0NmYMvp5P81PGu9l9NPkeGChzDA== X-Received: by 2002:a17:906:c109:b0:a4e:3b78:ed1f with SMTP id do9-20020a170906c10900b00a4e3b78ed1fmr11134901ejc.47.1712140697518; Wed, 03 Apr 2024 03:38:17 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:17 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Vladimir Oltean , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 09/16] net: dsa: tag_sja1105: absorb entire sja1105_vlan_rcv() into dsa_8021q_rcv() Date: Wed, 3 Apr 2024 12:37:25 +0200 Message-Id: <20240403103734.3033398-10-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Vladimir Oltean tag_sja1105 has a wrapper over dsa_8021q_rcv(): sja1105_vlan_rcv(), which determines whether the packet came from a bridge with vlan_filtering=1 (the case resolved via dsa_find_designated_bridge_port_by_vid()), or if it contains a tag_8021q header. Looking at a new tagger implementation for vsc73xx, based also on tag_8021q, it is becoming clear that the logic is needed there as well. So instead of forcing each tagger to wrap around dsa_8021q_rcv(), let's merge the logic into the core. Signed-off-by: Vladimir Oltean Signed-off-by: Pawel Dembicki --- v8, v7, v6: - resend only v5: - add missing SoB v4: - introduced patch net/dsa/tag_8021q.c | 34 ++++++++++++++++++++++++++++------ net/dsa/tag_8021q.h | 2 +- net/dsa/tag_ocelot_8021q.c | 2 +- net/dsa/tag_sja1105.c | 32 ++++---------------------------- 4 files changed, 34 insertions(+), 36 deletions(-) diff --git a/net/dsa/tag_8021q.c b/net/dsa/tag_8021q.c index 3cb0293793a5..332b0ae02645 100644 --- a/net/dsa/tag_8021q.c +++ b/net/dsa/tag_8021q.c @@ -507,27 +507,39 @@ EXPORT_SYMBOL_GPL(dsa_tag_8021q_find_port_by_vbid); * @vbid: pointer to storage for imprecise bridge ID. Must be pre-initialized * with -1. If a positive value is returned, the source_port and switch_id * are invalid. + * @vid: pointer to storage for original VID, in case tag_8021q decoding failed. + * + * If the packet has a tag_8021q header, decode it and set @source_port, + * @switch_id and @vbid, and strip the header. Otherwise set @vid and keep the + * header in the hwaccel area of the packet. */ void dsa_8021q_rcv(struct sk_buff *skb, int *source_port, int *switch_id, - int *vbid) + int *vbid, int *vid) { int tmp_source_port, tmp_switch_id, tmp_vbid; - u16 vid, tci; + __be16 vlan_proto; + u16 tmp_vid, tci; if (skb_vlan_tag_present(skb)) { + vlan_proto = skb->vlan_proto; tci = skb_vlan_tag_get(skb); __vlan_hwaccel_clear_tag(skb); } else { + struct vlan_ethhdr *hdr = vlan_eth_hdr(skb); + + vlan_proto = hdr->h_vlan_proto; skb_push_rcsum(skb, ETH_HLEN); __skb_vlan_pop(skb, &tci); skb_pull_rcsum(skb, ETH_HLEN); } - vid = tci & VLAN_VID_MASK; + tmp_vid = tci & VLAN_VID_MASK; + if (!vid_is_dsa_8021q(tmp_vid)) + goto not_tag_8021q; - tmp_source_port = dsa_8021q_rx_source_port(vid); - tmp_switch_id = dsa_8021q_rx_switch_id(vid); - tmp_vbid = dsa_tag_8021q_rx_vbid(vid); + tmp_source_port = dsa_8021q_rx_source_port(tmp_vid); + tmp_switch_id = dsa_8021q_rx_switch_id(tmp_vid); + tmp_vbid = dsa_tag_8021q_rx_vbid(tmp_vid); /* Precise source port information is unknown when receiving from a * VLAN-unaware bridging domain, and tmp_source_port and tmp_switch_id @@ -546,5 +558,15 @@ void dsa_8021q_rcv(struct sk_buff *skb, int *source_port, int *switch_id, *vbid = tmp_vbid; skb->priority = (tci & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; + return; + +not_tag_8021q: + if (vid) + *vid = tmp_vid; + if (vbid) + *vbid = -1; + + /* Put the tag back */ + __vlan_hwaccel_put_tag(skb, vlan_proto, tci); } EXPORT_SYMBOL_GPL(dsa_8021q_rcv); diff --git a/net/dsa/tag_8021q.h b/net/dsa/tag_8021q.h index 41f7167ac520..0c6671d7c1c2 100644 --- a/net/dsa/tag_8021q.h +++ b/net/dsa/tag_8021q.h @@ -14,7 +14,7 @@ struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev, u16 tpid, u16 tci); void dsa_8021q_rcv(struct sk_buff *skb, int *source_port, int *switch_id, - int *vbid); + int *vbid, int *vid); struct net_device *dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit, int vbid); diff --git a/net/dsa/tag_ocelot_8021q.c b/net/dsa/tag_ocelot_8021q.c index b059381310fe..8e8b1bef6af6 100644 --- a/net/dsa/tag_ocelot_8021q.c +++ b/net/dsa/tag_ocelot_8021q.c @@ -81,7 +81,7 @@ static struct sk_buff *ocelot_rcv(struct sk_buff *skb, { int src_port, switch_id; - dsa_8021q_rcv(skb, &src_port, &switch_id, NULL); + dsa_8021q_rcv(skb, &src_port, &switch_id, NULL, NULL); skb->dev = dsa_conduit_find_user(netdev, switch_id, src_port); if (!skb->dev) diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c index 48886d4b7e3e..7639ccb94d35 100644 --- a/net/dsa/tag_sja1105.c +++ b/net/dsa/tag_sja1105.c @@ -472,37 +472,14 @@ static bool sja1110_skb_has_inband_control_extension(const struct sk_buff *skb) return ntohs(eth_hdr(skb)->h_proto) == ETH_P_SJA1110; } -/* If the VLAN in the packet is a tag_8021q one, set @source_port and - * @switch_id and strip the header. Otherwise set @vid and keep it in the - * packet. - */ -static void sja1105_vlan_rcv(struct sk_buff *skb, int *source_port, - int *switch_id, int *vbid, u16 *vid) -{ - struct vlan_ethhdr *hdr = vlan_eth_hdr(skb); - u16 vlan_tci; - - if (skb_vlan_tag_present(skb)) - vlan_tci = skb_vlan_tag_get(skb); - else - vlan_tci = ntohs(hdr->h_vlan_TCI); - - if (vid_is_dsa_8021q(vlan_tci & VLAN_VID_MASK)) - return dsa_8021q_rcv(skb, source_port, switch_id, vbid); - - /* Try our best with imprecise RX */ - *vid = vlan_tci & VLAN_VID_MASK; -} - static struct sk_buff *sja1105_rcv(struct sk_buff *skb, struct net_device *netdev) { - int source_port = -1, switch_id = -1, vbid = -1; + int source_port = -1, switch_id = -1, vbid = -1, vid = -1; struct sja1105_meta meta = {0}; struct ethhdr *hdr; bool is_link_local; bool is_meta; - u16 vid; hdr = eth_hdr(skb); is_link_local = sja1105_is_link_local(skb); @@ -525,7 +502,7 @@ static struct sk_buff *sja1105_rcv(struct sk_buff *skb, * a tag_8021q VLAN which we have to strip */ if (sja1105_skb_has_tag_8021q(skb)) - sja1105_vlan_rcv(skb, &source_port, &switch_id, &vbid, &vid); + dsa_8021q_rcv(skb, &source_port, &switch_id, &vbid, &vid); else if (source_port == -1 && switch_id == -1) /* Packets with no source information have no chance of * getting accepted, drop them straight away. @@ -660,9 +637,8 @@ static struct sk_buff *sja1110_rcv_inband_control_extension(struct sk_buff *skb, static struct sk_buff *sja1110_rcv(struct sk_buff *skb, struct net_device *netdev) { - int source_port = -1, switch_id = -1, vbid = -1; + int source_port = -1, switch_id = -1, vbid = -1, vid = -1; bool host_only = false; - u16 vid = 0; if (sja1110_skb_has_inband_control_extension(skb)) { skb = sja1110_rcv_inband_control_extension(skb, &source_port, @@ -674,7 +650,7 @@ static struct sk_buff *sja1110_rcv(struct sk_buff *skb, /* Packets with in-band control extensions might still have RX VLANs */ if (likely(sja1105_skb_has_tag_8021q(skb))) - sja1105_vlan_rcv(skb, &source_port, &switch_id, &vbid, &vid); + dsa_8021q_rcv(skb, &source_port, &switch_id, &vbid, &vid); if (vbid >= 1) skb->dev = dsa_tag_8021q_find_port_by_vbid(netdev, vbid); From patchwork Wed Apr 3 10:37:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615786 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) (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 9D1EE1411E7; Wed, 3 Apr 2024 10:38:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140704; cv=none; b=jRDswXW2RXreqMYOOXXMIbXYups9b8WjiPKiwIB9B6rZ6SqhSor4BX1QRCkAzFPYc2MSJZh4faDtz3J/WyMODEXntv09HpQpyRJ+1OY4iaxLKlYUdh3Jj3FtGz0hGaX2eUQfVtsXiKO6D2iCB5ame4LGX1DA1/X+ZVmkl+plQDQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140704; c=relaxed/simple; bh=YRa59gJY/XsWFS+u6VlDmpnJ/CnyVXNTail4JvfjdE8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FcUeKwwHoySn6B1R3Xk67m3fQV1Gz/sht9z3eMEs9friXiOvL8sWXd3KdNSlue4qpeGe7gcoTrAmqQN/RzmMl7jK0ZfJSUYcLCuZ/ymNBmbW0AfO5W7Hjuf+quRbH9JRfQi8lN574ynGE9CL0dAt9PEGCh/RZ2E66tWVeayGrD4= 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=WJm5OFpG; arc=none smtp.client-ip=209.85.218.52 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="WJm5OFpG" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-a450bedffdfso712084066b.3; Wed, 03 Apr 2024 03:38:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140701; x=1712745501; 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=4unurX3MPlAms8eZV65/F9OvE29jWvNeK6uk80WwigY=; b=WJm5OFpG3pSBfRGsYDIcjGrwM4opPlFestsag+y1JnOw+VmAUGY6+YoXGKJjL7NKmi eA5G0arf6i2PFIi57FOS4p+5nLdY5GL6hFv2mY+vnfkrlOKaGazjQ28Ce3yK7gLlX9Or gEkDyp3nexJ2Mbou4Zcredp2CLLft91oMlI6nQiLqQ6NY3eIwZmClvadk/CwYSidgcYy 8CHcdFzkMVy/rqyL+EOOhAzLA/LbEXplPtujs15HoK2jgWUJfrlsS4jmLtwIRLDSwvTY 2anRdbJmLAnV9qw6KyFFOwfYBf6xZMENluB7wx1cEKBPL/qlvlTrpdU4hPrg1T9megSw e+7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140701; x=1712745501; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4unurX3MPlAms8eZV65/F9OvE29jWvNeK6uk80WwigY=; b=vw7FJP5A1nhUcTGziHlJqRdV7nau+9f7166JhczUtkHi1DKTPvFAtyx4O2DJp6GXlE dP7RC32OWXpLfrYf5nJNvxR6QdyAUf5lP+jWrp3zZ4DOcDdBovkc2FvnmjT54zCqE64k 3YAXx/KZfvfj6x8kjKfd93YoQ0DQPrEkUuTObyCqxoSRNOTL6DwZt/HWtKcw6ydjvyqR exL//FkUsnHHXUfEC9ozCB93nx7AwpzL0rwI9mtO6H624AuOOQE5A6sufT9Yuiotfaun jvYdlFY6v56KXa7HUCtFH36u56mgNm3JPjApCNAQ+Wz0c/8wBsR0VQLqmc71IUGIUAAp mNpg== X-Forwarded-Encrypted: i=1; AJvYcCWdmLPhAIho67VLXP06TJz73TrgBJTPGreGMQ/PFqDjqc2bJq1aDrMN1p7ZTwdEem/mD4jUkhTBLkuTv5ylDNvO+0yINWfjrdd9ni7s X-Gm-Message-State: AOJu0YxTLJ9/VyoLtdMGdWdYxk14QmCHBy/YCjILk2yRtsfV6LViw10G HlAQ4qpObUXGZU5IZLVB1iqPZIcvS9Q8C9B63XTcQhue1QpxQlRz3ocsXiVlJmw= X-Google-Smtp-Source: AGHT+IGjPP+3VGxR12GrZA9pz8ZkeM3mhbsCYSHUd2PEB2a1HF1xGJSBePxNCTsPeFLHEuY3b8qumg== X-Received: by 2002:a17:907:844:b0:a4e:17bb:b06 with SMTP id ww4-20020a170907084400b00a4e17bb0b06mr1974795ejb.13.1712140700758; Wed, 03 Apr 2024 03:38:20 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:20 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Vladimir Oltean , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 10/16] net: dsa: tag_sja1105: prefer precise source port info on SJA1110 too Date: Wed, 3 Apr 2024 12:37:26 +0200 Message-Id: <20240403103734.3033398-11-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Vladimir Oltean Now that dsa_8021q_rcv() handles better the case where we don't overwrite the precise source information if it comes from an external (non-tag_8021q) source, we can now unify the call sequence between sja1105_rcv() and sja1110_rcv(). This is a preparatory change for creating a higher-level wrapper for the entire sequence which will live in tag_8021q. Signed-off-by: Vladimir Oltean Signed-off-by: Pawel Dembicki --- v8,v7,v6,v5: - resend only v4: - introduce patch and replace 'slave' with 'conduit' after rebase net/dsa/tag_sja1105.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c index 7639ccb94d35..35a6346549f2 100644 --- a/net/dsa/tag_sja1105.c +++ b/net/dsa/tag_sja1105.c @@ -652,12 +652,12 @@ static struct sk_buff *sja1110_rcv(struct sk_buff *skb, if (likely(sja1105_skb_has_tag_8021q(skb))) dsa_8021q_rcv(skb, &source_port, &switch_id, &vbid, &vid); - if (vbid >= 1) + if (source_port != -1 && switch_id != -1) + skb->dev = dsa_conduit_find_user(netdev, switch_id, source_port); + else if (vbid >= 1) skb->dev = dsa_tag_8021q_find_port_by_vbid(netdev, vbid); - else if (source_port == -1 || switch_id == -1) - skb->dev = dsa_find_designated_bridge_port_by_vid(netdev, vid); else - skb->dev = dsa_conduit_find_user(netdev, switch_id, source_port); + skb->dev = dsa_find_designated_bridge_port_by_vid(netdev, vid); if (!skb->dev) { netdev_warn(netdev, "Couldn't decode source port\n"); return NULL; From patchwork Wed Apr 3 10:37:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615787 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51]) (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 1C3DD148827; Wed, 3 Apr 2024 10:38:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140707; cv=none; b=scjc3fXgZ6ECUwpp2MBvwb1bpYi0D2R166g9GBWdJEo+qfQP30NnJx1Z/AYJztzy6rjz2DYga1odyOIPpjyzQHP4eFhrcMGQJrlLOGmPy47hFvXZ+GLobBF9nDlt00jKtbswxh97p/QOm4F9H/C1wYXWMGEBeJdVre1e+canyXs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140707; c=relaxed/simple; bh=cZjp5uVLZQIOhLeBrixOuM4jwIG/7EWXnyZIG2Qqypo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=RAuWIEm7Ygkb92v3Uh222BXAOJLv9bDl+2jo8FAqVn84kGBDw5XjXLKzIg2c0hRotEod5LTWoq6+uaGw/xV6qMSldxGk+oTBj0mS6v9LqGeb4k7vPC13GyW2mcn6BtvPzEmoXnh7ytV+5SxK4HQOyuJ+zuu3bLemfq81XxLJM2s= 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=na6A/V70; arc=none smtp.client-ip=209.85.218.51 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="na6A/V70" Received: by mail-ej1-f51.google.com with SMTP id a640c23a62f3a-a4e692ca8c4so417155366b.3; Wed, 03 Apr 2024 03:38:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140704; x=1712745504; 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=/gWm9wooWm3L5N3s5DoTv8ldrCIwk7HKKRoQ/4lSLv4=; b=na6A/V70qydAe8sjktYXzKswBz83On9R4Yq7Wcbp3RRR1nQl7p3lej74ewNK6S6D21 CJizP/rVlA6eXyHyeOHX6DbuxEu/rg2K67z+u8H21DFXNgtjdcOER1HXRivpOBHWprbw e2aLC47rmnRmkSDWTL7IVBP7J/fUHgzE+HRSw/yYNSAF+Ec29GGeRHsX0QbNqfuOup3A oR17niREtfuJ2cEdaeVFGm+7pZNQ305z/5uVqQgaYaqK4Tg6rpAyafpK6TcQrmvKAxLA ofQW0YydYYgZamfDL4Q1nPSdlNdR73cm56bcK+zO2/PrYGvWe7ZWxNZATnuo5q0AIAC6 +rLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140704; x=1712745504; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/gWm9wooWm3L5N3s5DoTv8ldrCIwk7HKKRoQ/4lSLv4=; b=rrIITChS+9pf/JrhMteW7qNBBERnSrUz8aeMezJiFY2W8cSNosgMZoUXFqr8kNG3Tv 6l3klX2M4soQC6OtnTtMXzqNBzTlJWbnzA4dUHuLIK4mUwfPj+Kl+EjBCCXvvBozLxQw xcj4Y3H9Tph4C3PWLsihHpl+j9nhl45ldH04NjhM2bOhYG9dFcps4jINnHV9Cq7YJmTO hUZs0jk1GqsdnQGu1gAiEi6Xx+jZD0yCsxRxZ9OrgNF5PEHLnkl8qHGfsvptiKCqyix3 iCfyPdho9eIbpMIU/M3tpR7BwmH5havZ+jhnUeNNk4AyrmZ97U/lpiWotWY3YiZ7hBHg lApA== X-Forwarded-Encrypted: i=1; AJvYcCXYPHBGfYUePavp6TFJ86K3ODH59lh4TwHYzrHVgX9LqnTPZXcdsQKdwARBGUs+fPWU6KiN2rl9owbNhwjwXF5IcCQa2kyNKQsMUS0e X-Gm-Message-State: AOJu0YyPcrWvtg4FAxLaw0Yp+ZqqB5/jqNMGh+3iVlGJMJ0kUmLKvCXo c2Ww0wXB6QDAI+y8iaOs1ngp4GLj4lS6tnq0M1SUTySNNiPCm1lHlnR3PRT4JA4= X-Google-Smtp-Source: AGHT+IFFZTRdlRVfTCvB+WQxWukPm5247EzDmcS3fZugTj+PyX+VVznQR25WslTH/DSQ5HPtHzTQLw== X-Received: by 2002:a17:907:96a6:b0:a4e:7a36:4c38 with SMTP id hd38-20020a17090796a600b00a4e7a364c38mr6719665ejc.20.1712140704088; Wed, 03 Apr 2024 03:38:24 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:23 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Vladimir Oltean , Pawel Dembicki , Florian Fainelli , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 11/16] net: dsa: tag_sja1105: refactor skb->dev assignment to dsa_tag_8021q_find_user() Date: Wed, 3 Apr 2024 12:37:27 +0200 Message-Id: <20240403103734.3033398-12-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org From: Vladimir Oltean A new tagging protocol implementation based on tag_8021q is on the horizon, and it appears that it also has to open-code the complicated logic of finding a source port based on a VLAN header. Create a single dsa_tag_8021q_find_user() and make sja1105 call it. Signed-off-by: Vladimir Oltean Signed-off-by: Pawel Dembicki Reviewed-by: Florian Fainelli --- v8: - resend only v7: - added 'Reviewed-by' only v6, v5: - resend only v4: - introduce patch and change from master to conduit and slave to user net/dsa/tag_8021q.c | 19 ++++++++++++++++--- net/dsa/tag_8021q.h | 5 +++-- net/dsa/tag_sja1105.c | 17 +++++------------ 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/net/dsa/tag_8021q.c b/net/dsa/tag_8021q.c index 332b0ae02645..454d36c84671 100644 --- a/net/dsa/tag_8021q.c +++ b/net/dsa/tag_8021q.c @@ -468,8 +468,8 @@ struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev, } EXPORT_SYMBOL_GPL(dsa_8021q_xmit); -struct net_device *dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit, - int vbid) +static struct net_device * +dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit, int vbid) { struct dsa_port *cpu_dp = conduit->dsa_ptr; struct dsa_switch_tree *dst = cpu_dp->dst; @@ -495,7 +495,20 @@ struct net_device *dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit, return NULL; } -EXPORT_SYMBOL_GPL(dsa_tag_8021q_find_port_by_vbid); + +struct net_device *dsa_tag_8021q_find_user(struct net_device *conduit, + int source_port, int switch_id, + int vid, int vbid) +{ + /* Always prefer precise source port information, if available */ + if (source_port != -1 && switch_id != -1) + return dsa_conduit_find_user(conduit, switch_id, source_port); + else if (vbid >= 1) + return dsa_tag_8021q_find_port_by_vbid(conduit, vbid); + + return dsa_find_designated_bridge_port_by_vid(conduit, vid); +} +EXPORT_SYMBOL_GPL(dsa_tag_8021q_find_user); /** * dsa_8021q_rcv - Decode source information from tag_8021q header diff --git a/net/dsa/tag_8021q.h b/net/dsa/tag_8021q.h index 0c6671d7c1c2..27b8906f99ec 100644 --- a/net/dsa/tag_8021q.h +++ b/net/dsa/tag_8021q.h @@ -16,8 +16,9 @@ struct sk_buff *dsa_8021q_xmit(struct sk_buff *skb, struct net_device *netdev, void dsa_8021q_rcv(struct sk_buff *skb, int *source_port, int *switch_id, int *vbid, int *vid); -struct net_device *dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit, - int vbid); +struct net_device *dsa_tag_8021q_find_user(struct net_device *conduit, + int source_port, int switch_id, + int vid, int vbid); int dsa_switch_tag_8021q_vlan_add(struct dsa_switch *ds, struct dsa_notifier_tag_8021q_vlan_info *info); diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c index 35a6346549f2..3e902af7eea6 100644 --- a/net/dsa/tag_sja1105.c +++ b/net/dsa/tag_sja1105.c @@ -509,12 +509,8 @@ static struct sk_buff *sja1105_rcv(struct sk_buff *skb, */ return NULL; - if (source_port != -1 && switch_id != -1) - skb->dev = dsa_conduit_find_user(netdev, switch_id, source_port); - else if (vbid >= 1) - skb->dev = dsa_tag_8021q_find_port_by_vbid(netdev, vbid); - else - skb->dev = dsa_find_designated_bridge_port_by_vid(netdev, vid); + skb->dev = dsa_tag_8021q_find_user(netdev, source_port, switch_id, + vid, vbid); if (!skb->dev) { netdev_warn(netdev, "Couldn't decode source port\n"); return NULL; @@ -652,12 +648,9 @@ static struct sk_buff *sja1110_rcv(struct sk_buff *skb, if (likely(sja1105_skb_has_tag_8021q(skb))) dsa_8021q_rcv(skb, &source_port, &switch_id, &vbid, &vid); - if (source_port != -1 && switch_id != -1) - skb->dev = dsa_conduit_find_user(netdev, switch_id, source_port); - else if (vbid >= 1) - skb->dev = dsa_tag_8021q_find_port_by_vbid(netdev, vbid); - else - skb->dev = dsa_find_designated_bridge_port_by_vid(netdev, vid); + skb->dev = dsa_tag_8021q_find_user(netdev, source_port, switch_id, + vid, vbid); + if (!skb->dev) { netdev_warn(netdev, "Couldn't decode source port\n"); return NULL; From patchwork Wed Apr 3 10:37:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615788 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f48.google.com (mail-ej1-f48.google.com [209.85.218.48]) (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 32707148845; Wed, 3 Apr 2024 10:38:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140710; cv=none; b=hovXXff6Xj9zyY3el6tJoLzYGgtJ+K/aj0RDtyNk2H8me5axn8TqSwaJIa4QjXDGl9r8GbYdcVQXspudLiPJSHzEZmEx/o+wJO9pCD/IDxfixdk2tTGyDS7PdAP0dLH7tSFqIoJ7JPg2r1sI0HqpOHM4n3kCi63BA0B6qly15S8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140710; c=relaxed/simple; bh=mztkueEaHUWwyOxHGSG/LopNkc0bMHAuP6twyCs8i8w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uRPWS0ZDtkd8EW8YPnUFhinxWYW8zBHOhejHAPdMF5KwxUrCoE7IIfEONjpg2avTjzFYk0SynrjCKGxaSuESjvlwY2B1THTe3ydn4W4va/GFd0fj+VufcEPRVDbmg+SzVcWKssbM4iWG2WN2tMMKKeQuBwmLta6RaWGhupxBBLE= 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=mmUHWaVd; arc=none smtp.client-ip=209.85.218.48 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="mmUHWaVd" Received: by mail-ej1-f48.google.com with SMTP id a640c23a62f3a-a44f2d894b7so725747966b.1; Wed, 03 Apr 2024 03:38:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140707; x=1712745507; 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=Ld+TlEUXaIfhlSelNHD3BFPvG2cdfufnxxnaBz2fSz4=; b=mmUHWaVdxNJaKr4123x/MsN0PeL+9Mq/8w9oFMBVRlGR+4n2CuLIurCcUT3qktQ4AI d3ZXpUahrATJD3EMkN1dExh8YWhSuqWshcEowEuluPh558CVeI5YvnWevEmEWT5b43W6 eHE3+sKaiQmtgXtJuqMIqS7xph0BL8be5mhYL4kido6+svUzh4605LLM/8jduC+MUANM LBCFj4Rm+XZ15ppyBzkp8L0zaUHe84YWRn3DqjUO84jdy7PK8Ts/nE9P/vRNQ+Rusdb9 VifH6nQBcqvhMairz1Fk0zT+aoMUJSEpCPOlcFK8Gkd06XPkIyRByWke2Vb3sV62Gj+n Wj/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140707; x=1712745507; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ld+TlEUXaIfhlSelNHD3BFPvG2cdfufnxxnaBz2fSz4=; b=lhQRfKOzuBTrjtd23OBXt/S44NmDBod0OiQw/hF8S67w2e6hB+XcOGbB4cvVmG5BEv q7LppnC7lXIYE0cXWTWkkYhJxAPcrwyOyFFhwRvrvUwTIndK3v3B9p2qidsTR4WxzF02 7JmHZmztKSAx5U/5OZ3UV0DW/KX4AMtgIbeYHtr6J/Opj3nsDIR1aQhgYXwATWUqv2Bp /Wn7WD8yT7VQBTWayqJuOb/He6GerxX0sbhNuOYqzz42SSVOkZ2AfZP0x1azEUxrg9QI A2AehsSr9lhBHM903IPZ8eZzoT6vMWRCVojX+z+xCZiYueV2gay6q5QfsCCFn1TpTG5l Q1HQ== X-Forwarded-Encrypted: i=1; AJvYcCXypAE+7qCQUzDaACfXAhG2knofKtqNRpSF7iVUgcSVqk+M1XL9zgq/G3w6XzuITSr4sFdnQNV0bpcgSXTtC/8BRV+5aYzy44oKXmP7 X-Gm-Message-State: AOJu0YwZs4D1yQh+imjkYWME4BBcckq6EtPJWEVb88Serve0wSb2Ic2c 1FknVD8CUontlnGKQfhaZZpOLzHiekLd7U9/BN7VLPPHMZguJsZ3254PHOPfvS8= X-Google-Smtp-Source: AGHT+IHV64Kz8sXeGH9oxOlliOsPuop+tGkjDr74y3w+uA5XUt+fB3D31dYlpnDbTACi7e7XSLUsbA== X-Received: by 2002:a17:906:512:b0:a4d:f98e:dc3e with SMTP id j18-20020a170906051200b00a4df98edc3emr9498403eja.12.1712140707343; Wed, 03 Apr 2024 03:38:27 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:27 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Florian Fainelli , Vladimir Oltean , Andrew Lunn , Florian Fainelli , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 12/16] net: dsa: vsc73xx: introduce tag 8021q for vsc73xx Date: Wed, 3 Apr 2024 12:37:28 +0200 Message-Id: <20240403103734.3033398-13-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This commit introduces a new tagger based on 802.1q tagging. It's designed for the vsc73xx driver. The VSC73xx family doesn't have any tag support for the RGMII port, but it could be based on VLANs. Reviewed-by: Florian Fainelli Reviewed-by: Vladimir Oltean Signed-off-by: Pawel Dembicki Reviewed-by: Linus Walleij --- v8: - added 'Reviewed-by' only v7: - replace netdev_warn by dev_warn_ratelimited v6: - added missing MODULE_DESCRIPTION() v5: - removed skb_vlan_tag_present(skb) checking - use 80 characters per line limit v4: - rebase to net-next/main v3: - Introduce a patch after the tagging patch split include/net/dsa.h | 2 ++ net/dsa/Kconfig | 6 ++++ net/dsa/Makefile | 1 + net/dsa/tag_vsc73xx_8021q.c | 68 +++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 net/dsa/tag_vsc73xx_8021q.c diff --git a/include/net/dsa.h b/include/net/dsa.h index 7c0da9effe4e..b79e136e4c41 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -56,6 +56,7 @@ struct phylink_link_state; #define DSA_TAG_PROTO_RTL8_4T_VALUE 25 #define DSA_TAG_PROTO_RZN1_A5PSW_VALUE 26 #define DSA_TAG_PROTO_LAN937X_VALUE 27 +#define DSA_TAG_PROTO_VSC73XX_8021Q_VALUE 28 enum dsa_tag_protocol { DSA_TAG_PROTO_NONE = DSA_TAG_PROTO_NONE_VALUE, @@ -86,6 +87,7 @@ enum dsa_tag_protocol { DSA_TAG_PROTO_RTL8_4T = DSA_TAG_PROTO_RTL8_4T_VALUE, DSA_TAG_PROTO_RZN1_A5PSW = DSA_TAG_PROTO_RZN1_A5PSW_VALUE, DSA_TAG_PROTO_LAN937X = DSA_TAG_PROTO_LAN937X_VALUE, + DSA_TAG_PROTO_VSC73XX_8021Q = DSA_TAG_PROTO_VSC73XX_8021Q_VALUE, }; struct dsa_switch; diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig index 8e698bea99a3..e59360071c67 100644 --- a/net/dsa/Kconfig +++ b/net/dsa/Kconfig @@ -166,6 +166,12 @@ config NET_DSA_TAG_TRAILER Say Y or M if you want to enable support for tagging frames at with a trailed. e.g. Marvell 88E6060. +config NET_DSA_TAG_VSC73XX_8021Q + tristate "Tag driver for Microchip/Vitesse VSC73xx family of switches, using VLAN" + help + Say Y or M if you want to enable support for tagging frames with a + custom VLAN-based header. + config NET_DSA_TAG_XRS700X tristate "Tag driver for XRS700x switches" help diff --git a/net/dsa/Makefile b/net/dsa/Makefile index 8a1894a42552..555c07cfeb71 100644 --- a/net/dsa/Makefile +++ b/net/dsa/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_NET_DSA_TAG_RTL8_4) += tag_rtl8_4.o obj-$(CONFIG_NET_DSA_TAG_RZN1_A5PSW) += tag_rzn1_a5psw.o obj-$(CONFIG_NET_DSA_TAG_SJA1105) += tag_sja1105.o obj-$(CONFIG_NET_DSA_TAG_TRAILER) += tag_trailer.o +obj-$(CONFIG_NET_DSA_TAG_VSC73XX_8021Q) += tag_vsc73xx_8021q.o obj-$(CONFIG_NET_DSA_TAG_XRS700X) += tag_xrs700x.o # for tracing framework to find trace.h diff --git a/net/dsa/tag_vsc73xx_8021q.c b/net/dsa/tag_vsc73xx_8021q.c new file mode 100644 index 000000000000..af121a9aff7f --- /dev/null +++ b/net/dsa/tag_vsc73xx_8021q.c @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0 OR MIT +/* Copyright (C) 2024 Pawel Dembicki + */ +#include + +#include "tag.h" +#include "tag_8021q.h" + +#define VSC73XX_8021Q_NAME "vsc73xx-8021q" + +static struct sk_buff * +vsc73xx_xmit(struct sk_buff *skb, struct net_device *netdev) +{ + struct dsa_port *dp = dsa_user_to_port(netdev); + u16 queue_mapping = skb_get_queue_mapping(skb); + u16 tx_vid = dsa_tag_8021q_standalone_vid(dp); + u8 pcp; + + if (skb->offload_fwd_mark) { + unsigned int bridge_num = dsa_port_bridge_num_get(dp); + struct net_device *br = dsa_port_bridge_dev_get(dp); + + if (br_vlan_enabled(br)) + return skb; + + tx_vid = dsa_tag_8021q_bridge_vid(bridge_num); + } + + pcp = netdev_txq_to_tc(netdev, queue_mapping); + + return dsa_8021q_xmit(skb, netdev, ETH_P_8021Q, + ((pcp << VLAN_PRIO_SHIFT) | tx_vid)); +} + +static struct sk_buff * +vsc73xx_rcv(struct sk_buff *skb, struct net_device *netdev) +{ + int src_port = -1, switch_id = -1, vbid = -1, vid = -1; + + dsa_8021q_rcv(skb, &src_port, &switch_id, &vbid, &vid); + + skb->dev = dsa_tag_8021q_find_user(netdev, src_port, switch_id, + vid, vbid); + if (!skb->dev) { + dev_warn_ratelimited(&netdev->dev, + "Couldn't decode source port\n"); + return NULL; + } + + dsa_default_offload_fwd_mark(skb); + + return skb; +} + +static const struct dsa_device_ops vsc73xx_8021q_netdev_ops = { + .name = VSC73XX_8021Q_NAME, + .proto = DSA_TAG_PROTO_VSC73XX_8021Q, + .xmit = vsc73xx_xmit, + .rcv = vsc73xx_rcv, + .needed_headroom = VLAN_HLEN, + .promisc_on_conduit = true, +}; + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("DSA tag driver for VSC73XX family of switches, using VLAN"); +MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_VSC73XX_8021Q, VSC73XX_8021Q_NAME); + +module_dsa_tag_driver(vsc73xx_8021q_netdev_ops); From patchwork Wed Apr 3 10:37:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615789 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f48.google.com (mail-ej1-f48.google.com [209.85.218.48]) (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 5BA9C148FF9; Wed, 3 Apr 2024 10:38:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140714; cv=none; b=bkgUI7PW5pmb3DtY6IxhxK/TavPL8oDbLzAKgJZTrmCqlMU3t9j1ig1pvSX5tPjbolH5BKfzrOGwnlZQGlF/13svQ/EQbpLgCQ0akYYZrJAsjuLQTTmPM952yKq/D2/u3tJtsa//DMPpgGNUkyYyRmsRRU+OIOaIbcu6qgelcZc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140714; c=relaxed/simple; bh=3OB8TQ1rUhMuNxtWAU1N5y3sWwbu3WduaIW8pVqyg/Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=mOCcsoAUOYHY30XoL+mmUvVPp0SWD1TgY7aisTssUa1vqtjjMI5+Qbodx9ajvMvL4jdyzc3XEf76zNKeKvr27DVYhVYHA4AEuxeMcM5LZGkgnq+nUcYk6sDE+Iikh5pULAXxwCNlruh1s6I86w7P3IeU6ex/PvB11wGcD22kyc8= 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=mcPCyzEM; arc=none smtp.client-ip=209.85.218.48 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="mcPCyzEM" Received: by mail-ej1-f48.google.com with SMTP id a640c23a62f3a-a4e62f3e63dso395270266b.0; Wed, 03 Apr 2024 03:38:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140710; x=1712745510; 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=wTbmqZooxysHTZKOHPv1gDt0WmS/83zgiBJ7JzV9ZNU=; b=mcPCyzEMpSGWLWI1ON4nX3jTOf+hguhJK3np18mVPMb6CV/I+P73mmnor+Cu62bEnL Qi5PyiLwjMaY7tntNqoEobuduRt9BB+HReLjXXGdd2+B1JrOQC1RLLz5C7bSd4+0NhSn 7XZN4EQUogycR4NEWI8vQRf2WMM3pHXqCtA+nCU4M7lRvxcud1HdmeFYyczuw+wG7kEM 671yU4XFgyegJ2E7XMyvoAZXGO9URkZxUYN3/fl73mohj2JxBhWbUT90fBjKlJRZcZjh W8bFWRxEcNS7fNEW0+auHb4gHghr2WGn7kwM1aTo1hrZkpcXrwtiV3O/iuMgqjqBRe3A KXfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140710; x=1712745510; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wTbmqZooxysHTZKOHPv1gDt0WmS/83zgiBJ7JzV9ZNU=; b=mNb8Qt9weYcDllriMt1nGPl4DCAHWE1sU8oQEg+Rc4f5yVebdmrYQ18RlTe9e/EL4l zK4O2E2tDQpQ9Km4JkOaBYTZSpfYid0lhb6wmNuz6BvgvV0U3Z+y+BUUS1Tt2QaMxUL2 aQYEW3ep2UcgsoCkz+gUUb/LZBVD4ts/DICSxTlaO8J7PHbUKzkgfTFUf3xLYzN1Mm7s 1nWktulXbgz6nH5FnwUpUpjzhX8gx1iGXad+uv0zDvf5h/5HcPtKBmy1phmHRrUlLWn4 LoU8c+4UOC4RaAXuzozvvO0FYYgMSS7LG6xdtxvaZ8LG1o2ErLBI5M5VW+//Xtkz8oDS ktBw== X-Forwarded-Encrypted: i=1; AJvYcCUgcTwHH/b5z+Vx7COdvxCYwPX18/a8bzDJjb1TV8NUOQe8e82B3weyufJuMeuLqfpiyC4PuojQcoDkd7eNPwhWVauAatAT3uZy5s1I X-Gm-Message-State: AOJu0Yy2FH7BxFcXz8+NkkLV/05z2QhSGX9K9a/aEiuN64p2rPp0TOoa 6vV4QPsxEGh1a9fAERsvWXIjwZ8jFUtnzkGXklCi7JJOXM1m6Mx/6kkiBwtbW+c= X-Google-Smtp-Source: AGHT+IGBaVYnTJAnOpcxQSn0tCcmmFQ4MSWJ321680vFf6blh1Hu+HslR3PdtiUjXifOUg4C0s7Oqw== X-Received: by 2002:a17:906:27c4:b0:a4e:2e14:f75e with SMTP id k4-20020a17090627c400b00a4e2e14f75emr8269752ejc.77.1712140710580; Wed, 03 Apr 2024 03:38:30 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:30 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 13/16] net: dsa: vsc73xx: Implement the tag_8021q VLAN operations Date: Wed, 3 Apr 2024 12:37:29 +0200 Message-Id: <20240403103734.3033398-14-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch is a simple implementation of 802.1q tagging in the vsc73xx driver. Currently, devices with DSA_TAG_PROTO_NONE are not functional. The VSC73XX family doesn't provide any tag support for external Ethernet ports. The only option available is VLAN-based tagging, which requires constant hardware VLAN filtering. While the VSC73XX family supports provider bridging, it only supports QinQ without full implementation of 802.1AD. This means it only allows the doubled 0x8100 TPID. In the simple port mode, QinQ is enabled to preserve forwarding of VLAN-tagged frames. Signed-off-by: Pawel Dembicki --- v8: - resend only v7: - adjust tag8021q implementation for vlan filtering implementation changes v6: - resend only v5: - improve commit message v4: - adjust tag8021q implementation for changed untagged vlan storage - minor fixes v3: - Split tagger and tag implementation into separate commits drivers/net/dsa/Kconfig | 2 +- drivers/net/dsa/vitesse-vsc73xx-core.c | 54 +++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/drivers/net/dsa/Kconfig b/drivers/net/dsa/Kconfig index 3092b391031a..22a04636d09e 100644 --- a/drivers/net/dsa/Kconfig +++ b/drivers/net/dsa/Kconfig @@ -126,7 +126,7 @@ config NET_DSA_SMSC_LAN9303_MDIO config NET_DSA_VITESSE_VSC73XX tristate - select NET_DSA_TAG_NONE + select NET_DSA_TAG_VSC73XX_8021Q select FIXED_PHY select VITESSE_PHY select GPIOLIB diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 433ffd4f44fd..d0442ea8a610 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -597,7 +597,7 @@ static enum dsa_tag_protocol vsc73xx_get_tag_protocol(struct dsa_switch *ds, * cannot access the tag. (See "Internal frame header" section * 3.9.1 in the manual.) */ - return DSA_TAG_PROTO_NONE; + return DSA_TAG_PROTO_VSC73XX_8021Q; } static int vsc73xx_wait_for_vlan_table_cmd(struct vsc73xx *vsc) @@ -687,7 +687,7 @@ vsc73xx_update_vlan_table(struct vsc73xx *vsc, int port, u16 vid, bool set) static int vsc73xx_setup(struct dsa_switch *ds) { struct vsc73xx *vsc = ds->priv; - int i; + int i, ret; dev_info(vsc->dev, "set up the switch\n"); @@ -756,6 +756,12 @@ static int vsc73xx_setup(struct dsa_switch *ds) mdelay(50); + rtnl_lock(); + ret = dsa_tag_8021q_register(ds, htons(ETH_P_8021Q)); + rtnl_unlock(); + if (ret) + return ret; + /* Release reset from the internal PHYs */ vsc73xx_write(vsc, VSC73XX_BLOCK_SYSTEM, 0, VSC73XX_GLORESET, VSC73XX_GLORESET_PHY_RESET); @@ -1210,6 +1216,21 @@ static int vsc73xx_vlan_set_untagged_hw(struct vsc73xx *vsc, int port, u16 vid) return vsc73xx_vlan_change_untagged_hw(vsc, port, vid, true); } +static int vsc73xx_vlan_change_untagged_tag_8021q(struct vsc73xx *vsc, int port, + u16 vid, bool valid, + bool operate_on_storage) +{ + struct vsc73xx_portinfo *portinfo = &vsc->portinfo[port]; + + portinfo->untagged_tag_8021q_configured = valid; + portinfo->untagged_tag_8021q = vid; + + if (operate_on_storage) + return 0; + + return vsc73xx_vlan_change_untagged_hw(vsc, port, vid, valid); +} + static int vsc73xx_vlan_change_pvid_hw(struct vsc73xx *vsc, int port, u16 vid, bool set) { @@ -1537,6 +1558,33 @@ static int vsc73xx_port_vlan_del(struct dsa_switch *ds, int port, return 0; } +static int vsc73xx_tag_8021q_vlan_add(struct dsa_switch *ds, int port, u16 vid, + u16 flags) +{ + bool untagged = flags & BRIDGE_VLAN_INFO_UNTAGGED; + bool pvid = flags & BRIDGE_VLAN_INFO_PVID; + struct vsc73xx *vsc = ds->priv; + bool operate_on_storage; + + operate_on_storage = !vsc73xx_tag_8021q_active(dsa_to_port(ds, port)); + + if (untagged) + vsc73xx_vlan_change_untagged_tag_8021q(vsc, port, vid, true, + operate_on_storage); + if (pvid) + vsc73xx_vlan_change_pvid(vsc, port, vid, true, + operate_on_storage, true); + + return vsc73xx_update_vlan_table(vsc, port, vid, true); +} + +static int vsc73xx_tag_8021q_vlan_del(struct dsa_switch *ds, int port, u16 vid) +{ + struct vsc73xx *vsc = ds->priv; + + return vsc73xx_update_vlan_table(vsc, port, vid, false); +} + static int vsc73xx_port_setup(struct dsa_switch *ds, int port) { struct vsc73xx_portinfo *portinfo; @@ -1667,6 +1715,8 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .port_vlan_add = vsc73xx_port_vlan_add, .port_vlan_del = vsc73xx_port_vlan_del, .phylink_get_caps = vsc73xx_phylink_get_caps, + .tag_8021q_vlan_add = vsc73xx_tag_8021q_vlan_add, + .tag_8021q_vlan_del = vsc73xx_tag_8021q_vlan_del, }; static int vsc73xx_gpio_get(struct gpio_chip *chip, unsigned int offset) From patchwork Wed Apr 3 10:37:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615790 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f48.google.com (mail-ej1-f48.google.com [209.85.218.48]) (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 A6E771419AA; Wed, 3 Apr 2024 10:38:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140717; cv=none; b=LGGy0MP60m0LY+qoypYFHmzAtvZAjSjY84h8KtE5MlTCXEBB/CtDpufshgQST+f7OBRvjv47y0LhnohDOOXG1Yv9ZdDyBMWgurpl9tQNlK0Bj/AvcLOp1etX4zdm5mER/odfHlLG/Owft7KkMPIJqlMcfNLNizhIM9kkoBnFjpY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140717; c=relaxed/simple; bh=47HaZ9iiUTmn0HmyKp/1gfi01AjpPDV/EJVz59beY9M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=H3LGQbTWvxTRfiISF7ewzlWlFeMka5Y8uOauXgHZWY53muJh1sdZILD98j07n0rw7L3x/Dlrjjl+0Obt+Ez8RZuPk+YAnyOQZTDxLP0RcxIj9mX6VUvA+nw51HbbImUyByD/aZTmQGqkubQBAaKfhxvj8SFplD5oJiSv1LMXn9k= 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=ToED8iKR; arc=none smtp.client-ip=209.85.218.48 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="ToED8iKR" Received: by mail-ej1-f48.google.com with SMTP id a640c23a62f3a-a4e60a64abcso128781066b.1; Wed, 03 Apr 2024 03:38:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140714; x=1712745514; 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=YF2bOF3/jwwcVqWoPFtKOD/xnMrgqW0YdoBVjA/194c=; b=ToED8iKRKhDRbeqmJITW/mKvpDtur3H5poHZUM1ENlfUv6g2brEe8V74hSIDpSxi5I ZcuR5odm+Cx6/ngGJFg6uUywuPDoZ6Rw3+1nQX2UirDEmSdpxbcnC+rR/q+no2sKDaui YTiVcC1UvT73sixJnwR2DLAc3o17qPCbHIWI4b9OmrizeLV/39peMhG15zoeFTrcLVWH 0wDtY6fFaSDQX8vLKUG3hicJGfEhtwmT9memCoM/RnKVJLI7rQPMlmSutbHts2AkoFDg H+3GPrKasX4d2Sx4HJsqjA9NxPugPBVWEigyVR/li6hDioVCWToEL2vuvqn0IcAbsib1 dp2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140714; x=1712745514; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YF2bOF3/jwwcVqWoPFtKOD/xnMrgqW0YdoBVjA/194c=; b=YdYh3xqm77se3mNboc8XevQfc7wLDlNyMy+KeJRwbi9Kd3Nrh9Vm8UqfSJPQwZ7+R0 q6L9zHuzo5cPlfgl7BdwSIaxm5gfpzYpLI1fuU1FkgZu+DUW2Jt3e/bYh1Tlw+zoX0XY YyMnpmVp9fpzz+uacV86FZJtCUgMUwoCFf/UiTDwSiVJ+deu1Pua1jHY9X0pMM2qd4cw 8ejcjCdL0e9sMQVVheLprmcaEm9Vr4eSHRUZSmOTd7sAikNnULhvJssx7BP3zQFhSUyP GY4/YktBeTB4JZs+v0FWJibFMNF20XESOoe6F40Yip4ryZNx7AIlO9M+mmncGBEyx82Z ygcg== X-Forwarded-Encrypted: i=1; AJvYcCWcslqMd/hhJ93hFf90t1LHBI85C9qkqevmekB+Ht2UQhPDKMCcrrWf9ZbovO2Iz5fDfwrAO72I+0e/Ypq4phibuZuRC+fDPLFI/AJA X-Gm-Message-State: AOJu0YwUOlvsSQvC6z3UQ1VYyMQswPDuolw22fFcU1JLTfHwd9URfTS/ qCDUNd6kv9OO7NWL3aSvZXpRJoyc2qfnobyZSecs04b1Y+br5zy3M2vtogFjo7w= X-Google-Smtp-Source: AGHT+IE4WaOtGTFw+6pFgN5rRZBSGE/muyZZ8UvEBGzKf+AQNEq15KPG1OHqj7l/s+1mIl3uzW8DlQ== X-Received: by 2002:a17:907:7da5:b0:a4e:9cb0:b644 with SMTP id oz37-20020a1709077da500b00a4e9cb0b644mr2191148ejc.13.1712140713856; Wed, 03 Apr 2024 03:38:33 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:33 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Vladimir Oltean , Florian Fainelli , Andrew Lunn , Florian Fainelli , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 14/16] net: dsa: Define max num of bridges in tag8021q implementation Date: Wed, 3 Apr 2024 12:37:30 +0200 Message-Id: <20240403103734.3033398-15-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Max number of bridges in tag8021q implementation is strictly limited by VBID size: 3 bits. But zero is reserved and only 7 values can be used. This patch adds define which describe maximum possible value. Suggested-by: Vladimir Oltean Signed-off-by: Pawel Dembicki Reviewed-by: Florian Fainelli Reviewed-by: Linus Walleij --- v8: - resend only v7: - added 'Reviewed-by' only v6: - resend only v5: - added 'Reviewed-by' only v4: - introduce patch drivers/net/dsa/sja1105/sja1105_main.c | 3 +-- include/linux/dsa/8021q.h | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c index fc262348a134..155fd28419f9 100644 --- a/drivers/net/dsa/sja1105/sja1105_main.c +++ b/drivers/net/dsa/sja1105/sja1105_main.c @@ -3156,8 +3156,7 @@ static int sja1105_setup(struct dsa_switch *ds) ds->vlan_filtering_is_global = true; ds->untag_bridge_pvid = true; ds->fdb_isolation = true; - /* tag_8021q has 3 bits for the VBID, and the value 0 is reserved */ - ds->max_num_bridges = 7; + ds->max_num_bridges = DSA_TAG_8021Q_MAX_NUM_BRIDGES; /* Advertise the 8 egress queues */ ds->num_tx_queues = SJA1105_NUM_TC; diff --git a/include/linux/dsa/8021q.h b/include/linux/dsa/8021q.h index f3664ee12170..1dda2a13b832 100644 --- a/include/linux/dsa/8021q.h +++ b/include/linux/dsa/8021q.h @@ -8,6 +8,11 @@ #include #include +/* VBID is limited to three bits only and zero is reserved. + * Only 7 bridges can be enumerated. + */ +#define DSA_TAG_8021Q_MAX_NUM_BRIDGES 7 + int dsa_tag_8021q_register(struct dsa_switch *ds, __be16 proto); void dsa_tag_8021q_unregister(struct dsa_switch *ds); From patchwork Wed Apr 3 10:37:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615791 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) (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 DD1241494D8; Wed, 3 Apr 2024 10:38:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140720; cv=none; b=SBk1mzX5Y3Hx6LrwFfY/P4dBK/hzkFHmKyChM3yH2g9h3Fgrw8P89rgB+w5spWYc90e8uwWsp0ICo4x7BSiKavKw8SkQaU9lPekz85/h3UzdJRgGOsMBC4L7zTNJ1y0uiL1C15BxiDtHnLnN0lsSBhZ+mBSDiA4J2p1xpPFpIBA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140720; c=relaxed/simple; bh=AYF8IxFjmPRIZ2yHjvMO4zqR30IMbbwHmMsj12fvFdk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=mM1shno7xsMVCRtiXGB7qOqABBq62gG3sMlxREf1ECivQl/RAaitBexvi3h32ny3uLtHXn6/NBCQnG8+DdynIRg2/uE7SBa28jXhbBrCdZS740avtf3ksEuo9C/oodbjatkCUtR6AYHMfX6qM+B4QDquoibVRhi5OwWqUU2UADY= 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=hDZ2kblY; arc=none smtp.client-ip=209.85.218.45 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="hDZ2kblY" Received: by mail-ej1-f45.google.com with SMTP id a640c23a62f3a-a44ad785a44so710765366b.3; Wed, 03 Apr 2024 03:38:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140717; x=1712745517; 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=UvqfJFDT4uUbjd78hGNRHWQuDLmuXrnUhBRMXhjGdh0=; b=hDZ2kblYEC2/DmJsCztHQ19e95ISbecvfdoOyFcyshzcqhrzJlQSYu2d5PNGCmRxY4 iD1NyvD/Z/rogZf9YLuxInojoHPUNlfiiHDX6CuaRDSRmI1d8e7ujqmDSfM5ATyfm7Om ftZlXm9YRDJMsnGTG8fnknISy+ANSvlzymoZI2ksJhpxDDM2Jj2p73YALR2G49moroMb XKGC1sQw6B8AwC1BGVfbVBoZ1+vh0urhDUt8oNOkZHD9zyWyFpsAIkWIK32V9XP5SL5Q BGyps7Cj4OQWp8ZGv0xR16pokOGzGFuW30bCUr1cvzHBFvbX/MfQAhfDX/RWZqQibncV JTHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140717; x=1712745517; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UvqfJFDT4uUbjd78hGNRHWQuDLmuXrnUhBRMXhjGdh0=; b=HC2SePgUBbRks33sqpHutXRP88Bc+Kv1XyoS6LQ1tL0FFq9rHBFOfDAvhELg/wdoQ6 FiVTuiWiKGh9x5K3gIuUNadnCg9RtGRgOirklchvJywC+DYrqq7JKg3QdNE3jkU0n5Ba A9XkE0ShAWDK+LArdDJrqF9M/BPGlDXqjO1IdAU7BS69SWrX16BejP6skIg75izagF0O Kh++biyPLjuA1o3nkkX1BBhAOtp6VSYkIYeXOa87XzfQB0LUFV1XkT7XKTl5ApFQuSUA rTpdycfLQ7BAgzN4AOyiaJrPLD+jae+ierole+HwSaxYGn8/PNMk0KfPjJ30pKVc5sGg YHnw== X-Forwarded-Encrypted: i=1; AJvYcCWbWi5liIDOSh8uD7rO7Id2eu9vM9tL30LqxlMBYRkK0RnsWxDUe4MRT/CupXwuAcf1VqX7l6jeOR1GcCbYuM3LjJzBM5phcEZ9xARv X-Gm-Message-State: AOJu0YxGPZIwEJnwxll4viVwU1ep/tKu/9I9WVaUQes8g8XtTeCQ3tAU dGGMdJKp0Inhi4mpEnAafqMkUEbEEBNlJlPZsJNamBMiok2+DLi4LgwGmYvFZ/s= X-Google-Smtp-Source: AGHT+IF+NfSTumuGRLtaUAdmjV75XAJzwBcKdYE92R5EEpCj6ZgXY7dGfSHr9YD2CBDwofs6tAkhwg== X-Received: by 2002:a17:907:7859:b0:a4e:2873:e94c with SMTP id lb25-20020a170907785900b00a4e2873e94cmr9333844ejc.1.1712140717065; Wed, 03 Apr 2024 03:38:37 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:36 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Vladimir Oltean , Florian Fainelli , Andrew Lunn , Florian Fainelli , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 15/16] net: dsa: vsc73xx: Add bridge support Date: Wed, 3 Apr 2024 12:37:31 +0200 Message-Id: <20240403103734.3033398-16-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch adds bridge support for vsc73xx driver. It introduce two functions for port_bridge_join and vsc73xx_port_bridge_leave handling. Those functions implement forwarding adjust and use dsa_tag_8021q_bridge_* api for adjust VLAN configuration. Reviewed-by: Linus Walleij Signed-off-by: Pawel Dembicki Reviewed-by: Vladimir Oltean Reviewed-by: Florian Fainelli --- v8: - resend only v7: - added 'Reviewed-by' only v6: - resend only v5: - added 'Reviewed-by' only v4: - remove forward configuration after stp patch refactoring - implement new define with max num of bridges for tag8021q devices v3: - All vlan commits was reworked - move VLAN_AWR and VLAN_DBLAWR to port setup in other commit - drop vlan table upgrade v2: - no changes done drivers/net/dsa/vitesse-vsc73xx-core.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index d0442ea8a610..87922804d1c1 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -691,6 +691,9 @@ static int vsc73xx_setup(struct dsa_switch *ds) dev_info(vsc->dev, "set up the switch\n"); + ds->untag_bridge_pvid = true; + ds->max_num_bridges = DSA_TAG_8021Q_MAX_NUM_BRIDGES; + /* Issue RESET */ vsc73xx_write(vsc, VSC73XX_BLOCK_SYSTEM, 0, VSC73XX_GLORESET, VSC73XX_GLORESET_MASTER_RESET); @@ -1585,6 +1588,22 @@ static int vsc73xx_tag_8021q_vlan_del(struct dsa_switch *ds, int port, u16 vid) return vsc73xx_update_vlan_table(vsc, port, vid, false); } +static int vsc73xx_port_bridge_join(struct dsa_switch *ds, int port, + struct dsa_bridge bridge, + bool *tx_fwd_offload, + struct netlink_ext_ack *extack) +{ + *tx_fwd_offload = true; + + return dsa_tag_8021q_bridge_join(ds, port, bridge); +} + +static void vsc73xx_port_bridge_leave(struct dsa_switch *ds, int port, + struct dsa_bridge bridge) +{ + dsa_tag_8021q_bridge_leave(ds, port, bridge); +} + static int vsc73xx_port_setup(struct dsa_switch *ds, int port) { struct vsc73xx_portinfo *portinfo; @@ -1708,6 +1727,8 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .port_setup = vsc73xx_port_setup, .port_enable = vsc73xx_port_enable, .port_disable = vsc73xx_port_disable, + .port_bridge_join = vsc73xx_port_bridge_join, + .port_bridge_leave = vsc73xx_port_bridge_leave, .port_change_mtu = vsc73xx_change_mtu, .port_max_mtu = vsc73xx_get_max_mtu, .port_stp_state_set = vsc73xx_port_stp_state_set, From patchwork Wed Apr 3 10:37:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Pawe=C5=82_Dembicki?= X-Patchwork-Id: 13615792 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) (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 3165C149C65; Wed, 3 Apr 2024 10:38:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140723; cv=none; b=DAwFf9E3uGIhk85unAH6cmEfPz7ncmDTZB3wdifAJYcY5Dgu4Wwc9y7Mynl6X1ex+8vzOa8tPLfjUU1n0JQO7YrI/k1ZxJ+DmTHKA5refUKD+ec1l4JQESe0eQZuf577PqZRRDgiPa6PDq3RxXXHNx/sFMAydpywbUtBNeyz74o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712140723; c=relaxed/simple; bh=lsJZYamIb7pKWq/pJ2WHv4Qhp7DutSf4JF7cAzPEE8c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TrUXljxSktSSDH03COuAMCTKDR8pFL5ujWmd3lsP7R28MjPZt+K7FcJ6rVID4EjCbV/DlKzI0AA1G2mFpFN7oH4i42QylJ/L+119TbQndijbNFduSgJx6jJv0ckJF57eyNJZjrrn94uZX7AwVhBUkQ6PgezpHif8JFJhIBODHwk= 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=ZyR2CME8; arc=none smtp.client-ip=209.85.218.52 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="ZyR2CME8" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-a47385a4379so153289066b.0; Wed, 03 Apr 2024 03:38:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712140720; x=1712745520; 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=dwXfSiRRYMgELktuVNuW2aivXcVrEj4Wx7dt2BW3WIo=; b=ZyR2CME8VEb+TJKtlinza6Uy4kNatfywPFv+uf+NuiV0pp/jLk0TvAdmd/hlMdrdyN XziREP7zHJB/ady3k9qQE3i3wOGlmWgwSB+edpkKXGJgzRM5Y1w9G9HzO7Dm6UzvDKwz IKWWfymlDU/0QzXxY2pTWMgrqZVIHHf2krGUVBRBi+Trx7clYcx8Zb/sBxG0T0jmaElC IRt8eWxDJC8+pt/WZ2JyC/kKlryBNUtKlDo/CnwD8JSroz69YOlhhW+oVQIJt6AiGsQL 7pGU9nMheDPAnQpVIZX4r3GV5HzIvhGC6HVDFYM3X35OHAeV3juu+Rrtth8Qg0cgV7cl LWXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712140720; x=1712745520; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dwXfSiRRYMgELktuVNuW2aivXcVrEj4Wx7dt2BW3WIo=; b=vfcLgI/CuQ46AzNLCnzy5yaqHppudoBAGWb22FvP5XQbeWRixEO9tQe/ojsYTmh0Eh Utndpdcky6kPq3tUsd4omBBD/519OzGd2/kEjrwDN21fO2HQHj8KfYrF4dVZdcEO24y/ ZwK4YwssDXWa4Zr5ZCqnJ+srIXeF1XRqB6R2XvSYAklSHivpxV4f5eSSjbhJix6PUrIo YB2J9EhHP/w829h8d0XJHtHz6iBcS4afYNCvll0QumHyqwpLzpBzU8YGbMw0VYIiLxmL tmYFO8RjEPYmJ0O6d6K4RKE7NV32fqSxlytEMioMHWv9zIR6Hka1VOz4O+nEUde+APhH bofQ== X-Forwarded-Encrypted: i=1; AJvYcCWNs6pzIq9b2v06Sf44vd5A8umjpVnvt8pdUjklxbaLNpQndjBRlYDKyFJSwc3xyIui0AaaC0ICB/4QXuzmU60CWcSBzr8B+F07MMiZ X-Gm-Message-State: AOJu0YyqbDPWhV0tbuZT1rD/3mZGUsD3r/JnoizbZSXFK/Mh430xb9OR s21yGe+cI/9ZJ78bOfxFJcwkA878asl9+yXGvOf5nYIvFsLVkH7Y6W7ctoVphIg= X-Google-Smtp-Source: AGHT+IG+QtCZKqPMzZNQVwNyVKDtHDuBSBbJvPN37rAVDUNJjrkTWV1iD5+oITX8pfXlygCN+jhd8g== X-Received: by 2002:a17:906:e2c9:b0:a51:6386:2a5b with SMTP id gr9-20020a170906e2c900b00a5163862a5bmr448387ejb.0.1712140720276; Wed, 03 Apr 2024 03:38:40 -0700 (PDT) Received: from WBEC325.dom.lan ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id xd2-20020a170907078200b00a4e2e16805bsm6858169ejb.11.2024.04.03.03.38.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Apr 2024 03:38:40 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Linus Walleij , Simon Horman , Pawel Dembicki , Florian Fainelli , Vladimir Oltean , Andrew Lunn , Florian Fainelli , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v8 16/16] net: dsa: vsc73xx: start treating the BR_LEARNING flag Date: Wed, 3 Apr 2024 12:37:32 +0200 Message-Id: <20240403103734.3033398-17-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240403103734.3033398-1-paweldembicki@gmail.com> References: <20240403103734.3033398-1-paweldembicki@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch implements .port_pre_bridge_flags() and .port_bridge_flags(), which are required for properly treating the BR_LEARNING flag. Also, .port_stp_state_set() is tweaked and now disables learning for standalone ports. Disabling learning for standalone ports is required to avoid situations where one port sees traffic originating from another, which could cause packet drops. Signed-off-by: Pawel Dembicki Acked-by: Linus Walleij Reviewed-by: Florian Fainelli Reviewed-by: Vladimir Oltean --- v8: - resend only v7: - added 'Acked-by' and 'Reviewed-by' and improve commit message v6: - fix arranging local variables in reverse xmas tree order v5: - introduce patch drivers/net/dsa/vitesse-vsc73xx-core.c | 41 ++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 87922804d1c1..90ca791add06 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -1588,6 +1588,31 @@ static int vsc73xx_tag_8021q_vlan_del(struct dsa_switch *ds, int port, u16 vid) return vsc73xx_update_vlan_table(vsc, port, vid, false); } +static int vsc73xx_port_pre_bridge_flags(struct dsa_switch *ds, int port, + struct switchdev_brport_flags flags, + struct netlink_ext_ack *extack) +{ + if (flags.mask & ~BR_LEARNING) + return -EINVAL; + + return 0; +} + +static int vsc73xx_port_bridge_flags(struct dsa_switch *ds, int port, + struct switchdev_brport_flags flags, + struct netlink_ext_ack *extack) +{ + if (flags.mask & BR_LEARNING) { + u32 val = flags.val & BR_LEARNING ? BIT(port) : 0; + struct vsc73xx *vsc = ds->priv; + + return vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_LEARNMASK, BIT(port), val); + } + + return 0; +} + static int vsc73xx_port_bridge_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge, bool *tx_fwd_offload, @@ -1693,19 +1718,21 @@ static void vsc73xx_refresh_fwd_map(struct dsa_switch *ds, int port, u8 state) static void vsc73xx_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) { + struct dsa_port *dp = dsa_to_port(ds, port); struct vsc73xx *vsc = ds->priv; - u32 val; + u32 val = 0; + + if (state == BR_STATE_LEARNING || state == BR_STATE_FORWARDING) + val = dp->learning ? BIT(port) : 0; + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_LEARNMASK, BIT(port), val); val = (state == BR_STATE_BLOCKING || state == BR_STATE_DISABLED) ? 0 : BIT(port); vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_RECVMASK, BIT(port), val); - val = (state == BR_STATE_LEARNING || state == BR_STATE_FORWARDING) ? - BIT(port) : 0; - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, - VSC73XX_LEARNMASK, BIT(port), val); - /* CPU Port should always forward packets when user ports are forwarding * so let's configure it from other ports only. */ @@ -1727,6 +1754,8 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .port_setup = vsc73xx_port_setup, .port_enable = vsc73xx_port_enable, .port_disable = vsc73xx_port_disable, + .port_pre_bridge_flags = vsc73xx_port_pre_bridge_flags, + .port_bridge_flags = vsc73xx_port_bridge_flags, .port_bridge_join = vsc73xx_port_bridge_join, .port_bridge_leave = vsc73xx_port_bridge_leave, .port_change_mtu = vsc73xx_change_mtu,