123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /* Copyright (c) 2019, Vladimir Oltean <[email protected]>
- */
- #ifndef _SJA1105_TAS_H
- #define _SJA1105_TAS_H
- #include <net/pkt_sched.h>
- #define SJA1105_TAS_MAX_DELTA BIT(18)
- struct sja1105_private;
- #if IS_ENABLED(CONFIG_NET_DSA_SJA1105_TAS)
- enum sja1105_tas_state {
- SJA1105_TAS_STATE_DISABLED,
- SJA1105_TAS_STATE_ENABLED_NOT_RUNNING,
- SJA1105_TAS_STATE_RUNNING,
- };
- enum sja1105_ptp_op {
- SJA1105_PTP_NONE,
- SJA1105_PTP_CLOCKSTEP,
- SJA1105_PTP_ADJUSTFREQ,
- };
- struct sja1105_gate_entry {
- struct list_head list;
- struct sja1105_rule *rule;
- s64 interval;
- u8 gate_state;
- };
- struct sja1105_gating_config {
- u64 cycle_time;
- s64 base_time;
- int num_entries;
- struct list_head entries;
- };
- struct sja1105_tas_data {
- struct tc_taprio_qopt_offload *offload[SJA1105_MAX_NUM_PORTS];
- struct sja1105_gating_config gating_cfg;
- enum sja1105_tas_state state;
- enum sja1105_ptp_op last_op;
- struct work_struct tas_work;
- s64 earliest_base_time;
- s64 oper_base_time;
- u64 max_cycle_time;
- bool enabled;
- };
- int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
- struct tc_taprio_qopt_offload *admin);
- void sja1105_tas_setup(struct dsa_switch *ds);
- void sja1105_tas_teardown(struct dsa_switch *ds);
- void sja1105_tas_clockstep(struct dsa_switch *ds);
- void sja1105_tas_adjfreq(struct dsa_switch *ds);
- bool sja1105_gating_check_conflicts(struct sja1105_private *priv, int port,
- struct netlink_ext_ack *extack);
- int sja1105_init_scheduling(struct sja1105_private *priv);
- #else
- /* C doesn't allow empty structures, bah! */
- struct sja1105_tas_data {
- u8 dummy;
- };
- static inline int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
- struct tc_taprio_qopt_offload *admin)
- {
- return -EOPNOTSUPP;
- }
- static inline void sja1105_tas_setup(struct dsa_switch *ds) { }
- static inline void sja1105_tas_teardown(struct dsa_switch *ds) { }
- static inline void sja1105_tas_clockstep(struct dsa_switch *ds) { }
- static inline void sja1105_tas_adjfreq(struct dsa_switch *ds) { }
- static inline bool
- sja1105_gating_check_conflicts(struct dsa_switch *ds, int port,
- struct netlink_ext_ack *extack)
- {
- return true;
- }
- static inline int sja1105_init_scheduling(struct sja1105_private *priv)
- {
- return 0;
- }
- #endif /* IS_ENABLED(CONFIG_NET_DSA_SJA1105_TAS) */
- #endif /* _SJA1105_TAS_H */
|