wifi: rtlwifi: avoid stack size warning for _read_eeprom_info
PATCH 1/1 wifi: rtlwifi: avoid stack size warning for _read_eeprom_info
From: Arnd Bergmann <[email protected]>
txpower_info_{2g,5g} are too big to fit on the stack, but in most of the rtlwifi variants this stays below the warning limit for stack frames. In rtl8192ee and a few others, I see a case where clang decides to fully inline this into rtl92ee_read_eeprom_info, triggering this warning:
drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c:2178:6: error: stack frame size (1312) exceeds limit (1280) in 'rtl92ee_read_eeprom_info' [-Werror,-Wframe-larger-than]
Mark _rtl92ee_read_txpower_info_from_hwpg() as noinline_for_stack to and mark _rtl92ee_get_chnl_group() as __always_inline to make clang behave the same way as gcc. Inlining _rtl92ee_get_chnl_group helps let the compiler see that the index is always in range. The same change appears to be necessary in all rtlwifi variants.
A more thorough approach would be to avoid the use of the two structures on the stack entirely and combine them with the struct rtl_efuse data that is dynamically allocated and holds the same information.
--- drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c | 6 +++--- drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c | 6 +++--- drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | 6 +++--- drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c | 7 ++++--- drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hw.c | 6 +++--- drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c | 6 +++--- drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 6 +++--- 7 files changed, 22 insertions(+), 21 deletions(-)
drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c +3 -3
@@ -1738,9 +1738,9 @@ static void read_power_value_fromprom(struct ieee80211_hw *hw, } } -static void _rtl88ee_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, -bool autoload_fail, -u8 *hwinfo) +static noinline_for_stack void +_rtl88ee_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, +bool autoload_fail,u8 *hwinfo) {struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_efuse *rtlefuse =rtl_efuse (rtl_priv (hw));
drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c +3 -3
@@ -1412,9 +1412,9 @@ void rtl92ce_update_interrupt_mask(struct ieee80211_hw *hw,rtl92ce_enable_interrupt (hw); } -static void _rtl92ce_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, -bool autoload_fail, -u8 *hwinfo) +static noinline_for_stack void +_rtl92ce_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, +bool autoload_fail,u8 *hwinfo) {struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_efuse *rtlefuse =rtl_efuse (rtl_priv (hw));
drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c +3 -3
@@ -95,9 +95,9 @@ static void _rtl92cu_phy_param_tab_init(struct ieee80211_hw *hw) } } -static void _rtl92cu_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, -bool autoload_fail, -u8 *hwinfo) +static noinline_for_stack void +_rtl92cu_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, +bool autoload_fail,u8 *hwinfo) {struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_efuse *rtlefuse =rtl_efuse (rtl_priv (hw));
drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c +4 -3
@@ -1731,7 +1731,7 @@ void rtl92ee_update_interrupt_mask(struct ieee80211_hw *hw,rtl92ee_enable_interrupt (hw); } -static u8 _rtl92ee_get_chnl_group (u8 chnl) +static __always_inline u8 _rtl92ee_get_chnl_group(u8 chnl) {u8 group =0 ;
@@ -2009,8 +2009,9 @@ static void _rtl8192ee_read_power_value_fromprom(struct ieee80211_hw *hw, } } -static void _rtl92ee_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, -bool autoload_fail,u8 *hwinfo) +static noinline_for_stack void +_rtl92ee_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, +bool autoload_fail,u8 *hwinfo) {struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_efuse *efu =rtl_efuse (rtl_priv (hw));
drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hw.c +3 -3
@@ -1381,9 +1381,9 @@ static u8 _rtl8723e_get_chnl_group(u8 chnl)return group; } -static void _rtl8723e_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, -bool autoload_fail, -u8 *hwinfo) +static noinline_for_stack void +_rtl8723e_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, +bool autoload_fail,u8 *hwinfo) {struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_efuse *rtlefuse =rtl_efuse (rtl_priv (hw));
drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c +3 -3
@@ -1935,9 +1935,9 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw, } } -static void _rtl8723be_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, -bool autoload_fail, -u8 *hwinfo) +static noinline_for_stack void +_rtl8723be_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, +bool autoload_fail,u8 *hwinfo) {struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_efuse *rtlefuse =rtl_efuse (rtl_priv (hw));
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c +3 -3
@@ -2782,9 +2782,9 @@ static void _rtl8812ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw, "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory); }#endif -static void _rtl8821ae_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, -bool autoload_fail, -u8 *hwinfo) +static noinline_for_stack void +_rtl8821ae_read_txpower_info_from_hwpg (struct ieee80211_hw *hw, +bool autoload_fail,u8 *hwinfo) {struct rtl_priv *rtlpriv =rtl_priv (hw);struct rtl_efuse *rtlefuse =rtl_efuse (rtl_priv (hw));
Signature · 1 line
2.39.5
Ping-Ke Shih
maintainerQuoted 15 lines · Arnd Bergmann
From: Arnd Bergmann <[email protected]>
txpower_info_{2g,5g} are too big to fit on the stack, but in most of the rtlwifi variants this stays below the warning limit for stack frames. In rtl8192ee and a few others, I see a case where clang decides to fully inline this into
rtl92ee_read_eeprom_info, triggering this warning:
drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c:2178:6: error: stack frame size (1312) exceeds limit (1280) in 'rtl92ee_read_eeprom_info' [-Werror,-Wframe-larger-than]Mark
_rtl92ee_read_txpower_info_from_hwpg()asnoinline_for_stackto and mark_rtl92ee_get_chnl_group()as__always_inlineto make clang behave the same way as gcc. Inlining_rtl92ee_get_chnl_grouphelps let the compiler see that the index is always in range. The same change appears to be necessary in all rtlwifi variants.
Quoted 5 lines
A more thorough approach would be to avoid the use of the two structures on the stack entirely and combine them with the struct
rtl_efusedata that is dynamically allocated and holds the same information.Signed-off-by Arnd Bergmann <[email protected]>
1 patch(es) applied to rtw-next branch of rtw.git, thanks.
2baacfe83346 wifi: rtlwifi: avoid stack size warning for _read_eeprom_info