Lines Matching +full:lock +full:- +full:state

1 // SPDX-License-Identifier: GPL-2.0+
3 * inode.c -- user mode filesystem api for usb gadget controllers
5 * Copyright (C) 2003-2004 David Brownell
50 * Key parts that must be USB-specific are protocols defining how the
51 * read/write operations relate to the hardware state machines. There
56 * - First, dev_config() is called when /dev/gadget/$CHIP is configured
61 * - Then, after a SET_CONFIGURATION control request, ep_config() is
86 /*----------------------------------------------------------------------*/
92 /* DISABLED is the initial state. */
103 * - (UN)CONNECTED: read usb_gadgetfs_event(s) from it
104 * - SETUP: read/write will transfer control data and succeed;
123 spinlock_t lock; member
126 enum ep0_state state; /* P: lock */ member
144 /* the rest is basically write-once */
161 refcount_inc (&data->count); in get_dev()
166 if (likely (!refcount_dec_and_test (&data->count))) in put_dev()
169 BUG_ON (waitqueue_active (&data->wait)); in put_dev()
180 dev->state = STATE_DEV_DISABLED; in dev_new()
181 refcount_set (&dev->count, 1); in dev_new()
182 spin_lock_init (&dev->lock); in dev_new()
183 INIT_LIST_HEAD (&dev->epfiles); in dev_new()
184 init_waitqueue_head (&dev->wait); in dev_new()
188 /*----------------------------------------------------------------------*/
199 struct mutex lock; member
200 enum ep_state state; member
203 /* must hold dev->lock before accessing ep or req */
216 refcount_inc (&data->count); in get_ep()
221 if (likely (!refcount_dec_and_test (&data->count))) in put_ep()
223 put_dev (data->dev); in put_ep()
225 BUG_ON (!list_empty (&data->epfiles)); in put_ep()
226 BUG_ON (waitqueue_active (&data->wait)); in put_ep()
230 /*----------------------------------------------------------------------*/
241 /*----------------------------------------------------------------------*/
247 /* too wordy: dev_printk(level , &(d)->gadget->dev , fmt , ## args) */
272 /*----------------------------------------------------------------------*/
276 * After opening, configure non-control endpoints. Then use normal
283 struct ep_data *epdata = ep->driver_data; in epio_complete()
285 if (!req->context) in epio_complete()
287 if (req->status) in epio_complete()
288 epdata->status = req->status; in epio_complete()
290 epdata->status = req->actual; in epio_complete()
291 complete ((struct completion *)req->context); in epio_complete()
295 * still need dev->lock to use epdata->ep.
303 if (!mutex_trylock(&epdata->lock)) in get_ready_ep()
305 if (epdata->state != STATE_EP_ENABLED && in get_ready_ep()
306 (!is_write || epdata->state != STATE_EP_READY)) { in get_ready_ep()
307 mutex_unlock(&epdata->lock); in get_ready_ep()
309 val = -EAGAIN; in get_ready_ep()
315 val = mutex_lock_interruptible(&epdata->lock); in get_ready_ep()
319 switch (epdata->state) { in get_ready_ep()
330 pr_debug ("%s: ep %p not available, state %d\n", in get_ready_ep()
331 shortname, epdata, epdata->state); in get_ready_ep()
333 mutex_unlock(&epdata->lock); in get_ready_ep()
334 return -ENODEV; in get_ready_ep()
343 spin_lock_irq (&epdata->dev->lock); in ep_io()
344 if (likely (epdata->ep != NULL)) { in ep_io()
345 struct usb_request *req = epdata->req; in ep_io()
347 req->context = &done; in ep_io()
348 req->complete = epio_complete; in ep_io()
349 req->buf = buf; in ep_io()
350 req->length = len; in ep_io()
351 value = usb_ep_queue (epdata->ep, req, GFP_ATOMIC); in ep_io()
353 value = -ENODEV; in ep_io()
354 spin_unlock_irq (&epdata->dev->lock); in ep_io()
359 spin_lock_irq (&epdata->dev->lock); in ep_io()
360 if (likely (epdata->ep != NULL)) { in ep_io()
361 DBG (epdata->dev, "%s i/o interrupted\n", in ep_io()
362 epdata->name); in ep_io()
363 usb_ep_dequeue (epdata->ep, epdata->req); in ep_io()
364 spin_unlock_irq (&epdata->dev->lock); in ep_io()
367 if (epdata->status == -ECONNRESET) in ep_io()
368 epdata->status = -EINTR; in ep_io()
370 spin_unlock_irq (&epdata->dev->lock); in ep_io()
372 DBG (epdata->dev, "endpoint gone\n"); in ep_io()
374 epdata->status = -ENODEV; in ep_io()
377 return epdata->status; in ep_io()
385 struct ep_data *data = fd->private_data; in ep_release()
388 value = mutex_lock_interruptible(&data->lock); in ep_release()
393 if (data->state != STATE_EP_UNBOUND) { in ep_release()
394 data->state = STATE_EP_DISABLED; in ep_release()
395 data->desc.bDescriptorType = 0; in ep_release()
396 data->hs_desc.bDescriptorType = 0; in ep_release()
397 usb_ep_disable(data->ep); in ep_release()
399 mutex_unlock(&data->lock); in ep_release()
406 struct ep_data *data = fd->private_data; in ep_ioctl()
409 if ((status = get_ready_ep (fd->f_flags, data, false)) < 0) in ep_ioctl()
412 spin_lock_irq (&data->dev->lock); in ep_ioctl()
413 if (likely (data->ep != NULL)) { in ep_ioctl()
416 status = usb_ep_fifo_status (data->ep); in ep_ioctl()
419 usb_ep_fifo_flush (data->ep); in ep_ioctl()
422 status = usb_ep_clear_halt (data->ep); in ep_ioctl()
425 status = -ENOTTY; in ep_ioctl()
428 status = -ENODEV; in ep_ioctl()
429 spin_unlock_irq (&data->dev->lock); in ep_ioctl()
430 mutex_unlock(&data->lock); in ep_ioctl()
434 /*----------------------------------------------------------------------*/
452 struct kiocb_priv *priv = iocb->private; in ep_aio_cancel()
457 epdata = priv->epdata; in ep_aio_cancel()
458 // spin_lock(&epdata->dev->lock); in ep_aio_cancel()
459 if (likely(epdata && epdata->ep && priv->req)) in ep_aio_cancel()
460 value = usb_ep_dequeue (epdata->ep, priv->req); in ep_aio_cancel()
462 value = -EINVAL; in ep_aio_cancel()
463 // spin_unlock(&epdata->dev->lock); in ep_aio_cancel()
472 struct mm_struct *mm = priv->mm; in ep_user_copy_worker()
473 struct kiocb *iocb = priv->iocb; in ep_user_copy_worker()
477 ret = copy_to_iter(priv->buf, priv->actual, &priv->to); in ep_user_copy_worker()
480 ret = -EFAULT; in ep_user_copy_worker()
483 iocb->ki_complete(iocb, ret); in ep_user_copy_worker()
485 kfree(priv->buf); in ep_user_copy_worker()
486 kfree(priv->to_free); in ep_user_copy_worker()
492 struct kiocb *iocb = req->context; in ep_aio_complete()
493 struct kiocb_priv *priv = iocb->private; in ep_aio_complete()
494 struct ep_data *epdata = priv->epdata; in ep_aio_complete()
496 /* lock against disconnect (and ideally, cancel) */ in ep_aio_complete()
497 spin_lock(&epdata->dev->lock); in ep_aio_complete()
498 priv->req = NULL; in ep_aio_complete()
499 priv->epdata = NULL; in ep_aio_complete()
505 if (priv->to_free == NULL || unlikely(req->actual == 0)) { in ep_aio_complete()
506 kfree(req->buf); in ep_aio_complete()
507 kfree(priv->to_free); in ep_aio_complete()
509 iocb->private = NULL; in ep_aio_complete()
510 iocb->ki_complete(iocb, in ep_aio_complete()
511 req->actual ? req->actual : (long)req->status); in ep_aio_complete()
514 if (unlikely(0 != req->status)) in ep_aio_complete()
515 DBG(epdata->dev, "%s fault %d len %d\n", in ep_aio_complete()
516 ep->name, req->status, req->actual); in ep_aio_complete()
518 priv->buf = req->buf; in ep_aio_complete()
519 priv->actual = req->actual; in ep_aio_complete()
520 INIT_WORK(&priv->work, ep_user_copy_worker); in ep_aio_complete()
521 schedule_work(&priv->work); in ep_aio_complete()
525 spin_unlock(&epdata->dev->lock); in ep_aio_complete()
538 iocb->private = priv; in ep_aio()
539 priv->iocb = iocb; in ep_aio()
543 priv->epdata = epdata; in ep_aio()
544 priv->actual = 0; in ep_aio()
545 priv->mm = current->mm; /* mm teardown waits for iocbs in exit_aio() */ in ep_aio()
550 spin_lock_irq(&epdata->dev->lock); in ep_aio()
551 value = -ENODEV; in ep_aio()
552 if (unlikely(epdata->ep == NULL)) in ep_aio()
555 req = usb_ep_alloc_request(epdata->ep, GFP_ATOMIC); in ep_aio()
556 value = -ENOMEM; in ep_aio()
560 priv->req = req; in ep_aio()
561 req->buf = buf; in ep_aio()
562 req->length = len; in ep_aio()
563 req->complete = ep_aio_complete; in ep_aio()
564 req->context = iocb; in ep_aio()
565 value = usb_ep_queue(epdata->ep, req, GFP_ATOMIC); in ep_aio()
567 usb_ep_free_request(epdata->ep, req); in ep_aio()
570 spin_unlock_irq(&epdata->dev->lock); in ep_aio()
571 return -EIOCBQUEUED; in ep_aio()
574 spin_unlock_irq(&epdata->dev->lock); in ep_aio()
575 kfree(priv->to_free); in ep_aio()
584 struct file *file = iocb->ki_filp; in ep_read_iter()
585 struct ep_data *epdata = file->private_data; in ep_read_iter()
590 if ((value = get_ready_ep(file->f_flags, epdata, false)) < 0) in ep_read_iter()
594 if (usb_endpoint_dir_in(&epdata->desc)) { in ep_read_iter()
595 if (usb_endpoint_xfer_isoc(&epdata->desc) || in ep_read_iter()
597 mutex_unlock(&epdata->lock); in ep_read_iter()
598 return -EINVAL; in ep_read_iter()
600 DBG (epdata->dev, "%s halt\n", epdata->name); in ep_read_iter()
601 spin_lock_irq(&epdata->dev->lock); in ep_read_iter()
602 if (likely(epdata->ep != NULL)) in ep_read_iter()
603 usb_ep_set_halt(epdata->ep); in ep_read_iter()
604 spin_unlock_irq(&epdata->dev->lock); in ep_read_iter()
605 mutex_unlock(&epdata->lock); in ep_read_iter()
606 return -EBADMSG; in ep_read_iter()
611 mutex_unlock(&epdata->lock); in ep_read_iter()
612 return -ENOMEM; in ep_read_iter()
617 value = -EFAULT; in ep_read_iter()
620 value = -ENOMEM; in ep_read_iter()
623 priv->to_free = dup_iter(&priv->to, to, GFP_KERNEL); in ep_read_iter()
624 if (!iter_is_ubuf(&priv->to) && !priv->to_free) { in ep_read_iter()
629 if (value == -EIOCBQUEUED) in ep_read_iter()
634 mutex_unlock(&epdata->lock); in ep_read_iter()
643 struct file *file = iocb->ki_filp; in ep_write_iter()
644 struct ep_data *epdata = file->private_data; in ep_write_iter()
650 if ((value = get_ready_ep(file->f_flags, epdata, true)) < 0) in ep_write_iter()
653 configured = epdata->state == STATE_EP_ENABLED; in ep_write_iter()
656 if (configured && !usb_endpoint_dir_in(&epdata->desc)) { in ep_write_iter()
657 if (usb_endpoint_xfer_isoc(&epdata->desc) || in ep_write_iter()
659 mutex_unlock(&epdata->lock); in ep_write_iter()
660 return -EINVAL; in ep_write_iter()
662 DBG (epdata->dev, "%s halt\n", epdata->name); in ep_write_iter()
663 spin_lock_irq(&epdata->dev->lock); in ep_write_iter()
664 if (likely(epdata->ep != NULL)) in ep_write_iter()
665 usb_ep_set_halt(epdata->ep); in ep_write_iter()
666 spin_unlock_irq(&epdata->dev->lock); in ep_write_iter()
667 mutex_unlock(&epdata->lock); in ep_write_iter()
668 return -EBADMSG; in ep_write_iter()
673 mutex_unlock(&epdata->lock); in ep_write_iter()
674 return -ENOMEM; in ep_write_iter()
678 value = -EFAULT; in ep_write_iter()
688 value = -ENOMEM; in ep_write_iter()
691 if (value == -EIOCBQUEUED) in ep_write_iter()
697 mutex_unlock(&epdata->lock); in ep_write_iter()
701 /*----------------------------------------------------------------------*/
734 if (data->state != STATE_EP_READY) { in ep_config()
735 value = -EL2HLT; in ep_config()
746 DBG(data->dev, "config %s, bad tag %d\n", data->name, tag); in ep_config()
750 len -= 4; in ep_config()
757 memcpy(&data->desc, buf, USB_DT_ENDPOINT_SIZE); in ep_config()
758 if (data->desc.bLength != USB_DT_ENDPOINT_SIZE in ep_config()
759 || data->desc.bDescriptorType != USB_DT_ENDPOINT) in ep_config()
764 memcpy(&data->hs_desc, buf + USB_DT_ENDPOINT_SIZE, in ep_config()
766 if (data->hs_desc.bLength != USB_DT_ENDPOINT_SIZE in ep_config()
767 || data->hs_desc.bDescriptorType in ep_config()
769 DBG(data->dev, "config %s, bad hs length or type\n", in ep_config()
770 data->name); in ep_config()
775 spin_lock_irq (&data->dev->lock); in ep_config()
776 if (data->dev->state == STATE_DEV_UNBOUND) { in ep_config()
777 value = -ENOENT; in ep_config()
780 ep = data->ep; in ep_config()
782 value = -ENODEV; in ep_config()
786 switch (data->dev->gadget->speed) { in ep_config()
789 ep->desc = &data->desc; in ep_config()
793 ep->desc = &data->hs_desc; in ep_config()
796 DBG(data->dev, "unconnected, %s init abandoned\n", in ep_config()
797 data->name); in ep_config()
798 value = -EINVAL; in ep_config()
803 data->state = STATE_EP_ENABLED; in ep_config()
807 spin_unlock_irq (&data->dev->lock); in ep_config()
810 data->desc.bDescriptorType = 0; in ep_config()
811 data->hs_desc.bDescriptorType = 0; in ep_config()
815 value = -EINVAL; in ep_config()
822 struct ep_data *data = inode->i_private; in ep_open()
823 int value = -EBUSY; in ep_open()
825 if (mutex_lock_interruptible(&data->lock) != 0) in ep_open()
826 return -EINTR; in ep_open()
827 spin_lock_irq (&data->dev->lock); in ep_open()
828 if (data->dev->state == STATE_DEV_UNBOUND) in ep_open()
829 value = -ENOENT; in ep_open()
830 else if (data->state == STATE_EP_DISABLED) { in ep_open()
832 data->state = STATE_EP_READY; in ep_open()
834 fd->private_data = data; in ep_open()
835 VDEBUG (data->dev, "%s ready\n", data->name); in ep_open()
837 DBG (data->dev, "%s state %d\n", in ep_open()
838 data->name, data->state); in ep_open()
839 spin_unlock_irq (&data->dev->lock); in ep_open()
840 mutex_unlock(&data->lock); in ep_open()
844 /*----------------------------------------------------------------------*/
850 * use this facility may be too simple-minded for real applications.
855 wake_up (&dev->wait); in ep0_readable()
856 kill_fasync (&dev->fasync, SIGIO, POLL_IN); in ep0_readable()
861 struct dev_data *dev = ep->driver_data; in clean_req()
863 if (req->buf != dev->rbuf) { in clean_req()
864 kfree(req->buf); in clean_req()
865 req->buf = dev->rbuf; in clean_req()
867 req->complete = epio_complete; in clean_req()
868 dev->setup_out_ready = 0; in clean_req()
873 struct dev_data *dev = ep->driver_data; in ep0_complete()
878 spin_lock_irqsave(&dev->lock, flags); in ep0_complete()
879 if (!dev->setup_in) { in ep0_complete()
880 dev->setup_out_error = (req->status != 0); in ep0_complete()
881 if (!dev->setup_out_error) in ep0_complete()
883 dev->setup_out_ready = 1; in ep0_complete()
888 if (free && req->buf != &dev->rbuf) in ep0_complete()
890 req->complete = epio_complete; in ep0_complete()
891 spin_unlock_irqrestore(&dev->lock, flags); in ep0_complete()
896 struct dev_data *dev = ep->driver_data; in setup_req()
898 if (dev->setup_out_ready) { in setup_req()
900 return -EBUSY; in setup_req()
902 if (len > sizeof (dev->rbuf)) in setup_req()
903 req->buf = kmalloc(len, GFP_ATOMIC); in setup_req()
904 if (req->buf == NULL) { in setup_req()
905 req->buf = dev->rbuf; in setup_req()
906 return -ENOMEM; in setup_req()
908 req->complete = ep0_complete; in setup_req()
909 req->length = len; in setup_req()
910 req->zero = 0; in setup_req()
917 struct dev_data *dev = fd->private_data; in ep0_read()
919 enum ep0_state state; in ep0_read() local
921 spin_lock_irq (&dev->lock); in ep0_read()
922 if (dev->state <= STATE_DEV_OPENED) { in ep0_read()
923 retval = -EINVAL; in ep0_read()
928 if (dev->setup_abort) { in ep0_read()
929 dev->setup_abort = 0; in ep0_read()
930 retval = -EIDRM; in ep0_read()
935 if ((state = dev->state) == STATE_DEV_SETUP) { in ep0_read()
937 if (dev->setup_in) { /* stall IN */ in ep0_read()
939 (void) usb_ep_set_halt (dev->gadget->ep0); in ep0_read()
940 retval = -EL2HLT; in ep0_read()
941 dev->state = STATE_DEV_CONNECTED; in ep0_read()
944 struct usb_ep *ep = dev->gadget->ep0; in ep0_read()
945 struct usb_request *req = dev->req; in ep0_read()
948 ++dev->udc_usage; in ep0_read()
949 spin_unlock_irq (&dev->lock); in ep0_read()
951 spin_lock_irq (&dev->lock); in ep0_read()
952 --dev->udc_usage; in ep0_read()
954 dev->state = STATE_DEV_CONNECTED; in ep0_read()
957 if (dev->current_config) { in ep0_read()
960 if (gadget_is_dualspeed(dev->gadget) in ep0_read()
961 && (dev->gadget->speed in ep0_read()
963 power = dev->hs_config->bMaxPower; in ep0_read()
965 power = dev->config->bMaxPower; in ep0_read()
966 usb_gadget_vbus_draw(dev->gadget, 2 * power); in ep0_read()
970 if ((fd->f_flags & O_NONBLOCK) != 0 in ep0_read()
971 && !dev->setup_out_ready) { in ep0_read()
972 retval = -EAGAIN; in ep0_read()
975 spin_unlock_irq (&dev->lock); in ep0_read()
976 retval = wait_event_interruptible (dev->wait, in ep0_read()
977 dev->setup_out_ready != 0); in ep0_read()
979 /* FIXME state could change from under us */ in ep0_read()
980 spin_lock_irq (&dev->lock); in ep0_read()
984 if (dev->state != STATE_DEV_SETUP) { in ep0_read()
985 retval = -ECANCELED; in ep0_read()
988 dev->state = STATE_DEV_CONNECTED; in ep0_read()
990 if (dev->setup_out_error) in ep0_read()
991 retval = -EIO; in ep0_read()
993 len = min (len, (size_t)dev->req->actual); in ep0_read()
994 ++dev->udc_usage; in ep0_read()
995 spin_unlock_irq(&dev->lock); in ep0_read()
996 if (copy_to_user (buf, dev->req->buf, len)) in ep0_read()
997 retval = -EFAULT; in ep0_read()
1000 spin_lock_irq(&dev->lock); in ep0_read()
1001 --dev->udc_usage; in ep0_read()
1002 clean_req (dev->gadget->ep0, dev->req); in ep0_read()
1010 if (len < sizeof dev->event [0]) { in ep0_read()
1011 retval = -EINVAL; in ep0_read()
1014 len -= len % sizeof (struct usb_gadgetfs_event); in ep0_read()
1015 dev->usermode_setup = 1; in ep0_read()
1019 if (dev->ev_next != 0) { in ep0_read()
1023 if (dev->ev_next < n) in ep0_read()
1024 n = dev->ev_next; in ep0_read()
1028 if (dev->event [i].type == GADGETFS_SETUP) { in ep0_read()
1029 dev->state = STATE_DEV_SETUP; in ep0_read()
1034 spin_unlock_irq (&dev->lock); in ep0_read()
1036 if (copy_to_user (buf, &dev->event, len)) in ep0_read()
1037 retval = -EFAULT; in ep0_read()
1044 spin_lock_irq (&dev->lock); in ep0_read()
1045 if (dev->ev_next > n) { in ep0_read()
1046 memmove(&dev->event[0], &dev->event[n], in ep0_read()
1048 * (dev->ev_next - n)); in ep0_read()
1050 dev->ev_next -= n; in ep0_read()
1051 spin_unlock_irq (&dev->lock); in ep0_read()
1055 if (fd->f_flags & O_NONBLOCK) { in ep0_read()
1056 retval = -EAGAIN; in ep0_read()
1060 switch (state) { in ep0_read()
1062 DBG (dev, "fail %s, state %d\n", __func__, state); in ep0_read()
1063 retval = -ESRCH; in ep0_read()
1067 spin_unlock_irq (&dev->lock); in ep0_read()
1071 retval = wait_event_interruptible (dev->wait, in ep0_read()
1072 dev->ev_next != 0); in ep0_read()
1075 spin_lock_irq (&dev->lock); in ep0_read()
1080 spin_unlock_irq (&dev->lock); in ep0_read()
1093 if (dev->state == STATE_DEV_SETUP) in next_event()
1094 dev->setup_abort = 1; in next_event()
1097 dev->ev_next = 0; in next_event()
1102 for (i = 0; i != dev->ev_next; i++) { in next_event()
1103 if (dev->event [i].type != type) in next_event()
1106 dev->ev_next--; in next_event()
1107 if (i == dev->ev_next) in next_event()
1110 memmove (&dev->event [i], &dev->event [i + 1], in next_event()
1112 * (dev->ev_next - i)); in next_event()
1118 VDEBUG(dev, "event[%d] = %d\n", dev->ev_next, type); in next_event()
1119 event = &dev->event [dev->ev_next++]; in next_event()
1120 BUG_ON (dev->ev_next > N_EVENT); in next_event()
1122 event->type = type; in next_event()
1129 struct dev_data *dev = fd->private_data; in ep0_write()
1130 ssize_t retval = -ESRCH; in ep0_write()
1133 if (dev->setup_abort) { in ep0_write()
1134 dev->setup_abort = 0; in ep0_write()
1135 retval = -EIDRM; in ep0_write()
1138 } else if (dev->state == STATE_DEV_SETUP) { in ep0_write()
1140 len = min_t(size_t, len, dev->setup_wLength); in ep0_write()
1141 if (dev->setup_in) { in ep0_write()
1142 retval = setup_req (dev->gadget->ep0, dev->req, len); in ep0_write()
1144 dev->state = STATE_DEV_CONNECTED; in ep0_write()
1145 ++dev->udc_usage; in ep0_write()
1146 spin_unlock_irq (&dev->lock); in ep0_write()
1147 if (copy_from_user (dev->req->buf, buf, len)) in ep0_write()
1148 retval = -EFAULT; in ep0_write()
1150 if (len < dev->setup_wLength) in ep0_write()
1151 dev->req->zero = 1; in ep0_write()
1153 dev->gadget->ep0, dev->req, in ep0_write()
1156 spin_lock_irq(&dev->lock); in ep0_write()
1157 --dev->udc_usage; in ep0_write()
1159 clean_req (dev->gadget->ep0, dev->req); in ep0_write()
1167 } else if (dev->setup_can_stall) { in ep0_write()
1169 (void) usb_ep_set_halt (dev->gadget->ep0); in ep0_write()
1170 retval = -EL2HLT; in ep0_write()
1171 dev->state = STATE_DEV_CONNECTED; in ep0_write()
1176 DBG (dev, "fail %s, state %d\n", __func__, dev->state); in ep0_write()
1184 struct dev_data *dev = fd->private_data; in ep0_fasync()
1187 return fasync_helper (f, fd, on, &dev->fasync); in ep0_fasync()
1195 struct dev_data *dev = fd->private_data; in dev_release()
1199 if (dev->gadget_registered) { in dev_release()
1201 dev->gadget_registered = false; in dev_release()
1209 kfree (dev->buf); in dev_release()
1210 dev->buf = NULL; in dev_release()
1213 spin_lock_irq(&dev->lock); in dev_release()
1214 dev->state = STATE_DEV_DISABLED; in dev_release()
1215 spin_unlock_irq(&dev->lock); in dev_release()
1224 struct dev_data *dev = fd->private_data; in ep0_poll()
1227 if (dev->state <= STATE_DEV_OPENED) in ep0_poll()
1230 poll_wait(fd, &dev->wait, wait); in ep0_poll()
1232 spin_lock_irq(&dev->lock); in ep0_poll()
1235 if (dev->setup_abort) { in ep0_poll()
1236 dev->setup_abort = 0; in ep0_poll()
1241 if (dev->state == STATE_DEV_SETUP) { in ep0_poll()
1242 if (dev->setup_in || dev->setup_can_stall) in ep0_poll()
1245 if (dev->ev_next != 0) in ep0_poll()
1249 spin_unlock_irq(&dev->lock); in ep0_poll()
1255 struct dev_data *dev = fd->private_data; in gadget_dev_ioctl()
1256 struct usb_gadget *gadget = dev->gadget; in gadget_dev_ioctl()
1257 long ret = -ENOTTY; in gadget_dev_ioctl()
1259 spin_lock_irq(&dev->lock); in gadget_dev_ioctl()
1260 if (dev->state == STATE_DEV_OPENED || in gadget_dev_ioctl()
1261 dev->state == STATE_DEV_UNBOUND) { in gadget_dev_ioctl()
1263 } else if (gadget->ops->ioctl) { in gadget_dev_ioctl()
1264 ++dev->udc_usage; in gadget_dev_ioctl()
1265 spin_unlock_irq(&dev->lock); in gadget_dev_ioctl()
1267 ret = gadget->ops->ioctl (gadget, code, value); in gadget_dev_ioctl()
1269 spin_lock_irq(&dev->lock); in gadget_dev_ioctl()
1270 --dev->udc_usage; in gadget_dev_ioctl()
1272 spin_unlock_irq(&dev->lock); in gadget_dev_ioctl()
1277 /*----------------------------------------------------------------------*/
1279 /* The in-kernel gadget driver handles most ep0 issues, in particular
1294 desc = dev->dev; in make_qualifier()
1295 qual.bDeviceClass = desc->bDeviceClass; in make_qualifier()
1296 qual.bDeviceSubClass = desc->bDeviceSubClass; in make_qualifier()
1297 qual.bDeviceProtocol = desc->bDeviceProtocol; in make_qualifier()
1300 qual.bMaxPacketSize0 = dev->gadget->ep0->maxpacket; in make_qualifier()
1305 memcpy (dev->rbuf, &qual, sizeof qual); in make_qualifier()
1316 return -EINVAL; in config_buf()
1318 if (gadget_is_dualspeed(dev->gadget)) { in config_buf()
1319 hs = (dev->gadget->speed == USB_SPEED_HIGH); in config_buf()
1324 dev->req->buf = dev->hs_config; in config_buf()
1325 len = le16_to_cpu(dev->hs_config->wTotalLength); in config_buf()
1327 dev->req->buf = dev->config; in config_buf()
1328 len = le16_to_cpu(dev->config->wTotalLength); in config_buf()
1330 ((u8 *)dev->req->buf) [1] = type; in config_buf()
1338 struct usb_request *req = dev->req; in gadgetfs_setup()
1339 int value = -EOPNOTSUPP; in gadgetfs_setup()
1341 u16 w_value = le16_to_cpu(ctrl->wValue); in gadgetfs_setup()
1342 u16 w_length = le16_to_cpu(ctrl->wLength); in gadgetfs_setup()
1345 if (ctrl->bRequestType & USB_DIR_IN) { in gadgetfs_setup()
1347 __le16 *temp = (__le16 *)&ctrl->wLength; in gadgetfs_setup()
1356 spin_lock (&dev->lock); in gadgetfs_setup()
1357 dev->setup_abort = 0; in gadgetfs_setup()
1358 if (dev->state == STATE_DEV_UNCONNECTED) { in gadgetfs_setup()
1360 && gadget->speed == USB_SPEED_HIGH in gadgetfs_setup()
1361 && dev->hs_config == NULL) { in gadgetfs_setup()
1362 spin_unlock(&dev->lock); in gadgetfs_setup()
1364 return -EINVAL; in gadgetfs_setup()
1367 dev->state = STATE_DEV_CONNECTED; in gadgetfs_setup()
1371 event->u.speed = gadget->speed; in gadgetfs_setup()
1379 } else if (dev->state == STATE_DEV_SETUP) in gadgetfs_setup()
1380 dev->setup_abort = 1; in gadgetfs_setup()
1382 req->buf = dev->rbuf; in gadgetfs_setup()
1383 req->context = NULL; in gadgetfs_setup()
1384 switch (ctrl->bRequest) { in gadgetfs_setup()
1387 if (ctrl->bRequestType != USB_DIR_IN) in gadgetfs_setup()
1392 value = min (w_length, (u16) sizeof *dev->dev); in gadgetfs_setup()
1393 dev->dev->bMaxPacketSize0 = dev->gadget->ep0->maxpacket; in gadgetfs_setup()
1394 req->buf = dev->dev; in gadgetfs_setup()
1397 if (!dev->hs_config) in gadgetfs_setup()
1421 if (ctrl->bRequestType != 0) in gadgetfs_setup()
1425 dev->current_config = 0; in gadgetfs_setup()
1432 && gadget->speed == USB_SPEED_HIGH) { in gadgetfs_setup()
1433 config = dev->hs_config->bConfigurationValue; in gadgetfs_setup()
1434 power = dev->hs_config->bMaxPower; in gadgetfs_setup()
1436 config = dev->config->bConfigurationValue; in gadgetfs_setup()
1437 power = dev->config->bMaxPower; in gadgetfs_setup()
1442 dev->current_config = config; in gadgetfs_setup()
1457 INFO (dev, "configuration #%d\n", dev->current_config); in gadgetfs_setup()
1459 if (dev->usermode_setup) { in gadgetfs_setup()
1460 dev->setup_can_stall = 0; in gadgetfs_setup()
1469 if (ctrl->bRequestType != 0x80) in gadgetfs_setup()
1471 *(u8 *)req->buf = dev->current_config; in gadgetfs_setup()
1479 dev->usermode_setup ? "delegate" : "fail", in gadgetfs_setup()
1480 ctrl->bRequestType, ctrl->bRequest, in gadgetfs_setup()
1481 w_value, le16_to_cpu(ctrl->wIndex), w_length); in gadgetfs_setup()
1484 if (dev->usermode_setup) { in gadgetfs_setup()
1485 dev->setup_can_stall = 1; in gadgetfs_setup()
1487 dev->setup_in = (ctrl->bRequestType & USB_DIR_IN) in gadgetfs_setup()
1489 dev->setup_wLength = w_length; in gadgetfs_setup()
1490 dev->setup_out_ready = 0; in gadgetfs_setup()
1491 dev->setup_out_error = 0; in gadgetfs_setup()
1494 if (unlikely (!dev->setup_in && w_length)) { in gadgetfs_setup()
1495 value = setup_req (gadget->ep0, dev->req, in gadgetfs_setup()
1500 ++dev->udc_usage; in gadgetfs_setup()
1501 spin_unlock (&dev->lock); in gadgetfs_setup()
1502 value = usb_ep_queue (gadget->ep0, dev->req, in gadgetfs_setup()
1504 spin_lock (&dev->lock); in gadgetfs_setup()
1505 --dev->udc_usage; in gadgetfs_setup()
1507 clean_req (gadget->ep0, dev->req); in gadgetfs_setup()
1512 dev->setup_can_stall = 0; in gadgetfs_setup()
1515 /* state changes when reader collects event */ in gadgetfs_setup()
1517 event->u.setup = *ctrl; in gadgetfs_setup()
1519 spin_unlock (&dev->lock); in gadgetfs_setup()
1523 * proceeding with the status stage for 0-length in gadgetfs_setup()
1534 if (value >= 0 && dev->state != STATE_DEV_SETUP) { in gadgetfs_setup()
1535 req->length = value; in gadgetfs_setup()
1536 req->zero = value < w_length; in gadgetfs_setup()
1538 ++dev->udc_usage; in gadgetfs_setup()
1539 spin_unlock (&dev->lock); in gadgetfs_setup()
1540 value = usb_ep_queue (gadget->ep0, req, GFP_KERNEL); in gadgetfs_setup()
1541 spin_lock(&dev->lock); in gadgetfs_setup()
1542 --dev->udc_usage; in gadgetfs_setup()
1543 spin_unlock(&dev->lock); in gadgetfs_setup()
1545 DBG (dev, "ep_queue --> %d\n", value); in gadgetfs_setup()
1546 req->status = 0; in gadgetfs_setup()
1552 spin_unlock (&dev->lock); in gadgetfs_setup()
1558 DBG (dev, "%s %d\n", __func__, dev->state); in destroy_ep_files()
1560 /* dev->state must prevent interference */ in destroy_ep_files()
1561 spin_lock_irq (&dev->lock); in destroy_ep_files()
1562 while (!list_empty(&dev->epfiles)) { in destroy_ep_files()
1568 ep = list_first_entry (&dev->epfiles, struct ep_data, epfiles); in destroy_ep_files()
1569 list_del_init (&ep->epfiles); in destroy_ep_files()
1570 spin_unlock_irq (&dev->lock); in destroy_ep_files()
1572 dentry = ep->dentry; in destroy_ep_files()
1573 ep->dentry = NULL; in destroy_ep_files()
1574 parent = d_inode(dentry->d_parent); in destroy_ep_files()
1577 mutex_lock(&ep->lock); in destroy_ep_files()
1578 if (ep->state == STATE_EP_ENABLED) in destroy_ep_files()
1579 (void) usb_ep_disable (ep->ep); in destroy_ep_files()
1580 ep->state = STATE_EP_UNBOUND; in destroy_ep_files()
1581 usb_ep_free_request (ep->ep, ep->req); in destroy_ep_files()
1582 ep->ep = NULL; in destroy_ep_files()
1583 mutex_unlock(&ep->lock); in destroy_ep_files()
1585 wake_up (&ep->wait); in destroy_ep_files()
1594 spin_lock_irq (&dev->lock); in destroy_ep_files()
1596 spin_unlock_irq (&dev->lock); in destroy_ep_files()
1609 gadget_for_each_ep (ep, dev->gadget) { in activate_ep_files()
1614 data->state = STATE_EP_DISABLED; in activate_ep_files()
1615 mutex_init(&data->lock); in activate_ep_files()
1616 init_waitqueue_head (&data->wait); in activate_ep_files()
1618 strncpy (data->name, ep->name, sizeof (data->name) - 1); in activate_ep_files()
1619 refcount_set (&data->count, 1); in activate_ep_files()
1620 data->dev = dev; in activate_ep_files()
1623 data->ep = ep; in activate_ep_files()
1624 ep->driver_data = data; in activate_ep_files()
1626 data->req = usb_ep_alloc_request (ep, GFP_KERNEL); in activate_ep_files()
1627 if (!data->req) in activate_ep_files()
1630 data->dentry = gadgetfs_create_file (dev->sb, data->name, in activate_ep_files()
1632 if (!data->dentry) in activate_ep_files()
1634 list_add_tail (&data->epfiles, &dev->epfiles); in activate_ep_files()
1639 usb_ep_free_request (ep, data->req); in activate_ep_files()
1646 return -ENOMEM; in activate_ep_files()
1656 spin_lock_irq (&dev->lock); in gadgetfs_unbind()
1657 dev->state = STATE_DEV_UNBOUND; in gadgetfs_unbind()
1658 while (dev->udc_usage > 0) { in gadgetfs_unbind()
1659 spin_unlock_irq(&dev->lock); in gadgetfs_unbind()
1661 spin_lock_irq(&dev->lock); in gadgetfs_unbind()
1663 spin_unlock_irq (&dev->lock); in gadgetfs_unbind()
1666 gadget->ep0->driver_data = NULL; in gadgetfs_unbind()
1670 if (dev->req) in gadgetfs_unbind()
1671 usb_ep_free_request (gadget->ep0, dev->req); in gadgetfs_unbind()
1684 return -ESRCH; in gadgetfs_bind()
1685 if (0 != strcmp (CHIP, gadget->name)) { in gadgetfs_bind()
1687 shortname, CHIP, gadget->name); in gadgetfs_bind()
1688 return -ENODEV; in gadgetfs_bind()
1692 dev->gadget = gadget; in gadgetfs_bind()
1693 gadget->ep0->driver_data = dev; in gadgetfs_bind()
1696 dev->req = usb_ep_alloc_request (gadget->ep0, GFP_KERNEL); in gadgetfs_bind()
1697 if (!dev->req) in gadgetfs_bind()
1699 dev->req->context = NULL; in gadgetfs_bind()
1700 dev->req->complete = epio_complete; in gadgetfs_bind()
1705 INFO (dev, "bound to %s driver\n", gadget->name); in gadgetfs_bind()
1706 spin_lock_irq(&dev->lock); in gadgetfs_bind()
1707 dev->state = STATE_DEV_UNCONNECTED; in gadgetfs_bind()
1708 spin_unlock_irq(&dev->lock); in gadgetfs_bind()
1714 return -ENOMEM; in gadgetfs_bind()
1723 spin_lock_irqsave (&dev->lock, flags); in gadgetfs_disconnect()
1724 if (dev->state == STATE_DEV_UNCONNECTED) in gadgetfs_disconnect()
1726 dev->state = STATE_DEV_UNCONNECTED; in gadgetfs_disconnect()
1732 spin_unlock_irqrestore (&dev->lock, flags); in gadgetfs_disconnect()
1741 INFO (dev, "suspended from state %d\n", dev->state); in gadgetfs_suspend()
1742 spin_lock_irqsave(&dev->lock, flags); in gadgetfs_suspend()
1743 switch (dev->state) { in gadgetfs_suspend()
1753 spin_unlock_irqrestore(&dev->lock, flags); in gadgetfs_suspend()
1770 /*----------------------------------------------------------------------*/
1781 * would change to support features like multi-config devices
1785 * this one's optional except for high-speed hardware
1800 return config->bDescriptorType == USB_DT_CONFIG in is_valid_config()
1801 && config->bLength == USB_DT_CONFIG_SIZE in is_valid_config()
1803 && config->bConfigurationValue != 0 in is_valid_config()
1804 && (config->bmAttributes & USB_CONFIG_ATT_ONE) != 0 in is_valid_config()
1805 && (config->bmAttributes & USB_CONFIG_ATT_WAKEUP) == 0; in is_valid_config()
1806 /* FIXME if gadget->is_otg, _must_ include an otg descriptor */ in is_valid_config()
1813 struct dev_data *dev = fd->private_data; in dev_config()
1819 spin_lock_irq(&dev->lock); in dev_config()
1820 if (dev->state > STATE_DEV_OPENED) { in dev_config()
1822 spin_unlock_irq(&dev->lock); in dev_config()
1825 spin_unlock_irq(&dev->lock); in dev_config()
1829 return -EINVAL; in dev_config()
1833 return -EFAULT; in dev_config()
1835 return -EINVAL; in dev_config()
1837 length -= 4; in dev_config()
1843 spin_lock_irq (&dev->lock); in dev_config()
1844 value = -EINVAL; in dev_config()
1845 if (dev->buf) { in dev_config()
1846 spin_unlock_irq(&dev->lock); in dev_config()
1850 dev->buf = kbuf; in dev_config()
1853 dev->config = (void *) kbuf; in dev_config()
1854 total = le16_to_cpu(dev->config->wTotalLength); in dev_config()
1855 if (!is_valid_config(dev->config, total) || in dev_config()
1856 total > length - USB_DT_DEVICE_SIZE) in dev_config()
1859 length -= total; in dev_config()
1863 dev->hs_config = (void *) kbuf; in dev_config()
1864 total = le16_to_cpu(dev->hs_config->wTotalLength); in dev_config()
1865 if (!is_valid_config(dev->hs_config, total) || in dev_config()
1866 total > length - USB_DT_DEVICE_SIZE) in dev_config()
1869 length -= total; in dev_config()
1871 dev->hs_config = NULL; in dev_config()
1879 dev->dev = (void *)kbuf; in dev_config()
1880 if (dev->dev->bLength != USB_DT_DEVICE_SIZE in dev_config()
1881 || dev->dev->bDescriptorType != USB_DT_DEVICE in dev_config()
1882 || dev->dev->bNumConfigurations != 1) in dev_config()
1884 dev->dev->bcdUSB = cpu_to_le16 (0x0200); in dev_config()
1887 spin_unlock_irq (&dev->lock); in dev_config()
1888 if (dev->hs_config) in dev_config()
1895 spin_lock_irq(&dev->lock); in dev_config()
1900 * unplug/replug that will clear all the error state. in dev_config()
1908 dev->gadget_registered = true; in dev_config()
1913 dev->config = NULL; in dev_config()
1914 dev->hs_config = NULL; in dev_config()
1915 dev->dev = NULL; in dev_config()
1916 spin_unlock_irq (&dev->lock); in dev_config()
1918 kfree (dev->buf); in dev_config()
1919 dev->buf = NULL; in dev_config()
1926 struct dev_data *dev = inode->i_private; in gadget_dev_open()
1927 int value = -EBUSY; in gadget_dev_open()
1929 spin_lock_irq(&dev->lock); in gadget_dev_open()
1930 if (dev->state == STATE_DEV_DISABLED) { in gadget_dev_open()
1931 dev->ev_next = 0; in gadget_dev_open()
1932 dev->state = STATE_DEV_OPENED; in gadget_dev_open()
1933 fd->private_data = dev; in gadget_dev_open()
1937 spin_unlock_irq(&dev->lock); in gadget_dev_open()
1952 /*----------------------------------------------------------------------*/
1982 inode->i_ino = get_next_ino(); in gadgetfs_make_inode()
1983 inode->i_mode = mode; in gadgetfs_make_inode()
1984 inode->i_uid = make_kuid(&init_user_ns, default_uid); in gadgetfs_make_inode()
1985 inode->i_gid = make_kgid(&init_user_ns, default_gid); in gadgetfs_make_inode()
1987 inode->i_private = data; in gadgetfs_make_inode()
1988 inode->i_fop = fops; in gadgetfs_make_inode()
1993 /* creates in fs root directory, so non-renamable and non-linkable.
2003 dentry = d_alloc_name(sb->s_root, name); in gadgetfs_create_file()
2032 rc = -ESRCH; in gadgetfs_fill_super()
2038 rc = -ENODEV; in gadgetfs_fill_super()
2043 sb->s_blocksize = PAGE_SIZE; in gadgetfs_fill_super()
2044 sb->s_blocksize_bits = PAGE_SHIFT; in gadgetfs_fill_super()
2045 sb->s_magic = GADGETFS_MAGIC; in gadgetfs_fill_super()
2046 sb->s_op = &gadget_fs_operations; in gadgetfs_fill_super()
2047 sb->s_time_gran = 1; in gadgetfs_fill_super()
2055 inode->i_op = &simple_dir_inode_operations; in gadgetfs_fill_super()
2056 if (!(sb->s_root = d_make_root (inode))) in gadgetfs_fill_super()
2066 dev->sb = sb; in gadgetfs_fill_super()
2067 dev->dentry = gadgetfs_create_file(sb, CHIP, dev, &ep0_operations); in gadgetfs_fill_super()
2068 if (!dev->dentry) { in gadgetfs_fill_super()
2083 rc = -ENOMEM; in gadgetfs_fill_super()
2090 /* "mount -t gadgetfs path /dev/gadget" ends up here */
2102 fc->ops = &gadgetfs_context_ops; in gadgetfs_init_fs_context()
2120 /*----------------------------------------------------------------------*/
2130 /*----------------------------------------------------------------------*/