From patchwork Tue Sep 12 12:21:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawel Dembicki X-Patchwork-Id: 138233 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp466891vqx; Tue, 12 Sep 2023 08:01:32 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGlSZzyI8PK0orUD4NdnV2/knmdJmxg96iH3/WSb85qZiMhZLAXCeanL7KF2Nlo/2xFvGa/ X-Received: by 2002:a17:902:e881:b0:1c3:1ceb:97a4 with SMTP id w1-20020a170902e88100b001c31ceb97a4mr13414680plg.24.1694530892507; Tue, 12 Sep 2023 08:01:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694530892; cv=none; d=google.com; s=arc-20160816; b=nO6Zmd4kwt6r3lrr1bBVoq84k0swaMD2/Rn5cuRCyWDlsnEbq21/dwZRybWk2Vznjr aZTRBxHpEDZcy9PUG5nVAiVFF4SFfO6H3RY64yWvZQj90GLPQhKQYkU76svCCbmwbKND yiHD46dfW1V65FnXLaJCGaKbFv/AhbbgG6ttnCew1xjB/xNOKv5NTZy4A7y3FMoId3Cq 392xDoz5CCaj8GkYSwGFOV5Ns+QF4rxGNkx+mAVcmEtlUB5qZk8FmuwQObtnD0QLb1Cu AqTUMW0tjY5DzIGFEZ+iRAv8+Gu5lANiZO3m3+kZha3+00uXsr0d01evVCFXReIdc88z ZdCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=bnLlBCmtmpQwQX7mUFEwOLmXNNLfxSSVf+nmIrWyOZs=; fh=30kAl1g9AkxuEgeaYxsvI/0nj7uz2Q8n1xb6SNv7Q9s=; b=kITmoP/64Xy21SOYsIFnEkYA3ENM5VVY3qDncdEb/dCMinaoqeyhIkJUs/+LcY+uC/ pWhSSw0zO06FdPDdWa4ufIbeJyDl3r/k2lvSkEO5EymjakR+8YMcdFWv4f6OHhn/GTI4 TgrOAzEi0UIVcHJd4kyQq/4CYB486lhsVuGd8aD/O9stzZBCsI8WhB4HQXDYStk0RGHV BpT/YzDW2ZpOBDxD+yntdQZR2n1r2qN71oy1z+/+izjWQHgtn8IRIQ1sPUDzTeKQP+Gk DQFDtwkagW71Rs7e6ThXYA9Fb0ac3uG6PWb5VjchVuW3S1GqR2RDr6XbuS84crYj2d+G ErFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=EYSrpED2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id ay6-20020a1709028b8600b001c08c0baedcsi7956341plb.67.2023.09.12.08.01.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 08:01:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=EYSrpED2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 5A0618174A4C; Tue, 12 Sep 2023 05:26:37 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235115AbjILM0a (ORCPT + 37 others); Tue, 12 Sep 2023 08:26:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47914 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235140AbjILM0N (ORCPT ); Tue, 12 Sep 2023 08:26:13 -0400 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E20AC10E3; Tue, 12 Sep 2023 05:26:08 -0700 (PDT) Received: by mail-lf1-x135.google.com with SMTP id 2adb3069b0e04-502b1bbe5c3so4277767e87.1; Tue, 12 Sep 2023 05:26:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1694521567; x=1695126367; 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=bnLlBCmtmpQwQX7mUFEwOLmXNNLfxSSVf+nmIrWyOZs=; b=EYSrpED2Cj87rwpIj26QLhbqEhLfgTWxmFxunudHer/hmDZkZy9DTJDmuh6LZh5wRZ kKpLbwF0mYSMO/GiKr2WWuNFYPs2M1t8xf2aNf0VhcEpUNgIsOS7dB4Ipy/WdjkO1KwA 58e17DgoSo5bQGUfqbrHi4luJuCrusUGNC94FqYEEy6DeY08O4OedEP/gQkgHtonRSxf Bpurbv22SQmU4NaCjNYhHJZFTmlmGB4BklTVbdrqZfbM+uUI7aaXD7M+VUyMIJhO+xBY VGUVo2OA/twMS4E71NKIsA04wxUFQXUstFAZOGpGYSfX5ptTly2p7ncx8JpGaf0GajMb EwCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694521567; x=1695126367; 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=bnLlBCmtmpQwQX7mUFEwOLmXNNLfxSSVf+nmIrWyOZs=; b=jBpc5nZC6pdPjNWGKlC1PZU540ud55MqC5LQVEb4MMgDrKGMRdUIns0krt8IV2RvTO dRR89kV/IgImZAoWbJQTrixaBlRkSNyqwgIfs62G4yNjtxXOE4uPctYIqO+qZFDZUzsG D9kBFrJSKRSpYtDtC8Mx/rihsd4tP3Pe+LBGzL0Ib8cW/QNGmyVNdCW8s5Nj+RNQitVo Q/DGauUQ+gtmFllOdT//7sqb4vIRx9RTInIKm3JK9BlzH6uVE0f8OnURKpXgABgEckGh +Hw/qftOK4bLCgUYp0O/uS/BUxtxECqTnRkNJN+A/BlGI41+s16Bu/KB9SN9mT+4UvXN OVHQ== X-Gm-Message-State: AOJu0Yz72mpFT6IOO+AbpQCEBi+h0FbdcEWVOp75ZDZe2zDKr7bZiXxL V/eEhf3A704xr44ywOTUFuWlnXbpdt2ecw== X-Received: by 2002:a05:6512:15a3:b0:501:c1d4:cf68 with SMTP id bp35-20020a05651215a300b00501c1d4cf68mr12169998lfb.15.1694521566405; Tue, 12 Sep 2023 05:26:06 -0700 (PDT) Received: from WBEC325.dom.local ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id g21-20020ac25395000000b004fe333128c0sm1737327lfh.242.2023.09.12.05.26.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 05:26:06 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Dan Carpenter , Simon Horman , Pawel Dembicki , Russell King , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 1/8] net: dsa: vsc73xx: use read_poll_timeout instead delay loop Date: Tue, 12 Sep 2023 14:21:55 +0200 Message-Id: <20230912122201.3752918-2-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230912122201.3752918-1-paweldembicki@gmail.com> References: <20230912122201.3752918-1-paweldembicki@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Tue, 12 Sep 2023 05:26:37 -0700 (PDT) X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776844425304788157 X-GMAIL-MSGID: 1776844425304788157 This commit switches delay loop to read_poll_timeout macro during Arbiter empty check in adjust link function. As Russel King suggested: "This [change] avoids the issue that on the last iteration, the code reads the register, test it, find 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." It also remove one short msleep delay. Suggested-by: Russell King Signed-off-by: Pawel Dembicki Reviewed-by: Andrew Lunn --- v3: - Add "Reviewed-by" to commit message only v2: - introduced patch drivers/net/dsa/vitesse-vsc73xx-core.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 4f09e7438f3b..b117c0c18e36 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -779,7 +779,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 +794,16 @@ 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)), + 1000, 10000, 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 Tue Sep 12 12:21:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawel Dembicki X-Patchwork-Id: 138693 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp928885vqx; Wed, 13 Sep 2023 01:15:53 -0700 (PDT) X-Google-Smtp-Source: AGHT+IESpFg/c765sxIMEhxLGMJPrW6GdJAjTzHJ/NFpYpi/7lK9V7QbahkPqRbaQ+f9WoipDqva X-Received: by 2002:a17:903:244c:b0:1c3:2c4d:889e with SMTP id l12-20020a170903244c00b001c32c4d889emr7155944pls.16.1694592952756; Wed, 13 Sep 2023 01:15:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694592952; cv=none; d=google.com; s=arc-20160816; b=uLZpzJlwORYDh/9BK0CtTSIJjAiIMGjUEoEV5VpNXIZ4eWalXGy576Lg6/ol8FnFuj rCgJBYNh1nr/KgJAD9NfLIglshH89qcUOJsl6j1cEHsu488CoDi2jVOhlzWz+gcDWVAg ktph4G7PpwZTe7uAMIzcjd2NvTOKKDFTy6Dvq1Dt7vIJfHNQ99nWoKCIx/FdM+K1rYbC CIJoxU38lehldaSceLYd1De0lRBeq0JwnGSPtjUjnakqMzArl9ISECQYWoHJKpt59dZz FzSJxghhaLvaOuGPJRJIea7kY0DqLXt9l9EltbeVDW7FqwQp6YVPQR7kJjQkfZrCaqaT cSlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=JLiYnDslj4QGPvPw52DJQXGshf2rhE8i4UYC6emHYJA=; fh=gYEzJOtouLyT41iBlZbcaSSXApRcz1Oa8ghilnvO8ck=; b=tdfdN9lcmal5AGfdQBbD1Bgnyw5c/S+vRP+AlDuzcEMmAQyYOxe4bEp/yKs1XRCf2m CuFX6rbP63ljBrF0ZEb8lCHpR+aLqbKfZrvTA8nykhgPJ07MfDU4rLosNMeuSDA2lekE GHmeIW/ScgmAXHl+H6NjGCn3Tl7R2QoNmBLEEtvjCX/zF+i2nk8rmiIL4TP0GhP1EE++ YDJaHGAQiYfecaVshZsPir/lMciYL08czJGc6rPi4ytpNF8Ihs33M+vsVbQW4mO9vY+V BWdgZdLydB4A7qGK3VNbiytDLEVszzwtM9tJ38rehPSLIIF47lakGRhuWRzIzL4oYWeN 5unw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b="mSeVFcL/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id j18-20020a170902da9200b001bf349fb856si10206882plx.356.2023.09.13.01.15.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Sep 2023 01:15:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b="mSeVFcL/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 4ABEB8275E69; Tue, 12 Sep 2023 05:27:29 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235172AbjILM1G (ORCPT + 37 others); Tue, 12 Sep 2023 08:27:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47892 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235229AbjILM0v (ORCPT ); Tue, 12 Sep 2023 08:26:51 -0400 Received: from mail-lf1-x129.google.com (mail-lf1-x129.google.com [IPv6:2a00:1450:4864:20::129]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C8F6410E3; Tue, 12 Sep 2023 05:26:42 -0700 (PDT) Received: by mail-lf1-x129.google.com with SMTP id 2adb3069b0e04-50078eba7afso9634875e87.0; Tue, 12 Sep 2023 05:26:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1694521600; x=1695126400; 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=JLiYnDslj4QGPvPw52DJQXGshf2rhE8i4UYC6emHYJA=; b=mSeVFcL/tbHM9eTF/baMaMLbu9IXfcK0WpJ+UWVfiwEkhoCeugbP3f/exZBsyp9oQL lNUGj8YpdBQ2/28L7Pr++n9crG5mvIY/UPH0zuGGjyFSnKBAPFLyba/ZCiab3gtv6gmk HtUx8120miroq5gbYEQhTMPf+0fcUBuH8N4oClyiOuI87DWMSTJGKYUPWgNQQurinEtl IoMx2Hbml+WCi1iia2nMm/ChrW8o52nZ4yUug05c6xiO7iwLn9SstdpSBFAz2JPSxoxd LkDb5h26J3WwZ7s8+lnT/lS0jlfa66c9jmSdUOt/3nANCnq2SumLCHlqqrWbXimN7aEY XcPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694521600; x=1695126400; 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=JLiYnDslj4QGPvPw52DJQXGshf2rhE8i4UYC6emHYJA=; b=ZZpiH/XDohXEel2QnTkiu4GsWuQRq/hnaQ6yn/i6qBNdMXnPBLCFDsBIe/3kJ4TA2n askrguTL9IMFV7xMrKOxbBC0BxNEEUXWQyc0vtCslOof7/1seXxPMBc20nWkrbIkadNf iSj334ls70VZNJZ0zmnAaXohCGJKto5QmbIGoIZVcxTOl9vXG4CObffOcYAYhSbxXBo8 rsQeTTBadUrJGub4uUGY5fhM8PyhnRcS/qX9VjGeEkngJ0keT2rfrbN80g4f1+RFgN0+ O8bpUAZ5igIfuX8cF+kJm0gOYnU6DHJuFnZLJOKpaletrY5vw49obEINPvuJwP4KhUrk ERdQ== X-Gm-Message-State: AOJu0Yzf9gxrsq9jwZoA5Rdn0RzCJnuHHVVy8EQPBfzXkgk7CvI6/p2X kHglgznqzGNZcBTDmc2zaZtT05zGI9kDCg== X-Received: by 2002:a05:6512:3a92:b0:4fd:cae7:2393 with SMTP id q18-20020a0565123a9200b004fdcae72393mr11965194lfu.2.1694521600349; Tue, 12 Sep 2023 05:26:40 -0700 (PDT) Received: from WBEC325.dom.local ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id g21-20020ac25395000000b004fe333128c0sm1737327lfh.242.2023.09.12.05.26.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 05:26:40 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Dan Carpenter , Simon Horman , Pawel Dembicki , Linus Walleij , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 4/8] net: dsa: vsc73xx: add port_stp_state_set function Date: Tue, 12 Sep 2023 14:21:58 +0200 Message-Id: <20230912122201.3752918-5-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230912122201.3752918-1-paweldembicki@gmail.com> References: <20230912122201.3752918-1-paweldembicki@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 12 Sep 2023 05:27:29 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776864966309161875 X-GMAIL-MSGID: 1776909499866104002 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 Signed-off-by: Pawel Dembicki --- 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 | 61 +++++++++++++++++++++++--- drivers/net/dsa/vitesse-vsc73xx.h | 2 + 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 8f2285a03e82..541fbc195df1 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -163,6 +163,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) @@ -619,9 +623,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); @@ -864,9 +865,6 @@ static void vsc73xx_phylink_mac_link_up(struct dsa_switch *ds, int port, if (duplex == DUPLEX_FULL) val |= VSC73XX_MAC_CFG_FDX; - /* Enable port (forwarding) in the receieve mask */ - vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, - VSC73XX_RECVMASK, BIT(port), BIT(port)); vsc73xx_adjust_enable_port(vsc, port, val); } @@ -1033,9 +1031,59 @@ static int vsc73xx_get_max_mtu(struct dsa_switch *ds, int port) return 9600 - ETH_HLEN - ETH_FCS_LEN; } +static int vsc73xx_port_setup(struct dsa_switch *ds, int port) +{ + /* Configure forward map to CPU <-> port only */ + if (port == CPU_PORT) + vsc->forward_map[CPU_PORT] = VSC73XX_SRCMASKS_PORTS_MASK & + ~BIT(CPU_PORT); + else + vsc->forward_map[port] = VSC73XX_SRCMASKS_PORTS_MASK & + BIT(CPU_PORT); + + return 0; +} + +/* 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 tag8021q operations. + */ + +static void vsc73xx_port_stp_state_set(struct dsa_switch *ds, int port, + u8 state) +{ + struct vsc73xx *vsc = ds->priv; + + if (state == BR_STATE_BLOCKING || state == BR_STATE_DISABLED) + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_RECVMASK, BIT(port), 0); + else + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_RECVMASK, BIT(port), BIT(port)); + + if (state == BR_STATE_LEARNING || state == BR_STATE_FORWARDING) + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_LEARNMASK, BIT(port), BIT(port)); + else + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_LEARNMASK, BIT(port), 0); + + if (state == BR_STATE_FORWARDING) + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + port, + VSC73XX_SRCMASKS_PORTS_MASK, + vsc->forward_map[port]); + else + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + port, + VSC73XX_SRCMASKS_PORTS_MASK, 0); +} + static const struct dsa_switch_ops vsc73xx_ds_ops = { .get_tag_protocol = vsc73xx_get_tag_protocol, .setup = vsc73xx_setup, + .port_setup = vsc73xx_port_setup, .phy_read = vsc73xx_phy_read, .phy_write = vsc73xx_phy_write, .phylink_get_caps = vsc73xx_phylink_get_caps, @@ -1049,6 +1097,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, }; static int vsc73xx_gpio_get(struct gpio_chip *chip, unsigned int offset) diff --git a/drivers/net/dsa/vitesse-vsc73xx.h b/drivers/net/dsa/vitesse-vsc73xx.h index f79d81ef24fb..224e284a5573 100644 --- a/drivers/net/dsa/vitesse-vsc73xx.h +++ b/drivers/net/dsa/vitesse-vsc73xx.h @@ -18,6 +18,7 @@ /** * struct vsc73xx - VSC73xx state container + * @forward_map: Forward table cache */ struct vsc73xx { struct device *dev; @@ -28,6 +29,7 @@ struct vsc73xx { u8 addr[ETH_ALEN]; const struct vsc73xx_ops *ops; void *priv; + u8 forward_map[VSC73XX_MAX_NUM_PORTS]; }; struct vsc73xx_ops { From patchwork Tue Sep 12 12:21:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawel Dembicki X-Patchwork-Id: 138301 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp530949vqx; Tue, 12 Sep 2023 09:32:53 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHdwytLX6YvU2aZZO97mONZGosaol3KSG8i8eq+9FeZBkfm5eajPq9PU+B6CK/IJLnUmBkC X-Received: by 2002:a05:6a21:3291:b0:13d:b318:5c70 with SMTP id yt17-20020a056a21329100b0013db3185c70mr16729129pzb.19.1694536372717; Tue, 12 Sep 2023 09:32:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694536372; cv=none; d=google.com; s=arc-20160816; b=ajoRPIreQEPKLgKZ7aDZj0Pp7XH4vge83gEhe0jHEi09/NEUg2ZHfAIhtW2+WijH4G pCq+zdHDvLsrwtL48Tt4hIFHd+CzkG+ousDxwTQxtediq7OSzkD7YZB7tGXOQ4O3b2g1 muHV82tRxhUr4nwiG/Op3zRIxI1RwQVE9cCQAH4uWGwxx4Nr2d7nG3/pJ/hNQZUULnqT qZQ+jybqW2ZxYahi1VmljFJkKfql83yto9fQIFUC04QZRBNRbdy8piXaI643AO5wVoSR IITpDqMbAHY4bsUYQEnVfyjwgwTv+oRZsKg8yi6SvGfeXnYM4MDFeeCLqVavUD+PQXkJ L6Zg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=6Tam0pcNO13ytdmka8YXfp7vl5yqntntth/LVuA4R9o=; fh=7pT+hAKdFm8SgkIrQfctQAWhXj//sVAB1OFY1O6ncNU=; b=Lolw+E2gway5lk0aaIx+Q1PFFX2db1hwkBRRumtsdHdBQL2MPQfanA9+e0xTZH0qzX e53KMXdrjz0Mni+z/VIXnHmmUtIZdo8bg2SwJ+/pAQ227lL/F3K1wGLxcYFtYY+Weeas oDNynOKgvLnsyQLqwBNaFtA0bWJTeixZCkRV3dUDtznwnUeRpmEUGr5phofSLv4zwbeT 76fYF2fpB8+VfwBgoQ8OlZerApBHXgL53XhU6VyHRghQ48rM4drNp0wkanosPWmlIs5c BLCqvlZd9swbATUVD2nLSKG8/aJGv4+/BYE7HSKIswjRHOX3XbBKLD7ZYD421kO8VXj/ fK7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=ZE+qG4+G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id i126-20020a639d84000000b00565342e3c47si7749669pgd.501.2023.09.12.09.32.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 09:32:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=ZE+qG4+G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id EE9988174A6D; Tue, 12 Sep 2023 05:27:32 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235302AbjILM1W (ORCPT + 37 others); Tue, 12 Sep 2023 08:27:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47978 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235145AbjILM0z (ORCPT ); Tue, 12 Sep 2023 08:26:55 -0400 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3FD91704; Tue, 12 Sep 2023 05:26:47 -0700 (PDT) Received: by mail-lf1-x135.google.com with SMTP id 2adb3069b0e04-50098cc8967so8943235e87.1; Tue, 12 Sep 2023 05:26:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1694521606; x=1695126406; 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=6Tam0pcNO13ytdmka8YXfp7vl5yqntntth/LVuA4R9o=; b=ZE+qG4+G8rw5Jr2ABqSmsDYH8i2+5K28yOIQ8BlGSzycOUEhqZhln4IevBTg6azJGM h1UQLOFAQdwQDDsTKkseqY6tOmcL6JXBljdsKs3mJPkpDwnK/nBHb03mvPrLVP2OCKmF pAz7fhzBhMKE+UC+QtWR3iQihHpkndwWnYlTNosDL2HrspAEgmBQNurq0EVftQFZTjON 1+oVp9svRaSWo22QNltaXhpXP96PMjbSYPIxppY9ptHAw8IRG/HDKguZBz3k6UsxFDh5 elKm2nFJZLVfQnkySDgw2FE1HvoKpG/r05tr3ceqpVyiw+hezrcIS9dd99IddTRZZDxy p11w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694521606; x=1695126406; 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=6Tam0pcNO13ytdmka8YXfp7vl5yqntntth/LVuA4R9o=; b=YED1TWuWg/t3EvVaknx5+JYNiWqyR5biSXfTDihJpZY45sYKPxrZiH43RCYKpSVAIo RHunLv+FMrm3gAeXDzn8oEWOdCYGIKj5NfyOwm+99wk6IdH0eGvqRU6NIYZd1+xNPi5j zXgrOmVvczHdOTRwXhft4KKUONgcx+q/+NaVR8usyG5Wj0F89TL9VhaxTE7r4gBjyHh0 C1cgjJ3xnYOoqP6Q3lLGzMvLXgxgZisgJCC7A3oWPRcAiAwx02IslUUCggzfRCleel6E lK5L5m4kM+opIjT6ddnFtlMmoJKQhjmx7xk4PnTpD97zKES95YvludWa5kOwLoRa3Zke +j8w== X-Gm-Message-State: AOJu0YxTfmxI4SnBhxdovDW05ZMOixvCwz35qaU5TB+P1Ot0WXH4hPEZ n9e/oUc5XLPSwAaiVQovB9BbnVXtIeHnFQ== X-Received: by 2002:a05:6512:10ca:b0:500:9d32:8deb with SMTP id k10-20020a05651210ca00b005009d328debmr12815034lfg.51.1694521605460; Tue, 12 Sep 2023 05:26:45 -0700 (PDT) Received: from WBEC325.dom.local ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id g21-20020ac25395000000b004fe333128c0sm1737327lfh.242.2023.09.12.05.26.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 05:26:45 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Dan Carpenter , Simon Horman , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 5/8] net: dsa: vsc73xx: Add vlan filtering Date: Tue, 12 Sep 2023 14:21:59 +0200 Message-Id: <20230912122201.3752918-6-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230912122201.3752918-1-paweldembicki@gmail.com> References: <20230912122201.3752918-1-paweldembicki@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Tue, 12 Sep 2023 05:27:33 -0700 (PDT) X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776850171360485734 X-GMAIL-MSGID: 1776850171360485734 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 --- 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 - note: dev_warn was keept because function 'vsc73xx_vlan_set_untagged' and 'vsc73xx_vlan_set_pvid' are used later in tag implementation v2: - no changes done drivers/net/dsa/vitesse-vsc73xx-core.c | 425 ++++++++++++++++++++++++- drivers/net/dsa/vitesse-vsc73xx.h | 2 + 2 files changed, 425 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index 541fbc195df1..d9a6eac1fcce 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -21,14 +21,18 @@ #include #include #include +#include #include #include #include +#include #include #include #include "vitesse-vsc73xx.h" +#define VSC73XX_IS_CONFIGURED 0x1 + #define VSC73XX_BLOCK_MAC 0x1 /* Subblocks 0-4, 6 (CPU port) */ #define VSC73XX_BLOCK_ANALYZER 0x2 /* Only subblock 0 */ #define VSC73XX_BLOCK_MII 0x3 /* Subblocks 0 and 1 */ @@ -61,6 +65,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 */ @@ -121,6 +127,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) @@ -134,6 +151,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 @@ -188,7 +214,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 @@ -343,6 +370,11 @@ static const struct vsc73xx_counter vsc73xx_tx_counters[] = { { 29, "TxQoSClass3" }, /* non-standard counter */ }; +enum vsc73xx_port_vlan_conf { + VSC73XX_VLAN_FILTER, + VSC73XX_VLAN_IGNORE, +}; + int vsc73xx_is_addr_valid(u8 block, u8 subblock) { switch (block) { @@ -563,7 +595,7 @@ static enum dsa_tag_protocol vsc73xx_get_tag_protocol(struct dsa_switch *ds, 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"); @@ -623,6 +655,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, + 0x5f); /* IP multicast flood mask (table 144) */ vsc73xx_write(vsc, VSC73XX_BLOCK_ANALYZER, 0, VSC73XX_IFLODMSK, 0xff); @@ -1031,8 +1066,387 @@ static int vsc73xx_get_max_mtu(struct dsa_switch *ds, int port) return 9600 - ETH_HLEN - ETH_FCS_LEN; } +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), + 1000, 10000, 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) | BIT(CPU_PORT); + else + portmap &= ~BIT(port); + + if (portmap == BIT(CPU_PORT)) + portmap = 0; + + return vsc73xx_write_vlan_table_entry(vsc, vid, portmap); +} + +static void +vsc73xx_set_vlan_conf(struct vsc73xx *vsc, int port, + enum vsc73xx_port_vlan_conf port_vlan_conf) +{ + if (port_vlan_conf == VSC73XX_VLAN_IGNORE) { + 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_TCI_IGNORE_ENA); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_CAT_VLAN_MISC, + VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA, + VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_TXUPDCFG, + VSC73XX_TXUPDCFG_TX_INSERT_TAG, 0); + } else { + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_CAT_VLAN_MISC, + VSC73XX_CAT_VLAN_MISC_VLAN_TCI_IGNORE_ENA, + 0); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_CAT_VLAN_MISC, + VSC73XX_CAT_VLAN_MISC_VLAN_KEEP_TAG_ENA, 0); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, + VSC73XX_TXUPDCFG, + VSC73XX_TXUPDCFG_TX_INSERT_TAG, + VSC73XX_TXUPDCFG_TX_INSERT_TAG); + } +} + +static int +vsc73xx_vlan_change_untagged(struct vsc73xx *vsc, int port, u16 vid, bool set) +{ + u32 val = set ? VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA : 0; + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_TXUPDCFG, + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA, val); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_TXUPDCFG, + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID, + (vid << VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_SHIFT) & + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID); + return 0; +} + +static int +vsc73xx_vlan_change_pvid(struct vsc73xx *vsc, int port, u16 vid, bool set) +{ + u32 val = set ? 0 : VSC73XX_CAT_DROP_UNTAGGED_ENA; + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_CAT_DROP, + VSC73XX_CAT_DROP_UNTAGGED_ENA, val); + + 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); + return 0; +} + +static int vsc73xx_vlan_port_is_pvid(struct vsc73xx *vsc, int port, u16 *vid) +{ + u32 val; + + vsc73xx_read(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_CAT_DROP, &val); + if (val & VSC73XX_CAT_DROP_UNTAGGED_ENA) + return 0; + + vsc73xx_read(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_CAT_PORT_VLAN, &val); + *vid = val & VSC73XX_CAT_PORT_VLAN_VLAN_VID; + + return VSC73XX_IS_CONFIGURED; +} + +static int vsc73xx_vlan_port_is_untagged(struct vsc73xx *vsc, int port, u16 *vid) +{ + u32 val; + + vsc73xx_read(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_TXUPDCFG, &val); + if (!(val & VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_ENA)) + return 0; + + vsc73xx_read(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_TXUPDCFG, + &val); + *vid = (val & VSC73XX_TXUPDCFG_TX_UNTAGGED_VID) >> + VSC73XX_TXUPDCFG_TX_UNTAGGED_VID_SHIFT; + + return VSC73XX_IS_CONFIGURED; +} + +static int vsc73xx_vlan_set_untagged(struct dsa_switch *ds, int port, u16 vid, + bool port_vlan) +{ + struct vsc73xx *vsc = ds->priv; + u16 vlan_no = 0; + + if (dsa_port_is_vlan_filtering(dsa_to_port(ds, port)) ^ port_vlan) { + if (vsc->untagged_storage[port] < VLAN_N_VID && + !vid_is_dsa_8021q(vsc->untagged_storage[port]) && + !vid_is_dsa_8021q(vid) && + vsc->untagged_storage[port] != vid) { + dev_warn(vsc->dev, + "Port %d can have only one untagged vid! Now is: %d.\n", + port, vsc->untagged_storage[port]); + return -EOPNOTSUPP; + } + vsc->untagged_storage[port] = vid; + } else { + if (vsc73xx_vlan_port_is_untagged(vsc, port, &vlan_no) == VSC73XX_IS_CONFIGURED && + !vid_is_dsa_8021q(vlan_no) && !vid_is_dsa_8021q(vid) && vlan_no != vid) { + dev_warn(vsc->dev, + "Port %d can have only one untagged vid! Now is: %d.\n", + port, vlan_no); + return -EOPNOTSUPP; + } + return vsc73xx_vlan_change_untagged(vsc, port, vid, 1); + } + + return 0; +} + +static int vsc73xx_vlan_set_pvid(struct dsa_switch *ds, int port, u16 vid, + bool port_vlan) +{ + struct dsa_port *dsa_port = dsa_to_port(ds, port); + struct vsc73xx *vsc = ds->priv; + u16 vlan_no; + + if (!dsa_port) + return -EINVAL; + + if (dsa_port_is_vlan_filtering(dsa_port) ^ port_vlan) { + if (vsc->pvid_storage[port] < VLAN_N_VID && + !vid_is_dsa_8021q(vsc->pvid_storage[port]) && + !vid_is_dsa_8021q(vid) && vsc->pvid_storage[port] != vid) { + dev_warn(vsc->dev, + "Port %d can have only one pvid! Now is: %d.\n", + port, vsc->pvid_storage[port]); + return -EOPNOTSUPP; + } + vsc->pvid_storage[port] = vid; + } else { + if (vsc73xx_vlan_port_is_pvid(vsc, port, &vlan_no) == VSC73XX_IS_CONFIGURED && + !vid_is_dsa_8021q(vlan_no) && !vid_is_dsa_8021q(vid) && + vlan_no != vid) { + dev_warn(vsc->dev, + "Port %d can have only one pvid! Now is: %d.\n", + port, vlan_no); + return -EOPNOTSUPP; + } + return vsc73xx_vlan_change_pvid(vsc, port, vid, 1); + } + + return 0; +} + +static int +vsc73xx_port_vlan_filtering(struct dsa_switch *ds, int port, + bool vlan_filtering, struct netlink_ext_ack *extack) +{ + struct vsc73xx *vsc = ds->priv; + bool store_untagged = false; + bool store_pvid = false; + u16 vlan_no; + + if (vlan_filtering) + vsc73xx_set_vlan_conf(vsc, port, VSC73XX_VLAN_FILTER); + else + vsc73xx_set_vlan_conf(vsc, port, VSC73XX_VLAN_IGNORE); + + if (vsc73xx_vlan_port_is_pvid(vsc, port, &vlan_no) == VSC73XX_IS_CONFIGURED) + store_pvid = true; + + if (vsc->pvid_storage[port] < VLAN_N_VID) + vsc73xx_vlan_change_pvid(vsc, port, vsc->pvid_storage[port], true); + else + vsc73xx_vlan_change_pvid(vsc, port, 0, false); + + vsc->pvid_storage[port] = store_pvid ? vlan_no : VLAN_N_VID; + + if (vsc73xx_vlan_port_is_untagged(vsc, port, &vlan_no) == VSC73XX_IS_CONFIGURED) + store_untagged = true; + + if (vsc->untagged_storage[port] < VLAN_N_VID) + vsc73xx_vlan_change_untagged(vsc, port, vsc->untagged_storage[port], true); + else + vsc73xx_vlan_change_untagged(vsc, port, 0, false); + + vsc->untagged_storage[port] = store_untagged ? vlan_no : VLAN_N_VID; + + 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 vsc73xx *vsc = ds->priv; + u16 vlan_no; + int ret; + + /* 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; + } + + if (port != CPU_PORT) { + if (untagged) { + ret = vsc73xx_vlan_set_untagged(ds, port, vlan->vid, true); + if (ret) + return ret; + } else { + if (vsc73xx_vlan_port_is_untagged(vsc, port, &vlan_no) + == VSC73XX_IS_CONFIGURED && + vlan_no == vlan->vid) + vsc73xx_vlan_change_untagged(vsc, port, 0, false); + else if (vsc->untagged_storage[port] == vlan->vid) + vsc->untagged_storage[port] = VLAN_N_VID; + } + if (pvid) { + ret = vsc73xx_vlan_set_pvid(ds, port, vlan->vid, true); + if (ret) + return ret; + } else { + if (vsc73xx_vlan_port_is_pvid(vsc, port, &vlan_no) + == VSC73XX_IS_CONFIGURED && + vlan_no == vlan->vid) + vsc73xx_vlan_change_pvid(vsc, port, 0, false); + else if (vsc->pvid_storage[port] == vlan->vid) + vsc->pvid_storage[port] = VLAN_N_VID; + } + } + + return vsc73xx_update_vlan_table(vsc, port, vlan->vid, 1); +} + +static int vsc73xx_port_vlan_del(struct dsa_switch *ds, int port, + const struct switchdev_obj_port_vlan *vlan) +{ + struct vsc73xx *vsc = ds->priv; + u16 vlan_no; + int ret; + + ret = vsc73xx_update_vlan_table(vsc, port, vlan->vid, 0); + if (ret) + return ret; + + if (vsc73xx_vlan_port_is_untagged(vsc, port, &vlan_no) == VSC73XX_IS_CONFIGURED && + vlan_no == vlan->vid) + vsc73xx_vlan_change_untagged(vsc, port, 0, false); + else if (vsc->untagged_storage[port] == vlan->vid) + vsc->untagged_storage[port] = VLAN_N_VID; + + if (vsc73xx_vlan_port_is_pvid(vsc, port, &vlan_no) == VSC73XX_IS_CONFIGURED && + vlan_no == vlan->vid) + vsc73xx_vlan_change_pvid(vsc, port, 0, false); + else if (vsc->pvid_storage[port] == vlan->vid) + vsc->pvid_storage[port] = VLAN_N_VID; + + return 0; +} + static int vsc73xx_port_setup(struct dsa_switch *ds, int port) { + struct vsc73xx *vsc = ds->priv; + int ret, i; + + /* Those bits are responsible for MTU only. Kernel take care about MTU, + * let's enable +8 bytes frame length unconditionally. + */ + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_MAC_CFG, + VSC73XX_MAC_CFG_VLAN_AWR | VSC73XX_MAC_CFG_VLAN_DBLAWR, + VSC73XX_MAC_CFG_VLAN_AWR | VSC73XX_MAC_CFG_VLAN_DBLAWR); + + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_CAT_DROP, + VSC73XX_CAT_DROP_TAGGED_ENA, 0); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_CAT_DROP, + 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, 0); + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_MAC, port, VSC73XX_TXUPDCFG, + 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); + + for (i = 0; i <= VLAN_N_VID; i++) { + ret = vsc73xx_update_vlan_table(vsc, port, i, 0); + if (ret) + return ret; + } + /* Configure forward map to CPU <-> port only */ if (port == CPU_PORT) vsc->forward_map[CPU_PORT] = VSC73XX_SRCMASKS_PORTS_MASK & @@ -1041,6 +1455,10 @@ static int vsc73xx_port_setup(struct dsa_switch *ds, int port) vsc->forward_map[port] = VSC73XX_SRCMASKS_PORTS_MASK & BIT(CPU_PORT); + /* Set storage values out of range*/ + vsc->pvid_storage[port] = VLAN_N_VID; + vsc->untagged_storage[port] = VLAN_N_VID; + return 0; } @@ -1098,6 +1516,9 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .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, }; static int vsc73xx_gpio_get(struct gpio_chip *chip, unsigned int offset) diff --git a/drivers/net/dsa/vitesse-vsc73xx.h b/drivers/net/dsa/vitesse-vsc73xx.h index 224e284a5573..b7614dd7d0eb 100644 --- a/drivers/net/dsa/vitesse-vsc73xx.h +++ b/drivers/net/dsa/vitesse-vsc73xx.h @@ -30,6 +30,8 @@ struct vsc73xx { const struct vsc73xx_ops *ops; void *priv; u8 forward_map[VSC73XX_MAX_NUM_PORTS]; + u16 pvid_storage[VSC73XX_MAX_NUM_PORTS]; + u16 untagged_storage[VSC73XX_MAX_NUM_PORTS]; }; struct vsc73xx_ops { From patchwork Tue Sep 12 12:22:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawel Dembicki X-Patchwork-Id: 138417 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp652332vqx; Tue, 12 Sep 2023 13:07:43 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEKueJzx/v06ixI8Eeq+GWkgqKnZtzIQoFQccNdvW0rMTFGXCCf9DH3lORwXggTgszVvFiK X-Received: by 2002:aca:120c:0:b0:3a8:4e27:3af3 with SMTP id 12-20020aca120c000000b003a84e273af3mr777816ois.48.1694549263510; Tue, 12 Sep 2023 13:07:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694549263; cv=none; d=google.com; s=arc-20160816; b=UfRG77MRMKbDUiTHPdZMkpXHmNXV25W7seVZzVvTnAvZrpdHABI0/XVrmPAKMKEFoj f1nmGwmy4o1drwgQ8g3CD/RYXP1MH2ftaOfUkFDZLWeUla2RfootLJTx2JaUG+P6rh28 xSsvJulhvICRySz2FqafSC6UeaWttHnkXD7Vj1ZXAUmKqjN47ggtyh0z21Q5eyl6OxOv 2nLfa1W1yy+I26sBlf5btT8iyO+GFNuAx11q8WTh4mdir1fQpkRqnNJ9wmwRlsclBPI4 C1G7ZhH7w9AVr54/o8Fxr0PJS2dHMzMWboYI9RBMEsZ74InUlF3P4cvtSAvDLwk3lWFH P3rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ANqMiomoxPmzQbiZ41qjsZJkA0fJxmIQflrdUDa6u/M=; fh=7pT+hAKdFm8SgkIrQfctQAWhXj//sVAB1OFY1O6ncNU=; b=YkuJQ9jbr3kMdCnK6eKK3gGz3CVjDrEsU3ppOMvdPsczdhRzzdz0MqFi3BN+vvUXsj tZ4nup3CvQXJ/YNgaZhh5QroBXTDB0HJKpjiyCdeM2bK12H78Li41l486HH2Ax58XJHL Lk2TcdI8mRjA2Zi4XJ8zcx+ZkDupg4ghj4+gN4PEydzFVpFEoSbFpliCHIGgyyMgIAyX +TT/X0VFQgi8fghVhY4tv0UMdkziPQ6WNM4x481LYhixyEUv9sCvbXUSc2UU4ZUZdcb0 fkXXVMqr9wBq81gqF1VJRxPxEFhKFwwqV0mT8FC9wmF+r62rUA75LftJF2yHHiV4+3F/ ZFsA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=VKzAREVV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id d22-20020a63d656000000b005650ad0d543si8113006pgj.113.2023.09.12.13.07.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 13:07:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=VKzAREVV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 079EC8174A6F; Tue, 12 Sep 2023 05:27:42 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235200AbjILM1Z (ORCPT + 37 others); Tue, 12 Sep 2023 08:27:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235164AbjILM04 (ORCPT ); Tue, 12 Sep 2023 08:26:56 -0400 Received: from mail-lf1-x136.google.com (mail-lf1-x136.google.com [IPv6:2a00:1450:4864:20::136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6EE551710; Tue, 12 Sep 2023 05:26:52 -0700 (PDT) Received: by mail-lf1-x136.google.com with SMTP id 2adb3069b0e04-501bef6e0d3so9182978e87.1; Tue, 12 Sep 2023 05:26:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1694521610; x=1695126410; 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=ANqMiomoxPmzQbiZ41qjsZJkA0fJxmIQflrdUDa6u/M=; b=VKzAREVVwo3lvhfM4Q4KkJQshJ/ooL+UmI5dgSZLamJVXPuEaIkknbISSvbJT//wio AM9QyckVzAuhmLDxlxamt3yoDU/UGO7lEhqaJPfycPf4MK0T+uPal+rUw49WVR/0B3tk OoALIztHJKAvDkz3QoF2hrmrigmA6bRMliA3CJ9oC2d/YShhDjbDAiT1V6QslXR0xkdR xZCAVe0dQGgo0ZEbGmnwzMmkVgOCgb7JJcCrvBq1+fV4r6tTO1jPPqVWEHN4a13kzZmp kQTZlilmIIQKYelyW+dESA1dNepuyKw317ItFTlY8Frlgg5LRPo5Am3tKiFpKGmdtguF 0S6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694521610; x=1695126410; 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=ANqMiomoxPmzQbiZ41qjsZJkA0fJxmIQflrdUDa6u/M=; b=L3LIZ3JYR9JnQO4K9iWgYnW+mlQoOQ8A6MkziL3Kh2nHusI3UHUrrrQUiucunKv1QJ KDCRh3NGP173Q6O+y/8EvaeBqCnBEtOkudt9Qwjskjb6y3YLGvwrwNu0OVE/LqPmtVRW lbppXBQY+BjeAREIdz7qJVF97f5aiZJXL4UBOYmmdzuy0M21jV/Nqb5Hv7TqTQpo9OmY kDmPQfCySyFIm6sezY7buEjuOTcpZ2o/hAIL+E0RZLfHE2vcNYcIu3PkTl7vp4067zE0 /zPU2hQqEi1l+ZUpxdBALBs1aN0h8DzPBPctWirKVt4UlEb5pN21uxcTJrpUInWKshKf p4sQ== X-Gm-Message-State: AOJu0YxgdtG+/CgbTz63R55cPHIKnmMgouHtj9Yduzhl8uPEm7EhatYt tx2+y//RH7qJzJlbH1lHBb0A2vRDhh9gBQ== X-Received: by 2002:ac2:5b4d:0:b0:4fd:fd97:a77b with SMTP id i13-20020ac25b4d000000b004fdfd97a77bmr9214832lfp.50.1694521610361; Tue, 12 Sep 2023 05:26:50 -0700 (PDT) Received: from WBEC325.dom.local ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id g21-20020ac25395000000b004fe333128c0sm1737327lfh.242.2023.09.12.05.26.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 05:26:50 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Dan Carpenter , Simon Horman , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 6/8] net: dsa: vsc73xx: introduce tag 8021q for vsc73xx Date: Tue, 12 Sep 2023 14:22:00 +0200 Message-Id: <20230912122201.3752918-7-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230912122201.3752918-1-paweldembicki@gmail.com> References: <20230912122201.3752918-1-paweldembicki@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Tue, 12 Sep 2023 05:27:43 -0700 (PDT) X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776863688856489980 X-GMAIL-MSGID: 1776863688856489980 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. Signed-off-by: Pawel Dembicki --- 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 | 91 +++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 net/dsa/tag_vsc73xx_8021q.c diff --git a/include/net/dsa.h b/include/net/dsa.h index 0b9c6aa27047..f83454d4ad02 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 12e305824a96..bab8a933c514 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..9093a71e6eb0 --- /dev/null +++ b/net/dsa/tag_vsc73xx_8021q.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-2.0 OR MIT +/* Copyright (C) 2022 Pawel Dembicki + * Based on tag_sja1105.c: + * Copyright (c) 2019, Vladimir Oltean + */ +#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_slave_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 void vsc73xx_vlan_rcv(struct sk_buff *skb, int *source_port, + int *switch_id, int *vbid, u16 *vid) +{ + if (vid_is_dsa_8021q(skb_vlan_tag_get(skb) & VLAN_VID_MASK)) + return dsa_8021q_rcv(skb, source_port, switch_id, vbid); + + /* Try our best with imprecise RX */ + *vid = skb_vlan_tag_get(skb) & VLAN_VID_MASK; +} + +static struct sk_buff *vsc73xx_rcv(struct sk_buff *skb, struct net_device *netdev) +{ + int src_port = -1, switch_id = -1, vbid = -1; + u16 vid; + + if (skb_vlan_tag_present(skb)) { + /* Normal traffic path. */ + vsc73xx_vlan_rcv(skb, &src_port, &switch_id, &vbid, &vid); + } else { + netdev_warn(netdev, "Couldn't decode source port\n"); + return NULL; + } + + if (vbid >= 1) + skb->dev = dsa_tag_8021q_find_port_by_vbid(netdev, vbid); + else if (src_port == -1 || switch_id == -1) + skb->dev = dsa_find_designated_bridge_port_by_vid(netdev, vid); + else + skb->dev = dsa_master_find_slave(netdev, switch_id, src_port); + if (!skb->dev) { + netdev_warn(netdev, "Couldn't decode source port\n"); + return NULL; + } + + dsa_default_offload_fwd_mark(skb); + + if (dsa_port_is_vlan_filtering(dsa_slave_to_port(skb->dev)) && + eth_hdr(skb)->h_proto == htons(ETH_P_8021Q)) + __vlan_hwaccel_clear_tag(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_master = true, +}; + +MODULE_LICENSE("GPL"); +MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_VSC73XX_8021Q, VSC73XX_8021Q_NAME); + +module_dsa_tag_driver(vsc73xx_8021q_netdev_ops); From patchwork Tue Sep 12 12:22:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawel Dembicki X-Patchwork-Id: 138317 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp539766vqx; Tue, 12 Sep 2023 09:47:44 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGCP/emMz/71JgNEt8C6E3WovVKPMB3z/PEG7mnGfMI4nOJLGKH6IFiLUMxRNan1pU0AZMg X-Received: by 2002:a17:902:daca:b0:1be:f2a1:22d8 with SMTP id q10-20020a170902daca00b001bef2a122d8mr321063plx.14.1694537264339; Tue, 12 Sep 2023 09:47:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694537264; cv=none; d=google.com; s=arc-20160816; b=eJGkDP2TsNAdQ/EfDs5qkN+CCnj9LTzEZitDZhQWk0dwhMOQws/2ctEe3HG0izoEhI 6tXD/KsjDMLegy/4BAYVCDKkT9y20719svJX9WFSWd2c7UdwWLxIJaoPMwoMO1DZaLc+ 8octPGztMOJ3WEdZDImGh4BtjwmM0Nsg6ejO4nqjXSatR0qO4xkyJXEF8It1CIiF5wqj slLlg5n3YCSBExpKquvH1hYMitCQXGAGjG0w4VS4LhIIEYRdbu1di91/Cxck6Y00H6tI 8pxS2UQRN9YxBnm3WjVoZL+XAFVK2eEhoH53BIUB31YzN4/81ymqqlvNKxVSYO+CAOPB eegQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=HgSiRWdgC/hwg8MbvdGK6CbTNx/MfKCBd8+7AqLBFRs=; fh=7pT+hAKdFm8SgkIrQfctQAWhXj//sVAB1OFY1O6ncNU=; b=twCmCkLi0al1m/TFVT9VFHE0yPuuNHlpfz4yd35PRkyafSpFiazWg06vPGUhBJJ0xq SVf7nJAltwQD9vL8c7bj8P3iaREaPQ4znMaZvBlNTXGXSG0px5hgyIkTsZ723p32nILR 0O3YSOwHc9TbouxvPxTqGfFJUTW801Gz+SpVQO5KItAvGOlwIWCkEAX75ZYZt4LslKaU 7LurA/HA0ybWenPBGxxUaQby2IqczSGpw92NJcEeItQo8PfPyo4kzOxGWmDp+NnudWyg hmnayLe+7CGWOIefjDgqoBtJdkvXGWlCTKGhe+oceR7A/CuEw/+6dzGoEY2jVyYaZW44 IzTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=DBrGfpj0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id jg20-20020a17090326d400b001bda57935f8si8075537plb.563.2023.09.12.09.47.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 09:47:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=DBrGfpj0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 43EA58174A7F; Tue, 12 Sep 2023 05:27:57 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235230AbjILM1l (ORCPT + 37 others); Tue, 12 Sep 2023 08:27:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48096 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235173AbjILM1C (ORCPT ); Tue, 12 Sep 2023 08:27:02 -0400 Received: from mail-lj1-x230.google.com (mail-lj1-x230.google.com [IPv6:2a00:1450:4864:20::230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6D12510DC; Tue, 12 Sep 2023 05:26:57 -0700 (PDT) Received: by mail-lj1-x230.google.com with SMTP id 38308e7fff4ca-2b9c907bc68so94669131fa.2; Tue, 12 Sep 2023 05:26:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1694521615; x=1695126415; 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=HgSiRWdgC/hwg8MbvdGK6CbTNx/MfKCBd8+7AqLBFRs=; b=DBrGfpj0YAPt07jvbvXQLELOhfXIg+GNvApcKL5krt20XHcuLrl6vLY7HbCG2zEDLb glXZOArZvJ7WRF0lLJknFLW2eyFabvp+fLxZgO2OMwdgD/4CsKu4MS7MfmqWXxuOFmNx PrLtSNzu+e23NbKwQoEEB3xfkFmaB689C2i5TFuxS6ENipsoHFnKubxZHbntL9LstDL+ 8EjU8KJvWXqgt33GcGRXCpbgNIxRL9amSit73dOdduFM10UePeZKR3n+EA5HojjRmw6n AE9ZHaWo+a4LQIiAQgp5tdjapuLKw/9wZRnRc6imJ82YZ6YJiauMtOJYBEg/rBkDHOfD RsDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694521615; x=1695126415; 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=HgSiRWdgC/hwg8MbvdGK6CbTNx/MfKCBd8+7AqLBFRs=; b=Z2qcqwou0lcaMUq60S31vuRIQ2NH+BqNNGD6nXM/FW0gcZ1RvMFydP0tPoI8TjF4Wa 7w5pMAFiPJQF3/yCFHJ+Pn0/KHN/YxnfcA2BOb1ONCFNyvhlR3eQOBgHBAgTpc00x4dt VL6uy362JDM3zufOy2DqKUTze/BaCX/+8ebduVY+oMJITGiF9fjzBRjMuHhDxdtOOT6m FRw1Q5Rep5riURfurI7aqARgHf0/sclmEnRvoU65L9MiE1hu5vK9SPVS3gC34k3ZtBaa J99rXK/e8xX92p2EVAgjiRp9FIFp77KPNJ74tTM3LaGUIomvKKcsWeNqRd7N+qOZS2xn x3ag== X-Gm-Message-State: AOJu0YyZ9Gul2twK2otTFaJWDG3+AZk0xiSdNvscQGtG+jPA8pYd8f9+ 49sPGuwgABBqycLQdjhvxz/mJXNENn4AaQ== X-Received: by 2002:a19:8c4b:0:b0:500:d8d6:fbe4 with SMTP id i11-20020a198c4b000000b00500d8d6fbe4mr9195198lfj.49.1694521615356; Tue, 12 Sep 2023 05:26:55 -0700 (PDT) Received: from WBEC325.dom.local ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id g21-20020ac25395000000b004fe333128c0sm1737327lfh.242.2023.09.12.05.26.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 05:26:55 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Dan Carpenter , Simon Horman , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 7/8] net: dsa: vsc73xx: Implement vsc73xx 8021q tagger Date: Tue, 12 Sep 2023 14:22:01 +0200 Message-Id: <20230912122201.3752918-8-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230912122201.3752918-1-paweldembicki@gmail.com> References: <20230912122201.3752918-1-paweldembicki@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Tue, 12 Sep 2023 05:27:57 -0700 (PDT) X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776851106606712224 X-GMAIL-MSGID: 1776851106606712224 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. The tag driver introduces the most basic functionality required for proper tagging support. Signed-off-by: Pawel Dembicki --- v3: - Split tagger and tag implementation into separate commits drivers/net/dsa/Kconfig | 2 +- drivers/net/dsa/vitesse-vsc73xx-core.c | 48 +++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/Kconfig b/drivers/net/dsa/Kconfig index f8c1d73b251d..120bc3ded9f2 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 d9a6eac1fcce..bf903502bac1 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 @@ -589,7 +590,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_setup(struct dsa_switch *ds) @@ -664,6 +665,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); @@ -1412,6 +1419,43 @@ 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; + int ret; + + if (untagged) { + if (!dsa_port_is_vlan_filtering(dsa_to_port(ds, port))) { + ret = vsc73xx_vlan_set_untagged(ds, port, vid, false); + if (ret) + return ret; + } else { + vsc->untagged_storage[port] = vid; + } + } + if (pvid) { + if (!dsa_port_is_vlan_filtering(dsa_to_port(ds, port))) { + ret = vsc73xx_vlan_set_pvid(ds, port, vid, false); + if (ret) + return ret; + } else { + vsc->pvid_storage[port] = vid; + } + } + + return vsc73xx_update_vlan_table(vsc, port, vid, 1); +} + +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, 0); +} + static int vsc73xx_port_setup(struct dsa_switch *ds, int port) { struct vsc73xx *vsc = ds->priv; @@ -1519,6 +1563,8 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .port_vlan_filtering = vsc73xx_port_vlan_filtering, .port_vlan_add = vsc73xx_port_vlan_add, .port_vlan_del = vsc73xx_port_vlan_del, + .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 Tue Sep 12 12:22:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawel Dembicki X-Patchwork-Id: 138418 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp653154vqx; Tue, 12 Sep 2023 13:09:16 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGwYGcMeOVYuuwXSydcWBgrMmP9IMFP6tjjx0FDtkVwL6X7syZSRbwDTTy6UwIJz0oua2Ta X-Received: by 2002:a05:6808:1aac:b0:3ab:8877:c844 with SMTP id bm44-20020a0568081aac00b003ab8877c844mr674131oib.43.1694549356537; Tue, 12 Sep 2023 13:09:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694549356; cv=none; d=google.com; s=arc-20160816; b=qyVY9ej3FV7jlhNshaBc2NvgHB7v/eGGrrEqLnI0ssUQT2tM/3kYC0yuiQ4W7pBAxI FD9OZx9sXyNBBLEY4tLQfIP3xYq+Zp/JvRnV7hblzZ42OJ51akhTM0bSAj9jfgJuVnr/ 8fxIE3eUxY/hnfON2UoZTAggZgP6xH0eO7hQG7+EvQOpDrTRkd27dT99AnA2RX7/Wvos CVKAUjfY4KurXzEND116KI/Et6bTdboXP332qtaqEUBgjYqkH09v+6y3eJ8ckS3xAwZL jSIWLTgc/tP1pg2s8DNas9bszHBO1fzwqMW+R1F1C14gOIV1ut9yXtcq2aHe5G1JvO2f vzNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=zvJnLKH3iVusfXwT0xX8TegBSkGglWIW+YxRLtmLGrs=; fh=7pT+hAKdFm8SgkIrQfctQAWhXj//sVAB1OFY1O6ncNU=; b=eZ60RsKzt0u+xYqZ0kpwB1BKQ+FwooOKjGp45299nY4M2dNbifXnxQsxAFjkgM+b8q M6PYQwyB6bNIgZJGPkCcSsDehRt4vdaFU/xM1Catzngau6vU7F9SdzQxFu/lsQRmn3eS 94nL1EggktF+gsVjg1g9IeWT+Gz4k4iQqZCyZat2+vqXEjb0fH+oCudGcIgWBSMNA7Vf 7j58OJymYaXY7jjOkA4iVQKH1I8qqXPbewgCFMBsxR7TyEjHKrRJUxzjNdM+mND+MH30 s/GBRNHq0WC+m7VenDnx4SO4VV+lkm2O3Y3SNHYt0UGPXk8XfDEjCXrBh2/RID5ehnXI Vazg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=Efg6KtBB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from morse.vger.email (morse.vger.email. [23.128.96.31]) by mx.google.com with ESMTPS id a8-20020a654188000000b00563da8d8416si8072369pgq.355.2023.09.12.13.09.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 13:09:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) client-ip=23.128.96.31; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=Efg6KtBB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id 4765980758FB; Tue, 12 Sep 2023 05:28:09 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235318AbjILM1b (ORCPT + 37 others); Tue, 12 Sep 2023 08:27:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47814 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235154AbjILM1G (ORCPT ); Tue, 12 Sep 2023 08:27:06 -0400 Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30EE910DB; Tue, 12 Sep 2023 05:27:02 -0700 (PDT) Received: by mail-lf1-x134.google.com with SMTP id 2adb3069b0e04-5007616b756so9160286e87.3; Tue, 12 Sep 2023 05:27:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1694521620; x=1695126420; 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=zvJnLKH3iVusfXwT0xX8TegBSkGglWIW+YxRLtmLGrs=; b=Efg6KtBB/rDCG00i06B/5BDBYIwZ4YMloP4dZPUXt8bTkACQ/9+0hAT1gZTpyVAT7T 9kp6tLcIgS6iLt/wVbjFTLg56ub4wlY6JKbbSFahHmF78tawzQkZD10lrDWpB8nRnfa1 HUpm+Z2CAI9YYCmnLN1FTgV2MIuvJLPQ919cO9YG0UBcd4VYTxDpsleissa3K/MSBDWK 5lT1dJV8le3ARn/EBDUbLysumiMdwsC3S0hojTZv0sfFCw4y4TjmB/S2theGiEpam9VI D8LSLYTBUt3AZOXEOR2s8peLpo00EhmKltjDXvK7MySGBgVVFwZN7zTL/1pm7VBb5WMI vO3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694521620; x=1695126420; 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=zvJnLKH3iVusfXwT0xX8TegBSkGglWIW+YxRLtmLGrs=; b=qigOt7ikvH8aVbWKOcVgKXcFr2oHdA0xHPv51RDeVAAGcOos401Efyug1D+NyRLF8K pd7A2Esi7fAOTvtUVEEoqOOcauHtFY6GOJGfEb/9Ekc7rn52fNtaqRdcWxpzGmikdSC6 ILFsZCNOmsTqQaX59hIdF6dc2BLF59eVqnWTPApiYhq52kd6Eg6b4rqKwpX+BB9wx5yH pwLYX5y8OJGbqvF51LpEDBuk0qhHU2XzZKM625kS6n+hIL22/xcYcpCTn28VvY5MYnuL 3Qa4NBoXNo62sGvYMcDmDi7xCd0bPQRBjGZDxC1NtR3qvDZ2B1AOrgc1Y+7BeirBBLoK RFug== X-Gm-Message-State: AOJu0YwRAea+VCxxCJNF+B961kE7CXBn+VEa+oLFONBdPzkZzkVOOUEO aSYEhQvg4tfHVEWqwe5+yBektrGEze8MYQ== X-Received: by 2002:a19:8c4b:0:b0:500:d8d6:fbe4 with SMTP id i11-20020a198c4b000000b00500d8d6fbe4mr9195419lfj.49.1694521620090; Tue, 12 Sep 2023 05:27:00 -0700 (PDT) Received: from WBEC325.dom.local ([185.188.71.122]) by smtp.gmail.com with ESMTPSA id g21-20020ac25395000000b004fe333128c0sm1737327lfh.242.2023.09.12.05.26.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 05:26:59 -0700 (PDT) From: Pawel Dembicki To: netdev@vger.kernel.org Cc: Dan Carpenter , Simon Horman , Pawel Dembicki , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 8/8] net: dsa: vsc73xx: Add bridge support Date: Tue, 12 Sep 2023 14:22:02 +0200 Message-Id: <20230912122201.3752918-9-paweldembicki@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230912122201.3752918-1-paweldembicki@gmail.com> References: <20230912122201.3752918-1-paweldembicki@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Tue, 12 Sep 2023 05:28:09 -0700 (PDT) X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on morse.vger.email X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776863785677591507 X-GMAIL-MSGID: 1776863785677591507 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. Signed-off-by: Pawel Dembicki --- 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 | 72 ++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c index bf903502bac1..9d0367c2c52c 100644 --- a/drivers/net/dsa/vitesse-vsc73xx-core.c +++ b/drivers/net/dsa/vitesse-vsc73xx-core.c @@ -600,6 +600,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 = 7; + /* Issue RESET */ vsc73xx_write(vsc, VSC73XX_BLOCK_SYSTEM, 0, VSC73XX_GLORESET, VSC73XX_GLORESET_MASTER_RESET); @@ -1456,6 +1459,73 @@ static int vsc73xx_tag_8021q_vlan_del(struct dsa_switch *ds, int port, u16 vid) return vsc73xx_update_vlan_table(vsc, port, vid, 0); } +static void vsc73xx_update_forwarding_map(struct vsc73xx *vsc) +{ + int i; + + for (i = 0; i < vsc->ds->num_ports; i++) { + u32 val; + + vsc73xx_read(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + i, &val); + /* update only if port is in forwarding state */ + if (val & VSC73XX_SRCMASKS_PORTS_MASK) + vsc73xx_update_bits(vsc, VSC73XX_BLOCK_ANALYZER, 0, + VSC73XX_SRCMASKS + i, + VSC73XX_SRCMASKS_PORTS_MASK, + vsc->forward_map[i]); + } +} + +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) +{ + struct vsc73xx *vsc = ds->priv; + int i; + + *tx_fwd_offload = true; + + for (i = 0; i < ds->num_ports; i++) { + /* Add this port to the forwarding matrix of the + * other ports in the same bridge, and viceversa. + */ + if (!dsa_is_user_port(ds, i)) + continue; + + if (i == port) + continue; + + if (!dsa_port_offloads_bridge(dsa_to_port(ds, i), &bridge)) + continue; + + vsc->forward_map[port] |= VSC73XX_SRCMASKS_PORTS_MASK & BIT(i); + vsc->forward_map[i] |= VSC73XX_SRCMASKS_PORTS_MASK & BIT(port); + } + vsc73xx_update_forwarding_map(vsc); + + 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) +{ + struct vsc73xx *vsc = ds->priv; + int i; + + /* configure forward map to CPU <-> port only */ + for (i = 0; i < vsc->ds->num_ports; i++) { + if (i == CPU_PORT) + continue; + vsc->forward_map[i] &= VSC73XX_SRCMASKS_PORTS_MASK & ~BIT(port); + } + vsc->forward_map[port] = VSC73XX_SRCMASKS_PORTS_MASK & BIT(CPU_PORT); + + vsc73xx_update_forwarding_map(vsc); + dsa_tag_8021q_bridge_leave(ds, port, bridge); +} + static int vsc73xx_port_setup(struct dsa_switch *ds, int port) { struct vsc73xx *vsc = ds->priv; @@ -1557,6 +1627,8 @@ static const struct dsa_switch_ops vsc73xx_ds_ops = { .get_sset_count = vsc73xx_get_sset_count, .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,