|
@@ -418,7 +418,7 @@ static int bcm_sf2_sw_fast_age_port(struct dsa_switch *ds, int port)
|
|
|
core_writel(priv, port, CORE_FAST_AGE_PORT);
|
|
|
|
|
|
reg = core_readl(priv, CORE_FAST_AGE_CTRL);
|
|
|
- reg |= EN_AGE_PORT | FAST_AGE_STR_DONE;
|
|
|
+ reg |= EN_AGE_PORT | EN_AGE_DYNAMIC | FAST_AGE_STR_DONE;
|
|
|
core_writel(priv, reg, CORE_FAST_AGE_CTRL);
|
|
|
|
|
|
do {
|
|
@@ -432,6 +432,8 @@ static int bcm_sf2_sw_fast_age_port(struct dsa_switch *ds, int port)
|
|
|
if (!timeout)
|
|
|
return -ETIMEDOUT;
|
|
|
|
|
|
+ core_writel(priv, 0, CORE_FAST_AGE_CTRL);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -507,7 +509,7 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
|
|
|
u32 reg;
|
|
|
|
|
|
reg = core_readl(priv, CORE_G_PCTL_PORT(port));
|
|
|
- cur_hw_state = reg >> G_MISTP_STATE_SHIFT;
|
|
|
+ cur_hw_state = reg & (G_MISTP_STATE_MASK << G_MISTP_STATE_SHIFT);
|
|
|
|
|
|
switch (state) {
|
|
|
case BR_STATE_DISABLED:
|
|
@@ -531,10 +533,12 @@ static int bcm_sf2_sw_br_set_stp_state(struct dsa_switch *ds, int port,
|
|
|
}
|
|
|
|
|
|
/* Fast-age ARL entries if we are moving a port from Learning or
|
|
|
- * Forwarding state to Disabled, Blocking or Listening state
|
|
|
+ * Forwarding (cur_hw_state) state to Disabled, Blocking or Listening
|
|
|
+ * state (hw_state)
|
|
|
*/
|
|
|
if (cur_hw_state != hw_state) {
|
|
|
- if (cur_hw_state & 4 && !(hw_state & 4)) {
|
|
|
+ if (cur_hw_state >= G_MISTP_LEARN_STATE &&
|
|
|
+ hw_state <= G_MISTP_LISTEN_STATE) {
|
|
|
ret = bcm_sf2_sw_fast_age_port(ds, port);
|
|
|
if (ret) {
|
|
|
pr_err("%s: fast-ageing failed\n", __func__);
|