From: Lang Cheng <chenglang@xxxxxxxxxx> GCC may reports an running time assert error when a value calculated from ib_mtu_enum_to_int() is using as 'val' in FIELD_PREDP: include/linux/compiler_types.h:328:38: error: call to '__compiletime_assert_1524' declared with attribute error: FIELD_PREP: value too large for the field But actually this error will still exists even if the driver can ensure that ib_mtu_enum_to_int() returns a legal value. So add a mask in hr_reg_write() to avoid above warning. Also fix complains from sparse about "dubious: x & !y" when hr_reg_write(ctx, field, !!val),Use temporary variables to avoid this. Reported-by: kernel test robot <lkp@xxxxxxxxx> Signed-off-by: Lang Cheng <chenglang@xxxxxxxxxx> Signed-off-by: Weihang Li <liweihang@xxxxxxxxxx> --- drivers/infiniband/hw/hns/hns_roce_common.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_common.h b/drivers/infiniband/hw/hns/hns_roce_common.h index 3a5658f..dc7a9fe 100644 --- a/drivers/infiniband/hw/hns/hns_roce_common.h +++ b/drivers/infiniband/hw/hns/hns_roce_common.h @@ -79,9 +79,11 @@ #define _hr_reg_write(ptr, field_type, field_h, field_l, val) \ ({ \ + u32 _val = val; \ _hr_reg_clear(ptr, field_type, field_h, field_l); \ - *((__le32 *)ptr + (field_h) / 32) |= cpu_to_le32(FIELD_PREP( \ - GENMASK((field_h) % 32, (field_l) % 32), val)); \ + *((__le32 *)ptr + (field_h) / 32) |= cpu_to_le32( \ + FIELD_PREP(GENMASK((field_h) % 32, (field_l) % 32), \ + _val & GENMASK((field_h) - (field_l), 0))); \ }) #define hr_reg_write(ptr, field, val) _hr_reg_write(ptr, field, val) -- 2.7.4