The usbfs interface does not provide any way to get specific superspeedplus rate, like Gen2x1, Gen1x2 or Gen2x2. Current API include an USBDEVFS_GET_SPEED ioctl, but it can only return general superspeedplus speed instead of any specific rates. Therefore we can't tell whether it's a Gen2x2(20Gbps) device. This patch introduce a new ioctl USBDEVFS_GET_SSP_RATE to fix it. Similar information is already available via sysfs, it's good to add it for usbfs too. Signed-off-by: Dingyan Li <18500469033@xxxxxxx> --- drivers/usb/core/devio.c | 3 +++ include/uapi/linux/usbdevice_fs.h | 1 + 2 files changed, 4 insertions(+) diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 1a16a8bdea60..2f57eb163360 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -2783,6 +2783,9 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd, case USBDEVFS_GET_SPEED: ret = ps->dev->speed; break; + case USBDEVFS_GET_SSP_RATE: + ret = ps->dev->ssp_rate; + break; case USBDEVFS_FORBID_SUSPEND: ret = proc_forbid_suspend(ps); break; diff --git a/include/uapi/linux/usbdevice_fs.h b/include/uapi/linux/usbdevice_fs.h index 74a84e02422a..f5522e910329 100644 --- a/include/uapi/linux/usbdevice_fs.h +++ b/include/uapi/linux/usbdevice_fs.h @@ -227,5 +227,6 @@ struct usbdevfs_streams { #define USBDEVFS_FORBID_SUSPEND _IO('U', 33) #define USBDEVFS_ALLOW_SUSPEND _IO('U', 34) #define USBDEVFS_WAIT_FOR_RESUME _IO('U', 35) +#define USBDEVFS_GET_SSP_RATE _IO('U', 36) #endif /* _UAPI_LINUX_USBDEVICE_FS_H */ -- 2.25.1