[PATCH AUTOSEL 6.19-6.6] wifi: ath11k: add pm quirk for Thinkpad Z13/Z16 Gen1

Sasha Levin
2026-02-14T21:25:58Z

From: Ross Vandegrift <ross@kallisti.us>

[ Upstream commit 4015b1972763d7d513172276e51439f37e622a92 ]

Z16 Gen1 has the wakeup-from-suspend issues from [1] but was never added
to the appropriate quirk list. I've tested this patch on top of 6.18.2,
it fixes the issue for me on 21D4

Mark Pearson provided the other product IDs covering the second Z16 Gen1
and both Z13 Gen1 identifiers. They share the same firmware, and folks
in the bugzilla report do indeed see the problem on Z13.

[1] - https://bugzilla.kernel.org/show_bug.cgi?id=219196

Signed-off-by: Ross Vandegrift <ross@kallisti.us>
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Link: https://patch.msgid.link/wj7o2kmb7g54stdjvxp2hjqrnutnq3jbf4s2uh4ctvmlxdq7tf@nbkj2ebakhrd
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---

LLM Generated explanations, may be completely bogus:

## Analysis

### Commit Message Analysis

This commit adds DMI-based power management quirk entries for Lenovo
ThinkPad Z13 Gen1 and Z16 Gen1 laptops to the `ath11k_pm_quirk_table[]`.
The commit message clearly states:

- The Z16 Gen1 has known wakeup-from-suspend issues documented in kernel
bugzilla #219196
- The fix has been tested on actual hardware (21D4 model)
- Additional product IDs were provided by Mark Pearson (Lenovo engineer)
covering both Z13 Gen1 and Z16 Gen1 variants
- The devices share the same firmware and users in the bugzilla confirm
the problem exists on Z13 as well

### Code Change Analysis

The change adds exactly 4 new DMI table entries to the existing
`ath11k_pm_quirk_table[]` array:
- Z13 G1: product names "21D2" and "21D3"
- Z16 G1: product names "21D4" and "21D5"

Each entry follows the identical pattern as every other entry in the
table:
```c
{
.driver_data = (void *)ATH11K_PM_WOW,
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_NAME, "XXXX"),
},
},
```

This is a pure data addition — no logic changes, no new code paths, no
new APIs.

### Classification: Hardware Quirk/Workaround

This falls squarely into the **QUIRKS and WORKAROUNDS** exception
category explicitly called out in the stable kernel rules. It adds
hardware-specific quirk entries for devices with broken suspend/resume
behavior. The quirk table and the `ATH11K_PM_WOW` mechanism already
exist in the kernel — this merely extends coverage to additional laptop
models.

### Risk Assessment

- **Risk: Extremely low.** Adding DMI match entries to an existing quirk
table cannot break anything for other users. The entries only activate
on the specific Lenovo product IDs listed.
- **Scope: Minimal.** Only one file changed, only data additions, no
logic changes.
- **Testing: Strong.** The commit has `Tested-by:` from Mark Pearson
(Lenovo), `Reviewed-by:` from both the Qualcomm ath11k maintainer
(Baochen Qiang) and Mark Pearson, and was tested by the author on
actual hardware.

### User Impact

- **Problem:** WiFi fails to work properly after suspend/resume on
ThinkPad Z13/Z16 Gen1 laptops — a critical issue for laptop users.
- **Affected users:** All owners of these specific Lenovo ThinkPad
models using the ath11k WiFi driver.
- **Severity:** High — broken suspend/resume on a laptop is a
significant usability issue that affects daily use.
- **Bugzilla link:** The issue is documented with multiple users
confirming it.

### Dependency Check

No dependencies on other commits. The quirk table infrastructure already
exists in stable trees. The entries follow the exact same format as
existing entries.

### Conclusion

This is a textbook stable backport candidate: a small, zero-risk, data-
only addition of hardware quirk entries to an existing table, fixing a
real and well-documented suspend/resume bug on specific laptop models,
with proper testing and review from both the hardware vendor and the
subsystem maintainer.

**YES**

drivers/net/wireless/ath/ath11k/core.c | 28 ++++++++++++++++++++++++++
1 file changed, 28 insertions(+)

diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c
index 812686173ac8a..03dddc1cd003a 100644
--- a/drivers/net/wireless/ath/ath11k/core.c
+++ b/drivers/net/wireless/ath/ath11k/core.c
@@ -994,6 +994,34 @@ static const struct dmi_system_id ath11k_pm_quirk_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "21F9"),
},
},
+ {
+ .driver_data = (void *)ATH11K_PM_WOW,
+ .matches = { /* Z13 G1 */
+ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "21D2"),
+ },
+ },
+ {
+ .driver_data = (void *)ATH11K_PM_WOW,
+ .matches = { /* Z13 G1 */
+ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "21D3"),
+ },
+ },
+ {
+ .driver_data = (void *)ATH11K_PM_WOW,
+ .matches = { /* Z16 G1 */
+ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "21D4"),
+ },
+ },
+ {
+ .driver_data = (void *)ATH11K_PM_WOW,
+ .matches = { /* Z16 G1 */
+ DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "21D5"),
+ },
+ },
{}
};

--
2.51.0