* [patch 05/24] KVM: arm64: Use ktime_get_snapshot_id() to retrieve CLOCK_BOOTTIME
From: Thomas Gleixner @ 2026-05-26 17:13 UTC (permalink / raw)
To: LKML
Cc: David Woodhouse, Miroslav Lichvar, John Stultz, Stephen Boyd,
Anna-Maria Behnsen, Frederic Weisbecker, thomas.weissschuh,
Arthur Kiyanovski, Vincent Donnefort, Marc Zyngier, Oliver Upton,
kvmarm, Rodolfo Giometti, Oliver Upton, Richard Cochran, netdev,
Takashi Iwai, Miri Korenblit, Johannes Berg, Jacob Keller,
Tony Nguyen, Saeed Mahameed, Peter Hilber, Michael S. Tsirkin,
virtualization, linux-wireless, linux-sound
In-Reply-To: <20260526165826.392227559@kernel.org>
ktime_get_snapshot() is replaced by ktime_get_snapshot_id() which allows to
request a particular CLOCK ID to be captured along with the clocksource
counter.
Convert the tracing mechanism over and use the new
system_time_snapshot::sys field, which holds the system timestamp selected
by the CLOCK ID argument.
No functional change intended.
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Cc: Vincent Donnefort <vdonnefort@google.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: kvmarm@lists.linux.dev
---
arch/arm64/kvm/hyp_trace.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
--- a/arch/arm64/kvm/hyp_trace.c
+++ b/arch/arm64/kvm/hyp_trace.c
@@ -51,8 +51,8 @@ static void __hyp_clock_work(struct work
hyp_clock = container_of(dwork, struct hyp_trace_clock, work);
- ktime_get_snapshot(&snap);
- boot = ktime_to_ns(snap.boot);
+ ktime_get_snapshot_id(&snap, CLOCK_BOOTTIME);
+ boot = ktime_to_ns(snap.sys);
delta_boot = boot - hyp_clock->boot;
delta_cycles = snap.cycles - hyp_clock->cycles;
@@ -118,9 +118,9 @@ static void hyp_trace_clock_enable(struc
hyp_clock->running = false;
}
- ktime_get_snapshot(&snap);
+ ktime_get_snapshot_id(&snap, CLOCK_BOOTTIME);
- hyp_clock->boot = ktime_to_ns(snap.boot);
+ hyp_clock->boot = ktime_to_ns(snap.sys);
hyp_clock->cycles = snap.cycles;
hyp_clock->mult = 0;
^ permalink raw reply
* [patch 04/24] pps: Convert to ktime_get_snapshot_id()
From: Thomas Gleixner @ 2026-05-26 17:13 UTC (permalink / raw)
To: LKML
Cc: David Woodhouse, Miroslav Lichvar, John Stultz, Stephen Boyd,
Anna-Maria Behnsen, Frederic Weisbecker, thomas.weissschuh,
Arthur Kiyanovski, Rodolfo Giometti, Vincent Donnefort,
Marc Zyngier, Oliver Upton, kvmarm, Oliver Upton, Richard Cochran,
netdev, Takashi Iwai, Miri Korenblit, Johannes Berg, Jacob Keller,
Tony Nguyen, Saeed Mahameed, Peter Hilber, Michael S. Tsirkin,
virtualization, linux-wireless, linux-sound
In-Reply-To: <20260526165826.392227559@kernel.org>
ktime_get_snapshot() resolves to ktime_get_snapshot_id(CLOCK_REALTIME).
Make it obvious in the code and convert the readout to use the
snapshot::sys field instead of snapshot::real, which is going away.
Similar to the PPS generators, avoid the more expensive snapshot when
CONFIG_NTP_PPS is disabled.
No functional change intended.
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Cc: Rodolfo Giometti <giometti@enneenne.com>
---
include/linux/pps_kernel.h | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
--- a/include/linux/pps_kernel.h
+++ b/include/linux/pps_kernel.h
@@ -99,12 +99,14 @@ static inline void timespec_to_pps_ktime
static inline void pps_get_ts(struct pps_event_time *ts)
{
+#ifdef CONFIG_NTP_PPS
struct system_time_snapshot snap;
- ktime_get_snapshot(&snap);
- ts->ts_real = ktime_to_timespec64(snap.real);
-#ifdef CONFIG_NTP_PPS
+ ktime_get_snapshot_id(&snap, CLOCK_REALTIME);
+ ts->ts_real = ktime_to_timespec64(snap.sys);
ts->ts_raw = ktime_to_timespec64(snap.raw);
+#else
+ ktime_get_real_ts64(&ts->ts_real);
#endif
}
^ permalink raw reply
* [patch 03/24] pps: generators: Use ktime_get_real_ts64() instead of ktime_get_snapshot()
From: Thomas Gleixner @ 2026-05-26 17:13 UTC (permalink / raw)
To: LKML
Cc: David Woodhouse, Miroslav Lichvar, John Stultz, Stephen Boyd,
Anna-Maria Behnsen, Frederic Weisbecker, thomas.weissschuh,
Arthur Kiyanovski, Rodolfo Giometti, Vincent Donnefort,
Marc Zyngier, Oliver Upton, kvmarm, Oliver Upton, Richard Cochran,
netdev, Takashi Iwai, Miri Korenblit, Johannes Berg, Jacob Keller,
Tony Nguyen, Saeed Mahameed, Peter Hilber, Michael S. Tsirkin,
virtualization, linux-wireless, linux-sound
In-Reply-To: <20260526165826.392227559@kernel.org>
There is no reason to use the more complex ktime_get_snapshot() for
retrieving CLOCK_REALTIME.
Just use ktime_get_real_ts64(), which avoids the extra timespec64
conversion as a bonus.
No functional change intended.
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Cc: Rodolfo Giometti <giometti@enneenne.com>
---
drivers/pps/generators/pps_gen-dummy.c | 6 +-----
drivers/pps/generators/pps_gen_tio.c | 6 +-----
2 files changed, 2 insertions(+), 10 deletions(-)
--- a/drivers/pps/generators/pps_gen-dummy.c
+++ b/drivers/pps/generators/pps_gen-dummy.c
@@ -39,11 +39,7 @@ static void pps_gen_ktimer_event(struct
static int pps_gen_dummy_get_time(struct pps_gen_device *pps_gen,
struct timespec64 *time)
{
- struct system_time_snapshot snap;
-
- ktime_get_snapshot(&snap);
- *time = ktime_to_timespec64(snap.real);
-
+ ktime_get_real_ts64(time);
return 0;
}
--- a/drivers/pps/generators/pps_gen_tio.c
+++ b/drivers/pps/generators/pps_gen_tio.c
@@ -189,11 +189,7 @@ static int pps_tio_gen_enable(struct pps
static int pps_tio_get_time(struct pps_gen_device *pps_gen,
struct timespec64 *time)
{
- struct system_time_snapshot snap;
-
- ktime_get_snapshot(&snap);
- *time = ktime_to_timespec64(snap.real);
-
+ ktime_get_real_ts64(time);
return 0;
}
^ permalink raw reply
* [patch 02/24] timekeeping: Use system_time_snapshot::sys instead of ::real
From: Thomas Gleixner @ 2026-05-26 17:13 UTC (permalink / raw)
To: LKML
Cc: David Woodhouse, Miroslav Lichvar, John Stultz, Stephen Boyd,
Anna-Maria Behnsen, Frederic Weisbecker, thomas.weissschuh,
Arthur Kiyanovski, Rodolfo Giometti, Vincent Donnefort,
Marc Zyngier, Oliver Upton, kvmarm, Oliver Upton, Richard Cochran,
netdev, Takashi Iwai, Miri Korenblit, Johannes Berg, Jacob Keller,
Tony Nguyen, Saeed Mahameed, Peter Hilber, Michael S. Tsirkin,
virtualization, linux-wireless, linux-sound
In-Reply-To: <20260526165826.392227559@kernel.org>
system_time_snapshot::sys provides the same information as
system_time_snapshot::real when the snapshot was taken with
ktime_get_snapshot_id(CLOCK_REALTIME).
Convert the history interpolation over to use 'sys' as 'real' is going away
once all users are converted.
As a side effect this is the first step to support CLOCK_AUX with
get_device_crosstime_stamp() and the history interpolation.
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
---
kernel/time/timekeeping.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -1342,7 +1342,7 @@ static int adjust_historical_crosststamp
(corr_raw, tk->tkr_mono.mult, tk->tkr_raw.mult);
} else {
corr_real = (u64)ktime_to_ns(
- ktime_sub(ts->sys_realtime, history->real));
+ ktime_sub(ts->sys_realtime, history->sys));
ret = scale64_check_overflow(partial_history_cycles,
total_history_cycles, &corr_real);
if (ret)
@@ -1352,7 +1352,7 @@ static int adjust_historical_crosststamp
/* Fixup monotonic raw and real time time values */
if (interp_forward) {
ts->sys_monoraw = ktime_add_ns(history->raw, corr_raw);
- ts->sys_realtime = ktime_add_ns(history->real, corr_real);
+ ts->sys_realtime = ktime_add_ns(history->sys, corr_real);
} else {
ts->sys_monoraw = ktime_sub_ns(ts->sys_monoraw, corr_raw);
ts->sys_realtime = ktime_sub_ns(ts->sys_realtime, corr_real);
^ permalink raw reply
* [patch 01/24] timekeeping: Provide ktime_get_snapshot_id()
From: Thomas Gleixner @ 2026-05-26 17:13 UTC (permalink / raw)
To: LKML
Cc: David Woodhouse, Miroslav Lichvar, John Stultz, Stephen Boyd,
Anna-Maria Behnsen, Frederic Weisbecker, thomas.weissschuh,
Arthur Kiyanovski, Rodolfo Giometti, Vincent Donnefort,
Marc Zyngier, Oliver Upton, kvmarm, Oliver Upton, Richard Cochran,
netdev, Takashi Iwai, Miri Korenblit, Johannes Berg, Jacob Keller,
Tony Nguyen, Saeed Mahameed, Peter Hilber, Michael S. Tsirkin,
virtualization, linux-wireless, linux-sound
In-Reply-To: <20260526165826.392227559@kernel.org>
ktime_get_snapshot() provides a snapshot of the underlying clocksource
counter value and the corresponding CLOCK_MONOTONIC_RAW, CLOCK_REALTIME and
CLOCK_BOOTTIME timestamps.
There is no usage of CLOCK_REALTIME and CLOCK_BOOTTIME at the same time and
CLOCK_BOOTTIME support was just added for the ARM64 KVM tracing mechanism,
which needs CLOCK_BOOTTIME and the underlying clocksource counter value.
ktime_get_snapshot() is also not suitable for usage with CLOCK_AUX, but
that's a prerequisite to support PTP hardware timestamping for CLOCK_AUX
steering.
As a first step, rename ktime_get_snapshot() to ktime_get_snapshot_id(),
which now takes a clockid argument to select the clock which needs to be
captured. The result is stored in system_time_snapshot::sys, which will
replace the system_time_snapshot::real/boot members once all usage sites
have been converted.
ktime_get_snapshot() is a simple wrapper which hands in CLOCK_REALTIME as
clockid argument for the conversion period. That means CLOCK_REALTIME is
now captured twice, but that redunancy is only temporary.
No functional change vs. current users of ktime_get_snapshot()
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
---
include/linux/timekeeping.h | 29 ++++++++++-----
kernel/time/timekeeping.c | 84 +++++++++++++++++++++++++++++++++-----------
2 files changed, 84 insertions(+), 29 deletions(-)
--- a/include/linux/timekeeping.h
+++ b/include/linux/timekeeping.h
@@ -276,24 +276,28 @@ static inline bool ktime_get_aux_ts64(cl
#endif
/**
- * struct system_time_snapshot - simultaneous raw/real time capture with
- * counter value
- * @cycles: Clocksource counter value to produce the system times
- * @real: Realtime system time
- * @boot: Boot time
- * @raw: Monotonic raw system time
- * @cs_id: Clocksource ID
+ * struct system_time_snapshot - Simultaneous time capture of CLOCK_MONOTONIC_RAW,
+ * a selected CLOCK_* and the clocksource counter value
+ * @cycles: Clocksource counter value to produce the system times
+ * @sys: The system time of the selected CLOCK ID
+ * @real: Realtime system time
+ * @boot: Boot time
+ * @raw: Monotonic raw system time
+ * @cs_id: Clocksource ID
* @clock_was_set_seq: The sequence number of clock-was-set events
* @cs_was_changed_seq: The sequence number of clocksource change events
+ * @valid: True if the snapshot is valid
*/
struct system_time_snapshot {
u64 cycles;
+ ktime_t sys;
ktime_t real;
ktime_t boot;
ktime_t raw;
enum clocksource_ids cs_id;
unsigned int clock_was_set_seq;
u8 cs_was_changed_seq;
+ u8 valid;
};
/**
@@ -341,9 +345,16 @@ extern int get_device_system_crosststamp
struct system_device_crosststamp *xtstamp);
/*
- * Simultaneously snapshot realtime and monotonic raw clocks
+ * Simultaneously snapshot a given clock with MONOTONIC_RAW and the underlying
+ * clocksource counter value.
*/
-extern void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot);
+extern bool ktime_get_snapshot_id(struct system_time_snapshot *systime_snapshot,
+ clockid_t clock_id);
+
+static inline void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot)
+{
+ WARN_ON_ONCE(!ktime_get_snapshot_id(systime_snapshot, CLOCK_REALTIME));
+}
/*
* Persistent clock related interfaces
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -1183,43 +1183,87 @@ noinstr time64_t __ktime_get_real_second
}
/**
- * ktime_get_snapshot - snapshots the realtime/monotonic raw clocks with counter
- * @systime_snapshot: pointer to struct receiving the system time snapshot
+ * ktime_get_snapshot_id - Simultaneously snapshot a given clock ID with
+ * CLOCK_MONOTONIC_RAW and the underlying
+ * clocksource counter value.
+ * @systime_snapshot: Pointer to struct receiving the system time snapshot
+ * @clock_id: The clock ID to snapshot
*/
-void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot)
+bool ktime_get_snapshot_id(struct system_time_snapshot *systime_snapshot, clockid_t clock_id)
{
- struct timekeeper *tk = &tk_core.timekeeper;
+ ktime_t base_raw, base_sys, offs_sys, *offs, offs_zero = 0;
+ u64 nsec_raw, nsec_sys, now;
+ struct timekeeper *tk;
+ struct tk_data *tkd;
unsigned int seq;
- ktime_t base_raw;
ktime_t base_real;
ktime_t base_boot;
- u64 nsec_raw;
- u64 nsec_real;
- u64 now;
- WARN_ON_ONCE(timekeeping_suspended);
+ /* Invalidate the snapshot for all failure cases */
+ systime_snapshot->valid = false;
+
+ if (WARN_ON_ONCE(timekeeping_suspended))
+ return false;
+
+ switch (clock_id) {
+ case CLOCK_REALTIME:
+ tkd = &tk_core;
+ offs = &tk_core.timekeeper.offs_real;
+ break;
+ /* Map RAW to MONOTONIC so the loop below is trivial */
+ case CLOCK_MONOTONIC_RAW:
+ case CLOCK_MONOTONIC:
+ tkd = &tk_core;
+ offs = &offs_zero;
+ break;
+ case CLOCK_BOOTTIME:
+ tkd = &tk_core;
+ offs = &tk_core.timekeeper.offs_boot;
+ break;
+ default:
+ WARN_ON_ONCE(1);
+ return false;
+ }
+
+ tk = &tkd->timekeeper;
do {
- seq = read_seqcount_begin(&tk_core.seq);
+ seq = read_seqcount_begin(&tkd->seq);
+
now = tk_clock_read(&tk->tkr_mono);
systime_snapshot->cs_id = tk->tkr_mono.clock->id;
systime_snapshot->cs_was_changed_seq = tk->cs_was_changed_seq;
systime_snapshot->clock_was_set_seq = tk->clock_was_set_seq;
- base_real = ktime_add(tk->tkr_mono.base,
- tk_core.timekeeper.offs_real);
- base_boot = ktime_add(tk->tkr_mono.base,
- tk_core.timekeeper.offs_boot);
+
+ base_sys = tk->tkr_mono.base;
+ offs_sys = *offs;
base_raw = tk->tkr_raw.base;
- nsec_real = timekeeping_cycles_to_ns(&tk->tkr_mono, now);
- nsec_raw = timekeeping_cycles_to_ns(&tk->tkr_raw, now);
- } while (read_seqcount_retry(&tk_core.seq, seq));
+
+ /* Kept around until the callers are fixed up */
+ base_real = ktime_add(base_sys, tk_core.timekeeper.offs_real);
+ base_boot = ktime_add(base_sys, tk_core.timekeeper.offs_boot);
+
+ nsec_sys = timekeeping_cycles_to_ns(&tk->tkr_mono, now);
+ nsec_raw = timekeeping_cycles_to_ns(&tk->tkr_raw, now);
+ } while (read_seqcount_retry(&tkd->seq, seq));
systime_snapshot->cycles = now;
- systime_snapshot->real = ktime_add_ns(base_real, nsec_real);
- systime_snapshot->boot = ktime_add_ns(base_boot, nsec_real);
+ systime_snapshot->sys = ktime_add_ns(base_sys, offs_sys + nsec_sys);
+ systime_snapshot->real = ktime_add_ns(base_real, nsec_sys);
+ systime_snapshot->boot = ktime_add_ns(base_boot, nsec_sys);
systime_snapshot->raw = ktime_add_ns(base_raw, nsec_raw);
+
+ /*
+ * Special case for PTP. Just transfer the raw time into sys,
+ * so the call sites can consistently use snap::sys.
+ */
+ if (clock_id == CLOCK_MONOTONIC_RAW)
+ systime_snapshot->sys = systime_snapshot->raw;
+ /* Tell the consumer that this snapshot is valid */
+ systime_snapshot->valid = true;
+ return true;
}
-EXPORT_SYMBOL_GPL(ktime_get_snapshot);
+EXPORT_SYMBOL_GPL(ktime_get_snapshot_id);
/* Scale base by mult/div checking for overflow */
static int scale64_check_overflow(u64 mult, u64 div, u64 *base)
^ permalink raw reply
* [patch 00/24] timekeeping/ptp: Expand snapshot functionality
From: Thomas Gleixner @ 2026-05-26 17:13 UTC (permalink / raw)
To: LKML
Cc: David Woodhouse, Miroslav Lichvar, John Stultz, Stephen Boyd,
Anna-Maria Behnsen, Frederic Weisbecker, thomas.weissschuh,
Arthur Kiyanovski, Rodolfo Giometti, Vincent Donnefort,
Marc Zyngier, Oliver Upton, kvmarm, Oliver Upton, Richard Cochran,
netdev, Takashi Iwai, Miri Korenblit, Johannes Berg, Jacob Keller,
Tony Nguyen, Saeed Mahameed, Peter Hilber, Michael S. Tsirkin,
virtualization, linux-wireless, linux-sound
Sorry for the large CC list, but changing the inner workings touches
unfortunately a lot of places in one go.
PTP wants to grow new snapshot functionality, which provides not only the
captured CLOCK* values, but also the underlying clocksource counter value.
https://lore.kernel.org/20260515164033.6403-1-akiyano@amazon.com
There was quite some discussion in seemingly related threads how to capture
these values and how to provide core infrastructure so that driver writers
have something to work with
https://lore.kernel.org/20260514225842.110706-1-hramamurthy@google.com
https://lore.kernel.org/20260520135207.37826-1-dwmw2@infradead.org
This series implements the timekeeping related mechanisms to:
1) Capture CLOCK values along with the clocksource counter value for
non-hardware based sampling
2) Expanding the hardware cross time stamp mechanism to hand back the
clocksource counter value, which was captured by the device, along
with the related CLOCK values
3) Adding AUX clock support to the hardware cross timestamping core
It's based on v7.1-rc2 and also available from git:
git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git timekeeping-ptp-extend-v1
Thanks to David for rebasing his PTP/timekeeping work on top and providing
feedback, fixes and testing.
Thanks,
tglx
---
arch/arm64/kvm/hyp_trace.c | 8
arch/arm64/kvm/hypercalls.c | 6
drivers/net/dsa/sja1105/sja1105_main.c | 8
drivers/net/ethernet/intel/ice/ice_ptp.c | 5
drivers/net/ethernet/intel/igc/igc.h | 1
drivers/net/ethernet/intel/igc/igc_ptp.c | 4
drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | 4
drivers/net/wireless/intel/iwlwifi/mld/ptp.c | 5
drivers/net/wireless/intel/iwlwifi/mvm/ptp.c | 7
drivers/pps/generators/pps_gen-dummy.c | 6
drivers/pps/generators/pps_gen_tio.c | 6
drivers/ptp/ptp_chardev.c | 18 +
drivers/ptp/ptp_ocp.c | 11 -
drivers/ptp/ptp_vmclock.c | 25 --
drivers/virtio/virtio_rtc_ptp.c | 2
include/linux/pps_kernel.h | 8
include/linux/ptp_clock_kernel.h | 15 -
include/linux/timekeeping.h | 54 ++---
kernel/time/timekeeping.c | 211 ++++++++++++--------
sound/hda/common/controller.c | 4
20 files changed, 236 insertions(+), 172 deletions(-)
^ permalink raw reply
* pull-request: ath-next-20260526
From: Jeff Johnson @ 2026-05-26 16:25 UTC (permalink / raw)
To: linux-wireless, Johannes Berg; +Cc: ath10k, ath11k, ath12k, jjohnson
The following changes since commit 7baf5857e15d722776898510a10546d6b2f18645:
wifi: brcmsmac: phy_lcn: Remove dead code in wlc_lcnphy_radio_2064_channel_tune_4313() (2026-04-28 10:43:27 +0200)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/ath/ath.git tags/ath-next-20260526
for you to fetch changes up to d5c336161088c588f85da64f48ba6deead194afd:
wifi: ath12k: fix error unwind on arch_init() failure in PCI probe (2026-05-26 08:54:27 -0700)
----------------------------------------------------------------
ath.git patches for v7.2 (PR #2)
For ath12k:
- Add thermal throttling and cooling device support
- Add support for handling incumbent signal interference in 6 GHz
- Add support for channel 177 in the 5 GHz band
In addition, a large number of cleanup and minor bug fixing across
all supported drivers.
----------------------------------------------------------------
Aishwarya R (2):
wifi: ath12k: Add support for handling incumbent signal interference in 6 GHz
wifi: ath12k: Add debugfs support to simulate incumbent signal interference
Arnd Bergmann (1):
wifi: ath10k: drop gpio_led reference
Daniel Lezcano (2):
wifi: ath: Use the unified QMI service ID instead of defining it locally
wifi: ath: Fix the license marking
Jose Ignacio Tornos Martinez (1):
wifi: ath11k: fix warning when unbinding
Kexin Sun (1):
wifi: ath10k: update outdated comment for renamed ieee80211_tx_status()
Krzysztof Kozlowski (1):
wifi: ath: Unify user-visible "Qualcomm" name
Maharaja Kennadyrajan (5):
wifi: ath12k: handle thermal throttle stats WMI event
wifi: ath12k: configure firmware thermal throttling via WMI
wifi: ath12k: refactor per-radio thermal hwmon setup and cleanup
wifi: ath12k: reorder group start/stop for safe thermal sysfs cleanup
wifi: ath12k: add thermal cooling device support
Nicolas Escande (1):
wifi: ath12k: unify error handling in some ath12k_wmi_xxx() functions
Ripan Deuri (1):
wifi: ath12k: fix error unwind on arch_init() failure in PCI probe
Rosen Penev (4):
wifi: ath9k: use non devm for nvmem_cell_get
wifi: ath9k: owl: move name into owl_nvmem_probe
wifi: ath9k: use kmemdup and kcalloc
wifi: ath12k: use kzalloc_flex
Tamizh Chelvam Raja (1):
wifi: ath12k: Handle DP_RX_DECAP_TYPE_8023 type in Rx path
Tristan Madani (1):
wifi: ath9k: fix OOB access from firmware tx status queue ID
Wei Zhang (1):
wifi: ath11k: cancel SSR work items during PCI shutdown
Yingying Tang (1):
wifi: ath12k: add channel 177 to the 5 GHz channel list
pengdonglin (1):
wifi: ath9k: Remove redundant rcu_read_lock/unlock() in spin_lock
drivers/net/wireless/ath/ath10k/core.h | 1 -
drivers/net/wireless/ath/ath10k/htt_tx.c | 2 +-
drivers/net/wireless/ath/ath10k/leds.c | 8 +-
drivers/net/wireless/ath/ath10k/qmi.c | 4 +-
drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h | 1 -
drivers/net/wireless/ath/ath11k/Kconfig | 2 +-
drivers/net/wireless/ath/ath11k/dp.c | 1 +
drivers/net/wireless/ath/ath11k/mhi.c | 4 +-
drivers/net/wireless/ath/ath11k/pci.c | 8 +
drivers/net/wireless/ath/ath11k/qmi.c | 3 +-
drivers/net/wireless/ath/ath11k/qmi.h | 1 -
drivers/net/wireless/ath/ath12k/Kconfig | 6 +-
drivers/net/wireless/ath/ath12k/core.c | 50 +-
drivers/net/wireless/ath/ath12k/core.h | 12 +-
drivers/net/wireless/ath/ath12k/debugfs.c | 46 ++
drivers/net/wireless/ath/ath12k/dp_rx.c | 68 ++-
drivers/net/wireless/ath/ath12k/mac.c | 110 +++-
drivers/net/wireless/ath/ath12k/pci.c | 2 +-
drivers/net/wireless/ath/ath12k/qmi.c | 2 +-
drivers/net/wireless/ath/ath12k/qmi.h | 1 -
drivers/net/wireless/ath/ath12k/thermal.c | 252 +++++++--
drivers/net/wireless/ath/ath12k/thermal.h | 35 ++
drivers/net/wireless/ath/ath12k/wmi.c | 565 ++++++++++++++++++++-
drivers/net/wireless/ath/ath12k/wmi.h | 125 ++++-
drivers/net/wireless/ath/ath9k/ar9002_hw.c | 6 +-
.../net/wireless/ath/ath9k/ath9k_pci_owl_loader.c | 31 +-
drivers/net/wireless/ath/ath9k/common-init.c | 8 +-
drivers/net/wireless/ath/ath9k/init.c | 11 +-
drivers/net/wireless/ath/ath9k/recv.c | 4 +-
drivers/net/wireless/ath/ath9k/xmit.c | 7 +-
30 files changed, 1180 insertions(+), 196 deletions(-)
^ permalink raw reply
* Re: [PATCH v7 00/15] firmware: qcom: Add OP-TEE PAS service support
From: Sumit Garg @ 2026-05-26 16:13 UTC (permalink / raw)
To: bod
Cc: andersson, linux-arm-msm, devicetree, dri-devel, freedreno,
linux-media, netdev, linux-wireless, ath12k, linux-remoteproc,
konradybcio, robh, krzk+dt, conor+dt, robin.clark, sean, akhilpo,
lumag, abhinav.kumar, jesszhan0024, marijn.suijten, airlied,
simona, vikash.garodia, dikshita.agarwal, mchehab, elder,
andrew+netdev, davem, edumazet, kuba, pabeni, jjohnson,
mathieu.poirier, trilokkumar.soni, mukesh.ojha, pavan.kondeti,
jorge.ramirez, tonyh, vignesh.viswanathan, srinivas.kandagatla,
amirreza.zarrabi, jens.wiklander, op-tee, apurupa, skare,
linux-kernel, Sumit Garg
In-Reply-To: <177975399325.14006.12128272008783925649.b4-reply@b4>
Hey Brian,
On Tue, May 26, 2026 at 01:06:33AM +0100, bod@kernel.org wrote:
> On 2026-05-22 17:29 +0530, Sumit Garg wrote:
> > From: Sumit Garg <sumit.garg@oss.qualcomm.com>
> >
> > Qcom platforms has the legacy of using non-standard SCM calls
> > splintered over the various kernel drivers. These SCM calls aren't
> > compliant with the standard SMC calling conventions which is a
> > prerequisite to enable migration to the FF-A specifications from Arm.
> >
> > OP-TEE as an alternative trusted OS to Qualcomm TEE (QTEE) can't
> > support these non-standard SCM calls. And even for newer architectures
> > using S-EL2 with Hafnium support, QTEE won't be able to support SCM
> > calls either with FF-A requirements coming in. And with both OP-TEE
> > and QTEE drivers well integrated in the TEE subsystem, it makes further
> > sense to reuse the TEE bus client drivers infrastructure.
> >
> > The added benefit of TEE bus infrastructure is that there is support
> > for discoverable/enumerable services. With that client drivers don't
> > have to manually invoke a special SCM call to know the service status.
> >
> > So enable the generic Peripheral Authentication Service (PAS) provided
> > by the firmware. It acts as the common layer with different TZ
> > backends plugged in whether it's an SCM implementation or a proper
> > TEE bus based PAS service implementation.
> >
> > The TEE PAS service ABI is designed to be extensible with additional API
> > as PTA_QCOM_PAS_CAPABILITIES. This allows to accommodate any future
> > extensions of the PAS service needed while still maintaining backwards
> > compatibility.
> >
> > Currently OP-TEE support is being added to provide the backend PAS
> > service implementation which can be found as part of this PR [1].
> > This implementation has been tested on Kodiak/RB3Gen2 board with lemans
> > EVK board being the next target. In addition to that WIN/IPQ targets
> > planning to use OP-TEE will use this service too. Surely the backwards
> > compatibility is maintained and tested for SCM backend.
> >
> > Note that kernel PAS service support while running in EL2 is at parity
> > among OP-TEE vs QTEE. Especially the media (venus/iris) support depends
> > on proper IOMMU support being worked out on the PAS client end.
> >
> > Patch summary:
> > - Patch #1: adds Kodiak EL2 overlay since boot stack with TF-A/OP-TEE
> > only allow UEFI and Linux to boot in EL2.
> > - Patch #2: adds generic PAS service.
> > - Patch #3: migrates SCM backend to generic PAS service.
> > - Patch #4: adds TEE/OP-TEE backend for generic PAS service.
> > - Patch #5-#13: migrates all client drivers to generic PAS service.
> > - Patch #14: drops legacy PAS SCM exported APIs.
> >
> > The patch-set is based on qcom tree tip [2] and can be found in git tree
> > here [3].
> >
> > Merge strategy:
> >
> > It is expected due to APIs dependency, the entire patch-set to go via
> > the Qcom tree. All other subsystem maintainers, it will be great if I
> > can get acks for the corresponding subsystem patches.
It looks like you missed this merge strategy part of the cover letter.
> >
> > [1] https://github.com/OP-TEE/optee_os/pull/7721 (already merged)
> > [2] https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/log/?h=for-next
> > [3] https://git.kernel.org/pub/scm/linux/kernel/git/sumit.garg/linux.git/log/?h=qcom-pas-v7
> >
> > ---
> > Changes in v7:
> > - Rebased to qcom tree (for-next branch) tip.
> > - Merged patch #5 and #7 due to build dependency.
> > - Disabled modem for kodiak EL2 as it isn't tested yet.
> > - Fix an issue found out by sashiko-bot for patch #4.
>
> This whole series needs to be broken up into different parts and sent in
> smaller chunks landing the core changes into the firmware, the drivers and
> finally the dts.
The DTS EL2 change for Kodiak is totally independent one and that's why
it's the first one in this series which can be picked independently.
>
> For example applying the Iris stuff is impossible until the remoteproc
> stuff lands.
>
> Instead of sending one giant series which no one maintainer can apply send
> a number of series where one posts a dependency on the other.
The subsystem changes like for Iris are just about renaming of the
firmware APIs to be used which is moving away from SCM specific API to
the generic PAS API. I don't think there is any clean way to merge the
API renaming changes independently of when the new API gets introduced.
>
> Lumping the TEE stuff in with video encoder, wifi, dts is spanning too many
> things and makes merging a NAK.
>
> Break this up into logical chunks and sequence a one series on top of the
> other - accpeting that you might, likely will have to keep on top of the
> various series and resend/rebase as things get merged.
I tried my best for the logical split of the patches here keeping the
subsystems changes to very minimal required (only renaming firmware
APIs). I would be open to any further suggestions.
However, if you are happy with firmware APIs renaming for the media
subsystem then it will be nice to get ack from you. I hope Bjorn can
then pickup the entire series.
-Sumit
>
> > Changes in v6:
> > - Rebased to v7.1-rc4 tag.
> > - Patch #14: fixed ret error print.
> > - Add Kconfig descriptions for PAS symbols such that they are visible
> > in menuconfig to update.
> >
> > Changes in v5:
> > - Incorporated misc. comments from Mukesh.
> > - Split up patch #11 into 2 to add an independent commit for passing
> > proper PAS ID to set_remote_state API.
> > - Picked up tags.
> >
> > Changes in v4:
> > - Incorporate misc. comments on patch #4.
> > - Picked up an ack for patch #10.
> > - Clarify in cover letter about state of media support.
> >
> > Changes in v3:
> > - Incorporated some style and misc. comments for patch #2, #3 and #4.
> > - Add QCOM_PAS Kconfig dependency for various subsystems.
> > - Switch from pseudo TA to proper TA invoke commands.
> >
> > Changes in v2:
> > - Fixed kernel doc warnings.
> > - Polish commit message and comments for patch #2.
> > - Pass proper PAS ID in set_remote_state API for media firmware drivers.
> > - Added Maintainer entry and dropped MODULE_AUTHOR.
> >
> > Mukesh Ojha (1):
> > arm64: dts: qcom: kodiak: Add EL2 overlay
> >
> > Sumit Garg (14):
> > firmware: qcom: Add a generic PAS service
> > firmware: qcom_scm: Migrate to generic PAS service
> > firmware: qcom: Add a PAS TEE service
> > remoteproc: qcom_q6v5_pas: Switch over to generic PAS TZ APIs
> > remoteproc: qcom_q6v5_mss: Switch to generic PAS TZ APIs
> > remoteproc: qcom_wcnss: Switch to generic PAS TZ APIs
> > remoteproc: qcom: Select QCOM_PAS generic service
> > drm/msm: Switch to generic PAS TZ APIs
> > media: qcom: Switch to generic PAS TZ APIs
> > media: qcom: Pass proper PAS ID to set_remote_state API
> > net: ipa: Switch to generic PAS TZ APIs
> > wifi: ath12k: Switch to generic PAS TZ APIs
> > firmware: qcom_scm: Remove SCM PAS wrappers
> > MAINTAINERS: Add maintainer entry for Qualcomm PAS TZ service
> >
> > MAINTAINERS | 9 +
> > arch/arm64/boot/dts/qcom/Makefile | 2 +
> > arch/arm64/boot/dts/qcom/kodiak-el2.dtso | 39 ++
> > drivers/firmware/qcom/Kconfig | 21 +-
> > drivers/firmware/qcom/Makefile | 2 +
> > drivers/firmware/qcom/qcom_pas.c | 291 +++++++++++
> > drivers/firmware/qcom/qcom_pas.h | 50 ++
> > drivers/firmware/qcom/qcom_pas_tee.c | 477 ++++++++++++++++++
> > drivers/firmware/qcom/qcom_scm.c | 302 ++++-------
> > drivers/gpu/drm/msm/Kconfig | 1 +
> > drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 4 +-
> > drivers/gpu/drm/msm/adreno/adreno_gpu.c | 11 +-
> > drivers/media/platform/qcom/iris/Kconfig | 25 +-
> > .../media/platform/qcom/iris/iris_firmware.c | 9 +-
> > drivers/media/platform/qcom/venus/Kconfig | 1 +
> > drivers/media/platform/qcom/venus/firmware.c | 11 +-
> > drivers/net/ipa/Kconfig | 2 +-
> > drivers/net/ipa/ipa_main.c | 13 +-
> > drivers/net/wireless/ath/ath12k/Kconfig | 2 +-
> > drivers/net/wireless/ath/ath12k/ahb.c | 10 +-
> > drivers/remoteproc/Kconfig | 4 +-
> > drivers/remoteproc/qcom_q6v5_mss.c | 5 +-
> > drivers/remoteproc/qcom_q6v5_pas.c | 51 +-
> > drivers/remoteproc/qcom_wcnss.c | 12 +-
> > drivers/soc/qcom/mdt_loader.c | 12 +-
> > include/linux/firmware/qcom/qcom_pas.h | 43 ++
> > include/linux/firmware/qcom/qcom_scm.h | 29 --
> > include/linux/soc/qcom/mdt_loader.h | 6 +-
> > 28 files changed, 1124 insertions(+), 320 deletions(-)
> > create mode 100644 arch/arm64/boot/dts/qcom/kodiak-el2.dtso
> > create mode 100644 drivers/firmware/qcom/qcom_pas.c
> > create mode 100644 drivers/firmware/qcom/qcom_pas.h
> > create mode 100644 drivers/firmware/qcom/qcom_pas_tee.c
> > create mode 100644 include/linux/firmware/qcom/qcom_pas.h
> >
> > --
> > 2.51.0
> >
> >
>
>
^ permalink raw reply
* Re: [PATCH ath-next] wifi: ath12k: fix error unwind on arch_init() failure in PCI probe
From: Jeff Johnson @ 2026-05-26 15:58 UTC (permalink / raw)
To: ath12k, Ripan Deuri; +Cc: linux-wireless
In-Reply-To: <20260519192815.3911324-1-ripan.deuri@oss.qualcomm.com>
On Wed, 20 May 2026 00:58:15 +0530, Ripan Deuri wrote:
> When arch_init() fails in ath12k_pci_probe(), the code jumps to
> err_pci_msi_free, leaking resources in teardown.
>
> Redirect the failure path to err_free_irq so teardown matches the setup order.
>
> Compile-tested only.
>
> [...]
Applied, thanks!
[1/1] wifi: ath12k: fix error unwind on arch_init() failure in PCI probe
commit: d5c336161088c588f85da64f48ba6deead194afd
Best regards,
--
Jeff Johnson <jeff.johnson@oss.qualcomm.com>
^ permalink raw reply
* pull-request: wifi: iwlwifi: next - 2026-05-26
From: Korenblit, Miriam Rachel @ 2026-05-26 12:26 UTC (permalink / raw)
To: linux-wireless
The following changes since commit 1d174fec87850e1005db9b106f84bbbb19cb59b9:
ARM: dts: omap2: add stlc4560 spi-wireless node (2026-05-20 12:05:04 +0200)
are available in the Git repository at:
https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next.git/ tags/iwlwifi-next-2026-05-26
for you to fetch changes up to 455fac900cf93d03a020b82f2cf2849cd2c74fd8:
wifi: iwlwifi: mld: fix indentation in iwl_mld_fill_supp_rates() (2026-05-26 15:17:13 +0300)
----------------------------------------------------------------
iwlwifi - next: 2026-05-26
This contains mainly:
UHR support (DPS, DUO, multi-link PM), NAN enhancements
(multicast, schedule config v2, multiple stations), EMLSR fixes, new
Killer/LNL device IDs, firmware API cleanups, and a few bugfixes
----------------------------------------------------------------
Aaron Katzin (1):
wifi: iwlwifi: pcie: add debug print for resume flow if powered off
Avinash Bhatt (9):
wifi: iwlwifi: fix buffer overflow when firmware reports no channels
wifi: iwlwifi: Transition to basic uAPSD with MAC_PM_POWER_TABLE API VER_3
wifi: iwlwifi: mld: add chan-load hysteresis for MLO scan triggers
wifi: iwlwifi: mld: add duplicated beacon RSSI adjustment
wifi: iwlwifi: mld: Add KUnit tests for channel-load thresholds
wifi: iwlwifi: mld: implement PSD/EIRP RSSI adjustment
wifi: iwlwifi: mld: update link grading tables per bandwidth
wifi: iwlwifi: mld: skip MLO scan trigger when AP has no QBSS Load IE
wifi: iwlwifi: mld: keep healthy link on EMLSR missed beacon exit
Avraham Stern (5):
wifi: iwlwifi: mld: call iwl_mld_free_ap_early_key() for AP only
wifi: iwlwifi: mld: add support for nan schedule config command version 2
wifi: iwlwifi: mld: add handler for NAN ULW attribute notification
wifi: iwlwifi: mld: nan: add availability attribute to schedule config
wifi: iwlwifi: mld: add support for deferred nan schedule config
Daniel Gabay (4):
wifi: iwlwifi: mld: fix NAN DW end notification handler
wifi: iwlwifi: mld: add NULL check for channel in DW end handler
wifi: iwlwifi: mld: validate aux sta before flush in stop_nan
wifi: iwlwifi: print UHR rate type
Dongyang Jin (1):
wifi: iwlwifi: mld: fix indentation in iwl_mld_fill_supp_rates()
Emmanuel Grumbach (15):
wifi: iwlwifi: fix the access to CNVR TOP registers
wifi: iwlwifi: mld: honor BSS_CHANGED_BEACON_ENABLED
wifi: iwlwifi: mld: move iwl_mld_link_info_changed_ap_ibss to ap.c
wifi: iwlwifi: rename iwl_system_statistics_notif_oper
wifi: iwlwifi: introduce iwl_system_statistics_notif_oper version 4
wifi: iwlwifi: mld: support the new statistics APIs
wifi: iwlwifi: remove nvm_ver for devices that don't need it
wifi: iwlwifi: implement the new RSC notification
wifi: iwlwifi: led_compensation is needed for iwldvm only
wifi: iwlwifi: shadow_ram_support is needed for iwldvm only.
wifi: iwlwifi: max_event_log_size is needed for iwldvm only
wifi: iwlwifi: smem_offset smem_len are not needed from 22000 and up
wifi: iwlwifi: reduce the log level of firmware debug buffer size mismatch
wifi: iwlwifi: move pcie content to pcie internal transport
wifi: iwlwifi: move iwl_trans_activate_nic to iwl-trans.c
Ilan Peer (7):
wifi: iwlwifi: mld: Fix number of antennas in NAN capabilities
wifi: iwlwifi: mld: Do not declare support for NDPE
wifi: iwlwifi: mld: Do not declare NAN support for Extended Key ID
wifi: iwlwifi: mld: Add support for multiple NAN Management stations
wifi: iwlwifi: mld: Replace static declarations of IWL_MLD_ALLOC_FN
wifi: iwlwifi: mld: Add support for NAN multicast data
wifi: iwlwifi: mld: Disallow using a per-STA GTK for Tx
Israel Kozitz (1):
wifi: iwlwifi: mld: fix NAN max channel switch time unit
Jay Ng (1):
wifi: iwlwifi: remove unused header inclusions
Johannes Berg (38):
wifi: iwlwifi: mld: tlc: separate from link STA
wifi: iwlwifi: mld: disable queue hang detection for NAN data
wifi: iwlwifi: mld: support NAN and NAN_DATA interfaces
wifi: iwlwifi: mld: add NAN link management
wifi: iwlwifi: add NAN schedule command support
wifi: iwlwifi: mld: implement NAN peer station management
wifi: iwlwifi: mld: add peer schedule support
wifi: iwlwifi: mld: clean up station handling in key APIs
wifi: iwlwifi: mld: add TLC support for NAN stations
wifi: iwlwifi: mld: track TX/RX IGTKs separately
wifi: iwlwifi: mld: don't report bad STA ID in EHT TB sniffer
wifi: iwlwifi: api: RX: define UHR RX PHY flags
wifi: iwlwifi: fw: api: fix UHR U-SIG whitespace
wifi: iwlwifi: fw: api: add/fix some UHR sniffer definitions
wifi: iwlwifi: pcie: fix ACPI DSM check
wifi: iwlwifi: advertise UHR capabilities for such devices
wifi: iwlwifi: print FSEQ sha1 in addition to version
wifi: iwlwifi: tighten flags in debugfs command sending
wifi: iwlwifi: define new FSEQ TLV with MAC ID
wifi: iwlwifi: set state to NO_FW on reset
wifi: iwlwifi: mld: support NPCA capability for UHR devices
wifi: iwlwifi: mld: implement UHR DPS
wifi: iwlwifi: mld: give link STA debugfs files a namespace
wifi: iwlwifi: mld: set correct key mask for NAN
wifi: iwlwifi: mld: add UHR DUO support
wifi: iwlwifi: mld: implement UHR multi-link PM
wifi: iwlwifi: mld: rename LINK_DEBUGFS_WRITE_FILE_OPS
wifi: iwlwifi: mld: add link and link station FW IDs to debugfs
wifi: iwlwifi: api: remove NAN_GROUP
wifi: iwlwifi: api: clean up/fix some kernel-doc references
wifi: iwlwifi: pcie: add two LNL PCI IDs
wifi: iwlwifi: clean up location format/BW encoding
wifi: iwlwifi: fw: move struct iwl_fw_ini_dump_entry to dbg.c
wifi: iwlwifi: fw: separate ini dump allocation
wifi: iwlwifi: fw: dbg: always use non-tracing PRPH access
wifi: iwlwifi: fw: separate out old-style dump code
wifi: iwlwifi: dbg: remove unused 'range_len' arg from dump
wifi: iwlwifi: transport: add memory read under NIC access
Junjie Cao (2):
wifi: iwlwifi: mld: fix race condition in PTP removal
wifi: iwlwifi: mvm: fix race condition in PTP removal
Junrui Luo (1):
wifi: iwlwifi: mld: validate sta_mask before ffs() in BA session handlers
Miri Korenblit (19):
wifi: iwlwifi: mld: set NAN phy capabilities
wifi: iwlwifi: mld: use host rate for NAN management frames
wifi: iwlwifi: mld: extract NAN capabilities setting to a function
wifi: iwlwifi: mld: don't allow softAP with NAN
wifi: iwlwifi: bump core version for BZ/SC/DR to 103
wifi: iwlwifi: mld: allow NAN data
wifi: iwlwifi: support a TLV indicating num of mgmt mcast keys
wifi: iwlwifi: mark that we support iwl_rx_mpdu_desc version 7 and 8
wifi: iwlwifi: stop supporting cores 97 to 100
wifi: iwlwifi: mld: stop supporting iwl_compressed_ba_notif version 5 and 6
wifi: iwlwifi: mld: stop supporting MAC_PM_POWER_TABLE version 1
wifi: iwlwifi: mld: stop supporting TLC_MNG_UPDATE_NTFY_API_S_VER_3
wifi: iwlwifi: mld: stop supporting rate_n_flags version 2
wifi: iwlwifi: bump core version for BZ/SC/DR to 104
wifi: iwlwifi: define MODULE_FIRMWARE with the correct API
wifi: iwlwifi: mld: evacuate NAN channels on link switch
wifi: iwlwifi: mld: don't flush async_handlers_wk when canceling notifications
wifi: iwlwifi: mld: purge async notifications upon nic error
wifi: iwlwifi: bump maximum core version for BZ/SC/DR to 105
Pagadala Yesu Anjaneyulu (3):
wifi: iwlwifi: add RF name handling for PE chip type for debugfs
wifi: iwlwifi: add XIAOMI to PPAG approved list
wifi: iwlwifi: mld: disallow puncturing in US/CA for WH
Shahar Tzarfati (2):
wifi: iwlwifi: mld: expose beacon avg signal
wifi: iwlwifi: Add names for Killer BE1735x and BE1730x
drivers/net/wireless/intel/iwlwifi/Makefile | 2 +-
drivers/net/wireless/intel/iwlwifi/cfg/22000.c | 23 +-
drivers/net/wireless/intel/iwlwifi/cfg/7000.c | 5 +-
drivers/net/wireless/intel/iwlwifi/cfg/8000.c | 5 +-
drivers/net/wireless/intel/iwlwifi/cfg/9000.c | 5 +-
drivers/net/wireless/intel/iwlwifi/cfg/ax210.c | 38 +-
drivers/net/wireless/intel/iwlwifi/cfg/bz.c | 19 +-
drivers/net/wireless/intel/iwlwifi/cfg/dr.c | 19 +-
drivers/net/wireless/intel/iwlwifi/cfg/rf-fm.c | 8 +-
drivers/net/wireless/intel/iwlwifi/cfg/rf-gf.c | 17 -
drivers/net/wireless/intel/iwlwifi/cfg/rf-hr.c | 30 +-
drivers/net/wireless/intel/iwlwifi/cfg/rf-pe.c | 22 +-
drivers/net/wireless/intel/iwlwifi/cfg/rf-wh.c | 8 +-
drivers/net/wireless/intel/iwlwifi/cfg/sc.c | 22 +-
.../net/wireless/intel/iwlwifi/fw/api/commands.h | 13 +-
.../net/wireless/intel/iwlwifi/fw/api/datapath.h | 9 +-
.../net/wireless/intel/iwlwifi/fw/api/location.h | 107 +-
.../net/wireless/intel/iwlwifi/fw/api/mac-cfg.h | 184 ++-
drivers/net/wireless/intel/iwlwifi/fw/api/power.h | 48 +-
drivers/net/wireless/intel/iwlwifi/fw/api/rx.h | 40 +-
drivers/net/wireless/intel/iwlwifi/fw/api/sta.h | 3 +-
drivers/net/wireless/intel/iwlwifi/fw/api/stats.h | 88 +-
drivers/net/wireless/intel/iwlwifi/fw/dbg-old.c | 1022 ++++++++++++++++
drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 1292 +++-----------------
drivers/net/wireless/intel/iwlwifi/fw/dbg.h | 7 +-
drivers/net/wireless/intel/iwlwifi/fw/debugfs.c | 15 +-
drivers/net/wireless/intel/iwlwifi/fw/error-dump.h | 14 +-
drivers/net/wireless/intel/iwlwifi/fw/file.h | 10 +-
drivers/net/wireless/intel/iwlwifi/fw/img.h | 3 +-
drivers/net/wireless/intel/iwlwifi/fw/regulatory.c | 7 +-
drivers/net/wireless/intel/iwlwifi/fw/rs.c | 5 +-
drivers/net/wireless/intel/iwlwifi/iwl-config.h | 9 +-
drivers/net/wireless/intel/iwlwifi/iwl-csr.h | 3 +-
drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 14 +-
drivers/net/wireless/intel/iwlwifi/iwl-io.c | 25 +-
drivers/net/wireless/intel/iwlwifi/iwl-io.h | 6 +-
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c | 150 ++-
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h | 2 +
drivers/net/wireless/intel/iwlwifi/iwl-nvm-utils.h | 9 +-
drivers/net/wireless/intel/iwlwifi/iwl-prph.h | 7 +-
drivers/net/wireless/intel/iwlwifi/iwl-trans.c | 17 +-
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 123 +-
drivers/net/wireless/intel/iwlwifi/mld/agg.c | 9 +
drivers/net/wireless/intel/iwlwifi/mld/ap.c | 58 +-
drivers/net/wireless/intel/iwlwifi/mld/ap.h | 8 +-
drivers/net/wireless/intel/iwlwifi/mld/d3.c | 168 ++-
drivers/net/wireless/intel/iwlwifi/mld/d3.h | 6 +-
drivers/net/wireless/intel/iwlwifi/mld/debugfs.c | 74 +-
.../net/wireless/intel/iwlwifi/mld/ftm-initiator.c | 30 +-
drivers/net/wireless/intel/iwlwifi/mld/iface.c | 187 ++-
drivers/net/wireless/intel/iwlwifi/mld/iface.h | 62 +-
drivers/net/wireless/intel/iwlwifi/mld/key.c | 166 ++-
drivers/net/wireless/intel/iwlwifi/mld/link.c | 569 ++++++++-
drivers/net/wireless/intel/iwlwifi/mld/link.h | 37 +-
drivers/net/wireless/intel/iwlwifi/mld/mac80211.c | 358 ++++--
drivers/net/wireless/intel/iwlwifi/mld/mcc.c | 13 +-
drivers/net/wireless/intel/iwlwifi/mld/mld.c | 20 +-
drivers/net/wireless/intel/iwlwifi/mld/mld.h | 16 +-
drivers/net/wireless/intel/iwlwifi/mld/mlo.c | 36 +-
drivers/net/wireless/intel/iwlwifi/mld/nan.c | 748 +++++++++++-
drivers/net/wireless/intel/iwlwifi/mld/nan.h | 41 +-
drivers/net/wireless/intel/iwlwifi/mld/notif.c | 35 +-
drivers/net/wireless/intel/iwlwifi/mld/phy.c | 24 +-
drivers/net/wireless/intel/iwlwifi/mld/power.c | 210 +++-
drivers/net/wireless/intel/iwlwifi/mld/ptp.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mld/rx.c | 44 +-
drivers/net/wireless/intel/iwlwifi/mld/rx.h | 7 +-
drivers/net/wireless/intel/iwlwifi/mld/sta.c | 245 +++-
drivers/net/wireless/intel/iwlwifi/mld/sta.h | 32 +-
drivers/net/wireless/intel/iwlwifi/mld/stats.c | 108 +-
.../net/wireless/intel/iwlwifi/mld/tests/Makefile | 1 +
.../intel/iwlwifi/mld/tests/chan_load_thresh.c | 139 +++
.../intel/iwlwifi/mld/tests/link-selection.c | 6 +-
.../net/wireless/intel/iwlwifi/mld/tests/utils.c | 8 +-
drivers/net/wireless/intel/iwlwifi/mld/tlc.c | 410 ++++---
drivers/net/wireless/intel/iwlwifi/mld/tx.c | 51 +-
.../net/wireless/intel/iwlwifi/mvm/ftm-initiator.c | 30 +-
.../net/wireless/intel/iwlwifi/mvm/ftm-responder.c | 32 +-
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 4 +-
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 4 +-
drivers/net/wireless/intel/iwlwifi/mvm/power.c | 14 +-
drivers/net/wireless/intel/iwlwifi/mvm/ptp.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/rx.c | 9 +-
drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 14 +-
.../wireless/intel/iwlwifi/pcie/gen1_2/internal.h | 107 +-
.../intel/iwlwifi/pcie/gen1_2/trans-gen2.c | 9 +-
.../net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c | 93 +-
87 files changed, 5442 insertions(+), 2259 deletions(-)
create mode 100644 drivers/net/wireless/intel/iwlwifi/fw/dbg-old.c
create mode 100644 drivers/net/wireless/intel/iwlwifi/mld/tests/chan_load_thresh.c
^ permalink raw reply
* Re: [PATCH v2 3/6] net: mhi_net: Hold runtime PM during active data path operations
From: Paolo Abeni @ 2026-05-26 11:34 UTC (permalink / raw)
To: Loic Poulain, Krishna Chaitanya Chundru
Cc: Manivannan Sadhasivam, Jeff Hugo, Carl Vanderlip, Oded Gabbay,
Jeff Johnson, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Simon Horman, Sergey Ryazanov, Johannes Berg, mhi,
linux-arm-msm, linux-kernel, dri-devel, linux-wireless, ath11k,
ath12k, netdev, mayank.rana, quic_vbadigan, vivek.pernamitta
In-Reply-To: <CAFEp6-1sdQn11NKom6cfwtJvZX-CnPRpJeVzQ+99Sb4A4L-qaQ@mail.gmail.com>
On 5/22/26 10:09 PM, Loic Poulain wrote:
> On Fri, May 22, 2026 at 12:01 PM Krishna Chaitanya Chundru
> <krishna.chundru@oss.qualcomm.com> wrote:
>>
>> The mhi_net driver does not coordinate with runtime PM, which allows the
>> underlying MHI controller to be runtime-suspended while transmit, receive,
>> or RX buffer refill operations are in progress. This can lead to stalled
>> transfers or failed queueing once runtime PM is enabled in the MHI core.
>>
>> Add runtime PM reference counting to the mhi_net data path to keep the
>> controller active for the duration of TX, RX, and buffer management
>> operations. Enable runtime PM during probe and take/release references
>> explicitly around these critical paths.
>>
>> Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
>> ---
>> drivers/net/mhi_net.c | 39 +++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 39 insertions(+)
>>
>> diff --git a/drivers/net/mhi_net.c b/drivers/net/mhi_net.c
>> index ae169929a9d8..5d7f9ccdb17b 100644
>> --- a/drivers/net/mhi_net.c
>> +++ b/drivers/net/mhi_net.c
>> @@ -9,6 +9,7 @@
>> #include <linux/mod_devicetable.h>
>> #include <linux/module.h>
>> #include <linux/netdevice.h>
>> +#include <linux/pm_runtime.h>
>> #include <linux/skbuff.h>
>> #include <linux/u64_stats_sync.h>
>>
>> @@ -76,11 +77,19 @@ static netdev_tx_t mhi_ndo_xmit(struct sk_buff *skb, struct net_device *ndev)
>> struct mhi_device *mdev = mhi_netdev->mdev;
>> int err;
>>
>> + err = pm_runtime_get(&mdev->dev);
>> + if (err < 0 && err != -EINPROGRESS) {
>> + dev_err(&mdev->dev, "pm_runtime_get failed %d\n", err);
>> + pm_runtime_put_noidle(&mdev->dev);
>> + goto exit_drop;
>> + }
>> +
>
> I am wondering what the value is in pushing this PM responsibility to
> each individual MHI client driver and requiring every MHI operation to
> be bracketed with runtime PM handling.
>
> What does the client driver know here that the MHI core itself cannot
> handle centrally? It feels like ensuring the controller is
> runtime-active during transfer could be handled generically in the
> framework instead of duplicating the same logic in every client.
Indeed if *feel* like the MHI core should be able to put together all
the status needed to correctly track the PM.
Adding PM tracking to the NIC driver network data-path looks quite bad.
/P
^ permalink raw reply
* Re: [PATCH v1 1/6] sdio: Add syntactic sugar to store a pointer in sdio_driver_id
From: Uwe Kleine-König (The Capable Hub) @ 2026-05-26 9:38 UTC (permalink / raw)
To: Luiz Augusto von Dentz
Cc: Ulf Hansson, Christian A. Ehrhardt, linux-mmc, Greg Kroah-Hartman,
Wolfram Sang, linux-kernel, Marcel Holtmann, linux-bluetooth,
Matthias Brugger, AngeloGioacchino Del Regno, linux-mediatek,
Ping-Ke Shih, linux-wireless, Felix Fietkau, Lorenzo Bianconi,
Ryder Lee, Shayne Chen, Sean Wang, Brian Norris,
Francesco Dolcini, Andy Shevchenko
In-Reply-To: <CABBYNZJzbEmYzTk2m+Y8SoHVouTMA6Gje_55iJsQ6cYtDLftbQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1709 bytes --]
On Mon, Apr 20, 2026 at 04:46:56PM -0400, Luiz Augusto von Dentz wrote:
> Hi Uwe,
>
> On Mon, Apr 20, 2026 at 4:31 PM Uwe Kleine-König (The Capable Hub)
> <u.kleine-koenig@baylibre.com> wrote:
> >
> > Hello,
> >
> > On Fri, Apr 17, 2026 at 03:10:47PM +0200, Uwe Kleine-König (The Capable Hub) wrote:
> > > On all current Linux architectures sizeof(long) == sizeof(void *) and
> > > this is used a lot through the kernel. For example it enables the usual
> > > practice to store pointers in sdio_driver_id's .driver_data member.
> > >
> > > This works fine, but involves casting and thus isn't type-safe.
> > > Additionally with the CHERI architecture extension there are machines
> > > with sizeof(void *) > sizeof(long) for with the traditional approach of
> > > storing a pointer in .driver_data doesn't work.
> > >
> > > By replacing the plain unsigned long .driver_data by an anonymous union,
> > > most of the casting can be dropped and it yields a working solution for
> > > CHERI.
> > >
> > > All users of struct sdio_driver_id are initialized in a way that is
> > > compatible with the new definition, so no adaptions are needed there.
> >
> > sashiko.dev found s/sdio_driver_id/sdio_device_id/ twice in the commit
> > log and once in the short log. If you consider applying this patch
> > please adapt the commit message accordingly.
>
> No problem I can fix them up once applying.
Now that Ulf gave his blessing, would you please merge the first patch
and the bluetooth ones (#2 and #3)? I will follow up then once your tree
hits Linus's tree with the remaining patches for wifi.
Please don't forget about s/sdio_driver_id/sdio_device_id/.
Thanks
Uwe
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* [PATCH] wifi: mt76: mt7925: add wcid publish check in mt76_sta_add
From: Jiajia Liu @ 2026-05-26 6:08 UTC (permalink / raw)
To: Felix Fietkau, Lorenzo Bianconi, Ryder Lee, Shayne Chen,
Sean Wang, Matthias Brugger, AngeloGioacchino Del Regno,
Ming Yen Hsieh, Michael Lo, Leon Yen
Cc: linux-wireless, linux-kernel, linux-arm-kernel, linux-mediatek,
Jiajia Liu
Since mt7925_mac_sta_add publishes wcid, add publish check in mt76_sta_add
to avoid reinitializing the wcid->poll_list for mt7925.
Found dev->sta_poll_list corruption when using mt7925 and 7.0-rc4.
According to the corruption information, prev->next was changed to itself.
wlan0: disconnect from AP 90:fb:5d:94:8b:e3 for new auth to 90:fb:5d:94:8b:e2
wlan0: authenticate with 90:fb:5d:94:8b:e2 (local address=84:9e:56:9c:7e:6b)
wlan0: send auth to 90:fb:5d:94:8b:e2 (try 1/3)
slab kmalloc-8k start ffff8c80958a6000 pointer offset 4160 size 8192
list_add corruption. prev->next should be next (ffff8c808a7488f8), but was ffff8c80958a7040. (prev=ffff8c80958a7040).
mt76_wcid_add_poll+0x95/0xd0 [mt76]
mt7925_mac_add_txs.part.0+0xa5/0xe0 [mt7925_common]
mt7925_rx_check+0xa7/0xc0 [mt7925_common]
mt76_dma_rx_poll+0x50d/0x790 [mt76]
mt792x_poll_rx+0x52/0xe0 [mt792x_lib]
Signed-off-by: Jiajia Liu <liujiajia@kylinos.cn>
---
Reproduced and tested using the script below over ssh. Roam between two
bssids with the same SSID on a router.
#!/bin/bash
set -ex
while :; do
num=$(sudo iw wlan0 scan | grep Polaris | wc -l)
if [ $num -eq 2 ]; then
break
fi
done
for i in $(seq 1 500); do
echo "index $i"
wpa_cli -i wlan0 roam 90:fb:5d:94:8b:e3
sleep 5
wpa_cli -i wlan0 roam 90:fb:5d:94:8b:e2
sleep 5
done
---
drivers/net/wireless/mediatek/mt76/mac80211.c | 11 ++++++++---
drivers/net/wireless/mediatek/mt76/mt76.h | 1 +
drivers/net/wireless/mediatek/mt76/mt7925/main.c | 3 +++
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c
index 4ae5e4715a9c..83f4f941b890 100644
--- a/drivers/net/wireless/mediatek/mt76/mac80211.c
+++ b/drivers/net/wireless/mediatek/mt76/mac80211.c
@@ -1595,11 +1595,16 @@ mt76_sta_add(struct mt76_phy *phy, struct ieee80211_vif *vif,
mtxq->wcid = wcid->idx;
}
- ewma_signal_init(&wcid->rssi);
- rcu_assign_pointer(dev->wcid[wcid->idx], wcid);
+ if (!test_bit(MT_WCID_FLAG_DRV_PUBLISH, &wcid->flags)) {
+ ewma_signal_init(&wcid->rssi);
+ rcu_assign_pointer(dev->wcid[wcid->idx], wcid);
+ mt76_wcid_init(wcid, phy->band_idx);
+ } else {
+ wcid->phy_idx = phy->band_idx;
+ }
+
phy->num_sta++;
- mt76_wcid_init(wcid, phy->band_idx);
out:
mutex_unlock(&dev->mutex);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 527bef97e122..8bfce686bff7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -361,6 +361,7 @@ enum mt76_wcid_flags {
MT_WCID_FLAG_PS,
MT_WCID_FLAG_4ADDR,
MT_WCID_FLAG_HDR_TRANS,
+ MT_WCID_FLAG_DRV_PUBLISH,
};
#define MT76_N_WCIDS 1088
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/main.c b/drivers/net/wireless/mediatek/mt76/mt7925/main.c
index 73d3722739d0..35b5c718475c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/main.c
@@ -1102,6 +1102,9 @@ int mt7925_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
&msta->deflink);
}
+ if (!err)
+ set_bit(MT_WCID_FLAG_DRV_PUBLISH, &msta->deflink.wcid.flags);
+
return err;
}
EXPORT_SYMBOL_GPL(mt7925_mac_sta_add);
--
2.53.0
^ permalink raw reply related
* Re: [PATCH 1/1] wifi: mac80211: validate minstrel HT tx status rates
From: Ren Wei @ 2026-05-26 3:39 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
Cc: johannes@sipsolutions.net, nbd@openwrt.org,
linville@tuxdriver.com, yuantan098@gmail.com, zcliangcn@gmail.com,
bird@lzu.edu.cn, xuyuqiabc@gmail.com
In-Reply-To: <710745062b5f4323a233db0cd4288ced@realtek.com>
On 5/26/26 10:43, Ping-Ke Shih wrote:
> Ren Wei <n05ec@lzu.edu.cn> wrote:
>> @@ -1205,8 +1242,9 @@ minstrel_ht_txstat_valid(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
>> if (!rate->count)
>> return false;
>>
>> - if (rate->flags & IEEE80211_TX_RC_MCS ||
>> - rate->flags & IEEE80211_TX_RC_VHT_MCS)
>
> Miss a line?
> - return true;
>
>
>> + if (rate->flags & IEEE80211_TX_RC_MCS ||
>> + rate->flags & IEEE80211_TX_RC_VHT_MCS)
>> + return minstrel_ht_txstat_valid_rate(rate);
>>
>> for (i = 0; i < ARRAY_SIZE(mp->cck_rates); i++)
>> @@ -1235,8 +1273,9 @@ minstrel_ht_ri_txstat_valid(struct minstrel_priv *mp,
>> if (!rate_status->try_count)
>> return false;
>>
>> - if (rate_status->rate_idx.flags & RATE_INFO_FLAGS_MCS ||
>> - rate_status->rate_idx.flags & RATE_INFO_FLAGS_VHT_MCS)
>
> Miss a line?
>
> - return true;
>
>> + if (rate_status->rate_idx.flags & RATE_INFO_FLAGS_MCS ||
>> + rate_status->rate_idx.flags & RATE_INFO_FLAGS_VHT_MCS)
>> + return minstrel_ht_ri_txstat_valid_rate(&rate_status->rate_idx);
>>
>> for (i = 0; i < ARRAY_SIZE(mp->cck_rates); i++) {
>> --
>> 2.54.0
>>
Yes, you're right, and I'm very sorry about this.
After generating the patch, we adjusted this part after finding
an issue, but I made a mistake in that follow-up change and ended
up changing it incorrectly here.
What should have been replaced in both places was the old
return true; line with the helper-based return.
I'll fix it in the next revision. Thank you for catching this,
and sorry for the trouble.
^ permalink raw reply
* RE: [PATCH 1/1] wifi: mac80211: validate minstrel HT tx status rates
From: Ping-Ke Shih @ 2026-05-26 2:43 UTC (permalink / raw)
To: Ren Wei, linux-wireless@vger.kernel.org
Cc: johannes@sipsolutions.net, nbd@openwrt.org,
linville@tuxdriver.com, yuantan098@gmail.com, zcliangcn@gmail.com,
bird@lzu.edu.cn, xuyuqiabc@gmail.com
In-Reply-To: <0e3f97ca5cfbeb67a8e60ca5c266f4335950816b.1779619788.git.xuyq21@lenovo.com>
Ren Wei <n05ec@lzu.edu.cn> wrote:
> @@ -1205,8 +1242,9 @@ minstrel_ht_txstat_valid(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
> if (!rate->count)
> return false;
>
> - if (rate->flags & IEEE80211_TX_RC_MCS ||
> - rate->flags & IEEE80211_TX_RC_VHT_MCS)
Miss a line?
- return true;
> + if (rate->flags & IEEE80211_TX_RC_MCS ||
> + rate->flags & IEEE80211_TX_RC_VHT_MCS)
> + return minstrel_ht_txstat_valid_rate(rate);
>
> for (i = 0; i < ARRAY_SIZE(mp->cck_rates); i++)
> @@ -1235,8 +1273,9 @@ minstrel_ht_ri_txstat_valid(struct minstrel_priv *mp,
> if (!rate_status->try_count)
> return false;
>
> - if (rate_status->rate_idx.flags & RATE_INFO_FLAGS_MCS ||
> - rate_status->rate_idx.flags & RATE_INFO_FLAGS_VHT_MCS)
Miss a line?
- return true;
> + if (rate_status->rate_idx.flags & RATE_INFO_FLAGS_MCS ||
> + rate_status->rate_idx.flags & RATE_INFO_FLAGS_VHT_MCS)
> + return minstrel_ht_ri_txstat_valid_rate(&rate_status->rate_idx);
>
> for (i = 0; i < ARRAY_SIZE(mp->cck_rates); i++) {
> --
> 2.54.0
>
^ permalink raw reply
* Re: ath11k: WCN6855 WoWLAN resume leaves RX in unrecoverable reorder state → TCP collapses
From: Baochen Qiang @ 2026-05-26 1:51 UTC (permalink / raw)
To: Hauke Mehrtens, Jeff Johnson, linux-wireless, ath11k,
Baochen Qiang
In-Reply-To: <0fbb0b6e-c849-4e26-9c46-2ac4986f6b52@hauke-m.de>
On 5/25/2026 9:24 PM, Hauke Mehrtens wrote:
> I used AI to help me debug this problem.
>
> On Lenovo ThinkPad P14s G4 AMD (QCNFA765 / WCN6855 hw2.1), ~1 in 10
> suspend/resume cycles leaves the ath11k RX path delivering MSDUs out of
> order (~16% of TCP segments). TCP cwnd stays at 1-3 MSS and goodput
> collapses to ~3 Mbit/s; UDP on the same link in the same minute pushes
> 100+ Mbit/s.
>
> This machine is in the DMI quirk list at
> `drivers/net/wireless/ath/ath11k/core.c` that forces `ATH11K_PM_WOW`.
> In WOW mode the firmware is kept alive across suspend; the WOW resume
> path does not re-initialise REO HW or per-TID BA state.
> The PM_WOW quirk was added as a workaround for unexpected-wakeup bug
> https://bugzilla.kernel.org/show_bug.cgi?id=219196
>
> ## Affected components
>
> - **Driver:** ath11k_pci
> - **Chip:** WCN6855 hw2.1 (`17cb:1103`, QCNFA765)
> - **Firmware:** `WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.41`
> (fw_version `0x11088c35`, 2024-04-17)
> - **Kernel:** observed on 7.0.9-arch1-1; also present across many
> earlier kernel versions over the past >1 year on this hardware
> - **Machine:** Lenovo ThinkPad P14s G4 AMD, DMI `21K5CTO1WW` (matches
> quirk entry "P14s G4 AMD #1" at `core.c:961-966` via `"21K5"`
> substring)
>
> ## Reproduce
>
> 1. Associate to an HE AP (characterised at 6 GHz, HE-MCS 5/6 NSS 2
> 160 MHz, -56 dBm, using MT7915 with OpenWrt 25.12).
> 2. Suspend, wake, test `iperf3` TCP. Repeat. On average within ~10
> cycles, one resume leaves the link broken.
> 3. In the broken state: `iw dev wlpXsY link` still reports ~1.3 Gbit/s
> "bitrate". Ping and UDP iperf3 look fine. TCP iperf3 collapses to
> ~3 Mbit/s with cwnd stuck at 1-3 MSS.
>
> ## Evidence
>
> ### iperf3, same link same minute
>
> ```
> AP -> STA, UDP -b 200M -l 1400 -t 15:
> sender: 200 Mbit/s, 267876 datagrams
> receiver: 102 Mbit/s, 137290 received, 130585 "lost"
> (not real loss; iperf3 UDP counts out-of-window arrivals as lost)
>
> AP -> STA, TCP -t 15:
> 3.43 Mbit/s, 521 retransmits, cwnd 1.41-5.66 KB throughout
> ```
>
> ### UDP run: no real loss anywhere
>
> - `ip -s link` delta: `+267,953 packets`, `0 errors`, `0 dropped`
> (AP sent 267,876).
> - `/proc/net/snmp` Udp: `RcvbufErrors 0, InErrors 0`.
> - ath11k `pdev_stats` delta: `MSDUs delivered to HTT +267,985`.
> - `soc_dp_stats` entirely zero: no RXDMA / REO / HAL / TCL / backpressure
> errors of any kind.
> - AP `iw station get`: ~1.3% retry rate, -65 dBm ACK signal,
> `expected throughput 1049 Mbps`.
>
> → Air link clean. Host data path clean. Firmware delivered every
> datagram. No drops anywhere.
>
> ### TCP socket reorder (`ss -tin` once per second during TCP iperf3)
>
> ```
> t (s) bytes_rx segs_in rcv_ooopack
> 0 1,291,653 895 158
> 1 1,717,365 1,189 210
> 2 2,060,541 1,426 274
> 3 2,519,557 1,743 335
> 4 3,050,973 2,110 397
> 5 3,446,277 2,383 450
> 6 3,906,741 2,701 513
> ```
>
> ~60 ooo packets/s out of ~370 segs/s = **~16% out-of-order**, sustained.
>
> ### Packet-level pattern (`tcpdump` on wlpXsY)
>
> Seq normalised to 0 at flow start:
>
> ```
> 22 ms 2896:4344
> 25 ms 4344:5792
> 27 ms 1448:2896 <-- late; fills gap from 5 ms earlier
> 28 ms 5792:7240
> 54 ms 8688:10136
> 55 ms 10136:11584
> 57 ms 7240:8688 <-- late
> 107 ms 26064:27512
> 107 ms 28960:30408
> 108 ms 30408:31856
> 109 ms 27512:28960 <-- late
> 156 ms 57920:59368
> 156 ms 59368:60816
> 157 ms 56472:57920 <-- late
> ```
>
> Fingerprint: A-MPDU subframe lost on first transmission, retried, retry
> arrives 2-5 ms later. Working REO HW would buffer the continuation
> until the missing subframe arrived or the per-TID reorder timeout
> (`HAL_DEFAULT_REO_TIMEOUT_USEC`, 40 ms) expired. Here both continuation
> and retry pass through unordered.
>
> ## Diagnosis
>
> - Air link healthy; host data path clean; REO HW error counters all
> zero — REO simply isn't enforcing order for this peer's TIDs.
> - dmesg across 3 days of suspend cycles shows zero ath11k re-init
> activity (no `fw_version` reprint, no `wcn6855 hw2.1` reprint). The
> firmware instance is the same one from the most recent `modprobe`.
> `ath11k_core_suspend_wow` / `ath11k_core_resume_wow` neither power
> down the device nor re-initialise REO.
> - `rmmod` triggers full `ath11k_hif_power_down` + chip re-init on next
> `modprobe`, which re-runs `ath11k_hw_wcn6855_reo_setup`. This is the
> only reliable recovery, so the corrupted state lives in firmware /
> REO HW that the WOW resume path never touches.
>
> The non-WOW path (`ath11k_core_suspend_default`) does power-down + full
> re-init on resume, re-running `ath11k_dp_srng_common_setup()` →
> `hw_ops->reo_setup()`. The WOW path does not.
>
> ## Related
>
> - Bug #219196 — unexpected wakeups; the WOW workaround was added to
> mitigate this
> - `ce8669a27016` — introduced the WOW quirk table (2025-03-28, Baochen Qiang)
> - `0eb002c93c3b` — added `21K5` / `21K6` (this laptop) to the quirk
> table (2025-09-29, Mark Pearson)
> - `4015b1972763` — adds Z13/Z16 Gen1 to WOW quirk (Nov 2025)
>
> Hauke
>
can you please try below fix ?
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2a2451a34afdf563b3102d36a4b6cf335cf813e2
^ permalink raw reply
* RE: [PATCH v2 rtw-next 1/2] wifi: rtw89: add dev_id_quirks to driver_info for per-device quirk control
From: Ping-Ke Shih @ 2026-05-26 1:09 UTC (permalink / raw)
To: Greg KH
Cc: linux-wireless@vger.kernel.org, driver-core@lists.linux.dev,
johannes@sipsolutions.net, Johnson Tsai, Mh_chen,
charlesl@valvesoftware.com, sabae@valvesoftware.com
In-Reply-To: <2026052558-handclasp-garden-b472@gregkh>
Greg KH <gregkh@linuxfoundation.org> wrote:
> On Mon, May 25, 2026 at 04:51:47PM +0800, Ping-Ke Shih wrote:
> > --- a/drivers/net/wireless/realtek/rtw89/rtw8851be.c
> > +++ b/drivers/net/wireless/realtek/rtw89/rtw8851be.c
> > @@ -73,6 +73,7 @@ static const struct rtw89_driver_info rtw89_8851be_info = {
> > .chip = &rtw8851b_chip_info,
> > .variant = NULL,
> > .quirks = NULL,
> > + .dev_id_quirks = 0,
>
> Why are you manually adding a "= 0" for these when that's the default?
> No need to do so, only do it when it is set to something, right?
I'd ask authors spending a little time to fill these default values
because Realtek WiFi chips have many specific attributes for many
chips, and somehow it gets messed. For example,
- miss to fill value for a certain chip
(people might only force on one chip he wants to fix)
- for some cases, it should set 0 explicitly as the value
(such as a threshold value of hardware register)
- messed up the order of attributes
People add a field along the existing field across all chips.
If a field is omitted, somehow people might add the field at wrong place.
- simply coding rule
People might forget why, so I'd have a simple rule for them.
I encountered these cases when I processed earlier Realtek WiFi drivers
(rtlwifi, rtl8xxxu, rtw88), so I'd explicitly fill values to avoid them.
Thanks
Ping-Ke
^ permalink raw reply
* Re: [PATCH v7 00/15] firmware: qcom: Add OP-TEE PAS service support
From: bod @ 2026-05-26 0:06 UTC (permalink / raw)
To: Sumit Garg
Cc: andersson, linux-arm-msm, devicetree, dri-devel, freedreno,
linux-media, netdev, linux-wireless, ath12k, linux-remoteproc,
konradybcio, robh, krzk+dt, conor+dt, robin.clark, sean, akhilpo,
lumag, abhinav.kumar, jesszhan0024, marijn.suijten, airlied,
simona, vikash.garodia, dikshita.agarwal, bod, mchehab, elder,
andrew+netdev, davem, edumazet, kuba, pabeni, jjohnson,
mathieu.poirier, trilokkumar.soni, mukesh.ojha, pavan.kondeti,
jorge.ramirez, tonyh, vignesh.viswanathan, srinivas.kandagatla,
amirreza.zarrabi, jens.wiklander, op-tee, apurupa, skare,
linux-kernel, Sumit Garg
In-Reply-To: <20260522115936.201208-1-sumit.garg@kernel.org>
On 2026-05-22 17:29 +0530, Sumit Garg wrote:
> From: Sumit Garg <sumit.garg@oss.qualcomm.com>
>
> Qcom platforms has the legacy of using non-standard SCM calls
> splintered over the various kernel drivers. These SCM calls aren't
> compliant with the standard SMC calling conventions which is a
> prerequisite to enable migration to the FF-A specifications from Arm.
>
> OP-TEE as an alternative trusted OS to Qualcomm TEE (QTEE) can't
> support these non-standard SCM calls. And even for newer architectures
> using S-EL2 with Hafnium support, QTEE won't be able to support SCM
> calls either with FF-A requirements coming in. And with both OP-TEE
> and QTEE drivers well integrated in the TEE subsystem, it makes further
> sense to reuse the TEE bus client drivers infrastructure.
>
> The added benefit of TEE bus infrastructure is that there is support
> for discoverable/enumerable services. With that client drivers don't
> have to manually invoke a special SCM call to know the service status.
>
> So enable the generic Peripheral Authentication Service (PAS) provided
> by the firmware. It acts as the common layer with different TZ
> backends plugged in whether it's an SCM implementation or a proper
> TEE bus based PAS service implementation.
>
> The TEE PAS service ABI is designed to be extensible with additional API
> as PTA_QCOM_PAS_CAPABILITIES. This allows to accommodate any future
> extensions of the PAS service needed while still maintaining backwards
> compatibility.
>
> Currently OP-TEE support is being added to provide the backend PAS
> service implementation which can be found as part of this PR [1].
> This implementation has been tested on Kodiak/RB3Gen2 board with lemans
> EVK board being the next target. In addition to that WIN/IPQ targets
> planning to use OP-TEE will use this service too. Surely the backwards
> compatibility is maintained and tested for SCM backend.
>
> Note that kernel PAS service support while running in EL2 is at parity
> among OP-TEE vs QTEE. Especially the media (venus/iris) support depends
> on proper IOMMU support being worked out on the PAS client end.
>
> Patch summary:
> - Patch #1: adds Kodiak EL2 overlay since boot stack with TF-A/OP-TEE
> only allow UEFI and Linux to boot in EL2.
> - Patch #2: adds generic PAS service.
> - Patch #3: migrates SCM backend to generic PAS service.
> - Patch #4: adds TEE/OP-TEE backend for generic PAS service.
> - Patch #5-#13: migrates all client drivers to generic PAS service.
> - Patch #14: drops legacy PAS SCM exported APIs.
>
> The patch-set is based on qcom tree tip [2] and can be found in git tree
> here [3].
>
> Merge strategy:
>
> It is expected due to APIs dependency, the entire patch-set to go via
> the Qcom tree. All other subsystem maintainers, it will be great if I
> can get acks for the corresponding subsystem patches.
>
> [1] https://github.com/OP-TEE/optee_os/pull/7721 (already merged)
> [2] https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/log/?h=for-next
> [3] https://git.kernel.org/pub/scm/linux/kernel/git/sumit.garg/linux.git/log/?h=qcom-pas-v7
>
> ---
> Changes in v7:
> - Rebased to qcom tree (for-next branch) tip.
> - Merged patch #5 and #7 due to build dependency.
> - Disabled modem for kodiak EL2 as it isn't tested yet.
> - Fix an issue found out by sashiko-bot for patch #4.
This whole series needs to be broken up into different parts and sent in
smaller chunks landing the core changes into the firmware, the drivers and
finally the dts.
For example applying the Iris stuff is impossible until the remoteproc
stuff lands.
Instead of sending one giant series which no one maintainer can apply send
a number of series where one posts a dependency on the other.
Lumping the TEE stuff in with video encoder, wifi, dts is spanning too many
things and makes merging a NAK.
Break this up into logical chunks and sequence a one series on top of the
other - accpeting that you might, likely will have to keep on top of the
various series and resend/rebase as things get merged.
> Changes in v6:
> - Rebased to v7.1-rc4 tag.
> - Patch #14: fixed ret error print.
> - Add Kconfig descriptions for PAS symbols such that they are visible
> in menuconfig to update.
>
> Changes in v5:
> - Incorporated misc. comments from Mukesh.
> - Split up patch #11 into 2 to add an independent commit for passing
> proper PAS ID to set_remote_state API.
> - Picked up tags.
>
> Changes in v4:
> - Incorporate misc. comments on patch #4.
> - Picked up an ack for patch #10.
> - Clarify in cover letter about state of media support.
>
> Changes in v3:
> - Incorporated some style and misc. comments for patch #2, #3 and #4.
> - Add QCOM_PAS Kconfig dependency for various subsystems.
> - Switch from pseudo TA to proper TA invoke commands.
>
> Changes in v2:
> - Fixed kernel doc warnings.
> - Polish commit message and comments for patch #2.
> - Pass proper PAS ID in set_remote_state API for media firmware drivers.
> - Added Maintainer entry and dropped MODULE_AUTHOR.
>
> Mukesh Ojha (1):
> arm64: dts: qcom: kodiak: Add EL2 overlay
>
> Sumit Garg (14):
> firmware: qcom: Add a generic PAS service
> firmware: qcom_scm: Migrate to generic PAS service
> firmware: qcom: Add a PAS TEE service
> remoteproc: qcom_q6v5_pas: Switch over to generic PAS TZ APIs
> remoteproc: qcom_q6v5_mss: Switch to generic PAS TZ APIs
> remoteproc: qcom_wcnss: Switch to generic PAS TZ APIs
> remoteproc: qcom: Select QCOM_PAS generic service
> drm/msm: Switch to generic PAS TZ APIs
> media: qcom: Switch to generic PAS TZ APIs
> media: qcom: Pass proper PAS ID to set_remote_state API
> net: ipa: Switch to generic PAS TZ APIs
> wifi: ath12k: Switch to generic PAS TZ APIs
> firmware: qcom_scm: Remove SCM PAS wrappers
> MAINTAINERS: Add maintainer entry for Qualcomm PAS TZ service
>
> MAINTAINERS | 9 +
> arch/arm64/boot/dts/qcom/Makefile | 2 +
> arch/arm64/boot/dts/qcom/kodiak-el2.dtso | 39 ++
> drivers/firmware/qcom/Kconfig | 21 +-
> drivers/firmware/qcom/Makefile | 2 +
> drivers/firmware/qcom/qcom_pas.c | 291 +++++++++++
> drivers/firmware/qcom/qcom_pas.h | 50 ++
> drivers/firmware/qcom/qcom_pas_tee.c | 477 ++++++++++++++++++
> drivers/firmware/qcom/qcom_scm.c | 302 ++++-------
> drivers/gpu/drm/msm/Kconfig | 1 +
> drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 4 +-
> drivers/gpu/drm/msm/adreno/adreno_gpu.c | 11 +-
> drivers/media/platform/qcom/iris/Kconfig | 25 +-
> .../media/platform/qcom/iris/iris_firmware.c | 9 +-
> drivers/media/platform/qcom/venus/Kconfig | 1 +
> drivers/media/platform/qcom/venus/firmware.c | 11 +-
> drivers/net/ipa/Kconfig | 2 +-
> drivers/net/ipa/ipa_main.c | 13 +-
> drivers/net/wireless/ath/ath12k/Kconfig | 2 +-
> drivers/net/wireless/ath/ath12k/ahb.c | 10 +-
> drivers/remoteproc/Kconfig | 4 +-
> drivers/remoteproc/qcom_q6v5_mss.c | 5 +-
> drivers/remoteproc/qcom_q6v5_pas.c | 51 +-
> drivers/remoteproc/qcom_wcnss.c | 12 +-
> drivers/soc/qcom/mdt_loader.c | 12 +-
> include/linux/firmware/qcom/qcom_pas.h | 43 ++
> include/linux/firmware/qcom/qcom_scm.h | 29 --
> include/linux/soc/qcom/mdt_loader.h | 6 +-
> 28 files changed, 1124 insertions(+), 320 deletions(-)
> create mode 100644 arch/arm64/boot/dts/qcom/kodiak-el2.dtso
> create mode 100644 drivers/firmware/qcom/qcom_pas.c
> create mode 100644 drivers/firmware/qcom/qcom_pas.h
> create mode 100644 drivers/firmware/qcom/qcom_pas_tee.c
> create mode 100644 include/linux/firmware/qcom/qcom_pas.h
>
> --
> 2.51.0
>
>
^ permalink raw reply
* [PATCH v2] wifi: mt76: track rx napi ownership for cleanup
From: Ruslan Isaev @ 2026-05-25 23:39 UTC (permalink / raw)
To: linux-wireless
Cc: sean.wang, nbd, lorenzo, ryder.lee, linux-mediatek, linux-kernel
mt76_dma_cleanup() deletes rx napi instances for every allocated rx
queue. This is not symmetric with mt76_dma_init(), which skips WED_RRO
queues when adding rx napi.
Adding an unconditional napi_disable() in the cleanup path fixes the
mt7915 remove warning, but it is not safe for all other mt76 paths. mt7921 and
mt7925 can already disable rx napi in their unregister
paths before calling mt76_dma_cleanup(). On mt7996/mt7992 WED_RRO
queues may have ndesc set even though mt76 never added or enabled napi for them.
Track rx napi ownership and enabled state in struct mt76_queue so
cleanup only disables and deletes napi instances that were actually
added by mt76.
This keeps the existing reset/suspend/remove ordering intact while
avoiding double napi_disable() and avoiding napi cleanup on WED_RRO
queues without napi.
Signed-off-by: Ruslan Isaev <legale.legale@gmail.com>
---
v2:
- track mt76 rx napi state added/enabled
- avoid double napi_disable() on mt7921/mt7925 cleanup paths
- avoid napi cleanup on WED_RRO queues without napi
drivers/net/wireless/mediatek/mt76/dma.c | 9 +++--
drivers/net/wireless/mediatek/mt76/mt76.h | 40 +++++++++++++++++++
.../net/wireless/mediatek/mt76/mt7603/mac.c | 8 ++--
.../net/wireless/mediatek/mt76/mt7615/pci.c | 6 +--
.../wireless/mediatek/mt76/mt7615/pci_mac.c | 4 +-
.../net/wireless/mediatek/mt76/mt76x0/pci.c | 4 +-
.../net/wireless/mediatek/mt76/mt76x02_mmio.c | 4 +-
.../net/wireless/mediatek/mt76/mt76x2/pci.c | 6 +--
.../net/wireless/mediatek/mt76/mt7915/mac.c | 8 ++--
.../net/wireless/mediatek/mt76/mt7921/pci.c | 8 ++--
.../wireless/mediatek/mt76/mt7921/pci_mac.c | 4 +-
.../net/wireless/mediatek/mt76/mt7925/pci.c | 8 ++--
.../wireless/mediatek/mt76/mt7925/pci_mac.c | 8 ++--
.../net/wireless/mediatek/mt76/mt7996/mac.c | 8 ++--
drivers/net/wireless/mediatek/mt76/npu.c | 3 +-
15 files changed, 86 insertions(+), 42 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c
index f8c2fe5f2f58..5c531131a25f 100644
--- a/drivers/net/wireless/mediatek/mt76/dma.c
+++ b/drivers/net/wireless/mediatek/mt76/dma.c
@@ -1099,9 +1099,12 @@ static void
mt76_dma_rx_queue_init(struct mt76_dev *dev, enum mt76_rxq_id qid,
int (*poll)(struct napi_struct *napi, int budget))
{
+ struct mt76_queue *q = &dev->q_rx[qid];
+
netif_napi_add(dev->napi_dev, &dev->napi[qid], poll);
- mt76_dma_rx_fill_buf(dev, &dev->q_rx[qid], false);
- napi_enable(&dev->napi[qid]);
+ q->napi_state = MT76_NAPI_ADDED;
+ mt76_dma_rx_fill_buf(dev, q, false);
+ mt76_rx_napi_enable(dev, qid);
}
static int
@@ -1189,7 +1192,7 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
mt76_for_each_q_rx(dev, i) {
struct mt76_queue *q = &dev->q_rx[i];
- netif_napi_del(&dev->napi[i]);
+ mt76_rx_napi_del(dev, i);
mt76_dma_rx_cleanup(dev, q);
page_pool_destroy(q->page_pool);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 527bef97e122..3ce936bdcf88 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -251,6 +251,7 @@ struct mt76_queue {
int buf_size;
bool stopped;
bool blocked;
+ u8 napi_state;
u8 buf_offset;
u16 flags;
@@ -1283,6 +1284,45 @@ static inline int mt76_wed_dma_setup(struct mt76_dev *dev, struct mt76_queue *q,
for (i = 0; i < ARRAY_SIZE((dev)->q_rx); i++) \
if ((dev)->q_rx[i].ndesc)
+#define MT76_NAPI_ADDED BIT(0)
+#define MT76_NAPI_ENABLED BIT(1)
+
+static inline void mt76_rx_napi_enable(struct mt76_dev *dev, int qid)
+{
+ struct mt76_queue *q = &dev->q_rx[qid];
+
+ if (!(q->napi_state & MT76_NAPI_ADDED) ||
+ (q->napi_state & MT76_NAPI_ENABLED))
+ return;
+
+ napi_enable(&dev->napi[qid]);
+ q->napi_state |= MT76_NAPI_ENABLED;
+}
+
+static inline void mt76_rx_napi_disable(struct mt76_dev *dev, int qid)
+{
+ struct mt76_queue *q = &dev->q_rx[qid];
+
+ if (!(q->napi_state & MT76_NAPI_ADDED) ||
+ !(q->napi_state & MT76_NAPI_ENABLED))
+ return;
+
+ napi_disable(&dev->napi[qid]);
+ q->napi_state &= ~MT76_NAPI_ENABLED;
+}
+
+static inline void mt76_rx_napi_del(struct mt76_dev *dev, int qid)
+{
+ struct mt76_queue *q = &dev->q_rx[qid];
+
+ if (!(q->napi_state & MT76_NAPI_ADDED))
+ return;
+
+ mt76_rx_napi_disable(dev, qid);
+ netif_napi_del(&dev->napi[qid]);
+ q->napi_state = 0;
+}
+
#define mt76_dereference(p, dev) \
rcu_dereference_protected(p, lockdep_is_held(&(dev)->mutex))
diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/mac.c b/drivers/net/wireless/mediatek/mt76/mt7603/mac.c
index d3110eeb45d7..be35ec0d31d4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7603/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7603/mac.c
@@ -1423,8 +1423,8 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)
mt76_worker_disable(&dev->mt76.tx_worker);
tasklet_disable(&dev->mt76.pre_tbtt_tasklet);
- napi_disable(&dev->mt76.napi[0]);
- napi_disable(&dev->mt76.napi[1]);
+ mt76_rx_napi_disable(&dev->mt76, 0);
+ mt76_rx_napi_disable(&dev->mt76, 1);
napi_disable(&dev->mt76.tx_napi);
mutex_lock(&dev->mt76.mutex);
@@ -1474,8 +1474,8 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)
mt7603_beacon_set_timer(dev, -1, beacon_int);
napi_enable(&dev->mt76.tx_napi);
- napi_enable(&dev->mt76.napi[0]);
- napi_enable(&dev->mt76.napi[1]);
+ mt76_rx_napi_enable(&dev->mt76, 0);
+ mt76_rx_napi_enable(&dev->mt76, 1);
local_bh_disable();
napi_schedule(&dev->mt76.tx_napi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/pci.c b/drivers/net/wireless/mediatek/mt76/mt7615/pci.c
index f5018bfa317a..600b4f2bf1a1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/pci.c
@@ -92,7 +92,7 @@ static int mt7615_pci_suspend(struct pci_dev *pdev, pm_message_t state)
mt76_worker_disable(&mdev->tx_worker);
mt76_for_each_q_rx(mdev, i) {
- napi_disable(&mdev->napi[i]);
+ mt76_rx_napi_disable(mdev, i);
}
tasklet_kill(&mdev->irq_tasklet);
@@ -127,7 +127,7 @@ static int mt7615_pci_suspend(struct pci_dev *pdev, pm_message_t state)
restore:
mt76_for_each_q_rx(mdev, i) {
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
}
napi_enable(&mdev->tx_napi);
if (hif_suspend)
@@ -166,7 +166,7 @@ static int mt7615_pci_resume(struct pci_dev *pdev)
mt76_worker_enable(&mdev->tx_worker);
mt76_for_each_q_rx(mdev, i) {
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
}
napi_enable(&mdev->tx_napi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
index 53cb1eed1e4f..a83589c628f9 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
@@ -236,7 +236,7 @@ void mt7615_mac_reset_work(struct work_struct *work)
mt76_worker_disable(&dev->mt76.tx_worker);
mt76_for_each_q_rx(&dev->mt76, i)
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
napi_disable(&dev->mt76.tx_napi);
mt7615_mutex_acquire(dev);
@@ -264,7 +264,7 @@ void mt7615_mac_reset_work(struct work_struct *work)
napi_enable(&dev->mt76.tx_napi);
mt76_for_each_q_rx(&dev->mt76, i) {
- napi_enable(&dev->mt76.napi[i]);
+ mt76_rx_napi_enable(&dev->mt76, i);
}
local_bh_disable();
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
index f8d206a07f99..96380d016351 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
@@ -257,7 +257,7 @@ static int mt76x0e_suspend(struct pci_dev *pdev, pm_message_t state)
napi_disable(&mdev->tx_napi);
mt76_for_each_q_rx(mdev, i)
- napi_disable(&mdev->napi[i]);
+ mt76_rx_napi_disable(mdev, i);
mt76x02_dma_disable(dev);
mt76x02_mcu_cleanup(dev);
@@ -285,7 +285,7 @@ static int mt76x0e_resume(struct pci_dev *pdev)
mt76_for_each_q_rx(mdev, i) {
mt76_queue_rx_reset(dev, i);
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
}
napi_enable(&mdev->tx_napi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
index dc7c03d23123..0da4bbad5ba3 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
@@ -444,7 +444,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
napi_disable(&dev->mt76.tx_napi);
mt76_for_each_q_rx(&dev->mt76, i) {
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
}
mutex_lock(&dev->mt76.mutex);
@@ -505,7 +505,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
napi_enable(&dev->mt76.tx_napi);
mt76_for_each_q_rx(&dev->mt76, i) {
- napi_enable(&dev->mt76.napi[i]);
+ mt76_rx_napi_enable(&dev->mt76, i);
}
local_bh_disable();
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
index 491a32921a06..a23c2560e90f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
@@ -119,7 +119,7 @@ mt76x2e_suspend(struct pci_dev *pdev, pm_message_t state)
mt76_worker_disable(&mdev->tx_worker);
mt76_for_each_q_rx(mdev, i)
- napi_disable(&mdev->napi[i]);
+ mt76_rx_napi_disable(mdev, i);
pci_enable_wake(pdev, pci_choose_state(pdev, state), true);
pci_save_state(pdev);
@@ -131,7 +131,7 @@ mt76x2e_suspend(struct pci_dev *pdev, pm_message_t state)
restore:
mt76_for_each_q_rx(mdev, i)
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
napi_enable(&mdev->tx_napi);
return err;
@@ -153,7 +153,7 @@ mt76x2e_resume(struct pci_dev *pdev)
mt76_worker_enable(&mdev->tx_worker);
mt76_for_each_q_rx(mdev, i) {
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
}
napi_enable(&mdev->tx_napi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index cec2c4208255..354ed0b69013 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -1327,7 +1327,7 @@ mt7915_mac_restart(struct mt7915_dev *dev)
mt76_worker_disable(&dev->mt76.tx_worker);
mt76_for_each_q_rx(mdev, i) {
if (mdev->q_rx[i].ndesc)
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
}
napi_disable(&dev->mt76.tx_napi);
@@ -1339,7 +1339,7 @@ mt7915_mac_restart(struct mt7915_dev *dev)
mt76_for_each_q_rx(mdev, i) {
if (mdev->q_rx[i].ndesc) {
- napi_enable(&dev->mt76.napi[i]);
+ mt76_rx_napi_enable(&dev->mt76, i);
}
}
@@ -1527,7 +1527,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
mt76_worker_disable(&dev->mt76.tx_worker);
mt76_for_each_q_rx(&dev->mt76, i)
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
napi_disable(&dev->mt76.tx_napi);
@@ -1558,7 +1558,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
clear_bit(MT76_RESET, &phy2->mt76->state);
mt76_for_each_q_rx(&dev->mt76, i) {
- napi_enable(&dev->mt76.napi[i]);
+ mt76_rx_napi_enable(&dev->mt76, i);
}
local_bh_disable();
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
index 7a790ddf43bb..c3188b344e50 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
@@ -52,7 +52,7 @@ static void mt7921e_unregister_device(struct mt792x_dev *dev)
cancel_work_sync(&dev->init_work);
mt76_unregister_device(&dev->mt76);
mt76_for_each_q_rx(&dev->mt76, i)
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
cancel_delayed_work_sync(&pm->ps_work);
cancel_work_sync(&pm->wake_work);
cancel_work_sync(&dev->reset_work);
@@ -492,7 +492,7 @@ static int mt7921_pci_suspend(struct device *device)
mt76_worker_disable(&mdev->tx_worker);
mt76_for_each_q_rx(mdev, i) {
- napi_disable(&mdev->napi[i]);
+ mt76_rx_napi_disable(mdev, i);
}
/* wait until dma is idle */
@@ -518,7 +518,7 @@ static int mt7921_pci_suspend(struct device *device)
restore_napi:
mt76_for_each_q_rx(mdev, i) {
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
}
napi_enable(&mdev->tx_napi);
@@ -564,7 +564,7 @@ static int mt7921_pci_resume(struct device *device)
mt76_worker_enable(&mdev->tx_worker);
mt76_for_each_q_rx(mdev, i) {
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
}
napi_enable(&mdev->tx_napi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
index 0db7acb3a637..5d7871b8f77c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
@@ -72,7 +72,7 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
mt76_worker_disable(&dev->mt76.tx_worker);
mt76_for_each_q_rx(&dev->mt76, i) {
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
}
napi_disable(&dev->mt76.tx_napi);
@@ -82,7 +82,7 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
mt792x_wpdma_reset(dev, true);
mt76_for_each_q_rx(&dev->mt76, i) {
- napi_enable(&dev->mt76.napi[i]);
+ mt76_rx_napi_enable(&dev->mt76, i);
}
local_bh_disable();
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c
index c4161754c01d..1da650ac7f4d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c
@@ -40,7 +40,7 @@ static void mt7925e_unregister_device(struct mt792x_dev *dev)
cancel_work_sync(&dev->init_work);
mt76_unregister_device(&dev->mt76);
mt76_for_each_q_rx(&dev->mt76, i)
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
cancel_delayed_work_sync(&pm->ps_work);
cancel_work_sync(&pm->wake_work);
cancel_work_sync(&dev->reset_work);
@@ -481,7 +481,7 @@ static int mt7925_pci_suspend(struct device *device)
mt76_worker_disable(&mdev->tx_worker);
mt76_for_each_q_rx(mdev, i) {
- napi_disable(&mdev->napi[i]);
+ mt76_rx_napi_disable(mdev, i);
}
/* wait until dma is idle */
@@ -509,7 +509,7 @@ static int mt7925_pci_suspend(struct device *device)
restore_napi:
mt76_for_each_q_rx(mdev, i) {
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
}
napi_enable(&mdev->tx_napi);
@@ -559,7 +559,7 @@ static int _mt7925_pci_resume(struct device *device, bool restore)
mt76_worker_enable(&mdev->tx_worker);
mt76_for_each_q_rx(mdev, i) {
- napi_enable(&mdev->napi[i]);
+ mt76_rx_napi_enable(mdev, i);
}
napi_enable(&mdev->tx_napi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c
index 3072850c2752..6bb47db8d16a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci_mac.c
@@ -88,11 +88,11 @@ int mt7925e_mac_reset(struct mt792x_dev *dev)
mt76_worker_disable(&dev->mt76.tx_worker);
if (irq_map->rx.data_complete_mask)
- napi_disable(&dev->mt76.napi[MT_RXQ_MAIN]);
+ mt76_rx_napi_disable(&dev->mt76, MT_RXQ_MAIN);
if (irq_map->rx.wm_complete_mask)
- napi_disable(&dev->mt76.napi[MT_RXQ_MCU]);
+ mt76_rx_napi_disable(&dev->mt76, MT_RXQ_MCU);
if (irq_map->rx.wm2_complete_mask)
- napi_disable(&dev->mt76.napi[MT_RXQ_MCU_WA]);
+ mt76_rx_napi_disable(&dev->mt76, MT_RXQ_MCU_WA);
if (irq_map->tx.all_complete_mask)
napi_disable(&dev->mt76.tx_napi);
@@ -102,7 +102,7 @@ int mt7925e_mac_reset(struct mt792x_dev *dev)
mt792x_wpdma_reset(dev, true);
mt76_for_each_q_rx(&dev->mt76, i) {
- napi_enable(&dev->mt76.napi[i]);
+ mt76_rx_napi_enable(&dev->mt76, i);
}
napi_enable(&dev->mt76.tx_napi);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
index e2a83da3a09c..a75238ce8807 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
@@ -2262,7 +2262,7 @@ mt7996_mac_restart(struct mt7996_dev *dev)
continue;
if (mdev->q_rx[i].ndesc)
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
}
napi_disable(&dev->mt76.tx_napi);
@@ -2278,7 +2278,7 @@ mt7996_mac_restart(struct mt7996_dev *dev)
continue;
if (mdev->q_rx[i].ndesc) {
- napi_enable(&dev->mt76.napi[i]);
+ mt76_rx_napi_enable(&dev->mt76, i);
local_bh_disable();
napi_schedule(&dev->mt76.napi[i]);
local_bh_enable();
@@ -2534,7 +2534,7 @@ void mt7996_mac_reset_work(struct work_struct *work)
if (mt76_queue_is_npu_txfree(&dev->mt76.q_rx[i]))
continue;
- napi_disable(&dev->mt76.napi[i]);
+ mt76_rx_napi_disable(&dev->mt76, i);
}
napi_disable(&dev->mt76.tx_napi);
@@ -2596,7 +2596,7 @@ void mt7996_mac_reset_work(struct work_struct *work)
if (mt76_queue_is_npu_txfree(&dev->mt76.q_rx[i]))
continue;
- napi_enable(&dev->mt76.napi[i]);
+ mt76_rx_napi_enable(&dev->mt76, i);
local_bh_disable();
napi_schedule(&dev->mt76.napi[i]);
local_bh_enable();
diff --git a/drivers/net/wireless/mediatek/mt76/npu.c b/drivers/net/wireless/mediatek/mt76/npu.c
index c4c7c0af6321..fb4ba5bdbf48 100644
--- a/drivers/net/wireless/mediatek/mt76/npu.c
+++ b/drivers/net/wireless/mediatek/mt76/npu.c
@@ -291,8 +291,9 @@ int mt76_npu_rx_queue_init(struct mt76_dev *dev, struct mt76_queue *q)
goto out;
netif_napi_add(dev->napi_dev, &dev->napi[qid], mt76_npu_rx_poll);
+ q->napi_state = MT76_NAPI_ADDED;
mt76_npu_fill_rx_queue(dev, q);
- napi_enable(&dev->napi[qid]);
+ mt76_rx_napi_enable(dev, qid);
out:
mutex_unlock(&dev->mutex);
--
2.39.5
^ permalink raw reply related
* Re: [PATCH v2 rtw-next 2/2] wifi: rtw89: usb: add serial_number and uuid sysfs attributes for 0x28de:0x2432
From: Greg KH @ 2026-05-25 19:32 UTC (permalink / raw)
To: Ping-Ke Shih
Cc: linux-wireless, driver-core, johannes, wenjie.tsai, mh_chen,
charlesl, sabae
In-Reply-To: <20260525085148.35180-3-pkshih@realtek.com>
On Mon, May 25, 2026 at 04:51:48PM +0800, Ping-Ke Shih wrote:
> From: Johnson Tsai <wenjie.tsai@realtek.com>
>
> Expose the device's Serial Number (SN) and UUID from EFUSE via two
> read-only sysfs attributes, `serial_number` and `uuid`, on the ieee80211
> phy device under the `rtw89_usb` attribute group.
>
> This hardware identification information is essential for user-space
> applications to uniquely identify, track, and manage specific Wi-Fi
> adapters. For example, in automated factory provisioning or device
> management systems, user-space tools rely on the EFUSE serial number and
> UUID to bind configurations to specific physical adapters. Currently,
> standard wireless APIs do not expose this low-level hardware
> information, making these sysfs nodes the only viable solution for
> user space to extract this data.
>
> The attributes are gated behind a new RTW89_QUIRK_HW_INFO_SYSFS quirk,
> enabled only for the VID 0x28de / PID 0x2432 device via the
> dev_id_quirks field in rtw89_driver_info.
>
> Example usage from user-space:
> $ cat /sys/class/ieee80211/phy0/rtw89_usb/serial_number
> 3642000123
> $ cat /sys/class/ieee80211/phy0/rtw89_usb/uuid
> aaec2b7c-0a55-4727-8de0-b30febccbbaa
>
> Cc: Elliot Saba <sabae@valvesoftware.com>
> Cc: Charles Lohr <charlesl@valvesoftware.com>
> Signed-off-by: Johnson Tsai <wenjie.tsai@realtek.com>
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> ---
> .../ABI/testing/sysfs-class-ieee80211-rtw89 | 24 ++++++++
> drivers/net/wireless/realtek/rtw89/core.h | 6 ++
> drivers/net/wireless/realtek/rtw89/rtw8852c.c | 10 ++++
> drivers/net/wireless/realtek/rtw89/rtw8852c.h | 6 +-
> .../net/wireless/realtek/rtw89/rtw8852cu.c | 12 +++-
> drivers/net/wireless/realtek/rtw89/usb.c | 57 +++++++++++++++++++
> 6 files changed, 113 insertions(+), 2 deletions(-)
> create mode 100644 Documentation/ABI/testing/sysfs-class-ieee80211-rtw89
>
> diff --git a/Documentation/ABI/testing/sysfs-class-ieee80211-rtw89 b/Documentation/ABI/testing/sysfs-class-ieee80211-rtw89
> new file mode 100644
> index 000000000000..7dfdce08a42f
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-class-ieee80211-rtw89
> @@ -0,0 +1,24 @@
> +What: /sys/class/ieee80211/phyX/rtw89_usb/serial_number
> +Date: May 2026
> +Contact: Johnson Tsai <wenjie.tsai@realtek.com>, linux-wireless@vger.kernel.org
> +Description: (Read) Serial number burned into EFUSE of the RTL8852CU-based
> + USB Wi-Fi adapter. Only present on devices that set the
> + RTW89_QUIRK_HW_INFO_SYSFS quirk (currently VID 0x28de /
> + PID 0x2432).
> +
> + Format: %10phN (5 raw bytes printed as 10 lowercase hex
> + digits, no separators).
> +
> + Example: 3642000123
> +
> +What: /sys/class/ieee80211/phyX/rtw89_usb/uuid
> +Date: May 2026
> +Contact: Johnson Tsai <wenjie.tsai@realtek.com>, linux-wireless@vger.kernel.org
> +Description: (Read) UUID burned into EFUSE of the RTL8852CU-based USB Wi-Fi
> + adapter. Only present on devices that set the
> + RTW89_QUIRK_HW_INFO_SYSFS quirk (currently VID 0x28de /
> + PID 0x2432).
> +
> + Format: %pUb (RFC 4122 UUID in lowercase with hyphens).
> +
> + Example: aaec2b7c-0a55-4727-8de0-b30febccbbaa
> diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
> index e687216da5b6..09f17d958075 100644
> --- a/drivers/net/wireless/realtek/rtw89/core.h
> +++ b/drivers/net/wireless/realtek/rtw89/core.h
> @@ -3615,6 +3615,9 @@ struct rtw89_sta_link {
> u32 data_tx_cnt_lmt:6;
> };
>
> +#define RTW89_EFUSE_SN_LEN 5
> +#define RTW89_EFUSE_UUID_LEN 16
> +
> struct rtw89_efuse {
> bool valid;
> bool power_k_valid;
> @@ -3625,6 +3628,8 @@ struct rtw89_efuse {
> u8 adc_td;
> u8 bt_setting_2;
> u8 bt_setting_3;
> + u8 sn[RTW89_EFUSE_SN_LEN];
> + u8 uuid[RTW89_EFUSE_UUID_LEN];
> };
>
> struct rtw89_phy_rate_pattern {
> @@ -5373,6 +5378,7 @@ enum rtw89_quirks {
> RTW89_QUIRK_PCI_BER,
> RTW89_QUIRK_THERMAL_PROT_120C,
> RTW89_QUIRK_THERMAL_PROT_110C,
> + RTW89_QUIRK_HW_INFO_SYSFS,
>
> NUM_OF_RTW89_QUIRKS,
> };
> diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
> index 7bb1264bcaef..3861cce42b1b 100644
> --- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
> +++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
> @@ -621,6 +621,15 @@ static void rtw8852c_efuse_parsing_gain_offset(struct rtw89_dev *rtwdev,
> gain->offset_valid = valid;
> }
>
> +static void rtw8852c_efuse_copy_sn_uuid_usb(struct rtw89_dev *rtwdev,
> + const struct rtw8852c_efuse *map)
> +{
> + struct rtw89_efuse *efuse = &rtwdev->efuse;
> +
> + memcpy(efuse->sn, map->u.sn, sizeof(efuse->sn));
> + memcpy(efuse->uuid, map->u.uuid, sizeof(efuse->uuid));
> +}
> +
> static int rtw8852c_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
> enum rtw89_efuse_block block)
> {
> @@ -640,6 +649,7 @@ static int rtw8852c_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
> break;
> case RTW89_HCI_TYPE_USB:
> ether_addr_copy(efuse->addr, map->u.mac_addr);
> + rtw8852c_efuse_copy_sn_uuid_usb(rtwdev, map);
> break;
> default:
> return -ENOTSUPP;
> diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.h b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
> index 8585921ac6c4..b1d7c354c18e 100644
> --- a/drivers/net/wireless/realtek/rtw89/rtw8852c.h
> +++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.h
> @@ -13,7 +13,11 @@
> struct rtw8852c_u_efuse {
> u8 rsvd[0x88];
> u8 mac_addr[ETH_ALEN];
> -};
> + u8 rsvd1[8];
> + u8 sn[RTW89_EFUSE_SN_LEN];
> + u8 rsvd2[29];
> + u8 uuid[RTW89_EFUSE_UUID_LEN];
> +} __packed;
>
> struct rtw8852c_e_efuse {
> u8 mac_addr[ETH_ALEN];
> diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852cu.c b/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
> index 8f89f9a31455..81ee96b0a048 100644
> --- a/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
> +++ b/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
> @@ -39,6 +39,16 @@ static const struct rtw89_driver_info rtw89_8852cu_info = {
> },
> };
>
> +static const struct rtw89_driver_info rtw89_8852cu_valve_info = {
> + .chip = &rtw8852c_chip_info,
> + .variant = NULL,
> + .quirks = NULL,
> + .dev_id_quirks = BIT(RTW89_QUIRK_HW_INFO_SYSFS),
> + .bus = {
> + .usb = &rtw8852c_usb_info,
> + },
> +};
> +
> static const struct usb_device_id rtw_8852cu_id_table[] = {
> { USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x03a6, 0xff, 0xff, 0xff),
> .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
> @@ -53,7 +63,7 @@ static const struct usb_device_id rtw_8852cu_id_table[] = {
> { USB_DEVICE_AND_INTERFACE_INFO(0x0db0, 0x991d, 0xff, 0xff, 0xff),
> .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
> { USB_DEVICE_AND_INTERFACE_INFO(0x28de, 0x2432, 0xff, 0xff, 0xff),
> - .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
> + .driver_info = (kernel_ulong_t)&rtw89_8852cu_valve_info },
> { USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x8206, 0xff, 0xff, 0xff),
> .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
> { USB_DEVICE_AND_INTERFACE_INFO(0x35b2, 0x0502, 0xff, 0xff, 0xff),
> diff --git a/drivers/net/wireless/realtek/rtw89/usb.c b/drivers/net/wireless/realtek/rtw89/usb.c
> index 88d7ec200837..7e23d0a32025 100644
> --- a/drivers/net/wireless/realtek/rtw89/usb.c
> +++ b/drivers/net/wireless/realtek/rtw89/usb.c
> @@ -1059,6 +1059,61 @@ static void rtw89_usb_intf_deinit(struct rtw89_dev *rtwdev,
> usb_set_intfdata(intf, NULL);
> }
>
> +static ssize_t serial_number_show(struct device *dev,
> + struct device_attribute *attr, char *buf)
> +{
> + struct wiphy *wiphy = container_of(dev, struct wiphy, dev);
> + struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
> + struct rtw89_dev *rtwdev = hw->priv;
> + struct rtw89_efuse *efuse = &rtwdev->efuse;
> +
> + return sysfs_emit(buf, "%*phN\n",
> + (int)sizeof(efuse->sn), efuse->sn);
> +}
> +static DEVICE_ATTR_RO(serial_number);
> +
> +static ssize_t uuid_show(struct device *dev,
> + struct device_attribute *attr, char *buf)
> +{
> + struct wiphy *wiphy = container_of(dev, struct wiphy, dev);
> + struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
> + struct rtw89_dev *rtwdev = hw->priv;
> + struct rtw89_efuse *efuse = &rtwdev->efuse;
> +
> + return sysfs_emit(buf, "%pUb\n", efuse->uuid);
> +}
> +static DEVICE_ATTR_RO(uuid);
> +
> +static struct attribute *rtw89_usb_attrs[] = {
> + &dev_attr_serial_number.attr,
> + &dev_attr_uuid.attr,
> + NULL,
> +};
> +
> +static const struct attribute_group rtw89_usb_group = {
> + .name = "rtw89_usb",
> + .attrs = rtw89_usb_attrs,
> +};
> +__ATTRIBUTE_GROUPS(rtw89_usb);
> +
> +static void rtw89_usb_sysfs_create(struct rtw89_dev *rtwdev)
> +{
> + int ret;
> +
> + if (!test_bit(RTW89_QUIRK_HW_INFO_SYSFS, rtwdev->quirks))
> + return;
> +
> + ret = sysfs_create_groups(&rtwdev->hw->wiphy->dev.kobj,
> + rtw89_usb_groups);
You just raced with userspace and lost, please use the is_visable
callback instead, and make this the default group attributes.
thanks,
greg k-h
^ permalink raw reply
* Re: [PATCH v2 rtw-next 1/2] wifi: rtw89: add dev_id_quirks to driver_info for per-device quirk control
From: Greg KH @ 2026-05-25 19:31 UTC (permalink / raw)
To: Ping-Ke Shih
Cc: linux-wireless, driver-core, johannes, wenjie.tsai, mh_chen,
charlesl, sabae
In-Reply-To: <20260525085148.35180-2-pkshih@realtek.com>
On Mon, May 25, 2026 at 04:51:47PM +0800, Ping-Ke Shih wrote:
> --- a/drivers/net/wireless/realtek/rtw89/rtw8851be.c
> +++ b/drivers/net/wireless/realtek/rtw89/rtw8851be.c
> @@ -73,6 +73,7 @@ static const struct rtw89_driver_info rtw89_8851be_info = {
> .chip = &rtw8851b_chip_info,
> .variant = NULL,
> .quirks = NULL,
> + .dev_id_quirks = 0,
Why are you manually adding a "= 0" for these when that's the default?
No need to do so, only do it when it is set to something, right?
thanks,
greg k-h
^ permalink raw reply
* Re: [PATCH v3 0/7] b43: complete N-PHY rev 8 + radio 2057 rev 8 support
From: Alessio Ferri @ 2026-05-25 19:28 UTC (permalink / raw)
To: Michael Büsch; +Cc: linux-wireless, b43-dev, linux-kernel
In-Reply-To: <20260525201405.6c60420f@barney>
Il giorno Mon, 25 May 2026 20:14:05 +0200
Michael Büsch <m@bues.ch> ha scritto:
> On Mon, 25 May 2026 14:04:38 +0200
> Alessio Ferri <alessio.ferri@mythread.it> wrote:
>
> > Please clarify "full expected wireless throughput", HT is
> > not supported by b43, so it runs only with NOHT in g-like speed:
>
> > Enabling HT for N chips is out of scope, also there nothing to
> > gain and a lot to risk, so i won't do it.
>
> That's fine.
> Just wanted to know if there were known problems.
>
Did not see any obvious problem for now. I Will try to fix any issues if
someone find some
^ permalink raw reply
* Re: [PATCH v3 0/7] b43: complete N-PHY rev 8 + radio 2057 rev 8 support
From: Michael Büsch @ 2026-05-25 18:14 UTC (permalink / raw)
To: Alessio Ferri; +Cc: linux-wireless, b43-dev, linux-kernel
In-Reply-To: <20260525140438.265975e7@fedora>
[-- Attachment #1: Type: text/plain, Size: 438 bytes --]
On Mon, 25 May 2026 14:04:38 +0200
Alessio Ferri <alessio.ferri@mythread.it> wrote:
> Please clarify "full expected wireless throughput", HT is
> not supported by b43, so it runs only with NOHT in g-like speed:
> Enabling HT for N chips is out of scope, also there nothing to
> gain and a lot to risk, so i won't do it.
That's fine.
Just wanted to know if there were known problems.
--
Michael Büsch
https://bues.ch/
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* Re: [PATCH 5.15.y] wifi: mac80211: check tdls flag in ieee80211_tdls_oper
From: Sasha Levin @ 2026-05-25 15:33 UTC (permalink / raw)
To: gregkh, stable, kartikey406
Cc: Sasha Levin, patches, linux-kernel, johannes, davem, edumazet,
kuba, pabeni, linux-wireless, netdev, johannes.berg, Li hongliang
In-Reply-To: <20260525060336.2460138-1-1468888505@139.com>
On Mon, May 25, 2026 at 02:03:36PM +0800, Li hongliang wrote:
> From: Deepanshu Kartikey <kartikey406@gmail.com>
>
> [ Upstream commit 7d73872d949c488a1d7c308031d6a9d89b5e0a8b ]
>
> When NL80211_TDLS_ENABLE_LINK is called, the code only checks if the
> station exists but not whether it is actually a TDLS station.
Queued for 5.15, thanks.
--
Thanks,
Sasha
^ permalink raw reply
* Re: [PATCH 6.1.y] wifi: mac80211: check tdls flag in ieee80211_tdls_oper
From: Sasha Levin @ 2026-05-25 15:33 UTC (permalink / raw)
To: gregkh, stable, kartikey406
Cc: Sasha Levin, patches, linux-kernel, johannes, davem, edumazet,
kuba, pabeni, linux-wireless, netdev, johannes.berg, Li hongliang
In-Reply-To: <20260525054854.2457807-1-1468888505@139.com>
On Mon, May 25, 2026 at 01:48:54PM +0800, Li hongliang wrote:
> From: Deepanshu Kartikey <kartikey406@gmail.com>
>
> [ Upstream commit 7d73872d949c488a1d7c308031d6a9d89b5e0a8b ]
>
> When NL80211_TDLS_ENABLE_LINK is called, the code only checks if the
> station exists but not whether it is actually a TDLS station.
Queued for 6.1, thanks.
--
Thanks,
Sasha
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox