Skip to content

Commit 2d9888c

Browse files
committed
Merge branch 'dsa-cleanups-before-multi-CPU-port'
Florian Fainelli says: ==================== net: dsa: Cleanups before multi-CPU port This patch series does a bunch of cleanups before we start adding support for multiple CPU ports. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 1820dd0 + 14be36c commit 2d9888c

File tree

5 files changed

+66
-75
lines changed

5 files changed

+66
-75
lines changed

include/net/dsa.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ struct dsa_switch {
254254

255255
static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
256256
{
257-
return ds->dst->cpu_dp == &ds->ports[p];
257+
return !!(ds->cpu_port_mask & (1 << p));
258258
}
259259

260260
static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)

net/dsa/dsa.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,9 @@ const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol)
112112
return ops;
113113
}
114114

115-
int dsa_cpu_port_ethtool_setup(struct dsa_switch *ds)
115+
int dsa_cpu_port_ethtool_setup(struct dsa_port *cpu_dp)
116116
{
117+
struct dsa_switch *ds = cpu_dp->ds;
117118
struct net_device *master;
118119
struct ethtool_ops *cpu_ops;
119120

@@ -136,8 +137,9 @@ int dsa_cpu_port_ethtool_setup(struct dsa_switch *ds)
136137
return 0;
137138
}
138139

139-
void dsa_cpu_port_ethtool_restore(struct dsa_switch *ds)
140+
void dsa_cpu_port_ethtool_restore(struct dsa_port *cpu_dp)
140141
{
142+
struct dsa_switch *ds = cpu_dp->ds;
141143
struct net_device *master;
142144

143145
master = ds->dst->master_netdev;

net/dsa/dsa2.c

Lines changed: 57 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -214,66 +214,59 @@ static int dsa_dst_complete(struct dsa_switch_tree *dst)
214214
return 0;
215215
}
216216

217-
static int dsa_dsa_port_apply(struct dsa_port *port, u32 index,
218-
struct dsa_switch *ds)
217+
static int dsa_dsa_port_apply(struct dsa_port *port)
219218
{
219+
struct dsa_switch *ds = port->ds;
220220
int err;
221221

222-
err = dsa_cpu_dsa_setup(ds, ds->dev, port, index);
222+
err = dsa_cpu_dsa_setup(ds, ds->dev, port, port->index);
223223
if (err) {
224224
dev_warn(ds->dev, "Failed to setup dsa port %d: %d\n",
225-
index, err);
225+
port->index, err);
226226
return err;
227227
}
228228

229-
memset(&ds->ports[index].devlink_port, 0,
230-
sizeof(ds->ports[index].devlink_port));
229+
memset(&port->devlink_port, 0, sizeof(port->devlink_port));
231230

232-
return devlink_port_register(ds->devlink,
233-
&ds->ports[index].devlink_port,
234-
index);
231+
return devlink_port_register(ds->devlink, &port->devlink_port,
232+
port->index);
235233
}
236234

237-
static void dsa_dsa_port_unapply(struct dsa_port *port, u32 index,
238-
struct dsa_switch *ds)
235+
static void dsa_dsa_port_unapply(struct dsa_port *port)
239236
{
240-
devlink_port_unregister(&ds->ports[index].devlink_port);
237+
devlink_port_unregister(&port->devlink_port);
241238
dsa_cpu_dsa_destroy(port);
242239
}
243240

244-
static int dsa_cpu_port_apply(struct dsa_port *port, u32 index,
245-
struct dsa_switch *ds)
241+
static int dsa_cpu_port_apply(struct dsa_port *port)
246242
{
243+
struct dsa_switch *ds = port->ds;
247244
int err;
248245

249-
err = dsa_cpu_dsa_setup(ds, ds->dev, port, index);
246+
err = dsa_cpu_dsa_setup(ds, ds->dev, port, port->index);
250247
if (err) {
251248
dev_warn(ds->dev, "Failed to setup cpu port %d: %d\n",
252-
index, err);
249+
port->index, err);
253250
return err;
254251
}
255252

256-
ds->cpu_port_mask |= BIT(index);
257-
258-
memset(&ds->ports[index].devlink_port, 0,
259-
sizeof(ds->ports[index].devlink_port));
260-
err = devlink_port_register(ds->devlink, &ds->ports[index].devlink_port,
261-
index);
253+
memset(&port->devlink_port, 0, sizeof(port->devlink_port));
254+
err = devlink_port_register(ds->devlink, &port->devlink_port,
255+
port->index);
262256
return err;
263257
}
264258

