return err;
 }
 
-static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
-{
-       return chip->info->family == MV88E6XXX_FAMILY_6095;
-}
-
 static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
 {
        return chip->info->family == MV88E6XXX_FAMILY_6097;
        return chip->info->family == MV88E6XXX_FAMILY_6165;
 }
 
-static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
-{
-       return chip->info->family == MV88E6XXX_FAMILY_6185;
-}
-
 static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
 {
        return chip->info->family == MV88E6XXX_FAMILY_6320;
         * received packets as usual, disable ARP mirroring and don't send a
         * copy of all transmitted/received frames on this port to the CPU.
         */
-       reg = 0;
-       if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
-           mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
-           mv88e6xxx_6095_family(chip) || mv88e6xxx_6320_family(chip) ||
-           mv88e6xxx_6185_family(chip) || mv88e6xxx_6341_family(chip))
-               reg = PORT_CONTROL_2_MAP_DA;
-
-       if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip)) {
-               /* Set the upstream port this port should use */
-               reg |= dsa_upstream_port(ds);
-               /* enable forwarding of unknown multicast addresses to
-                * the upstream port
-                */
-               if (port == dsa_upstream_port(ds))
-                       reg |= PORT_CONTROL_2_FORWARD_UNKNOWN;
-       }
-
-       reg |= PORT_CONTROL_2_8021Q_DISABLED;
+       err = mv88e6xxx_port_set_map_da(chip, port);
+       if (err)
+               return err;
 
-       if (reg) {
-               err = mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
+       reg = 0;
+       if (chip->info->ops->port_set_upstream_port) {
+               err = chip->info->ops->port_set_upstream_port(
+                       chip, port, dsa_upstream_port(ds));
                if (err)
                        return err;
        }
 
+       err = mv88e6xxx_port_set_8021q_mode(chip, port,
+                                           PORT_CONTROL_2_8021Q_DISABLED);
+       if (err)
+               return err;
+
        if (chip->info->ops->port_jumbo_config) {
                err = chip->info->ops->port_jumbo_config(chip, port);
                if (err)
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
        .port_set_frame_mode = mv88e6085_port_set_frame_mode,
-       .port_set_egress_unknowns = mv88e6085_port_set_egress_unknowns,
+       .port_set_egress_unknowns = mv88e6095_port_set_egress_unknowns,
+       .port_set_upstream_port = mv88e6095_port_set_upstream_port,
        .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
        .stats_get_sset_count = mv88e6095_stats_get_sset_count,
        .stats_get_strings = mv88e6095_stats_get_strings,
        .port_set_speed = mv88e6185_port_set_speed,
        .port_tag_remap = mv88e6095_port_tag_remap,
        .port_set_frame_mode = mv88e6351_port_set_frame_mode,
-       .port_set_egress_unknowns = mv88e6351_port_set_egress_unknowns,
+       .port_set_egress_unknowns = mv88e6095_port_set_egress_unknowns,
        .port_set_ether_type = mv88e6351_port_set_ether_type,
+       .port_set_upstream_port = mv88e6095_port_set_upstream_port,
        .port_jumbo_config = mv88e6165_port_jumbo_config,
        .port_egress_rate_limiting = mv88e6097_port_egress_rate_limiting,
        .port_pause_config = mv88e6097_port_pause_config,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
        .port_set_frame_mode = mv88e6085_port_set_frame_mode,
-       .port_set_egress_unknowns = mv88e6085_port_set_egress_unknowns,
+       .port_set_egress_unknowns = mv88e6095_port_set_egress_unknowns,
        .port_egress_rate_limiting = mv88e6095_port_egress_rate_limiting,
+       .port_set_upstream_port = mv88e6095_port_set_upstream_port,
        .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
        .stats_get_sset_count = mv88e6095_stats_get_sset_count,
        .stats_get_strings = mv88e6095_stats_get_strings,
 
        [PORT_CONTROL_2_8021Q_SECURE] = "Secure",
 };
 
+int mv88e6095_port_set_egress_unknowns(struct mv88e6xxx_chip *chip, int port,
+                                      bool on)
+{
+       int err;
+       u16 reg;
+
+       err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, ®);
+       if (err)
+               return err;
+
+       if (on)
+               reg |= PORT_CONTROL_2_FORWARD_UNKNOWN;
+       else
+               reg &= ~PORT_CONTROL_2_FORWARD_UNKNOWN;
+
+       return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
+}
+
+int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
+                                    int upstream_port)
+{
+       int err;
+       u16 reg;
+
+       err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, ®);
+       if (err)
+               return err;
+
+       reg &= ~PORT_CONTROL_2_UPSTREAM_MASK;
+       reg |= upstream_port;
+
+       return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
+}
+
 int mv88e6xxx_port_set_8021q_mode(struct mv88e6xxx_chip *chip, int port,
                                  u16 mode)
 {
        return 0;
 }
 
+int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port)
+{
+       u16 reg;
+       int err;
+
+       err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, ®);
+       if (err)
+               return err;
+
+       reg |= PORT_CONTROL_2_MAP_DA;
+
+       return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
+}
+
 int mv88e6165_port_jumbo_config(struct mv88e6xxx_chip *chip, int port)
 {
        u16 reg;
 
                                  enum mv88e6xxx_frame_mode mode);
 int mv88e6085_port_set_egress_unknowns(struct mv88e6xxx_chip *chip, int port,
                                       bool on);
+int mv88e6095_port_set_egress_unknowns(struct mv88e6xxx_chip *chip, int port,
+                                      bool on);
 int mv88e6351_port_set_egress_unknowns(struct mv88e6xxx_chip *chip, int port,
                                       bool on);
 int mv88e6351_port_set_ether_type(struct mv88e6xxx_chip *chip, int port,
 int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
                              phy_interface_t mode);
 int mv88e6xxx_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode);
-
+int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port);
+int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
+                                    int upstream_port);
 #endif /* _MV88E6XXX_PORT_H */