wok-current annotate 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
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