summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-09-08 20:01:16 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-09-08 20:01:16 -0700
commit66d38bc53c86d1d4fdebdcceb87b0f02dc5b31a1 (patch)
treeee8390d188e2561a903ad9124a1ffa3e171135b7 /drivers/usb
parentcab620ee7a83b655d5d5f892b9f2487c07d4a4c4 (diff)
parent68d1e48464521395f438053c1ff6d0b48962d719 (diff)
Merge "usb: gadget: gsi: Fix handling of MSG PACKET FILTER"
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/gadget/function/f_gsi.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c
index 206192ff99bb..80c9928e948e 100644
--- a/drivers/usb/gadget/function/f_gsi.c
+++ b/drivers/usb/gadget/function/f_gsi.c
@@ -36,6 +36,7 @@ MODULE_PARM_DESC(num_out_bufs,
static struct workqueue_struct *ipa_usb_wq;
+static void gsi_rndis_ipa_reset_trigger(struct f_gsi *rndis);
static void ipa_disconnect_handler(struct gsi_data_port *d_port);
static int gsi_ctrl_send_notification(struct f_gsi *gsi,
enum gsi_ctrl_notify_state);
@@ -553,6 +554,7 @@ static void ipa_work_handler(struct work_struct *w)
struct device *dev;
struct device *gad_dev;
struct f_gsi *gsi;
+ bool block_db;
event = read_event(d_port);
@@ -665,7 +667,27 @@ static void ipa_work_handler(struct work_struct *w)
}
break;
case STATE_CONNECTED:
- if (event == EVT_DISCONNECTED) {
+ if (event == EVT_DISCONNECTED || event == EVT_HOST_NRDY) {
+ if (peek_event(d_port) == EVT_HOST_READY) {
+ read_event(d_port);
+ log_event_dbg("%s: NO_OP NRDY_RDY", __func__);
+ break;
+ }
+
+ if (event == EVT_HOST_NRDY) {
+ log_event_dbg("%s: ST_CON_HOST_NRDY\n",
+ __func__);
+ block_db = true;
+ /* stop USB ringing doorbell to GSI(OUT_EP) */
+ usb_gsi_ep_op(d_port->in_ep, (void *)&block_db,
+ GSI_EP_OP_SET_CLR_BLOCK_DBL);
+ gsi_rndis_ipa_reset_trigger(gsi);
+ usb_gsi_ep_op(d_port->in_ep, NULL,
+ GSI_EP_OP_ENDXFER);
+ usb_gsi_ep_op(d_port->out_ep, NULL,
+ GSI_EP_OP_ENDXFER);
+ }
+
ipa_disconnect_work_handler(d_port);
d_port->sm_state = STATE_INITIALIZED;
usb_gadget_autopm_put_async(d_port->gadget);
@@ -1269,7 +1291,7 @@ static void gsi_rndis_open(struct f_gsi *rndis)
rndis_signal_connect(rndis->params);
}
-void gsi_rndis_ipa_reset_trigger(struct f_gsi *rndis)
+static void gsi_rndis_ipa_reset_trigger(struct f_gsi *rndis)
{
unsigned long flags;
@@ -1301,12 +1323,11 @@ void gsi_rndis_flow_ctrl_enable(bool enable, struct rndis_params *param)
d_port = &rndis->d_port;
- if (enable) {
- gsi_rndis_ipa_reset_trigger(rndis);
- usb_gsi_ep_op(d_port->in_ep, NULL, GSI_EP_OP_ENDXFER);
- usb_gsi_ep_op(d_port->out_ep, NULL, GSI_EP_OP_ENDXFER);
- post_event(d_port, EVT_DISCONNECTED);
+ if (enable) {
+ log_event_dbg("%s: posting HOST_NRDY\n", __func__);
+ post_event(d_port, EVT_HOST_NRDY);
} else {
+ log_event_dbg("%s: posting HOST_READY\n", __func__);
post_event(d_port, EVT_HOST_READY);
}