netdev_err(ds->ports[port].netdev, "failed to flush ATU\n");
 }
 
-static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
-                                       struct mv88e6xxx_vtu_entry *entry,
-                                       unsigned int nibble_offset)
-{
-       u16 regs[3];
-       int i, err;
-
-       for (i = 0; i < 3; ++i) {
-               u16 *reg = ®s[i];
-
-               err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_DATA_0_3 + i, reg);
-               if (err)
-                       return err;
-       }
-
-       for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
-               unsigned int shift = (i % 4) * 4 + nibble_offset;
-               u16 reg = regs[i / 4];
-
-               entry->state[i] = (reg >> shift) & GLOBAL_VTU_STU_DATA_MASK;
-       }
-
-       return 0;
-}
-
-static int mv88e6xxx_vtu_data_read(struct mv88e6xxx_chip *chip,
-                                  struct mv88e6xxx_vtu_entry *entry)
-{
-       return _mv88e6xxx_vtu_stu_data_read(chip, entry, 0);
-}
-
-static int mv88e6xxx_stu_data_read(struct mv88e6xxx_chip *chip,
-                                  struct mv88e6xxx_vtu_entry *entry)
-{
-       return _mv88e6xxx_vtu_stu_data_read(chip, entry, 2);
-}
-
-static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
-                                        struct mv88e6xxx_vtu_entry *entry,
-                                        unsigned int nibble_offset)
-{
-       u16 regs[3] = { 0 };
-       int i, err;
-
-       for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
-               unsigned int shift = (i % 4) * 4 + nibble_offset;
-               u8 data = entry->state[i];
-
-               regs[i / 4] |= (data & GLOBAL_VTU_STU_DATA_MASK) << shift;
-       }
-
-       for (i = 0; i < 3; ++i) {
-               u16 reg = regs[i];
-
-               err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_DATA_0_3 + i, reg);
-               if (err)
-                       return err;
-       }
-
-       return 0;
-}
-
-static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
-                                   struct mv88e6xxx_vtu_entry *entry)
-{
-       return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
-}
-
-static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
-                                   struct mv88e6xxx_vtu_entry *entry)
-{
-       return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
-}
-
 static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
                                  struct mv88e6xxx_vtu_entry *entry)
 {
                return err;
 
        if (next.valid) {
-               err = mv88e6xxx_vtu_data_read(chip, &next);
-               if (err)
-                       return err;
-
                if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G1_VTU_FID)) {
                        err = mv88e6xxx_g1_vtu_fid_read(chip, &next);
                        if (err)
                        if (err)
                                return err;
                }
+
+               err = mv88e6185_g1_vtu_data_read(chip, &next);
+               if (err)
+                       return err;
        }
 
        *entry = next;
                goto loadpurge;
 
        /* Write port member tags */
-       err = mv88e6xxx_vtu_data_write(chip, entry);
+       err = mv88e6185_g1_vtu_data_write(chip, entry);
        if (err)
                return err;
 
                return err;
 
        if (next.valid) {
-               err = mv88e6xxx_stu_data_read(chip, &next);
+               err = mv88e6185_g1_vtu_data_read(chip, &next);
                if (err)
                        return err;
        }
                goto loadpurge;
 
        /* Write port states */
-       err = mv88e6xxx_stu_data_write(chip, entry);
+       err = mv88e6185_g1_vtu_data_write(chip, entry);
        if (err)
                return err;
 loadpurge:
 
                              struct mv88e6xxx_vtu_entry *entry);
 int mv88e6xxx_g1_vtu_vid_write(struct mv88e6xxx_chip *chip,
                               struct mv88e6xxx_vtu_entry *entry);
+int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
+                              struct mv88e6xxx_vtu_entry *entry);
+int mv88e6185_g1_vtu_data_write(struct mv88e6xxx_chip *chip,
+                               struct mv88e6xxx_vtu_entry *entry);
 int mv88e6xxx_g1_vtu_op_wait(struct mv88e6xxx_chip *chip);
 int mv88e6xxx_g1_vtu_op(struct mv88e6xxx_chip *chip, u16 op);
 int mv88e6xxx_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
 
        return mv88e6xxx_g1_write(chip, GLOBAL_VTU_VID, val);
 }
 
+/* Offset 0x07: VTU/STU Data Register 1
+ * Offset 0x08: VTU/STU Data Register 2
+ * Offset 0x09: VTU/STU Data Register 3
+ */
+
+int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
+                              struct mv88e6xxx_vtu_entry *entry)
+{
+       u16 regs[3];
+       int i;
+
+       /* Read all 3 VTU/STU Data registers */
+       for (i = 0; i < 3; ++i) {
+               u16 *reg = ®s[i];
+               int err;
+
+               err = mv88e6xxx_g1_read(chip, GLOBAL_VTU_DATA_0_3 + i, reg);
+               if (err)
+                       return err;
+       }
+
+       /* Extract MemberTag and PortState data */
+       for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
+               unsigned int member_offset = (i % 4) * 4;
+               unsigned int state_offset = member_offset + 2;
+
+               entry->member[i] = (regs[i / 4] >> member_offset) & 0x3;
+               entry->state[i] = (regs[i / 4] >> state_offset) & 0x3;
+       }
+
+       return 0;
+}
+
+int mv88e6185_g1_vtu_data_write(struct mv88e6xxx_chip *chip,
+                               struct mv88e6xxx_vtu_entry *entry)
+{
+       u16 regs[3] = { 0 };
+       int i;
+
+       /* Insert MemberTag and PortState data */
+       for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
+               unsigned int member_offset = (i % 4) * 4;
+               unsigned int state_offset = member_offset + 2;
+
+               regs[i / 4] |= (entry->member[i] & 0x3) << member_offset;
+               regs[i / 4] |= (entry->state[i] & 0x3) << state_offset;
+       }
+
+       /* Write all 3 VTU/STU Data registers */
+       for (i = 0; i < 3; ++i) {
+               u16 reg = regs[i];
+               int err;
+
+               err = mv88e6xxx_g1_write(chip, GLOBAL_VTU_DATA_0_3 + i, reg);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
 /* VLAN Translation Unit Operations */
 
 int mv88e6xxx_g1_vtu_getnext(struct mv88e6xxx_chip *chip,