From patchwork Fri Jan 9 17:12:50 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Leite X-Patchwork-Id: 427186 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4279A140077 for ; Sat, 10 Jan 2015 04:14:44 +1100 (AEDT) Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 16202284270; Fri, 9 Jan 2015 18:11:24 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.3.2 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 8B54728424A for ; Fri, 9 Jan 2015 18:11:19 +0100 (CET) X-policyd-weight: using cached result; rate: -5.5 Received: from smtp.rcn.com (smtp.rcn.com [69.168.97.78]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Fri, 9 Jan 2015 18:11:18 +0100 (CET) X_CMAE_Category: , , X-CNFS-Analysis: v=2.0 cv=bYPpoZzB c=1 sm=1 a=JcyngB3XFbJbZ0YyysOmzg==:17 a=8ndMLmUfAAAA:8 a=9C2nnxEJAAAA:8 a=jdP34snFAAAA:8 a=rQ4TIbwS08wgHJIVu58A:9 a=JcyngB3XFbJbZ0YyysOmzg==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: bGVpdGVjQHN0YXRpY2t5LmNvbQ== Authentication-Results: smtp01.rcn.cmh.synacor.com smtp.mail=leitec@staticky.com; spf=neutral; sender-id=neutral Authentication-Results: smtp01.rcn.cmh.synacor.com header.from=leitec@staticky.com; sender-id=neutral Received-SPF: neutral (smtp01.rcn.cmh.synacor.com: 208.58.65.40 is neither permitted nor denied by domain of staticky.com) Received: from [208.58.65.40] ([208.58.65.40:58878] helo=dirk.lan.staticky.com) by smtp.rcn.com (envelope-from ) (ecelerity 3.6.2.43620 r(Platform:3.6.2.0)) with ESMTP id 98/0E-43469-73C00B45; Fri, 09 Jan 2015 12:13:28 -0500 From: Claudio Leite To: openwrt-devel@lists.openwrt.org Date: Fri, 9 Jan 2015 12:12:50 -0500 Message-Id: <1420823570-8706-4-git-send-email-leitec@staticky.com> X-Mailer: git-send-email 2.2.1 In-Reply-To: <1420823570-8706-1-git-send-email-leitec@staticky.com> References: <1420823570-8706-1-git-send-email-leitec@staticky.com> Subject: [OpenWrt-Devel] [PATCH 4/4] mvsw61xx: track and set per-VLAN port state in STU X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" Since the driver doesn't know anything about (M)STP we just hard-set the ports to be enabled if they are part of the VLAN. Signed-off-by: Claudio Leite --- .../linux/generic/files/drivers/net/phy/mvsw61xx.c | 38 ++++++++++++++++++---- .../linux/generic/files/drivers/net/phy/mvsw61xx.h | 1 + 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/target/linux/generic/files/drivers/net/phy/mvsw61xx.c b/target/linux/generic/files/drivers/net/phy/mvsw61xx.c index 7ddb13e..116f6cf 100644 --- a/target/linux/generic/files/drivers/net/phy/mvsw61xx.c +++ b/target/linux/generic/files/drivers/net/phy/mvsw61xx.c @@ -2,6 +2,7 @@ * Marvell 88E61xx switch driver * * Copyright (c) 2014 Claudio Leite + * Copyright (c) 2014 Nikita Nazarenko * * Based on code (c) 2008 Felix Fietkau * @@ -27,6 +28,7 @@ MODULE_DESCRIPTION("Marvell 88E61xx Switch driver"); MODULE_AUTHOR("Claudio Leite "); +MODULE_AUTHOR("Nikita Nazarenko "); MODULE_LICENSE("GPL v2"); MODULE_ALIAS("platform:mvsw61xx"); @@ -333,6 +335,7 @@ static int mvsw61xx_set_vlan_ports(struct switch_dev *dev, state->vlans[vno].mask = 0; state->vlans[vno].port_mode = 0; + state->vlans[vno].port_sstate = 0; if(state->vlans[vno].vid == 0) state->vlans[vno].vid = vno; @@ -348,6 +351,8 @@ static int mvsw61xx_set_vlan_ports(struct switch_dev *dev, mode = MV_VTUCTL_EGRESS_UNTAGGED; state->vlans[vno].port_mode |= mode << (pno * 4); + state->vlans[vno].port_sstate |= + MV_STUCTL_STATE_FORWARDING << (pno * 4 + 2); } /* @@ -447,7 +452,7 @@ static int mvsw61xx_set_enable_vlan(struct switch_dev *dev, static int mvsw61xx_vtu_program(struct switch_dev *dev) { struct mvsw61xx_state *state = get_state(dev); - u16 v1, v2; + u16 v1, v2, s1, s2; int i; /* Flush */ @@ -466,14 +471,32 @@ static int mvsw61xx_vtu_program(struct switch_dev *dev) mvsw61xx_wait_mask_s(dev, MV_GLOBALREG(VTU_OP), MV_VTUOP_INPROGRESS, 0); - sw16(dev, MV_GLOBALREG(VTU_VID), - MV_VTU_VID_VALID | state->vlans[i].vid); + /* Write per-VLAN port state into STU */ + s1 = (u16) (state->vlans[i].port_sstate & 0xffff); + s2 = (u16) ((state->vlans[i].port_sstate >> 16) & 0xffff); + + sw16(dev, MV_GLOBALREG(VTU_VID), MV_VTU_VID_VALID); + sw16(dev, MV_GLOBALREG(VTU_SID), i); + sw16(dev, MV_GLOBALREG(VTU_DATA1), s1); + sw16(dev, MV_GLOBALREG(VTU_DATA2), s2); + sw16(dev, MV_GLOBALREG(VTU_DATA3), 0); + + sw16(dev, MV_GLOBALREG(VTU_OP), + MV_VTUOP_INPROGRESS | MV_VTUOP_STULOAD); + mvsw61xx_wait_mask_s(dev, MV_GLOBALREG(VTU_OP), + MV_VTUOP_INPROGRESS, 0); - v1 = (u16)(state->vlans[i].port_mode & 0xffff); - v2 = (u16)((state->vlans[i].port_mode >> 16) & 0xffff); + /* Write VLAN information into VTU */ + v1 = (u16) (state->vlans[i].port_mode & 0xffff); + v2 = (u16) ((state->vlans[i].port_mode >> 16) & 0xffff); + sw16(dev, MV_GLOBALREG(VTU_VID), + MV_VTU_VID_VALID | state->vlans[i].vid); + sw16(dev, MV_GLOBALREG(VTU_SID), i); + sw16(dev, MV_GLOBALREG(VTU_FID), 0); sw16(dev, MV_GLOBALREG(VTU_DATA1), v1); sw16(dev, MV_GLOBALREG(VTU_DATA2), v2); + sw16(dev, MV_GLOBALREG(VTU_DATA3), 0); sw16(dev, MV_GLOBALREG(VTU_OP), MV_VTUOP_INPROGRESS | MV_VTUOP_LOAD); @@ -514,8 +537,6 @@ static int mvsw61xx_update_state(struct switch_dev *dev) if (!state->registered) return -EINVAL; - mvsw61xx_vtu_program(dev); - /* * Set 802.1q-only mode if vlan_enabled is true. * @@ -568,6 +589,8 @@ static int mvsw61xx_update_state(struct switch_dev *dev) sw16(dev, MV_PORTREG(CONTROL2, i), reg); } + mvsw61xx_vtu_program(dev); + return 0; } @@ -615,6 +638,7 @@ static int mvsw61xx_reset(struct switch_dev *dev) state->vlans[i].mask = 0; state->vlans[i].vid = 0; state->vlans[i].port_mode = 0; + state->vlans[i].port_sstate = 0; } state->vlan_enabled = 0; diff --git a/target/linux/generic/files/drivers/net/phy/mvsw61xx.h b/target/linux/generic/files/drivers/net/phy/mvsw61xx.h index 8bd6f9a..61e134c 100644 --- a/target/linux/generic/files/drivers/net/phy/mvsw61xx.h +++ b/target/linux/generic/files/drivers/net/phy/mvsw61xx.h @@ -249,6 +249,7 @@ struct mvsw61xx_state { u16 mask; u16 vid; u32 port_mode; + u32 port_sstate; } vlans[MV_VLANS]; char buf[128];