Lines Matching +full:lock +full:- +full:status

1 // SPDX-License-Identifier: GPL-2.0+
4 * Copyright (C) 2015-2016 Samsung Electronics
22 /* called with udc->lock held */
26 struct vep *ep0 = to_vep(udc->gadget.ep0); in get_gadget_descs()
27 struct usb_device_descriptor *ddesc = &udc->dev_desc; in get_gadget_descs()
31 if (!udc->driver || !udc->pullup) in get_gadget_descs()
32 return -EINVAL; in get_gadget_descs()
40 spin_unlock(&udc->lock); in get_gadget_descs()
41 ret = udc->driver->setup(&(udc->gadget), &req); in get_gadget_descs()
42 spin_lock(&udc->lock); in get_gadget_descs()
47 usb_req = list_last_entry(&ep0->req_queue, struct vrequest, req_entry); in get_gadget_descs()
48 list_del(&usb_req->req_entry); in get_gadget_descs()
50 if (usb_req->req.length > sizeof(*ddesc)) { in get_gadget_descs()
51 ret = -EOVERFLOW; in get_gadget_descs()
55 memcpy(ddesc, usb_req->req.buf, sizeof(*ddesc)); in get_gadget_descs()
56 udc->desc_cached = 1; in get_gadget_descs()
59 usb_req->req.status = 0; in get_gadget_descs()
60 usb_req->req.actual = usb_req->req.length; in get_gadget_descs()
61 usb_gadget_giveback_request(&(ep0->ep), &(usb_req->req)); in get_gadget_descs()
75 char *desc_ptr = (char *) &udc->dev_desc; in dev_desc_read()
79 spin_lock_irqsave(&udc->lock, flags); in dev_desc_read()
80 if (!udc->desc_cached) { in dev_desc_read()
81 ret = -ENODEV; in dev_desc_read()
88 spin_unlock_irqrestore(&udc->lock, flags); in dev_desc_read()
109 return -EINVAL; in usbip_sockfd_store()
113 return -ENODEV; in usbip_sockfd_store()
115 mutex_lock(&udc->ud.sysfs_lock); in usbip_sockfd_store()
116 spin_lock_irqsave(&udc->lock, flags); in usbip_sockfd_store()
118 if (!udc->driver || !udc->pullup) { in usbip_sockfd_store()
120 ret = -ENODEV; in usbip_sockfd_store()
124 if (sockfd != -1) { in usbip_sockfd_store()
125 if (udc->connected) { in usbip_sockfd_store()
127 ret = -EBUSY; in usbip_sockfd_store()
131 spin_lock(&udc->ud.lock); in usbip_sockfd_store()
133 if (udc->ud.status != SDEV_ST_AVAILABLE) { in usbip_sockfd_store()
134 ret = -EINVAL; in usbip_sockfd_store()
141 ret = -EINVAL; in usbip_sockfd_store()
145 if (socket->type != SOCK_STREAM) { in usbip_sockfd_store()
146 dev_err(dev, "Expecting SOCK_STREAM - found %d", in usbip_sockfd_store()
147 socket->type); in usbip_sockfd_store()
148 ret = -EINVAL; in usbip_sockfd_store()
153 spin_unlock(&udc->ud.lock); in usbip_sockfd_store()
154 spin_unlock_irqrestore(&udc->lock, flags); in usbip_sockfd_store()
156 tcp_rx = kthread_create(&v_rx_loop, &udc->ud, "vudc_rx"); in usbip_sockfd_store()
159 mutex_unlock(&udc->ud.sysfs_lock); in usbip_sockfd_store()
160 return -EINVAL; in usbip_sockfd_store()
162 tcp_tx = kthread_create(&v_tx_loop, &udc->ud, "vudc_tx"); in usbip_sockfd_store()
166 mutex_unlock(&udc->ud.sysfs_lock); in usbip_sockfd_store()
167 return -EINVAL; in usbip_sockfd_store()
174 /* lock and update udc->ud state */ in usbip_sockfd_store()
175 spin_lock_irqsave(&udc->lock, flags); in usbip_sockfd_store()
176 spin_lock(&udc->ud.lock); in usbip_sockfd_store()
178 udc->ud.tcp_socket = socket; in usbip_sockfd_store()
179 udc->ud.tcp_rx = tcp_rx; in usbip_sockfd_store()
180 udc->ud.tcp_tx = tcp_tx; in usbip_sockfd_store()
181 udc->ud.status = SDEV_ST_USED; in usbip_sockfd_store()
183 spin_unlock(&udc->ud.lock); in usbip_sockfd_store()
185 ktime_get_ts64(&udc->start_time); in usbip_sockfd_store()
187 udc->connected = 1; in usbip_sockfd_store()
189 spin_unlock_irqrestore(&udc->lock, flags); in usbip_sockfd_store()
191 wake_up_process(udc->ud.tcp_rx); in usbip_sockfd_store()
192 wake_up_process(udc->ud.tcp_tx); in usbip_sockfd_store()
194 mutex_unlock(&udc->ud.sysfs_lock); in usbip_sockfd_store()
198 if (!udc->connected) { in usbip_sockfd_store()
200 ret = -EINVAL; in usbip_sockfd_store()
204 spin_lock(&udc->ud.lock); in usbip_sockfd_store()
205 if (udc->ud.status != SDEV_ST_USED) { in usbip_sockfd_store()
206 ret = -EINVAL; in usbip_sockfd_store()
209 spin_unlock(&udc->ud.lock); in usbip_sockfd_store()
211 usbip_event_add(&udc->ud, VUDC_EVENT_DOWN); in usbip_sockfd_store()
214 spin_unlock_irqrestore(&udc->lock, flags); in usbip_sockfd_store()
215 mutex_unlock(&udc->ud.sysfs_lock); in usbip_sockfd_store()
222 spin_unlock(&udc->ud.lock); in usbip_sockfd_store()
224 spin_unlock_irqrestore(&udc->lock, flags); in usbip_sockfd_store()
225 mutex_unlock(&udc->ud.sysfs_lock); in usbip_sockfd_store()
235 int status; in usbip_status_show() local
239 return -ENODEV; in usbip_status_show()
241 spin_lock_irq(&udc->ud.lock); in usbip_status_show()
242 status = udc->ud.status; in usbip_status_show()
243 spin_unlock_irq(&udc->ud.lock); in usbip_status_show()
245 return sysfs_emit(out, "%d\n", status); in usbip_status_show()