wifi: rtw89: support to load TX power tables from firmware file
Ping-Ke Shih
maintainercover wifi: rtw89: support to load TX power tables from firmware file
We proposed firmware elements to have PHY parameters that are simple tuple of {addr, value}, and this patchset is to add nine kinds of TX power tables to firmware elements. Since TX power tables can be possibly increasing dimension or value range in the future, it is much complicated than parameter tables.
We keep existing WiFi 6 chips use tables built-in arrays in drivers, but preserve rooms to make it possible to move arrays into firmware file as well. So, patches in this patchset adjust struct also for this purpose.
About backward/forward compatibility:
This is the most important and complicated stuff of this patchset. The method basically to achieve compatibility is to pad zeros.
1. encode scheme
Consider a TX power value in driver
power[x][y] = a
The indices part are also encoded into firmware file
x, y, a
For example,
power[5][6] = 9 --> 05 06 092. compatibility
When array dimension is increasing, it could become something like
power[x][y][z] = b
For example,
power[5][6][4] = 9 --> 05 06 09 04
^^
(note: the new dimension must be encoded as the last digit)(I explain further based on these examples)
2.1. driver backward compatibility (new driver + old firmware)
From driver point of view, a tuple from firmware is 3 digits, so it allocates a expected 4-digit tuple array first, and copy 3 digits into the array. Base on above example, tuple in old firmware is recognized as 05 06 09 00 --> power[5][6][0] = 9
^^ This pending zero is existing in firmware, but driver adds it
2.2. driver forward compatibility (old driver + new firmware)
Like above example, old driver allocates 3-digit tuple array first, and only copy 3-digits into the array if remaining digits are zeros. For example,
05 06 09 04 --> only for new driver; don't recognize
05 06 09 00 --> power[5][6] = 9
^^ remaining digits must be zeros
Summarize the flow:
1. pre-condition
n = tuple size in firmware
m = tuple size expected by driver
2.1. n == m
- copy n digits into array
2.2. n < m (new driver + old firmware)
- allocate/zero m digits tuple array
- copy n digits into array
2.3. n > m (old driver + new firmware)
- if m + 1 ~ n digits aren't all zeros, ignore this tuple
- copy m digits into array
3. from tuple to regular C array.
Patch 1/7~6/7 are to adjust enum and struct, and patch 7/7 is to load TX power from firmware. The remaining patches in hand are to set TX power to WiFi 7 chips. I will submit them later.
Firmware elements layout for reference:
+===========================================+ | WiFi CPU multi-firmware | | +-------------+ | | padding | +===========================================+ | elm ID 1 | elm size | other header data | +----------+----------+ | | | +-------------------------------------------+ | content (variable length) | | +-------------+ | | padding | +===========================================+ | elm ID 2 | elm size | other header data | +----------+----------+ | | | +-------------------------------------------+ | content (variable length) | | +-----------------------+ | | +===================+
Element header:
+===========================================+ | elm ID | elm size | version | rsvd0 | +----------+----------+----------+----------+ | rsvd1/2 | element_priv[] | +-------------------------------------------+
Ping-Ke Shih (1):
wifi: rtw89: add subband index of primary channel to struct rtw89_chan
Zong-Zhe Yang (6):
wifi: rtw89: indicate TX shape table inside RFE parameter
wifi: rtw89: indicate TX power by rate table inside RFE parameter
wifi: rtw89: phy: refine helpers used for raw TX power
wifi: rtw89: load TX power by rate when RFE parms setup
wifi: rtw89: phy: extend TX power common stuffs for Wi-Fi 7 chips
wifi: rtw89: load TX power related tables from FW elements
drivers/net/wireless/realtek/rtw89/chan.c | 15 + drivers/net/wireless/realtek/rtw89/core.c | 25 +- drivers/net/wireless/realtek/rtw89/core.h | 152 ++++- drivers/net/wireless/realtek/rtw89/fw.c | 530 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/fw.h | 130 +++++ drivers/net/wireless/realtek/rtw89/phy.c | 97 ++-- drivers/net/wireless/realtek/rtw89/phy.h | 3 + drivers/net/wireless/realtek/rtw89/rtw8851b.c | 6 +- .../wireless/realtek/rtw89/rtw8851b_table.c | 6 + .../wireless/realtek/rtw89/rtw8851b_table.h | 3 - drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 - .../wireless/realtek/rtw89/rtw8852a_table.c | 2 + .../wireless/realtek/rtw89/rtw8852a_table.h | 1 - drivers/net/wireless/realtek/rtw89/rtw8852b.c | 6 +- .../wireless/realtek/rtw89/rtw8852b_table.c | 4 + .../wireless/realtek/rtw89/rtw8852b_table.h | 3 - drivers/net/wireless/realtek/rtw89/rtw8852c.c | 6 +- .../wireless/realtek/rtw89/rtw8852c_table.c | 4 + .../wireless/realtek/rtw89/rtw8852c_table.h | 3 - 19 files changed, 910 insertions(+), 87 deletions(-)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/7 wifi: rtw89: add subband index of primary channel to struct rtw89_chan
The subband index is a hardware value of relationship between primary channel and bandwidth, and it is used by setting channel/bandwidth to specify the primary channel.
Because this index is only needed when bandwidth >= 20 MHz, adjust order of enumerator bandwidth to access offsets array easier. To prevent misuse RTW89_CHANNEL_WIDTH_NUM as size, change it to RTW89_CHANNEL_WIDTH_ORDINARY_NUM that will be the size of array. The enumerator values of bandwidth (before ordinary number) will be also used by upcoming TX power table built in firmware file, so add a comment to remind keeping the order.
--- drivers/net/wireless/realtek/rtw89/chan.c | 15 +++++++++++++++ drivers/net/wireless/realtek/rtw89/core.h | 12 +++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/chan.c +15 -0
@@ -87,6 +87,19 @@ static enum rtw89_sc_offset rtw89_get_primary_chan_idx(enum rtw89_bandwidth bw,return primary_chan_idx; } +static u8 rtw89_get_primary_sb_idx (u8 central_ch,u8 pri_ch, +enum rtw89_bandwidth bw) +{ +static const u8 prisb_cal_ofst[RTW89_CHANNEL_WIDTH_ORDINARY_NUM ] = { +0 ,2 ,6 ,14 ,30 + }; + +if (bw >=RTW89_CHANNEL_WIDTH_ORDINARY_NUM ) +return 0 ; + +return (prisb_cal_ofst[bw] + pri_ch - central_ch) /4 ; +} +void rtw89_chan_create (struct rtw89_chan *chan,u8 center_chan,u8 primary_chan,enum rtw89_band band,enum rtw89_bandwidth bandwidth) {
@@ -106,6 +119,8 @@ void rtw89_chan_create(struct rtw89_chan *chan, u8 center_chan, u8 primary_chan, chan->subband_type =rtw89_get_subband_type (band, center_chan); chan->pri_ch_idx =rtw89_get_primary_chan_idx (bandwidth, center_freq, primary_freq); + chan->pri_sb_idx =rtw89_get_primary_sb_idx (center_chan, primary_chan, + bandwidth); } bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
drivers/net/wireless/realtek/rtw89/core.h +9 -3
@@ -841,9 +841,14 @@ enum rtw89_bandwidth {RTW89_CHANNEL_WIDTH_40 =1 ,RTW89_CHANNEL_WIDTH_80 =2 ,RTW89_CHANNEL_WIDTH_160 =3 , -RTW89_CHANNEL_WIDTH_80_80 =4 , -RTW89_CHANNEL_WIDTH_5 =5 , - RTW89_CHANNEL_WIDTH_10 = 6, +RTW89_CHANNEL_WIDTH_320 =4 , + +/* keep index order above */ +RTW89_CHANNEL_WIDTH_ORDINARY_NUM =5 , + +RTW89_CHANNEL_WIDTH_80_80 =5 , +RTW89_CHANNEL_WIDTH_5 =6 , + RTW89_CHANNEL_WIDTH_10 = 7, }; enum rtw89_ps_mode {
@@ -898,6 +903,7 @@ struct rtw89_chan {u32 freq;enum rtw89_subband subband_type;enum rtw89_sc_offset pri_ch_idx; +u8 pri_sb_idx; };struct rtw89_chan_rcd {
Signature · 1 line
2.25.1
Re: [PATCH 1/7] wifi: rtw89: add subband index of primary channel to struct rtw89_chan
Quoted 12 lines · Ping-Ke Shih
The subband index is a hardware value of relationship between primary channel and bandwidth, and it is used by setting channel/bandwidth to specify the primary channel.
Because this index is only needed when bandwidth >= 20 MHz, adjust order of enumerator bandwidth to access offsets array easier. To prevent misuse
RTW89_CHANNEL_WIDTH_NUMas size, change it toRTW89_CHANNEL_WIDTH_ORDINARY_NUMthat will be the size of array. The enumerator values of bandwidth (before ordinary number) will be also used by upcoming TX power table built in firmware file, so add a comment to remind keeping the order.
Quoted 1 line
Signed-off-by Ping-Ke Shih <[email protected]>
7 patches applied to wireless-next.git, thanks.
9483d8b3aac8 wifi: rtw89: add subband index of primary channel to struct rtw89_chan 1bf24172cc75 wifi: rtw89: indicate TX shape table inside RFE parameter 4cc05e315650 wifi: rtw89: indicate TX power by rate table inside RFE parameter 634fd9920c28 wifi: rtw89: phy: refine helpers used for raw TX power 9707ea6d6822 wifi: rtw89: load TX power by rate when RFE parms setup f6d601c7590f wifi: rtw89: phy: extend TX power common stuffs for Wi-Fi 7 chips 5ee7b2ea07cc wifi: rtw89: load TX power related tables from FW elements
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Ping-Ke Shih
maintainerPATCH 2/7 wifi: rtw89: indicate TX shape table inside RFE parameter
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
For next-generation chips, TX shape table comes from RFE (RF front end) parameter. It can be different according to RFE type. So, we indicate TX shape table inside RFE parameter ahead. For current chips, even with different RFE types, a chip is configured with a single TX shape table. So, this commit doesn't really affect these currently supported chips.
--- drivers/net/wireless/realtek/rtw89/core.h | 1 + drivers/net/wireless/realtek/rtw89/rtw8851b.c | 5 +++-- drivers/net/wireless/realtek/rtw89/rtw8851b_table.c | 3 +++ drivers/net/wireless/realtek/rtw89/rtw8851b_table.h | 2 -- drivers/net/wireless/realtek/rtw89/rtw8852b.c | 5 +++-- drivers/net/wireless/realtek/rtw89/rtw8852b_table.c | 2 ++ drivers/net/wireless/realtek/rtw89/rtw8852b_table.h | 2 -- drivers/net/wireless/realtek/rtw89/rtw8852c.c | 5 +++-- drivers/net/wireless/realtek/rtw89/rtw8852c_table.c | 2 ++ drivers/net/wireless/realtek/rtw89/rtw8852c_table.h | 2 -- 10 files changed, 17 insertions(+), 12 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +1 -0
@@ -3358,6 +3358,7 @@ struct rtw89_rfe_parms {struct rtw89_txpwr_rule_2ghz rule_2ghz;struct rtw89_txpwr_rule_5ghz rule_5ghz;struct rtw89_txpwr_rule_6ghz rule_6ghz; +const u8 (*tx_shape)[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ][RTW89_REGD_NUM ]; };struct rtw89_rfe_parms_conf {
drivers/net/wireless/realtek/rtw89/rtw8851b.c +3 -2
@@ -1704,10 +1704,11 @@ static void rtw8851b_set_tx_shape(struct rtw89_dev *rtwdev,const struct rtw89_chan *chan, enum rtw89_phy_idx phy_idx) { + const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms;u8 band = chan->band_type;u8 regd =rtw89_regd_get (rtwdev, band); -u8 tx_shape_cck = rtw89_8851b_tx_shape[band][RTW89_RS_CCK ][regd]; -u8 tx_shape_ofdm = rtw89_8851b_tx_shape[band][RTW89_RS_OFDM ][regd]; +u8 tx_shape_cck = (*rfe_parms->tx_shape)[band][RTW89_RS_CCK ][regd]; +u8 tx_shape_ofdm = (*rfe_parms->tx_shape)[band][RTW89_RS_OFDM ][regd];if (band ==RTW89_BAND_2G )rtw8851b_bb_set_tx_shape_dfir (rtwdev, chan, tx_shape_cck, phy_idx);
drivers/net/wireless/realtek/rtw89/rtw8851b_table.c +3 -0
@@ -3321,6 +3321,7 @@ static const s8 _txpwr_track_delta_swingidx_2g_cck_a_p[] = {0 ,1 ,1 ,1 ,1 ,2 ,2 ,2 ,3 ,3 ,3 ,3 ,4 ,4 }; +static const u8 rtw89_8851b_tx_shape[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ] [RTW89_REGD_NUM ] = { [0][0][RTW89_ACMA] = 0,
@@ -14818,6 +14819,7 @@ const struct rtw89_rfe_parms rtw89_8851b_dflt_parms = { .lmt = &rtw89_8851b_txpwr_lmt_5g, .lmt_ru = &rtw89_8851b_txpwr_lmt_ru_5g, }, + .tx_shape = &rtw89_8851b_tx_shape, }; static const struct rtw89_rfe_parms rtw89_8851b_rfe_parms_type2 = {
@@ -14829,6 +14831,7 @@ static const struct rtw89_rfe_parms rtw89_8851b_rfe_parms_type2 = { .lmt = &rtw89_8851b_txpwr_lmt_5g_type2, .lmt_ru = &rtw89_8851b_txpwr_lmt_ru_5g_type2, }, + .tx_shape = &rtw89_8851b_tx_shape, }; const struct rtw89_rfe_parms_conf rtw89_8851b_rfe_parms_conf[] = {
drivers/net/wireless/realtek/rtw89/rtw8851b_table.h +0 -2
@@ -13,8 +13,6 @@ extern const struct rtw89_phy_table rtw89_8851b_phy_radioa_table;extern const struct rtw89_phy_table rtw89_8851b_phy_nctl_table;extern const struct rtw89_txpwr_table rtw89_8851b_byr_table;extern const struct rtw89_txpwr_track_cfg rtw89_8851b_trk_cfg; -extern const u8 rtw89_8851b_tx_shape[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ] - [RTW89_REGD_NUM ];extern const struct rtw89_rfe_parms rtw89_8851b_dflt_parms;extern const struct rtw89_rfe_parms_conf rtw89_8851b_rfe_parms_conf[];
drivers/net/wireless/realtek/rtw89/rtw8852b.c +3 -2
@@ -1689,10 +1689,11 @@ static void rtw8852b_set_tx_shape(struct rtw89_dev *rtwdev,const struct rtw89_chan *chan, enum rtw89_phy_idx phy_idx) { + const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms;u8 band = chan->band_type;u8 regd =rtw89_regd_get (rtwdev, band); -u8 tx_shape_cck = rtw89_8852b_tx_shape[band][RTW89_RS_CCK ][regd]; -u8 tx_shape_ofdm = rtw89_8852b_tx_shape[band][RTW89_RS_OFDM ][regd]; +u8 tx_shape_cck = (*rfe_parms->tx_shape)[band][RTW89_RS_CCK ][regd]; +u8 tx_shape_ofdm = (*rfe_parms->tx_shape)[band][RTW89_RS_OFDM ][regd];if (band ==RTW89_BAND_2G )rtw8852b_bb_set_tx_shape_dfir (rtwdev, chan, tx_shape_cck, phy_idx);
drivers/net/wireless/realtek/rtw89/rtw8852b_table.c +2 -0
@@ -14666,6 +14666,7 @@ static const s8 _txpwr_track_delta_swingidx_2g_cck_a_p[] = {0 ,0 ,0 ,0 ,0 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; +static const u8 rtw89_8852b_tx_shape[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ] [RTW89_REGD_NUM ] = { [0][0][RTW89_ACMA] = 0,
@@ -22889,4 +22890,5 @@ const struct rtw89_rfe_parms rtw89_8852b_dflt_parms = { .lmt = &rtw89_8852b_txpwr_lmt_5g, .lmt_ru = &rtw89_8852b_txpwr_lmt_ru_5g, }, + .tx_shape = &rtw89_8852b_tx_shape, };
drivers/net/wireless/realtek/rtw89/rtw8852b_table.h +0 -2
@@ -14,8 +14,6 @@ extern const struct rtw89_phy_table rtw89_8852b_phy_radiob_table;extern const struct rtw89_phy_table rtw89_8852b_phy_nctl_table;extern const struct rtw89_txpwr_table rtw89_8852b_byr_table;extern const struct rtw89_txpwr_track_cfg rtw89_8852b_trk_cfg; -extern const u8 rtw89_8852b_tx_shape[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ] - [RTW89_REGD_NUM ];extern const struct rtw89_rfe_parms rtw89_8852b_dflt_parms;#endif
drivers/net/wireless/realtek/rtw89/rtw8852c.c +3 -2
@@ -1966,10 +1966,11 @@ static void rtw8852c_set_tx_shape(struct rtw89_dev *rtwdev,const struct rtw89_chan *chan, enum rtw89_phy_idx phy_idx) { + const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms;u8 band = chan->band_type;u8 regd =rtw89_regd_get (rtwdev, band); -u8 tx_shape_cck = rtw89_8852c_tx_shape[band][RTW89_RS_CCK ][regd]; -u8 tx_shape_ofdm = rtw89_8852c_tx_shape[band][RTW89_RS_OFDM ][regd]; +u8 tx_shape_cck = (*rfe_parms->tx_shape)[band][RTW89_RS_CCK ][regd]; +u8 tx_shape_ofdm = (*rfe_parms->tx_shape)[band][RTW89_RS_OFDM ][regd];if (band ==RTW89_BAND_2G )rtw8852c_bb_set_tx_shape_dfir (rtwdev, chan, tx_shape_cck, phy_idx);
drivers/net/wireless/realtek/rtw89/rtw8852c_table.c +2 -0
@@ -31525,6 +31525,7 @@ static const s8 _txpwr_track_delta_swingidx_2g_cck_a_p[] = {3 ,3 ,3 ,3 ,3 ,4 ,4 ,4 ,4 ,4 ,4 ,5 ,5 ,5 }; +static const u8 rtw89_8852c_tx_shape[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ] [RTW89_REGD_NUM ] = { [0][0][RTW89_ACMA] = 0,
@@ -56473,4 +56474,5 @@ const struct rtw89_rfe_parms rtw89_8852c_dflt_parms = { .lmt = &rtw89_8852c_txpwr_lmt_6g, .lmt_ru = &rtw89_8852c_txpwr_lmt_ru_6g, }, + .tx_shape = &rtw89_8852c_tx_shape, };
drivers/net/wireless/realtek/rtw89/rtw8852c_table.h +0 -2
@@ -15,8 +15,6 @@ extern const struct rtw89_phy_table rtw89_8852c_phy_nctl_table;extern const struct rtw89_txpwr_table rtw89_8852c_byr_table;extern const struct rtw89_phy_tssi_dbw_table rtw89_8852c_tssi_dbw_table;extern const struct rtw89_txpwr_track_cfg rtw89_8852c_trk_cfg; -extern const u8 rtw89_8852c_tx_shape[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ] - [RTW89_REGD_NUM ];extern const struct rtw89_rfe_parms rtw89_8852c_dflt_parms;#endif
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 3/7 wifi: rtw89: indicate TX power by rate table inside RFE parameter
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
For next-generation chips, TX power by rate table comes from RFE (RF front end) parameter. It can be different according to RFE type. So, we indicate TX power by rate table inside RFE parameter ahead. For current chips, even with different RFE types, a chip is configured with a single TX power by rate table. So, this commit doesn't really affect these currently supported chips.
--- drivers/net/wireless/realtek/rtw89/core.h | 2 +- drivers/net/wireless/realtek/rtw89/phy.c | 4 ++-- drivers/net/wireless/realtek/rtw89/rtw8851b.c | 1 - drivers/net/wireless/realtek/rtw89/rtw8851b_table.c | 3 +++ drivers/net/wireless/realtek/rtw89/rtw8851b_table.h | 1 - drivers/net/wireless/realtek/rtw89/rtw8852a.c | 1 - drivers/net/wireless/realtek/rtw89/rtw8852a_table.c | 2 ++ drivers/net/wireless/realtek/rtw89/rtw8852a_table.h | 1 - drivers/net/wireless/realtek/rtw89/rtw8852b.c | 1 - drivers/net/wireless/realtek/rtw89/rtw8852b_table.c | 2 ++ drivers/net/wireless/realtek/rtw89/rtw8852b_table.h | 1 - drivers/net/wireless/realtek/rtw89/rtw8852c.c | 1 - drivers/net/wireless/realtek/rtw89/rtw8852c_table.c | 2 ++ drivers/net/wireless/realtek/rtw89/rtw8852c_table.h | 1 - 14 files changed, 12 insertions(+), 11 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +1 -1
@@ -3355,6 +3355,7 @@ struct rtw89_txpwr_rule_6ghz { };struct rtw89_rfe_parms { +const struct rtw89_txpwr_table *byr_tbl;struct rtw89_txpwr_rule_2ghz rule_2ghz;struct rtw89_txpwr_rule_5ghz rule_5ghz;struct rtw89_txpwr_rule_6ghz rule_6ghz;
@@ -3553,7 +3554,6 @@ struct rtw89_chip_info {const struct rtw89_phy_table *rf_table[RF_PATH_MAX ];const struct rtw89_phy_table *nctl_table;const struct rtw89_rfk_tbl *nctl_post_table; -const struct rtw89_txpwr_table *byr_table;const struct rtw89_phy_dig_gain_table *dig_table;const struct rtw89_dig_regs *dig_regs;const struct rtw89_phy_tssi_dbw_table *tssi_dbw_table;
drivers/net/wireless/realtek/rtw89/phy.c +2 -2
@@ -4474,7 +4474,7 @@ static void rtw89_phy_env_monitor_init(struct rtw89_dev *rtwdev)void rtw89_phy_dm_init (struct rtw89_dev *rtwdev) { -const struct rtw89_chip_info *chip = rtwdev->chip; +const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms;rtw89_phy_stat_init (rtwdev);
@@ -4491,7 +4491,7 @@ void rtw89_phy_dm_init(struct rtw89_dev *rtwdev)rtw89_phy_init_rf_nctl (rtwdev);rtw89_chip_rfk_init (rtwdev); -rtw89_load_txpwr_table (rtwdev, chip->byr_table); +rtw89_load_txpwr_table (rtwdev, rfe_parms->byr_tbl);rtw89_chip_set_txpwr_ctrl (rtwdev);rtw89_chip_power_trim (rtwdev);rtw89_chip_cfg_txrx_path (rtwdev);
drivers/net/wireless/realtek/rtw89/rtw8851b.c +0 -1
@@ -2367,7 +2367,6 @@ const struct rtw89_chip_info rtw8851b_chip_info = { .rf_table = {&rtw89_8851b_phy_radioa_table,}, .nctl_table = &rtw89_8851b_phy_nctl_table, .nctl_post_table = &rtw8851b_nctl_post_defs_tbl, - .byr_table = &rtw89_8851b_byr_table, .dflt_parms = &rtw89_8851b_dflt_parms, .rfe_parms_conf = rtw89_8851b_rfe_parms_conf, .txpwr_factor_rf = 2,
drivers/net/wireless/realtek/rtw89/rtw8851b_table.c +3 -0
@@ -14795,6 +14795,7 @@ const struct rtw89_phy_table rtw89_8851b_phy_nctl_table = { .rf_path = 0, /* don't care */ }; +static const struct rtw89_txpwr_table rtw89_8851b_byr_table = { .data = rtw89_8851b_txpwr_byrate, .size =ARRAY_SIZE (rtw89_8851b_txpwr_byrate),
@@ -14811,6 +14812,7 @@ const struct rtw89_txpwr_track_cfg rtw89_8851b_trk_cfg = { };const struct rtw89_rfe_parms rtw89_8851b_dflt_parms = { + .byr_tbl = &rtw89_8851b_byr_table, .rule_2ghz = { .lmt = &rtw89_8851b_txpwr_lmt_2g, .lmt_ru = &rtw89_8851b_txpwr_lmt_ru_2g,
@@ -14823,6 +14825,7 @@ const struct rtw89_rfe_parms rtw89_8851b_dflt_parms = { };static const struct rtw89_rfe_parms rtw89_8851b_rfe_parms_type2 = { + .byr_tbl = &rtw89_8851b_byr_table, .rule_2ghz = { .lmt = &rtw89_8851b_txpwr_lmt_2g_type2, .lmt_ru = &rtw89_8851b_txpwr_lmt_ru_2g_type2,
drivers/net/wireless/realtek/rtw89/rtw8851b_table.h +0 -1
@@ -11,7 +11,6 @@ extern const struct rtw89_phy_table rtw89_8851b_phy_bb_table;extern const struct rtw89_phy_table rtw89_8851b_phy_bb_gain_table;extern const struct rtw89_phy_table rtw89_8851b_phy_radioa_table;extern const struct rtw89_phy_table rtw89_8851b_phy_nctl_table; -extern const struct rtw89_txpwr_table rtw89_8851b_byr_table;extern const struct rtw89_txpwr_track_cfg rtw89_8851b_trk_cfg;extern const struct rtw89_rfe_parms rtw89_8851b_dflt_parms;extern const struct rtw89_rfe_parms_conf rtw89_8851b_rfe_parms_conf[];
drivers/net/wireless/realtek/rtw89/rtw8852a.c +0 -1
@@ -2103,7 +2103,6 @@ const struct rtw89_chip_info rtw8852a_chip_info = { &rtw89_8852a_phy_radiob_table,}, .nctl_table = &rtw89_8852a_phy_nctl_table, .nctl_post_table = NULL, - .byr_table = &rtw89_8852a_byr_table, .dflt_parms = &rtw89_8852a_dflt_parms, .rfe_parms_conf = NULL, .txpwr_factor_rf = 2,
drivers/net/wireless/realtek/rtw89/rtw8852a_table.c +2 -0
@@ -51020,6 +51020,7 @@ const struct rtw89_phy_table rtw89_8852a_phy_nctl_table = { .rf_path = 0, /* don't care */ }; +static const struct rtw89_txpwr_table rtw89_8852a_byr_table = { .data = rtw89_8852a_txpwr_byrate, .size =ARRAY_SIZE (rtw89_8852a_txpwr_byrate),
@@ -51049,6 +51050,7 @@ const struct rtw89_phy_dig_gain_table rtw89_8852a_phy_dig_table = { };const struct rtw89_rfe_parms rtw89_8852a_dflt_parms = { + .byr_tbl = &rtw89_8852a_byr_table, .rule_2ghz = { .lmt = &rtw89_8852a_txpwr_lmt_2g, .lmt_ru = &rtw89_8852a_txpwr_lmt_ru_2g,
drivers/net/wireless/realtek/rtw89/rtw8852a_table.h +0 -1
@@ -11,7 +11,6 @@ extern const struct rtw89_phy_table rtw89_8852a_phy_bb_table;extern const struct rtw89_phy_table rtw89_8852a_phy_radioa_table;extern const struct rtw89_phy_table rtw89_8852a_phy_radiob_table;extern const struct rtw89_phy_table rtw89_8852a_phy_nctl_table; -extern const struct rtw89_txpwr_table rtw89_8852a_byr_table;extern const struct rtw89_phy_dig_gain_table rtw89_8852a_phy_dig_table;extern const struct rtw89_txpwr_track_cfg rtw89_8852a_trk_cfg;extern const struct rtw89_rfe_parms rtw89_8852a_dflt_parms;
drivers/net/wireless/realtek/rtw89/rtw8852b.c +0 -1
@@ -2537,7 +2537,6 @@ const struct rtw89_chip_info rtw8852b_chip_info = { &rtw89_8852b_phy_radiob_table,}, .nctl_table = &rtw89_8852b_phy_nctl_table, .nctl_post_table = NULL, - .byr_table = &rtw89_8852b_byr_table, .dflt_parms = &rtw89_8852b_dflt_parms, .rfe_parms_conf = NULL, .txpwr_factor_rf = 2,
drivers/net/wireless/realtek/rtw89/rtw8852b_table.c +2 -0
@@ -22860,6 +22860,7 @@ const struct rtw89_phy_table rtw89_8852b_phy_nctl_table = { .rf_path = 0, /* don't care */ }; +static const struct rtw89_txpwr_table rtw89_8852b_byr_table = { .data = rtw89_8852b_txpwr_byrate, .size =ARRAY_SIZE (rtw89_8852b_txpwr_byrate),
@@ -22882,6 +22883,7 @@ const struct rtw89_txpwr_track_cfg rtw89_8852b_trk_cfg = { };const struct rtw89_rfe_parms rtw89_8852b_dflt_parms = { + .byr_tbl = &rtw89_8852b_byr_table, .rule_2ghz = { .lmt = &rtw89_8852b_txpwr_lmt_2g, .lmt_ru = &rtw89_8852b_txpwr_lmt_ru_2g,
drivers/net/wireless/realtek/rtw89/rtw8852b_table.h +0 -1
@@ -12,7 +12,6 @@ extern const struct rtw89_phy_table rtw89_8852b_phy_bb_gain_table;extern const struct rtw89_phy_table rtw89_8852b_phy_radioa_table;extern const struct rtw89_phy_table rtw89_8852b_phy_radiob_table;extern const struct rtw89_phy_table rtw89_8852b_phy_nctl_table; -extern const struct rtw89_txpwr_table rtw89_8852b_byr_table;extern const struct rtw89_txpwr_track_cfg rtw89_8852b_trk_cfg;extern const struct rtw89_rfe_parms rtw89_8852b_dflt_parms;
drivers/net/wireless/realtek/rtw89/rtw8852c.c +0 -1
@@ -2845,7 +2845,6 @@ const struct rtw89_chip_info rtw8852c_chip_info = { &rtw89_8852c_phy_radioa_table,}, .nctl_table = &rtw89_8852c_phy_nctl_table, .nctl_post_table = NULL, - .byr_table = &rtw89_8852c_byr_table, .dflt_parms = &rtw89_8852c_dflt_parms, .rfe_parms_conf = NULL, .chanctx_listener = &rtw8852c_chanctx_listener,
drivers/net/wireless/realtek/rtw89/rtw8852c_table.c +2 -0
@@ -56426,6 +56426,7 @@ const struct rtw89_phy_table rtw89_8852c_phy_nctl_table = { .rf_path = 0, /* don't care */ }; +static const struct rtw89_txpwr_table rtw89_8852c_byr_table = { .data = rtw89_8852c_txpwr_byrate, .size =ARRAY_SIZE (rtw89_8852c_txpwr_byrate),
@@ -56462,6 +56463,7 @@ const struct rtw89_phy_tssi_dbw_table rtw89_8852c_tssi_dbw_table = { };const struct rtw89_rfe_parms rtw89_8852c_dflt_parms = { + .byr_tbl = &rtw89_8852c_byr_table, .rule_2ghz = { .lmt = &rtw89_8852c_txpwr_lmt_2g, .lmt_ru = &rtw89_8852c_txpwr_lmt_ru_2g,
drivers/net/wireless/realtek/rtw89/rtw8852c_table.h +0 -1
@@ -12,7 +12,6 @@ extern const struct rtw89_phy_table rtw89_8852c_phy_bb_gain_table;extern const struct rtw89_phy_table rtw89_8852c_phy_radioa_table;extern const struct rtw89_phy_table rtw89_8852c_phy_radiob_table;extern const struct rtw89_phy_table rtw89_8852c_phy_nctl_table; -extern const struct rtw89_txpwr_table rtw89_8852c_byr_table;extern const struct rtw89_phy_tssi_dbw_table rtw89_8852c_tssi_dbw_table;extern const struct rtw89_txpwr_track_cfg rtw89_8852c_trk_cfg;extern const struct rtw89_rfe_parms rtw89_8852c_dflt_parms;
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 4/7 wifi: rtw89: phy: refine helpers used for raw TX power
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
Originally, these helpers were implemented by macros. We rewrite them by normal functions. In the new function to seek raw TX power by rate, we access the array according to rate section and discard the original pointer arithmetic.
--- drivers/net/wireless/realtek/rtw89/core.h | 1 + drivers/net/wireless/realtek/rtw89/phy.c | 77 ++++++++++++----------- 2 files changed, 43 insertions(+), 35 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +1 -0
@@ -718,6 +718,7 @@ struct rtw89_txpwr_byrate {s8 mcs[RTW89_NSS_NUM ][RTW89_RATE_MCS_NUM ];s8 hedcm[RTW89_NSS_HEDCM_NUM ][RTW89_RATE_HEDCM_NUM ];s8 offset[RTW89_RATE_OFFSET_NUM ]; +s8 trap; };enum rtw89_bandwidth_section_num {
drivers/net/wireless/realtek/rtw89/phy.c +42 -35
124 lines not on this page · raw message
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 5/7 wifi: rtw89: load TX power by rate when RFE parms setup
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
Table of TX power by rate only needs to be loaded once. But, we originally loaded it every time we start core. Now, we load it one time along as RFE (RF Front End) parameters are determined.
--- drivers/net/wireless/realtek/rtw89/core.c | 14 ++++++++++---- drivers/net/wireless/realtek/rtw89/phy.c | 3 --- 2 files changed, 10 insertions(+), 7 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +10 -4
@@ -4008,21 +4008,27 @@ static void rtw89_core_setup_rfe_parms(struct rtw89_dev *rtwdev)const struct rtw89_chip_info *chip = rtwdev->chip;const struct rtw89_rfe_parms_conf *conf = chip->rfe_parms_conf;struct rtw89_efuse *efuse = &rtwdev->efuse; +const struct rtw89_rfe_parms *sel;u8 rfe_type = efuse->rfe_type; -if (!conf) +if (!conf) { + sel = chip->dflt_parms; goto out; + }while (conf->rfe_parms) {if (rfe_type == conf->rfe_type) { - rtwdev->rfe_parms = conf->rfe_parms; -return ; + sel = conf->rfe_parms; + goto out; } conf++; } + sel = chip->dflt_parms; + out: - rtwdev->rfe_parms = chip->dflt_parms; + rtwdev->rfe_parms = sel; +rtw89_load_txpwr_table (rtwdev, sel->byr_tbl); }static int rtw89_chip_efuse_info_setup (struct rtw89_dev *rtwdev)
drivers/net/wireless/realtek/rtw89/phy.c +0 -3
@@ -4481,8 +4481,6 @@ static void rtw89_phy_env_monitor_init(struct rtw89_dev *rtwdev)void rtw89_phy_dm_init (struct rtw89_dev *rtwdev) { -const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms; -rtw89_phy_stat_init (rtwdev);rtw89_chip_bb_sethw (rtwdev);
@@ -4498,7 +4496,6 @@ void rtw89_phy_dm_init(struct rtw89_dev *rtwdev)rtw89_phy_init_rf_nctl (rtwdev);rtw89_chip_rfk_init (rtwdev); -rtw89_load_txpwr_table (rtwdev, rfe_parms->byr_tbl);rtw89_chip_set_txpwr_ctrl (rtwdev);rtw89_chip_power_trim (rtwdev);rtw89_chip_cfg_txrx_path (rtwdev);
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 6/7 wifi: rtw89: phy: extend TX power common stuffs for Wi-Fi 7 chips
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
The following are introduced for Wi-Fi 7 chips.
1. take BW/OFDMA into account on TX power by rate
2. increase TX power offset types up to EHT
3. split TX shape into tx_shape_lmt and tx_shape_lmt_ru
If functions which are only for AX, they always access TX power by rate with BW/OFDMA = 0/0, and they don't access tx_shape's lmt_ru section.
--- drivers/net/wireless/realtek/rtw89/core.h | 48 +++++++++++++++---- drivers/net/wireless/realtek/rtw89/phy.c | 26 +++++----- drivers/net/wireless/realtek/rtw89/rtw8851b.c | 4 +- .../wireless/realtek/rtw89/rtw8851b_table.c | 4 +- drivers/net/wireless/realtek/rtw89/rtw8852b.c | 4 +- .../wireless/realtek/rtw89/rtw8852b_table.c | 2 +- drivers/net/wireless/realtek/rtw89/rtw8852c.c | 4 +- .../wireless/realtek/rtw89/rtw8852c_table.c | 2 +- 8 files changed, 63 insertions(+), 31 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +40 -8
@@ -640,12 +640,29 @@ enum rtw89_rate_section { RTW89_RS_TX_SHAPE_NUM = RTW89_RS_OFDM + 1, }; +enum rtw89_rate_offset_indexes { +RTW89_RATE_OFFSET_HE , +RTW89_RATE_OFFSET_VHT , +RTW89_RATE_OFFSET_HT , +RTW89_RATE_OFFSET_OFDM , +RTW89_RATE_OFFSET_CCK , +RTW89_RATE_OFFSET_DLRU_EHT , +RTW89_RATE_OFFSET_DLRU_HE , +RTW89_RATE_OFFSET_EHT , + __RTW89_RATE_OFFSET_NUM, + +RTW89_RATE_OFFSET_NUM_AX =RTW89_RATE_OFFSET_CCK +1 , +RTW89_RATE_OFFSET_NUM_BE =RTW89_RATE_OFFSET_EHT +1 , +}; +enum rtw89_rate_num {RTW89_RATE_CCK_NUM =4 ,RTW89_RATE_OFDM_NUM =8 , -RTW89_RATE_MCS_NUM =12 ,RTW89_RATE_HEDCM_NUM =4 ,/* for HEDCM MCS0/1/3/4 */ -RTW89_RATE_OFFSET_NUM =5 ,/* for HE(HEDCM)/VHT/HT/OFDM/CCK offset */ + +RTW89_RATE_MCS_NUM_AX =12 , +RTW89_RATE_MCS_NUM_BE =16 , + __RTW89_RATE_MCS_NUM =16 , };enum rtw89_nss {
@@ -670,6 +687,12 @@ enum rtw89_beamforming_type { RTW89_BF_NUM, }; +enum rtw89_ofdma_type { +RTW89_NON_OFDMA =0 , +RTW89_OFDMA =1 , +RTW89_OFDMA_NUM , +}; +enum rtw89_regulation_type {RTW89_WW =0 ,RTW89_ETSI =1 ,
@@ -715,9 +738,9 @@ enum rtw89_fw_pkt_ofld_type {struct rtw89_txpwr_byrate {s8 cck[RTW89_RATE_CCK_NUM ];s8 ofdm[RTW89_RATE_OFDM_NUM ]; -s8 mcs[RTW89_NSS_NUM ][RTW89_RATE_MCS_NUM ]; -s8 hedcm[RTW89_NSS_HEDCM_NUM ][RTW89_RATE_HEDCM_NUM ]; -s8 offset[RTW89_RATE_OFFSET_NUM ]; +s8 mcs[RTW89_OFDMA_NUM ][RTW89_NSS_NUM ][__RTW89_RATE_MCS_NUM]; +s8 hedcm[RTW89_OFDMA_NUM ][RTW89_NSS_HEDCM_NUM ][RTW89_RATE_HEDCM_NUM ]; +s8 offset[__RTW89_RATE_OFFSET_NUM];s8 trap; };
@@ -754,6 +777,7 @@ struct rtw89_txpwr_limit_ru {struct rtw89_rate_desc {enum rtw89_nss nss;enum rtw89_rate_section rs; +enum rtw89_ofdma_type ofdma;u8 idx; };
@@ -861,13 +885,16 @@ enum rtw89_ps_mode {#define RTW89_2G_BW_NUM (RTW89_CHANNEL_WIDTH_40 + 1)#define RTW89_5G_BW_NUM (RTW89_CHANNEL_WIDTH_160 + 1) -#define RTW89_6G_BW_NUM (RTW89_CHANNEL_WIDTH_160 + 1) +#define RTW89_6G_BW_NUM (RTW89_CHANNEL_WIDTH_320 + 1) +#define RTW89_BYR_BW_NUM (RTW89_CHANNEL_WIDTH_320 + 1)#define RTW89_PPE_BW_NUM (RTW89_CHANNEL_WIDTH_160 + 1)enum rtw89_ru_bandwidth {RTW89_RU26 =0 ,RTW89_RU52 =1 ,RTW89_RU106 =2 , +RTW89_RU52_26 =3 , +RTW89_RU106_26 =4 ,RTW89_RU_NUM , };
@@ -3355,12 +3382,17 @@ struct rtw89_txpwr_rule_6ghz { [RTW89_6G_CH_NUM ]; }; +struct rtw89_tx_shape { +const u8 (*lmt)[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ][RTW89_REGD_NUM ]; +const u8 (*lmt_ru)[RTW89_BAND_NUM ][RTW89_REGD_NUM ]; +}; +struct rtw89_rfe_parms {const struct rtw89_txpwr_table *byr_tbl;struct rtw89_txpwr_rule_2ghz rule_2ghz;struct rtw89_txpwr_rule_5ghz rule_5ghz;struct rtw89_txpwr_rule_6ghz rule_6ghz; -const u8 (*tx_shape)[RTW89_BAND_NUM ][RTW89_RS_TX_SHAPE_NUM ][RTW89_REGD_NUM ]; +struct rtw89_tx_shape tx_shape; };struct rtw89_rfe_parms_conf {
@@ -4597,7 +4629,7 @@ struct rtw89_dev {bool is_bt_iqk_timeout;struct rtw89_fem_info fem; -struct rtw89_txpwr_byrate byr[RTW89_BAND_NUM ]; +struct rtw89_txpwr_byrate byr[RTW89_BAND_NUM ][RTW89_BYR_BW_NUM ];struct rtw89_tssi_info tssi;struct rtw89_power_trim_info pwr_trim;
drivers/net/wireless/realtek/rtw89/phy.c +13 -13
@@ -1522,9 +1522,9 @@ EXPORT_SYMBOL(rtw89_phy_write_reg3_tbl);static const u8 rtw89_rs_idx_num[] = { [RTW89_RS_CCK ] =RTW89_RATE_CCK_NUM , [RTW89_RS_OFDM ] =RTW89_RATE_OFDM_NUM , - [RTW89_RS_MCS ] =RTW89_RATE_MCS_NUM , + [RTW89_RS_MCS ] =RTW89_RATE_MCS_NUM_AX , [RTW89_RS_HEDCM ] =RTW89_RATE_HEDCM_NUM , - [RTW89_RS_OFFSET ] =RTW89_RATE_OFFSET_NUM , + [RTW89_RS_OFFSET ] =RTW89_RATE_OFFSET_NUM_AX , };static const u8 rtw89_rs_nss_num[] = {
@@ -1546,9 +1546,9 @@ s8 *rtw89_phy_raw_byr_seek(struct rtw89_dev *rtwdev,case RTW89_RS_OFDM :return &head->ofdm[desc->idx];case RTW89_RS_MCS : -return &head->mcs[desc->nss][desc->idx]; +return &head->mcs[desc->ofdma][desc->nss][desc->idx];case RTW89_RS_HEDCM : -return &head->hedcm[desc->nss][desc->idx]; +return &head->hedcm[desc->ofdma][desc->nss][desc->idx];case RTW89_RS_OFFSET :return &head->offset[desc->idx];default :
@@ -1569,7 +1569,7 @@ void rtw89_phy_load_txpwr_byrate(struct rtw89_dev *rtwdev,u8 i;for (; cfg < end; cfg++) { - byr_head = &rtwdev->byr[cfg->band]; + byr_head = &rtwdev->byr[cfg->band][0 ]; desc.rs = cfg->rs; desc.nss = cfg->nss; data = cfg->data;
@@ -1591,7 +1591,7 @@ static s8 rtw89_phy_txpwr_rf_to_mac(struct rtw89_dev *rtwdev, s8 txpwr_rf) }static -s8 rtw89_phy_read_txpwr_byrate (struct rtw89_dev *rtwdev,u8 band, +s8 rtw89_phy_read_txpwr_byrate (struct rtw89_dev *rtwdev,u8 band,u8 bw,const struct rtw89_rate_desc *rate_desc) {struct rtw89_txpwr_byrate *byr_head;
@@ -1600,7 +1600,7 @@ s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band,if (rate_desc->rs ==RTW89_RS_CCK ) band =RTW89_BAND_2G ; - byr_head = &rtwdev->byr[band]; + byr_head = &rtwdev->byr[band][bw]; byr =rtw89_phy_raw_byr_seek (rtwdev, byr_head, rate_desc);return rtw89_phy_txpwr_rf_to_mac (rtwdev, *byr);
@@ -2110,7 +2110,7 @@ void rtw89_phy_set_txpwr_byrate(struct rtw89_dev *rtwdev,RTW89_RS_MCS , RTW89_RS_HEDCM, }; -struct rtw89_rate_desc cur; +struct rtw89_rate_desc cur = {};u8 band = chan->band_type;u8 ch = chan->channel;u32 addr, val;
@@ -2136,7 +2136,7 @@ void rtw89_phy_set_txpwr_byrate(struct rtw89_dev *rtwdev, cur.idx++) { v[cur.idx %4 ] =rtw89_phy_read_txpwr_byrate (rtwdev, - band, + band,0 , &cur);if ((cur.idx +1 ) %4 )
@@ -2165,15 +2165,15 @@ void rtw89_phy_set_txpwr_offset(struct rtw89_dev *rtwdev, .rs = RTW89_RS_OFFSET, };u8 band = chan->band_type; -s8 v[RTW89_RATE_OFFSET_NUM ] = {}; +s8 v[RTW89_RATE_OFFSET_NUM_AX ] = {};u32 val;rtw89_debug (rtwdev,RTW89_DBG_TXPWR ,"[TXPWR] set txpwr offset\n" ); -for (desc.idx =0 ; desc.idx <RTW89_RATE_OFFSET_NUM ; desc.idx++) - v[desc.idx] =rtw89_phy_read_txpwr_byrate (rtwdev, band, &desc); +for (desc.idx =0 ; desc.idx <RTW89_RATE_OFFSET_NUM_AX ; desc.idx++) + v[desc.idx] =rtw89_phy_read_txpwr_byrate (rtwdev, band,0 , &desc); -BUILD_BUG_ON (RTW89_RATE_OFFSET_NUM !=5 ); +BUILD_BUG_ON (RTW89_RATE_OFFSET_NUM_AX !=5 ); val =FIELD_PREP (GENMASK (3 ,0 ), v[0 ]) |FIELD_PREP (GENMASK (7 ,4 ), v[1 ]) | FIELD_PREP(GENMASK(11, 8), v[2]) |
drivers/net/wireless/realtek/rtw89/rtw8851b.c +2 -2
@@ -1707,8 +1707,8 @@ static void rtw8851b_set_tx_shape(struct rtw89_dev *rtwdev,const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms;u8 band = chan->band_type;u8 regd =rtw89_regd_get (rtwdev, band); -u8 tx_shape_cck = (*rfe_parms->tx_shape)[band][RTW89_RS_CCK ][regd]; -u8 tx_shape_ofdm = (*rfe_parms->tx_shape)[band][RTW89_RS_OFDM ][regd]; +u8 tx_shape_cck = (*rfe_parms->tx_shape.lmt)[band][RTW89_RS_CCK ][regd]; +u8 tx_shape_ofdm = (*rfe_parms->tx_shape.lmt)[band][RTW89_RS_OFDM ][regd];if (band ==RTW89_BAND_2G )rtw8851b_bb_set_tx_shape_dfir (rtwdev, chan, tx_shape_cck, phy_idx);
drivers/net/wireless/realtek/rtw89/rtw8851b_table.c +2 -2
@@ -14821,7 +14821,7 @@ const struct rtw89_rfe_parms rtw89_8851b_dflt_parms = { .lmt = &rtw89_8851b_txpwr_lmt_5g, .lmt_ru = &rtw89_8851b_txpwr_lmt_ru_5g, }, - .tx_shape = &rtw89_8851b_tx_shape, + .tx_shape.lmt = &rtw89_8851b_tx_shape, }; static const struct rtw89_rfe_parms rtw89_8851b_rfe_parms_type2 = {
@@ -14834,7 +14834,7 @@ static const struct rtw89_rfe_parms rtw89_8851b_rfe_parms_type2 = { .lmt = &rtw89_8851b_txpwr_lmt_5g_type2, .lmt_ru = &rtw89_8851b_txpwr_lmt_ru_5g_type2, }, - .tx_shape = &rtw89_8851b_tx_shape, + .tx_shape.lmt = &rtw89_8851b_tx_shape, }; const struct rtw89_rfe_parms_conf rtw89_8851b_rfe_parms_conf[] = {
drivers/net/wireless/realtek/rtw89/rtw8852b.c +2 -2
@@ -1692,8 +1692,8 @@ static void rtw8852b_set_tx_shape(struct rtw89_dev *rtwdev,const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms;u8 band = chan->band_type;u8 regd =rtw89_regd_get (rtwdev, band); -u8 tx_shape_cck = (*rfe_parms->tx_shape)[band][RTW89_RS_CCK ][regd]; -u8 tx_shape_ofdm = (*rfe_parms->tx_shape)[band][RTW89_RS_OFDM ][regd]; +u8 tx_shape_cck = (*rfe_parms->tx_shape.lmt)[band][RTW89_RS_CCK ][regd]; +u8 tx_shape_ofdm = (*rfe_parms->tx_shape.lmt)[band][RTW89_RS_OFDM ][regd];if (band ==RTW89_BAND_2G )rtw8852b_bb_set_tx_shape_dfir (rtwdev, chan, tx_shape_cck, phy_idx);
drivers/net/wireless/realtek/rtw89/rtw8852b_table.c +1 -1
@@ -22892,5 +22892,5 @@ const struct rtw89_rfe_parms rtw89_8852b_dflt_parms = { .lmt = &rtw89_8852b_txpwr_lmt_5g, .lmt_ru = &rtw89_8852b_txpwr_lmt_ru_5g, }, - .tx_shape = &rtw89_8852b_tx_shape, + .tx_shape.lmt = &rtw89_8852b_tx_shape, };
drivers/net/wireless/realtek/rtw89/rtw8852c.c +2 -2
@@ -1969,8 +1969,8 @@ static void rtw8852c_set_tx_shape(struct rtw89_dev *rtwdev,const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms;u8 band = chan->band_type;u8 regd =rtw89_regd_get (rtwdev, band); -u8 tx_shape_cck = (*rfe_parms->tx_shape)[band][RTW89_RS_CCK ][regd]; -u8 tx_shape_ofdm = (*rfe_parms->tx_shape)[band][RTW89_RS_OFDM ][regd]; +u8 tx_shape_cck = (*rfe_parms->tx_shape.lmt)[band][RTW89_RS_CCK ][regd]; +u8 tx_shape_ofdm = (*rfe_parms->tx_shape.lmt)[band][RTW89_RS_OFDM ][regd];if (band ==RTW89_BAND_2G )rtw8852c_bb_set_tx_shape_dfir (rtwdev, chan, tx_shape_cck, phy_idx);
drivers/net/wireless/realtek/rtw89/rtw8852c_table.c +1 -1
@@ -56476,5 +56476,5 @@ const struct rtw89_rfe_parms rtw89_8852c_dflt_parms = { .lmt = &rtw89_8852c_txpwr_lmt_6g, .lmt_ru = &rtw89_8852c_txpwr_lmt_ru_6g, }, - .tx_shape = &rtw89_8852c_tx_shape, + .tx_shape.lmt = &rtw89_8852c_tx_shape, };
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 7/7 wifi: rtw89: load TX power related tables from FW elements
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
The following FW elements are recognized, and then the valid entries in them are loaded into SW struct case by case.
* TX power by rate
* TX power limit 2 GHz
* TX power limit 5 GHz
* TX power limit 6 GHz
* TX power limit RU 2 GHz
* TX power limit RU 5 GHz
* TX power limit RU 6 GHz
* TX shape limit
* TX shape limit RU
One single firmware file can contain multiples of each of the above FW elements. Each of them is configured with a target RFE (RF front end) type. We choose one of the multiples to load based on RFE type. If there are multiples of the same FW elements with the same target RFE type. The last one will be applied.
We don't want to have many loading variants for above FW elements. Even if between different chips or between different generations, we would like to maintain only one single set of loadings. So, the loadings are designed to consider compatibility. The main concepts are listed below.
* The driver structures, which are used to cast binary entry from FW, cannot insert new members in the middle. If there are something new, they should always be appended at the tail.
* Each binary entry from FW uses a dictionary way containing a key set and a data. The keys in the key set indicate where to put the data.
* If size of driver struct and size of binary entry do not match when loading, it means the number of keys in the key set are different. Then, we deal with compatibility. No matter which one has more keys, we take/use zero on those mismatched keys.
If driver struct is bigger (backward compatibility):
e.g. SW uses two keys, but FW is built with one key. Then, put the data of FW(keyX) into SW[keyX][0].
If binary entry is bigger (forward compatibility):
e.g. FW is built with two keys, but SW uses one key. Then, only take the data of FW(keyX, keyY = 0) into SW[keyX]
Besides, chip info setup flow is tweaked a bit for the following.
* Before loading FW elements, we need to determine chip RFE via efuse.
* Setting up RFE parameters depends on loading FW elements ahead.
--- drivers/net/wireless/realtek/rtw89/core.c | 15 +- drivers/net/wireless/realtek/rtw89/core.h | 90 ++++ drivers/net/wireless/realtek/rtw89/fw.c | 530 ++++++++++++++++++++++ drivers/net/wireless/realtek/rtw89/fw.h | 130 ++++++ drivers/net/wireless/realtek/rtw89/phy.c | 1 - drivers/net/wireless/realtek/rtw89/phy.h | 3 + 6 files changed, 761 insertions(+), 8 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +8 -7
@@ -4027,8 +4027,8 @@ static void rtw89_core_setup_rfe_parms(struct rtw89_dev *rtwdev) sel = chip->dflt_parms; out: - rtwdev->rfe_parms = sel; -rtw89_load_txpwr_table (rtwdev, sel->byr_tbl); + rtwdev->rfe_parms =rtw89_load_rfe_data_from_fw (rtwdev, sel); +rtw89_load_txpwr_table (rtwdev, rtwdev->rfe_parms->byr_tbl); }static int rtw89_chip_efuse_info_setup (struct rtw89_dev *rtwdev)
@@ -4052,7 +4052,6 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)return ret;rtw89_core_setup_phycap (rtwdev); -rtw89_core_setup_rfe_parms (rtwdev);rtw89_mac_pwr_off (rtwdev);
@@ -4084,20 +4083,21 @@ int rtw89_chip_info_setup(struct rtw89_dev *rtwdev)return ret; } + ret =rtw89_chip_efuse_info_setup (rtwdev); +if (ret) +return ret; + ret =rtw89_fw_recognize_elements (rtwdev);if (ret) {rtw89_err (rtwdev,"failed to recognize firmware elements\n" );return ret; } - ret =rtw89_chip_efuse_info_setup (rtwdev); -if (ret) -return ret; - ret =rtw89_chip_board_info_setup (rtwdev);if (ret)return ret; +rtw89_core_setup_rfe_parms (rtwdev); rtwdev->ps_mode =rtw89_update_ps_mode (rtwdev);return 0 ;
@@ -4309,6 +4309,7 @@ EXPORT_SYMBOL(rtw89_alloc_ieee80211_hw);void rtw89_free_ieee80211_hw (struct rtw89_dev *rtwdev) {kfree (rtwdev->ops); +kfree (rtwdev->rfe_data);release_firmware (rtwdev->fw.req.firmware);ieee80211_free_hw (rtwdev->hw); }
drivers/net/wireless/realtek/rtw89/core.h +90 -0
102 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/fw.c +530 -0
545 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/fw.h +130 -0
150 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/phy.c +0 -1
@@ -1535,7 +1535,6 @@ static const u8 rtw89_rs_nss_num[] = { [RTW89_RS_OFFSET] = 1, }; -static s8 *rtw89_phy_raw_byr_seek (struct rtw89_dev *rtwdev,struct rtw89_txpwr_byrate *head,const struct rtw89_rate_desc *desc)
drivers/net/wireless/realtek/rtw89/phy.h +3 -0
@@ -613,6 +613,9 @@ void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask, u32 data, enum rtw89_phy_idx phy_idx);u32 rtw89_phy_read32_idx (struct rtw89_dev *rtwdev,u32 addr,u32 mask,enum rtw89_phy_idx phy_idx); +s8 *rtw89_phy_raw_byr_seek (struct rtw89_dev *rtwdev, +struct rtw89_txpwr_byrate *head, +const struct rtw89_rate_desc *desc);void rtw89_phy_load_txpwr_byrate (struct rtw89_dev *rtwdev,const struct rtw89_txpwr_table *tbl); s8 rtw89_phy_read_txpwr_limit(struct rtw89_dev *rtwdev, u8 band,
Signature · 1 line
2.25.1