static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
                                        u16 vid)
 {
+       struct dsa_port *dp = dsa_to_port(ds, port), *other_dp;
        struct mv88e6xxx_chip *chip = ds->priv;
        struct mv88e6xxx_vtu_entry vlan;
-       int i, err;
+       int err;
 
        /* DSA and CPU ports have to be members of multiple vlans */
-       if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port))
+       if (dsa_port_is_dsa(dp) || dsa_port_is_cpu(dp))
                return 0;
 
        err = mv88e6xxx_vtu_get(chip, vid, &vlan);
        if (!vlan.valid)
                return 0;
 
-       for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
-               if (dsa_is_dsa_port(ds, i) || dsa_is_cpu_port(ds, i))
-                       continue;
-
-               if (!dsa_to_port(ds, i)->slave)
-                       continue;
-
-               if (vlan.member[i] ==
+       dsa_switch_for_each_user_port(other_dp, ds) {
+               if (vlan.member[other_dp->index] ==
                    MV88E6XXX_G1_VTU_DATA_MEMBER_TAG_NON_MEMBER)
                        continue;
 
-               if (dsa_to_port(ds, i)->bridge_dev ==
-                   dsa_to_port(ds, port)->bridge_dev)
+               if (dp->bridge_dev == other_dp->bridge_dev)
                        break; /* same bridge, check next VLAN */
 
-               if (!dsa_to_port(ds, i)->bridge_dev)
+               if (!other_dp->bridge_dev)
                        continue;
 
                dev_err(ds->dev, "p%d: hw VLAN %d already used by port %d in %s\n",
-                       port, vlan.vid, i,
-                       netdev_name(dsa_to_port(ds, i)->bridge_dev));
+                       port, vlan.vid, other_dp->index,
+                       netdev_name(other_dp->bridge_dev));
                return -EOPNOTSUPP;
        }