* [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings
@ 2026-07-17 6:19 Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 1/9] wifi: rtw89: add LED support to reflect the wireless association status Ping-Ke Shih
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
First two patches are to add LED support, including mono-/multi-color LED.
All chips can support mono-color LED triggered by association state, and
the multicolor LED is limited to board design according to VID/PID.
Patch 3 is to disable 2 GHz band support, which a specific board doesn't
want this by design.
Patches 4-5 are changes of RF TX IQ calibration, which has format and
flow changes.
Others are random registers change according to internal update.
Chih-Kang Chang (2):
wifi: rtw89: rfk: update TXIQK H2C command format to v1
wifi: rtw89: 8922d: bypass TXIQK when scan
David Lee (1):
wifi: rtw89: 8852cu: add quirk to disable 2.4 GHz band
Johnson Tsai (2):
wifi: rtw89: add LED support to reflect the wireless association
status
wifi: rtw89: add multicolor LED support for RTL8852CU valve board
Ping-Ke Shih (4):
wifi: rtw89: wow: extend timeout unit to avoid SER false alarm
wifi: rtw89: pci: set PCIe maximum TS1 for RTL8922DE
wifi: rtw89: 8922d: reduce IO in power-on function
wifi: rtw89: phy: set CFR to manual mode for some 2GHz channels
drivers/net/wireless/realtek/rtw89/Kconfig | 14 ++
drivers/net/wireless/realtek/rtw89/Makefile | 2 +
drivers/net/wireless/realtek/rtw89/core.c | 7 +
drivers/net/wireless/realtek/rtw89/core.h | 38 +++++
drivers/net/wireless/realtek/rtw89/debug.h | 1 +
drivers/net/wireless/realtek/rtw89/fw.c | 35 +++--
drivers/net/wireless/realtek/rtw89/fw.h | 7 +-
drivers/net/wireless/realtek/rtw89/led.c | 139 ++++++++++++++++++
drivers/net/wireless/realtek/rtw89/led.h | 37 +++++
drivers/net/wireless/realtek/rtw89/led_mc.c | 81 ++++++++++
drivers/net/wireless/realtek/rtw89/pci.h | 3 +-
drivers/net/wireless/realtek/rtw89/pci_be.c | 11 +-
drivers/net/wireless/realtek/rtw89/phy_be.c | 8 +-
drivers/net/wireless/realtek/rtw89/reg.h | 12 ++
.../net/wireless/realtek/rtw89/rtw8851be.c | 1 +
.../net/wireless/realtek/rtw89/rtw8851bu.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852ae.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852au.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852be.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852bte.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852bu.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852ce.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852cu.c | 57 ++++++-
.../net/wireless/realtek/rtw89/rtw8922ae.c | 2 +
.../net/wireless/realtek/rtw89/rtw8922au.c | 1 +
drivers/net/wireless/realtek/rtw89/rtw8922d.c | 82 +++++++++--
.../net/wireless/realtek/rtw89/rtw8922de.c | 2 +
27 files changed, 521 insertions(+), 26 deletions(-)
create mode 100644 drivers/net/wireless/realtek/rtw89/led.c
create mode 100644 drivers/net/wireless/realtek/rtw89/led.h
create mode 100644 drivers/net/wireless/realtek/rtw89/led_mc.c
base-commit: 730dbda6dc70d29180eb2a7e9fa36823838bb042
--
2.25.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rtw-next 1/9] wifi: rtw89: add LED support to reflect the wireless association status
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 2/9] wifi: rtw89: add multicolor LED support for RTL8852CU valve board Ping-Ke Shih
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
From: Johnson Tsai <wenjie.tsai@realtek.com>
Add a new RTW89_LEDS Kconfig option, along with LED structures to describe
flexible GPIO mappings for chip common LED definition. Core LED lifecycle
and registration logic default to the mac80211 association trigger, and
chips are wired up as the first user with a single-GPIO monochrome LED.
Usage:
- Auto-triggered (default):
ON when connected, OFF when disconnected
- Manual override:
echo <1|0> > /sys/class/leds/rtw89-phyX/brightness
Signed-off-by: Johnson Tsai <wenjie.tsai@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/Kconfig | 7 ++
drivers/net/wireless/realtek/rtw89/Makefile | 1 +
drivers/net/wireless/realtek/rtw89/core.c | 3 +
drivers/net/wireless/realtek/rtw89/core.h | 22 ++++
drivers/net/wireless/realtek/rtw89/debug.h | 1 +
drivers/net/wireless/realtek/rtw89/led.c | 123 ++++++++++++++++++++
drivers/net/wireless/realtek/rtw89/led.h | 24 ++++
7 files changed, 181 insertions(+)
create mode 100644 drivers/net/wireless/realtek/rtw89/led.c
create mode 100644 drivers/net/wireless/realtek/rtw89/led.h
diff --git a/drivers/net/wireless/realtek/rtw89/Kconfig b/drivers/net/wireless/realtek/rtw89/Kconfig
index 43e3b0ef44da..be31eaab7621 100644
--- a/drivers/net/wireless/realtek/rtw89/Kconfig
+++ b/drivers/net/wireless/realtek/rtw89/Kconfig
@@ -190,4 +190,11 @@ config RTW89_DEBUGFS
If unsure, say Y to simplify debug problems
+config RTW89_LEDS
+ bool
+ depends on RTW89_CORE
+ depends on LEDS_CLASS=y || LEDS_CLASS=MAC80211
+ imply MAC80211_LEDS
+ default y
+
endif
diff --git a/drivers/net/wireless/realtek/rtw89/Makefile b/drivers/net/wireless/realtek/rtw89/Makefile
index 475bad743d75..3d47f13d1e66 100644
--- a/drivers/net/wireless/realtek/rtw89/Makefile
+++ b/drivers/net/wireless/realtek/rtw89/Makefile
@@ -92,6 +92,7 @@ obj-$(CONFIG_RTW89_8922AU) += rtw89_8922au.o
rtw89_8922au-objs := rtw8922au.o
rtw89_core-$(CONFIG_RTW89_DEBUG) += debug.o
+rtw89_core-$(CONFIG_RTW89_LEDS) += led.o
obj-$(CONFIG_RTW89_PCI) += rtw89_pci.o
rtw89_pci-y := pci.o pci_be.o
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index b4b0a451fed7..bb04f649bfb0 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -11,6 +11,7 @@
#include "core.h"
#include "efuse.h"
#include "fw.h"
+#include "led.h"
#include "mac.h"
#include "phy.h"
#include "ps.h"
@@ -7588,6 +7589,7 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev)
rtw89_rfkill_polling_init(rtwdev);
rtw89_btc_init(rtwdev);
+ rtw89_led_init(rtwdev);
return 0;
@@ -7601,6 +7603,7 @@ static void rtw89_core_unregister_hw(struct rtw89_dev *rtwdev)
{
struct ieee80211_hw *hw = rtwdev->hw;
+ rtw89_led_deinit(rtwdev);
rtw89_rfkill_polling_deinit(rtwdev);
ieee80211_unregister_hw(hw);
}
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index c0795e0d10cd..41cc519317c9 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -10,6 +10,7 @@
#include <linux/dmi.h>
#include <linux/firmware.h>
#include <linux/iopoll.h>
+#include <linux/leds.h>
#include <linux/workqueue.h>
#include <net/mac80211.h>
@@ -5278,6 +5279,26 @@ struct rtw89_chanctx_listener {
#define RTW89_NHM_TH_NUM 11
#define RTW89_NHM_RPT_NUM 12
+struct rtw89_led_gpio_entry {
+ u8 pin;
+ struct rtw89_reg3_def pinmux;
+ struct rtw89_reg2_def mode;
+ struct rtw89_reg2_def out;
+};
+
+struct rtw89_led_desc {
+ const struct rtw89_led_gpio_entry *gpios;
+ u8 n_gpio;
+};
+
+struct rtw89_led {
+ bool registered;
+ const struct rtw89_led_desc *desc;
+ struct led_classdev led;
+ enum led_brightness brightness_cache;
+ char name[32];
+};
+
struct rtw89_chip_info {
enum rtw89_core_chip_id chip_id;
enum rtw89_chip_gen chip_gen;
@@ -7245,6 +7266,7 @@ struct rtw89_dev {
struct rtw89_debugfs *debugfs;
struct rtw89_vif *pure_monitor_mode_vif;
+ struct rtw89_led led;
/* HCI related data, keep last */
u8 priv[] __aligned(sizeof(void *));
diff --git a/drivers/net/wireless/realtek/rtw89/debug.h b/drivers/net/wireless/realtek/rtw89/debug.h
index 7cdceb24f52d..f53d8acbd0d2 100644
--- a/drivers/net/wireless/realtek/rtw89/debug.h
+++ b/drivers/net/wireless/realtek/rtw89/debug.h
@@ -32,6 +32,7 @@ enum rtw89_debug_mask {
RTW89_DBG_ACPI = BIT(21),
RTW89_DBG_EDCCA = BIT(22),
RTW89_DBG_PS = BIT(23),
+ RTW89_DBG_LED = BIT(24),
RTW89_DBG_UNEXP = BIT(31),
};
diff --git a/drivers/net/wireless/realtek/rtw89/led.c b/drivers/net/wireless/realtek/rtw89/led.c
new file mode 100644
index 000000000000..64e7eaa7ee39
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw89/led.c
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2026 Realtek Corporation
+ */
+
+#include "core.h"
+#include "debug.h"
+#include "led.h"
+#include "reg.h"
+
+static const struct rtw89_led_gpio_entry rtw89_common_led_gpios[] = {{
+ .pin = 8,
+ .pinmux = {.addr = R_AX_GPIO8_15_FUNC_SEL, .mask = GENMASK(3, 0), .data = 0xf},
+ .mode = {.addr = R_AX_GPIO_EXT_CTRL + 2, .data = BIT(0) | BIT(8)},
+ .out = {.addr = R_AX_GPIO_EXT_CTRL + 1, .data = BIT(0)},
+}};
+
+static const struct rtw89_led_desc rtw89_common_led_desc = {
+ .gpios = rtw89_common_led_gpios,
+ .n_gpio = ARRAY_SIZE(rtw89_common_led_gpios),
+};
+
+void rtw89_led_gpio_config(struct rtw89_dev *rtwdev,
+ const struct rtw89_led_gpio_entry *e)
+{
+ rtw89_write32_mask(rtwdev, e->pinmux.addr, e->pinmux.mask, e->pinmux.data);
+ rtw89_write16_clr(rtwdev, e->mode.addr, e->mode.data);
+}
+
+void rtw89_led_gpio_set(struct rtw89_dev *rtwdev,
+ const struct rtw89_led_gpio_entry *e,
+ enum led_brightness brightness)
+{
+ if (brightness == LED_OFF) {
+ rtw89_write16_clr(rtwdev, e->mode.addr, e->mode.data);
+ } else {
+ rtw89_write16_set(rtwdev, e->mode.addr, e->mode.data);
+ rtw89_write8_clr(rtwdev, e->out.addr, e->out.data);
+ }
+}
+
+static int rtw89_led_set(struct led_classdev *led, enum led_brightness brightness)
+{
+ struct rtw89_led *rtw_led = container_of(led, struct rtw89_led, led);
+ struct rtw89_dev *rtwdev = container_of(rtw_led, struct rtw89_dev, led);
+ const struct rtw89_led_desc *desc = rtw_led->desc;
+ const struct rtw89_led_gpio_entry *e = &desc->gpios[0];
+
+ if (rtw_led->brightness_cache == brightness) {
+ rtw89_debug(rtwdev, RTW89_DBG_LED, "led_set: pin=%u skip (no change)\n",
+ e->pin);
+ return 0;
+ }
+
+ wiphy_lock(rtwdev->hw->wiphy);
+
+ rtw89_debug(rtwdev, RTW89_DBG_LED, "led_set: pin=%u brightness=%u\n",
+ e->pin, brightness);
+ rtw89_led_gpio_set(rtwdev, e, brightness);
+ rtw_led->brightness_cache = brightness;
+
+ wiphy_unlock(rtwdev->hw->wiphy);
+
+ return 0;
+}
+
+static int rtw89_led_sc_init(struct rtw89_dev *rtwdev, const struct rtw89_led_desc *desc)
+{
+ struct rtw89_led *rtw_led = &rtwdev->led;
+ int ret;
+
+ snprintf(rtw_led->name, sizeof(rtw_led->name), "rtw89-%s",
+ wiphy_name(rtwdev->hw->wiphy));
+ rtw_led->led.name = rtw_led->name;
+ rtw_led->led.brightness_set_blocking = rtw89_led_set;
+ rtw_led->led.max_brightness = LED_ON;
+ rtw_led->led.default_trigger = ieee80211_get_assoc_led_name(rtwdev->hw);
+
+ ret = led_classdev_register(rtwdev->dev, &rtw_led->led);
+ if (ret) {
+ rtw89_warn(rtwdev, "failed to register LED, ret=%d\n", ret);
+ return ret;
+ }
+
+ rtw89_led_gpio_config(rtwdev, &desc->gpios[0]);
+
+ return 0;
+}
+
+static void rtw89_led_sc_deinit(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_led *rtw_led = &rtwdev->led;
+
+ led_classdev_unregister(&rtw_led->led);
+}
+
+void rtw89_led_init(struct rtw89_dev *rtwdev)
+{
+ const struct rtw89_led_desc *desc = &rtw89_common_led_desc;
+ struct rtw89_led *rtw_led = &rtwdev->led;
+ int ret;
+
+ /* single-GPIO monochrome LED is the only supported layout */
+ BUILD_BUG_ON(ARRAY_SIZE(rtw89_common_led_gpios) != 1);
+
+ rtw_led->desc = desc;
+ rtw_led->brightness_cache = LED_OFF;
+
+ ret = rtw89_led_sc_init(rtwdev, desc);
+ if (ret)
+ return;
+
+ rtw_led->registered = true;
+}
+
+void rtw89_led_deinit(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_led *rtw_led = &rtwdev->led;
+
+ if (!rtw_led->registered)
+ return;
+
+ rtw89_led_sc_deinit(rtwdev);
+}
diff --git a/drivers/net/wireless/realtek/rtw89/led.h b/drivers/net/wireless/realtek/rtw89/led.h
new file mode 100644
index 000000000000..27e782cff7c7
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw89/led.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Copyright(c) 2026 Realtek Corporation
+ */
+
+#ifndef __RTW89_LED_H__
+#define __RTW89_LED_H__
+
+#include "core.h"
+
+void rtw89_led_gpio_config(struct rtw89_dev *rtwdev,
+ const struct rtw89_led_gpio_entry *e);
+void rtw89_led_gpio_set(struct rtw89_dev *rtwdev,
+ const struct rtw89_led_gpio_entry *e,
+ enum led_brightness brightness);
+
+#ifdef CONFIG_RTW89_LEDS
+void rtw89_led_init(struct rtw89_dev *rtwdev);
+void rtw89_led_deinit(struct rtw89_dev *rtwdev);
+#else
+static inline void rtw89_led_init(struct rtw89_dev *rtwdev) {}
+static inline void rtw89_led_deinit(struct rtw89_dev *rtwdev) {}
+#endif
+
+#endif
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 2/9] wifi: rtw89: add multicolor LED support for RTL8852CU valve board
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 1/9] wifi: rtw89: add LED support to reflect the wireless association status Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 3/9] wifi: rtw89: 8852cu: add quirk to disable 2.4 GHz band Ping-Ke Shih
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
From: Johnson Tsai <wenjie.tsai@realtek.com>
Add multicolor LED support for the RTL8852CU valve board to reflect
wireless connection status (by default, green LED is ON when associated
and OFF when disconnected).
Extend the rtw89 LED subsystem with a multicolor path via led_classdev_mc,
for board-level variants with more than one LED GPIO channel.
Add a new RTW89_LEDS_MC Kconfig option and support multicolor LEDs
through led_classdev_mc, with per-channel caching to minimize
redundant register writes. The RTL8852CU valve board is wired up as
the first user, driving a multicolor WRGB LED over four GPIO channels
(8, 18, 16, and 17) that map to LED_COLOR_ID_WHITE/RED/GREEN/BLUE.
Usage:
- Auto-triggered (default):
Green LED ON when connected, OFF when disconnected
- Manual override (e.g., set red; channel order: WHITE RED GREEN BLUE):
echo "0 1 0 0" > /sys/class/leds/rtw89-phyX-multicolor/multi_intensity
echo 1 > /sys/class/leds/rtw89-phyX-multicolor/brightness
Signed-off-by: Johnson Tsai <wenjie.tsai@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/Kconfig | 7 ++
drivers/net/wireless/realtek/rtw89/Makefile | 1 +
drivers/net/wireless/realtek/rtw89/core.c | 1 +
drivers/net/wireless/realtek/rtw89/core.h | 15 +++-
drivers/net/wireless/realtek/rtw89/led.c | 26 ++++--
drivers/net/wireless/realtek/rtw89/led.h | 13 +++
drivers/net/wireless/realtek/rtw89/led_mc.c | 81 +++++++++++++++++++
drivers/net/wireless/realtek/rtw89/reg.h | 2 +
.../net/wireless/realtek/rtw89/rtw8851be.c | 1 +
.../net/wireless/realtek/rtw89/rtw8851bu.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852ae.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852au.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852be.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852bte.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852bu.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852ce.c | 1 +
.../net/wireless/realtek/rtw89/rtw8852cu.c | 54 +++++++++++++
.../net/wireless/realtek/rtw89/rtw8922ae.c | 2 +
.../net/wireless/realtek/rtw89/rtw8922au.c | 1 +
.../net/wireless/realtek/rtw89/rtw8922de.c | 2 +
20 files changed, 207 insertions(+), 6 deletions(-)
create mode 100644 drivers/net/wireless/realtek/rtw89/led_mc.c
diff --git a/drivers/net/wireless/realtek/rtw89/Kconfig b/drivers/net/wireless/realtek/rtw89/Kconfig
index be31eaab7621..7200a944260f 100644
--- a/drivers/net/wireless/realtek/rtw89/Kconfig
+++ b/drivers/net/wireless/realtek/rtw89/Kconfig
@@ -197,4 +197,11 @@ config RTW89_LEDS
imply MAC80211_LEDS
default y
+config RTW89_LEDS_MC
+ bool
+ depends on RTW89_LEDS
+ depends on LEDS_CLASS_MULTICOLOR
+ imply LEDS_TRIGGER_TIMER
+ default y
+
endif
diff --git a/drivers/net/wireless/realtek/rtw89/Makefile b/drivers/net/wireless/realtek/rtw89/Makefile
index 3d47f13d1e66..5536714e0268 100644
--- a/drivers/net/wireless/realtek/rtw89/Makefile
+++ b/drivers/net/wireless/realtek/rtw89/Makefile
@@ -93,6 +93,7 @@ rtw89_8922au-objs := rtw8922au.o
rtw89_core-$(CONFIG_RTW89_DEBUG) += debug.o
rtw89_core-$(CONFIG_RTW89_LEDS) += led.o
+rtw89_core-$(CONFIG_RTW89_LEDS_MC) += led_mc.o
obj-$(CONFIG_RTW89_PCI) += rtw89_pci.o
rtw89_pci-y := pci.o pci_be.o
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index bb04f649bfb0..b87a72700b99 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -7701,6 +7701,7 @@ struct rtw89_dev *rtw89_alloc_ieee80211_hw(struct device *device,
rtwdev->ops = ops;
rtwdev->chip = chip;
rtwdev->variant = variant;
+ rtwdev->board = info->board;
rtwdev->fw.req.firmware = firmware;
rtwdev->fw.fw_format = fw_format;
rtwdev->support_mlo = support_mlo;
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 41cc519317c9..70cf6cbf4e8a 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -11,6 +11,7 @@
#include <linux/firmware.h>
#include <linux/iopoll.h>
#include <linux/leds.h>
+#include <linux/led-class-multicolor.h>
#include <linux/workqueue.h>
#include <net/mac80211.h>
@@ -5279,8 +5280,12 @@ struct rtw89_chanctx_listener {
#define RTW89_NHM_TH_NUM 11
#define RTW89_NHM_RPT_NUM 12
+#define RTW89_LED_MAX_NUM 4
+
struct rtw89_led_gpio_entry {
u8 pin;
+ unsigned int color;
+ u8 intensity;
struct rtw89_reg3_def pinmux;
struct rtw89_reg2_def mode;
struct rtw89_reg2_def out;
@@ -5295,7 +5300,9 @@ struct rtw89_led {
bool registered;
const struct rtw89_led_desc *desc;
struct led_classdev led;
- enum led_brightness brightness_cache;
+ struct led_classdev_mc led_mc;
+ struct mc_subled subled[RTW89_LED_MAX_NUM];
+ enum led_brightness brightness_cache[RTW89_LED_MAX_NUM];
char name[32];
};
@@ -5454,6 +5461,10 @@ struct rtw89_chip_variant {
const struct rtw89_qta_def *qta_def_override;
};
+struct rtw89_board_variant {
+ const struct rtw89_led_desc *led_desc;
+};
+
union rtw89_bus_info {
const struct rtw89_pci_info *pci;
const struct rtw89_usb_info *usb;
@@ -5462,6 +5473,7 @@ union rtw89_bus_info {
struct rtw89_driver_info {
const struct rtw89_chip_info *chip;
const struct rtw89_chip_variant *variant;
+ const struct rtw89_board_variant *board;
const struct dmi_system_id *quirks;
unsigned long dev_id_quirks; /* bitmap of rtw89_quirks */
union rtw89_bus_info bus;
@@ -7136,6 +7148,7 @@ struct rtw89_dev {
struct rtw89_hw_scan_info scan_info;
const struct rtw89_chip_info *chip;
const struct rtw89_chip_variant *variant;
+ const struct rtw89_board_variant *board;
const struct rtw89_pci_info *pci_info;
const struct rtw89_rfe_parms *rfe_parms;
struct rtw89_hal hal;
diff --git a/drivers/net/wireless/realtek/rtw89/led.c b/drivers/net/wireless/realtek/rtw89/led.c
index 64e7eaa7ee39..ae74b7075d7c 100644
--- a/drivers/net/wireless/realtek/rtw89/led.c
+++ b/drivers/net/wireless/realtek/rtw89/led.c
@@ -45,7 +45,7 @@ static int rtw89_led_set(struct led_classdev *led, enum led_brightness brightnes
const struct rtw89_led_desc *desc = rtw_led->desc;
const struct rtw89_led_gpio_entry *e = &desc->gpios[0];
- if (rtw_led->brightness_cache == brightness) {
+ if (rtw_led->brightness_cache[0] == brightness) {
rtw89_debug(rtwdev, RTW89_DBG_LED, "led_set: pin=%u skip (no change)\n",
e->pin);
return 0;
@@ -56,7 +56,7 @@ static int rtw89_led_set(struct led_classdev *led, enum led_brightness brightnes
rtw89_debug(rtwdev, RTW89_DBG_LED, "led_set: pin=%u brightness=%u\n",
e->pin, brightness);
rtw89_led_gpio_set(rtwdev, e, brightness);
- rtw_led->brightness_cache = brightness;
+ rtw_led->brightness_cache[0] = brightness;
wiphy_unlock(rtwdev->hw->wiphy);
@@ -97,15 +97,27 @@ void rtw89_led_init(struct rtw89_dev *rtwdev)
{
const struct rtw89_led_desc *desc = &rtw89_common_led_desc;
struct rtw89_led *rtw_led = &rtwdev->led;
+ const struct rtw89_board_variant *board = rtwdev->board;
int ret;
+ int i;
/* single-GPIO monochrome LED is the only supported layout */
BUILD_BUG_ON(ARRAY_SIZE(rtw89_common_led_gpios) != 1);
+ if (board)
+ desc = board->led_desc;
+ if (!desc->n_gpio || desc->n_gpio > RTW89_LED_MAX_NUM)
+ return;
+
rtw_led->desc = desc;
- rtw_led->brightness_cache = LED_OFF;
+ for (i = 0; i < ARRAY_SIZE(rtw_led->brightness_cache); i++)
+ rtw_led->brightness_cache[i] = LED_OFF;
+
+ if (desc->n_gpio == 1)
+ ret = rtw89_led_sc_init(rtwdev, desc);
+ else
+ ret = rtw89_led_mc_init(rtwdev, desc);
- ret = rtw89_led_sc_init(rtwdev, desc);
if (ret)
return;
@@ -115,9 +127,13 @@ void rtw89_led_init(struct rtw89_dev *rtwdev)
void rtw89_led_deinit(struct rtw89_dev *rtwdev)
{
struct rtw89_led *rtw_led = &rtwdev->led;
+ const struct rtw89_led_desc *desc = rtw_led->desc;
if (!rtw_led->registered)
return;
- rtw89_led_sc_deinit(rtwdev);
+ if (desc->n_gpio == 1)
+ rtw89_led_sc_deinit(rtwdev);
+ else
+ rtw89_led_mc_deinit(rtwdev);
}
diff --git a/drivers/net/wireless/realtek/rtw89/led.h b/drivers/net/wireless/realtek/rtw89/led.h
index 27e782cff7c7..f5ccfe1d1752 100644
--- a/drivers/net/wireless/realtek/rtw89/led.h
+++ b/drivers/net/wireless/realtek/rtw89/led.h
@@ -21,4 +21,17 @@ static inline void rtw89_led_init(struct rtw89_dev *rtwdev) {}
static inline void rtw89_led_deinit(struct rtw89_dev *rtwdev) {}
#endif
+#ifdef CONFIG_RTW89_LEDS_MC
+int rtw89_led_mc_init(struct rtw89_dev *rtwdev, const struct rtw89_led_desc *desc);
+void rtw89_led_mc_deinit(struct rtw89_dev *rtwdev);
+#else
+static inline int rtw89_led_mc_init(struct rtw89_dev *rtwdev,
+ const struct rtw89_led_desc *desc)
+{
+ return -EOPNOTSUPP;
+}
+
+static inline void rtw89_led_mc_deinit(struct rtw89_dev *rtwdev) {}
+#endif
+
#endif
diff --git a/drivers/net/wireless/realtek/rtw89/led_mc.c b/drivers/net/wireless/realtek/rtw89/led_mc.c
new file mode 100644
index 000000000000..7e9243baef68
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw89/led_mc.c
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2026 Realtek Corporation
+ */
+
+#include "core.h"
+#include "debug.h"
+#include "led.h"
+
+static int rtw89_led_mc_brightness_set(struct led_classdev *led,
+ enum led_brightness brightness)
+{
+ struct led_classdev_mc *mcdev = lcdev_to_mccdev(led);
+ struct rtw89_led *rtw_led = container_of(mcdev, struct rtw89_led, led_mc);
+ struct rtw89_dev *rtwdev = container_of(rtw_led, struct rtw89_dev, led);
+ const struct rtw89_led_desc *desc = rtw_led->desc;
+ const struct rtw89_led_gpio_entry *e;
+ unsigned int i;
+
+ led_mc_calc_color_components(mcdev, brightness);
+
+ wiphy_lock(rtwdev->hw->wiphy);
+
+ for (i = 0; i < mcdev->num_colors; i++) {
+ e = &desc->gpios[i];
+ if (rtw_led->brightness_cache[i] == mcdev->subled_info[i].brightness) {
+ rtw89_debug(rtwdev, RTW89_DBG_LED,
+ "led_mc_set: pin=%u skip (no change)\n", e->pin);
+ continue;
+ }
+
+ rtw89_debug(rtwdev, RTW89_DBG_LED, "led_mc_set: pin=%u brightness=%u\n",
+ e->pin, mcdev->subled_info[i].brightness);
+ rtw89_led_gpio_set(rtwdev, e, mcdev->subled_info[i].brightness);
+ rtw_led->brightness_cache[i] = mcdev->subled_info[i].brightness;
+ }
+
+ wiphy_unlock(rtwdev->hw->wiphy);
+
+ return 0;
+}
+
+int rtw89_led_mc_init(struct rtw89_dev *rtwdev, const struct rtw89_led_desc *desc)
+{
+ struct rtw89_led *rtw_led = &rtwdev->led;
+ struct led_classdev_mc *led_mc = &rtw_led->led_mc;
+ int i, ret;
+
+ led_mc->num_colors = desc->n_gpio;
+ led_mc->subled_info = rtw_led->subled;
+
+ for (i = 0; i < desc->n_gpio; i++) {
+ const struct rtw89_led_gpio_entry *e = &desc->gpios[i];
+
+ rtw_led->subled[i].color_index = e->color;
+ rtw_led->subled[i].intensity = e->intensity;
+ rtw_led->subled[i].brightness = 0;
+ rtw_led->subled[i].channel = i;
+
+ rtw89_led_gpio_config(rtwdev, e);
+ }
+
+ snprintf(rtw_led->name, sizeof(rtw_led->name), "rtw89-%s-multicolor",
+ wiphy_name(rtwdev->hw->wiphy));
+ led_mc->led_cdev.name = rtw_led->name;
+ led_mc->led_cdev.brightness_set_blocking = rtw89_led_mc_brightness_set;
+ led_mc->led_cdev.max_brightness = LED_ON;
+ led_mc->led_cdev.default_trigger = ieee80211_get_assoc_led_name(rtwdev->hw);
+
+ ret = led_classdev_multicolor_register(rtwdev->dev, led_mc);
+ if (ret)
+ rtw89_warn(rtwdev, "failed to register multicolor LED, ret=%d\n", ret);
+
+ return ret;
+}
+
+void rtw89_led_mc_deinit(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_led *rtw_led = &rtwdev->led;
+
+ led_classdev_multicolor_unregister(&rtw_led->led_mc);
+}
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
index 3bf2865b81ab..053028b9ef16 100644
--- a/drivers/net/wireless/realtek/rtw89/reg.h
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
@@ -205,6 +205,8 @@
#define MAC_AX_HCI_SEL_PCIE_USB 3
#define MAC_AX_HCI_SEL_MULTI_SDIO 4
+#define R_AX_GPIO_16_TO_18_EXT_CTRL 0x0150
+
#define R_AX_HALT_H2C_CTRL 0x0160
#define R_AX_HALT_H2C 0x0168
#define B_AX_HALT_H2C_TRIGGER BIT(0)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851be.c b/drivers/net/wireless/realtek/rtw89/rtw8851be.c
index 640672eb0d26..459d2e778b83 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851be.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851be.c
@@ -72,6 +72,7 @@ static const struct rtw89_pci_info rtw8851b_pci_info = {
static const struct rtw89_driver_info rtw89_8851be_info = {
.chip = &rtw8851b_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851bu.c b/drivers/net/wireless/realtek/rtw89/rtw8851bu.c
index 34ba5661d771..1e827205f254 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851bu.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851bu.c
@@ -30,6 +30,7 @@ static const struct rtw89_usb_info rtw8851b_usb_info = {
static const struct rtw89_driver_info rtw89_8851bu_info = {
.chip = &rtw8851b_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852ae.c b/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
index 64306cdc1ee4..142a45a2e718 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852ae.c
@@ -70,6 +70,7 @@ static const struct rtw89_pci_info rtw8852a_pci_info = {
static const struct rtw89_driver_info rtw89_8852ae_info = {
.chip = &rtw8852a_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852au.c b/drivers/net/wireless/realtek/rtw89/rtw8852au.c
index 29b7f7769370..065f4e5b17af 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852au.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852au.c
@@ -32,6 +32,7 @@ static const struct rtw89_usb_info rtw8852a_usb_info = {
static const struct rtw89_driver_info rtw89_8852au_info = {
.chip = &rtw8852a_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852be.c b/drivers/net/wireless/realtek/rtw89/rtw8852be.c
index 5bc0a6a99d1d..1c622a99c070 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852be.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852be.c
@@ -72,6 +72,7 @@ static const struct rtw89_pci_info rtw8852b_pci_info = {
static const struct rtw89_driver_info rtw89_8852be_info = {
.chip = &rtw8852b_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bte.c b/drivers/net/wireless/realtek/rtw89/rtw8852bte.c
index 49a72ca835ac..73c7ebd33ab4 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852bte.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852bte.c
@@ -78,6 +78,7 @@ static const struct rtw89_pci_info rtw8852bt_pci_info = {
static const struct rtw89_driver_info rtw89_8852bte_info = {
.chip = &rtw8852bt_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bu.c b/drivers/net/wireless/realtek/rtw89/rtw8852bu.c
index 308d3d570ff3..de79a19a2824 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852bu.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852bu.c
@@ -30,6 +30,7 @@ static const struct rtw89_usb_info rtw8852b_usb_info = {
static const struct rtw89_driver_info rtw89_8852bu_info = {
.chip = &rtw8852b_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852ce.c b/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
index 3c64c0539205..bb5d5745aa62 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852ce.c
@@ -101,6 +101,7 @@ static const struct dmi_system_id rtw8852c_pci_quirks[] = {
static const struct rtw89_driver_info rtw89_8852ce_info = {
.chip = &rtw8852c_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = rtw8852c_pci_quirks,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852cu.c b/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
index 81ee96b0a048..51dd8fb05366 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
@@ -32,6 +32,7 @@ static const struct rtw89_usb_info rtw8852c_usb_info = {
static const struct rtw89_driver_info rtw89_8852cu_info = {
.chip = &rtw8852c_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
@@ -39,9 +40,62 @@ static const struct rtw89_driver_info rtw89_8852cu_info = {
},
};
+static const struct rtw89_led_gpio_entry rtw8852cu_valve_led_gpios[] = {
+ {
+ .pin = 8,
+ .color = LED_COLOR_ID_WHITE,
+ .intensity = 0,
+ .pinmux = {.addr = R_AX_GPIO8_15_FUNC_SEL,
+ .mask = GENMASK(3, 0),
+ .data = 0xf},
+ .mode = {.addr = R_AX_GPIO_EXT_CTRL + 2, .data = BIT(0) | BIT(8)},
+ .out = {.addr = R_AX_GPIO_EXT_CTRL + 1, .data = BIT(0)},
+ }, {
+ .pin = 18,
+ .color = LED_COLOR_ID_RED,
+ .intensity = 0,
+ .pinmux = {.addr = R_AX_GPIO16_23_FUNC_SEL,
+ .mask = GENMASK(11, 8),
+ .data = 0xf},
+ .mode = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 2,
+ .data = BIT(2) | BIT(10)},
+ .out = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 1, .data = BIT(2)},
+ }, {
+ .pin = 16,
+ .color = LED_COLOR_ID_GREEN,
+ .intensity = 1,
+ .pinmux = {.addr = R_AX_GPIO16_23_FUNC_SEL,
+ .mask = GENMASK(3, 0),
+ .data = 0xf},
+ .mode = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 2,
+ .data = BIT(0) | BIT(8)},
+ .out = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 1, .data = BIT(0)},
+ }, {
+ .pin = 17,
+ .color = LED_COLOR_ID_BLUE,
+ .intensity = 0,
+ .pinmux = {.addr = R_AX_GPIO16_23_FUNC_SEL,
+ .mask = GENMASK(7, 4),
+ .data = 0xf},
+ .mode = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 2,
+ .data = BIT(1) | BIT(9)},
+ .out = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 1, .data = BIT(1)},
+ },
+};
+
+static const struct rtw89_led_desc rtw8852cu_valve_led_desc = {
+ .gpios = rtw8852cu_valve_led_gpios,
+ .n_gpio = ARRAY_SIZE(rtw8852cu_valve_led_gpios),
+};
+
+static const struct rtw89_board_variant rtw89_8852cu_valve_board = {
+ .led_desc = &rtw8852cu_valve_led_desc,
+};
+
static const struct rtw89_driver_info rtw89_8852cu_valve_info = {
.chip = &rtw8852c_chip_info,
.variant = NULL,
+ .board = &rtw89_8852cu_valve_board,
.quirks = NULL,
.dev_id_quirks = BIT(RTW89_QUIRK_HW_INFO_SYSFS),
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922ae.c b/drivers/net/wireless/realtek/rtw89/rtw8922ae.c
index 5527a8db393b..8f3a1cd463d9 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922ae.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922ae.c
@@ -76,6 +76,7 @@ static const struct rtw89_pci_info rtw8922a_pci_info = {
static const struct rtw89_driver_info rtw89_8922ae_info = {
.chip = &rtw8922a_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
@@ -86,6 +87,7 @@ static const struct rtw89_driver_info rtw89_8922ae_info = {
static const struct rtw89_driver_info rtw89_8922ae_vs_info = {
.chip = &rtw8922a_chip_info,
.variant = &rtw8922ae_vs_variant,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922au.c b/drivers/net/wireless/realtek/rtw89/rtw8922au.c
index 2b81de501d62..56c79b1ec865 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922au.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922au.c
@@ -31,6 +31,7 @@ static const struct rtw89_usb_info rtw8922a_usb_info = {
static const struct rtw89_driver_info rtw89_8922au_info = {
.chip = &rtw8922a_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922de.c b/drivers/net/wireless/realtek/rtw89/rtw8922de.c
index a1a81c338be3..09400a0efcfd 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922de.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922de.c
@@ -72,6 +72,7 @@ static const struct rtw89_pci_info rtw8922d_pci_info = {
static const struct rtw89_driver_info rtw89_8922de_vs_info = {
.chip = &rtw8922d_chip_info,
.variant = &rtw8922de_vs_variant,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
@@ -82,6 +83,7 @@ static const struct rtw89_driver_info rtw89_8922de_vs_info = {
static const struct rtw89_driver_info rtw89_8922de_info = {
.chip = &rtw8922d_chip_info,
.variant = NULL,
+ .board = NULL,
.quirks = NULL,
.dev_id_quirks = 0,
.bus = {
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 3/9] wifi: rtw89: 8852cu: add quirk to disable 2.4 GHz band
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 1/9] wifi: rtw89: add LED support to reflect the wireless association status Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 2/9] wifi: rtw89: add multicolor LED support for RTL8852CU valve board Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 4/9] wifi: rtw89: rfk: update TXIQK H2C command format to v1 Ping-Ke Shih
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
From: David Lee <sc.lee@realtek.com>
Add RTW89_QUIRK_DISABLE_2GHZ to the rtw89_quirks enum to allow
per-device suppression of the 2.4 GHz band.
Apply the quirk only for the 0x28de:0x2432 (VID:PID) USB device,
which operates only in 5/6 GHz bands.
Signed-off-by: David Lee <sc.lee@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/core.c | 3 +++
drivers/net/wireless/realtek/rtw89/core.h | 1 +
drivers/net/wireless/realtek/rtw89/rtw8852cu.c | 3 ++-
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index b87a72700b99..77a0e2582dbe 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -6418,6 +6418,9 @@ static int rtw89_core_set_supported_band(struct rtw89_dev *rtwdev)
u8 support_bands = rtwdev->chip->support_bands;
int ret;
+ if (test_bit(RTW89_QUIRK_DISABLE_2GHZ, rtwdev->quirks))
+ support_bands &= ~BIT(NL80211_BAND_2GHZ);
+
if (support_bands & BIT(NL80211_BAND_2GHZ)) {
sband = rtw89_core_sband_dup(rtwdev, &rtw89_sband_2ghz);
if (!sband)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 70cf6cbf4e8a..9d782cbfee70 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -6057,6 +6057,7 @@ enum rtw89_quirks {
RTW89_QUIRK_THERMAL_PROT_120C,
RTW89_QUIRK_THERMAL_PROT_110C,
RTW89_QUIRK_HW_INFO_SYSFS,
+ RTW89_QUIRK_DISABLE_2GHZ,
NUM_OF_RTW89_QUIRKS,
};
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852cu.c b/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
index 51dd8fb05366..2dec9b845481 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
@@ -97,7 +97,8 @@ static const struct rtw89_driver_info rtw89_8852cu_valve_info = {
.variant = NULL,
.board = &rtw89_8852cu_valve_board,
.quirks = NULL,
- .dev_id_quirks = BIT(RTW89_QUIRK_HW_INFO_SYSFS),
+ .dev_id_quirks = BIT(RTW89_QUIRK_HW_INFO_SYSFS) |
+ BIT(RTW89_QUIRK_DISABLE_2GHZ),
.bus = {
.usb = &rtw8852c_usb_info,
},
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 4/9] wifi: rtw89: rfk: update TXIQK H2C command format to v1
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
` (2 preceding siblings ...)
2026-07-17 6:19 ` [PATCH rtw-next 3/9] wifi: rtw89: 8852cu: add quirk to disable 2.4 GHz band Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 5/9] wifi: rtw89: 8922d: bypass TXIQK when scan Ping-Ke Shih
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
From: Chih-Kang Chang <gary.chang@realtek.com>
TX IQK is a RF calibration, the v1 format adds a field for the thermal
re-calibration parameter for RTL8922D after FW 0.35.113.0. Update the
format accordingly.
Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/core.h | 1 +
drivers/net/wireless/realtek/rtw89/fw.c | 35 ++++++++++++++++-------
drivers/net/wireless/realtek/rtw89/fw.h | 7 ++++-
3 files changed, 32 insertions(+), 11 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 9d782cbfee70..9b7f197a3af2 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -5599,6 +5599,7 @@ enum rtw89_fw_feature {
),
RTW89_FW_FEATURE_RFK_RXDCK_V0,
RTW89_FW_FEATURE_RFK_IQK_V0,
+ RTW89_FW_FEATURE_RFK_TXIQK_V0,
RTW89_FW_FEATURE_NO_WOW_CPU_IO_RX,
RTW89_FW_FEATURE_NOTIFY_AP_INFO,
RTW89_FW_FEATURE_CH_INFO_BE_V0,
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index 0db77120298f..ad87484f51a7 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -948,6 +948,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8922D, ge, 0, 35, 104, 0, TX_HISTORY_V1),
__CFG_FW_FEAT(RTL8922D, ge, 0, 35, 108, 0, SIM_SER_L0L1_BY_HALT_H2C),
__CFG_FW_FEAT(RTL8922D, lt, 0, 35, 109, 1, SCAN_OFFLOAD_BE_V1),
+ __CFG_FW_FEAT(RTL8922D, lt, 0, 35, 113, 0, RFK_TXIQK_V0),
};
static void rtw89_fw_iterate_feature_cfg(struct rtw89_fw_info *fw,
@@ -8464,29 +8465,43 @@ int rtw89_fw_h2c_rf_tas_trigger(struct rtw89_dev *rtwdev, bool enable)
int rtw89_fw_h2c_rf_txiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
const struct rtw89_chan *chan)
{
+ struct rtw89_h2c_rf_txiqk_v0 *h2c_v0;
struct rtw89_h2c_rf_txiqk *h2c;
u32 len = sizeof(*h2c);
struct sk_buff *skb;
+ u8 ver = U8_MAX;
int ret;
+ if (RTW89_CHK_FW_FEATURE(RFK_TXIQK_V0, &rtwdev->fw)) {
+ len = sizeof(*h2c_v0);
+ ver = 0;
+ }
+
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
if (!skb) {
rtw89_err(rtwdev, "failed to alloc skb for h2c RF TXIQK\n");
return -ENOMEM;
}
skb_put(skb, len);
- h2c = (struct rtw89_h2c_rf_txiqk *)skb->data;
+ h2c_v0 = (struct rtw89_h2c_rf_txiqk_v0 *)skb->data;
+
+ h2c_v0->len = len;
+ h2c_v0->phy = phy_idx;
+ h2c_v0->txiqk_enable = true;
+ h2c_v0->is_wb_txiqk = true;
+ h2c_v0->kpath = RF_AB;
+ h2c_v0->cur_band = chan->band_type;
+ h2c_v0->cur_bw = chan->band_width;
+ h2c_v0->cur_ch = chan->channel;
+ h2c_v0->txiqk_dbg_en = rtw89_debug_is_enabled(rtwdev, RTW89_DBG_RFK);
- h2c->len = len;
- h2c->phy = phy_idx;
- h2c->txiqk_enable = true;
- h2c->is_wb_txiqk = true;
- h2c->kpath = RF_AB;
- h2c->cur_band = chan->band_type;
- h2c->cur_bw = chan->band_width;
- h2c->cur_ch = chan->channel;
- h2c->txiqk_dbg_en = rtw89_debug_is_enabled(rtwdev, RTW89_DBG_RFK);
+ if (ver == 0)
+ goto hdr;
+
+ h2c = (struct rtw89_h2c_rf_txiqk *)skb->data;
+ h2c->is_ther_rek = false;
+hdr:
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
H2C_CAT_OUTSRC, H2C_CL_OUTSRC_RF_FW_RFK,
H2C_FUNC_RFK_TXIQK_OFFOAD, 0, 0, len);
diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h
index a1aab8293c14..2654f8fd0e51 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.h
+++ b/drivers/net/wireless/realtek/rtw89/fw.h
@@ -5042,7 +5042,7 @@ struct rtw89_h2c_rf_rxdck {
u8 is_chl_k;
} __packed;
-struct rtw89_h2c_rf_txiqk {
+struct rtw89_h2c_rf_txiqk_v0 {
u8 len;
u8 phy;
u8 txiqk_enable;
@@ -5054,6 +5054,11 @@ struct rtw89_h2c_rf_txiqk {
u8 txiqk_dbg_en;
} __packed;
+struct rtw89_h2c_rf_txiqk {
+ struct rtw89_h2c_rf_txiqk_v0 v0;
+ u8 is_ther_rek;
+} __packed;
+
struct rtw89_h2c_rf_cim3k {
u8 len;
u8 phy;
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 5/9] wifi: rtw89: 8922d: bypass TXIQK when scan
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
` (3 preceding siblings ...)
2026-07-17 6:19 ` [PATCH rtw-next 4/9] wifi: rtw89: rfk: update TXIQK H2C command format to v1 Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 6/9] wifi: rtw89: wow: extend timeout unit to avoid SER false alarm Ping-Ke Shih
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
From: Chih-Kang Chang <gary.chang@realtek.com>
When connected to an AP and a scan is triggered, the FW may fail to
transmit probe request because switching channels may load an
uninitialized TXIQK table. Therefore, bypass TXIQK during scanning
to avoid using invalid calibration values.
Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/core.h | 1 +
drivers/net/wireless/realtek/rtw89/reg.h | 10 +++
drivers/net/wireless/realtek/rtw89/rtw8922d.c | 64 ++++++++++++++++++-
3 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 9b7f197a3af2..2d9113cb43f9 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -6284,6 +6284,7 @@ struct rtw89_iqk_info {
u8 iqk_table_idx[RTW89_IQK_PATH_NR];
u32 lok_idac[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR];
u32 lok_vbuf[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR];
+ u32 iqc_bak[2];
};
#define RTW89_DPK_RF_PATH 2
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
index 053028b9ef16..756b94dcd475 100644
--- a/drivers/net/wireless/realtek/rtw89/reg.h
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
@@ -10121,6 +10121,7 @@
#define B_S1_DACKQ8_K GENMASK(15, 8)
#define R_NCTL_CFG 0x8000
#define R_NCTL_CFG_BE4 0x38000
+#define B_NCTL_CFG_BE4_SPAGE GENMASK(25, 24)
#define B_NCTL_CHK_EN BIT(3)
#define B_NCTL_CFG_SPAGE GENMASK(2, 1)
#define R_NCTL_RPT 0x8008
@@ -11061,6 +11062,15 @@
#define B_KTBL0_MLD_IDX0 GENMASK(25, 24)
#define B_KTBL0_MLD_IDX1 GENMASK(27, 26)
#define B_KTBL0_RST BIT(31)
+#define R_CFIR_CTRL_A_BE4 0x38124
+#define R_CFIR_CTRL_B_BE4 0x38224
+#define B_CFIR_CTRL_KIDX0_EN BIT(8)
+#define B_CFIR_CTRL_KIDX1_EN BIT(24)
+#define R_TX_IQC_A_BE4 0x38138
+#define R_TX_IQC_B_BE4 0x38238
+#define B_TX_IQC_X GENMASK(31, 20)
+#define B_TX_IQC_Y GENMASK(19, 8)
+#define B_TX_IQC_DPK BIT(3)
#define R_KTBL1A_BE4 0x38154
#define R_KTBL1B_BE4 0x38254
#define B_KTBL1_TBL0 BIT(3)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922d.c b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
index 929bcfc8089d..fde4117bcd49 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922d.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
@@ -2765,14 +2765,74 @@ static void rtw8922d_rfk_band_changed(struct rtw89_dev *rtwdev,
{
}
+static void __rtw8922d_txiqk_disable(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+ u8 path, kidx;
+
+ for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
+ kidx = rtw89_phy_read32_mask(rtwdev, R_KTBL0A_BE4 + (path << 8),
+ B_KTBL0_IDX0);
+ if (kidx == 0) {
+ rtw89_phy_write32_clr(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_KIDX0_EN);
+ } else if (kidx == 1) {
+ rtw89_phy_write32_clr(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_KIDX1_EN);
+ } else {
+ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG_BE4,
+ B_NCTL_CFG_BE4_SPAGE, 0x1);
+ rtw89_phy_write32_clr(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_KIDX0_EN);
+ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG_BE4,
+ B_NCTL_CFG_BE4_SPAGE, 0x0);
+ }
+
+ iqk_info->iqc_bak[path] =
+ rtw89_phy_read32(rtwdev, R_TX_IQC_A_BE4 + (path << 8));
+ rtw89_phy_write32(rtwdev, R_TX_IQC_A_BE4 + (path << 8), 0x40000002);
+ }
+}
+
+static void __rtw8922d_txiqk_enable(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+ u8 path, kidx;
+
+ for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
+ kidx = rtw89_phy_read32_mask(rtwdev, R_KTBL0A_BE4 + (path << 8),
+ B_KTBL0_IDX0);
+ if (kidx == 0) {
+ rtw89_phy_write32_set(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_KIDX0_EN);
+ } else if (kidx == 1) {
+ rtw89_phy_write32_set(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_KIDX1_EN);
+ } else {
+ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG_BE4,
+ B_NCTL_CFG_BE4_SPAGE, 0x1);
+ rtw89_phy_write32_set(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_KIDX0_EN);
+ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG_BE4,
+ B_NCTL_CFG_BE4_SPAGE, 0x0);
+ }
+
+ rtw89_phy_write32(rtwdev, R_TX_IQC_A_BE4 + (path << 8),
+ iqk_info->iqc_bak[path]);
+ }
+}
+
static void rtw8922d_rfk_scan(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
bool start)
{
- if (start)
+ if (start) {
__rtw8922d_tssi_disable(rtwdev, rtwvif_link->phy_idx);
- else
+ __rtw8922d_txiqk_disable(rtwdev);
+ } else {
__rtw8922d_tssi_enable(rtwdev, rtwvif_link->phy_idx);
+ __rtw8922d_txiqk_enable(rtwdev);
+ }
}
static void rtw8922d_rfk_track(struct rtw89_dev *rtwdev)
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 6/9] wifi: rtw89: wow: extend timeout unit to avoid SER false alarm
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
` (4 preceding siblings ...)
2026-07-17 6:19 ` [PATCH rtw-next 5/9] wifi: rtw89: 8922d: bypass TXIQK when scan Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 7/9] wifi: rtw89: pci: set PCIe maximum TS1 for RTL8922DE Ping-Ke Shih
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
With original timeout unit, it might trigger SER false alarm causing
WiFi card lost. Extend timeout unit to avoid wrong SER.
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/pci.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/pci.h b/drivers/net/wireless/realtek/rtw89/pci.h
index 92c30c7f9fb2..339706d99f6c 100644
--- a/drivers/net/wireless/realtek/rtw89/pci.h
+++ b/drivers/net/wireless/realtek/rtw89/pci.h
@@ -1022,7 +1022,7 @@
#define B_BE_PL1_IGNORE_HOT_RST BIT(30)
#define B_BE_PL1_TIMER_UNIT_MASK GENMASK(19, 17)
#define PCIE_SER_TIMER_UNIT 0x2
-#define PCIE_SER_WOW_TIMER_UNIT 0x4
+#define PCIE_SER_WOW_TIMER_UNIT 0x7
#define B_BE_PL1_TIMER_CLEAR BIT(0)
#define R_BE_REG_PL1_MASK 0x34B0
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 7/9] wifi: rtw89: pci: set PCIe maximum TS1 for RTL8922DE
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
` (5 preceding siblings ...)
2026-07-17 6:19 ` [PATCH rtw-next 6/9] wifi: rtw89: wow: extend timeout unit to avoid SER false alarm Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 8/9] wifi: rtw89: 8922d: reduce IO in power-on function Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 9/9] wifi: rtw89: phy: set CFR to manual mode for some 2GHz channels Ping-Ke Shih
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
Set TS1 (training sequence 1) to 1024 when PCIe enters recovery state to
improve RF interference while entering and leaving L1ss.
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/pci.h | 1 +
drivers/net/wireless/realtek/rtw89/pci_be.c | 11 ++++++++++-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/pci.h b/drivers/net/wireless/realtek/rtw89/pci.h
index 339706d99f6c..0e1557cedd20 100644
--- a/drivers/net/wireless/realtek/rtw89/pci.h
+++ b/drivers/net/wireless/realtek/rtw89/pci.h
@@ -1138,6 +1138,7 @@
#define RTW89_PCIE_GEN1_SPEED 0x01
#define RTW89_PCIE_GEN2_SPEED 0x02
#define RTW89_PCIE_PHY_RATE 0x82
+#define RTW89_PCIE_EXTENDED_SYNCH BIT(7)
#define RTW89_PCIE_PHY_RATE_MASK GENMASK(1, 0)
#define RTW89_PCIE_LINK_CHANGE_SPEED 0xA0
#define RTW89_PCIE_L1SS_STS_V1 0x0168
diff --git a/drivers/net/wireless/realtek/rtw89/pci_be.c b/drivers/net/wireless/realtek/rtw89/pci_be.c
index 6390980b8ee0..d338bf633272 100644
--- a/drivers/net/wireless/realtek/rtw89/pci_be.c
+++ b/drivers/net/wireless/realtek/rtw89/pci_be.c
@@ -85,13 +85,22 @@ static void _patch_pcie_power_wake_be(struct rtw89_dev *rtwdev, bool power_up)
static void _patch_pre_init_be(struct rtw89_dev *rtwdev)
{
+ struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;
struct rtw89_hal *hal = &rtwdev->hal;
+ struct pci_dev *pdev = rtwpci->pdev;
- if (!(rtwdev->chip->chip_id == RTL8922D && hal->cid == RTL8922D_CID7090))
+ if (rtwdev->chip->chip_id != RTL8922D)
return;
+ if (hal->cid != RTL8922D_CID7090)
+ goto set_ts1;
+
rtw89_write16_clr(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G2 +
RAC_ANA14 * RAC_MULT, EIEOS_L1SS_WAIT_CLKRDY);
+
+set_ts1:
+ pci_clear_and_set_config_dword(pdev, RTW89_PCIE_L1_STS_V1,
+ 0, RTW89_PCIE_EXTENDED_SYNCH);
}
static void rtw89_pci_set_io_rcy_be(struct rtw89_dev *rtwdev)
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 8/9] wifi: rtw89: 8922d: reduce IO in power-on function
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
` (6 preceding siblings ...)
2026-07-17 6:19 ` [PATCH rtw-next 7/9] wifi: rtw89: pci: set PCIe maximum TS1 for RTL8922DE Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 9/9] wifi: rtw89: phy: set CFR to manual mode for some 2GHz channels Ping-Ke Shih
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
To improve initial time, merge some IO to reduce IO times. Two registers
are:
1. R_BE_SYS_PW_CTRL: 0x4[12:11]=0, 0x4[18]=1, 0x4[15]=0, and 0x4[10]=0
2. R_BE_SYS_ADIE_PAD_PWR_CTRL: Merge 0x18[6] and 0x18[5]
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/rtw8922d.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922d.c b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
index fde4117bcd49..fd4c92ba3f7b 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922d.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
@@ -518,14 +518,15 @@ static int rtw8922d_pwr_on_func(struct rtw89_dev *rtwdev)
}
begin:
- rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_AFSM_WLSUS_EN |
- B_BE_AFSM_PCIE_SUS_EN);
- rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_DIS_WLBT_PDNSUSEN_SOPC);
- rtw89_write32_set(rtwdev, R_BE_WLLPS_CTRL, B_BE_DIS_WLBT_LPSEN_LOPC);
+ val32 = rtw89_read32(rtwdev, R_BE_SYS_PW_CTRL);
+ val32 &= ~(B_BE_AFSM_WLSUS_EN | B_BE_AFSM_PCIE_SUS_EN | B_BE_APFM_SWLPS);
+ val32 |= B_BE_DIS_WLBT_PDNSUSEN_SOPC;
if (hal->cid != RTL8922D_CID7090)
- rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APDM_HPDN);
+ val32 &= ~B_BE_APDM_HPDN;
+ rtw89_write32(rtwdev, R_BE_SYS_PW_CTRL, val32);
+
+ rtw89_write32_set(rtwdev, R_BE_WLLPS_CTRL, B_BE_DIS_WLBT_LPSEN_LOPC);
rtw89_write32_clr(rtwdev, R_BE_FWS1ISR, B_BE_FS_WL_HW_RADIO_OFF_INT);
- rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_SWLPS);
ret = read_poll_timeout(rtw89_read32, val32, val32 & B_BE_RDY_SYSPWR,
1000, 3000000, false, rtwdev, R_BE_SYS_PW_CTRL);
@@ -581,14 +582,13 @@ static int rtw8922d_pwr_on_func(struct rtw89_dev *rtwdev)
if (ret)
return ret;
- rtw89_write32_set(rtwdev, R_BE_SYS_ADIE_PAD_PWR_CTRL, B_BE_SYM_PADPDN_WL_RFC1_1P3);
+ rtw89_write32_set(rtwdev, R_BE_SYS_ADIE_PAD_PWR_CTRL,
+ B_BE_SYM_PADPDN_WL_RFC1_1P3 | B_BE_SYM_PADPDN_WL_RFC0_1P3);
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0x40, 0x40);
if (ret)
return ret;
- rtw89_write32_set(rtwdev, R_BE_SYS_ADIE_PAD_PWR_CTRL, B_BE_SYM_PADPDN_WL_RFC0_1P3);
-
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0x20, 0x20);
if (ret)
return ret;
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH rtw-next 9/9] wifi: rtw89: phy: set CFR to manual mode for some 2GHz channels
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
` (7 preceding siblings ...)
2026-07-17 6:19 ` [PATCH rtw-next 8/9] wifi: rtw89: 8922d: reduce IO in power-on function Ping-Ke Shih
@ 2026-07-17 6:19 ` Ping-Ke Shih
8 siblings, 0 replies; 10+ messages in thread
From: Ping-Ke Shih @ 2026-07-17 6:19 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, sc.lee, wenjie.tsai
The CFR (Channel Frequency Response) manual mode condition for 2GHz is
missing to limit on bandwidth for specific channels, which are channel
13 with 20MHz bandwidth and channel 11 with 40MHz bandwidth. Also add
a band check to avoid affecting 5GHz/6GHz bands.
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/phy_be.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/phy_be.c b/drivers/net/wireless/realtek/rtw89/phy_be.c
index e471409a4b8f..c06927d1dc78 100644
--- a/drivers/net/wireless/realtek/rtw89/phy_be.c
+++ b/drivers/net/wireless/realtek/rtw89/phy_be.c
@@ -707,13 +707,19 @@ void rtw89_phy_bb_wrap_set_rfsi_bandedge_ch(struct rtw89_dev *rtwdev,
const struct rtw89_chan *chan,
enum rtw89_phy_idx phy_idx)
{
+ bool cfr_manual_en = false;
u32 reg;
u32 val;
val = rtw89_phy_bb_wrap_be_bandedge_decision(rtwdev, chan);
+ if (chan->band_type == RTW89_BAND_2G &&
+ ((chan->primary_channel == 13 && chan->band_width == RTW89_CHANNEL_WIDTH_20) ||
+ (chan->primary_channel == 11 && chan->band_width == RTW89_CHANNEL_WIDTH_40)))
+ cfr_manual_en = true;
+
rtw89_phy_write32_idx(rtwdev, R_TX_CFR_MANUAL_EN_BE4, B_TX_CFR_MANUAL_EN_BE4_M,
- chan->primary_channel == 13, phy_idx);
+ cfr_manual_en, phy_idx);
reg = rtw89_mac_reg_by_idx(rtwdev, R_BANDEDGE_DBWX_BE4, phy_idx);
rtw89_write32_mask(rtwdev, reg, B_BANDEDGE_DBW20_BE4, val & BIT(0));
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-07-17 6:21 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-17 6:19 [PATCH rtw-next 0/9] wifi: rtw89: add LED support and update some random settings Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 1/9] wifi: rtw89: add LED support to reflect the wireless association status Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 2/9] wifi: rtw89: add multicolor LED support for RTL8852CU valve board Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 3/9] wifi: rtw89: 8852cu: add quirk to disable 2.4 GHz band Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 4/9] wifi: rtw89: rfk: update TXIQK H2C command format to v1 Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 5/9] wifi: rtw89: 8922d: bypass TXIQK when scan Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 6/9] wifi: rtw89: wow: extend timeout unit to avoid SER false alarm Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 7/9] wifi: rtw89: pci: set PCIe maximum TS1 for RTL8922DE Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 8/9] wifi: rtw89: 8922d: reduce IO in power-on function Ping-Ke Shih
2026-07-17 6:19 ` [PATCH rtw-next 9/9] wifi: rtw89: phy: set CFR to manual mode for some 2GHz channels Ping-Ke Shih
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox