Author: luka Date: 2015-01-11 18:20:16 +0100 (Sun, 11 Jan 2015) New Revision: 43938
Modified: trunk/target/linux/generic/files/drivers/net/phy/mvsw61xx.c trunk/target/linux/generic/files/drivers/net/phy/mvsw61xx.h Log: mvsw61xx: track and set per-VLAN port state in STU 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 <[email protected]> Modified: trunk/target/linux/generic/files/drivers/net/phy/mvsw61xx.c =================================================================== --- trunk/target/linux/generic/files/drivers/net/phy/mvsw61xx.c 2015-01-11 17:20:06 UTC (rev 43937) +++ trunk/target/linux/generic/files/drivers/net/phy/mvsw61xx.c 2015-01-11 17:20:16 UTC (rev 43938) @@ -2,6 +2,7 @@ * Marvell 88E61xx switch driver * * Copyright (c) 2014 Claudio Leite <[email protected]> + * Copyright (c) 2014 Nikita Nazarenko <[email protected]> * * Based on code (c) 2008 Felix Fietkau <[email protected]> * @@ -27,6 +28,7 @@ MODULE_DESCRIPTION("Marvell 88E61xx Switch driver"); MODULE_AUTHOR("Claudio Leite <[email protected]>"); +MODULE_AUTHOR("Nikita Nazarenko <[email protected]>"); MODULE_LICENSE("GPL v2"); MODULE_ALIAS("platform:mvsw61xx"); @@ -333,6 +335,7 @@ 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 @@ 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_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 @@ mvsw61xx_wait_mask_s(dev, MV_GLOBALREG(VTU_OP), MV_VTUOP_INPROGRESS, 0); + /* 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); + + /* 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); - - v1 = (u16)(state->vlans[i].port_mode & 0xffff); - v2 = (u16)((state->vlans[i].port_mode >> 16) & 0xffff); - + 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 @@ if (!state->registered) return -EINVAL; - mvsw61xx_vtu_program(dev); - /* * Set 802.1q-only mode if vlan_enabled is true. * @@ -568,6 +589,8 @@ sw16(dev, MV_PORTREG(CONTROL2, i), reg); } + mvsw61xx_vtu_program(dev); + return 0; } @@ -615,6 +638,7 @@ 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; Modified: trunk/target/linux/generic/files/drivers/net/phy/mvsw61xx.h =================================================================== --- trunk/target/linux/generic/files/drivers/net/phy/mvsw61xx.h 2015-01-11 17:20:06 UTC (rev 43937) +++ trunk/target/linux/generic/files/drivers/net/phy/mvsw61xx.h 2015-01-11 17:20:16 UTC (rev 43938) @@ -249,6 +249,7 @@ u16 mask; u16 vid; u32 port_mode; + u32 port_sstate; } vlans[MV_VLANS]; char buf[128]; _______________________________________________ openwrt-commits mailing list [email protected] https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits
