|
@@ -347,6 +347,7 @@ struct fsg_operations {
|
|
|
/* Data shared by all the FSG instances. */
|
|
|
struct fsg_common {
|
|
|
struct usb_gadget *gadget;
|
|
|
+ struct usb_composite_dev *cdev;
|
|
|
struct fsg_dev *fsg, *new_fsg;
|
|
|
wait_queue_head_t fsg_wait;
|
|
|
|
|
@@ -2441,7 +2442,7 @@ static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
|
|
|
struct fsg_dev *fsg = fsg_from_func(f);
|
|
|
fsg->common->new_fsg = fsg;
|
|
|
raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);
|
|
|
- return 0;
|
|
|
+ return USB_GADGET_DELAYED_STATUS;
|
|
|
}
|
|
|
|
|
|
static void fsg_disable(struct usb_function *f)
|
|
@@ -2577,6 +2578,8 @@ static void handle_exception(struct fsg_common *common)
|
|
|
|
|
|
case FSG_STATE_CONFIG_CHANGE:
|
|
|
do_set_interface(common, common->new_fsg);
|
|
|
+ if (common->new_fsg)
|
|
|
+ usb_composite_setup_continue(common->cdev);
|
|
|
break;
|
|
|
|
|
|
case FSG_STATE_EXIT:
|
|
@@ -2747,6 +2750,7 @@ static struct fsg_common *fsg_common_init(struct fsg_common *common,
|
|
|
common->gadget = gadget;
|
|
|
common->ep0 = gadget->ep0;
|
|
|
common->ep0req = cdev->req;
|
|
|
+ common->cdev = cdev;
|
|
|
|
|
|
/* Maybe allocate device-global string IDs, and patch descriptors */
|
|
|
if (fsg_strings[FSG_STRING_INTERFACE].id == 0) {
|