>> Do you have a patch that does that?  It would help in analysing the issue.  
>> Something quick and dirty will do just to see.

Please refer patch below. I am not so good in gadgetFs, so just tried to hack 
this issue as per the following:

Signed-off-by: Roshan Jhalani<[email protected]>
---
 drivers/usb/gadget/composite.c |    7 +++++++
 drivers/usb/gadget/f_fs.c      |   25 +++++++++++++++++--------
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index 97633e5..8cd4022 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -1294,6 +1294,13 @@ composite_setup(struct usb_gadget *gadget, const struct 
usb_ctrlrequest *ctrl)
        req->length = 0;
        gadget->ep0->driver_data = cdev;
 
+       if (cdev->config) {
+               list_for_each_entry(f, &cdev->config->functions, list) {
+                       if (f && f->setup)
+                               value = f->setup(f, ctrl);
+               }
+       }
+
        switch (ctrl->bRequest) {
 
        /* we handle all standard USB descriptors */
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c
index bf7d627..8e2bcee 100644
--- a/drivers/usb/gadget/f_fs.c
+++ b/drivers/usb/gadget/f_fs.c
@@ -107,7 +107,10 @@ enum ffs_setup_state {
        FFS_SETUP_CANCELED
 };
 
-
+enum ffs_work_state {
+       FFS_STOP,
+       FFS_START
+};
 
 struct ffs_epfile;
 struct ffs_function;
@@ -149,6 +152,7 @@ struct ffs_data {
 
        /* EP0 state */
        enum ffs_state                  state;
+       enum ffs_work_state             work_state;
 
        /*
         * Possible transitions:
@@ -460,7 +464,8 @@ static ssize_t ffs_ep0_write(struct file *file, const char 
__user *buf,
                        ffs->state = FFS_ACTIVE;
                        mutex_unlock(&ffs->mutex);
 
-                       ret = functionfs_ready_callback(ffs);
+                       if (ffs->work_state != FFS_START)
+                               ret = functionfs_ready_callback(ffs);
                        if (unlikely(ret < 0)) {
                                ffs->state = FFS_CLOSING;
                                return ret;
@@ -1292,11 +1297,16 @@ static void ffs_data_closed(struct ffs_data *ffs)
 {
        ENTER();
 
+       if (ffs->work_state == FFS_START) {
+               atomic_dec(&ffs->opened);
+               atomic_dec(&ffs->ref);
+               ffs->state = FFS_READ_DESCRIPTORS;
+               return;
+       }
        if (atomic_dec_and_test(&ffs->opened)) {
                ffs->state = FFS_CLOSING;
                ffs_data_reset(ffs);
        }
-
        ffs_data_put(ffs);
 }
 
@@ -1311,6 +1321,7 @@ static struct ffs_data *ffs_data_new(void)
        atomic_set(&ffs->ref, 1);
        atomic_set(&ffs->opened, 0);
        ffs->state = FFS_READ_DESCRIPTORS;
+       ffs->work_state = FFS_STOP;
        mutex_init(&ffs->mutex);
        spin_lock_init(&ffs->eps_lock);
        init_waitqueue_head(&ffs->ev.waitq);
@@ -1334,6 +1345,7 @@ static void ffs_data_clear(struct ffs_data *ffs)
        if (ffs->epfiles)
                ffs_epfiles_destroy(ffs->epfiles, ffs->eps_count);
 
+       ffs->work_state = FFS_STOP;
        kfree(ffs->raw_descs);
        kfree(ffs->raw_strings);
        kfree(ffs->stringtabs);
@@ -1358,15 +1370,12 @@ static void ffs_data_reset(struct ffs_data *ffs)
        ffs->strings_count = 0;
        ffs->interfaces_count = 0;
        ffs->eps_count = 0;
-
        ffs->ev.count = 0;
 
        ffs->state = FFS_READ_DESCRIPTORS;
        ffs->setup_state = FFS_NO_SETUP;
        ffs->flags = 0;
 }
-
-
 static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev 
*cdev)
 {
        struct usb_gadget_strings **lang;
@@ -2367,8 +2376,6 @@ static int ffs_func_setup(struct usb_function *f,
         * as well (as it's straightforward) but what to do with any
         * other request?
         */
-       if (ffs->state != FFS_ACTIVE)
-               return -ENODEV;
 
        switch (creq->bRequestType & USB_RECIP_MASK) {
        case USB_RECIP_INTERFACE:
@@ -2384,6 +2391,8 @@ static int ffs_func_setup(struct usb_function *f,
                break;
 
        default:
+               ffs->work_state = FFS_START;
+               ffs->state = FFS_ACTIVE;
                return -EOPNOTSUPP;
        }
 
-- 
1.7.6 

N�����r��y����b�X��ǧv�^�)޺{.n�+����{������^n�r���z���h�����&���G���h�(�階�ݢj"���m������z�ޖ���f���h���~�m�

Reply via email to