GCC-8 and GCC-9 emits a hard error when the value passed to `u32_encode_bits()`. These versions somehow think that RX_QUEUE_CB_SIZE(iwl_trans_get_num_rbds(trans)) is an out of bounds constant. Open code this calculation using FIELD_PREP() to avoid this compile error. error: call to '__field_overflow' declared with attribute error: value doesn't fit into mask Fixes: b8eee90f0ba5 ("wifi: iwlwifi: cfg: unify num_rbds config") Reported-by: Linux Kernel Functional Testing <lkft@xxxxxxxxxx> Closes: https://lore.kernel.org/all/CA+G9fYssasMnOE36xLH5m7ky4fKxbzN7kX5mEE7icnuu+0hGuQ@xxxxxxxxxxxxxx/ Signed-off-by: Anders Roxell <anders.roxell@xxxxxxxxxx> --- drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c index cb36baac14da..1854d071aff2 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c @@ -204,9 +204,10 @@ int iwl_pcie_ctxt_info_init(struct iwl_trans *trans, WARN_ON(RX_QUEUE_CB_SIZE(iwl_trans_get_num_rbds(trans)) > 12); control_flags = IWL_CTXT_INFO_TFD_FORMAT_LONG; - control_flags |= - u32_encode_bits(RX_QUEUE_CB_SIZE(iwl_trans_get_num_rbds(trans)), - IWL_CTXT_INFO_RB_CB_SIZE); + /* This should just be u32_encode_bits() but gcc-8 and gcc-9 fail to build */ + control_flags |= FIELD_PREP(IWL_CTXT_INFO_RB_CB_SIZE, + RX_QUEUE_CB_SIZE(iwl_trans_get_num_rbds(trans)) & + FIELD_MAX(IWL_CTXT_INFO_RB_CB_SIZE)); control_flags |= u32_encode_bits(rb_size, IWL_CTXT_INFO_RB_SIZE); ctxt_info->control.control_flags = cpu_to_le32(control_flags); -- 2.47.2