Skip to content

Commit 3fd552b

Browse files
committed
Merge tag 'rtw-next-2025-03-13' of https://github.com/pkshih/rtw
Ping-Ke Shih says: ==================== rtw-next patches for v6.15 Some minor fixes and refinements of rtw89. The only major change is rtw88: * support RTL8814AE/RTL8814AU ==================== Signed-off-by: Johannes Berg <[email protected]>
2 parents cd0b9da + d58ad77 commit 3fd552b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+27583
-339
lines changed

drivers/net/wireless/realtek/rtw88/Kconfig

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ config RTW88_8812A
5454
tristate
5555
select RTW88_88XXA
5656

57+
config RTW88_8814A
58+
tristate
59+
5760
config RTW88_8822BE
5861
tristate "Realtek 8822BE PCI wireless network adapter"
5962
depends on PCI
@@ -222,6 +225,28 @@ config RTW88_8812AU
222225

223226
802.11ac USB wireless network adapter
224227

228+
config RTW88_8814AE
229+
tristate "Realtek 8814AE PCI wireless network adapter"
230+
depends on PCI
231+
select RTW88_CORE
232+
select RTW88_PCI
233+
select RTW88_8814A
234+
help
235+
Select this option will enable support for 8814AE chipset
236+
237+
802.11ac PCIe wireless network adapter
238+
239+
config RTW88_8814AU
240+
tristate "Realtek 8814AU USB wireless network adapter"
241+
depends on USB
242+
select RTW88_CORE
243+
select RTW88_USB
244+
select RTW88_8814A
245+
help
246+
Select this option will enable support for 8814AU chipset
247+
248+
802.11ac USB wireless network adapter
249+
225250
config RTW88_DEBUG
226251
bool "Realtek rtw88 debug support"
227252
depends on RTW88_CORE

drivers/net/wireless/realtek/rtw88/Makefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,15 @@ rtw88_8821au-objs := rtw8821au.o
9494
obj-$(CONFIG_RTW88_8812AU) += rtw88_8812au.o
9595
rtw88_8812au-objs := rtw8812au.o
9696

97+
obj-$(CONFIG_RTW88_8814A) += rtw88_8814a.o
98+
rtw88_8814a-objs := rtw8814a.o rtw8814a_table.o
99+
100+
obj-$(CONFIG_RTW88_8814AE) += rtw88_8814ae.o
101+
rtw88_8814ae-objs := rtw8814ae.o
102+
103+
obj-$(CONFIG_RTW88_8814AU) += rtw88_8814au.o
104+
rtw88_8814au-objs := rtw8814au.o
105+
97106
obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o
98107
rtw88_pci-objs := pci.o
99108

