mirror of
https://github.com/opnsense/src.git
synced 2026-02-14 08:13:38 -05:00
Implement the USB_GET_DEVICEINFO ioctl(2) for uhid(4).
Submitted by: pedro martelletto <pedro@ambientworks.net> MFC after: 1 week Sponsored by: Mellanox Technologies // NVIDIA Networking
This commit is contained in:
parent
bd5e074531
commit
c77bfaa750
4 changed files with 32 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
@ -644,6 +647,24 @@ uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
|
|||
*(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:
|
||||
error = EINVAL;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -109,8 +109,6 @@ static int ugen_set_interface(struct usb_fifo *, uint8_t, uint8_t);
|
|||
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_gen_descriptor *ugd)
|
|||
}
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* 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_gen_descriptor *ugd)
|
|||
* 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 *addr, int fflags)
|
|||
|
||||
case USB_DEVICEINFO:
|
||||
case USB_GET_DEVICEINFO:
|
||||
error = usb_gen_fill_deviceinfo(f, addr);
|
||||
error = ugen_fill_deviceinfo(f, addr);
|
||||
break;
|
||||
|
||||
case USB_DEVICESTATS:
|
||||
|
|
|
|||
|
|
@ -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_ */
|
||||
|
|
|
|||
Loading…
Reference in a new issue