Message ID | 20230214063602.2257263-1-jiconglu58@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 59e6ded57cc1b3b5117cef66dabe6d7977208ba0 |
Delegated to: | Kalle Valo |
Headers | show |
Series | [V2] wifi: rtlwifi: rtl8192ce: fix dealing empty EEPROM values | expand |
> -----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
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
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;
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(-)