Loading drivers/usb/gadget/function/f_gsi.c +32 −25 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ struct usb_gsi_debugfs { static struct usb_gsi_debugfs debugfs; static void gsi_rndis_ipa_reset_trigger(void); static void ipa_disconnect_handler(struct gsi_data_port *d_port); static int gsi_ctrl_send_notification(struct f_gsi *gsi); static int gsi_alloc_trb_buffer(struct f_gsi *gsi); Loading Loading @@ -912,12 +913,10 @@ static void ipa_disconnect_handler(struct gsi_data_port *d_port) */ usb_gsi_ep_op(d_port->in_ep, (void *)&block_db, GSI_EP_OP_SET_CLR_BLOCK_DBL); gsi->in_ep_desc_backup = gsi->d_port.in_ep->desc; usb_ep_disable(gsi->d_port.in_ep); } if (gsi->d_port.out_ep) { gsi->out_ep_desc_backup = gsi->d_port.out_ep->desc; usb_ep_disable(gsi->d_port.out_ep); } Loading Loading @@ -1026,6 +1025,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); Loading Loading @@ -1088,28 +1088,6 @@ static void ipa_work_handler(struct work_struct *w) break; } /* * Update desc and reconfigure USB GSI OUT and IN * endpoint for RNDIS Adaptor enable case. */ if (d_port->out_ep && !d_port->out_ep->desc && gsi->out_ep_desc_backup) { d_port->out_ep->desc = gsi->out_ep_desc_backup; d_port->out_ep->ep_intr_num = 1; log_event_dbg("%s: OUT ep_op_config", __func__); usb_gsi_ep_op(d_port->out_ep, &d_port->out_request, GSI_EP_OP_CONFIG); } if (d_port->in_ep && !d_port->in_ep->desc && gsi->in_ep_desc_backup) { d_port->in_ep->desc = gsi->in_ep_desc_backup; d_port->in_ep->ep_intr_num = 2; log_event_dbg("%s: IN ep_op_config", __func__); usb_gsi_ep_op(d_port->in_ep, &d_port->in_request, GSI_EP_OP_CONFIG); } ipa_connect_channels(d_port); ipa_data_path_enable(d_port); d_port->sm_state = STATE_CONNECTED; Loading Loading @@ -1171,7 +1149,15 @@ static void ipa_work_handler(struct work_struct *w) if (event == EVT_HOST_NRDY) { log_event_dbg("%s: ST_CON_HOST_NRDY\n", __func__); ipa_disconnect_handler(d_port); 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(); 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); Loading Loading @@ -1785,6 +1771,27 @@ static void gsi_rndis_open(struct f_gsi *rndis) rndis_signal_connect(rndis->config); } static void gsi_rndis_ipa_reset_trigger(void) { struct f_gsi *rndis = gsi_prot_ctx[IPA_USB_RNDIS]; unsigned long flags; if (!rndis) { log_event_err("%s: gsi prot ctx is %pK", __func__, rndis); return; } spin_lock_irqsave(&rndis->d_port.lock, flags); if (!rndis) { log_event_err("%s: No RNDIS instance", __func__); spin_unlock_irqrestore(&rndis->d_port.lock, flags); return; } rndis->d_port.net_ready_trigger = false; spin_unlock_irqrestore(&rndis->d_port.lock, flags); } void gsi_rndis_flow_ctrl_enable(bool enable) { struct f_gsi *rndis = gsi_prot_ctx[IPA_USB_RNDIS]; Loading Loading
drivers/usb/gadget/function/f_gsi.c +32 −25 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ struct usb_gsi_debugfs { static struct usb_gsi_debugfs debugfs; static void gsi_rndis_ipa_reset_trigger(void); static void ipa_disconnect_handler(struct gsi_data_port *d_port); static int gsi_ctrl_send_notification(struct f_gsi *gsi); static int gsi_alloc_trb_buffer(struct f_gsi *gsi); Loading Loading @@ -912,12 +913,10 @@ static void ipa_disconnect_handler(struct gsi_data_port *d_port) */ usb_gsi_ep_op(d_port->in_ep, (void *)&block_db, GSI_EP_OP_SET_CLR_BLOCK_DBL); gsi->in_ep_desc_backup = gsi->d_port.in_ep->desc; usb_ep_disable(gsi->d_port.in_ep); } if (gsi->d_port.out_ep) { gsi->out_ep_desc_backup = gsi->d_port.out_ep->desc; usb_ep_disable(gsi->d_port.out_ep); } Loading Loading @@ -1026,6 +1025,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); Loading Loading @@ -1088,28 +1088,6 @@ static void ipa_work_handler(struct work_struct *w) break; } /* * Update desc and reconfigure USB GSI OUT and IN * endpoint for RNDIS Adaptor enable case. */ if (d_port->out_ep && !d_port->out_ep->desc && gsi->out_ep_desc_backup) { d_port->out_ep->desc = gsi->out_ep_desc_backup; d_port->out_ep->ep_intr_num = 1; log_event_dbg("%s: OUT ep_op_config", __func__); usb_gsi_ep_op(d_port->out_ep, &d_port->out_request, GSI_EP_OP_CONFIG); } if (d_port->in_ep && !d_port->in_ep->desc && gsi->in_ep_desc_backup) { d_port->in_ep->desc = gsi->in_ep_desc_backup; d_port->in_ep->ep_intr_num = 2; log_event_dbg("%s: IN ep_op_config", __func__); usb_gsi_ep_op(d_port->in_ep, &d_port->in_request, GSI_EP_OP_CONFIG); } ipa_connect_channels(d_port); ipa_data_path_enable(d_port); d_port->sm_state = STATE_CONNECTED; Loading Loading @@ -1171,7 +1149,15 @@ static void ipa_work_handler(struct work_struct *w) if (event == EVT_HOST_NRDY) { log_event_dbg("%s: ST_CON_HOST_NRDY\n", __func__); ipa_disconnect_handler(d_port); 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(); 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); Loading Loading @@ -1785,6 +1771,27 @@ static void gsi_rndis_open(struct f_gsi *rndis) rndis_signal_connect(rndis->config); } static void gsi_rndis_ipa_reset_trigger(void) { struct f_gsi *rndis = gsi_prot_ctx[IPA_USB_RNDIS]; unsigned long flags; if (!rndis) { log_event_err("%s: gsi prot ctx is %pK", __func__, rndis); return; } spin_lock_irqsave(&rndis->d_port.lock, flags); if (!rndis) { log_event_err("%s: No RNDIS instance", __func__); spin_unlock_irqrestore(&rndis->d_port.lock, flags); return; } rndis->d_port.net_ready_trigger = false; spin_unlock_irqrestore(&rndis->d_port.lock, flags); } void gsi_rndis_flow_ctrl_enable(bool enable) { struct f_gsi *rndis = gsi_prot_ctx[IPA_USB_RNDIS]; Loading