Skip to content

Commit c79e848

Browse files
vladimirolteandavem330
authored andcommitted
net: dsa: tag_sja1105: convert to tagger-owned data
Currently, struct sja1105_tagger_data is a part of struct sja1105_private, and is used by the sja1105 driver to populate dp->priv. With the movement towards tagger-owned storage, the sja1105 driver should not be the owner of this memory. This change implements the connection between the sja1105 switch driver and its tagging protocol, which means that sja1105_tagger_data no longer stays in dp->priv but in ds->tagger_data, and that the sja1105 driver now only populates the sja1105_port_deferred_xmit callback pointer. The kthread worker is now the responsibility of the tagger. The sja1105 driver also alters the tagger's state some more, especially with regard to the PTP RX timestamping state. This will be fixed up a bit in further changes. Signed-off-by: Vladimir Oltean <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 22ee9f8 commit c79e848

File tree

5 files changed

+110
-77
lines changed

5 files changed

+110
-77
lines changed

drivers/net/dsa/sja1105/sja1105.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,6 @@ struct sja1105_private {
272272
struct mii_bus *mdio_base_tx;
273273
struct mii_bus *mdio_pcs;
274274
struct dw_xpcs *xpcs[SJA1105_MAX_NUM_PORTS];
275-
struct sja1105_tagger_data tagger_data;
276275
struct sja1105_ptp_data ptp_data;
277276
struct sja1105_tas_data tas_data;
278277
};

drivers/net/dsa/sja1105/sja1105_main.c

Lines changed: 16 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2705,6 +2705,21 @@ static void sja1105_port_deferred_xmit(struct kthread_work *work)
27052705
kfree(xmit_work);
27062706
}
27072707

2708+
static int sja1105_connect_tag_protocol(struct dsa_switch *ds,
2709+
enum dsa_tag_protocol proto)
2710+
{
2711+
struct sja1105_tagger_data *tagger_data;
2712+
2713+
switch (proto) {
2714+
case DSA_TAG_PROTO_SJA1105:
2715+
tagger_data = sja1105_tagger_data(ds);
2716+
tagger_data->xmit_work_fn = sja1105_port_deferred_xmit;
2717+
return 0;
2718+
default:
2719+
return -EPROTONOSUPPORT;
2720+
}
2721+
}
2722+
27082723
/* The MAXAGE setting belongs to the L2 Forwarding Parameters table,
27092724
* which cannot be reconfigured at runtime. So a switch reset is required.
27102725
*/
@@ -3005,38 +3020,6 @@ static int sja1105_port_bridge_flags(struct dsa_switch *ds, int port,
30053020
return 0;
30063021
}
30073022

