Message ID | 20210116023937.6225-2-rasmus.villemoes@prevas.dk (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: dsa: mv88e6xxx: fix vlan filtering for 6250 | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Guessed tree name to be net-next |
netdev/subject_prefix | warning | Target tree name not specified in the subject |
netdev/cc_maintainers | success | CCed 8 of 8 maintainers |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 10 lines checked |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
netdev/stable | success | Stable not CCed |
On 1/15/2021 6:39 PM, Rasmus Villemoes wrote: > mv88e6xxx_port_vlan_join checks whether the VTU already contains an > entry for the given vid (via mv88e6xxx_vtu_getnext), and if so, merely > changes the relevant .member[] element and loads the updated entry > into the VTU. > > However, at least for the mv88e6250, the on-stack struct > mv88e6xxx_vtu_entry vlan never has its .state[] array explicitly > initialized, neither in mv88e6xxx_port_vlan_join() nor inside the > getnext implementation. So the new entry has random garbage for the > STU bits, breaking VLAN filtering. > > When the VTU entry is initially created, those bits are all zero, and > we should make sure to keep them that way when the entry is updated. > > Fixes: 92307069a96c (net: dsa: mv88e6xxx: Avoid VTU corruption on 6097) > Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
On Sat, Jan 16, 2021 at 03:39, Rasmus Villemoes <rasmus.villemoes@prevas.dk> wrote: > mv88e6xxx_port_vlan_join checks whether the VTU already contains an > entry for the given vid (via mv88e6xxx_vtu_getnext), and if so, merely > changes the relevant .member[] element and loads the updated entry > into the VTU. > > However, at least for the mv88e6250, the on-stack struct > mv88e6xxx_vtu_entry vlan never has its .state[] array explicitly > initialized, neither in mv88e6xxx_port_vlan_join() nor inside the > getnext implementation. So the new entry has random garbage for the > STU bits, breaking VLAN filtering. > > When the VTU entry is initially created, those bits are all zero, and > we should make sure to keep them that way when the entry is updated. > > Fixes: 92307069a96c (net: dsa: mv88e6xxx: Avoid VTU corruption on 6097) > Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk> Reviewed-by: Tobias Waldekranz <tobias@waldekranz.com> Tested-by: Tobias Waldekranz <tobias@waldekranz.com>
diff --git a/drivers/net/dsa/mv88e6xxx/global1_vtu.c b/drivers/net/dsa/mv88e6xxx/global1_vtu.c index 66ddf67b8737..7b96396be609 100644 --- a/drivers/net/dsa/mv88e6xxx/global1_vtu.c +++ b/drivers/net/dsa/mv88e6xxx/global1_vtu.c @@ -351,6 +351,10 @@ int mv88e6250_g1_vtu_getnext(struct mv88e6xxx_chip *chip, if (err) return err; + err = mv88e6185_g1_stu_data_read(chip, entry); + if (err) + return err; + /* VTU DBNum[3:0] are located in VTU Operation 3:0 * VTU DBNum[5:4] are located in VTU Operation 9:8 */
mv88e6xxx_port_vlan_join checks whether the VTU already contains an entry for the given vid (via mv88e6xxx_vtu_getnext), and if so, merely changes the relevant .member[] element and loads the updated entry into the VTU. However, at least for the mv88e6250, the on-stack struct mv88e6xxx_vtu_entry vlan never has its .state[] array explicitly initialized, neither in mv88e6xxx_port_vlan_join() nor inside the getnext implementation. So the new entry has random garbage for the STU bits, breaking VLAN filtering. When the VTU entry is initially created, those bits are all zero, and we should make sure to keep them that way when the entry is updated. Fixes: 92307069a96c (net: dsa: mv88e6xxx: Avoid VTU corruption on 6097) Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk> --- drivers/net/dsa/mv88e6xxx/global1_vtu.c | 4 ++++ 1 file changed, 4 insertions(+)