|
@@ -1026,6 +1026,29 @@ static long ffs_epfile_ioctl(struct file *file, unsigned code,
|
|
|
case FUNCTIONFS_ENDPOINT_REVMAP:
|
|
|
ret = epfile->ep->num;
|
|
|
break;
|
|
|
+ case FUNCTIONFS_ENDPOINT_DESC:
|
|
|
+ {
|
|
|
+ int desc_idx;
|
|
|
+ struct usb_endpoint_descriptor *desc;
|
|
|
+
|
|
|
+ switch (epfile->ffs->gadget->speed) {
|
|
|
+ case USB_SPEED_SUPER:
|
|
|
+ desc_idx = 2;
|
|
|
+ break;
|
|
|
+ case USB_SPEED_HIGH:
|
|
|
+ desc_idx = 1;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ desc_idx = 0;
|
|
|
+ }
|
|
|
+ desc = epfile->ep->descs[desc_idx];
|
|
|
+
|
|
|
+ spin_unlock_irq(&epfile->ffs->eps_lock);
|
|
|
+ ret = copy_to_user((void *)value, desc, sizeof(*desc));
|
|
|
+ if (ret)
|
|
|
+ ret = -EFAULT;
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
default:
|
|
|
ret = -ENOTTY;
|
|
|
}
|