3008-
static void sja1105_teardown_ports(struct sja1105_private *priv)
3009-
{
3010-
struct sja1105_tagger_data *tagger_data = &priv->tagger_data;
3011-
3012-
kthread_destroy_worker(tagger_data->xmit_worker);
3013-
}
3014-
3015-
static int sja1105_setup_ports(struct sja1105_private *priv)
3016-
{
3017-
struct sja1105_tagger_data *tagger_data = &priv->tagger_data;
3018-
struct dsa_switch *ds = priv->ds;
3019-
struct kthread_worker *worker;
3020-
struct dsa_port *dp;
3021-
3022-
worker = kthread_create_worker(0, "dsa%d:%d_xmit", ds->dst->index,
3023-
ds->index);
3024-
if (IS_ERR(worker)) {
3025-
dev_err(ds->dev,
3026-
"failed to create deferred xmit thread: %pe\n",
3027-
worker);
3028-
return PTR_ERR(worker);
3029-
}
3030-
3031-
tagger_data->xmit_worker = worker;
3032-
tagger_data->xmit_work_fn = sja1105_port_deferred_xmit;
3033-
3034-
dsa_switch_for_each_user_port(dp, ds)
3035-
dp->priv = tagger_data;
3036-
3037-
return 0;
3038-
}
3039-
30403023
/* The programming model for the SJA1105 switch is "all-at-once" via static
30413024
* configuration tables. Some of these can be dynamically modified at runtime,
30423025
* but not the xMII mode parameters table.
@@ -3082,10 +3065,6 @@ static int sja1105_setup(struct dsa_switch *ds)
30823065
}
30833066
}
30843067

3085-
rc = sja1105_setup_ports(priv);
3086-
if (rc)
3087-
goto out_static_config_free;
3088-
30893068
sja1105_tas_setup(ds);
30903069
sja1105_flower_setup(ds);
30913070

@@ -3142,7 +3121,6 @@ static int sja1105_setup(struct dsa_switch *ds)
31423121
out_flower_teardown:
31433122
sja1105_flower_teardown(ds);
31443123
sja1105_tas_teardown(ds);
3145-
sja1105_teardown_ports(priv);
31463124
out_static_config_free:
31473125
sja1105_static_config_free(&priv->static_config);
31483126

@@ -3162,12 +3140,12 @@ static void sja1105_teardown(struct dsa_switch *ds)
31623140
sja1105_ptp_clock_unregister(ds);
31633141
sja1105_flower_teardown(ds);
31643142
sja1105_tas_teardown(ds);
3165-
sja1105_teardown_ports(priv);
31663143
sja1105_static_config_free(&priv->static_config);
31673144
}
31683145

31693146
static const struct dsa_switch_ops sja1105_switch_ops = {
31703147
.get_tag_protocol = sja1105_get_tag_protocol,
3148+
.connect_tag_protocol = sja1105_connect_tag_protocol,
31713149
.setup = sja1105_setup,
31723150
.teardown = sja1105_teardown,
31733151
.set_ageing_time = sja1105_set_ageing_time,

drivers/net/dsa/sja1105/sja1105_ptp.c

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ enum sja1105_ptp_clk_mode {
5858
#define ptp_data_to_sja1105(d) \
5959
container_of((d), struct sja1105_private, ptp_data)
6060

61-
/* Must be called only with priv->tagger_data.state bit
61+
/* Must be called only with the tagger_data->state bit
6262
* SJA1105_HWTS_RX_EN cleared
6363
*/
6464
static int sja1105_change_rxtstamping(struct sja1105_private *priv,
65+
struct sja1105_tagger_data *tagger_data,
6566
bool on)
6667
{
67-
struct sja1105_tagger_data *tagger_data = &priv->tagger_data;
6868
struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
6969
struct sja1105_general_params_entry *general_params;
7070
struct sja1105_table *table;
@@ -75,9 +75,9 @@ static int sja1105_change_rxtstamping(struct sja1105_private *priv,
7575
general_params->send_meta0 = on;
7676

7777
/* Initialize the meta state machine to a known state */
78-
if (priv->tagger_data.stampable_skb) {
79-
kfree_skb(priv->tagger_data.stampable_skb);
80-
priv->tagger_data.stampable_skb = NULL;
78+
if (tagger_data->stampable_skb) {
79+
kfree_skb(tagger_data->stampable_skb);
80+
tagger_data->stampable_skb = NULL;
8181
}
8282
ptp_cancel_worker_sync(ptp_data->clock);
8383
skb_queue_purge(&tagger_data->skb_txtstamp_queue);
@@ -88,6 +88,7 @@ static int sja1105_change_rxtstamping(struct sja1105_private *priv,
8888

8989
int sja1105_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr)
9090
{
91+
struct sja1105_tagger_data *tagger_data = sja1105_tagger_data(ds);
9192
struct sja1105_private *priv = ds->priv;
9293
struct hwtstamp_config config;
9394
bool rx_on;
@@ -116,17 +117,17 @@ int sja1105_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr)
116117
break;
117118
}
118119

119-
if (rx_on != test_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state)) {
120-
clear_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state);
120+
if (rx_on != test_bit(SJA1105_HWTS_RX_EN, &tagger_data->state)) {
121+
clear_bit(SJA1105_HWTS_RX_EN, &tagger_data->state);
121122

122-
rc = sja1105_change_rxtstamping(priv, rx_on);
123+
rc = sja1105_change_rxtstamping(priv, tagger_data, rx_on);
123124
if (rc < 0) {
124125
dev_err(ds->dev,
125126
"Failed to change RX timestamping: %d\n", rc);
126127
return rc;
127128
}
128129
if (rx_on)
129-
set_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state);
130+
set_bit(SJA1105_HWTS_RX_EN, &tagger_data->state);
130131
}
131132

132133
if (copy_to_user(ifr->ifr_data, &config, sizeof(config)))
@@ -136,6 +137,7 @@ int sja1105_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr)
136137

