{
unsigned long flags;
+ /* As connection is disconnected here,
+ * if there's no request on ep0IN, no more request completion
+ * will happen on ep0IN.
+ * otherwise, there's one request on ep0IN, let's wait until
+ * it's completed! 50 ms should be more than enough.
+ */
+ msleep(50);
+
spin_lock_irqsave(&cdev->lock, flags);
if (cdev->config == config)
struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
int status;
+ if (req->status) {
+ DBG(cdev, "RNDIS command completes abnormally status %d\n",
+ req->status);
+ return;
+ }
/* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */
// spin_lock(&dev->lock);
status = rndis_msg_parser(rndis->config, (u8 *) req->buf);
dev_vdbg(&dev->pdev->dev, "---> %s()\n", __func__);
- if (!_ep || !ep->desc)
- return -EINVAL;
if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)
return -ESHUTDOWN;
- if (usb_endpoint_xfer_isoc(ep->desc))
- return -EOPNOTSUPP;
-
- pm_runtime_get_sync(&dev->pdev->dev);
spin_lock_irqsave(&dev->lock, flags);
+ if (!_ep || !ep->desc) {
+ retval = -EINVAL;
+ goto done;
+ }
+ if (usb_endpoint_xfer_isoc(ep->desc)) {
+ retval = -EOPNOTSUPP;
+ goto done;
+ }
/*
* attempt to halt IN ep will fail if any transfer requests
done:
spin_unlock_irqrestore(&dev->lock, flags);
- pm_runtime_put_sync(&dev->pdev->dev);
-
dev_dbg(&dev->pdev->dev, "%s %s halt\n",
_ep->name, value ? "set" : "clear");
dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__);
int retval;
dev_vdbg(&dev->pdev->dev, "---> %s()\n", __func__);
+ if (!ep->desc)
+ return 0;
endptctrl = readl(&dev->op_regs->endptctrl[ep->ep_num]);
if (is_in(ep))