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: Mayank Rana <mrana@codeaurora.org>
This commit is contained in:
parent
0b3886773c
commit
79bed203c1
1 changed files with 9 additions and 0 deletions
|
@ -1249,6 +1249,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:
|
||||
|
@ -1263,11 +1264,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);
|
||||
|
@ -1293,12 +1298,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);
|
||||
|
|
Loading…
Add table
Reference in a new issue