@@ -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
588591static 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)
625624static 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 */
641641static 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
664648static int dsa_devlink_info_get (struct devlink * dl ,
0 commit comments