svn commit: r367236 - in head: share/man/man4 sys/dev/usb sys/dev/usb/input

Hans Petter Selasky hselasky at FreeBSD.org
Sat Oct 31 21:53:24 UTC 2020


Author: hselasky
Date: Sat Oct 31 21:53:23 2020
New Revision: 367236
URL: https://svnweb.freebsd.org/changeset/base/367236

Log:
  Implement the USB_GET_DEVICEINFO ioctl(2) for uhid(4).
  
  Submitted by:		pedro martelletto <pedro at ambientworks.net>
  MFC after:		1 week
  Sponsored by:		Mellanox Technologies // NVIDIA Networking

Modified:
  head/share/man/man4/uhid.4
  head/sys/dev/usb/input/uhid.c
  head/sys/dev/usb/usb_generic.c
  head/sys/dev/usb/usb_generic.h

Modified: head/share/man/man4/uhid.4
==============================================================================
--- head/share/man/man4/uhid.4	Sat Oct 31 21:11:34 2020	(r367235)
+++ head/share/man/man4/uhid.4	Sat Oct 31 21:53:23 2020	(r367236)
@@ -29,7 +29,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 1, 2018
+.Dd Oct 31, 2020
 .Dt UHID 4
 .Os
 .Sh NAME
@@ -131,6 +131,11 @@ and the
 .Va ugd_maxlen
 fields.
 This call may fail if the device does not support this feature.
+.It Dv USB_GET_DEVICEINFO Pq Vt "struct usb_device_info"
+Returns information about the device, like USB vendor ID and USB product ID.
+This call will not issue any USB transactions.
+Also refer to
+.Xr ugen 4 .
 .El
 .Pp
 Use

Modified: head/sys/dev/usb/input/uhid.c
==============================================================================
--- head/sys/dev/usb/input/uhid.c	Sat Oct 31 21:11:34 2020	(r367235)
+++ head/sys/dev/usb/input/uhid.c	Sat Oct 31 21:53:23 2020	(r367236)
@@ -70,6 +70,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/usb/usbdi_util.h>
 #include <dev/usb/usbhid.h>
 #include <dev/usb/usb_ioctl.h>
+#include <dev/usb/usb_generic.h>
 
 #define	USB_DEBUG_VAR uhid_debug
 #include <dev/usb/usb_debug.h>
@@ -144,11 +145,13 @@ static usb_fifo_cmd_t uhid_stop_write;
 static usb_fifo_open_t uhid_open;
 static usb_fifo_close_t uhid_close;
 static usb_fifo_ioctl_t uhid_ioctl;
+static usb_fifo_ioctl_t uhid_ioctl_post;
 
 static struct usb_fifo_methods uhid_fifo_methods = {
 	.f_open = &uhid_open,
 	.f_close = &uhid_close,
 	.f_ioctl = &uhid_ioctl,
+	.f_ioctl_post = &uhid_ioctl_post,
 	.f_start_read = &uhid_start_read,
 	.f_stop_read = &uhid_stop_read,
 	.f_start_write = &uhid_start_write,
@@ -642,6 +645,24 @@ uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *ad
 
 	case USB_GET_REPORT_ID:
 		*(int *)addr = 0;	/* XXX: we only support reportid 0? */
+		break;
+
+	default:
+		error = ENOIOCTL;
+		break;
+	}
+	return (error);
+}
+
+static int
+uhid_ioctl_post(struct usb_fifo *fifo, u_long cmd, void *addr,
+    int fflags)
+{
+	int error;
+
+	switch (cmd) {
+	case USB_GET_DEVICEINFO:
+		error = ugen_fill_deviceinfo(fifo, addr);
 		break;
 
 	default:

Modified: head/sys/dev/usb/usb_generic.c
==============================================================================
--- head/sys/dev/usb/usb_generic.c	Sat Oct 31 21:11:34 2020	(r367235)
+++ head/sys/dev/usb/usb_generic.c	Sat Oct 31 21:53:23 2020	(r367236)
@@ -109,8 +109,6 @@ static int	ugen_set_interface(struct usb_fifo *, uint8
 static int	ugen_get_cdesc(struct usb_fifo *, struct usb_gen_descriptor *);
 static int	ugen_get_sdesc(struct usb_fifo *, struct usb_gen_descriptor *);
 static int	ugen_get_iface_driver(struct usb_fifo *f, struct usb_gen_descriptor *ugd);
-static int	usb_gen_fill_deviceinfo(struct usb_fifo *,
-		    struct usb_device_info *);
 static int	ugen_re_enumerate(struct usb_fifo *);
 static int	ugen_iface_ioctl(struct usb_fifo *, u_long, void *, int);
 static uint8_t	ugen_fs_get_complete(struct usb_fifo *, uint8_t *);
@@ -814,7 +812,7 @@ ugen_get_iface_driver(struct usb_fifo *f, struct usb_g
 }
 
 /*------------------------------------------------------------------------*
- *	usb_gen_fill_deviceinfo
+ *	ugen_fill_deviceinfo
  *
  * This function dumps information about an USB device to the
  * structure pointed to by the "di" argument.
@@ -823,8 +821,8 @@ ugen_get_iface_driver(struct usb_fifo *f, struct usb_g
  *    0: Success
  * Else: Failure
  *------------------------------------------------------------------------*/
-static int
-usb_gen_fill_deviceinfo(struct usb_fifo *f, struct usb_device_info *di)
+int
+ugen_fill_deviceinfo(struct usb_fifo *f, struct usb_device_info *di)
 {
 	struct usb_device *udev;
 	struct usb_device *hub;
@@ -2205,7 +2203,7 @@ ugen_ioctl_post(struct usb_fifo *f, u_long cmd, void *
 
 	case USB_DEVICEINFO:
 	case USB_GET_DEVICEINFO:
-		error = usb_gen_fill_deviceinfo(f, addr);
+		error = ugen_fill_deviceinfo(f, addr);
 		break;
 
 	case USB_DEVICESTATS:

Modified: head/sys/dev/usb/usb_generic.h
==============================================================================
--- head/sys/dev/usb/usb_generic.h	Sat Oct 31 21:11:34 2020	(r367235)
+++ head/sys/dev/usb/usb_generic.h	Sat Oct 31 21:53:23 2020	(r367236)
@@ -31,5 +31,6 @@
 
 extern struct usb_fifo_methods usb_ugen_methods;
 int	ugen_do_request(struct usb_fifo *f, struct usb_ctl_request *ur);
+int	ugen_fill_deviceinfo(struct usb_fifo *f, struct usb_device_info *di);
 
 #endif					/* _USB_GENERIC_H_ */


More information about the svn-src-all mailing list