Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3044d3fa authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: gsi: Don't disable endpoints as part of flow control"

parents c97f5cfd 28e05be3
Loading
Loading
Loading
Loading
+32 −25
Original line number Diff line number Diff line
@@ -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);
@@ -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);
	}

@@ -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);

@@ -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;
@@ -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);
@@ -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];