Merge "usb: gadget: gsi: Fix handling of MSG PACKET FILTER"
This commit is contained in:
commit
66d38bc53c
1 changed files with 28 additions and 7 deletions
|
@ -36,6 +36,7 @@ MODULE_PARM_DESC(num_out_bufs,
|
||||||
|
|
||||||
static struct workqueue_struct *ipa_usb_wq;
|
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 void ipa_disconnect_handler(struct gsi_data_port *d_port);
|
||||||
static int gsi_ctrl_send_notification(struct f_gsi *gsi,
|
static int gsi_ctrl_send_notification(struct f_gsi *gsi,
|
||||||
enum gsi_ctrl_notify_state);
|
enum gsi_ctrl_notify_state);
|
||||||
|
@ -553,6 +554,7 @@ static void ipa_work_handler(struct work_struct *w)
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct device *gad_dev;
|
struct device *gad_dev;
|
||||||
struct f_gsi *gsi;
|
struct f_gsi *gsi;
|
||||||
|
bool block_db;
|
||||||
|
|
||||||
event = read_event(d_port);
|
event = read_event(d_port);
|
||||||
|
|
||||||
|
@ -665,7 +667,27 @@ static void ipa_work_handler(struct work_struct *w)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STATE_CONNECTED:
|
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);
|
ipa_disconnect_work_handler(d_port);
|
||||||
d_port->sm_state = STATE_INITIALIZED;
|
d_port->sm_state = STATE_INITIALIZED;
|
||||||
usb_gadget_autopm_put_async(d_port->gadget);
|
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);
|
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;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -1301,12 +1323,11 @@ void gsi_rndis_flow_ctrl_enable(bool enable, struct rndis_params *param)
|
||||||
|
|
||||||
d_port = &rndis->d_port;
|
d_port = &rndis->d_port;
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
gsi_rndis_ipa_reset_trigger(rndis);
|
log_event_dbg("%s: posting HOST_NRDY\n", __func__);
|
||||||
usb_gsi_ep_op(d_port->in_ep, NULL, GSI_EP_OP_ENDXFER);
|
post_event(d_port, EVT_HOST_NRDY);
|
||||||
usb_gsi_ep_op(d_port->out_ep, NULL, GSI_EP_OP_ENDXFER);
|
|
||||||
post_event(d_port, EVT_DISCONNECTED);
|
|
||||||
} else {
|
} else {
|
||||||
|
log_event_dbg("%s: posting HOST_READY\n", __func__);
|
||||||
post_event(d_port, EVT_HOST_READY);
|
post_event(d_port, EVT_HOST_READY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue