summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMayank Rana <mrana@codeaurora.org>2016-08-17 15:54:54 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-23 10:50:58 -0700
commit9765c216c7c7e9672e3b9c997850b68e514fefce (patch)
tree9cdeefbba67fc5e3658a46dc6cbcb031d3280d55
parentc605e110ab18604981481a7b502da54640b620bc (diff)
usb: gadget: gsi: Handle EVT_HOST_READY event in STATE_INITIALIZED state
'commit 5b42bd749e8c ("usb: gadget: gsi: Optimize TRB's buffer allocation functionality")' removed handling of EVT_HOST_READY event with state STATE_INITIALIZED to optimized USB GSI state machine. This handling is required for specifically when RNDIS interface is being enabled through device manager, otherwise RNDIS interface doesn't get private IP address back. Fix this issue by adding back handling of EVT_HOST_READY event with state STATE_INITIALIZED. CRs-Fixed: 1050838 Change-Id: I7010005b37b4709f54de58d52a56cb7f5e88bd08 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
-rw-r--r--drivers/usb/gadget/function/f_gsi.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c
index a629723d19cb..b953c6489999 100644
--- a/drivers/usb/gadget/function/f_gsi.c
+++ b/drivers/usb/gadget/function/f_gsi.c
@@ -593,6 +593,31 @@ static void ipa_work_handler(struct work_struct *w)
d_port->sm_state = STATE_CONNECT_IN_PROGRESS;
log_event_dbg("%s: ST_INIT_EVT_CONN_IN_PROG",
__func__);
+ } else if (event == EVT_HOST_READY) {
+ /*
+ * When in a composition such as RNDIS + ADB,
+ * RNDIS host sends a GEN_CURRENT_PACKET_FILTER msg
+ * to enable/disable flow control eg. during RNDIS
+ * adaptor disable/enable from device manager.
+ * In the case of the msg to disable flow control,
+ * connect IPA channels and enable data path.
+ * EVT_HOST_READY is posted to the state machine
+ * in the handler for this msg.
+ */
+ usb_gadget_autopm_get(d_port->gadget);
+ log_event_dbg("%s: get = %d", __func__,
+ atomic_read(&gad_dev->power.usage_count));
+ /* allocate buffers used with each TRB */
+ ret = gsi_alloc_trb_buffer(gsi);
+ if (ret) {
+ log_event_err("%s: gsi_alloc_trb_failed\n",
+ __func__);
+ break;
+ }
+ ipa_connect_channels(d_port);
+ ipa_data_path_enable(d_port);
+ d_port->sm_state = STATE_CONNECTED;
+ log_event_dbg("%s: ST_INIT_EVT_HOST_READY", __func__);
}
break;
case STATE_CONNECT_IN_PROGRESS: