Re: [PATCH] rtlwifi: fix error handling in *_read_adapter_info()

2016-05-30 Thread Larry Finger

On 05/30/2016 10:26 AM, Arnd Bergmann wrote:

There are nine copies of the _rtl88ee_read_adapter_info() function,
and most but not all of them cause a build warning in some configurations:

rtl8192de/hw.c: In function '_rtl92de_read_adapter_info':
rtl8192de/hw.c:1767:12: error: 'hwinfo' may be used uninitialized in this 
function [-Werror=maybe-uninitialized]
rtl8723ae/hw.c: In function '_rtl8723e_read_adapter_info.constprop':
rtlwifi/rtl8723ae/hw.c:1654:12: error: 'hwinfo' may be used uninitialized in 
this function [-Werror=maybe-uninitialized]

The problem is that when rtlefuse->epromtype is something other than
EEPROM_BOOT_EFUSE, the rest of the function uses undefined data, resulting
in random behavior later.

Apparently, in some drivers, the problem was already found and fixed
but the fix did not make it into the others.

This picks one approach to deal with the problem and applies identical
code to all 9 files, to simplify the later consolidation of those.

Signed-off-by: Arnd Bergmann 
---
  drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c | 12 +++-
  drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c | 17 -
  drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | 16 +++-
  drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c | 16 +++-
  drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c | 12 +++-
  drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.c | 20 ++--
  drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hw.c | 13 +
  drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c | 16 
  drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 15 +++
  9 files changed, 94 insertions(+), 43 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
index 8ee83b093c0d..e26a233684bb 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
@@ -1839,20 +1839,22 @@ static void _rtl88ee_read_adapter_info(struct 
ieee80211_hw *hw)
u8 hwinfo[HWSET_MAX_SIZE];
u16 eeprom_id;

-   if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+   switch (rtlefuse->epromtype) {
+   case EEPROM_BOOT_EFUSE:
rtl_efuse_shadow_map_update(hw);
+   break;

-   memcpy(hwinfo, >efuse_map[EFUSE_INIT_MAP][0],
-  HWSET_MAX_SIZE);
-   } else if (rtlefuse->epromtype == EEPROM_93C46) {
+   case EEPROM_93C46:
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 "RTL819X Not boot from eeprom, check it !!");
return;
-   } else {
+
+   default:
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 "boot from neither eeprom nor efuse, check it !!");
return;
}
+   memcpy(hwinfo, >efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);

RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
  hwinfo, HWSET_MAX_SIZE);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
index 04eb5c3f8464..58b7ac6899ef 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
@@ -1680,21 +1680,28 @@ static void _rtl92ce_read_adapter_info(struct 
ieee80211_hw *hw)
struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
+   struct device *dev = _pcipriv(hw)->dev.pdev->dev;
u16 i, usvalue;
u8 hwinfo[HWSET_MAX_SIZE];
u16 eeprom_id;

-   if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+   switch (rtlefuse->epromtype) {
+   case EEPROM_BOOT_EFUSE:
rtl_efuse_shadow_map_update(hw);
+   break;

-   memcpy((void *)hwinfo,
-  (void *)>efuse_map[EFUSE_INIT_MAP][0],
-  HWSET_MAX_SIZE);
-   } else if (rtlefuse->epromtype == EEPROM_93C46) {
+   case EEPROM_93C46:
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 "RTL819X Not boot from eeprom, check it !!");
+   return;
+
+   default:
+   dev_warn(dev, "no efuse data\n");
+   return;
}

+   memcpy(hwinfo, >efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
+
RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
  hwinfo, HWSET_MAX_SIZE);

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c
index 34ce06441d1b..ae1129f916d5 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c
@@ -351,15 +351,21 @@ static void _rtl92cu_read_adapter_info(struct 
ieee80211_hw 

[PATCH] rtlwifi: fix error handling in *_read_adapter_info()

2016-05-30 Thread Arnd Bergmann
There are nine copies of the _rtl88ee_read_adapter_info() function,
and most but not all of them cause a build warning in some configurations:

rtl8192de/hw.c: In function '_rtl92de_read_adapter_info':
rtl8192de/hw.c:1767:12: error: 'hwinfo' may be used uninitialized in this 
function [-Werror=maybe-uninitialized]
rtl8723ae/hw.c: In function '_rtl8723e_read_adapter_info.constprop':
rtlwifi/rtl8723ae/hw.c:1654:12: error: 'hwinfo' may be used uninitialized in 
this function [-Werror=maybe-uninitialized]

The problem is that when rtlefuse->epromtype is something other than
EEPROM_BOOT_EFUSE, the rest of the function uses undefined data, resulting
in random behavior later.

Apparently, in some drivers, the problem was already found and fixed
but the fix did not make it into the others.

This picks one approach to deal with the problem and applies identical
code to all 9 files, to simplify the later consolidation of those.

Signed-off-by: Arnd Bergmann 
---
 drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c | 12 +++-
 drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c | 17 -
 drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | 16 +++-
 drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c | 16 +++-
 drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c | 12 +++-
 drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.c | 20 ++--
 drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hw.c | 13 +
 drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c | 16 
 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 15 +++
 9 files changed, 94 insertions(+), 43 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
index 8ee83b093c0d..e26a233684bb 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
@@ -1839,20 +1839,22 @@ static void _rtl88ee_read_adapter_info(struct 
ieee80211_hw *hw)
u8 hwinfo[HWSET_MAX_SIZE];
u16 eeprom_id;
 
-   if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+   switch (rtlefuse->epromtype) {
+   case EEPROM_BOOT_EFUSE:
rtl_efuse_shadow_map_update(hw);
+   break;
 
-   memcpy(hwinfo, >efuse_map[EFUSE_INIT_MAP][0],
-  HWSET_MAX_SIZE);
-   } else if (rtlefuse->epromtype == EEPROM_93C46) {
+   case EEPROM_93C46:
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 "RTL819X Not boot from eeprom, check it !!");
return;
-   } else {
+
+   default:
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 "boot from neither eeprom nor efuse, check it !!");
return;
}
+   memcpy(hwinfo, >efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
 
RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
  hwinfo, HWSET_MAX_SIZE);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
index 04eb5c3f8464..58b7ac6899ef 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
@@ -1680,21 +1680,28 @@ static void _rtl92ce_read_adapter_info(struct 
ieee80211_hw *hw)
struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
+   struct device *dev = _pcipriv(hw)->dev.pdev->dev;
u16 i, usvalue;
u8 hwinfo[HWSET_MAX_SIZE];
u16 eeprom_id;
 
-   if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+   switch (rtlefuse->epromtype) {
+   case EEPROM_BOOT_EFUSE:
rtl_efuse_shadow_map_update(hw);
+   break;
 
-   memcpy((void *)hwinfo,
-  (void *)>efuse_map[EFUSE_INIT_MAP][0],
-  HWSET_MAX_SIZE);
-   } else if (rtlefuse->epromtype == EEPROM_93C46) {
+   case EEPROM_93C46:
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 "RTL819X Not boot from eeprom, check it !!");
+   return;
+
+   default:
+   dev_warn(dev, "no efuse data\n");
+   return;
}
 
+   memcpy(hwinfo, >efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
+
RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
  hwinfo, HWSET_MAX_SIZE);
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c
index 34ce06441d1b..ae1129f916d5 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c
@@ -351,15 +351,21 @@ static void _rtl92cu_read_adapter_info(struct 
ieee80211_hw *hw)
u8 hwinfo[HWSET_MAX_SIZE] = {0};