]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rtlwifi: fix error handling in *_read_adapter_info()
authorArnd Bergmann <arnd@arndb.de>
Mon, 30 May 2016 15:26:16 +0000 (17:26 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 16 Jun 2016 15:13:33 +0000 (18:13 +0300)
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 <arnd@arndb.de>
Acked-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c
drivers/net/wireless/realtek/rtlwifi/rtl8192de/hw.c
drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c
drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.c
drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hw.c
drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c

index 8ee83b093c0df4c2cca7e3368bdf46794980ec96..e26a233684bb89ff78931a30b9ba3e4a3c60f962 100644 (file)
@@ -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, &rtlefuse->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, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
 
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
                      hwinfo, HWSET_MAX_SIZE);
index 04eb5c3f84640d4702402fc7d1dfeeb79f790c32..58b7ac6899ef180598711ddd3523f2999eddc4d5 100644 (file)
@@ -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 = &rtl_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 *)&rtlefuse->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, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
+
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
                      hwinfo, HWSET_MAX_SIZE);
 
index 34ce06441d1b625ebacb2cd74641ffc95f820bb4..ae1129f916d58ea05ec565641d074491c08fce30 100644 (file)
@@ -351,15 +351,21 @@ static void _rtl92cu_read_adapter_info(struct ieee80211_hw *hw)
        u8 hwinfo[HWSET_MAX_SIZE] = {0};
        u16 eeprom_id;
 
-       if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+       switch (rtlefuse->epromtype) {
+       case EEPROM_BOOT_EFUSE:
                rtl_efuse_shadow_map_update(hw);
-               memcpy((void *)hwinfo,
-                      (void *)&rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
-                      HWSET_MAX_SIZE);
-       } else if (rtlefuse->epromtype == EEPROM_93C46) {
+               break;
+
+       case EEPROM_93C46:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
                         "RTL819X Not boot from eeprom, check it !!\n");
+               return;
+
+       default:
+               pr_warn("rtl92cu: no efuse data\n\n");
+               return;
        }
+       memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD, "MAP",
                      hwinfo, HWSET_MAX_SIZE);
        eeprom_id = le16_to_cpu(*((__le16 *)&hwinfo[0]));
index f49b60d314502d7565eea0badb7666b8e5e76a55..8618c322a3f8b029180cd3cc1a02292f604f31e3 100644 (file)
@@ -1744,23 +1744,29 @@ static void _rtl92de_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 = &rtl_pcipriv(hw)->dev.pdev->dev;
        u16 i, usvalue;
        u8 hwinfo[HWSET_MAX_SIZE];
        u16 eeprom_id;
        unsigned long flags;
 
-       if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+       switch (rtlefuse->epromtype) {
+       case EEPROM_BOOT_EFUSE:
                spin_lock_irqsave(&globalmutex_for_power_and_efuse, flags);
                rtl_efuse_shadow_map_update(hw);
                _rtl92de_efuse_update_chip_version(hw);
                spin_unlock_irqrestore(&globalmutex_for_power_and_efuse, flags);
-               memcpy((void *)hwinfo, (void *)&rtlefuse->efuse_map
-                      [EFUSE_INIT_MAP][0],
-                      HWSET_MAX_SIZE);
-       } else if (rtlefuse->epromtype == EEPROM_93C46) {
+               break;
+       case EEPROM_93C46:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
                         "RTL819X Not boot from eeprom, check it !!\n");
+               return;
+       default:
+               dev_warn(dev, "no efuse data\n");
+               return;
        }
+
+       memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
                      hwinfo, HWSET_MAX_SIZE);
 
index 9fd3f1b6e4a8852ca97844098dfdd62c24f8d5c0..28c260dd11ea865b6bba2ae559f2140dc086d6c9 100644 (file)
@@ -2102,20 +2102,22 @@ static void _rtl92ee_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, &rtlefuse->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, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
 
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
                      hwinfo, HWSET_MAX_SIZE);
