pvlan = 0;
 
-       /* Frames from user ports can egress any local DSA links and CPU ports,
-        * as well as any local member of their bridge group.
+       /* Frames from standalone user ports can only egress on the
+        * upstream port.
+        */
+       if (!dsa_port_bridge_dev_get(dp))
+               return BIT(dsa_switch_upstream_port(ds));
+
+       /* Frames from bridged user ports can egress any local DSA
+        * links and CPU ports, as well as any local member of their
+        * bridge group.
         */
        dsa_switch_for_each_port(other_dp, ds)
                if (other_dp->type == DSA_PORT_TYPE_CPU ||
        if (err)
                goto unlock;
 
+       err = mv88e6xxx_port_set_map_da(chip, port, true);
+       if (err)
+               return err;
+
        err = mv88e6xxx_port_commit_pvid(chip, port);
        if (err)
                goto unlock;
            mv88e6xxx_port_vlan_map(chip, port))
                dev_err(ds->dev, "failed to remap in-chip Port VLAN\n");
 
+       err = mv88e6xxx_port_set_map_da(chip, port, false);
+       if (err)
+               dev_err(ds->dev,
+                       "port %d failed to restore map-DA: %pe\n",
+                       port, ERR_PTR(err));
+
        err = mv88e6xxx_port_commit_pvid(chip, port);
        if (err)
                dev_err(ds->dev,
                return err;
 
        /* Port Control 2: don't force a good FCS, set the MTU size to
-        * 10222 bytes, disable 802.1q tags checking, don't discard tagged or
-        * untagged frames on this port, do a destination address lookup on all
-        * received packets as usual, disable ARP mirroring and don't send a
-        * copy of all transmitted/received frames on this port to the CPU.
+        * 10222 bytes, disable 802.1q tags checking, don't discard
+        * tagged or untagged frames on this port, skip destination
+        * address lookup on user ports, disable ARP mirroring and don't
+        * send a copy of all transmitted/received frames on this port
+        * to the CPU.
         */
-       err = mv88e6xxx_port_set_map_da(chip, port);
+       err = mv88e6xxx_port_set_map_da(chip, port, !dsa_is_user_port(ds, port));
        if (err)
                return err;
 
 
        return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, new);
 }
 
-int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port)
+int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port, bool map)
 {
        u16 reg;
        int err;
        if (err)
                return err;
 
-       reg |= MV88E6XXX_PORT_CTL2_MAP_DA;
+       if (map)
+               reg |= MV88E6XXX_PORT_CTL2_MAP_DA;
+       else
+               reg &= ~MV88E6XXX_PORT_CTL2_MAP_DA;
 
        return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
 }
 
 int mv88e6352_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode);
 int mv88e6xxx_port_drop_untagged(struct mv88e6xxx_chip *chip, int port,
                                 bool drop_untagged);
-int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port);
+int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port, bool map);
 int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
                                     int upstream_port);
 int mv88e6xxx_port_set_mirror(struct mv88e6xxx_chip *chip, int port,
 
        return port == dsa_upstream_port(ds, port);
 }
 
+/* Return the local port used to reach the CPU port */
+static inline unsigned int dsa_switch_upstream_port(struct dsa_switch *ds)
+{
+       struct dsa_port *dp;
+
+       dsa_switch_for_each_available_port(dp, ds) {
+               return dsa_upstream_port(ds, dp->index);
+       }
+
+       return ds->num_ports;
+}
+
 /* Return true if @upstream_ds is an upstream switch of @downstream_ds, meaning
  * that the routing port from @downstream_ds to @upstream_ds is also the port
  * which @downstream_ds uses to reach its dedicated CPU.