> +static int adin_read_mmd_stat_regs(struct phy_device *phydev, > + struct adin_hw_stat *stat, > + u32 *val) > +{ > + int ret; > + > + ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg1); > + if (ret < 0) > + return ret; > + > + *val = (ret & 0xffff); > + > + if (stat->reg2 == 0) > + return 0; > + > + ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg2); > + if (ret < 0) > + return ret; > + > + *val <<= 16; > + *val |= (ret & 0xffff); > + > + return 0; > +} It still looks like you have not dealt with overflow from the LSB into the MSB between the two reads. do { hi1 = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg2); if (hi1 < 0) return hi1; low = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg1); if (low < 0) return low; hi2 = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg2); if (hi2 < 0) return hi1; } while (hi1 != hi2) return low | (hi << 16); Andrew