Lines Matching +full:lock +full:- +full:status
1 // SPDX-License-Identifier: GPL-2.0+
3 * f_printer.c - USB printer function driver
8 * printer.c -- Printer gadget driver
10 * Copyright (C) 2003-2005 David Brownell
64 /*-------------------------------------------------------------------------*/
67 spinlock_t lock; /* lock this structure */ member
68 /* lock buffer lists during read/write calls */
104 /*-------------------------------------------------------------------------*/
120 .bInterfaceSubClass = 1, /* Printer Sub-Class */
121 .bInterfaceProtocol = 2, /* Bi-Directional */
215 switch (gadget->speed) { in ep_desc()
226 /*-------------------------------------------------------------------------*/
243 req->length = len; in printer_req_alloc()
244 req->buf = kmalloc(len, gfp_flags); in printer_req_alloc()
245 if (req->buf == NULL) { in printer_req_alloc()
258 kfree(req->buf); in printer_req_free()
263 /*-------------------------------------------------------------------------*/
267 struct printer_dev *dev = ep->driver_data; in rx_complete()
268 int status = req->status; in rx_complete() local
271 spin_lock_irqsave(&dev->lock, flags); in rx_complete()
273 list_del_init(&req->list); /* Remode from Active List */ in rx_complete()
275 switch (status) { in rx_complete()
279 if (req->actual > 0) { in rx_complete()
280 list_add_tail(&req->list, &dev->rx_buffers); in rx_complete()
281 DBG(dev, "G_Printer : rx length %d\n", req->actual); in rx_complete()
283 list_add(&req->list, &dev->rx_reqs); in rx_complete()
287 /* software-driven interface shutdown */ in rx_complete()
288 case -ECONNRESET: /* unlink */ in rx_complete()
289 case -ESHUTDOWN: /* disconnect etc */ in rx_complete()
290 VDBG(dev, "rx shutdown, code %d\n", status); in rx_complete()
291 list_add(&req->list, &dev->rx_reqs); in rx_complete()
295 case -ECONNABORTED: /* endpoint reset */ in rx_complete()
296 DBG(dev, "rx %s reset\n", ep->name); in rx_complete()
297 list_add(&req->list, &dev->rx_reqs); in rx_complete()
301 case -EOVERFLOW: in rx_complete()
305 DBG(dev, "rx status %d\n", status); in rx_complete()
306 list_add(&req->list, &dev->rx_reqs); in rx_complete()
310 wake_up_interruptible(&dev->rx_wait); in rx_complete()
311 spin_unlock_irqrestore(&dev->lock, flags); in rx_complete()
316 struct printer_dev *dev = ep->driver_data; in tx_complete()
318 switch (req->status) { in tx_complete()
320 VDBG(dev, "tx err %d\n", req->status); in tx_complete()
322 case -ECONNRESET: /* unlink */ in tx_complete()
323 case -ESHUTDOWN: /* disconnect etc */ in tx_complete()
329 spin_lock(&dev->lock); in tx_complete()
333 list_del_init(&req->list); in tx_complete()
334 list_add(&req->list, &dev->tx_reqs); in tx_complete()
335 wake_up_interruptible(&dev->tx_wait); in tx_complete()
336 if (likely(list_empty(&dev->tx_reqs_active))) in tx_complete()
337 wake_up_interruptible(&dev->tx_flush_wait); in tx_complete()
339 spin_unlock(&dev->lock); in tx_complete()
342 /*-------------------------------------------------------------------------*/
349 int ret = -EBUSY; in printer_open()
351 dev = container_of(inode->i_cdev, struct printer_dev, printer_cdev); in printer_open()
353 spin_lock_irqsave(&dev->lock, flags); in printer_open()
355 if (dev->interface < 0) { in printer_open()
356 spin_unlock_irqrestore(&dev->lock, flags); in printer_open()
357 return -ENODEV; in printer_open()
360 if (!dev->printer_cdev_open) { in printer_open()
361 dev->printer_cdev_open = 1; in printer_open()
362 fd->private_data = dev; in printer_open()
364 /* Change the printer status to show that it's on-line. */ in printer_open()
365 dev->printer_status |= PRINTER_SELECTED; in printer_open()
368 spin_unlock_irqrestore(&dev->lock, flags); in printer_open()
370 kref_get(&dev->kref); in printer_open()
378 struct printer_dev *dev = fd->private_data; in printer_close()
381 spin_lock_irqsave(&dev->lock, flags); in printer_close()
382 dev->printer_cdev_open = 0; in printer_close()
383 fd->private_data = NULL; in printer_close()
384 /* Change printer status to show that the printer is off-line. */ in printer_close()
385 dev->printer_status &= ~PRINTER_SELECTED; in printer_close()
386 spin_unlock_irqrestore(&dev->lock, flags); in printer_close()
388 kref_put(&dev->kref, printer_dev_free); in printer_close()
399 while (likely(!list_empty(&dev->rx_reqs))) { in setup_rx_reqs()
402 req = container_of(dev->rx_reqs.next, in setup_rx_reqs()
404 list_del_init(&req->list); in setup_rx_reqs()
412 req->length = USB_BUFSIZE; in setup_rx_reqs()
413 req->complete = rx_complete; in setup_rx_reqs()
416 spin_unlock(&dev->lock); in setup_rx_reqs()
417 error = usb_ep_queue(dev->out_ep, req, GFP_ATOMIC); in setup_rx_reqs()
418 spin_lock(&dev->lock); in setup_rx_reqs()
420 DBG(dev, "rx submit --> %d\n", error); in setup_rx_reqs()
421 list_add(&req->list, &dev->rx_reqs); in setup_rx_reqs()
424 /* if the req is empty, then add it into dev->rx_reqs_active. */ in setup_rx_reqs()
425 else if (list_empty(&req->list)) in setup_rx_reqs()
426 list_add(&req->list, &dev->rx_reqs_active); in setup_rx_reqs()
433 struct printer_dev *dev = fd->private_data; in printer_read()
446 return -EINVAL; in printer_read()
450 mutex_lock(&dev->lock_printer_io); in printer_read()
451 spin_lock_irqsave(&dev->lock, flags); in printer_read()
453 if (dev->interface < 0) in printer_read()
459 dev->reset_printer = 0; in printer_read()
462 /* this dropped the lock - need to retest */ in printer_read()
463 if (dev->interface < 0) in printer_read()
467 current_rx_req = dev->current_rx_req; in printer_read()
468 current_rx_bytes = dev->current_rx_bytes; in printer_read()
469 current_rx_buf = dev->current_rx_buf; in printer_read()
470 dev->current_rx_req = NULL; in printer_read()
471 dev->current_rx_bytes = 0; in printer_read()
472 dev->current_rx_buf = NULL; in printer_read()
481 (likely(list_empty(&dev->rx_buffers)))) { in printer_read()
483 spin_unlock_irqrestore(&dev->lock, flags); in printer_read()
486 * If no data is available check if this is a NON-Blocking in printer_read()
489 if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { in printer_read()
490 mutex_unlock(&dev->lock_printer_io); in printer_read()
491 return -EAGAIN; in printer_read()
495 wait_event_interruptible(dev->rx_wait, in printer_read()
496 (likely(!list_empty(&dev->rx_buffers)))); in printer_read()
497 spin_lock_irqsave(&dev->lock, flags); in printer_read()
498 if (dev->interface < 0) in printer_read()
503 while ((current_rx_bytes || likely(!list_empty(&dev->rx_buffers))) in printer_read()
506 req = container_of(dev->rx_buffers.next, in printer_read()
508 list_del_init(&req->list); in printer_read()
510 if (req->actual && req->buf) { in printer_read()
512 current_rx_bytes = req->actual; in printer_read()
513 current_rx_buf = req->buf; in printer_read()
515 list_add(&req->list, &dev->rx_reqs); in printer_read()
521 spin_unlock_irqrestore(&dev->lock, flags); in printer_read()
528 size -= copy_to_user(buf, current_rx_buf, size); in printer_read()
530 len -= size; in printer_read()
533 spin_lock_irqsave(&dev->lock, flags); in printer_read()
536 if (dev->reset_printer) { in printer_read()
537 list_add(¤t_rx_req->list, &dev->rx_reqs); in printer_read()
538 spin_unlock_irqrestore(&dev->lock, flags); in printer_read()
539 mutex_unlock(&dev->lock_printer_io); in printer_read()
540 return -EAGAIN; in printer_read()
543 if (dev->interface < 0) in printer_read()
552 current_rx_bytes -= size; in printer_read()
555 list_add(¤t_rx_req->list, &dev->rx_reqs); in printer_read()
562 dev->current_rx_req = current_rx_req; in printer_read()
563 dev->current_rx_bytes = current_rx_bytes; in printer_read()
564 dev->current_rx_buf = current_rx_buf; in printer_read()
566 spin_unlock_irqrestore(&dev->lock, flags); in printer_read()
567 mutex_unlock(&dev->lock_printer_io); in printer_read()
574 return -EAGAIN; in printer_read()
577 spin_unlock_irqrestore(&dev->lock, flags); in printer_read()
578 mutex_unlock(&dev->lock_printer_io); in printer_read()
579 return -ENODEV; in printer_read()
585 struct printer_dev *dev = fd->private_data; in printer_write()
595 return -EINVAL; in printer_write()
597 mutex_lock(&dev->lock_printer_io); in printer_write()
598 spin_lock_irqsave(&dev->lock, flags); in printer_write()
600 if (dev->interface < 0) in printer_write()
604 dev->reset_printer = 0; in printer_write()
607 if (likely(list_empty(&dev->tx_reqs))) { in printer_write()
609 spin_unlock_irqrestore(&dev->lock, flags); in printer_write()
613 * a NON-Blocking call or not. in printer_write()
615 if (fd->f_flags & (O_NONBLOCK|O_NDELAY)) { in printer_write()
616 mutex_unlock(&dev->lock_printer_io); in printer_write()
617 return -EAGAIN; in printer_write()
621 wait_event_interruptible(dev->tx_wait, in printer_write()
622 (likely(!list_empty(&dev->tx_reqs)))); in printer_write()
623 spin_lock_irqsave(&dev->lock, flags); in printer_write()
624 if (dev->interface < 0) in printer_write()
628 while (likely(!list_empty(&dev->tx_reqs)) && len) { in printer_write()
635 req = container_of(dev->tx_reqs.next, struct usb_request, in printer_write()
637 list_del_init(&req->list); in printer_write()
639 req->complete = tx_complete; in printer_write()
640 req->length = size; in printer_write()
645 req->zero = 0; in printer_write()
650 req->zero = ((len % dev->in_ep->maxpacket) == 0); in printer_write()
653 spin_unlock_irqrestore(&dev->lock, flags); in printer_write()
655 if (copy_from_user(req->buf, buf, size)) { in printer_write()
656 list_add(&req->list, &dev->tx_reqs); in printer_write()
657 mutex_unlock(&dev->lock_printer_io); in printer_write()
662 len -= size; in printer_write()
665 spin_lock_irqsave(&dev->lock, flags); in printer_write()
668 if (dev->reset_printer) { in printer_write()
669 list_add(&req->list, &dev->tx_reqs); in printer_write()
670 spin_unlock_irqrestore(&dev->lock, flags); in printer_write()
671 mutex_unlock(&dev->lock_printer_io); in printer_write()
672 return -EAGAIN; in printer_write()
675 if (dev->interface < 0) in printer_write()
678 list_add(&req->list, &dev->tx_reqs_active); in printer_write()
681 spin_unlock(&dev->lock); in printer_write()
682 value = usb_ep_queue(dev->in_ep, req, GFP_ATOMIC); in printer_write()
683 spin_lock(&dev->lock); in printer_write()
685 list_move(&req->list, &dev->tx_reqs); in printer_write()
686 spin_unlock_irqrestore(&dev->lock, flags); in printer_write()
687 mutex_unlock(&dev->lock_printer_io); in printer_write()
688 return -EAGAIN; in printer_write()
690 if (dev->interface < 0) in printer_write()
694 spin_unlock_irqrestore(&dev->lock, flags); in printer_write()
695 mutex_unlock(&dev->lock_printer_io); in printer_write()
702 return -EAGAIN; in printer_write()
705 spin_unlock_irqrestore(&dev->lock, flags); in printer_write()
706 mutex_unlock(&dev->lock_printer_io); in printer_write()
707 return -ENODEV; in printer_write()
713 struct printer_dev *dev = fd->private_data; in printer_fsync()
719 spin_lock_irqsave(&dev->lock, flags); in printer_fsync()
721 if (dev->interface < 0) { in printer_fsync()
722 spin_unlock_irqrestore(&dev->lock, flags); in printer_fsync()
724 return -ENODEV; in printer_fsync()
727 tx_list_empty = (likely(list_empty(&dev->tx_reqs))); in printer_fsync()
728 spin_unlock_irqrestore(&dev->lock, flags); in printer_fsync()
732 wait_event_interruptible(dev->tx_flush_wait, in printer_fsync()
733 (likely(list_empty(&dev->tx_reqs_active)))); in printer_fsync()
743 struct printer_dev *dev = fd->private_data; in printer_poll()
745 __poll_t status = 0; in printer_poll() local
747 mutex_lock(&dev->lock_printer_io); in printer_poll()
748 spin_lock_irqsave(&dev->lock, flags); in printer_poll()
750 if (dev->interface < 0) { in printer_poll()
751 spin_unlock_irqrestore(&dev->lock, flags); in printer_poll()
752 mutex_unlock(&dev->lock_printer_io); in printer_poll()
757 spin_unlock_irqrestore(&dev->lock, flags); in printer_poll()
758 mutex_unlock(&dev->lock_printer_io); in printer_poll()
760 poll_wait(fd, &dev->rx_wait, wait); in printer_poll()
761 poll_wait(fd, &dev->tx_wait, wait); in printer_poll()
763 spin_lock_irqsave(&dev->lock, flags); in printer_poll()
764 if (likely(!list_empty(&dev->tx_reqs))) in printer_poll()
765 status |= EPOLLOUT | EPOLLWRNORM; in printer_poll()
767 if (likely(dev->current_rx_bytes) || in printer_poll()
768 likely(!list_empty(&dev->rx_buffers))) in printer_poll()
769 status |= EPOLLIN | EPOLLRDNORM; in printer_poll()
771 spin_unlock_irqrestore(&dev->lock, flags); in printer_poll()
773 return status; in printer_poll()
779 struct printer_dev *dev = fd->private_data; in printer_ioctl()
781 int status = 0; in printer_ioctl() local
787 spin_lock_irqsave(&dev->lock, flags); in printer_ioctl()
789 if (dev->interface < 0) { in printer_ioctl()
790 spin_unlock_irqrestore(&dev->lock, flags); in printer_ioctl()
791 return -ENODEV; in printer_ioctl()
796 status = (int)dev->printer_status; in printer_ioctl()
799 dev->printer_status = (u8)arg; in printer_ioctl()
805 status = -ENOTTY; in printer_ioctl()
808 spin_unlock_irqrestore(&dev->lock, flags); in printer_ioctl()
810 return status; in printer_ioctl()
826 /*-------------------------------------------------------------------------*/
833 dev->in_ep->desc = ep_desc(dev->gadget, &fs_ep_in_desc, &hs_ep_in_desc, in set_printer_interface()
835 dev->in_ep->driver_data = dev; in set_printer_interface()
837 dev->out_ep->desc = ep_desc(dev->gadget, &fs_ep_out_desc, in set_printer_interface()
839 dev->out_ep->driver_data = dev; in set_printer_interface()
841 result = usb_ep_enable(dev->in_ep); in set_printer_interface()
843 DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); in set_printer_interface()
847 result = usb_ep_enable(dev->out_ep); in set_printer_interface()
849 DBG(dev, "enable %s --> %d\n", dev->out_ep->name, result); in set_printer_interface()
856 (void) usb_ep_disable(dev->in_ep); in set_printer_interface()
857 (void) usb_ep_disable(dev->out_ep); in set_printer_interface()
858 dev->in_ep->desc = NULL; in set_printer_interface()
859 dev->out_ep->desc = NULL; in set_printer_interface()
870 if (dev->interface < 0) in printer_reset_interface()
873 if (dev->in_ep->desc) in printer_reset_interface()
874 usb_ep_disable(dev->in_ep); in printer_reset_interface()
876 if (dev->out_ep->desc) in printer_reset_interface()
877 usb_ep_disable(dev->out_ep); in printer_reset_interface()
879 spin_lock_irqsave(&dev->lock, flags); in printer_reset_interface()
880 dev->in_ep->desc = NULL; in printer_reset_interface()
881 dev->out_ep->desc = NULL; in printer_reset_interface()
882 dev->interface = -1; in printer_reset_interface()
883 spin_unlock_irqrestore(&dev->lock, flags); in printer_reset_interface()
898 dev->interface = number; in set_interface()
910 if (usb_ep_disable(dev->in_ep)) in printer_soft_reset()
912 if (usb_ep_disable(dev->out_ep)) in printer_soft_reset()
915 if (dev->current_rx_req != NULL) { in printer_soft_reset()
916 list_add(&dev->current_rx_req->list, &dev->rx_reqs); in printer_soft_reset()
917 dev->current_rx_req = NULL; in printer_soft_reset()
919 dev->current_rx_bytes = 0; in printer_soft_reset()
920 dev->current_rx_buf = NULL; in printer_soft_reset()
921 dev->reset_printer = 1; in printer_soft_reset()
923 while (likely(!(list_empty(&dev->rx_buffers)))) { in printer_soft_reset()
924 req = container_of(dev->rx_buffers.next, struct usb_request, in printer_soft_reset()
926 list_del_init(&req->list); in printer_soft_reset()
927 list_add(&req->list, &dev->rx_reqs); in printer_soft_reset()
930 while (likely(!(list_empty(&dev->rx_reqs_active)))) { in printer_soft_reset()
931 req = container_of(dev->rx_buffers.next, struct usb_request, in printer_soft_reset()
933 list_del_init(&req->list); in printer_soft_reset()
934 list_add(&req->list, &dev->rx_reqs); in printer_soft_reset()
937 while (likely(!(list_empty(&dev->tx_reqs_active)))) { in printer_soft_reset()
938 req = container_of(dev->tx_reqs_active.next, in printer_soft_reset()
940 list_del_init(&req->list); in printer_soft_reset()
941 list_add(&req->list, &dev->tx_reqs); in printer_soft_reset()
944 if (usb_ep_enable(dev->in_ep)) in printer_soft_reset()
946 if (usb_ep_enable(dev->out_ep)) in printer_soft_reset()
949 wake_up_interruptible(&dev->rx_wait); in printer_soft_reset()
950 wake_up_interruptible(&dev->tx_wait); in printer_soft_reset()
951 wake_up_interruptible(&dev->tx_flush_wait); in printer_soft_reset()
954 /*-------------------------------------------------------------------------*/
961 u16 w_index = le16_to_cpu(ctrl->wIndex); in gprinter_req_match()
962 u16 w_value = le16_to_cpu(ctrl->wValue); in gprinter_req_match()
963 u16 w_length = le16_to_cpu(ctrl->wLength); in gprinter_req_match()
968 if ((ctrl->bRequestType & USB_RECIP_MASK) != USB_RECIP_INTERFACE || in gprinter_req_match()
969 (ctrl->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS) in gprinter_req_match()
972 switch (ctrl->bRequest) { in gprinter_req_match()
975 if (USB_DIR_IN & ctrl->bRequestType) in gprinter_req_match()
980 (USB_DIR_IN & ctrl->bRequestType)) in gprinter_req_match()
985 !(USB_DIR_IN & ctrl->bRequestType)) in gprinter_req_match()
991 return w_index == dev->interface; in gprinter_req_match()
1002 struct usb_composite_dev *cdev = f->config->cdev; in printer_func_setup()
1003 struct usb_request *req = cdev->req; in printer_func_setup()
1004 u8 *buf = req->buf; in printer_func_setup()
1005 int value = -EOPNOTSUPP; in printer_func_setup()
1006 u16 wIndex = le16_to_cpu(ctrl->wIndex); in printer_func_setup()
1007 u16 wValue = le16_to_cpu(ctrl->wValue); in printer_func_setup()
1008 u16 wLength = le16_to_cpu(ctrl->wLength); in printer_func_setup()
1011 ctrl->bRequestType, ctrl->bRequest, wValue, wIndex, wLength); in printer_func_setup()
1013 switch (ctrl->bRequestType&USB_TYPE_MASK) { in printer_func_setup()
1015 switch (ctrl->bRequest) { in printer_func_setup()
1016 case GET_DEVICE_ID: /* Get the IEEE-1284 PNP String */ in printer_func_setup()
1018 if ((wIndex>>8) != dev->interface) in printer_func_setup()
1021 if (!*dev->pnp_string) { in printer_func_setup()
1025 value = strlen(*dev->pnp_string); in printer_func_setup()
1028 memcpy(buf + 2, *dev->pnp_string, value); in printer_func_setup()
1030 *dev->pnp_string); in printer_func_setup()
1033 case GET_PORT_STATUS: /* Get Port Status */ in printer_func_setup()
1035 if (wIndex != dev->interface) in printer_func_setup()
1038 buf[0] = dev->printer_status; in printer_func_setup()
1044 if (wIndex != dev->interface) in printer_func_setup()
1061 ctrl->bRequestType, ctrl->bRequest, in printer_func_setup()
1067 req->length = value; in printer_func_setup()
1068 req->zero = value < wLength; in printer_func_setup()
1069 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); in printer_func_setup()
1072 req->status = 0; in printer_func_setup()
1081 struct usb_gadget *gadget = c->cdev->gadget; in printer_func_bind()
1084 struct usb_composite_dev *cdev = c->cdev; in printer_func_bind()
1099 dev->gadget = gadget; in printer_func_bind()
1102 in_ep = usb_ep_autoconfig(cdev->gadget, &fs_ep_in_desc); in printer_func_bind()
1105 dev_err(&cdev->gadget->dev, "can't autoconfigure on %s\n", in printer_func_bind()
1106 cdev->gadget->name); in printer_func_bind()
1107 return -ENODEV; in printer_func_bind()
1110 out_ep = usb_ep_autoconfig(cdev->gadget, &fs_ep_out_desc); in printer_func_bind()
1114 /* assumes that all endpoints are dual-speed */ in printer_func_bind()
1126 dev->in_ep = in_ep; in printer_func_bind()
1127 dev->out_ep = out_ep; in printer_func_bind()
1129 ret = -ENOMEM; in printer_func_bind()
1130 for (i = 0; i < dev->q_len; i++) { in printer_func_bind()
1131 req = printer_req_alloc(dev->in_ep, USB_BUFSIZE, GFP_KERNEL); in printer_func_bind()
1134 list_add(&req->list, &dev->tx_reqs); in printer_func_bind()
1137 for (i = 0; i < dev->q_len; i++) { in printer_func_bind()
1138 req = printer_req_alloc(dev->out_ep, USB_BUFSIZE, GFP_KERNEL); in printer_func_bind()
1141 list_add(&req->list, &dev->rx_reqs); in printer_func_bind()
1145 devt = MKDEV(major, dev->minor); in printer_func_bind()
1147 NULL, "g_printer%d", dev->minor); in printer_func_bind()
1158 cdev_init(&dev->printer_cdev, &printer_io_operations); in printer_func_bind()
1159 dev->printer_cdev.owner = THIS_MODULE; in printer_func_bind()
1160 ret = cdev_add(&dev->printer_cdev, devt, 1); in printer_func_bind()
1172 while (!list_empty(&dev->rx_reqs)) { in printer_func_bind()
1173 req = container_of(dev->rx_reqs.next, struct usb_request, list); in printer_func_bind()
1174 list_del(&req->list); in printer_func_bind()
1175 printer_req_free(dev->out_ep, req); in printer_func_bind()
1179 while (!list_empty(&dev->tx_reqs)) { in printer_func_bind()
1180 req = container_of(dev->tx_reqs.next, struct usb_request, list); in printer_func_bind()
1181 list_del(&req->list); in printer_func_bind()
1182 printer_req_free(dev->in_ep, req); in printer_func_bind()
1194 int ret = -ENOTSUPP; in printer_func_set_alt()
1220 usb_put_function_instance(&opts->func_inst); in printer_attr_release()
1233 mutex_lock(&opts->lock); in f_printer_opts_pnp_string_show()
1234 if (!opts->pnp_string) in f_printer_opts_pnp_string_show()
1237 result = strscpy(page, opts->pnp_string, PAGE_SIZE); in f_printer_opts_pnp_string_show()
1240 } else if (page[result - 1] != '\n' && result + 1 < PAGE_SIZE) { in f_printer_opts_pnp_string_show()
1246 mutex_unlock(&opts->lock); in f_printer_opts_pnp_string_show()
1258 mutex_lock(&opts->lock); in f_printer_opts_pnp_string_store()
1262 result = -ENOMEM; in f_printer_opts_pnp_string_store()
1266 if (opts->pnp_string_allocated) in f_printer_opts_pnp_string_store()
1267 kfree(opts->pnp_string); in f_printer_opts_pnp_string_store()
1269 opts->pnp_string_allocated = true; in f_printer_opts_pnp_string_store()
1270 opts->pnp_string = new_pnp; in f_printer_opts_pnp_string_store()
1273 mutex_unlock(&opts->lock); in f_printer_opts_pnp_string_store()
1286 mutex_lock(&opts->lock); in f_printer_opts_q_len_show()
1287 result = sprintf(page, "%d\n", opts->q_len); in f_printer_opts_q_len_show()
1288 mutex_unlock(&opts->lock); in f_printer_opts_q_len_show()
1300 mutex_lock(&opts->lock); in f_printer_opts_q_len_store()
1301 if (opts->refcnt) { in f_printer_opts_q_len_store()
1302 ret = -EBUSY; in f_printer_opts_q_len_store()
1310 opts->q_len = (unsigned)num; in f_printer_opts_q_len_store()
1313 mutex_unlock(&opts->lock); in f_printer_opts_q_len_store()
1338 ret = -ENODEV; in gprinter_get_minor()
1360 gprinter_put_minor(opts->minor); in gprinter_free_inst()
1366 if (opts->pnp_string_allocated) in gprinter_free_inst()
1367 kfree(opts->pnp_string); in gprinter_free_inst()
1375 int status = 0; in gprinter_alloc_inst() local
1379 return ERR_PTR(-ENOMEM); in gprinter_alloc_inst()
1381 mutex_init(&opts->lock); in gprinter_alloc_inst()
1382 opts->func_inst.free_func_inst = gprinter_free_inst; in gprinter_alloc_inst()
1383 ret = &opts->func_inst; in gprinter_alloc_inst()
1386 opts->q_len = DEFAULT_Q_LEN; in gprinter_alloc_inst()
1391 status = gprinter_setup(PRINTER_MINORS); in gprinter_alloc_inst()
1392 if (status) { in gprinter_alloc_inst()
1393 ret = ERR_PTR(status); in gprinter_alloc_inst()
1399 opts->minor = gprinter_get_minor(); in gprinter_alloc_inst()
1400 if (opts->minor < 0) { in gprinter_alloc_inst()
1401 ret = ERR_PTR(opts->minor); in gprinter_alloc_inst()
1407 config_group_init_type_name(&opts->func_inst.group, "", in gprinter_alloc_inst()
1420 opts = container_of(f->fi, struct f_printer_opts, func_inst); in gprinter_free()
1422 kref_put(&dev->kref, printer_dev_free); in gprinter_free()
1423 mutex_lock(&opts->lock); in gprinter_free()
1424 --opts->refcnt; in gprinter_free()
1425 mutex_unlock(&opts->lock); in gprinter_free()
1436 device_destroy(&usb_gadget_class, MKDEV(major, dev->minor)); in printer_func_unbind()
1439 cdev_del(&dev->printer_cdev); in printer_func_unbind()
1442 WARN_ON(!list_empty(&dev->tx_reqs_active)); in printer_func_unbind()
1443 WARN_ON(!list_empty(&dev->rx_reqs_active)); in printer_func_unbind()
1446 while (!list_empty(&dev->tx_reqs)) { in printer_func_unbind()
1447 req = container_of(dev->tx_reqs.next, struct usb_request, in printer_func_unbind()
1449 list_del(&req->list); in printer_func_unbind()
1450 printer_req_free(dev->in_ep, req); in printer_func_unbind()
1453 if (dev->current_rx_req != NULL) in printer_func_unbind()
1454 printer_req_free(dev->out_ep, dev->current_rx_req); in printer_func_unbind()
1456 while (!list_empty(&dev->rx_reqs)) { in printer_func_unbind()
1457 req = container_of(dev->rx_reqs.next, in printer_func_unbind()
1459 list_del(&req->list); in printer_func_unbind()
1460 printer_req_free(dev->out_ep, req); in printer_func_unbind()
1463 while (!list_empty(&dev->rx_buffers)) { in printer_func_unbind()
1464 req = container_of(dev->rx_buffers.next, in printer_func_unbind()
1466 list_del(&req->list); in printer_func_unbind()
1467 printer_req_free(dev->out_ep, req); in printer_func_unbind()
1479 mutex_lock(&opts->lock); in gprinter_alloc()
1480 if (opts->minor >= minors) { in gprinter_alloc()
1481 mutex_unlock(&opts->lock); in gprinter_alloc()
1482 return ERR_PTR(-ENOENT); in gprinter_alloc()
1487 mutex_unlock(&opts->lock); in gprinter_alloc()
1488 return ERR_PTR(-ENOMEM); in gprinter_alloc()
1491 kref_init(&dev->kref); in gprinter_alloc()
1492 ++opts->refcnt; in gprinter_alloc()
1493 dev->minor = opts->minor; in gprinter_alloc()
1494 dev->pnp_string = &opts->pnp_string; in gprinter_alloc()
1495 dev->q_len = opts->q_len; in gprinter_alloc()
1496 mutex_unlock(&opts->lock); in gprinter_alloc()
1498 dev->function.name = "printer"; in gprinter_alloc()
1499 dev->function.bind = printer_func_bind; in gprinter_alloc()
1500 dev->function.setup = printer_func_setup; in gprinter_alloc()
1501 dev->function.unbind = printer_func_unbind; in gprinter_alloc()
1502 dev->function.set_alt = printer_func_set_alt; in gprinter_alloc()
1503 dev->function.disable = printer_func_disable; in gprinter_alloc()
1504 dev->function.req_match = gprinter_req_match; in gprinter_alloc()
1505 dev->function.free_func = gprinter_free; in gprinter_alloc()
1507 INIT_LIST_HEAD(&dev->tx_reqs); in gprinter_alloc()
1508 INIT_LIST_HEAD(&dev->rx_reqs); in gprinter_alloc()
1509 INIT_LIST_HEAD(&dev->rx_buffers); in gprinter_alloc()
1510 INIT_LIST_HEAD(&dev->tx_reqs_active); in gprinter_alloc()
1511 INIT_LIST_HEAD(&dev->rx_reqs_active); in gprinter_alloc()
1513 spin_lock_init(&dev->lock); in gprinter_alloc()
1514 mutex_init(&dev->lock_printer_io); in gprinter_alloc()
1515 init_waitqueue_head(&dev->rx_wait); in gprinter_alloc()
1516 init_waitqueue_head(&dev->tx_wait); in gprinter_alloc()
1517 init_waitqueue_head(&dev->tx_flush_wait); in gprinter_alloc()
1519 dev->interface = -1; in gprinter_alloc()
1520 dev->printer_cdev_open = 0; in gprinter_alloc()
1521 dev->printer_status = PRINTER_NOT_ERROR; in gprinter_alloc()
1522 dev->current_rx_req = NULL; in gprinter_alloc()
1523 dev->current_rx_bytes = 0; in gprinter_alloc()
1524 dev->current_rx_buf = NULL; in gprinter_alloc()
1526 return &dev->function; in gprinter_alloc()
1536 int status; in gprinter_setup() local
1539 status = class_register(&usb_gadget_class); in gprinter_setup()
1540 if (status) in gprinter_setup()
1541 return status; in gprinter_setup()
1543 status = alloc_chrdev_region(&devt, 0, count, "USB printer gadget"); in gprinter_setup()
1544 if (status) { in gprinter_setup()
1545 pr_err("alloc_chrdev_region %d\n", status); in gprinter_setup()
1547 return status; in gprinter_setup()
1553 return status; in gprinter_setup()