rev |
line source |
shann@25728
|
1 diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
shann@25728
|
2 index 8f53afb67870..f0a56f56f0d5 100644
|
shann@25728
|
3 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
shann@25728
|
4 +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
shann@25728
|
5 @@ -15,6 +15,10 @@
|
shann@25728
|
6 #include "debug.h"
|
shann@25728
|
7 #include "bf.h"
|
shann@25728
|
8
|
shann@25728
|
9 +static const s8 lna_gain_table_0[8] = {22, 8, -6, -22, -31, -40, -46, -52};
|
shann@25728
|
10 +static const s8 lna_gain_table_1[16] = {10, 6, 2, -2, -6, -10, -14, -17,
|
shann@25728
|
11 + -20, -24, -28, -31, -34, -37, -40, -44};
|
shann@25728
|
12 +
|
shann@25728
|
13 static void rtw8821ce_efuse_parsing(struct rtw_efuse *efuse,
|
shann@25728
|
14 struct rtw8821c_efuse *map)
|
shann@25728
|
15 {
|
shann@25728
|
16 @@ -426,17 +430,49 @@ static void rtw8821c_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
|
shann@25728
|
17 rtw8821c_set_channel_rxdfir(rtwdev, bw);
|
shann@25728
|
18 }
|
shann@25728
|
19
|
shann@25728
|
20 +static s8 get_cck_rx_pwr(struct rtw_dev *rtwdev, u8 lna_idx, u8 vga_idx)
|
shann@25728
|
21 +{
|
shann@25728
|
22 + struct rtw_efuse *efuse = &rtwdev->efuse;
|
shann@25728
|
23 + const s8 *lna_gain_table;
|
shann@25728
|
24 + int lna_gain_table_size;
|
shann@25728
|
25 + s8 rx_pwr_all = 0;
|
shann@25728
|
26 + s8 lna_gain = 0;
|
shann@25728
|
27 +
|
shann@25728
|
28 + if (efuse->rfe_option == 0) {
|
shann@25728
|
29 + lna_gain_table = lna_gain_table_0;
|
shann@25728
|
30 + lna_gain_table_size = ARRAY_SIZE(lna_gain_table_0);
|
shann@25728
|
31 + } else {
|
shann@25728
|
32 + lna_gain_table = lna_gain_table_1;
|
shann@25728
|
33 + lna_gain_table_size = ARRAY_SIZE(lna_gain_table_1);
|
shann@25728
|
34 + }
|
shann@25728
|
35 +
|
shann@25728
|
36 + if (lna_idx >= lna_gain_table_size) {
|
shann@25728
|
37 + rtw_info(rtwdev, "incorrect lna index (%d)\n", lna_idx);
|
shann@25728
|
38 + return -120;
|
shann@25728
|
39 + }
|
shann@25728
|
40 +
|
shann@25728
|
41 + lna_gain = lna_gain_table[lna_idx];
|
shann@25728
|
42 + rx_pwr_all = lna_gain - 2 * vga_idx;
|
shann@25728
|
43 +
|
shann@25728
|
44 + return rx_pwr_all;
|
shann@25728
|
45 +}
|
shann@25728
|
46 +
|
shann@25728
|
47 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
|
shann@25728
|
48 struct rtw_rx_pkt_stat *pkt_stat)
|
shann@25728
|
49 {
|
shann@25728
|
50 - s8 min_rx_power = -120;
|
shann@25728
|
51 - u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
|
shann@25728
|
52 + s8 rx_power;
|
shann@25728
|
53 + u8 lna_idx = 0;
|
shann@25728
|
54 + u8 vga_idx = 0;
|
shann@25728
|
55
|
shann@25728
|
56 - pkt_stat->rx_power[RF_PATH_A] = pwdb - 100;
|
shann@25728
|
57 + vga_idx = GET_PHY_STAT_P0_VGA(phy_status);
|
shann@25728
|
58 + lna_idx = FIELD_PREP(BIT_LNA_H_MASK, GET_PHY_STAT_P0_LNA_H(phy_status)) |
|
shann@25728
|
59 + FIELD_PREP(BIT_LNA_L_MASK, GET_PHY_STAT_P0_LNA_L(phy_status));
|
shann@25728
|
60 + rx_power = get_cck_rx_pwr(rtwdev, lna_idx, vga_idx);
|
shann@25728
|
61 +
|
shann@25728
|
62 + pkt_stat->rx_power[RF_PATH_A] = rx_power;
|
shann@25728
|
63 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
|
shann@25728
|
64 pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
|
shann@25728
|
65 - pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
|
shann@25728
|
66 - min_rx_power);
|
shann@25728
|
67 + pkt_stat->signal_power = rx_power;
|
shann@25728
|
68 }
|
shann@25728
|
69
|
shann@25728
|
70 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
|
shann@25728
|
71 diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
shann@25728
|
72 index e11e3fc41c95..4d197541430d 100644
|
shann@25728
|
73 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
shann@25728
|
74 +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
shann@25728
|
75 @@ -148,6 +148,14 @@ _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
|
shann@25728
|
76 /* phy status page0 */
|
shann@25728
|
77 #define GET_PHY_STAT_P0_PWDB(phy_stat) \
|
shann@25728
|
78 le32_get_bits(*((__le32 *)(phy_stat) + 0x00), GENMASK(15, 8))
|
shann@25728
|
79 +#define GET_PHY_STAT_P0_VGA(phy_stat) \
|
shann@25728
|
80 + le32_get_bits(*((__le32 *)(phy_stat) + 0x03), GENMASK(12, 8))
|
shann@25728
|
81 +#define GET_PHY_STAT_P0_LNA_L(phy_stat) \
|
shann@25728
|
82 + le32_get_bits(*((__le32 *)(phy_stat) + 0x03), GENMASK(15, 13))
|
shann@25728
|
83 +#define GET_PHY_STAT_P0_LNA_H(phy_stat) \
|
shann@25728
|
84 + le32_get_bits(*((__le32 *)(phy_stat) + 0x03), BIT(23))
|
shann@25728
|
85 +#define BIT_LNA_H_MASK BIT(3)
|
shann@25728
|
86 +#define BIT_LNA_L_MASK GENMASK(2, 0)
|
shann@25728
|
87
|
shann@25728
|
88 /* phy status page1 */
|
shann@25728
|
89 #define GET_PHY_STAT_P1_PWDB_A(phy_stat) \
|
shann@25728
|
90
|