265-
static void dsa_cpu_port_unapply(struct dsa_port *port, u32 index,
266-
struct dsa_switch *ds)
259+
static void dsa_cpu_port_unapply(struct dsa_port *port)
267260
{
268-
devlink_port_unregister(&ds->ports[index].devlink_port);
261+
devlink_port_unregister(&port->devlink_port);
269262
dsa_cpu_dsa_destroy(port);
270-
ds->cpu_port_mask &= ~BIT(index);
263+
port->ds->cpu_port_mask &= ~BIT(port->index);
271264

272265
}
273266

274-
static int dsa_user_port_apply(struct dsa_port *port, u32 index,
275-
struct dsa_switch *ds)
267+
static int dsa_user_port_apply(struct dsa_port *port)
276268
{
269+
struct dsa_switch *ds = port->ds;
277270
const char *name = port->name;
278271
int err;
279272

@@ -282,35 +275,32 @@ static int dsa_user_port_apply(struct dsa_port *port, u32 index,
282275
if (!name)
283276
name = "eth%d";
284277

285-
err = dsa_slave_create(ds, ds->dev, index, name);
278+
err = dsa_slave_create(ds, ds->dev, port->index, name);
286279
if (err) {
287280
dev_warn(ds->dev, "Failed to create slave %d: %d\n",
288-
index, err);
289-
ds->ports[index].netdev = NULL;
281+
port->index, err);
282+
port->netdev = NULL;
290283
return err;
291284
}
292285

293-
memset(&ds->ports[index].devlink_port, 0,
294-
sizeof(ds->ports[index].devlink_port));
295-
err = devlink_port_register(ds->devlink, &ds->ports[index].devlink_port,
296-
index);
286+
memset(&port->devlink_port, 0, sizeof(port->devlink_port));
287+
err = devlink_port_register(ds->devlink, &port->devlink_port,
288+
port->index);
297289
if (err)
298290
return err;
299291

300-
devlink_port_type_eth_set(&ds->ports[index].devlink_port,
301-
ds->ports[index].netdev);
292+
devlink_port_type_eth_set(&port->devlink_port, port->netdev);
302293

303294
return 0;
304295
}
305296

306-
static void dsa_user_port_unapply(struct dsa_port *port, u32 index,
307-
struct dsa_switch *ds)
297+
static void dsa_user_port_unapply(struct dsa_port *port)
308298
{
309-
devlink_port_unregister(&ds->ports[index].devlink_port);
310-
if (ds->ports[index].netdev) {
311-
dsa_slave_destroy(ds->ports[index].netdev);
312-
ds->ports[index].netdev = NULL;
313-
ds->enabled_port_mask &= ~(1 << index);
299+
devlink_port_unregister(&port->devlink_port);
300+
if (port->netdev) {
301+
dsa_slave_destroy(port->netdev);
302+
port->netdev = NULL;
303+
port->ds->enabled_port_mask &= ~(1 << port->index);
314304
}
315305
}
316306

@@ -370,20 +360,20 @@ static int dsa_ds_apply(struct dsa_switch_tree *dst, struct dsa_switch *ds)
370360
continue;
371361

372362
if (dsa_port_is_dsa(port)) {
373-
err = dsa_dsa_port_apply(port, index, ds);
363+
err = dsa_dsa_port_apply(port);
374364
if (err)
375365
return err;
376366
continue;
377367
}
378368

379369
if (dsa_port_is_cpu(port)) {
380-
err = dsa_cpu_port_apply(port, index, ds);
370+
err = dsa_cpu_port_apply(port);
381371
if (err)
382372
return err;
383373
continue;
384374
}
385375

386-
err = dsa_user_port_apply(port, index, ds);
376+
err = dsa_user_port_apply(port);
387377
if (err)
388378
continue;
389379
}
@@ -402,16 +392,16 @@ static void dsa_ds_unapply(struct dsa_switch_tree *dst, struct dsa_switch *ds)
402392
continue;
403393

404394
if (dsa_port_is_dsa(port)) {
405-
dsa_dsa_port_unapply(port, index, ds);
395+
dsa_dsa_port_unapply(port);
406396
continue;
407397
}
408398

409399
if (dsa_port_is_cpu(port)) {
410-
dsa_cpu_port_unapply(port, index, ds);
400+
dsa_cpu_port_unapply(port);
411401
continue;
412402
}
413403

414-
dsa_user_port_unapply(port, index, ds);
404+
dsa_user_port_unapply(port);
415405
}
416406

417407
if (ds->slave_mii_bus && ds->ops->phy_read)
@@ -444,7 +434,7 @@ static int dsa_dst_apply(struct dsa_switch_tree *dst)
444434
}
445435

446436
if (dst->cpu_dp) {
447-
err = dsa_cpu_port_ethtool_setup(dst->cpu_dp->ds);
437+
err = dsa_cpu_port_ethtool_setup(dst->cpu_dp);
448438
if (err)
449439
return err;
450440
}
@@ -485,7 +475,7 @@ static void dsa_dst_unapply(struct dsa_switch_tree *dst)
485475
}
486476

