Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef6fcea3 authored by Vivien Didelot's avatar Vivien Didelot Committed by David S. Miller
Browse files

net: dsa: mv88e6xxx: get STU entry on VTU GetNext



Now that the code reads both VTU and STU data on VTU GetNext operation,
fetch the STU entry data of a VTU entry at the same time.

The STU data bits are masked with the VTU data bits and they are now all
read at the same time a VTU GetNext operation is issued.

Signed-off-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 66a8e1f9
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -1292,7 +1292,7 @@ static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
		}
		}


		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
		if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
			err = mv88e6xxx_g1_vtu_sid_read(chip, &next);
			err = mv88e6xxx_g1_vtu_stu_get(chip, &next);
			if (err)
			if (err)
				return err;
				return err;
		}
		}
+2 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,8 @@ int mv88e6xxx_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
			     struct mv88e6xxx_vtu_entry *entry);
			     struct mv88e6xxx_vtu_entry *entry);
int mv88e6xxx_g1_vtu_stu_getnext(struct mv88e6xxx_chip *chip,
int mv88e6xxx_g1_vtu_stu_getnext(struct mv88e6xxx_chip *chip,
				 struct mv88e6xxx_vtu_entry *vtu);
				 struct mv88e6xxx_vtu_entry *vtu);
int mv88e6xxx_g1_vtu_stu_get(struct mv88e6xxx_chip *chip,
			     struct mv88e6xxx_vtu_entry *vtu);
int mv88e6xxx_g1_vtu_flush(struct mv88e6xxx_chip *chip);
int mv88e6xxx_g1_vtu_flush(struct mv88e6xxx_chip *chip);


#endif /* _MV88E6XXX_GLOBAL1_H */
#endif /* _MV88E6XXX_GLOBAL1_H */
+22 −0
Original line number Original line Diff line number Diff line
@@ -194,6 +194,28 @@ int mv88e6xxx_g1_vtu_stu_getnext(struct mv88e6xxx_chip *chip,
	return mv88e6xxx_g1_vtu_vid_read(chip, entry);
	return mv88e6xxx_g1_vtu_vid_read(chip, entry);
}
}


int mv88e6xxx_g1_vtu_stu_get(struct mv88e6xxx_chip *chip,
			     struct mv88e6xxx_vtu_entry *vtu)
{
	struct mv88e6xxx_vtu_entry stu;
	int err;

	err = mv88e6xxx_g1_vtu_sid_read(chip, vtu);
	if (err)
		return err;

	stu.sid = vtu->sid - 1;

	err = mv88e6xxx_g1_vtu_stu_getnext(chip, &stu);
	if (err)
		return err;

	if (stu.sid != vtu->sid || !stu.valid)
		return -EINVAL;

	return 0;
}

int mv88e6xxx_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
int mv88e6xxx_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
			     struct mv88e6xxx_vtu_entry *entry)
			     struct mv88e6xxx_vtu_entry *entry)
{
{