OSDN Git Service

usb: gadget: f_gsi: Call ipa_usb_init_teth_prot() from gsi_bind
authorHemant Kumar <hemantk@codeaurora.org>
Thu, 5 May 2016 04:23:59 +0000 (21:23 -0700)
committerJeevan Shriram <jshriram@codeaurora.org>
Thu, 12 May 2016 00:44:01 +0000 (17:44 -0700)
Currently ipa_usb_init_teth_prot() is called before gsi_bind()
gets called as a result of usb_add_function() call. gsi_bind()
is polulating ipa_init_params which is passed to
ipa_usb_init_teth_prot(). Since usb_add_function() is getting
called later after gsi_bind_config() returns, ipa_init_params
remains unpopulated and results into ipa_usb_init_teth_prot()
returning failure. Fix this issue by moving the call to
gsi_bind(). This also matches to ipa_usb_deinit_teth_prot()
call in gsi_unbind().

CRs-Fixed: 1013830
Change-Id: I824d3fa62e2736962680ae1c883b9a2916346331
Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
drivers/usb/gadget/function/f_gsi.c

index 5a1de1f..1cb5d94 100644 (file)
@@ -2252,6 +2252,16 @@ fail:
        return -ENOMEM;
 }
 
+static void ipa_ready_callback(void *user_data)
+{
+       struct f_gsi *gsi = user_data;
+
+       log_event_info("%s: ipa is ready\n", __func__);
+
+       gsi->d_port.ipa_ready = true;
+       wake_up_interruptible(&gsi->d_port.wait_for_ipa_ready);
+}
+
 static int gsi_bind(struct usb_configuration *c, struct usb_function *f)
 {
        struct usb_composite_dev *cdev = c->cdev;
@@ -2489,6 +2499,29 @@ static int gsi_bind(struct usb_configuration *c, struct usb_function *f)
        if (status)
                goto dereg_rndis;
 
+       status = ipa_register_ipa_ready_cb(ipa_ready_callback, gsi);
+       if (!status) {
+               log_event_info("%s: ipa is not ready", __func__);
+               status = wait_event_interruptible_timeout(
+                       gsi->d_port.wait_for_ipa_ready, gsi->d_port.ipa_ready,
+                       msecs_to_jiffies(GSI_IPA_READY_TIMEOUT));
+               if (!status) {
+                       log_event_err("%s: ipa ready timeout", __func__);
+                       status = -ETIMEDOUT;
+                       goto dereg_rndis;
+               }
+       }
+
+       gsi->d_port.ipa_usb_notify_cb = ipa_usb_notify_cb;
+       status = ipa_usb_init_teth_prot(gsi->prot_id,
+               &gsi->d_port.ipa_init_params, gsi->d_port.ipa_usb_notify_cb,
+               gsi);
+       if (status) {
+               log_event_err("%s: failed to init teth prot %d",
+                                               __func__, gsi->prot_id);
+               goto dereg_rndis;
+       }
+
        post_event(&gsi->d_port, EVT_INITIALIZED);
        queue_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w);
 
@@ -2552,15 +2585,6 @@ static void gsi_unbind(struct usb_configuration *c, struct usb_function *f)
                gsi->d_port.in_request.dma);
 }
 
-static void ipa_ready_callback(void *user_data)
-{
-       struct f_gsi *gsi = user_data;
-
-       log_event_info("%s: ipa is ready\n", __func__);
-
-       gsi->d_port.ipa_ready = true;
-       wake_up_interruptible(&gsi->d_port.wait_for_ipa_ready);
-}
 
 static void gsi_free_func(struct usb_function *f)
 {
@@ -2614,28 +2638,6 @@ int gsi_bind_config(struct f_gsi *gsi)
 
        INIT_WORK(&gsi->d_port.usb_ipa_w, ipa_work_handler);
 
-       status = ipa_register_ipa_ready_cb(ipa_ready_callback, gsi);
-       if (!status) {
-               log_event_info("%s: ipa is not ready", __func__);
-               status = wait_event_interruptible_timeout(
-                       gsi->d_port.wait_for_ipa_ready, gsi->d_port.ipa_ready,
-                       msecs_to_jiffies(GSI_IPA_READY_TIMEOUT));
-               if (!status) {
-                       log_event_err("%s: ipa ready timeout", __func__);
-                       return -ETIMEDOUT;
-               }
-       }
-
-       gsi->d_port.ipa_usb_notify_cb = ipa_usb_notify_cb;
-       status = ipa_usb_init_teth_prot(prot_id,
-               &gsi->d_port.ipa_init_params, gsi->d_port.ipa_usb_notify_cb,
-               gsi);
-       if (status) {
-               log_event_err("%s: failed to init teth prot %d",
-                                               __func__, prot_id);
-               return status;
-       }
-
        return status;
 }