|
@@ -71,8 +71,26 @@ static inline bool dsa_port_is_bridged(struct dsa_slave_priv *p)
|
|
|
|
|
|
static void dsa_port_set_stp_state(struct dsa_switch *ds, int port, u8 state)
|
|
|
{
|
|
|
+ struct dsa_port *dp = &ds->ports[port];
|
|
|
+
|
|
|
if (ds->ops->port_stp_state_set)
|
|
|
ds->ops->port_stp_state_set(ds, port, state);
|
|
|
+
|
|
|
+ if (ds->ops->port_fast_age) {
|
|
|
+ /* Fast age FDB entries or flush appropriate forwarding database
|
|
|
+ * for the given port, if we are moving it from Learning or
|
|
|
+ * Forwarding state, to Disabled or Blocking or Listening state.
|
|
|
+ */
|
|
|
+
|
|
|
+ if ((dp->stp_state == BR_STATE_LEARNING ||
|
|
|
+ dp->stp_state == BR_STATE_FORWARDING) &&
|
|
|
+ (state == BR_STATE_DISABLED ||
|
|
|
+ state == BR_STATE_BLOCKING ||
|
|
|
+ state == BR_STATE_LISTENING))
|
|
|
+ ds->ops->port_fast_age(ds, port);
|
|
|
+ }
|
|
|
+
|
|
|
+ dp->stp_state = state;
|
|
|
}
|
|
|
|
|
|
static int dsa_slave_open(struct net_device *dev)
|