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

Commit 21f76b3f authored by Mayank Rana's avatar Mayank Rana Committed by Jack Pham
Browse files

dwc3: Add ipc debug log for USB GSI and USB endpoint operation



There are some of issue reported where USB controller is accessing
0x00 which may happen when different commands are colliding to
configure USB controller and USB GSI wrapper. This change captures
USB GSI and USB endpoint operation specifically end transfer.

Change-Id: Ie4d428596e9c8200258ce95e95dd587dd943c2d2
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent 44a5110a
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -173,6 +173,13 @@ static const struct usb_irq usb_irq_info[USB_MAX_IRQ] = {
	{"ss_phy_irq", 0},
};

static const char * const gsi_op_strings[] = {
	"EP_CONFIG", "START_XFER", "STORE_DBL_INFO",
	"ENABLE_GSI", "UPDATE_XFER", "RING_DB",
	"END_XFER", "GET_CH_INFO", "PREPARE_TRBS",
	"FREE_TRBS", "SET_CLR_BLOCK_DBL", "CHECK_FOR_SUSP",
	"EP_DISABLE" };

struct dwc3_msm;

struct extcon_nb {
@@ -1368,6 +1375,13 @@ static bool gsi_check_ready_to_suspend(struct usb_ep *ep, bool f_suspend)
	return true;
}

static inline const char *gsi_op_to_string(unsigned int op)
{
	if (op < ARRAY_SIZE(gsi_op_strings))
		return gsi_op_strings[op];

	return "Invalid";
}

/**
 * Performs GSI operations or GSI EP related operations.
@@ -1391,41 +1405,36 @@ static int dwc3_msm_gsi_ep_op(struct usb_ep *ep,
	bool block_db, f_suspend;
	unsigned long flags;

	dbg_log_string("%s(%d):%s", ep->name, ep->ep_num, gsi_op_to_string(op));

	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);
		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);
		request = (struct usb_gsi_request *)op_data;
		gsi_free_trbs(ep, request);
		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);
		spin_lock_irqsave(&dwc->lock, flags);
		gsi_configure_ep(ep, request);
		spin_unlock_irqrestore(&dwc->lock, flags);
		break;
	case GSI_EP_OP_STARTXFER:
		dev_dbg(mdwc->dev, "EP_OP_STARTXFER for %s\n", ep->name);
		spin_lock_irqsave(&dwc->lock, flags);
		ret = gsi_startxfer_for_ep(ep);
		spin_unlock_irqrestore(&dwc->lock, flags);
		break;
	case GSI_EP_OP_GET_XFER_IDX:
		dev_dbg(mdwc->dev, "EP_OP_GET_XFER_IDX for %s\n", 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");
		request = (struct usb_gsi_request *)op_data;
		gsi_store_ringbase_dbl_info(ep, request);
		break;
	case GSI_EP_OP_ENABLE_GSI:
		dev_dbg(mdwc->dev, "EP_OP_ENABLE_GSI\n");
		gsi_enable(ep);
		break;
	case GSI_EP_OP_GET_CH_INFO:
@@ -1434,36 +1443,29 @@ static int dwc3_msm_gsi_ep_op(struct usb_ep *ep,
		break;
	case GSI_EP_OP_RING_DB:
		request = (struct usb_gsi_request *)op_data;
		dbg_print(0xFF, "RING_DB", 0, ep->name);
		gsi_ring_db(ep, request);
		break;
	case GSI_EP_OP_UPDATEXFER:
		request = (struct usb_gsi_request *)op_data;
		dev_dbg(mdwc->dev, "EP_OP_UPDATEXFER\n");
		spin_lock_irqsave(&dwc->lock, flags);
		ret = gsi_updatexfer_for_ep(ep, request);
		spin_unlock_irqrestore(&dwc->lock, flags);
		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);
		spin_lock_irqsave(&dwc->lock, flags);
		gsi_endxfer_for_ep(ep);
		spin_unlock_irqrestore(&dwc->lock, flags);
		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);
		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");
		f_suspend = *((bool *)op_data);
		ret = gsi_check_ready_to_suspend(ep, f_suspend);
		break;
	case GSI_EP_OP_DISABLE:
		dev_dbg(mdwc->dev, "EP_OP_DISABLE\n");
		ret = ep->ops->disable(ep);
		break;
	default:
+6 −0
Original line number Diff line number Diff line
@@ -824,6 +824,7 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
{
	struct dwc3_request		*req;

	dbg_log_string("START for %s(%d)", dep->name, dep->number);
	dwc3_stop_active_transfer(dwc, dep->number, true);

	/* - giveback all requests to gadget driver */
@@ -838,12 +839,14 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)

		dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
	}
	dbg_log_string("DONE for %s(%d)", dep->name, dep->number);
}

static void dwc3_stop_active_transfers(struct dwc3 *dwc)
{
	u32 epnum;

	dbg_log_string("START");
	for (epnum = 2; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
		struct dwc3_ep *dep;

@@ -860,6 +863,7 @@ static void dwc3_stop_active_transfers(struct dwc3 *dwc)

		dwc3_remove_requests(dwc, dep);
	}
	dbg_log_string("DONE");
}

/**
@@ -3073,6 +3077,8 @@ void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force)
			dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
		udelay(100);
	}
	dbg_log_string("%s(%d): endxfer ret:%d)",
			dep->name, dep->number, ret);
}

static void dwc3_clear_stall_all_ep(struct dwc3 *dwc)