* state machine and make it go in PHY_FORCING state instead.
                 */
                if (!status->link)
-                       netif_carrier_off(ds->ports[port].netdev);
+                       netif_carrier_off(ds->ports[port].slave);
                status->duplex = 1;
        } else {
                status->link = 1;
 static void bcm_sf2_sw_get_wol(struct dsa_switch *ds, int port,
                               struct ethtool_wolinfo *wol)
 {
-       struct net_device *p = ds->ports[port].cpu_dp->netdev;
+       struct net_device *p = ds->ports[port].cpu_dp->master;
        struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
        struct ethtool_wolinfo pwol;
 
 static int bcm_sf2_sw_set_wol(struct dsa_switch *ds, int port,
                              struct ethtool_wolinfo *wol)
 {
-       struct net_device *p = ds->ports[port].cpu_dp->netdev;
+       struct net_device *p = ds->ports[port].cpu_dp->master;
        struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
        s8 cpu_port = ds->ports[port].cpu_dp->index;
        struct ethtool_wolinfo pwol;
 
         * controller also is the container for two GMACs nodes representing
         * as two netdev instances.
         */
-       dn = ds->ports[MT7530_CPU_PORT].netdev->dev.of_node->parent;
+       dn = ds->ports[MT7530_CPU_PORT].master->dev.of_node->parent;
        priv->ethernet = syscon_node_to_regmap(dn);
        if (IS_ERR(priv->ethernet))
                return PTR_ERR(priv->ethernet);
 
                        if (dsa_is_dsa_port(ds, i) || dsa_is_cpu_port(ds, i))
                                continue;
 
-                       if (!ds->ports[port].netdev)
+                       if (!ds->ports[port].slave)
                                continue;
 
                        if (vlan.member[i] ==
 
 
 
 struct dsa_port {
+       /* A CPU port is physically connected to a master device.
+        * A user port exposed to userspace has a slave device.
+        */
+       union {
+               struct net_device *master;
+               struct net_device *slave;
+       };
+
        /* CPU port tagging operations used by master or slave devices */
        const struct dsa_device_ops *tag_ops;
 
        unsigned int            index;
        const char              *name;
        struct dsa_port         *cpu_dp;
-       struct net_device       *netdev;
        struct device_node      *dn;
        unsigned int            ageing_time;
        u8                      stp_state;
 
 #ifdef CONFIG_PM_SLEEP
 static bool dsa_is_port_initialized(struct dsa_switch *ds, int p)
 {
-       return ds->enabled_port_mask & (1 << p) && ds->ports[p].netdev;
+       return ds->enabled_port_mask & (1 << p) && ds->ports[p].slave;
 }
 
 int dsa_switch_suspend(struct dsa_switch *ds)
                if (!dsa_is_port_initialized(ds, i))
                        continue;
 
-               ret = dsa_slave_suspend(ds->ports[i].netdev);
+               ret = dsa_slave_suspend(ds->ports[i].slave);
                if (ret)
                        return ret;
        }
                if (!dsa_is_port_initialized(ds, i))
                        continue;
 
-               ret = dsa_slave_resume(ds->ports[i].netdev);
+               ret = dsa_slave_resume(ds->ports[i].slave);
                if (ret)
                        return ret;
        }
 
        if (err) {
                dev_warn(ds->dev, "Failed to create slave %d: %d\n",
                         port->index, err);
-               port->netdev = NULL;
+               port->slave = NULL;
                return err;
        }
 
        if (err)
                return err;
 
-       devlink_port_type_eth_set(&port->devlink_port, port->netdev);
+       devlink_port_type_eth_set(&port->devlink_port, port->slave);
 
        return 0;
 }
 static void dsa_user_port_unapply(struct dsa_port *port)
 {
        devlink_port_unregister(&port->devlink_port);
-       if (port->netdev) {
-               dsa_slave_destroy(port->netdev);
-               port->netdev = NULL;
+       if (port->slave) {
+               dsa_slave_destroy(port->slave);
+               port->slave = NULL;
                port->ds->enabled_port_mask &= ~(1 << port->index);
        }
 }
         * sent to the tag format's receive function.
         */
        wmb();
-       dst->cpu_dp->netdev->dsa_ptr = dst->cpu_dp;
+       dst->cpu_dp->master->dsa_ptr = dst->cpu_dp;
 
-       err = dsa_master_ethtool_setup(dst->cpu_dp->netdev);
+       err = dsa_master_ethtool_setup(dst->cpu_dp->master);
        if (err)
                return err;
 
        if (!dst->applied)
                return;
 
-       dsa_master_ethtool_restore(dst->cpu_dp->netdev);
+       dsa_master_ethtool_restore(dst->cpu_dp->master);
 
-       dst->cpu_dp->netdev->dsa_ptr = NULL;
+       dst->cpu_dp->master->dsa_ptr = NULL;
 
        /* If we used a tagging format that doesn't have an ethertype
         * field, make sure that all packets from this point get sent
 
        if (!dst->cpu_dp) {
                dst->cpu_dp = port;
-               dst->cpu_dp->netdev = ethernet_dev;
+               dst->cpu_dp->master = ethernet_dev;
        }
 
        /* Initialize cpu_port_mask now for drv->setup()
 
        if (port < 0 || port >= ds->num_ports)
                return NULL;
 
-       return ds->ports[port].netdev;
+       return ds->ports[port].slave;
 }
 
 /* port.c */
 {
        struct dsa_port *dp = dsa_slave_to_port(dev);
 
-       return dp->cpu_dp->netdev;
+       return dp->cpu_dp->master;
 }
 
 /* switch.c */
 
                                return -EINVAL;
                        }
                        dst->cpu_dp = &ds->ports[i];
-                       dst->cpu_dp->netdev = master;
+                       dst->cpu_dp->master = master;
                        ds->cpu_port_mask |= 1 << i;
                } else if (!strcmp(name, "dsa")) {
                        ds->dsa_port_mask |= 1 << i;
                if (!(ds->enabled_port_mask & (1 << port)))
                        continue;
 
-               if (!ds->ports[port].netdev)
+               if (!ds->ports[port].slave)
                        continue;
 
-               dsa_slave_destroy(ds->ports[port].netdev);
+               dsa_slave_destroy(ds->ports[port].slave);
        }
 
        /* Disable configuration of the CPU and DSA ports */
        wmb();
        dev->dsa_ptr = dst->cpu_dp;
 
-       return dsa_master_ethtool_setup(dst->cpu_dp->netdev);
+       return dsa_master_ethtool_setup(dst->cpu_dp->master);
 }
 
 static int dsa_probe(struct platform_device *pdev)
 {
        int i;
 
-       dsa_master_ethtool_restore(dst->cpu_dp->netdev);
+       dsa_master_ethtool_restore(dst->cpu_dp->master);
 
-       dst->cpu_dp->netdev->dsa_ptr = NULL;
+       dst->cpu_dp->master->dsa_ptr = NULL;
 
        /* If we used a tagging format that doesn't have an ethertype
         * field, make sure that all packets from this point get sent
                        dsa_switch_destroy(ds);
        }
 
-       dev_put(dst->cpu_dp->netdev);
+       dev_put(dst->cpu_dp->master);
 }
 
 static int dsa_remove(struct platform_device *pdev)
 
 int dsa_slave_create(struct dsa_port *port, const char *name)
 {
        struct dsa_port *cpu_dp = port->cpu_dp;
-       struct net_device *master = cpu_dp->netdev;
+       struct net_device *master = cpu_dp->master;
        struct dsa_switch *ds = port->ds;
        struct net_device *slave_dev;
        struct dsa_slave_priv *p;
        p->old_link = -1;
        p->old_duplex = -1;
 
-       port->netdev = slave_dev;
+       port->slave = slave_dev;
 
        netif_carrier_off(slave_dev);
 
 out_free:
        free_percpu(p->stats64);
        free_netdev(slave_dev);
-       port->netdev = NULL;
+       port->slave = NULL;
        return ret;
 }