diff options
-rw-r--r-- | drivers/hid/bpf/hid_bpf_struct_ops.c | 1 | ||||
-rw-r--r-- | drivers/hid/hid-core.c | 11 | ||||
-rw-r--r-- | tools/testing/selftests/hid/hid_bpf.c | 80 | ||||
-rw-r--r-- | tools/testing/selftests/hid/progs/hid.c | 12 | ||||
-rw-r--r-- | tools/testing/selftests/hid/progs/hid_bpf_helpers.h | 6 |
5 files changed, 4 insertions, 106 deletions
diff --git a/drivers/hid/bpf/hid_bpf_struct_ops.c b/drivers/hid/bpf/hid_bpf_struct_ops.c index 0e611a9d79d7..702c22fae136 100644 --- a/drivers/hid/bpf/hid_bpf_struct_ops.c +++ b/drivers/hid/bpf/hid_bpf_struct_ops.c @@ -79,7 +79,6 @@ static int hid_bpf_ops_btf_struct_access(struct bpf_verifier_log *log, WRITE_RANGE(hid_device, name, true), WRITE_RANGE(hid_device, uniq, true), WRITE_RANGE(hid_device, phys, true), - WRITE_RANGE(hid_device, quirks, false), }; #undef WRITE_RANGE const struct btf_type *state = NULL; diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 81d6c734c8bc..98bef39642a9 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -2692,12 +2692,6 @@ static int __hid_device_probe(struct hid_device *hdev, struct hid_driver *hdrv) int ret; if (!hdev->bpf_rsize) { - unsigned int quirks; - - /* reset the quirks that has been previously set */ - quirks = hid_lookup_quirk(hdev); - hdev->quirks = quirks; - /* in case a bpf program gets detached, we need to free the old one */ hid_free_bpf_rdesc(hdev); @@ -2707,9 +2701,6 @@ static int __hid_device_probe(struct hid_device *hdev, struct hid_driver *hdrv) /* call_hid_bpf_rdesc_fixup will always return a valid pointer */ hdev->bpf_rdesc = call_hid_bpf_rdesc_fixup(hdev, hdev->dev_rdesc, &hdev->bpf_rsize); - if (quirks ^ hdev->quirks) - hid_info(hdev, "HID-BPF toggled quirks on the device: %04x", - quirks ^ hdev->quirks); } if (!hid_check_device_match(hdev, hdrv, &id)) @@ -2719,6 +2710,8 @@ static int __hid_device_probe(struct hid_device *hdev, struct hid_driver *hdrv) if (!hdev->devres_group_id) return -ENOMEM; + /* reset the quirks that has been previously set */ + hdev->quirks = hid_lookup_quirk(hdev); hdev->driver = hdrv; if (hdrv->probe) { diff --git a/tools/testing/selftests/hid/hid_bpf.c b/tools/testing/selftests/hid/hid_bpf.c index ca58bfa3ca65..1e979fb3542b 100644 --- a/tools/testing/selftests/hid/hid_bpf.c +++ b/tools/testing/selftests/hid/hid_bpf.c @@ -54,41 +54,11 @@ FIXTURE_TEARDOWN(hid_bpf) { hid_bpf_teardown(_metadata, self, variant); \ } while (0) -struct specific_device { - const char test_name[64]; - __u16 bus; - __u32 vid; - __u32 pid; -}; - FIXTURE_SETUP(hid_bpf) { - const struct specific_device *match = NULL; int err; - const struct specific_device devices[] = { - { - .test_name = "test_hid_driver_probe", - .bus = BUS_BLUETOOTH, - .vid = 0x05ac, /* USB_VENDOR_ID_APPLE */ - .pid = 0x022c, /* USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI */ - }, { - .test_name = "*", - .bus = BUS_USB, - .vid = 0x0001, - .pid = 0x0a36, - }}; - - for (int i = 0; i < ARRAY_SIZE(devices); i++) { - match = &devices[i]; - if (!strncmp(_metadata->name, devices[i].test_name, sizeof(devices[i].test_name))) - break; - } - - ASSERT_OK_PTR(match); - - err = setup_uhid(_metadata, &self->hid, match->bus, match->vid, match->pid, - rdesc, sizeof(rdesc)); + err = setup_uhid(_metadata, &self->hid, BUS_USB, 0x0001, 0x0a36, rdesc, sizeof(rdesc)); ASSERT_OK(err); } @@ -885,54 +855,6 @@ TEST_F(hid_bpf, test_hid_attach_flags) ASSERT_EQ(buf[3], 3); } -static bool is_using_driver(struct __test_metadata *_metadata, struct uhid_device *hid, - const char *driver) -{ - char driver_line[512]; - char uevent[1024]; - char temp[512]; - int fd, nread; - bool found = false; - - sprintf(uevent, "/sys/bus/hid/devices/%04X:%04X:%04X.%04X/uevent", - hid->bus, hid->vid, hid->pid, hid->hid_id); - - fd = open(uevent, O_RDONLY | O_NONBLOCK); - if (fd < 0) { - TH_LOG("couldn't open '%s': %d, %d", uevent, fd, errno); - return false; - } - - sprintf(driver_line, "DRIVER=%s", driver); - - nread = read(fd, temp, ARRAY_SIZE(temp)); - if (nread > 0 && (strstr(temp, driver_line)) != NULL) - found = true; - - close(fd); - - return found; -} - -/* - * Attach hid_driver_probe to the given uhid device, - * check that the device is now using hid-generic. - */ -TEST_F(hid_bpf, test_hid_driver_probe) -{ - const struct test_program progs[] = { - { - .name = "hid_test_driver_probe", - }, - }; - - ASSERT_TRUE(is_using_driver(_metadata, &self->hid, "apple")); - - LOAD_PROGRAMS(progs); - - ASSERT_TRUE(is_using_driver(_metadata, &self->hid, "hid-generic")); -} - /* * Attach hid_rdesc_fixup to the given uhid device, * retrieve and open the matching hidraw node, diff --git a/tools/testing/selftests/hid/progs/hid.c b/tools/testing/selftests/hid/progs/hid.c index 9b22e9a0e658..5ecc845ef792 100644 --- a/tools/testing/selftests/hid/progs/hid.c +++ b/tools/testing/selftests/hid/progs/hid.c @@ -598,15 +598,3 @@ SEC(".struct_ops.link") struct hid_bpf_ops test_infinite_loop_input_report = { .hid_device_event = (void *)hid_test_infinite_loop_input_report, }; - -SEC("?struct_ops.s/hid_rdesc_fixup") -int BPF_PROG(hid_test_driver_probe, struct hid_bpf_ctx *hid_ctx) -{ - hid_ctx->hid->quirks |= HID_QUIRK_IGNORE_SPECIAL_DRIVER; - return 0; -} - -SEC(".struct_ops.link") -struct hid_bpf_ops test_driver_probe = { - .hid_rdesc_fixup = (void *)hid_test_driver_probe, -}; diff --git a/tools/testing/selftests/hid/progs/hid_bpf_helpers.h b/tools/testing/selftests/hid/progs/hid_bpf_helpers.h index 1a645684a117..e5db897586bb 100644 --- a/tools/testing/selftests/hid/progs/hid_bpf_helpers.h +++ b/tools/testing/selftests/hid/progs/hid_bpf_helpers.h @@ -84,14 +84,10 @@ struct hid_bpf_ops { struct hid_device *hdev; }; -#define BIT(n) (1U << n) - #ifndef BPF_F_BEFORE -#define BPF_F_BEFORE BIT(3) +#define BPF_F_BEFORE (1U << 3) #endif -#define HID_QUIRK_IGNORE_SPECIAL_DRIVER BIT(22) - /* following are kfuncs exported by HID for HID-BPF */ extern __u8 *hid_bpf_get_data(struct hid_bpf_ctx *ctx, unsigned int offset, |