Am 01.06.2017 um 16:39 schrieb Alan Stern:
On Thu, 1 Jun 2017, Reinhard Huck wrote:Hi, Currently, in an usbdevfs-based application it is not possible to know the speed the device is operating at. But this information is sometime required, for example to interpret the bInterval and wMaxPacketSize fields of interrupt/isochronous endpoint descriptors. Specifically, it is a problem to differentiate between full and high speed because this is not indicated in descriptors. We suggest to add a new IOCTL (e.g. USBDEVFS_GET_SPEED) which reports the speed as an int value as one of the following constants: #define USBDEVFS_SPEED_UNKNOWN 0 #define USBDEVFS_SPEED_LOW 1 #define USBDEVFS_SPEED_FULL 2 #define USBDEVFS_SPEED_HIGH 3 #define USBDEVFS_SPEED_WIRELESS 4 #define USBDEVFS_SPEED_SUPER 5 #define USBDEVFS_SPEED_SUPER_PLUS 6 Alternatively you could introduce IOCTL USBDEVFS_CONNECTINFO_2 and struct usbdevfs_connectinfo_2.That's a good idea. The connection speed is available in sysfs but not in usbfs (at least, not since the days of USB-1.1). How does this patch look? Alan Stern Index: usb-4.x/drivers/usb/core/devio.c =================================================================== --- usb-4.x.orig/drivers/usb/core/devio.c +++ usb-4.x/drivers/usb/core/devio.c @@ -1322,6 +1322,27 @@ static int proc_connectinfo(struct usb_d return 0; }+static int proc_get_speed(struct usb_dev_state *ps)+{ + switch (ps->dev->speed) { + case USB_SPEED_UNKNOWN: + return USBDEVFS_SPEED_UNKNOWN; + case USB_SPEED_LOW: + return USBDEVFS_SPEED_LOW; + case USB_SPEED_FULL: + return USBDEVFS_SPEED_FULL; + case USB_SPEED_HIGH: + return USBDEVFS_SPEED_HIGH; + case USB_SPEED_WIRELESS: + return USBDEVFS_SPEED_WIRELESS; + case USB_SPEED_SUPER: + return USBDEVFS_SPEED_SUPER; + case USB_SPEED_SUPER_PLUS: + return USBDEVFS_SPEED_SUPER_PLUS; + } + return -ERANGE; +} + static int proc_resetdevice(struct usb_dev_state *ps) { struct usb_host_config *actconfig = ps->dev->actconfig; @@ -2537,6 +2558,9 @@ static long usbdev_do_ioctl(struct file case USBDEVFS_DROP_PRIVILEGES: ret = proc_drop_privileges(ps, p); break; + case USBDEVFS_GET_SPEED: + ret = proc_get_speed(ps); + break; }done:Index: usb-4.x/include/uapi/linux/usbdevice_fs.h =================================================================== --- usb-4.x.orig/include/uapi/linux/usbdevice_fs.h +++ usb-4.x/include/uapi/linux/usbdevice_fs.h @@ -156,6 +156,16 @@ struct usbdevfs_streams { unsigned char eps[0]; };+/* connection speed values used by USBDEVFS_GET_SPEED */+#define USBDEVFS_SPEED_UNKNOWN 0 +#define USBDEVFS_SPEED_LOW 1 +#define USBDEVFS_SPEED_FULL 2 +#define USBDEVFS_SPEED_HIGH 3 +#define USBDEVFS_SPEED_WIRELESS 4 +#define USBDEVFS_SPEED_SUPER 5 +#define USBDEVFS_SPEED_SUPER_PLUS 6 + + #define USBDEVFS_CONTROL _IOWR('U', 0, struct usbdevfs_ctrltransfer) #define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32) #define USBDEVFS_BULK _IOWR('U', 2, struct usbdevfs_bulktransfer) @@ -190,5 +200,6 @@ struct usbdevfs_streams { #define USBDEVFS_ALLOC_STREAMS _IOR('U', 28, struct usbdevfs_streams) #define USBDEVFS_FREE_STREAMS _IOR('U', 29, struct usbdevfs_streams) #define USBDEVFS_DROP_PRIVILEGES _IOW('U', 30, __u32) +#define USBDEVFS_GET_SPEED _IO('U', 31)#endif /* _UAPI_LINUX_USBDEVICE_FS_H */
Thanks for the patch. That's exactly what we want. Could you please make sure that the patch gets released?
Best Regards, Reinhard -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
