usb: gadget: f_mass_storage: Make us pass USBCV MSC Compliance tests
[pandora-kernel.git] / drivers / usb / gadget / f_mass_storage.c
index 01ae27b..ad96be8 100644 (file)
@@ -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) {