2023-02-14 06:36:37

by Lu jicong

[permalink] [raw]
Subject: [PATCH V2] wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values

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 <[email protected]>
---
v2: add more detailed commit message
---
.../wireless/realtek/rtlwifi/rtl8192ce/hw.c | 31 +++++++++++++------
1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
index b9c62640d2cb..8ddf0017af4c 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
@@ -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;
--
2.30.2



2023-02-14 07:49:54

by Ping-Ke Shih

[permalink] [raw]
Subject: RE: [PATCH V2] wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values



> -----Original Message-----
> From: Lu jicong <[email protected]>
> Sent: Tuesday, February 14, 2023 2:36 PM
> To: Ping-Ke Shih <[email protected]>; [email protected]; [email protected]; [email protected];
> [email protected]; [email protected]
> Cc: [email protected]; [email protected]; [email protected]; Lu jicong
> <[email protected]>
> Subject: [PATCH V2] wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values
>
> 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 <[email protected]>

As discussion privately, RTL8192CE on OpenWRT could be left some EEPROM values
as 0xff, so I think it's worth to add a patch to support this kind of RTL8192CE.
Since regular RTL8192CE must be programmed EEPROM values properly, this patch
can be compatible them.

Acked-by: Ping-Ke Shih <[email protected]>

> ---
> v2: add more detailed commit message
> ---
> .../wireless/realtek/rtlwifi/rtl8192ce/hw.c | 31 +++++++++++++------
> 1 file changed, 21 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
> b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
> index b9c62640d2cb..8ddf0017af4c 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
> +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/hw.c
> @@ -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;
> --
> 2.30.2


2023-02-22 12:28:32

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH V2] wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values

Lu jicong <[email protected]> wrote:

> 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 <[email protected]>
> Acked-by: Ping-Ke Shih <[email protected]>

Patch applied to wireless-next.git, thanks.

59e6ded57cc1 wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values

--
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches