Skip to content

Commit d82acd8

Browse files
Jiri Pirkokuba-moo
authored andcommitted
net: dsa: move port_setup/teardown to be called outside devlink port registered area
Move port_setup() op to be called before devlink_port_register() and port_teardown() after devlink_port_unregister(). Note it makes sense to move this alongside the rest of the devlink port code, the reinit() function also gets much nicer, as clearly the fact that port_setup()->devlink_port_region_create() was called in dsa_port_setup did not fit the flow. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent ae3bbc0 commit d82acd8

File tree

1 file changed

+26
-42
lines changed

1 file changed

+26
-42
lines changed

net/dsa/dsa2.c

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -472,12 +472,6 @@ static int dsa_port_setup(struct dsa_port *dp)
472472
if (dp->setup)
473473
return 0;
474474

475-
if (ds->ops->port_setup) {
476-
err = ds->ops->port_setup(ds, dp->index);
477-
if (err)
478-
return err;
479-
}
480-
481475
switch (dp->type) {
482476
case DSA_PORT_TYPE_UNUSED:
483477
dsa_port_disable(dp);
@@ -532,11 +526,8 @@ static int dsa_port_setup(struct dsa_port *dp)
532526
dsa_port_disable(dp);
533527
if (err && dsa_port_link_registered)
534528
dsa_shared_port_link_unregister_of(dp);
535-
if (err) {
536-
if (ds->ops->port_teardown)
537-
ds->ops->port_teardown(ds, dp->index);
529+
if (err)
538530
return err;
539-
}
540531

541532
dp->setup = true;
542533

@@ -549,17 +540,26 @@ static int dsa_port_devlink_setup(struct dsa_port *dp)
549540
struct dsa_switch_tree *dst = dp->ds->dst;
550541
struct devlink_port_attrs attrs = {};
551542
struct devlink *dl = dp->ds->devlink;
543+
struct dsa_switch *ds = dp->ds;
552544
const unsigned char *id;
553545
unsigned char len;
554546
int err;
555547

548+
memset(dlp, 0, sizeof(*dlp));
549+
devlink_port_init(dl, dlp);
550+
551+
if (ds->ops->port_setup) {
552+
err = ds->ops->port_setup(ds, dp->index);
553+
if (err)
554+
return err;
555+
}
556+
556557
id = (const unsigned char *)&dst->index;
557558
len = sizeof(dst->index);
558559

559560
attrs.phys.port_number = dp->index;
560561
memcpy(attrs.switch_id.id, id, len);
561562
attrs.switch_id.id_len = len;
562-
memset(dlp, 0, sizeof(*dlp));
563563

564564
switch (dp->type) {
565565
case DSA_PORT_TYPE_UNUSED:
@@ -578,24 +578,23 @@ static int dsa_port_devlink_setup(struct dsa_port *dp)
578578

579579
devlink_port_attrs_set(dlp, &attrs);
580580
err = devlink_port_register(dl, dlp, dp->index);
581+
if (err) {
582+
if (ds->ops->port_teardown)
583+
ds->ops->port_teardown(ds, dp->index);
584+
return err;
585+
}
586+
dp->devlink_port_setup = true;
581587

582-
if (!err)
583-
dp->devlink_port_setup = true;
584-
585-
return err;
588+
return 0;
586589
}
587590

588591
static void dsa_port_teardown(struct dsa_port *dp)
589592
{
590593
struct devlink_port *dlp = &dp->devlink_port;
591-
struct dsa_switch *ds = dp->ds;
592594

593595
if (!dp->setup)
594596
return;
595597

596-
if (ds->ops->port_teardown)
597-
ds->ops->port_teardown(ds, dp->index);
598-
599598
devlink_port_type_clear(dlp);
600599

601600
switch (dp->type) {
@@ -625,40 +624,25 @@ static void dsa_port_teardown(struct dsa_port *dp)
625624
static void dsa_port_devlink_teardown(struct dsa_port *dp)
626625
{
627626
struct devlink_port *dlp = &dp->devlink_port;
627+
struct dsa_switch *ds = dp->ds;
628628

629-
if (dp->devlink_port_setup)
629+
if (dp->devlink_port_setup) {
630630
devlink_port_unregister(dlp);
631+
if (ds->ops->port_teardown)
632+
ds->ops->port_teardown(ds, dp->index);
633+
devlink_port_fini(dlp);
634+
}
631635
dp->devlink_port_setup = false;
632636
}
633637

634638
/* Destroy the current devlink port, and create a new one which has the UNUSED
635-
* flavour. At this point, any call to ds->ops->port_setup has been already
636-
* balanced out by a call to ds->ops->port_teardown, so we know that any
637-
* devlink port regions the driver had are now unregistered. We then call its
638-
* ds->ops->port_setup again, in order for the driver to re-create them on the
639-
* new devlink port.
639+
* flavour.
640640
*/
641641
static int dsa_port_reinit_as_unused(struct dsa_port *dp)
642642
{
643-
struct dsa_switch *ds = dp->ds;
644-
int err;
645-
646643
dsa_port_devlink_teardown(dp);
647644
dp->type = DSA_PORT_TYPE_UNUSED;
648-
err = dsa_port_devlink_setup(dp);
649-
if (err)
650-
return err;
651-
652-
if (ds->ops->port_setup) {
653-
/* On error, leave the devlink port registered,
654-
* dsa_switch_teardown will clean it up later.
655-
*/
656-
err = ds->ops->port_setup(ds, dp->index);
657-
if (err)
658-
return err;
659-
}
660-
661-
return 0;
645+
return dsa_port_devlink_setup(dp);
662646
}
663647

664648
static int dsa_devlink_info_get(struct devlink *dl,

0 commit comments

Comments
 (0)