Reported by the following Smatch static checker warning: drivers/net/dsa/yt921x.c:702 yt921x_read_mib() warn: was expecting a 64 bit value instead of '(~0)' Fixes: 186623f4aa72 ("net: dsa: yt921x: Add support for Motorcomm YT921x") Reported-by: Dan Carpenter Closes: https://lore.kernel.org/netdev/aPsjYKQMzpY0nSXm@stanley.mountain/ Suggested-by: David Laight Signed-off-by: David Yang --- v6: https://lore.kernel.org/r/20260118013019.1078847-1-mmyangfl@gmail.com - send only the first patch targeting net tree v5: https://lore.kernel.org/r/20260114114745.213252-1-mmyangfl@gmail.com - avoid type casting - split patches v4: https://lore.kernel.org/r/20260108004309.4087448-1-mmyangfl@gmail.com - add missing u64_stats_init v3: https://lore.kernel.org/r/20260105020905.3522484-1-mmyangfl@gmail.com - use u64_stats_t - fix calculations of rx_frames/tx_frames v2: https://lore.kernel.org/r/20251025171314.1939608-1-mmyangfl@gmail.com - run tests and fix MIB parsing in 510026a39849 - no major changes between versions v1: https://lore.kernel.org/r/20251024084918.1353031-1-mmyangfl@gmail.com - take suggestion from David Laight - protect MIB stats with a lock drivers/net/dsa/yt921x.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/net/dsa/yt921x.c b/drivers/net/dsa/yt921x.c index 1c511f5dc6ab..7b8c1549a0fb 100644 --- a/drivers/net/dsa/yt921x.c +++ b/drivers/net/dsa/yt921x.c @@ -682,21 +682,22 @@ static int yt921x_read_mib(struct yt921x_priv *priv, int port) const struct yt921x_mib_desc *desc = &yt921x_mib_descs[i]; u32 reg = YT921X_MIBn_DATA0(port) + desc->offset; u64 *valp = &((u64 *)mib)[i]; - u64 val = *valp; u32 val0; - u32 val1; + u64 val; res = yt921x_reg_read(priv, reg, &val0); if (res) break; if (desc->size <= 1) { - if (val < (u32)val) - /* overflow */ - val += (u64)U32_MAX + 1; - val &= ~U32_MAX; - val |= val0; + u64 old_val = *valp; + + val = (old_val & ~(u64)U32_MAX) | val0; + if (val < old_val) + val += 1ull << 32; } else { + u32 val1; + res = yt921x_reg_read(priv, reg + 4, &val1); if (res) break; -- 2.51.0