wifi: rtw88: 8821c: Add HP single-antenna quirk
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 wifi: rtw88: 8821c: Add HP single-antenna quirk
Certain HP laptop platforms with RTL8821CE (PCI ID 10ec:c821, subsystem 103c:831a) are manufactured with only a single physical antenna wire connected to the Aux/S1 port (Port 2). As documented in the OEM Windows INF file (netrtwlane.inf):
"single ant(connect to right one S1)"
However, the eFuse on these chipsets reports RFE Type 2 (Main antenna, Port 1), causing the hardware SPDT RF switch to route to an unconnected port under Linux. This leads to severe signal attenuation (~ -86 dBm) and frequent beacon-loss disconnections.
Add an automatic quirk in rtw8821c_read_efuse() for HP subsystem 10ec:c821 [103c:831a] that overrides efuse->rfe_option and efuse->rfe_option_full to 4 (Aux), routing the RF path to the physically connected antenna.
--- rtw8821c.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/net/wireless/realtek/rtw88/rtw8821c.c +18 -0
@@ -15,6 +15,9 @@#include "debug.h" #include "bf.h" #include "regd.h" +#if IS_ENABLED (CONFIG_PCI ) +#include <linux/pci.h> +#endif static const s8 lna_gain_table_0[8 ] = {22 ,8 ,-6 ,-22 ,-31 ,-40 ,-46 ,-52 };static const s8 lna_gain_table_1[16 ] = {10 ,6 ,2 ,-2 ,-6 ,-10 ,-14 ,-17 ,
@@ -56,6 +59,21 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) efuse->rfe_option = map->rfe_option &0x1f ; efuse->rfe_option_full = map->rfe_option; + +#if IS_ENABLED (CONFIG_PCI ) +if (rtw_hci_type (rtwdev) ==RTW_HCI_TYPE_PCIE &&dev_is_pci (rtwdev->dev)) { +struct pci_dev *pdev =to_pci_dev (rtwdev->dev); + +if (pdev->vendor ==PCI_VENDOR_ID_REALTEK && + pdev->device ==0xc821 && + pdev->subsystem_vendor ==0x103c && + pdev->subsystem_device ==0x831a ) { + efuse->rfe_option =4 ; + efuse->rfe_option_full =4 ; +rtw_info (rtwdev,"HP quirk auto-detected (10ec:c821 [103c:831a]): forced RFE option 4 (Aux antenna S1)\n" ); + } + } +#endif efuse->rf_board_option = map->rf_board_option; efuse->crystal_cap = map->xtal_k; efuse->pa_type_2g = map->pa_type;
Signature · 1 line
2.43.0
Ping-Ke Shih
maintainerQuoted 11 lines · not-eexto
Certain HP laptop platforms with RTL8821CE (PCI ID 10ec:c821, subsystem 103c:831a) are manufactured with only a single physical antenna wire connected to the Aux/S1 port (Port 2). As documented in the OEM Windows INF file (netrtwlane.inf):
"single ant(connect to right one S1)"However, the eFuse on these chipsets reports RFE Type 2 (Main antenna, Port 1), causing the hardware SPDT RF switch to route to an unconnected port under Linux. This leads to severe signal attenuation (~ -86 dBm) and frequent beacon-loss disconnections.
Quoted 6 lines
Add an automatic quirk in
rtw8821c_read_efuse()for HP subsystem 10ec:c821 [103c:831a] that overridesefuse->rfe_optionandefuse->rfe_option_fullto 4 (Aux), routing the RF path to the physically connected antenna.Signed-off-by not-eexto <[email protected]>
Should use your full real name.
You sent the same patch by different mail address. I'll drop previous one.
Quoted 10 lines
--- rtw8821c.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)drivers/net/wireless/realtek/rtw88/rtw8821c.c +0
-0
drivers/net/wireless/realtek/rtw88/rtw8821c.c line 20
Quoted 6 lines
drivers/net/wireless/realtek/rtw88/rtw8821c.c +3
-0@@ -15,6 +15,9 @@#include "debug.h" #include "bf.h" #include "regd.h" +#if IS_ENABLED (CONFIG_PCI ) +#include <linux/pci.h> +#endif
If this is the only one platform which needs this kind of quirk. Add an entry to rtw_pci_quirks[].
Quoted 8 lines
drivers/net/wireless/realtek/rtw88/rtw8821c.c +1
-0static const s8 lna_gain_table_0[8 ] = {22 ,8 ,-6 ,-22 ,-31 ,-40 ,-46 ,-52 };static const s8 lna_gain_table_1[16 ] = {10 ,6 ,2 ,-2 ,-6 ,-10 ,-14 ,-17 ,@@ -56,6 +59,21 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) efuse->rfe_option = map->rfe_option &0x1f ; efuse->rfe_option_full = map->rfe_option; +
drivers/net/wireless/realtek/rtw88/rtw8821c.c static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) · line 72
Quoted 10 lines
drivers/net/wireless/realtek/rtw88/rtw8821c.c +10
-0+#if IS_ENABLED (CONFIG_PCI ) +if (rtw_hci_type (rtwdev) ==RTW_HCI_TYPE_PCIE &&dev_is_pci (rtwdev->dev)) { +struct pci_dev *pdev =to_pci_dev (rtwdev->dev); + +if (pdev->vendor ==PCI_VENDOR_ID_REALTEK && + pdev->device ==0xc821 && + pdev->subsystem_vendor ==0x103c && + pdev->subsystem_device ==0x831a ) { + efuse->rfe_option =4 ; + efuse->rfe_option_full =4 ;
I don't see rtw88 has ' rfe_option_full' ?
Quoted 10 lines
drivers/net/wireless/realtek/rtw88/rtw8821c.c +4
-0+ rtw_info(rtwdev, "HP quirk auto-detected (10ec:c821 [103c:831a]): forced RFE option 4 (Aux antenna S1)\n"); + } + } +#endif efuse->rf_board_option = map->rf_board_option; efuse->crystal_cap = map->xtal_k;efuse->pa_type_2g = map->pa_type;--
2.43.0
Quoted 3 lines · Ping-Ke Shih
Should use your full real name.
You sent the same patch by different mail address. I'll drop previous one.
Both patch submissions were identical, but please ignore the submission from [email protected]. I will use this address ([email protected]) with my full legal name (Paolo Lazzaroni) for all future submissions and v2.
Quoted 1 line
I don't see rtw88 has '
rfe_option_full' ?
Apologies, the previous patch was based on an out-of-tree backport tree. I have checked out rtw-next where rfe_option_full does not exist, and will only set efuse->rfe_option in v2.
Quoted 2 lines
If this is the only one platform which needs this kind of quirk. Add an entry to rtw_pci_quirks[].
Regarding rtw_pci_quirks[]:
The reason I matched the PCI subsystem ID (10ec:c821 [103c:831a]) rather than DMI in rtw_pci_quirks[] is that HP assigns this specific subsystem ID across a family of laptop platforms (e.g. HP 15-da, 15-db, and related chassis) to denote the single physical antenna connected to Aux/S1. This is documented in the OEM Windows driver INF (netrtwlane.inf):
"PCI\VEN_10EC&DEV_C821&SUBSYS_831A103C ;;single ant(connect to right one S1)"
If we use DMI matching in rtw_pci_quirks[], it would only match this specific laptop SKU ("HP Laptop 15-da0xxx" / "4XW76EA#ABZ"), leaving other HP models sharing this identical 103c:831a single-antenna card with severe signal loss.
However, I understand that inspecting PCI structures inside rtw8821c_read_efuse() violates bus abstraction for rtw8821c.c.
Would you prefer:
Option A: Keep the PCI subsystem match, but handle it cleanly in rtw_pci_probe()
(e.g., setting a flag or rfe_option override in rtwdev before chip setup)?
Option B: Add a DMI entry to rtw_pci_quirks[] matching this platform?
Ping-Ke Shih
maintainerQuoted 16 lines · Paolo Lazzaroni
Quoted 2 lines
If this is the only one platform which needs this kind of quirk. Add an entry to rtw_pci_quirks[].
Regarding rtw_pci_quirks[]:
The reason I matched the PCI subsystem ID (10ec:c821 [103c:831a]) rather than DMI in rtw_pci_quirks[] is that HP assigns this specific subsystem ID across a family of laptop platforms (e.g. HP 15-da, 15-db, and related chassis) to denote the single physical antenna connected to Aux/S1. This is documented in the OEM Windows driver INF (netrtwlane.inf):
"PCI\VEN_10EC&DEV_C821&SUBSYS_831A103C ;;single ant(connect to right one S1)"If we use DMI matching in rtw_pci_quirks[], it would only match this specific laptop SKU ("HP Laptop 15-da0xxx" / "4XW76EA#ABZ"), leaving other HP models sharing this identical 103c:831a single-antenna card with severe signal loss.
Quoted 7 lines
However, I understand that inspecting PCI structures inside
rtw8821c_read_efuse()violates bus abstraction forrtw8821c.c.Would you prefer:
Option A: Keep the PCI subsystem match, but handle it cleanly inrtw_pci_probe()
(e.g., setting a flag orrfe_optionoverride in rtwdev before chip setup)?
Option B: Add a DMI entry to rtw_pci_quirks[] matching this platform?
I prefer option A, but yes, please handle it cleanly in pci.c. You can flag a quirk at pci.c, and update rfe_option in 8821c.c.
Ping-Ke