Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx> wrote: > Although the RTL8814AU only has 3 spatial streams, maybe some other chip > has 4. > > Correct the TX power index and TX power limit calculations for 3SS and > 4SS HT/VHT rates. > > With this the RTL8814AU can set the TX power correctly. > > Signed-off-by: Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx> > --- > I just realised this patch depends on another pending patch: > https://lore.kernel.org/linux-wireless/8a60f581-0ab5-4d98-a97d-dd83b605008f@xxxxxxxxx/ > > Originally this patch was going to be in part 2, but then I rearranged > them. Too late to turn back now... Next time, if you want rearrange two or more patchset, just ask me to drop all patches and re-send with increasing version number. > --- > drivers/net/wireless/realtek/rtw88/main.h | 4 + > drivers/net/wireless/realtek/rtw88/phy.c | 149 ++++++++++++------ > drivers/net/wireless/realtek/rtw88/phy.h | 4 + > drivers/net/wireless/realtek/rtw88/rtw8821c.c | 2 +- > drivers/net/wireless/realtek/rtw88/rtw8822b.c | 2 +- > drivers/net/wireless/realtek/rtw88/rtw8822c.c | 2 +- > drivers/net/wireless/realtek/rtw88/rtw88xxa.c | 2 +- > 7 files changed, 114 insertions(+), 51 deletions(-) > > diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h > index ba64d269521a..bbae6d7c1aa9 100644 > --- a/drivers/net/wireless/realtek/rtw88/main.h > +++ b/drivers/net/wireless/realtek/rtw88/main.h > @@ -166,6 +166,10 @@ enum rtw_rate_section { > RTW_RATE_SECTION_HT_2S, > RTW_RATE_SECTION_VHT_1S, > RTW_RATE_SECTION_VHT_2S, Suggest to add a __RTW_RATE_SECTION_2SS_MAX = RTW_RATE_SECTION_VHT_2S, or __RTW_RATE_SECTION_2SS_NUM = RTW_RATE_SECTION_HT_3S, (Be careful the place, enumerator will increase automatically) (The suffix of existing RTW_RATE_SECTION_MAX is wrong -- _NUM instead of _MAX) > + RTW_RATE_SECTION_HT_3S, > + RTW_RATE_SECTION_HT_4S, > + RTW_RATE_SECTION_VHT_3S, > + RTW_RATE_SECTION_VHT_4S, > > /* keep last */ > RTW_RATE_SECTION_MAX, > diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c > index 8ed20c89d216..5ddc9d4988b8 100644 > --- a/drivers/net/wireless/realtek/rtw88/phy.c > +++ b/drivers/net/wireless/realtek/rtw88/phy.c > @@ -53,21 +53,25 @@ static const u32 db_invert_table[12][8] = { > }; > > u8 rtw_cck_rates[] = { DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M, DESC_RATE11M }; > + > u8 rtw_ofdm_rates[] = { > DESC_RATE6M, DESC_RATE9M, DESC_RATE12M, > DESC_RATE18M, DESC_RATE24M, DESC_RATE36M, > DESC_RATE48M, DESC_RATE54M > }; > + > u8 rtw_ht_1s_rates[] = { > DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2, > DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5, > DESC_RATEMCS6, DESC_RATEMCS7 > }; > + > u8 rtw_ht_2s_rates[] = { > DESC_RATEMCS8, DESC_RATEMCS9, DESC_RATEMCS10, > DESC_RATEMCS11, DESC_RATEMCS12, DESC_RATEMCS13, > DESC_RATEMCS14, DESC_RATEMCS15 > }; > + > u8 rtw_vht_1s_rates[] = { > DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1, > DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3, > @@ -75,6 +79,7 @@ u8 rtw_vht_1s_rates[] = { > DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7, > DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9 > }; > + > u8 rtw_vht_2s_rates[] = { > DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1, > DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3, > @@ -82,10 +87,41 @@ u8 rtw_vht_2s_rates[] = { > DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7, > DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9 > }; > + > +u8 rtw_ht_3s_rates[] = { > + DESC_RATEMCS16, DESC_RATEMCS17, DESC_RATEMCS18, > + DESC_RATEMCS19, DESC_RATEMCS20, DESC_RATEMCS21, > + DESC_RATEMCS22, DESC_RATEMCS23 > +}; > + > +u8 rtw_ht_4s_rates[] = { > + DESC_RATEMCS24, DESC_RATEMCS25, DESC_RATEMCS26, > + DESC_RATEMCS27, DESC_RATEMCS28, DESC_RATEMCS29, > + DESC_RATEMCS30, DESC_RATEMCS31 > +}; > + > +u8 rtw_vht_3s_rates[] = { > + DESC_RATEVHT3SS_MCS0, DESC_RATEVHT3SS_MCS1, > + DESC_RATEVHT3SS_MCS2, DESC_RATEVHT3SS_MCS3, > + DESC_RATEVHT3SS_MCS4, DESC_RATEVHT3SS_MCS5, > + DESC_RATEVHT3SS_MCS6, DESC_RATEVHT3SS_MCS7, > + DESC_RATEVHT3SS_MCS8, DESC_RATEVHT3SS_MCS9 > +}; > + > +u8 rtw_vht_4s_rates[] = { > + DESC_RATEVHT4SS_MCS0, DESC_RATEVHT4SS_MCS1, > + DESC_RATEVHT4SS_MCS2, DESC_RATEVHT4SS_MCS3, > + DESC_RATEVHT4SS_MCS4, DESC_RATEVHT4SS_MCS5, > + DESC_RATEVHT4SS_MCS6, DESC_RATEVHT4SS_MCS7, > + DESC_RATEVHT4SS_MCS8, DESC_RATEVHT4SS_MCS9 > +}; > + > u8 *rtw_rate_section[RTW_RATE_SECTION_MAX] = { > rtw_cck_rates, rtw_ofdm_rates, > rtw_ht_1s_rates, rtw_ht_2s_rates, > - rtw_vht_1s_rates, rtw_vht_2s_rates > + rtw_vht_1s_rates, rtw_vht_2s_rates, > + rtw_ht_3s_rates, rtw_ht_4s_rates, > + rtw_vht_3s_rates, rtw_vht_4s_rates > }; > EXPORT_SYMBOL(rtw_rate_section); > > @@ -95,17 +131,14 @@ u8 rtw_rate_size[RTW_RATE_SECTION_MAX] = { > ARRAY_SIZE(rtw_ht_1s_rates), > ARRAY_SIZE(rtw_ht_2s_rates), > ARRAY_SIZE(rtw_vht_1s_rates), > - ARRAY_SIZE(rtw_vht_2s_rates) > + ARRAY_SIZE(rtw_vht_2s_rates), > + ARRAY_SIZE(rtw_ht_3s_rates), > + ARRAY_SIZE(rtw_ht_4s_rates), > + ARRAY_SIZE(rtw_vht_3s_rates), > + ARRAY_SIZE(rtw_vht_4s_rates) > }; > EXPORT_SYMBOL(rtw_rate_size); > > -static const u8 rtw_cck_size = ARRAY_SIZE(rtw_cck_rates); > -static const u8 rtw_ofdm_size = ARRAY_SIZE(rtw_ofdm_rates); > -static const u8 rtw_ht_1s_size = ARRAY_SIZE(rtw_ht_1s_rates); > -static const u8 rtw_ht_2s_size = ARRAY_SIZE(rtw_ht_2s_rates); > -static const u8 rtw_vht_1s_size = ARRAY_SIZE(rtw_vht_1s_rates); > -static const u8 rtw_vht_2s_size = ARRAY_SIZE(rtw_vht_2s_rates); > - > enum rtw_phy_band_type { > PHY_BAND_2G = 0, > PHY_BAND_5G = 1, > @@ -1635,10 +1668,12 @@ static void > rtw_xref_txpwr_lmt_by_rs(struct rtw_dev *rtwdev, u8 regd, u8 bw, u8 ch_idx) > { > u8 rs_idx, rs_ht, rs_vht; > - u8 rs_cmp[2][2] = {{RTW_RATE_SECTION_HT_1S, RTW_RATE_SECTION_VHT_1S}, > - {RTW_RATE_SECTION_HT_2S, RTW_RATE_SECTION_VHT_2S} }; > + u8 rs_cmp[4][2] = {{RTW_RATE_SECTION_HT_1S, RTW_RATE_SECTION_VHT_1S}, > + {RTW_RATE_SECTION_HT_2S, RTW_RATE_SECTION_VHT_2S}, > + {RTW_RATE_SECTION_HT_3S, RTW_RATE_SECTION_VHT_3S}, > + {RTW_RATE_SECTION_HT_4S, RTW_RATE_SECTION_VHT_4S} }; Can be 'static const' by the way. > > - for (rs_idx = 0; rs_idx < 2; rs_idx++) { > + for (rs_idx = 0; rs_idx < 4; rs_idx++) { > rs_ht = rs_cmp[rs_idx][0]; > rs_vht = rs_cmp[rs_idx][1]; > [...] > diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c > index cc152248407c..106a9e38e428 100644 > --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c > +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c > @@ -709,7 +709,7 @@ static void rtw8821c_set_tx_power_index(struct rtw_dev *rtwdev) > int rs, path; > > for (path = 0; path < hal->rf_path_num; path++) { > - for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) { > + for (rs = 0; rs < RTW_RATE_SECTION_HT_3S; rs++) { As mentioned above, rs < __RTW_RATE_SECTION_2SS_NUM or rs <= __RTW_RATE_SECTION_2SS_MAX > if (rs == RTW_RATE_SECTION_HT_2S || > rs == RTW_RATE_SECTION_VHT_2S) > continue;