net: dsa: add dsa_to_port helper
The dsa_port structure is part of DSA core data and must only be updated by the later. It is OK and sometimes necessary for the DSA drivers to access this data, but this has to be read only. For that purpose, add a dsa_to_port() helper which returns a const pointer to a dsa_port structure which must be used by DSA drivers from now on instead of digging into ds->ports[] themselves. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f8b8b1cd5a
commit
c8652c83bc
|
@ -1354,7 +1354,7 @@ int b53_br_join(struct dsa_switch *ds, int port, struct net_device *br)
|
||||||
b53_read16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(port), &pvlan);
|
b53_read16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(port), &pvlan);
|
||||||
|
|
||||||
b53_for_each_port(dev, i) {
|
b53_for_each_port(dev, i) {
|
||||||
if (ds->ports[i].bridge_dev != br)
|
if (dsa_to_port(ds, i)->bridge_dev != br)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Add this local port to the remote port VLAN control
|
/* Add this local port to the remote port VLAN control
|
||||||
|
@ -1390,7 +1390,7 @@ void b53_br_leave(struct dsa_switch *ds, int port, struct net_device *br)
|
||||||
|
|
||||||
b53_for_each_port(dev, i) {
|
b53_for_each_port(dev, i) {
|
||||||
/* Don't touch the remaining ports */
|
/* Don't touch the remaining ports */
|
||||||
if (ds->ports[i].bridge_dev != br)
|
if (dsa_to_port(ds, i)->bridge_dev != br)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
b53_read16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(i), ®);
|
b53_read16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(i), ®);
|
||||||
|
|
|
@ -863,7 +863,7 @@ static int lan9303_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct lan9303 *chip = ds->priv;
|
struct lan9303 *chip = ds->priv;
|
||||||
|
|
||||||
dev_dbg(chip->dev, "%s(port %d)\n", __func__, port);
|
dev_dbg(chip->dev, "%s(port %d)\n", __func__, port);
|
||||||
if (ds->ports[1].bridge_dev == ds->ports[2].bridge_dev) {
|
if (dsa_to_port(ds, 1)->bridge_dev == dsa_to_port(ds, 2)->bridge_dev) {
|
||||||
lan9303_bridge_ports(chip);
|
lan9303_bridge_ports(chip);
|
||||||
chip->is_bridged = true; /* unleash stp_state_set() */
|
chip->is_bridged = true; /* unleash stp_state_set() */
|
||||||
}
|
}
|
||||||
|
|
|
@ -782,7 +782,7 @@ mt7530_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
* and not being setup until the port becomes enabled.
|
* and not being setup until the port becomes enabled.
|
||||||
*/
|
*/
|
||||||
if (ds->enabled_port_mask & BIT(i) && i != port) {
|
if (ds->enabled_port_mask & BIT(i) && i != port) {
|
||||||
if (ds->ports[i].bridge_dev != bridge)
|
if (dsa_to_port(ds, i)->bridge_dev != bridge)
|
||||||
continue;
|
continue;
|
||||||
if (priv->ports[i].enable)
|
if (priv->ports[i].enable)
|
||||||
mt7530_set(priv, MT7530_PCR_P(i),
|
mt7530_set(priv, MT7530_PCR_P(i),
|
||||||
|
@ -819,7 +819,7 @@ mt7530_port_bridge_leave(struct dsa_switch *ds, int port,
|
||||||
* is kept and not being setup until the port becomes enabled.
|
* is kept and not being setup until the port becomes enabled.
|
||||||
*/
|
*/
|
||||||
if (ds->enabled_port_mask & BIT(i) && i != port) {
|
if (ds->enabled_port_mask & BIT(i) && i != port) {
|
||||||
if (ds->ports[i].bridge_dev != bridge)
|
if (dsa_to_port(ds, i)->bridge_dev != bridge)
|
||||||
continue;
|
continue;
|
||||||
if (priv->ports[i].enable)
|
if (priv->ports[i].enable)
|
||||||
mt7530_clear(priv, MT7530_PCR_P(i),
|
mt7530_clear(priv, MT7530_PCR_P(i),
|
||||||
|
|
|
@ -177,7 +177,7 @@ static int mv88e6060_setup_port(struct dsa_switch *ds, int p)
|
||||||
((p & 0xf) << PORT_VLAN_MAP_DBNUM_SHIFT) |
|
((p & 0xf) << PORT_VLAN_MAP_DBNUM_SHIFT) |
|
||||||
(dsa_is_cpu_port(ds, p) ?
|
(dsa_is_cpu_port(ds, p) ?
|
||||||
ds->enabled_port_mask :
|
ds->enabled_port_mask :
|
||||||
BIT(ds->ports[p].cpu_dp->index)));
|
BIT(dsa_to_port(ds, p)->cpu_dp->index)));
|
||||||
|
|
||||||
/* Port Association Vector: when learning source addresses
|
/* Port Association Vector: when learning source addresses
|
||||||
* of packets, add the address to the address database using
|
* of packets, add the address to the address database using
|
||||||
|
|
|
@ -851,7 +851,7 @@ static u16 mv88e6xxx_port_vlan(struct mv88e6xxx_chip *chip, int dev, int port)
|
||||||
for (i = 0; i < mv88e6xxx_num_ports(chip); ++i)
|
for (i = 0; i < mv88e6xxx_num_ports(chip); ++i)
|
||||||
if (dsa_is_cpu_port(chip->ds, i) ||
|
if (dsa_is_cpu_port(chip->ds, i) ||
|
||||||
dsa_is_dsa_port(chip->ds, i) ||
|
dsa_is_dsa_port(chip->ds, i) ||
|
||||||
(br && chip->ds->ports[i].bridge_dev == br))
|
(br && dsa_to_port(chip->ds, i)->bridge_dev == br))
|
||||||
pvlan |= BIT(i);
|
pvlan |= BIT(i);
|
||||||
|
|
||||||
return pvlan;
|
return pvlan;
|
||||||
|
@ -1144,16 +1144,16 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
|
||||||
MV88E6XXX_G1_VTU_DATA_MEMBER_TAG_NON_MEMBER)
|
MV88E6XXX_G1_VTU_DATA_MEMBER_TAG_NON_MEMBER)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (ds->ports[i].bridge_dev ==
|
if (dsa_to_port(ds, i)->bridge_dev ==
|
||||||
ds->ports[port].bridge_dev)
|
ds->ports[port].bridge_dev)
|
||||||
break; /* same bridge, check next VLAN */
|
break; /* same bridge, check next VLAN */
|
||||||
|
|
||||||
if (!ds->ports[i].bridge_dev)
|
if (!dsa_to_port(ds, i)->bridge_dev)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dev_err(ds->dev, "p%d: hw VLAN %d already used by %s\n",
|
dev_err(ds->dev, "p%d: hw VLAN %d already used by %s\n",
|
||||||
port, vlan.vid,
|
port, vlan.vid,
|
||||||
netdev_name(ds->ports[i].bridge_dev));
|
netdev_name(dsa_to_port(ds, i)->bridge_dev));
|
||||||
err = -EOPNOTSUPP;
|
err = -EOPNOTSUPP;
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
|
@ -700,7 +700,7 @@ qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 1; i < QCA8K_NUM_PORTS; i++) {
|
for (i = 1; i < QCA8K_NUM_PORTS; i++) {
|
||||||
if (ds->ports[i].bridge_dev != br)
|
if (dsa_to_port(ds, i)->bridge_dev != br)
|
||||||
continue;
|
continue;
|
||||||
/* Add this port to the portvlan mask of the other ports
|
/* Add this port to the portvlan mask of the other ports
|
||||||
* in the bridge
|
* in the bridge
|
||||||
|
@ -725,7 +725,7 @@ qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 1; i < QCA8K_NUM_PORTS; i++) {
|
for (i = 1; i < QCA8K_NUM_PORTS; i++) {
|
||||||
if (ds->ports[i].bridge_dev != br)
|
if (dsa_to_port(ds, i)->bridge_dev != br)
|
||||||
continue;
|
continue;
|
||||||
/* Remove this port to the portvlan mask of the other ports
|
/* Remove this port to the portvlan mask of the other ports
|
||||||
* in the bridge
|
* in the bridge
|
||||||
|
|
|
@ -269,6 +269,11 @@ static inline bool dsa_is_normal_port(struct dsa_switch *ds, int p)
|
||||||
return !dsa_is_cpu_port(ds, p) && !dsa_is_dsa_port(ds, p);
|
return !dsa_is_cpu_port(ds, p) && !dsa_is_dsa_port(ds, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
|
||||||
|
{
|
||||||
|
return &ds->ports[p];
|
||||||
|
}
|
||||||
|
|
||||||
static inline u8 dsa_upstream_port(struct dsa_switch *ds)
|
static inline u8 dsa_upstream_port(struct dsa_switch *ds)
|
||||||
{
|
{
|
||||||
struct dsa_switch_tree *dst = ds->dst;
|
struct dsa_switch_tree *dst = ds->dst;
|
||||||
|
|
Loading…
Reference in New Issue