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 b9c6264..dc48032 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;