dsa_port_disable(dp);
                break;
        case DSA_PORT_TYPE_CPU:
-               err = dsa_port_link_register_of(dp);
-               if (err)
-                       break;
-               dsa_port_link_registered = true;
+               if (dp->dn) {
+                       err = dsa_port_link_register_of(dp);
+                       if (err)
+                               break;
+                       dsa_port_link_registered = true;
+               } else {
+                       dev_warn(ds->dev,
+                                "skipping link registration for CPU port %d\n",
+                                dp->index);
+               }
 
                err = dsa_port_enable(dp, NULL);
                if (err)
 
                break;
        case DSA_PORT_TYPE_DSA:
-               err = dsa_port_link_register_of(dp);
-               if (err)
-                       break;
-               dsa_port_link_registered = true;
+               if (dp->dn) {
+                       err = dsa_port_link_register_of(dp);
+                       if (err)
+                               break;
+                       dsa_port_link_registered = true;
+               } else {
+                       dev_warn(ds->dev,
+                                "skipping link registration for DSA port %d\n",
+                                dp->index);
+               }
 
                err = dsa_port_enable(dp, NULL);
                if (err)
                break;
        case DSA_PORT_TYPE_CPU:
                dsa_port_disable(dp);
-               dsa_port_link_unregister_of(dp);
+               if (dp->dn)
+                       dsa_port_link_unregister_of(dp);
                break;
        case DSA_PORT_TYPE_DSA:
                dsa_port_disable(dp);
-               dsa_port_link_unregister_of(dp);
+               if (dp->dn)
+                       dsa_port_link_unregister_of(dp);
                break;
        case DSA_PORT_TYPE_USER:
                if (dp->slave) {