summaryrefslogtreecommitdiffstats
path: root/include/soc
diff options
context:
space:
mode:
authorXiaoliang Yang <xiaoliang.yang_1@nxp.com>2022-06-17 11:24:23 +0800
committerDavid S. Miller <davem@davemloft.net>2022-06-19 09:53:59 +0100
commit8670dc33f48bab4d7bb4b8d0232f17f4dae419ec (patch)
treeee153e88e10b3e41b0ace1474dd4e427597f66f1 /include/soc
parentc205035e3adb4c50234c9263f7cf3bbff76b3c72 (diff)
downloadlinux-8670dc33f48bab4d7bb4b8d0232f17f4dae419ec.tar.gz
linux-8670dc33f48bab4d7bb4b8d0232f17f4dae419ec.tar.bz2
linux-8670dc33f48bab4d7bb4b8d0232f17f4dae419ec.zip
net: dsa: felix: update base time of time-aware shaper when adjusting PTP time
When adjusting the PTP clock, the base time of the TAS configuration will become unreliable. We need reset the TAS configuration by using a new base time. For example, if the driver gets a base time 0 of Qbv configuration from user, and current time is 20000. The driver will set the TAS base time to be 20000. After the PTP clock adjustment, the current time becomes 10000. If the TAS base time is still 20000, it will be a future time, and TAS entry list will stop running. Another example, if the current time becomes to be 10000000 after PTP clock adjust, a large time offset can cause the hardware to hang. This patch introduces a tas_clock_adjust() function to reset the TAS module by using a new base time after the PTP clock adjustment. This can avoid issues above. Due to PTP clock adjustment can occur at any time, it may conflict with the TAS configuration. We introduce a new TAS lock to serialize the access to the TAS registers. Signed-off-by: Xiaoliang Yang <xiaoliang.yang_1@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/soc')
-rw-r--r--include/soc/mscc/ocelot.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/include/soc/mscc/ocelot.h b/include/soc/mscc/ocelot.h
index 5f88385a7748..3737570116c3 100644
--- a/include/soc/mscc/ocelot.h
+++ b/include/soc/mscc/ocelot.h
@@ -575,6 +575,7 @@ struct ocelot_ops {
int (*psfp_stats_get)(struct ocelot *ocelot, struct flow_cls_offload *f,
struct flow_stats *stats);
void (*cut_through_fwd)(struct ocelot *ocelot);
+ void (*tas_clock_adjust)(struct ocelot *ocelot);
};
struct ocelot_vcap_policer {
@@ -691,6 +692,9 @@ struct ocelot_port {
int bridge_num;
int speed;
+
+ /* Store the AdminBaseTime of EST fetched from userspace. */
+ s64 base_time;
};
struct ocelot {
@@ -757,6 +761,9 @@ struct ocelot {
/* Lock for serializing forwarding domain changes */
struct mutex fwd_domain_lock;
+ /* Lock for serializing Time-Aware Shaper changes */
+ struct mutex tas_lock;
+
struct workqueue_struct *owq;
u8 ptp:1;