[PATCH v3 4/4] HID: wacom: Fix teardown order in wacom_mode_change_work

From: Lee Jones

Date: Tue Jun 09 2026 - 08:26:04 EST


wacom_mode_change_work() called wacom_release_resources() before
hid_hw_stop(). wacom_release_resources() triggers devres cleanup
which calls wacom_remove_shared_data() to nullify wacom_wac->shared.
Since hid_hw_stop() was not called yet, hardware IRQs could still fire
and dereference the nullified wacom_wac->shared pointer, causing a crash.

Fix this by correcting the teardown order to call hid_hw_stop()
first, matching the order used in wacom_remove().

Fixes: 4082da80f46a ("HID: wacom: generic: add mode change touch key")
Signed-off-by: Lee Jones <lee@xxxxxxxxxx>
---

v1 -> v2: Split and use RCU as per Dmitry's review
v2 -> v3: Sashiko fixes

drivers/hid/wacom_sys.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index 1b019e3331b4..378dddbf7ec5 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -2835,16 +2835,16 @@ static void wacom_mode_change_work(struct work_struct *work)

if (pen) {
wacom1 = hid_get_drvdata(pen);
- wacom_release_resources(wacom1);
hid_hw_stop(wacom1->hdev);
+ wacom_release_resources(wacom1);
wacom1->wacom_wac.has_mode_change = true;
wacom1->wacom_wac.is_direct_mode = is_direct;
}

if (touch) {
wacom2 = hid_get_drvdata(touch);
- wacom_release_resources(wacom2);
hid_hw_stop(wacom2->hdev);
+ wacom_release_resources(wacom2);
wacom2->wacom_wac.has_mode_change = true;
wacom2->wacom_wac.is_direct_mode = is_direct;
}
--
2.54.0.1099.g489fc7bff1-goog