if (dp->setup)
                return 0;
 
-       mutex_init(&dp->addr_lists_lock);
-       mutex_init(&dp->vlans_lock);
-       INIT_LIST_HEAD(&dp->fdbs);
-       INIT_LIST_HEAD(&dp->mdbs);
-       INIT_LIST_HEAD(&dp->vlans);
-
        if (ds->ops->port_setup) {
                err = ds->ops->port_setup(ds, dp->index);
                if (err)
                break;
        }
 
-       WARN_ON(!list_empty(&dp->fdbs));
-       WARN_ON(!list_empty(&dp->mdbs));
-       WARN_ON(!list_empty(&dp->vlans));
-
        dp->setup = false;
 }
 
        dp->ds = ds;
        dp->index = index;
 
+       mutex_init(&dp->addr_lists_lock);
+       mutex_init(&dp->vlans_lock);
+       INIT_LIST_HEAD(&dp->fdbs);
+       INIT_LIST_HEAD(&dp->mdbs);
+       INIT_LIST_HEAD(&dp->vlans);
        INIT_LIST_HEAD(&dp->list);
        list_add_tail(&dp->list, &dst->ports);
 
        struct dsa_port *dp, *next;
 
        dsa_switch_for_each_port_safe(dp, next, ds) {
+               WARN_ON(!list_empty(&dp->fdbs));
+               WARN_ON(!list_empty(&dp->mdbs));
+               WARN_ON(!list_empty(&dp->vlans));
                list_del(&dp->list);
                kfree(dp);
        }