}
 
 static int mv88e6xxx_port_vlan_join(struct mv88e6xxx_chip *chip, int port,
-                                   u16 vid, u8 member)
+                                   u16 vid, u8 member, bool warn)
 {
        const u8 non_member = MV88E6XXX_G1_VTU_DATA_MEMBER_TAG_NON_MEMBER;
        struct mv88e6xxx_vtu_entry vlan;
                err = mv88e6xxx_vtu_loadpurge(chip, &vlan);
                if (err)
                        return err;
-       } else {
+       } else if (warn) {
                dev_info(chip->dev, "p%d: already a member of VLAN %d\n",
                         port, vid);
        }
        struct mv88e6xxx_chip *chip = ds->priv;
        bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
        bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
+       bool warn;
        u8 member;
        u16 vid;
 
        else
                member = MV88E6XXX_G1_VTU_DATA_MEMBER_TAG_TAGGED;
 
+       /* net/dsa/slave.c will call dsa_port_vlan_add() for the affected port
+        * and then the CPU port. Do not warn for duplicates for the CPU port.
+        */
+       warn = !dsa_is_cpu_port(ds, port) && !dsa_is_dsa_port(ds, port);
+
        mv88e6xxx_reg_lock(chip);
 
        for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
-               if (mv88e6xxx_port_vlan_join(chip, port, vid, member))
+               if (mv88e6xxx_port_vlan_join(chip, port, vid, member, warn))
                        dev_err(ds->dev, "p%d: failed to add VLAN %d%c\n", port,
                                vid, untagged ? 'u' : 't');