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

Commit 8432c361 authored by Mayank Rana's avatar Mayank Rana
Browse files

dwc3-msm: Acquire lock for USB GSI endpoint related operations



There is possibility where any control request for USB GSI endpint
e.g. CLEAR_FEATURE racing against USB GSI endpoint operation. Hence
acquire lock for USB GSI endpoint related operations which involves
sending required USB commands for the endpoint operation.

Change-Id: If14af809c443e12bd64e54910602c4aeeca4f0df
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent f8ebb7f2
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1245,6 +1245,7 @@ static int dwc3_msm_gsi_ep_op(struct usb_ep *ep,
	struct usb_gsi_request *request;
	struct gsi_channel_info *ch_info;
	bool block_db, f_suspend;
	unsigned long flags;

	switch (op) {
	case GSI_EP_OP_PREPARE_TRBS:
@@ -1259,11 +1260,15 @@ static int dwc3_msm_gsi_ep_op(struct usb_ep *ep,
	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);
@@ -1289,12 +1294,16 @@ static int dwc3_msm_gsi_ep_op(struct usb_ep *ep,
	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);