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

Lu jicong posted 1 patch 2 years, 6 months ago
.../wireless/realtek/rtlwifi/rtl8192ce/hw.c   | 31 +++++++++++++------
1 file changed, 21 insertions(+), 10 deletions(-)
[PATCH V2] wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values
Posted by Lu jicong 2 years, 6 months ago
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>
---
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
Re: [PATCH V2] wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values
Posted by Kalle Valo 2 years, 6 months ago
Lu jicong <jiconglu58@gmail.com> 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 <jiconglu58@gmail.com>
> Acked-by: Ping-Ke Shih <pkshih@realtek.com>

Patch applied to wireless-next.git, thanks.

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

-- 
https://patchwork.kernel.org/project/linux-wireless/patch/20230214063602.2257263-1-jiconglu58@gmail.com/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
RE: [PATCH V2] wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values
Posted by Ping-Ke Shih 2 years, 6 months ago

> -----Original Message-----
> From: Lu jicong <jiconglu58@gmail.com>
> Sent: Tuesday, February 14, 2023 2:36 PM
> To: Ping-Ke Shih <pkshih@realtek.com>; kvalo@kernel.org; davem@davemloft.net; edumazet@google.com;
> kuba@kernel.org; pabeni@redhat.com
> Cc: linux-wireless@vger.kernel.org; netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Lu jicong
> <jiconglu58@gmail.com>
> 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 <jiconglu58@gmail.com>

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 <pkshih@realtek.com>

> ---
> 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