return -ETIMEDOUT;
 }
 
-static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
+static int mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
 {
-       int err;
-
-       if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
-               port = (port + 1) << 5;
-
-       /* Snapshot the hardware statistics counters for this port. */
-       err = mv88e6xxx_g1_write(chip, GLOBAL_STATS_OP,
-                                GLOBAL_STATS_OP_CAPTURE_PORT |
-                                GLOBAL_STATS_OP_HIST_RX_TX | port);
-       if (err)
-               return err;
+       if (!chip->info->ops->stats_snapshot)
+               return -EOPNOTSUPP;
 
-       /* Wait for the snapshotting to complete. */
-       return _mv88e6xxx_stats_wait(chip);
+       return chip->info->ops->stats_snapshot(chip, port);
 }
 
 static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
 
        mutex_lock(&chip->reg_lock);
 
-       ret = _mv88e6xxx_stats_snapshot(chip, port);
+       ret = mv88e6xxx_stats_snapshot(chip, port);
        if (ret < 0) {
                mutex_unlock(&chip->reg_lock);
                return;
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6095_ops = {
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6123_ops = {
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6131_ops = {
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6161_ops = {
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6165_ops = {
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6171_ops = {
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6172_ops = {
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
        .port_set_speed = mv88e6352_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6175_ops = {
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6176_ops = {
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
        .port_set_speed = mv88e6352_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6185_ops = {
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6xxx_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6190_ops = {
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
        .port_set_speed = mv88e6352_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6290_ops = {
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6321_ops = {
        .port_set_link = mv88e6xxx_port_set_link,
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6350_ops = {
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6351_ops = {
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
        .port_set_speed = mv88e6185_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6352_ops = {
        .port_set_duplex = mv88e6xxx_port_set_duplex,
        .port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
        .port_set_speed = mv88e6352_port_set_speed,
+       .stats_snapshot = mv88e6320_g1_stats_snapshot,
 };
 
 static const struct mv88e6xxx_ops mv88e6390_ops = {