index 12b0978ba4faf26161e57f34d61644149544fa9d..442f2b68ee58828c0fc189179968609483c5e416 100644 (file)
@@ -1673,23 +1673,31 @@ static void _rtl92se_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_phy *rtlphy = &(rtlpriv->phy);
+       struct device *dev = &rtl_pcipriv(hw)->dev.pdev->dev;
        u16 i, usvalue;
        u16     eeprom_id;
        u8 tempval;
        u8 hwinfo[HWSET_MAX_SIZE_92S];
        u8 rf_path, index;
 
-       if (rtlefuse->epromtype == EEPROM_93C46) {
+       switch (rtlefuse->epromtype) {
+       case EEPROM_BOOT_EFUSE:
+               rtl_efuse_shadow_map_update(hw);
+               break;
+
+       case EEPROM_93C46:
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
                         "RTL819X Not boot from eeprom, check it !!\n");
-       } else if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
-               rtl_efuse_shadow_map_update(hw);
+               return;
 
-               memcpy((void *)hwinfo, (void *)
-                       &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
-                       HWSET_MAX_SIZE_92S);
+       default:
+               dev_warn(dev, "no efuse data\n");
+               return;
        }
 
+       memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
+              HWSET_MAX_SIZE_92S);
+
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP",
                      hwinfo, HWSET_MAX_SIZE_92S);
 
index a4b7eac6856f2cac9937807e61c05d94cf22a689..57a1ba8822b1617187935fb4b40ead3aedf5d6e8 100644 (file)
@@ -1630,6 +1630,7 @@ static void _rtl8723e_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 = &rtl_pcipriv(hw)->dev.pdev->dev;
        u16 i, usvalue;
        u8 hwinfo[HWSET_MAX_SIZE];
        u16 eeprom_id;
@@ -1638,15 +1639,19 @@ static void _rtl8723e_read_adapter_info(struct ieee80211_hw *hw,
                /* need add */
                return;
        }
-       if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+       switch (rtlefuse->epromtype) {
+       case EEPROM_BOOT_EFUSE:
                rtl_efuse_shadow_map_update(hw);
 
-               memcpy(hwinfo, &rtlefuse->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");
        }
+       memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
 
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
                      hwinfo, HWSET_MAX_SIZE);
index 5a3df9198ddf7455c68045d8a51aac4b81789bbb..08288ac9020ab58a14be0f0a85e7e2c1cf92d211 100644 (file)
@@ -2026,6 +2026,7 @@ static void _rtl8723be_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 = &rtl_pcipriv(hw)->dev.pdev->dev;
        u16 i, usvalue;
        u8 hwinfo[HWSET_MAX_SIZE];
        u16 eeprom_id;
@@ -2055,15 +2056,22 @@ static void _rtl8723be_read_adapter_info(struct ieee80211_hw *hw,
                /* needs to be added */
                return;
        }
-       if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+
+       switch (rtlefuse->epromtype) {
+       case EEPROM_BOOT_EFUSE:
                rtl_efuse_shadow_map_update(hw);
+               break;
 
-               memcpy(hwinfo, &rtlefuse->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, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, ("MAP\n"),
                      hwinfo, HWSET_MAX_SIZE);
 
index 71e4dd9965bbb34d440f92a39bcb4584fc82f9a1..b9436df9e1eca40b91019acc6a801cfbec7cc2bf 100644 (file)
@@ -3101,6 +3101,7 @@ static void _rtl8821ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
+       struct device *dev = &rtl_pcipriv(hw)->dev.pdev->dev;
        u16 i, usvalue;
        u8 hwinfo[HWSET_MAX_SIZE];
        u16 eeprom_id;
@@ -3109,14 +3110,20 @@ static void _rtl8821ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_
                ;/* need add */
        }
 
-       if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
+       switch (rtlefuse->epromtype) {
+       case EEPROM_BOOT_EFUSE:
                rtl_efuse_shadow_map_update(hw);
-               memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
-                      HWSET_MAX_SIZE);
-       } else if (rtlefuse->epromtype == EEPROM_93C46) {
+               break;
+
+       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");
        }
+       memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], HWSET_MAX_SIZE);
 
        RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
                      hwinfo, HWSET_MAX_SIZE);