mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-16 05:26:51 +07:00
net: dsa: mv88e6xxx: load STU entry with VTU entry
Now that the code writes both VTU and STU data when loading a VTU entry, load the corresponding STU entry at the same time. This allows us to get rid of the STU management in the _mv88e6xxx_vtu_new helper and thus remove the separate implementations of STU Load/Purge and STU GetNext, as well as the unused family checks. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ef6fcea37f
commit
021e64ff76
@ -677,31 +677,6 @@ static int mv88e6xxx_phy_ppu_write(struct mv88e6xxx_chip *chip,
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
return chip->info->family == MV88E6XXX_FAMILY_6097;
|
||||
}
|
||||
|
||||
static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
return chip->info->family == MV88E6XXX_FAMILY_6165;
|
||||
}
|
||||
|
||||
static bool mv88e6xxx_6341_family(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
return chip->info->family == MV88E6XXX_FAMILY_6341;
|
||||
}
|
||||
|
||||
static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
return chip->info->family == MV88E6XXX_FAMILY_6351;
|
||||
}
|
||||
|
||||
static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
return chip->info->family == MV88E6XXX_FAMILY_6352;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port,
|
||||
int link, int speed, int duplex,
|
||||
phy_interface_t mode)
|
||||
@ -1393,6 +1368,10 @@ static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
|
||||
err = mv88e6xxx_g1_vtu_sid_write(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6xxx_g1_vtu_op(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G1_VTU_FID)) {
|
||||
@ -1410,60 +1389,6 @@ static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
|
||||
return mv88e6xxx_g1_vtu_op(chip, op);
|
||||
}
|
||||
|
||||
static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
|
||||
struct mv88e6xxx_vtu_entry *entry)
|
||||
{
|
||||
struct mv88e6xxx_vtu_entry next = {
|
||||
.sid = sid,
|
||||
};
|
||||
int err;
|
||||
|
||||
err = mv88e6xxx_g1_vtu_op_wait(chip);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6xxx_g1_vtu_stu_getnext(chip, &next);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (next.valid) {
|
||||
err = mv88e6185_g1_vtu_data_read(chip, &next);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
*entry = next;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
|
||||
struct mv88e6xxx_vtu_entry *entry)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = mv88e6xxx_g1_vtu_op_wait(chip);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!entry->valid)
|
||||
goto loadpurge;
|
||||
|
||||
/* Write port states */
|
||||
err = mv88e6185_g1_vtu_data_write(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
loadpurge:
|
||||
err = mv88e6xxx_g1_vtu_vid_write(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6xxx_g1_vtu_sid_write(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return mv88e6xxx_g1_vtu_op(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
|
||||
}
|
||||
|
||||
static int mv88e6xxx_atu_new(struct mv88e6xxx_chip *chip, u16 *fid)
|
||||
{
|
||||
DECLARE_BITMAP(fid_bitmap, MV88E6XXX_N_FID);
|
||||
@ -1527,31 +1452,6 @@ static int _mv88e6xxx_vtu_new(struct mv88e6xxx_chip *chip, u16 vid,
|
||||
? GLOBAL_VTU_DATA_MEMBER_TAG_UNMODIFIED
|
||||
: GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;
|
||||
|
||||
if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
|
||||
mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip) ||
|
||||
mv88e6xxx_6341_family(chip)) {
|
||||
struct mv88e6xxx_vtu_entry vstp;
|
||||
|
||||
/* Adding a VTU entry requires a valid STU entry. As VSTP is not
|
||||
* implemented, only one STU entry is needed to cover all VTU
|
||||
* entries. Thus, validate the SID 0.
|
||||
*/
|
||||
vlan.sid = 0;
|
||||
err = _mv88e6xxx_stu_getnext(chip, GLOBAL_VTU_SID_MASK, &vstp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (vstp.sid != vlan.sid || !vstp.valid) {
|
||||
memset(&vstp, 0, sizeof(vstp));
|
||||
vstp.valid = true;
|
||||
vstp.sid = vlan.sid;
|
||||
|
||||
err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
*entry = vlan;
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user