Each port children node must have the following mandatory properties:
 - reg                  : Describes the port address in the switch
-- label                        : Describes the label associated with this port, which
-                          will become the netdev name. Special labels are
-                         "cpu" to indicate a CPU port and "dsa" to
-                         indicate an uplink/downlink port between switches in
-                         the cluster.
 
-A port labelled "dsa" has the following mandatory property:
+An uplink/downlink port between switches in the cluster has the following
+mandatory property:
 
 - link                 : Should be a list of phandles to other switch's DSA
                          port. This port is used as the outgoing port
                          information must be given, not just the one hop
                          routes to neighbouring switches.
 
-A port labelled "cpu" has the following mandatory property:
+A CPU port has the following mandatory property:
 
 - ethernet             : Should be a phandle to a valid Ethernet device node.
                           This host device is what the switch port is
                          connected to.
 
+A user port has the following optional property:
+
+- label                        : Describes the label associated with this port, which
+                          will become the netdev name.
+
 Port child nodes may also contain the following optional standardised
 properties, described in binding documents:
 
 
                        switch0port5: port@5 {
                                reg = <5>;
-                               label = "dsa";
                                phy-mode = "rgmii-txid";
                                link = <&switch1port6
                                        &switch2port9>;
 
                        port@6 {
                                reg = <6>;
-                               label = "cpu";
                                ethernet = <&fec1>;
                                fixed-link {
                                        speed = <100>;
 
                        switch1port5: port@5 {
                                reg = <5>;
-                               label = "dsa";
                                link = <&switch2port9>;
                                phy-mode = "rgmii-txid";
                                fixed-link {
 
                        switch1port6: port@6 {
                                reg = <6>;
-                               label = "dsa";
                                phy-mode = "rgmii-txid";
                                link = <&switch0port5>;
                                fixed-link {
 
                        switch2port9: port@9 {
                                reg = <9>;
-                               label = "dsa";
                                phy-mode = "rgmii-txid";
                                link = <&switch1port5
                                        &switch0port5>;
 
 
 static bool dsa_port_is_dsa(struct device_node *port)
 {
-       const char *name;
-
-       name = of_get_property(port, "label", NULL);
-       if (!name)
-               return false;
-
-       if (!strcmp(name, "dsa"))
-               return true;
-
-       return false;
+       return !!of_parse_phandle(port, "link", 0);
 }
 
 static bool dsa_port_is_cpu(struct device_node *port)
 {
-       const char *name;
-
-       name = of_get_property(port, "label", NULL);
-       if (!name)
-               return false;
-
-       if (!strcmp(name, "cpu"))
-               return true;
-
-       return false;
+       return !!of_parse_phandle(port, "ethernet", 0);
 }
 
 static bool dsa_ds_find_port(struct dsa_switch *ds,
        int err;
 
        name = of_get_property(port, "label", NULL);
+       if (!name)
+               name = "eth%d";
 
        err = dsa_slave_create(ds, ds->dev, index, name);
        if (err) {