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