Message ID | 20250612130719.3878754-1-anders.roxell@linaro.org |
---|---|
State | New |
Headers | show |
Series | wifi: iwlwifi: pcie: ensure RX_QUEUE_CB_SIZE fits bitfield for gcc-8|9 | expand |
On Thu, Jun 12, 2025 at 03:07:19PM +0200, Anders Roxell wrote: > 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@linaro.org> > Closes: https://lore.kernel.org/all/CA+G9fYssasMnOE36xLH5m7ky4fKxbzN7kX5mEE7icnuu+0hGuQ@mail.gmail.com/ > Signed-off-by: Anders Roxell <anders.roxell@linaro.org> Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org> regards, dan carpenter
> > Would it help if I indent like this? Yeah, maybe? I actually misread it and thought the & went outside FIELD_PREP() ... > diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c > index cb36baac14da..5bb81ed7db79 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)); Also now that I think more about it, this really just adds the part with the masking ("& FIELD_MAX()"), is it even necessary to use FIELD_PREP() rather than u32_encode_bits()? johannes
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);
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@linaro.org> Closes: https://lore.kernel.org/all/CA+G9fYssasMnOE36xLH5m7ky4fKxbzN7kX5mEE7icnuu+0hGuQ@mail.gmail.com/ Signed-off-by: Anders Roxell <anders.roxell@linaro.org> --- drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)