Message ID | 8e1cd9b167bd39c0f82ca8970a355cdfbc0fe885.1610540603.git.gilles.doffe@savoirfairelinux.com |
---|---|
State | New |
Headers | show |
Series | Fixes on Microchip KSZ8795 DSA switch driver | expand |
On 1/13/21 4:45 AM, Gilles DOFFE wrote: > Move tag/untag action at the end of the function to avoid > tagging or untagging traffic if only vlan 0 is handled. > > Signed-off-by: Gilles DOFFE <gilles.doffe@savoirfairelinux.com> > --- > drivers/net/dsa/microchip/ksz8795.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/dsa/microchip/ksz8795.c b/drivers/net/dsa/microchip/ksz8795.c > index 6962ba4ee125..4b060503b2e8 100644 > --- a/drivers/net/dsa/microchip/ksz8795.c > +++ b/drivers/net/dsa/microchip/ksz8795.c > @@ -840,8 +840,6 @@ static void ksz8795_port_vlan_add(struct dsa_switch *ds, int port, > u8 fid, member, valid; > int ret; > > - ksz_port_cfg(dev, port, P_TAG_CTRL, PORT_REMOVE_TAG, untagged); > - > for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) { > if (vid == 0) > continue; > @@ -874,6 +872,8 @@ static void ksz8795_port_vlan_add(struct dsa_switch *ds, int port, > vid |= new_pvid; > ksz_pwrite16(dev, port, REG_PORT_CTRL_VID, vid); > } > + > + ksz_port_cfg(dev, port, P_TAG_CTRL, PORT_REMOVE_TAG, untagged); You should be giving an example how this fails, because it is not immediately obvious why this fixes a problem and how it does fix it, especially for VID == 0 given that the loop would be skipped over. -- Florian
On Wed, Jan 13, 2021 at 01:45:18PM +0100, Gilles DOFFE wrote: > Move tag/untag action at the end of the function to avoid > tagging or untagging traffic if only vlan 0 is handled. > > Signed-off-by: Gilles DOFFE <gilles.doffe@savoirfairelinux.com> > --- No matter how much you move the assignment around, there's no escaping the truth that the Tag Removal bit in the Port Registers affects all VLANs that egress a port, whereas the BRIDGE_VLAN_INFO_UNTAGGED flag controls egress VLAN stripping per VLAN. Sorry, if you work with broken hardware, you might as well treat it accordingly too. And as to why the moving around would make any difference in the first place, you need to do a better job explaining that. There is nothing that prevents PORT_REMOVE_TAG from being written to the port, regardless of the order of operations. Unless the order matters?
diff --git a/drivers/net/dsa/microchip/ksz8795.c b/drivers/net/dsa/microchip/ksz8795.c index 6962ba4ee125..4b060503b2e8 100644 --- a/drivers/net/dsa/microchip/ksz8795.c +++ b/drivers/net/dsa/microchip/ksz8795.c @@ -840,8 +840,6 @@ static void ksz8795_port_vlan_add(struct dsa_switch *ds, int port, u8 fid, member, valid; int ret; - ksz_port_cfg(dev, port, P_TAG_CTRL, PORT_REMOVE_TAG, untagged); - for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) { if (vid == 0) continue; @@ -874,6 +872,8 @@ static void ksz8795_port_vlan_add(struct dsa_switch *ds, int port, vid |= new_pvid; ksz_pwrite16(dev, port, REG_PORT_CTRL_VID, vid); } + + ksz_port_cfg(dev, port, P_TAG_CTRL, PORT_REMOVE_TAG, untagged); } static int ksz8795_port_vlan_del(struct dsa_switch *ds, int port,
Move tag/untag action at the end of the function to avoid tagging or untagging traffic if only vlan 0 is handled. Signed-off-by: Gilles DOFFE <gilles.doffe@savoirfairelinux.com> --- drivers/net/dsa/microchip/ksz8795.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)