spin_unlock(&udc->lock);
ret = udc->driver->setup(&(udc->gadget), &req);
spin_lock(&udc->lock); if (ret < 0) goto out;
/* assuming request queue is empty; request is now on top */
usb_req = list_last_entry(&ep0->req_queue, struct vrequest, req_entry);
list_del(&usb_req->req_entry);
if (usb_req->req.length > sizeof(*ddesc)) {
ret = -EOVERFLOW; goto giveback_req;
}
if (!udc) {
dev_err(dev, "no device"); return -ENODEV;
}
mutex_lock(&udc->ud.sysfs_lock);
spin_lock_irqsave(&udc->lock, flags); /* Don't export what we don't have */ if (!udc->driver || !udc->pullup) {
dev_err(dev, "gadget not bound");
ret = -ENODEV; goto unlock;
}
if (sockfd != -1) { if (udc->connected) {
dev_err(dev, "Device already connected");
ret = -EBUSY; goto unlock;
}
spin_lock(&udc->ud.lock);
if (udc->ud.status != SDEV_ST_AVAILABLE) {
ret = -EINVAL; goto unlock_ud;
}
socket = sockfd_lookup(sockfd, &err); if (!socket) {
dev_err(dev, "failed to lookup sock");
ret = -EINVAL; goto unlock_ud;
}
if (socket->type != SOCK_STREAM) {
dev_err(dev, "Expecting SOCK_STREAM - found %d",
socket->type);
ret = -EINVAL; goto sock_err;
}
/* unlock and create threads and get tasks */
spin_unlock(&udc->ud.lock);
spin_unlock_irqrestore(&udc->lock, flags);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.