487477
if (dst->cpu_dp)
488-
dsa_cpu_port_ethtool_restore(dst->cpu_dp->ds);
478+
dsa_cpu_port_ethtool_restore(dst->cpu_dp);
489479

490480
pr_info("DSA: tree %d unapplied\n", dst->tree);
491481
dst->applied = false;
@@ -530,6 +520,12 @@ static int dsa_cpu_parse(struct dsa_port *port, u32 index,
530520

531521
dst->rcv = dst->tag_ops->rcv;
532522

523+
/* Initialize cpu_port_mask now for drv->setup()
524+
* to have access to a correct value, just like what
525+
* net/dsa/dsa.c::dsa_switch_setup_one does.
526+
*/
527+
ds->cpu_port_mask |= BIT(index);
528+
533529
return 0;
534530
}
535531

@@ -541,14 +537,22 @@ static int dsa_ds_parse(struct dsa_switch_tree *dst, struct dsa_switch *ds)
541537

542538
for (index = 0; index < ds->num_ports; index++) {
543539
port = &ds->ports[index];
544-
if (!dsa_port_is_valid(port))
540+
if (!dsa_port_is_valid(port) ||
541+
dsa_port_is_dsa(port))
545542
continue;
546543

547544
if (dsa_port_is_cpu(port)) {
548545
err = dsa_cpu_parse(port, index, dst, ds);
549546
if (err)
550547
return err;
548+
} else {
549+
/* Initialize enabled_port_mask now for drv->setup()
550+
* to have access to a correct value, just like what
551+
* net/dsa/dsa.c::dsa_switch_setup_one does.
552+
*/
553+
ds->enabled_port_mask |= BIT(index);
551554
}
555+
552556
}
553557

554558
pr_info("DSA: switch %d %d parsed\n", dst->tree, ds->index);
@@ -597,13 +601,6 @@ static int dsa_parse_ports_dn(struct device_node *ports, struct dsa_switch *ds)
597601
return -EINVAL;
598602

599603
ds->ports[reg].dn = port;
600-
601-
/* Initialize enabled_port_mask now for ops->setup()
602-
* to have access to a correct value, just like what
603-
* net/dsa/dsa.c::dsa_switch_setup_one does.
604-
*/
605-
if (!dsa_port_is_cpu(&ds->ports[reg]))
606-
ds->enabled_port_mask |= 1 << reg;
607604
}
608605

609606
return 0;
@@ -619,14 +616,6 @@ static int dsa_parse_ports(struct dsa_chip_data *cd, struct dsa_switch *ds)
619616
continue;
620617

621618
ds->ports[i].name = cd->port_names[i];
622-
623-
/* Initialize enabled_port_mask now for drv->setup()
624-
* to have access to a correct value, just like what
625-
* net/dsa/dsa.c::dsa_switch_setup_one does.
626-
*/
627-
if (!dsa_port_is_cpu(&ds->ports[i]))
628-
ds->enabled_port_mask |= 1 << i;
629-
630619
valid_name_found = true;
631620
}
632621

net/dsa/dsa_priv.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ int dsa_cpu_dsa_setup(struct dsa_switch *ds, struct device *dev,
103103
struct dsa_port *dport, int port);
104104
void dsa_cpu_dsa_destroy(struct dsa_port *dport);
105105
const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol);
106-
int dsa_cpu_port_ethtool_setup(struct dsa_switch *ds);
107-
void dsa_cpu_port_ethtool_restore(struct dsa_switch *ds);
106+
int dsa_cpu_port_ethtool_setup(struct dsa_port *cpu_dp);
107+
void dsa_cpu_port_ethtool_restore(struct dsa_port *cpu_dp);
108108

109109
/* legacy.c */
110110
int dsa_legacy_register(void);

net/dsa/legacy.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
205205
netdev_err(dst->master_netdev, "[%d] : can't configure CPU and DSA ports\n",
206206
index);
207207

208-
ret = dsa_cpu_port_ethtool_setup(ds);
208+
ret = dsa_cpu_port_ethtool_setup(ds->dst->cpu_dp);
209209
if (ret)
210210
return ret;
211211

@@ -733,7 +733,7 @@ static void dsa_remove_dst(struct dsa_switch_tree *dst)
733733
dsa_switch_destroy(ds);
734734
}
735735

736-
dsa_cpu_port_ethtool_restore(dst->cpu_dp->ds);
736+
dsa_cpu_port_ethtool_restore(dst->cpu_dp);
737737

738738
dev_put(dst->master_netdev);
739739
}

0 commit comments

Comments
 (0)