Skip to content

Commit

Permalink
usb: cdns3: gadget: move wait configuration operation
Browse files Browse the repository at this point in the history
After commit f4cfe5c ("usb: cdns3: gadget: improve the
set_configuration handling"), the software will inform the
hardware the request has finished at cdns3_ep0_complete_setup.
The configuration set bit is only set after request has finished,
so it needs to move waiting operation after that. Meanwhile,
if it is timeout, it will show warning message and return error.

Signed-off-by: Peter Chen <peter.chen@nxp.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
  • Loading branch information
Peter Chen authored and Felipe Balbi committed Oct 2, 2020
1 parent 9f65013 commit b21cf93
Showing 2 changed files with 9 additions and 6 deletions.
10 changes: 9 additions & 1 deletion drivers/usb/cdns3/ep0.c
Original file line number Diff line number Diff line change
@@ -717,9 +717,17 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep,

/* send STATUS stage. Should be called only for SET_CONFIGURATION */
if (priv_dev->ep0_stage == CDNS3_STATUS_STAGE) {
u32 val;

cdns3_select_ep(priv_dev, 0x00);
cdns3_set_hw_configuration(priv_dev);
cdns3_ep0_complete_setup(priv_dev, 0, 1);
/* wait until configuration set */
ret = readl_poll_timeout_atomic(&priv_dev->regs->usb_sts, val,
val & USB_STS_CFGSTS_MASK, 1, 100);
if (ret == -ETIMEDOUT)
dev_warn(priv_dev->dev, "timeout for waiting configuration set\n");

request->actual = 0;
priv_dev->status_completion_no_call = true;
priv_dev->pending_status_request = request;
@@ -731,7 +739,7 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep,
* ep0_queue is back.
*/
queue_work(system_freezable_wq, &priv_dev->pending_status_wq);
return 0;
return ret;
}

if (!list_empty(&priv_ep->pending_req_list)) {
5 changes: 0 additions & 5 deletions drivers/usb/cdns3/gadget.c
Original file line number Diff line number Diff line change
@@ -1310,7 +1310,6 @@ void cdns3_set_hw_configuration(struct cdns3_device *priv_dev)
{
struct cdns3_endpoint *priv_ep;
struct usb_ep *ep;
int val;

if (priv_dev->hw_configured_flag)
return;
@@ -1320,10 +1319,6 @@ void cdns3_set_hw_configuration(struct cdns3_device *priv_dev)
cdns3_set_register_bit(&priv_dev->regs->usb_conf,
USB_CONF_U1EN | USB_CONF_U2EN);

/* wait until configuration set */
readl_poll_timeout_atomic(&priv_dev->regs->usb_sts, val,
val & USB_STS_CFGSTS_MASK, 1, 100);

priv_dev->hw_configured_flag = 1;

list_for_each_entry(ep, &priv_dev->gadget.ep_list, ep_list) {

0 comments on commit b21cf93

Please sign in to comment.