wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values
authorLu jicong <jiconglu58@gmail.com>
Tue, 14 Feb 2023 06:36:02 +0000 (06:36 +0000)
committerKalle Valo <kvalo@kernel.org>
Wed, 22 Feb 2023 12:28:08 +0000 (14:28 +0200)
On OpenWRT platform, RTL8192CE could be soldered on board, but not standard PCI
module. In this case, some EEPROM values aren't programmed and left 0xff.
Load default values when the EEPROM values are empty to avoid problems.

Signed-off-by: Lu jicong <jiconglu58@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230214063602.2257263-1-jiconglu58@gmail.com
drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c

index b9c62640d2cbd9db027e781c792e5325af07088a..dc480323c9cbff5729d950964737aa60a4d8b653 100644 (file)
@@ -1428,7 +1428,9 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
 
        for (rf_path = 0; rf_path < 2; rf_path++) {
                for (i = 0; i < 3; i++) {
-                       if (!autoload_fail) {
+                       if (!autoload_fail &&
+                           hwinfo[EEPROM_TXPOWERCCK + rf_path * 3 + i] != 0xff &&
+                           hwinfo[EEPROM_TXPOWERHT40_1S + rf_path * 3 + i] != 0xff) {
                                rtlefuse->
                                    eeprom_chnlarea_txpwr_cck[rf_path][i] =
                                    hwinfo[EEPROM_TXPOWERCCK + rf_path * 3 + i];
@@ -1448,7 +1450,8 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
        }
 
        for (i = 0; i < 3; i++) {
-               if (!autoload_fail)
+               if (!autoload_fail &&
+                   hwinfo[EEPROM_TXPOWERHT40_2SDIFF + i] != 0xff)
                        tempval = hwinfo[EEPROM_TXPOWERHT40_2SDIFF + i];
                else
                        tempval = EEPROM_DEFAULT_HT40_2SDIFF;
@@ -1518,7 +1521,9 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
        }
 
        for (i = 0; i < 3; i++) {
-               if (!autoload_fail) {
+               if (!autoload_fail &&
+                   hwinfo[EEPROM_TXPWR_GROUP + i] != 0xff &&
+                   hwinfo[EEPROM_TXPWR_GROUP + 3 + i] != 0xff) {
                        rtlefuse->eeprom_pwrlimit_ht40[i] =
                            hwinfo[EEPROM_TXPWR_GROUP + i];
                        rtlefuse->eeprom_pwrlimit_ht20[i] =
@@ -1563,7 +1568,8 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
        for (i = 0; i < 14; i++) {
                index = rtl92c_get_chnl_group((u8)i);
 
-               if (!autoload_fail)
+               if (!autoload_fail &&
+                   hwinfo[EEPROM_TXPOWERHT20DIFF + index] != 0xff)
                        tempval = hwinfo[EEPROM_TXPOWERHT20DIFF + index];
                else
                        tempval = EEPROM_DEFAULT_HT20_DIFF;
@@ -1580,7 +1586,8 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
 
                index = rtl92c_get_chnl_group((u8)i);
 
-               if (!autoload_fail)
+               if (!autoload_fail &&
+                   hwinfo[EEPROM_TXPOWER_OFDMDIFF + index] != 0xff)
                        tempval = hwinfo[EEPROM_TXPOWER_OFDMDIFF + index];
                else
                        tempval = EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF;
@@ -1610,14 +1617,16 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
                        "RF-B Legacy to HT40 Diff[%d] = 0x%x\n",
                        i, rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]);
 
-       if (!autoload_fail)
+       if (!autoload_fail && hwinfo[RF_OPTION1] != 0xff)
                rtlefuse->eeprom_regulatory = (hwinfo[RF_OPTION1] & 0x7);
        else
                rtlefuse->eeprom_regulatory = 0;
        RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
                "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
 
-       if (!autoload_fail) {
+       if (!autoload_fail &&
+           hwinfo[EEPROM_TSSI_A] != 0xff &&
+           hwinfo[EEPROM_TSSI_B] != 0xff) {
                rtlefuse->eeprom_tssi[RF90_PATH_A] = hwinfo[EEPROM_TSSI_A];
                rtlefuse->eeprom_tssi[RF90_PATH_B] = hwinfo[EEPROM_TSSI_B];
        } else {
@@ -1628,7 +1637,7 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
                rtlefuse->eeprom_tssi[RF90_PATH_A],
                rtlefuse->eeprom_tssi[RF90_PATH_B]);
 
-       if (!autoload_fail)
+       if (!autoload_fail && hwinfo[EEPROM_THERMAL_METER] != 0xff)
                tempval = hwinfo[EEPROM_THERMAL_METER];
        else
                tempval = EEPROM_DEFAULT_THERMALMETER;