aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex S <iwtcex@gmail.com>2025-12-31 09:11:53 +0000
committerWarner Losh <imp@FreeBSD.org>2026-01-09 21:18:16 +0000
commitd5e5fed1edfc3828f594fa8727d1c62c36b54e16 (patch)
treeaad5d0d9c2dcdc0c3ae80a22957edff85062a4dc
parent7b3fb3caef9495cdfcc1c8ec39907defb65ce860 (diff)
-rw-r--r--sys/compat/linux/linux_ioctl.c51
-rw-r--r--sys/compat/linux/linux_ioctl.h19
2 files changed, 70 insertions, 0 deletions
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index f6c239b08ac2..d2fa0331026b 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -58,6 +58,7 @@
#include <net/if_types.h>
#include <dev/evdev/input.h>
+#include <dev/hid/hidraw.h>
#include <dev/usb/usb_ioctl.h>
#ifdef COMPAT_LINUX32
@@ -113,6 +114,7 @@ DEFINE_LINUX_IOCTL_SET(kcov, KCOV);
#ifndef COMPAT_LINUX32
DEFINE_LINUX_IOCTL_SET(nvme, NVME);
#endif
+DEFINE_LINUX_IOCTL_SET(hidraw, HIDRAW);
#undef DEFINE_LINUX_IOCTL_SET
@@ -3637,6 +3639,55 @@ linux_ioctl_nvme(struct thread *td, struct linux_ioctl_args *args)
}
#endif
+static int
+linux_ioctl_hidraw(struct thread *td, struct linux_ioctl_args *args)
+{
+ int len = (args->cmd & 0x3fff0000) >> 16;
+ if (len > 8192)
+ return (EINVAL);
+
+ switch (args->cmd & 0xffff) {
+ case LINUX_HIDIOCGRDESCSIZE:
+ args->cmd = HIDIOCGRDESCSIZE;
+ break;
+ case LINUX_HIDIOCGRDESC:
+ args->cmd = HIDIOCGRDESC;
+ break;
+ case LINUX_HIDIOCGRAWINFO:
+ args->cmd = HIDIOCGRAWINFO;
+ break;
+ case LINUX_HIDIOCGRAWNAME:
+ args->cmd = HIDIOCGRAWNAME(len);
+ break;
+ case LINUX_HIDIOCGRAWPHYS:
+ args->cmd = HIDIOCGRAWPHYS(len);
+ break;
+ case LINUX_HIDIOCSFEATURE:
+ args->cmd = HIDIOCSFEATURE(len);
+ break;
+ case LINUX_HIDIOCGFEATURE:
+ args->cmd = HIDIOCGFEATURE(len);
+ break;
+ case LINUX_HIDIOCGRAWUNIQ:
+ args->cmd = HIDIOCGRAWUNIQ(len);
+ break;
+ case LINUX_HIDIOCSINPUT:
+ args->cmd = HIDIOCSINPUT(len);
+ break;
+ case LINUX_HIDIOCGINPUT:
+ args->cmd = HIDIOCGINPUT(len);
+ break;
+ case LINUX_HIDIOCSOUTPUT:
+ args->cmd = HIDIOCSOUTPUT(len);
+ break;
+ case LINUX_HIDIOCGOUTPUT:
+ args->cmd = HIDIOCGOUTPUT(len);
+ break;
+ }
+
+ return (sys_ioctl(td, (struct ioctl_args *)args));
+}
+
/*
* main ioctl syscall function
*/
diff --git a/sys/compat/linux/linux_ioctl.h b/sys/compat/linux/linux_ioctl.h
index d01a30538981..116a4e676228 100644
--- a/sys/compat/linux/linux_ioctl.h
+++ b/sys/compat/linux/linux_ioctl.h
@@ -807,6 +807,25 @@
#define LINUX_IOCTL_NVME_MAX LINUX_NVME_IOCTL_RESCAN
/*
+ * hidraw
+ */
+#define LINUX_HIDIOCGRDESCSIZE 0x4801
+#define LINUX_HIDIOCGRDESC 0x4802
+#define LINUX_HIDIOCGRAWINFO 0x4803
+#define LINUX_HIDIOCGRAWNAME 0x4804
+#define LINUX_HIDIOCGRAWPHYS 0x4805
+#define LINUX_HIDIOCSFEATURE 0x4806
+#define LINUX_HIDIOCGFEATURE 0x4807
+#define LINUX_HIDIOCGRAWUNIQ 0x4808
+#define LINUX_HIDIOCSINPUT 0x4809
+#define LINUX_HIDIOCGINPUT 0x480A
+#define LINUX_HIDIOCSOUTPUT 0x480B
+#define LINUX_HIDIOCGOUTPUT 0x480C
+
+#define LINUX_IOCTL_HIDRAW_MIN LINUX_HIDIOCGRDESCSIZE
+#define LINUX_IOCTL_HIDRAW_MAX LINUX_HIDIOCGOUTPUT
+
+/*
* Pluggable ioctl handlers
*/
struct linux_ioctl_args;