From: Zhuang Jin Can <jin.can.zhuang@intel.com>
To: Felipe Balbi <balbi@ti.com>
Cc: linux-usb@vger.kernel.org, linux-omap@vger.kernel.org,
linux-kernel@vger.kernel.org, liping.zhou@intel.com,
david.a.cohen@linux.intel.com
Subject: [PATCH] usb: dwc3: ep0: fix delayed status is queued too early
Date: Wed, 7 May 2014 17:53:44 -0400 [thread overview]
Message-ID: <20140507215344.GH19925@intel.com> (raw)
A delayed status request may be queued before composite framework returns
USB_GADGET_DELAYED_STATUS, because the thread queueing the request can run
on a different core in parallel with the control request irq.
SETUP XferComplete IRQ fsg_main_thread
---------------------- ---------------
| |
spin_lock_irqsave(&dwc->lock) sleeping
| |
... ...
dwc3_ep0_inspect_setup() |
| |
dwc3_ep0_delegate_req() |
| |
... |
spin_unlock(&dwc->lock); |
| |
fsg_set_alt() ======> Signal Wakeup ====> |
| |
other gadgets->set_alt() handle exception
| |
| usb_composite_setup_continue()
| |
| spin_lock_irqsave(&dwc->lock)
| __dwc3_gadget_ep0_queue()
| delay_status is false
| spin_unlock_irqrestore(&dwc->lock)
| |
| sleeping
spin_lock(&dwc->lock); |
| |
delayed_status=true |
| |
STATUS XferNotReady IRQ
------------------------
|
dwc3_ep0_xfernotready()
|
delayed_status is true, return;
The result is the status packet will never be transferred, and
delayed_status is not cleared.
Signed-off-by: Zhuang Jin Can <jin.can.zhuang@intel.com>
Reported-by: Zhou Liping <liping.zhou@intel.com>
---
drivers/usb/dwc3/ep0.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 21a3520..07292c0 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -1020,7 +1020,11 @@ static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
if (dwc->delayed_status) {
WARN_ON_ONCE(event->endpoint_number != 1);
dev_vdbg(dwc->dev, "Mass Storage delayed status\n");
- return;
+
+ if (list_empty(&dwc->eps[0]->request_list))
+ return;
+ else
+ dwc->delayed_status = false;
}
dwc3_ep0_do_control_status(dwc, event);
--
1.7.9.5
next reply other threads:[~2014-05-07 21:53 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-07 21:53 Zhuang Jin Can [this message]
2014-05-07 15:03 ` [PATCH] usb: dwc3: ep0: fix delayed status is queued too early Alan Stern
2014-05-07 15:03 ` Alan Stern
2014-05-08 4:39 ` Zhuang Jin Can
2014-05-07 16:59 ` Alan Stern
2014-05-07 16:59 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1405071252550.1325-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2014-05-08 16:00 ` Zhuang Jin Can
2014-05-08 16:00 ` Zhuang Jin Can
2014-05-08 14:25 ` Alan Stern
2014-05-08 14:25 ` Alan Stern
2014-05-09 3:01 ` Zhuang Jin Can
2014-05-08 15:22 ` Alan Stern
2014-05-08 15:22 ` Alan Stern
2014-05-09 5:03 ` Zhuang Jin Can
2014-05-08 19:55 ` Paul Zimmerman
2014-05-08 21:18 ` Alan Stern
2014-05-08 23:01 ` Paul Zimmerman
2014-05-09 14:08 ` Alan Stern
[not found] ` <20140507215344.GH19925-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-05-14 1:45 ` Zhuang Jin Can
2014-05-14 1:45 ` Zhuang Jin Can
2014-05-13 15:05 ` Felipe Balbi
2014-05-13 15:05 ` Felipe Balbi
2014-05-14 3:28 ` Zhuang Jin Can
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140507215344.GH19925@intel.com \
--to=jin.can.zhuang@intel.com \
--cc=balbi@ti.com \
--cc=david.a.cohen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=liping.zhou@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.