Commit 2ab298cf authored by Ping-Ke Shih's avatar Ping-Ke Shih

wifi: rtw89: 8852bx: add extra handles for 8852BT in 8852b_common

The channel configuration of 8852BT is very similar but a little different
to 8852B, so use chip ID as condition to add extra handles including
external loss compensation, ADC configurations, spur settings and so on.

Don't affect existing 8852BE.
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Link: https://msgid.link/20240607070659.80263-3-pkshih@realtek.com
parent 5a72e198
...@@ -17,7 +17,8 @@ rtw89_core-y += core.o \ ...@@ -17,7 +17,8 @@ rtw89_core-y += core.o \
ps.o \ ps.o \
chan.o \ chan.o \
ser.o \ ser.o \
acpi.o acpi.o \
util.o
rtw89_core-$(CONFIG_PM) += wow.o rtw89_core-$(CONFIG_PM) += wow.o
......
...@@ -132,6 +132,7 @@ enum rtw89_hci_type { ...@@ -132,6 +132,7 @@ enum rtw89_hci_type {
enum rtw89_core_chip_id { enum rtw89_core_chip_id {
RTL8852A, RTL8852A,
RTL8852B, RTL8852B,
RTL8852BT,
RTL8852C, RTL8852C,
RTL8851B, RTL8851B,
RTL8922A, RTL8922A,
......
...@@ -129,6 +129,7 @@ ...@@ -129,6 +129,7 @@
#define EDCCA_HL_DIFF_NORMAL 8 #define EDCCA_HL_DIFF_NORMAL 8
#define RSSI_UNIT_CONVER 110 #define RSSI_UNIT_CONVER 110
#define EDCCA_UNIT_CONVER 128 #define EDCCA_UNIT_CONVER 128
#define EDCCA_PWROFST_DEFAULT 18
enum rtw89_phy_c2h_ra_func { enum rtw89_phy_c2h_ra_func {
RTW89_PHY_C2H_FUNC_STS_RPT, RTW89_PHY_C2H_FUNC_STS_RPT,
......
...@@ -7872,6 +7872,7 @@ ...@@ -7872,6 +7872,7 @@
#define B_UPD_CLK_ADC_ON BIT(24) #define B_UPD_CLK_ADC_ON BIT(24)
#define B_ENABLE_CCK BIT(5) #define B_ENABLE_CCK BIT(5)
#define R_RSTB_ASYNC 0x0704 #define R_RSTB_ASYNC 0x0704
#define B_RSTB_ASYNC_BW80 GENMASK(9, 8)
#define B_RSTB_ASYNC_ALL BIT(1) #define B_RSTB_ASYNC_ALL BIT(1)
#define R_P0_ANT_SW 0x0728 #define R_P0_ANT_SW 0x0728
#define B_P0_HW_ANTSW_DIS_BY_GNT_BT BIT(12) #define B_P0_HW_ANTSW_DIS_BY_GNT_BT BIT(12)
...@@ -8379,6 +8380,7 @@ ...@@ -8379,6 +8380,7 @@
#define B_CDD_EVM_CHK_EN BIT(0) #define B_CDD_EVM_CHK_EN BIT(0)
#define R_PATH0_BAND_SEL_V1 0x4738 #define R_PATH0_BAND_SEL_V1 0x4738
#define B_PATH0_BAND_SEL_MSK_V1 BIT(17) #define B_PATH0_BAND_SEL_MSK_V1 BIT(17)
#define B_PATH0_BAND_NRBW_EN_V1 BIT(16)
#define R_PATH0_BT_SHARE_V1 0x4738 #define R_PATH0_BT_SHARE_V1 0x4738
#define B_PATH0_BT_SHARE_V1 BIT(19) #define B_PATH0_BT_SHARE_V1 BIT(19)
#define R_PATH0_BTG_PATH_V1 0x4738 #define R_PATH0_BTG_PATH_V1 0x4738
...@@ -8422,6 +8424,7 @@ ...@@ -8422,6 +8424,7 @@
#define B_PATH1_G_TIA1_LNA6_OP1DB_V1 GENMASK(15, 8) #define B_PATH1_G_TIA1_LNA6_OP1DB_V1 GENMASK(15, 8)
#define R_PATH1_BAND_SEL_V1 0x4AA4 #define R_PATH1_BAND_SEL_V1 0x4AA4
#define B_PATH1_BAND_SEL_MSK_V1 BIT(17) #define B_PATH1_BAND_SEL_MSK_V1 BIT(17)
#define B_PATH1_BAND_NRBW_EN_V1 BIT(16)
#define R_PATH1_BT_SHARE_V1 0x4AA4 #define R_PATH1_BT_SHARE_V1 0x4AA4
#define B_PATH1_BT_SHARE_V1 BIT(19) #define B_PATH1_BT_SHARE_V1 BIT(19)
#define R_PATH1_BTG_PATH_V1 0x4AA4 #define R_PATH1_BTG_PATH_V1 0x4AA4
...@@ -8442,6 +8445,8 @@ ...@@ -8442,6 +8445,8 @@
#define B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1 BIT(30) #define B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1 BIT(30)
#define B_SEG0R_PD_SPATIAL_REUSE_EN_MSK BIT(29) #define B_SEG0R_PD_SPATIAL_REUSE_EN_MSK BIT(29)
#define B_SEG0R_PD_LOWER_BOUND_MSK GENMASK(10, 6) #define B_SEG0R_PD_LOWER_BOUND_MSK GENMASK(10, 6)
#define R_PWOFST 0x488C
#define B_PWOFST GENMASK(21, 17)
#define R_2P4G_BAND 0x4970 #define R_2P4G_BAND 0x4970
#define B_2P4G_BAND_SEL BIT(1) #define B_2P4G_BAND_SEL BIT(1)
#define R_FC0_BW 0x4974 #define R_FC0_BW 0x4974
...@@ -9095,6 +9100,7 @@ ...@@ -9095,6 +9100,7 @@
#define R_ADCMOD 0xC0E8 #define R_ADCMOD 0xC0E8
#define B_ADCMOD_LP GENMASK(31, 16) #define B_ADCMOD_LP GENMASK(31, 16)
#define R_DCIM 0xC0EC #define R_DCIM 0xC0EC
#define B_DCIM_RC GENMASK(23, 16)
#define B_DCIM_FR GENMASK(14, 13) #define B_DCIM_FR GENMASK(14, 13)
#define R_ADDCK0D 0xC0F0 #define R_ADDCK0D 0xC0F0
#define B_ADDCK0D_VAL2 GENMASK(31, 26) #define B_ADDCK0D_VAL2 GENMASK(31, 26)
......
...@@ -158,6 +158,7 @@ struct rtw8852bx_info { ...@@ -158,6 +158,7 @@ struct rtw8852bx_info {
void (*set_txpwr_ul_tb_offset)(struct rtw89_dev *rtwdev, void (*set_txpwr_ul_tb_offset)(struct rtw89_dev *rtwdev,
s8 pw_ofst, enum rtw89_mac_idx mac_idx); s8 pw_ofst, enum rtw89_mac_idx mac_idx);
u8 (*get_thermal)(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path); u8 (*get_thermal)(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path);
void (*adc_cfg)(struct rtw89_dev *rtwdev, u8 bw, u8 path);
}; };
extern const struct rtw8852bx_info rtw8852bx_info; extern const struct rtw8852bx_info rtw8852bx_info;
...@@ -336,4 +337,10 @@ u8 rtw8852bx_get_thermal(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path) ...@@ -336,4 +337,10 @@ u8 rtw8852bx_get_thermal(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path)
return rtw8852bx_info.get_thermal(rtwdev, rf_path); return rtw8852bx_info.get_thermal(rtwdev, rf_path);
} }
static inline
void rtw8852bx_adc_cfg(struct rtw89_dev *rtwdev, u8 bw, u8 path)
{
rtw8852bx_info.adc_cfg(rtwdev, bw, path);
}
#endif #endif
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/* Copyright(c) 2024 Realtek Corporation
*/
#include "util.h"
#define FRAC_ROWS 3
#define FRAC_ROW_MAX (FRAC_ROWS - 1)
#define NORM_ROW_MIN FRAC_ROWS
static const u32 db_invert_table[12][8] = {
/* rows 0~2 in unit of U(32,3) */
{10, 13, 16, 20, 25, 32, 40, 50},
{64, 80, 101, 128, 160, 201, 256, 318},
{401, 505, 635, 800, 1007, 1268, 1596, 2010},
/* rows 3~11 in unit of U(32,0) */
{316, 398, 501, 631, 794, 1000, 1259, 1585},
{1995, 2512, 3162, 3981, 5012, 6310, 7943, 10000},
{12589, 15849, 19953, 25119, 31623, 39811, 50119, 63098},
{79433, 100000, 125893, 158489, 199526, 251189, 316228, 398107},
{501187, 630957, 794328, 1000000, 1258925, 1584893, 1995262, 2511886},
{3162278, 3981072, 5011872, 6309573, 7943282, 1000000, 12589254,
15848932},
{19952623, 25118864, 31622777, 39810717, 50118723, 63095734, 79432823,
100000000},
{125892541, 158489319, 199526232, 251188643, 316227766, 398107171,
501187234, 630957345},
{794328235, 1000000000, 1258925412, 1584893192, 1995262315, 2511886432U,
3162277660U, 3981071706U},
};
u32 rtw89_linear_2_db(u64 val)
{
u8 i, j;
u32 dB;
for (i = 0; i < 12; i++) {
for (j = 0; j < 8; j++) {
if (i <= FRAC_ROW_MAX &&
(val << RTW89_LINEAR_FRAC_BITS) <= db_invert_table[i][j])
goto cnt;
else if (i > FRAC_ROW_MAX && val <= db_invert_table[i][j])
goto cnt;
}
}
return 96; /* maximum 96 dB */
cnt:
/* special cases */
if (j == 0 && i == 0)
goto end;
if (i == NORM_ROW_MIN && j == 0) {
if (db_invert_table[NORM_ROW_MIN][0] - val >
val - (db_invert_table[FRAC_ROW_MAX][7] >> RTW89_LINEAR_FRAC_BITS)) {
i = FRAC_ROW_MAX;
j = 7;
}
goto end;
}
if (i <= FRAC_ROW_MAX)
val <<= RTW89_LINEAR_FRAC_BITS;
/* compare difference to get precise dB */
if (j == 0) {
if (db_invert_table[i][j] - val >
val - db_invert_table[i - 1][7]) {
i--;
j = 7;
}
} else {
if (db_invert_table[i][j] - val >
val - db_invert_table[i][j - 1]) {
j--;
}
}
end:
dB = (i << 3) + j + 1;
return dB;
}
EXPORT_SYMBOL(rtw89_linear_2_db);
u64 rtw89_db_2_linear(u32 db)
{
u64 linear;
u8 i, j;
if (db > 96)
db = 96;
else if (db < 1)
return 1;
i = (db - 1) >> 3;
j = (db - 1) & 0x7;
linear = db_invert_table[i][j];
if (i >= NORM_ROW_MIN)
linear = linear << RTW89_LINEAR_FRAC_BITS;
return linear;
}
EXPORT_SYMBOL(rtw89_db_2_linear);
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include "core.h" #include "core.h"
#define RTW89_LINEAR_FRAC_BITS 3
#define rtw89_iterate_vifs_bh(rtwdev, iterator, data) \ #define rtw89_iterate_vifs_bh(rtwdev, iterator, data) \
ieee80211_iterate_active_interfaces_atomic((rtwdev)->hw, \ ieee80211_iterate_active_interfaces_atomic((rtwdev)->hw, \
IEEE80211_IFACE_ITER_NORMAL, iterator, data) IEEE80211_IFACE_ITER_NORMAL, iterator, data)
...@@ -55,4 +57,7 @@ static inline void ether_addr_copy_mask(u8 *dst, const u8 *src, u8 mask) ...@@ -55,4 +57,7 @@ static inline void ether_addr_copy_mask(u8 *dst, const u8 *src, u8 mask)
} }
} }
u32 rtw89_linear_2_db(u64 linear);
u64 rtw89_db_2_linear(u32 db);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment