Skip to contentSkip to conversation

wifi: rtw88: 8821c: Add HP single-antenna quirk

PATCH In review not-eexto 2 participants 4 messages Sep 11 – Sep 20 1 message not in the archive Realtek wireless driver (rtw88)

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

not-eexto

author
#1 lore raw

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
index 9f0964d..32c7de5 100644
@@ -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
maintainer
#2 lore raw
Quoted 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 overrides efuse->rfe_option and efuse->rfe_option_full to 4 (Aux), routing the RF path to the physically connected antenna.

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
index 9f0964d..32c7de5 100644

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 -0
 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;
+

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

#3 lore raw
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?

maintainer
#4 lore raw
Quoted 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 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?

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