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

Commit 91ee76c3 authored by Mayank Rana's avatar Mayank Rana
Browse files

usb: gsi: Capture USB GSI endpoint operations



In some cases it has been observed that after sending STARTXFER
command with USB GSI IN endpoint, USB controller is accessing zero
address resulting into bus error. This change captures USB GSI
operation sequence in debug buffer which may help to understand
race condition in terms of USB gadget events and USB GSI endpoint
operations.

Change-Id: Ia46877bb92ea0cc1d5f3712e5c70bb44232d5cfe
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent ea4d257a
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -1281,61 +1281,61 @@ static int dwc3_msm_gsi_ep_op(struct usb_ep *ep,
	switch (op) {
	case GSI_EP_OP_PREPARE_TRBS:
		request = (struct usb_gsi_request *)op_data;
		dev_dbg(mdwc->dev, "EP_OP_PREPARE_TRBS for %s\n", ep->name);
		dbg_print(0xFF, "PREPARE_TRB", 0, ep->name);
		ret = gsi_prepare_trbs(ep, request);
		break;
	case GSI_EP_OP_FREE_TRBS:
		dev_dbg(mdwc->dev, "EP_OP_FREE_TRBS for %s\n", ep->name);
		dbg_print(0xFF, "FREE_TRB", 0, ep->name);
		gsi_free_trbs(ep);
		break;
	case GSI_EP_OP_CONFIG:
		request = (struct usb_gsi_request *)op_data;
		dev_dbg(mdwc->dev, "EP_OP_CONFIG for %s\n", ep->name);
		dbg_print(0xFF, "EP_CONFIG", 0, ep->name);
		gsi_configure_ep(ep, request);
		break;
	case GSI_EP_OP_STARTXFER:
		dev_dbg(mdwc->dev, "EP_OP_STARTXFER for %s\n", ep->name);
		dbg_print(0xFF, "EP_STARTXFER", 0, ep->name);
		ret = gsi_startxfer_for_ep(ep);
		break;
	case GSI_EP_OP_GET_XFER_IDX:
		dev_dbg(mdwc->dev, "EP_OP_GET_XFER_IDX for %s\n", ep->name);
		dbg_print(0xFF, "EP_GETXFERID", 0, ep->name);
		ret = gsi_get_xfer_index(ep);
		break;
	case GSI_EP_OP_STORE_DBL_INFO:
		dev_dbg(mdwc->dev, "EP_OP_STORE_DBL_INFO\n");
		dbg_print(0xFF, "EP_STRDBL", 0, ep->name);
		gsi_store_ringbase_dbl_info(ep, *((u32 *)op_data));
		break;
	case GSI_EP_OP_ENABLE_GSI:
		dev_dbg(mdwc->dev, "EP_OP_ENABLE_GSI\n");
		dbg_print(0xFF, "ENABLE_GSI", 0, ep->name);
		gsi_enable(ep);
		break;
	case GSI_EP_OP_GET_CH_INFO:
		ch_info = (struct gsi_channel_info *)op_data;
		dbg_print(0xFF, "GET_CH_INFO", 0, ep->name);
		gsi_get_channel_info(ep, ch_info);
		break;
	case GSI_EP_OP_RING_IN_DB:
		request = (struct usb_gsi_request *)op_data;
		dev_dbg(mdwc->dev, "RING IN EP DB\n");
		dbg_print(0xFF, "RING_IN_DB", 0, ep->name);
		gsi_ring_in_db(ep, request);
		break;
	case GSI_EP_OP_UPDATEXFER:
		request = (struct usb_gsi_request *)op_data;
		dev_dbg(mdwc->dev, "EP_OP_UPDATEXFER\n");
		dbg_print(0xFF, "EP_UPDATEXFER", 0, ep->name);
		ret = gsi_updatexfer_for_ep(ep, request);
		break;
	case GSI_EP_OP_ENDXFER:
		request = (struct usb_gsi_request *)op_data;
		dev_dbg(mdwc->dev, "EP_OP_ENDXFER for %s\n", ep->name);
		dbg_print(0xFF, "EP_ENDXFER", 0, ep->name);
		gsi_endxfer_for_ep(ep);
		break;
	case GSI_EP_OP_SET_CLR_BLOCK_DBL:
		block_db = *((bool *)op_data);
		dev_dbg(mdwc->dev, "EP_OP_SET_CLR_BLOCK_DBL %d\n",
						block_db);
		dbg_print(0xFF, "CLR_BLK_DBL", block_db, ep->name);
		gsi_set_clear_dbell(ep, block_db);
		break;
	case GSI_EP_OP_CHECK_FOR_SUSPEND:
		dev_dbg(mdwc->dev, "EP_OP_CHECK_FOR_SUSPEND\n");
		dbg_print(0xFF, "CHK_SUSPEND", 0, ep->name);
		f_suspend = *((bool *)op_data);
		ret = gsi_check_ready_to_suspend(ep, f_suspend);
		break;
+5 −1
Original line number Diff line number Diff line
@@ -635,6 +635,7 @@ static int ipa_connect_channels(struct gsi_data_port *d_port)
	struct ipa_req_chan_out_params ipa_in_channel_out_params;
	struct ipa_req_chan_out_params ipa_out_channel_out_params;

	log_event_dbg("%s: USB GSI IN OPS", __func__);
	usb_gsi_ep_op(d_port->in_ep, &d_port->in_request,
		GSI_EP_OP_PREPARE_TRBS);
	usb_gsi_ep_op(d_port->in_ep, &d_port->in_request,
@@ -646,6 +647,8 @@ static int ipa_connect_channels(struct gsi_data_port *d_port)
	gsi_channel_info.ch_req = &d_port->in_request;
	usb_gsi_ep_op(d_port->in_ep, (void *)&gsi_channel_info,
			GSI_EP_OP_GET_CH_INFO);

	log_event_dbg("%s: USB GSI IN OPS Completed", __func__);
	in_params->client =
		(gsi->prot_id != IPA_USB_DIAG) ? IPA_CLIENT_USB_CONS :
						IPA_CLIENT_USB_DPL_CONS;
@@ -674,6 +677,7 @@ static int ipa_connect_channels(struct gsi_data_port *d_port)
		gsi_channel_info.depcmd_hi_addr;

	if (d_port->out_ep) {
		log_event_dbg("%s: USB GSI OUT OPS", __func__);
		usb_gsi_ep_op(d_port->out_ep, &d_port->out_request,
			GSI_EP_OP_PREPARE_TRBS);
		usb_gsi_ep_op(d_port->out_ep, &d_port->out_request,
@@ -685,7 +689,7 @@ static int ipa_connect_channels(struct gsi_data_port *d_port)
		gsi_channel_info.ch_req = &d_port->out_request;
		usb_gsi_ep_op(d_port->out_ep, (void *)&gsi_channel_info,
				GSI_EP_OP_GET_CH_INFO);

		log_event_dbg("%s: USB GSI OUT OPS Completed", __func__);
		out_params->client = IPA_CLIENT_USB_PROD;
		out_params->ipa_ep_cfg.mode.mode = IPA_BASIC;
		out_params->teth_prot = gsi->prot_id;