xref: /linux/scripts/coccinelle/hid/ff_race.cocci (revision a93f3bf4e1d60777b1659b812c9e818cfc53b449)
1*225c3081SDmitry Torokhov/// Detect HID drivers that initialize force-feedback after hid_hw_start()
2*225c3081SDmitry Torokhov/// when HID_CONNECT_HIDINPUT is used. This is a lifecycle violation as
3*225c3081SDmitry Torokhov/// the input device is already registered.
4*225c3081SDmitry Torokhov//
5*225c3081SDmitry Torokhov// Confidence: High
6*225c3081SDmitry Torokhov// Copyright: (C) 2026 Gemini. GPLv2.
7*225c3081SDmitry Torokhov
8*225c3081SDmitry Torokhovvirtual report
9*225c3081SDmitry Torokhov
10*225c3081SDmitry Torokhov@r@
11*225c3081SDmitry Torokhovidentifier probe_fn;
12*225c3081SDmitry Torokhovexpression hdev, flags;
13*225c3081SDmitry Torokhovposition p1, p2;
14*225c3081SDmitry Torokhov@@
15*225c3081SDmitry Torokhov
16*225c3081SDmitry Torokhovprobe_fn(struct hid_device *hdev, ...) {
17*225c3081SDmitry Torokhov  <...
18*225c3081SDmitry Torokhov  hid_hw_start@p1(hdev, flags)
19*225c3081SDmitry Torokhov  ...
20*225c3081SDmitry Torokhov  \(input_ff_create\|input_ff_create_memless\)@p2(...)
21*225c3081SDmitry Torokhov  ...>
22*225c3081SDmitry Torokhov}
23*225c3081SDmitry Torokhov
24*225c3081SDmitry Torokhov@script:python depends on report@
25*225c3081SDmitry Torokhovp1 << r.p1;
26*225c3081SDmitry Torokhovp2 << r.p2;
27*225c3081SDmitry Torokhovflags << r.flags;
28*225c3081SDmitry Torokhov@@
29*225c3081SDmitry Torokhov
30*225c3081SDmitry Torokhov# Check if flags include HID_CONNECT_HIDINPUT (0x01) or HID_CONNECT_DEFAULT (0x0f)
31*225c3081SDmitry Torokhov# Note: HID_CONNECT_DEFAULT is 0x0f, HID_CONNECT_HIDINPUT is 0x01
32*225c3081SDmitry Torokhovif "HID_CONNECT_HIDINPUT" in flags or "HID_CONNECT_DEFAULT" in flags:
33*225c3081SDmitry Torokhov    msg = "WARNING: force-feedback initialized after hid_hw_start() with HID_CONNECT_HIDINPUT. Input device is already registered at this point. Use .input_configured() instead."
34*225c3081SDmitry Torokhov    coccilib.report.print_report(p2[0], msg)
35