Reduce the size of the sja1105_private structure when CONFIG_NET_DSA_SJA1105_PTP is not enabled. Also make the PTP code a little bit more self-contained.
Signed-off-by: Vladimir Oltean <olte...@gmail.com> --- Changes since RFC: - None. drivers/net/dsa/sja1105/sja1105.h | 20 +------ drivers/net/dsa/sja1105/sja1105_main.c | 12 ++-- drivers/net/dsa/sja1105/sja1105_ptp.c | 81 +++++++++++++++----------- drivers/net/dsa/sja1105/sja1105_ptp.h | 29 +++++++++ 4 files changed, 84 insertions(+), 58 deletions(-) diff --git a/drivers/net/dsa/sja1105/sja1105.h b/drivers/net/dsa/sja1105/sja1105.h index c80be59dafbd..3ca0b87aa3e4 100644 --- a/drivers/net/dsa/sja1105/sja1105.h +++ b/drivers/net/dsa/sja1105/sja1105.h @@ -20,6 +20,8 @@ */ #define SJA1105_AGEING_TIME_MS(ms) ((ms) / 10) +#include "sja1105_ptp.h" + /* Keeps the different addresses between E/T and P/Q/R/S */ struct sja1105_regs { u64 device_id; @@ -49,17 +51,6 @@ struct sja1105_regs { u64 qlevel[SJA1105_NUM_PORTS]; }; -enum sja1105_ptp_clk_mode { - PTP_ADD_MODE = 1, - PTP_SET_MODE = 0, -}; - -struct sja1105_ptp_cmd { - u64 resptp; /* reset */ - u64 corrclk4ts; /* use the corrected clock for timestamps */ - u64 ptpclkadd; /* enum sja1105_ptp_clk_mode */ -}; - struct sja1105_info { u64 device_id; /* Needed for distinction between P and R, and between Q and S @@ -99,20 +90,15 @@ struct sja1105_private { struct spi_device *spidev; struct dsa_switch *ds; struct sja1105_port ports[SJA1105_NUM_PORTS]; - struct sja1105_ptp_cmd ptp_cmd; - struct ptp_clock_info ptp_caps; - struct ptp_clock *clock; - /* Serializes all operations on the PTP hardware clock */ - struct mutex ptp_lock; /* Serializes transmission of management frames so that * the switch doesn't confuse them with one another. */ struct mutex mgmt_lock; struct sja1105_tagger_data tagger_data; + struct sja1105_ptp_data ptp_data; }; #include "sja1105_dynamic_config.h" -#include "sja1105_ptp.h" struct sja1105_spi_message { u64 access; diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c index d92f15b3aea9..670c069722d5 100644 --- a/drivers/net/dsa/sja1105/sja1105_main.c +++ b/drivers/net/dsa/sja1105/sja1105_main.c @@ -1406,7 +1406,7 @@ static int sja1105_static_config_reload(struct sja1105_private *priv) } /* No PTP operations can run right now */ - mutex_lock(&priv->ptp_lock); + mutex_lock(&priv->ptp_data.lock); ptpclkval = __sja1105_ptp_gettimex(priv, &ptp_sts_before); @@ -1433,7 +1433,7 @@ static int sja1105_static_config_reload(struct sja1105_private *priv) __sja1105_ptp_adjtime(priv, ptpclkval); out_unlock_ptp: - mutex_unlock(&priv->ptp_lock); + mutex_unlock(&priv->ptp_data.lock); /* Configure the CGU (PLLs) for MII and RMII PHYs. * For these interfaces there is no dynamic configuration @@ -1876,7 +1876,7 @@ static netdev_tx_t sja1105_port_deferred_xmit(struct dsa_switch *ds, int port, skb_shinfo(clone)->tx_flags |= SKBTX_IN_PROGRESS; - mutex_lock(&priv->ptp_lock); + mutex_lock(&priv->ptp_data.lock); ticks = sja1105_ptpclkval_read(priv, NULL); @@ -1893,7 +1893,7 @@ static netdev_tx_t sja1105_port_deferred_xmit(struct dsa_switch *ds, int port, skb_complete_tx_timestamp(clone, &shwt); out_unlock_ptp: - mutex_unlock(&priv->ptp_lock); + mutex_unlock(&priv->ptp_data.lock); out: mutex_unlock(&priv->mgmt_lock); return NETDEV_TX_OK; @@ -2029,7 +2029,7 @@ static void sja1105_rxtstamp_work(struct work_struct *work) struct sk_buff *skb; u64 ticks; - mutex_lock(&priv->ptp_lock); + mutex_lock(&priv->ptp_data.lock); ticks = sja1105_ptpclkval_read(priv, NULL); @@ -2046,7 +2046,7 @@ static void sja1105_rxtstamp_work(struct work_struct *work) netif_rx_ni(skb); } - mutex_unlock(&priv->ptp_lock); + mutex_unlock(&priv->ptp_data.lock); } /* Called from dsa_skb_defer_rx_timestamp */ diff --git a/drivers/net/dsa/sja1105/sja1105_ptp.c b/drivers/net/dsa/sja1105/sja1105_ptp.c index a7722c0944fb..f85f44bdab31 100644 --- a/drivers/net/dsa/sja1105/sja1105_ptp.c +++ b/drivers/net/dsa/sja1105/sja1105_ptp.c @@ -34,7 +34,10 @@ #define SJA1105_CC_MULT_DEM 15625 #define SJA1105_CC_MULT 0x80000000 -#define ptp_to_sja1105(d) container_of((d), struct sja1105_private, ptp_caps) +#define ptp_to_sja1105_data(d) \ + container_of((d), struct sja1105_ptp_data, caps) +#define ptp_data_to_sja1105(d) \ + container_of((d), struct sja1105_private, ptp_data) int sja1105_get_ts_info(struct dsa_switch *ds, int port, struct ethtool_ts_info *info) @@ -42,7 +45,7 @@ int sja1105_get_ts_info(struct dsa_switch *ds, int port, struct sja1105_private *priv = ds->priv; /* Called during cleanup */ - if (!priv->clock) + if (!priv->ptp_data.clock) return -ENODEV; info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | @@ -52,7 +55,7 @@ int sja1105_get_ts_info(struct dsa_switch *ds, int port, (1 << HWTSTAMP_TX_ON); info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT); - info->phc_index = ptp_clock_index(priv->clock); + info->phc_index = ptp_clock_index(priv->ptp_data.clock); return 0; } @@ -200,22 +203,23 @@ int sja1105_ptpegr_ts_poll(struct sja1105_private *priv, int port, u64 *ts) int sja1105_ptp_reset(struct sja1105_private *priv) { - struct sja1105_ptp_cmd cmd = priv->ptp_cmd; + struct sja1105_ptp_data *ptp_data = &priv->ptp_data; + struct sja1105_ptp_cmd cmd = ptp_data->cmd; int rc; - mutex_lock(&priv->ptp_lock); + mutex_lock(&ptp_data->lock); cmd.resptp = 1; dev_dbg(priv->ds->dev, "Resetting PTP clock\n"); rc = priv->info->ptp_cmd(priv, &cmd); - mutex_unlock(&priv->ptp_lock); + mutex_unlock(&ptp_data->lock); return rc; } -/* Caller must hold priv->ptp_lock */ +/* Caller must hold priv->ptp_data.lock */ u64 __sja1105_ptp_gettimex(struct sja1105_private *priv, struct ptp_system_timestamp *sts) { @@ -230,30 +234,31 @@ static int sja1105_ptp_gettimex(struct ptp_clock_info *ptp, struct timespec64 *ts, struct ptp_system_timestamp *sts) { - struct sja1105_private *priv = ptp_to_sja1105(ptp); + struct sja1105_ptp_data *ptp_data = ptp_to_sja1105_data(ptp); + struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data); - mutex_lock(&priv->ptp_lock); + mutex_lock(&ptp_data->lock); *ts = ns_to_timespec64(__sja1105_ptp_gettimex(priv, sts)); - mutex_unlock(&priv->ptp_lock); + mutex_unlock(&ptp_data->lock); return 0; } -/* Caller must hold priv->ptp_lock */ +/* Caller must hold priv->ptp_data.lock */ static int sja1105_ptp_mode_set(struct sja1105_private *priv, enum sja1105_ptp_clk_mode mode) { - if (priv->ptp_cmd.ptpclkadd == mode) + if (priv->ptp_data.cmd.ptpclkadd == mode) return 0; - priv->ptp_cmd.ptpclkadd = mode; + priv->ptp_data.cmd.ptpclkadd = mode; - return priv->info->ptp_cmd(priv, &priv->ptp_cmd); + return priv->info->ptp_cmd(priv, &priv->ptp_data.cmd); } -/* Caller must hold priv->ptp_lock */ +/* Caller must hold priv->ptp_data.lock */ static int sja1105_ptpclkval_write(struct sja1105_private *priv, u64 val, struct ptp_system_timestamp *ptp_sts) { @@ -282,22 +287,24 @@ int __sja1105_ptp_settime(struct sja1105_private *priv, u64 ns, static int sja1105_ptp_settime(struct ptp_clock_info *ptp, const struct timespec64 *ts) { - struct sja1105_private *priv = ptp_to_sja1105(ptp); + struct sja1105_ptp_data *ptp_data = ptp_to_sja1105_data(ptp); + struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data); u64 ns = timespec64_to_ns(ts); int rc; - mutex_lock(&priv->ptp_lock); + mutex_lock(&ptp_data->lock); rc = __sja1105_ptp_settime(priv, ns, NULL); - mutex_unlock(&priv->ptp_lock); + mutex_unlock(&ptp_data->lock); return rc; } static int sja1105_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) { - struct sja1105_private *priv = ptp_to_sja1105(ptp); + struct sja1105_ptp_data *ptp_data = ptp_to_sja1105_data(ptp); + struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data); const struct sja1105_regs *regs = priv->info->regs; s64 clkrate; int rc; @@ -309,17 +316,17 @@ static int sja1105_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) clkrate = SJA1105_CC_MULT + clkrate; clkrate &= GENMASK_ULL(31, 0); - mutex_lock(&priv->ptp_lock); + mutex_lock(&priv->ptp_data.lock); rc = sja1105_spi_send_int(priv, SPI_WRITE, regs->ptpclkrate, &clkrate, 4, NULL); - mutex_unlock(&priv->ptp_lock); + mutex_unlock(&priv->ptp_data.lock); return rc; } -/* Caller must hold priv->ptp_lock */ +/* Caller must hold priv->ptp_data.lock */ u64 sja1105_ptpclkval_read(struct sja1105_private *priv, struct ptp_system_timestamp *sts) { @@ -354,23 +361,25 @@ int __sja1105_ptp_adjtime(struct sja1105_private *priv, s64 delta) static int sja1105_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) { - struct sja1105_private *priv = ptp_to_sja1105(ptp); + struct sja1105_ptp_data *ptp_data = ptp_to_sja1105_data(ptp); + struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data); int rc; - mutex_lock(&priv->ptp_lock); + mutex_lock(&ptp_data->lock); rc = __sja1105_ptp_adjtime(priv, delta); - mutex_unlock(&priv->ptp_lock); + mutex_unlock(&ptp_data->lock); return rc; } int sja1105_ptp_clock_register(struct sja1105_private *priv) { + struct sja1105_ptp_data *ptp_data = &priv->ptp_data; struct dsa_switch *ds = priv->ds; - priv->ptp_caps = (struct ptp_clock_info) { + ptp_data->caps = (struct ptp_clock_info) { .owner = THIS_MODULE, .name = "SJA1105 PHC", .adjfine = sja1105_ptp_adjfine, @@ -380,23 +389,25 @@ int sja1105_ptp_clock_register(struct sja1105_private *priv) .max_adj = SJA1105_MAX_ADJ_PPB, }; - mutex_init(&priv->ptp_lock); + mutex_init(&ptp_data->lock); - priv->clock = ptp_clock_register(&priv->ptp_caps, ds->dev); - if (IS_ERR_OR_NULL(priv->clock)) - return PTR_ERR(priv->clock); + ptp_data->clock = ptp_clock_register(&ptp_data->caps, ds->dev); + if (IS_ERR_OR_NULL(ptp_data->clock)) + return PTR_ERR(ptp_data->clock); - priv->ptp_cmd.corrclk4ts = true; - priv->ptp_cmd.ptpclkadd = PTP_SET_MODE; + ptp_data->cmd.corrclk4ts = true; + ptp_data->cmd.ptpclkadd = PTP_SET_MODE; return sja1105_ptp_reset(priv); } void sja1105_ptp_clock_unregister(struct sja1105_private *priv) { - if (IS_ERR_OR_NULL(priv->clock)) + struct sja1105_ptp_data *ptp_data = &priv->ptp_data; + + if (IS_ERR_OR_NULL(ptp_data->clock)) return; - ptp_clock_unregister(priv->clock); - priv->clock = NULL; + ptp_clock_unregister(ptp_data->clock); + ptp_data->clock = NULL; } diff --git a/drivers/net/dsa/sja1105/sja1105_ptp.h b/drivers/net/dsa/sja1105/sja1105_ptp.h index c699611e585d..dfe856200394 100644 --- a/drivers/net/dsa/sja1105/sja1105_ptp.h +++ b/drivers/net/dsa/sja1105/sja1105_ptp.h @@ -19,8 +19,29 @@ static inline s64 sja1105_ticks_to_ns(s64 ticks) return ticks * SJA1105_TICK_NS; } +struct sja1105_private; + #if IS_ENABLED(CONFIG_NET_DSA_SJA1105_PTP) +enum sja1105_ptp_clk_mode { + PTP_ADD_MODE = 1, + PTP_SET_MODE = 0, +}; + +struct sja1105_ptp_cmd { + u64 resptp; /* reset */ + u64 corrclk4ts; /* use the corrected clock for timestamps */ + u64 ptpclkadd; /* enum sja1105_ptp_clk_mode */ +}; + +struct sja1105_ptp_data { + struct sja1105_ptp_cmd cmd; + struct ptp_clock_info caps; + struct ptp_clock *clock; + /* Serializes all operations on the PTP hardware clock */ + struct mutex lock; +}; + int sja1105_ptp_clock_register(struct sja1105_private *priv); void sja1105_ptp_clock_unregister(struct sja1105_private *priv); @@ -52,6 +73,14 @@ int __sja1105_ptp_adjtime(struct sja1105_private *priv, s64 delta); #else +/* Structures cannot be empty in C. Bah! + * Keep the mutex as the only element, which is a bit more difficult to + * refactor out of sja1105_main.c anyway. + */ +struct sja1105_ptp_data { + struct mutex lock; +}; + static inline int sja1105_ptp_clock_register(struct sja1105_private *priv) { return 0; -- 2.17.1