On Mon, 2019-08-12 at 16:33 +0200, Andrew Lunn wrote: > [External] > > > +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.
Apologies for forgetting to address this. I did not intentionally leave it out; this item got lost after V1 [which had the most remarks]. Changelog V1 -> V2 was quite bulky, and I did not look at V1 remarks after I finished V2. Thanks for snippet. > > 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