137138
int sja1105_hwtstamp_get(struct dsa_switch *ds, int port, struct ifreq *ifr)
138139
{
140+
struct sja1105_tagger_data *tagger_data = sja1105_tagger_data(ds);
139141
struct sja1105_private *priv = ds->priv;
140142
struct hwtstamp_config config;
141143

@@ -144,7 +146,7 @@ int sja1105_hwtstamp_get(struct dsa_switch *ds, int port, struct ifreq *ifr)
144146
config.tx_type = HWTSTAMP_TX_ON;
145147
else
146148
config.tx_type = HWTSTAMP_TX_OFF;
147-
if (test_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state))
149+
if (test_bit(SJA1105_HWTS_RX_EN, &tagger_data->state))
148150
config.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
149151
else
150152
config.rx_filter = HWTSTAMP_FILTER_NONE;
@@ -417,10 +419,11 @@ static long sja1105_rxtstamp_work(struct ptp_clock_info *ptp)
417419

418420
bool sja1105_rxtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb)
419421
{
422+
struct sja1105_tagger_data *tagger_data = sja1105_tagger_data(ds);
420423
struct sja1105_private *priv = ds->priv;
421424
struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
422425

423-
if (!test_bit(SJA1105_HWTS_RX_EN, &priv->tagger_data.state))
426+
if (!test_bit(SJA1105_HWTS_RX_EN, &tagger_data->state))
424427
return false;
425428

426429
/* We need to read the full PTP clock to reconstruct the Rx
@@ -459,13 +462,11 @@ bool sja1105_port_rxtstamp(struct dsa_switch *ds, int port,
459462
*/
460463
void sja1110_txtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb)
461464
{
465+
struct sja1105_tagger_data *tagger_data = sja1105_tagger_data(ds);
462466
struct sk_buff *clone = SJA1105_SKB_CB(skb)->clone;
463467
struct sja1105_private *priv = ds->priv;
464-
struct sja1105_tagger_data *tagger_data;
465468
u8 ts_id;
466469

467-
tagger_data = &priv->tagger_data;
468-
469470
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
470471

471472
spin_lock(&priv->ts_id_lock);
@@ -897,7 +898,6 @@ static struct ptp_pin_desc sja1105_ptp_pin = {
897898
int sja1105_ptp_clock_register(struct dsa_switch *ds)
898899
{
899900
struct sja1105_private *priv = ds->priv;
900-
struct sja1105_tagger_data *tagger_data = &priv->tagger_data;
901901
struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
902902

903903
ptp_data->caps = (struct ptp_clock_info) {
@@ -919,9 +919,6 @@ int sja1105_ptp_clock_register(struct dsa_switch *ds)
919919

920920
/* Only used on SJA1105 */
921921
skb_queue_head_init(&ptp_data->skb_rxtstamp_queue);
922-
/* Only used on SJA1110 */
923-
skb_queue_head_init(&tagger_data->skb_txtstamp_queue);
924-
spin_lock_init(&tagger_data->meta_lock);
925922

926923
ptp_data->clock = ptp_clock_register(&ptp_data->caps, ds->dev);
927924
if (IS_ERR_OR_NULL(ptp_data->clock))
@@ -937,8 +934,8 @@ int sja1105_ptp_clock_register(struct dsa_switch *ds)
937934

938935
void sja1105_ptp_clock_unregister(struct dsa_switch *ds)
939936
{
937+
struct sja1105_tagger_data *tagger_data = sja1105_tagger_data(ds);
940938
struct sja1105_private *priv = ds->priv;
941-
struct sja1105_tagger_data *tagger_data = &priv->tagger_data;
942939
struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
943940

944941
if (IS_ERR_OR_NULL(ptp_data->clock))

include/linux/dsa/sja1105.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,12 @@ static inline s64 sja1105_ticks_to_ns(s64 ticks)
8484
return ticks * SJA1105_TICK_NS;
8585
}
8686

87-
static inline bool dsa_port_is_sja1105(struct dsa_port *dp)
87+
static inline struct sja1105_tagger_data *
88+
sja1105_tagger_data(struct dsa_switch *ds)
8889
{
89-
return true;
90+
BUG_ON(ds->dst->tag_ops->proto != DSA_TAG_PROTO_SJA1105);
91+
92+
return ds->tagger_data;
9093
}
9194

9295
#endif /* _NET_DSA_SJA1105_H */

0 commit comments

Comments
 (0)