drivers/net/wireless/realtek/rtw88/debug.c

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -654,10 +654,10 @@ static void rtw_print_rate(struct seq_file *m, u8 rate)
654654
case DESC_RATE6M...DESC_RATE54M:
655655
rtw_print_ofdm_rate_txt(m, rate);
656656
break;
657-
case DESC_RATEMCS0...DESC_RATEMCS15:
657+
case DESC_RATEMCS0...DESC_RATEMCS31:
658658
rtw_print_ht_rate_txt(m, rate);
659659
break;
660-
case DESC_RATEVHT1SS_MCS0...DESC_RATEVHT2SS_MCS9:
660+
case DESC_RATEVHT1SS_MCS0...DESC_RATEVHT4SS_MCS9:
661661
rtw_print_vht_rate_txt(m, rate);
662662
break;
663663
default:
@@ -692,9 +692,11 @@ static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
692692
{
693693
struct rtw_debugfs_priv *debugfs_priv = m->private;
694694
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
695+
struct rtw_power_params pwr_param = {0};
695696
struct rtw_hal *hal = &rtwdev->hal;
697+
u8 nss = rtwdev->efuse.hw_cap.nss;
696698
u8 path, rate, bw, ch, regd;
697-
struct rtw_power_params pwr_param = {0};
699+
u8 max_ht_rate, max_rate;
698700

699701
mutex_lock(&rtwdev->mutex);
700702
bw = hal->current_band_width;
@@ -707,19 +709,23 @@ static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
707709
seq_printf(m, "%-4s %-10s %-9s %-9s (%-4s %-4s %-4s) %-4s\n",
708710
"path", "rate", "pwr", "base", "byr", "lmt", "sar", "rem");
709711

712+
max_ht_rate = DESC_RATEMCS0 + nss * 8 - 1;
713+
714+
if (rtwdev->chip->vht_supported)
715+
max_rate = DESC_RATEVHT1SS_MCS0 + nss * 10 - 1;
716+
else
717+
max_rate = max_ht_rate;
718+
710719
mutex_lock(&hal->tx_power_mutex);
711-
for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
720+
for (path = RF_PATH_A; path < hal->rf_path_num; path++) {
712721
/* there is no CCK rates used in 5G */
713722
if (hal->current_band_type == RTW_BAND_5G)
714723
rate = DESC_RATE6M;
715724
else
716725
rate = DESC_RATE1M;
717726

718-
/* now, not support vht 3ss and vht 4ss*/
719-
for (; rate <= DESC_RATEVHT2SS_MCS9; rate++) {
720-
/* now, not support ht 3ss and ht 4ss*/
721-
if (rate > DESC_RATEMCS15 &&
722-
rate < DESC_RATEVHT1SS_MCS0)
727+
for (; rate <= max_rate; rate++) {
728+
if (rate > max_ht_rate && rate <= DESC_RATEMCS31)
723729
continue;
724730

725731
rtw_get_tx_power_params(rtwdev, path, rate, bw,
@@ -849,20 +855,28 @@ static int rtw_debugfs_get_phy_info(struct seq_file *m, void *v)
849855
last_cnt->num_qry_pkt[rate_id + 9]);
850856
}
851857

852-
seq_printf(m, "[RSSI(dBm)] = {%d, %d}\n",
858+
seq_printf(m, "[RSSI(dBm)] = {%d, %d, %d, %d}\n",
853859
dm_info->rssi[RF_PATH_A] - 100,
854-
dm_info->rssi[RF_PATH_B] - 100);
855-
seq_printf(m, "[Rx EVM(dB)] = {-%d, -%d}\n",
860+
dm_info->rssi[RF_PATH_B] - 100,
861+
dm_info->rssi[RF_PATH_C] - 100,
862+
dm_info->rssi[RF_PATH_D] - 100);
863+
seq_printf(m, "[Rx EVM(dB)] = {-%d, -%d, -%d, -%d}\n",
856864
dm_info->rx_evm_dbm[RF_PATH_A],
857-
dm_info->rx_evm_dbm[RF_PATH_B]);
858-
seq_printf(m, "[Rx SNR] = {%d, %d}\n",
865+
dm_info->rx_evm_dbm[RF_PATH_B],
866+
dm_info->rx_evm_dbm[RF_PATH_C],
867+
dm_info->rx_evm_dbm[RF_PATH_D]);
868+
seq_printf(m, "[Rx SNR] = {%d, %d, %d, %d}\n",
859869
dm_info->rx_snr[RF_PATH_A],
860-
dm_info->rx_snr[RF_PATH_B]);
861-
seq_printf(m, "[CFO_tail(KHz)] = {%d, %d}\n",
870+
dm_info->rx_snr[RF_PATH_B],
871+
dm_info->rx_snr[RF_PATH_C],
872+
dm_info->rx_snr[RF_PATH_D]);
873+
seq_printf(m, "[CFO_tail(KHz)] = {%d, %d, %d, %d}\n",
862874
dm_info->cfo_tail[RF_PATH_A],
863-
dm_info->cfo_tail[RF_PATH_B]);
875+
dm_info->cfo_tail[RF_PATH_B],
876+
dm_info->cfo_tail[RF_PATH_C],
877+
dm_info->cfo_tail[RF_PATH_D]);
864878

865-
if (dm_info->curr_rx_rate >= DESC_RATE11M) {
879+
if (dm_info->curr_rx_rate >= DESC_RATE6M) {
866880
seq_puts(m, "[Rx Average Status]:\n");
867881
seq_printf(m, " * OFDM, EVM: {-%d}, SNR: {%d}\n",
868882
(u8)ewma_evm_read(&ewma_evm[RTW_EVM_OFDM]),
@@ -875,6 +889,13 @@ static int rtw_debugfs_get_phy_info(struct seq_file *m, void *v)
875889
(u8)ewma_evm_read(&ewma_evm[RTW_EVM_2SS_B]),
876890
(u8)ewma_snr_read(&ewma_snr[RTW_SNR_2SS_A]),
877891
(u8)ewma_snr_read(&ewma_snr[RTW_SNR_2SS_B]));
892+
seq_printf(m, " * 3SS, EVM: {-%d, -%d, -%d}, SNR: {%d, %d, %d}\n",
893+
(u8)ewma_evm_read(&ewma_evm[RTW_EVM_3SS_A]),
894+
(u8)ewma_evm_read(&ewma_evm[RTW_EVM_3SS_B]),
895+
(u8)ewma_evm_read(&ewma_evm[RTW_EVM_3SS_C]),
896+
(u8)ewma_snr_read(&ewma_snr[RTW_SNR_3SS_A]),
897+
(u8)ewma_snr_read(&ewma_snr[RTW_SNR_3SS_B]),
898+
(u8)ewma_snr_read(&ewma_snr[RTW_SNR_3SS_C]));
878899
}
879900

880901
seq_puts(m, "[Rx Counter]:\n");

drivers/net/wireless/realtek/rtw88/mac.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
291291
if (rtw_read8(rtwdev, REG_CR) == 0xea)
292292
cur_pwr = false;
293293
else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB &&
294+
chip->id != RTW_CHIP_TYPE_8814A &&
294295
(rtw_read8(rtwdev, REG_SYS_STATUS1 + 1) & BIT(0)))
295296
cur_pwr = false;
296297
else

drivers/net/wireless/realtek/rtw88/main.c

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1565,6 +1565,7 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
15651565
{
15661566
const struct rtw_chip_info *chip = rtwdev->chip;
15671567
struct rtw_efuse *efuse = &rtwdev->efuse;
1568+
int i;
15681569

15691570
ht_cap->ht_supported = true;
15701571
ht_cap->cap = 0;
@@ -1584,25 +1585,20 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
15841585
ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
15851586
ht_cap->ampdu_density = chip->ampdu_density;
15861587
ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
1587-
if (efuse->hw_cap.nss > 1) {
1588-
ht_cap->mcs.rx_mask[0] = 0xFF;
1589-
ht_cap->mcs.rx_mask[1] = 0xFF;
1590-
ht_cap->mcs.rx_mask[4] = 0x01;
1591-
ht_cap->mcs.rx_highest = cpu_to_le16(300);
1592-
} else {
1593-
ht_cap->mcs.rx_mask[0] = 0xFF;
1594-
ht_cap->mcs.rx_mask[1] = 0x00;
1595-
ht_cap->mcs.rx_mask[4] = 0x01;
1596-
ht_cap->mcs.rx_highest = cpu_to_le16(150);
1597-
}
1588+
1589+
for (i = 0; i < efuse->hw_cap.nss; i++)
1590+
ht_cap->mcs.rx_mask[i] = 0xFF;
1591+
ht_cap->mcs.rx_mask[4] = 0x01;
1592+
ht_cap->mcs.rx_highest = cpu_to_le16(150 * efuse->hw_cap.nss);
15981593
}
15991594

16001595
static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
16011596
struct ieee80211_sta_vht_cap *vht_cap)
16021597
{
16031598
struct rtw_efuse *efuse = &rtwdev->efuse;
1604-
u16 mcs_map;
1599+
u16 mcs_map = 0;
16051600
__le16 highest;
1601+
int i;
16061602

16071603
if (efuse->hw_cap.ptcl != EFUSE_HW_CAP_IGNORE &&
16081604
efuse->hw_cap.ptcl != EFUSE_HW_CAP_PTCL_VHT)
@@ -1625,21 +1621,15 @@ static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
16251621
if (rtw_chip_has_rx_ldpc(rtwdev))
16261622
vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
16271623

1628-
mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
1629-
IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
1630-
IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
1631-
IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
1632-
IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
1633-
IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
1634-
IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
1635-
if (efuse->hw_cap.nss > 1) {
1636-
highest = cpu_to_le16(780);
1637-
mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << 2;
1638-
} else {
1639-
highest = cpu_to_le16(390);
1640-
mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << 2;
1624+
for (i = 0; i < 8; i++) {
1625+
if (i < efuse->hw_cap.nss)
1626+
mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
1627+
else
1628+
mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
16411629
}
16421630

1631+
highest = cpu_to_le16(390 * efuse->hw_cap.nss);
1632+
16431633
vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
16441634
vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
16451635
vht_cap->vht_mcs.rx_highest = highest;

drivers/net/wireless/realtek/rtw88/main.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,9 @@ enum rtw_evm {
386386
RTW_EVM_1SS,
387387
RTW_EVM_2SS_A,
388388
RTW_EVM_2SS_B,
389+
RTW_EVM_3SS_A,
390+
RTW_EVM_3SS_B,
391+
RTW_EVM_3SS_C,
389392
/* keep it last */
390393
RTW_EVM_NUM
391394
};
@@ -403,6 +406,10 @@ enum rtw_snr {
403406
RTW_SNR_2SS_B,
404407
RTW_SNR_2SS_C,
405408
RTW_SNR_2SS_D,
409+
RTW_SNR_3SS_A,
410+
RTW_SNR_3SS_B,
411+
RTW_SNR_3SS_C,
412+
RTW_SNR_3SS_D,
406413
/* keep it last */
407414
RTW_SNR_NUM
408415
};
@@ -828,7 +835,7 @@ struct rtw_vif {
828835
};
829836

830837
struct rtw_regulatory {
831-
char alpha2[2];
838+
char alpha2[2] __nonstring;
832839
u8 txpwr_regd_2g;
833840
u8 txpwr_regd_5g;
834841
};

drivers/net/wireless/realtek/rtw88/phy.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2458,32 +2458,56 @@ void rtw_phy_config_swing_table(struct rtw_dev *rtwdev,
24582458
swing_table->n[RF_PATH_A] = tbl->pwrtrk_2g_ccka_n;
24592459
swing_table->p[RF_PATH_B] = tbl->pwrtrk_2g_cckb_p;
24602460
swing_table->n[RF_PATH_B] = tbl->pwrtrk_2g_cckb_n;
2461+
swing_table->p[RF_PATH_C] = tbl->pwrtrk_2g_cckc_p;
2462+
swing_table->n[RF_PATH_C] = tbl->pwrtrk_2g_cckc_n;
2463+
swing_table->p[RF_PATH_D] = tbl->pwrtrk_2g_cckd_p;
2464+
swing_table->n[RF_PATH_D] = tbl->pwrtrk_2g_cckd_n;
24612465
} else {
24622466
swing_table->p[RF_PATH_A] = tbl->pwrtrk_2ga_p;
24632467
swing_table->n[RF_PATH_A] = tbl->pwrtrk_2ga_n;
24642468
swing_table->p[RF_PATH_B] = tbl->pwrtrk_2gb_p;
24652469
swing_table->n[RF_PATH_B] = tbl->pwrtrk_2gb_n;
2470+
swing_table->p[RF_PATH_C] = tbl->pwrtrk_2gc_p;
2471+
swing_table->n[RF_PATH_C] = tbl->pwrtrk_2gc_n;
2472+
swing_table->p[RF_PATH_D] = tbl->pwrtrk_2gd_p;
2473+
swing_table->n[RF_PATH_D] = tbl->pwrtrk_2gd_n;
24662474
}
24672475
} else if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel)) {
24682476
swing_table->p[RF_PATH_A] = tbl->pwrtrk_5ga_p[RTW_PWR_TRK_5G_1];
24692477
swing_table->n[RF_PATH_A] = tbl->pwrtrk_5ga_n[RTW_PWR_TRK_5G_1];
24702478
swing_table->p[RF_PATH_B] = tbl->pwrtrk_5gb_p[RTW_PWR_TRK_5G_1];
24712479
swing_table->n[RF_PATH_B] = tbl->pwrtrk_5gb_n[RTW_PWR_TRK_5G_1];
2480+
swing_table->p[RF_PATH_C] = tbl->pwrtrk_5gc_p[RTW_PWR_TRK_5G_1];
2481+
swing_table->n[RF_PATH_C] = tbl->pwrtrk_5gc_n[RTW_PWR_TRK_5G_1];
2482+
swing_table->p[RF_PATH_D] = tbl->pwrtrk_5gd_p[RTW_PWR_TRK_5G_1];
2483+
swing_table->n[RF_PATH_D] = tbl->pwrtrk_5gd_n[RTW_PWR_TRK_5G_1];
24722484
} else if (IS_CH_5G_BAND_3(channel)) {
24732485
swing_table->p[RF_PATH_A] = tbl->pwrtrk_5ga_p[RTW_PWR_TRK_5G_2];
24742486
swing_table->n[RF_PATH_A] = tbl->pwrtrk_5ga_n[RTW_PWR_TRK_5G_2];
24752487
swing_table->p[RF_PATH_B] = tbl->pwrtrk_5gb_p[RTW_PWR_TRK_5G_2];
24762488
swing_table->n[RF_PATH_B] = tbl->pwrtrk_5gb_n[RTW_PWR_TRK_5G_2];
2489+
swing_table->p[RF_PATH_C] = tbl->pwrtrk_5gc_p[RTW_PWR_TRK_5G_2];
2490+
swing_table->n[RF_PATH_C] = tbl->pwrtrk_5gc_n[RTW_PWR_TRK_5G_2];
2491+
swing_table->p[RF_PATH_D] = tbl->pwrtrk_5gd_p[RTW_PWR_TRK_5G_2];
2492+
swing_table->n[RF_PATH_D] = tbl->pwrtrk_5gd_n[RTW_PWR_TRK_5G_2];
24772493
} else if (IS_CH_5G_BAND_4(channel)) {
24782494
swing_table->p[RF_PATH_A] = tbl->pwrtrk_5ga_p[RTW_PWR_TRK_5G_3];
24792495
swing_table->n[RF_PATH_A] = tbl->pwrtrk_5ga_n[RTW_PWR_TRK_5G_3];
24802496
swing_table->p[RF_PATH_B] = tbl->pwrtrk_5gb_p[RTW_PWR_TRK_5G_3];
24812497
swing_table->n[RF_PATH_B] = tbl->pwrtrk_5gb_n[RTW_PWR_TRK_5G_3];
2498+
swing_table->p[RF_PATH_C] = tbl->pwrtrk_5gc_p[RTW_PWR_TRK_5G_3];
2499+
swing_table->n[RF_PATH_C] = tbl->pwrtrk_5gc_n[RTW_PWR_TRK_5G_3];
2500+
swing_table->p[RF_PATH_D] = tbl->pwrtrk_5gd_p[RTW_PWR_TRK_5G_3];
2501+
swing_table->n[RF_PATH_D] = tbl->pwrtrk_5gd_n[RTW_PWR_TRK_5G_3];
24822502
} else {
24832503
swing_table->p[RF_PATH_A] = tbl->pwrtrk_2ga_p;
24842504
swing_table->n[RF_PATH_A] = tbl->pwrtrk_2ga_n;
24852505
swing_table->p[RF_PATH_B] = tbl->pwrtrk_2gb_p;
24862506
swing_table->n[RF_PATH_B] = tbl->pwrtrk_2gb_n;
2507+
swing_table->p[RF_PATH_C] = tbl->pwrtrk_2gc_p;
2508+
swing_table->n[RF_PATH_C] = tbl->pwrtrk_2gc_n;
2509+
swing_table->p[RF_PATH_D] = tbl->pwrtrk_2gd_p;
2510+
swing_table->n[RF_PATH_D] = tbl->pwrtrk_2gd_n;
24872511
}
24882512
}
24892513
EXPORT_SYMBOL(rtw_phy_config_swing_table);

0 commit comments

Comments
 (0)