net: dsa: mv88e6xxx: read then write PVID
The port register 0x07 contains more options than just the default VID, even though they are not used yet. So prefer a read then write operation over a direct write. This also allows to keep track of the change through dynamic debug. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Tested-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2d9deae4ae
commit
5da9603183
|
@ -1166,23 +1166,45 @@ int mv88e6xxx_port_stp_update(struct dsa_switch *ds, int port, u8 state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _mv88e6xxx_port_pvid_get(struct dsa_switch *ds, int port, u16 *pvid)
|
static int _mv88e6xxx_port_pvid(struct dsa_switch *ds, int port, u16 *new,
|
||||||
|
u16 *old)
|
||||||
{
|
{
|
||||||
|
u16 pvid;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = _mv88e6xxx_reg_read(ds, REG_PORT(port), PORT_DEFAULT_VLAN);
|
ret = _mv88e6xxx_reg_read(ds, REG_PORT(port), PORT_DEFAULT_VLAN);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
*pvid = ret & PORT_DEFAULT_VLAN_MASK;
|
pvid = ret & PORT_DEFAULT_VLAN_MASK;
|
||||||
|
|
||||||
|
if (new) {
|
||||||
|
ret &= ~PORT_DEFAULT_VLAN_MASK;
|
||||||
|
ret |= *new & PORT_DEFAULT_VLAN_MASK;
|
||||||
|
|
||||||
|
ret = _mv88e6xxx_reg_write(ds, REG_PORT(port),
|
||||||
|
PORT_DEFAULT_VLAN, ret);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
netdev_dbg(ds->ports[port], "DefaultVID %d (was %d)\n", *new,
|
||||||
|
pvid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (old)
|
||||||
|
*old = pvid;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _mv88e6xxx_port_pvid_get(struct dsa_switch *ds, int port, u16 *pvid)
|
||||||
|
{
|
||||||
|
return _mv88e6xxx_port_pvid(ds, port, NULL, pvid);
|
||||||
|
}
|
||||||
|
|
||||||
static int _mv88e6xxx_port_pvid_set(struct dsa_switch *ds, int port, u16 pvid)
|
static int _mv88e6xxx_port_pvid_set(struct dsa_switch *ds, int port, u16 pvid)
|
||||||
{
|
{
|
||||||
return _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_DEFAULT_VLAN,
|
return _mv88e6xxx_port_pvid(ds, port, &pvid, NULL);
|
||||||
pvid & PORT_DEFAULT_VLAN_MASK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _mv88e6xxx_vtu_wait(struct dsa_switch *ds)
|
static int _mv88e6xxx_vtu_wait(struct dsa_switch *ds)
|
||||||
|
|
Loading…
Reference in a new issue