aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorVladimir Oltean <vladimir.oltean@nxp.com>2020-06-24 16:54:46 +0300
committerDavid S. Miller <davem@davemloft.net>2020-06-25 16:06:56 -0700
commit82f6896a25ee2471fdf039eb7b286a692d78f504 (patch)
tree349167f30fbeb538d38ca2f9161aba0956b93eff /drivers/net
parentnet: dsa: sja1105: unconditionally free old gating config (diff)
downloadlinux-dev-82f6896a25ee2471fdf039eb7b286a692d78f504.tar.xz
linux-dev-82f6896a25ee2471fdf039eb7b286a692d78f504.zip
net: dsa: sja1105: recalculate gating subschedule after deleting tc-gate rules
Currently, tas_data->enabled would remain true even after deleting all tc-gate rules from the switch ports, which would cause the sja1105_tas_state_machine to get unnecessarily scheduled. Also, if there were any errors which would prevent the hardware from enabling the gating schedule, the sja1105_tas_state_machine would continuously detect and print that, spamming the kernel log, even if the rules were subsequently deleted. The rules themselves are _not_ active, because sja1105_init_scheduling does enough of a job to not install the gating schedule in the static config. But the virtual link rules themselves are still present. So call the functions that remove the tc-gate configuration from priv->tas_data.gating_cfg, so that tas_data->enabled can be set to false, and sja1105_tas_state_machine will stop from being scheduled. Fixes: 834f8933d5dd ("net: dsa: sja1105: implement tc-gate using time-triggered virtual links") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/dsa/sja1105/sja1105_vl.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/dsa/sja1105/sja1105_vl.c b/drivers/net/dsa/sja1105/sja1105_vl.c
index 5ff370f507e6..6b1fdc1b46e7 100644
--- a/drivers/net/dsa/sja1105/sja1105_vl.c
+++ b/drivers/net/dsa/sja1105/sja1105_vl.c
@@ -550,10 +550,18 @@ int sja1105_vl_delete(struct sja1105_private *priv, int port,
kfree(rule);
}
+ rc = sja1105_compose_gating_subschedule(priv, extack);
+ if (rc)
+ return rc;
+
rc = sja1105_init_virtual_links(priv, extack);
if (rc)
return rc;
+ rc = sja1105_init_scheduling(priv);
+ if (rc < 0)
+ return rc;
+
return sja1105_static_config_reload(priv, SJA1105_VIRTUAL_LINKS);
}