summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/composite.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/composite.c')
-rw-r--r--drivers/usb/gadget/composite.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index ebb5131a9c..64964360c7 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -773,6 +773,33 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
if (value >= 0)
value = min(w_length, (u16) value);
break;
+
+#ifdef CONFIG_DFU_FUNCTION
+ /* DFU is mighty weird */
+ case DFU_DT_FUNC:
+ w_value &= 0xff;
+ list_for_each_entry(c, &cdev->configs, list) {
+ if (w_value != 0) {
+ w_value--;
+ continue;
+ }
+
+ list_for_each_entry(f, &c->functions, list) {
+
+ /* DFU function only */
+ if (strcmp(f->name, "dfu") != 0)
+ continue;
+
+ value = f->setup(f, ctrl);
+ goto dfu_func_done;
+ }
+ }
+dfu_func_done:
+ if (value >= 0)
+ value = min(w_length, (u16) value);
+ break;
+#endif
+
default:
goto unknown;
}