Commit d4004422 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller

net: mscc: ocelot: track the port pvid using a pointer

Now that we have a list of struct ocelot_bridge_vlan entries, we can
rewrite the pvid logic to simply point to one of those structures,
instead of having a separate structure with a "bool valid".
The NULL pointer will represent the lack of a bridge pvid (not to be
confused with the lack of a hardware pvid on the port, that is present
at all times).
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bfbab310
...@@ -260,18 +260,19 @@ static void ocelot_port_manage_port_tag(struct ocelot *ocelot, int port) ...@@ -260,18 +260,19 @@ static void ocelot_port_manage_port_tag(struct ocelot *ocelot, int port)
/* Default vlan to clasify for untagged frames (may be zero) */ /* Default vlan to clasify for untagged frames (may be zero) */
static void ocelot_port_set_pvid(struct ocelot *ocelot, int port, static void ocelot_port_set_pvid(struct ocelot *ocelot, int port,
struct ocelot_vlan pvid_vlan) const struct ocelot_bridge_vlan *pvid_vlan)
{ {
struct ocelot_port *ocelot_port = ocelot->ports[port]; struct ocelot_port *ocelot_port = ocelot->ports[port];
u16 pvid = OCELOT_VLAN_UNAWARE_PVID;
u32 val = 0; u32 val = 0;
ocelot_port->pvid_vlan = pvid_vlan; ocelot_port->pvid_vlan = pvid_vlan;
if (!ocelot_port->vlan_aware) if (ocelot_port->vlan_aware && pvid_vlan)
pvid_vlan.vid = OCELOT_VLAN_UNAWARE_PVID; pvid = pvid_vlan->vid;
ocelot_rmw_gix(ocelot, ocelot_rmw_gix(ocelot,
ANA_PORT_VLAN_CFG_VLAN_VID(pvid_vlan.vid), ANA_PORT_VLAN_CFG_VLAN_VID(pvid),
ANA_PORT_VLAN_CFG_VLAN_VID_M, ANA_PORT_VLAN_CFG_VLAN_VID_M,
ANA_PORT_VLAN_CFG, port); ANA_PORT_VLAN_CFG, port);
...@@ -280,7 +281,7 @@ static void ocelot_port_set_pvid(struct ocelot *ocelot, int port, ...@@ -280,7 +281,7 @@ static void ocelot_port_set_pvid(struct ocelot *ocelot, int port,
* classified to VLAN 0, but that is always in our RX filter, so it * classified to VLAN 0, but that is always in our RX filter, so it
* would get accepted were it not for this setting. * would get accepted were it not for this setting.
*/ */
if (!pvid_vlan.valid && ocelot_port->vlan_aware) if (!pvid_vlan && ocelot_port->vlan_aware)
val = ANA_PORT_DROP_CFG_DROP_PRIO_S_TAGGED_ENA | val = ANA_PORT_DROP_CFG_DROP_PRIO_S_TAGGED_ENA |
ANA_PORT_DROP_CFG_DROP_PRIO_C_TAGGED_ENA; ANA_PORT_DROP_CFG_DROP_PRIO_C_TAGGED_ENA;
...@@ -445,13 +446,9 @@ int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, ...@@ -445,13 +446,9 @@ int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid,
return err; return err;
/* Default ingress vlan classification */ /* Default ingress vlan classification */
if (pvid) { if (pvid)
struct ocelot_vlan pvid_vlan; ocelot_port_set_pvid(ocelot, port,
ocelot_bridge_vlan_find(ocelot, vid));
pvid_vlan.vid = vid;
pvid_vlan.valid = true;
ocelot_port_set_pvid(ocelot, port, pvid_vlan);
}
/* Untagged egress vlan clasification */ /* Untagged egress vlan clasification */
ocelot_port_manage_port_tag(ocelot, port); ocelot_port_manage_port_tag(ocelot, port);
...@@ -470,11 +467,8 @@ int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid) ...@@ -470,11 +467,8 @@ int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid)
return err; return err;
/* Ingress */ /* Ingress */
if (ocelot_port->pvid_vlan.vid == vid) { if (ocelot_port->pvid_vlan && ocelot_port->pvid_vlan->vid == vid)
struct ocelot_vlan pvid_vlan = {0}; ocelot_port_set_pvid(ocelot, port, NULL);
ocelot_port_set_pvid(ocelot, port, pvid_vlan);
}
/* Egress */ /* Egress */
ocelot_port_manage_port_tag(ocelot, port); ocelot_port_manage_port_tag(ocelot, port);
...@@ -1803,11 +1797,10 @@ void ocelot_port_bridge_leave(struct ocelot *ocelot, int port, ...@@ -1803,11 +1797,10 @@ void ocelot_port_bridge_leave(struct ocelot *ocelot, int port,
struct net_device *bridge) struct net_device *bridge)
{ {
struct ocelot_port *ocelot_port = ocelot->ports[port]; struct ocelot_port *ocelot_port = ocelot->ports[port];
struct ocelot_vlan pvid = {0};
ocelot_port->bridge = NULL; ocelot_port->bridge = NULL;
ocelot_port_set_pvid(ocelot, port, pvid); ocelot_port_set_pvid(ocelot, port, NULL);
ocelot_port_manage_port_tag(ocelot, port); ocelot_port_manage_port_tag(ocelot, port);
ocelot_apply_bridge_fwd_mask(ocelot); ocelot_apply_bridge_fwd_mask(ocelot);
} }
......
...@@ -563,11 +563,6 @@ struct ocelot_vcap_block { ...@@ -563,11 +563,6 @@ struct ocelot_vcap_block {
int pol_lpr; int pol_lpr;
}; };
struct ocelot_vlan {
bool valid;
u16 vid;
};
struct ocelot_bridge_vlan { struct ocelot_bridge_vlan {
u16 vid; u16 vid;
unsigned long portmask; unsigned long portmask;
...@@ -608,7 +603,7 @@ struct ocelot_port { ...@@ -608,7 +603,7 @@ struct ocelot_port {
bool vlan_aware; bool vlan_aware;
/* VLAN that untagged frames are classified to, on ingress */ /* VLAN that untagged frames are classified to, on ingress */
struct ocelot_vlan pvid_vlan; const struct ocelot_bridge_vlan *pvid_vlan;
unsigned int ptp_skbs_in_flight; unsigned int ptp_skbs_in_flight;
u8 ptp_cmd; u8 ptp_cmd;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment