]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: 8851b: set ADC bandwidth select according to calibration value
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 27 Jun 2025 03:51:57 +0000 (11:51 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Fri, 4 Jul 2025 02:23:44 +0000 (10:23 +0800)
To handle hardware characteristic of ADC, calibrate the function and add
a efuse field to record result, which driver uses it to set proper value
accordingly.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250627035201.16416-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/rtw8851b.c

index 06ceb77a1cc655c502630719fe61ae66b46e0ced..a72cd6e13de2ee7a77913ad172f6204204ae1ac3 100644 (file)
@@ -3480,6 +3480,7 @@ struct rtw89_efuse {
        u8 addr[ETH_ALEN];
        u8 rfe_type;
        char country_code[2];
+       u8 adc_td;
 };
 
 struct rtw89_phy_rate_pattern {
index c55833f259deabc6caabec3f694fe228ff0a632f..287d53203b38859eba8e2b94f289b844a439bc05 100644 (file)
@@ -712,12 +712,22 @@ static void rtw8851b_phycap_parsing_gain_comp(struct rtw89_dev *rtwdev, u8 *phyc
        gain->comp_valid = valid;
 }
 
+static void rtw8851b_phycap_parsing_adc_td(struct rtw89_dev *rtwdev, u8 *phycap_map)
+{
+       u32 phycap_addr = rtwdev->chip->phycap_addr;
+       struct rtw89_efuse *efuse = &rtwdev->efuse;
+       const u32 addr_adc_td = 0x5AF;
+
+       efuse->adc_td = phycap_map[addr_adc_td - phycap_addr] & GENMASK(4, 0);
+}
+
 static int rtw8851b_read_phycap(struct rtw89_dev *rtwdev, u8 *phycap_map)
 {
        rtw8851b_phycap_parsing_tssi(rtwdev, phycap_map);
        rtw8851b_phycap_parsing_thermal_trim(rtwdev, phycap_map);
        rtw8851b_phycap_parsing_pa_bias_trim(rtwdev, phycap_map);
        rtw8851b_phycap_parsing_gain_comp(rtwdev, phycap_map);
+       rtw8851b_phycap_parsing_adc_td(rtwdev, phycap_map);
 
        return 0;
 }
@@ -1083,10 +1093,26 @@ static void rtw8851b_ctrl_ch(struct rtw89_dev *rtwdev,
 
 static void rtw8851b_bw_setting(struct rtw89_dev *rtwdev, u8 bw)
 {
+       struct rtw89_efuse *efuse = &rtwdev->efuse;
+       u8 adc_bw_sel;
+
+       switch (efuse->adc_td) {
+       default:
+       case 0x19:
+               adc_bw_sel = 0x4;
+               break;
+       case 0x11:
+               adc_bw_sel = 0x5;
+               break;
+       case 0x9:
+               adc_bw_sel = 0x3;
+               break;
+       }
+
        rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_CTL, 0x8);
        rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_EN, 0x2);
        rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_BW0, 0x2);
-       rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_BW1, 0x4);
+       rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_BW1, adc_bw_sel);
        rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_MUL, 0xf);
        rtw89_phy_write32_mask(rtwdev, R_ADCMOD, B_ADCMOD_LP, 0xa);
        rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ADJ, 0x92);