Lines Matching refs:desc
111 struct wdm_device *desc; in wdm_find_device() local
114 list_for_each_entry(desc, &wdm_device_list, device_list) in wdm_find_device()
115 if (desc->intf == intf) in wdm_find_device()
117 desc = NULL; in wdm_find_device()
121 return desc; in wdm_find_device()
126 struct wdm_device *desc; in wdm_find_device_by_minor() local
129 list_for_each_entry(desc, &wdm_device_list, device_list) in wdm_find_device_by_minor()
130 if (desc->intf->minor == minor) in wdm_find_device_by_minor()
132 desc = NULL; in wdm_find_device_by_minor()
136 return desc; in wdm_find_device_by_minor()
142 struct wdm_device *desc; in wdm_out_callback() local
143 desc = urb->context; in wdm_out_callback()
144 spin_lock(&desc->iuspin); in wdm_out_callback()
145 desc->werr = urb->status; in wdm_out_callback()
146 spin_unlock(&desc->iuspin); in wdm_out_callback()
147 kfree(desc->outbuf); in wdm_out_callback()
148 desc->outbuf = NULL; in wdm_out_callback()
149 clear_bit(WDM_IN_USE, &desc->flags); in wdm_out_callback()
150 wake_up(&desc->wait); in wdm_out_callback()
154 static int service_outstanding_interrupt(struct wdm_device *desc);
158 struct wdm_device *desc = urb->context; in wdm_in_callback() local
162 spin_lock(&desc->iuspin); in wdm_in_callback()
163 clear_bit(WDM_RESPONDING, &desc->flags); in wdm_in_callback()
168 dev_dbg(&desc->intf->dev, in wdm_in_callback()
172 dev_dbg(&desc->intf->dev, in wdm_in_callback()
176 dev_dbg(&desc->intf->dev, in wdm_in_callback()
180 dev_err(&desc->intf->dev, in wdm_in_callback()
184 dev_err(&desc->intf->dev, in wdm_in_callback()
196 if (desc->rerr == 0 && status != -EPIPE) in wdm_in_callback()
197 desc->rerr = status; in wdm_in_callback()
199 if (length + desc->length > desc->wMaxCommand) { in wdm_in_callback()
201 set_bit(WDM_OVERFLOW, &desc->flags); in wdm_in_callback()
204 if (!test_bit(WDM_OVERFLOW, &desc->flags)) { in wdm_in_callback()
205 memmove(desc->ubuf + desc->length, desc->inbuf, length); in wdm_in_callback()
206 desc->length += length; in wdm_in_callback()
207 desc->reslength = length; in wdm_in_callback()
211 set_bit(WDM_READ, &desc->flags); in wdm_in_callback()
212 wake_up(&desc->wait); in wdm_in_callback()
214 if (desc->rerr) { in wdm_in_callback()
221 service_outstanding_interrupt(desc); in wdm_in_callback()
224 spin_unlock(&desc->iuspin); in wdm_in_callback()
232 struct wdm_device *desc; in wdm_int_callback() local
235 desc = urb->context; in wdm_int_callback()
236 dr = (struct usb_cdc_notification *)desc->sbuf; in wdm_int_callback()
245 set_bit(WDM_INT_STALL, &desc->flags); in wdm_int_callback()
246 dev_err(&desc->intf->dev, "Stall on int endpoint\n"); in wdm_int_callback()
249 dev_err(&desc->intf->dev, in wdm_int_callback()
256 dev_err(&desc->intf->dev, "wdm_int_callback - %d bytes\n", in wdm_int_callback()
263 dev_dbg(&desc->intf->dev, in wdm_int_callback()
270 dev_dbg(&desc->intf->dev, in wdm_int_callback()
275 dev_dbg(&desc->intf->dev, "SPEED_CHANGE received (len %u)\n", in wdm_int_callback()
279 clear_bit(WDM_POLL_RUNNING, &desc->flags); in wdm_int_callback()
280 dev_err(&desc->intf->dev, in wdm_int_callback()
288 spin_lock(&desc->iuspin); in wdm_int_callback()
289 responding = test_and_set_bit(WDM_RESPONDING, &desc->flags); in wdm_int_callback()
290 if (!desc->resp_count++ && !responding in wdm_int_callback()
291 && !test_bit(WDM_DISCONNECTING, &desc->flags) in wdm_int_callback()
292 && !test_bit(WDM_SUSPENDING, &desc->flags)) { in wdm_int_callback()
293 rv = usb_submit_urb(desc->response, GFP_ATOMIC); in wdm_int_callback()
294 dev_dbg(&desc->intf->dev, "submit response URB %d\n", rv); in wdm_int_callback()
296 spin_unlock(&desc->iuspin); in wdm_int_callback()
298 clear_bit(WDM_RESPONDING, &desc->flags); in wdm_int_callback()
303 rv = schedule_work(&desc->rxwork); in wdm_int_callback()
305 dev_err(&desc->intf->dev, in wdm_int_callback()
312 dev_err(&desc->intf->dev, in wdm_int_callback()
318 static void kill_urbs(struct wdm_device *desc) in kill_urbs() argument
321 usb_kill_urb(desc->command); in kill_urbs()
322 usb_kill_urb(desc->validity); in kill_urbs()
323 usb_kill_urb(desc->response); in kill_urbs()
326 static void free_urbs(struct wdm_device *desc) in free_urbs() argument
328 usb_free_urb(desc->validity); in free_urbs()
329 usb_free_urb(desc->response); in free_urbs()
330 usb_free_urb(desc->command); in free_urbs()
333 static void cleanup(struct wdm_device *desc) in cleanup() argument
335 kfree(desc->sbuf); in cleanup()
336 kfree(desc->inbuf); in cleanup()
337 kfree(desc->orq); in cleanup()
338 kfree(desc->irq); in cleanup()
339 kfree(desc->ubuf); in cleanup()
340 free_urbs(desc); in cleanup()
341 kfree(desc); in cleanup()
349 struct wdm_device *desc = file->private_data; in wdm_write() local
352 if (count > desc->wMaxCommand) in wdm_write()
353 count = desc->wMaxCommand; in wdm_write()
355 spin_lock_irq(&desc->iuspin); in wdm_write()
356 we = desc->werr; in wdm_write()
357 desc->werr = 0; in wdm_write()
358 spin_unlock_irq(&desc->iuspin); in wdm_write()
367 r = mutex_lock_interruptible(&desc->wlock); in wdm_write()
372 if (test_bit(WDM_DISCONNECTING, &desc->flags)) { in wdm_write()
377 r = usb_autopm_get_interface(desc->intf); in wdm_write()
384 r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, in wdm_write()
385 &desc->flags)); in wdm_write()
387 if (test_bit(WDM_IN_USE, &desc->flags)) in wdm_write()
390 if (test_bit(WDM_RESETTING, &desc->flags)) in wdm_write()
398 req = desc->orq; in wdm_write()
400 desc->command, in wdm_write()
401 interface_to_usbdev(desc->intf), in wdm_write()
403 usb_sndctrlpipe(interface_to_usbdev(desc->intf), 0), in wdm_write()
408 desc in wdm_write()
415 req->wIndex = desc->inum; /* already converted */ in wdm_write()
417 set_bit(WDM_IN_USE, &desc->flags); in wdm_write()
418 desc->outbuf = buf; in wdm_write()
420 rv = usb_submit_urb(desc->command, GFP_KERNEL); in wdm_write()
422 desc->outbuf = NULL; in wdm_write()
423 clear_bit(WDM_IN_USE, &desc->flags); in wdm_write()
424 dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv); in wdm_write()
428 dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d\n", in wdm_write()
432 usb_autopm_put_interface(desc->intf); in wdm_write()
433 mutex_unlock(&desc->wlock); in wdm_write()
437 usb_autopm_put_interface(desc->intf); in wdm_write()
439 mutex_unlock(&desc->wlock); in wdm_write()
450 static int service_outstanding_interrupt(struct wdm_device *desc) in service_outstanding_interrupt() argument
455 if (!desc->resp_count || !--desc->resp_count) in service_outstanding_interrupt()
458 set_bit(WDM_RESPONDING, &desc->flags); in service_outstanding_interrupt()
459 spin_unlock_irq(&desc->iuspin); in service_outstanding_interrupt()
460 rv = usb_submit_urb(desc->response, GFP_KERNEL); in service_outstanding_interrupt()
461 spin_lock_irq(&desc->iuspin); in service_outstanding_interrupt()
463 dev_err(&desc->intf->dev, in service_outstanding_interrupt()
467 clear_bit(WDM_RESPONDING, &desc->flags); in service_outstanding_interrupt()
468 desc->resp_count = 0; in service_outstanding_interrupt()
479 struct wdm_device *desc = file->private_data; in wdm_read() local
482 rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */ in wdm_read()
486 cntr = ACCESS_ONCE(desc->length); in wdm_read()
488 desc->read = 0; in wdm_read()
490 if (test_bit(WDM_DISCONNECTING, &desc->flags)) { in wdm_read()
494 if (test_bit(WDM_OVERFLOW, &desc->flags)) { in wdm_read()
495 clear_bit(WDM_OVERFLOW, &desc->flags); in wdm_read()
501 if (!test_bit(WDM_READ, &desc->flags)) { in wdm_read()
507 rv = wait_event_interruptible(desc->wait, in wdm_read()
508 test_bit(WDM_READ, &desc->flags)); in wdm_read()
512 if (test_bit(WDM_DISCONNECTING, &desc->flags)) { in wdm_read()
516 if (test_bit(WDM_RESETTING, &desc->flags)) { in wdm_read()
520 usb_mark_last_busy(interface_to_usbdev(desc->intf)); in wdm_read()
526 spin_lock_irq(&desc->iuspin); in wdm_read()
528 if (desc->rerr) { /* read completed, error happened */ in wdm_read()
529 rv = usb_translate_errors(desc->rerr); in wdm_read()
530 desc->rerr = 0; in wdm_read()
531 spin_unlock_irq(&desc->iuspin); in wdm_read()
538 if (!test_bit(WDM_READ, &desc->flags)) { /* lost race */ in wdm_read()
539 spin_unlock_irq(&desc->iuspin); in wdm_read()
543 if (!desc->reslength) { /* zero length read */ in wdm_read()
544 dev_dbg(&desc->intf->dev, "zero length - clearing WDM_READ\n"); in wdm_read()
545 clear_bit(WDM_READ, &desc->flags); in wdm_read()
546 rv = service_outstanding_interrupt(desc); in wdm_read()
547 spin_unlock_irq(&desc->iuspin); in wdm_read()
552 cntr = desc->length; in wdm_read()
553 spin_unlock_irq(&desc->iuspin); in wdm_read()
558 rv = copy_to_user(buffer, desc->ubuf, cntr); in wdm_read()
564 spin_lock_irq(&desc->iuspin); in wdm_read()
566 for (i = 0; i < desc->length - cntr; i++) in wdm_read()
567 desc->ubuf[i] = desc->ubuf[i + cntr]; in wdm_read()
569 desc->length -= cntr; in wdm_read()
571 if (!desc->length) { in wdm_read()
572 clear_bit(WDM_READ, &desc->flags); in wdm_read()
573 service_outstanding_interrupt(desc); in wdm_read()
575 spin_unlock_irq(&desc->iuspin); in wdm_read()
579 mutex_unlock(&desc->rlock); in wdm_read()
585 struct wdm_device *desc = file->private_data; in wdm_flush() local
587 wait_event(desc->wait, in wdm_flush()
594 !test_bit(WDM_IN_USE, &desc->flags) || in wdm_flush()
595 test_bit(WDM_DISCONNECTING, &desc->flags)); in wdm_flush()
598 if (test_bit(WDM_DISCONNECTING, &desc->flags)) in wdm_flush()
600 if (desc->werr < 0) in wdm_flush()
601 dev_err(&desc->intf->dev, "Error in flush path: %d\n", in wdm_flush()
602 desc->werr); in wdm_flush()
604 return usb_translate_errors(desc->werr); in wdm_flush()
609 struct wdm_device *desc = file->private_data; in wdm_poll() local
613 spin_lock_irqsave(&desc->iuspin, flags); in wdm_poll()
614 if (test_bit(WDM_DISCONNECTING, &desc->flags)) { in wdm_poll()
616 spin_unlock_irqrestore(&desc->iuspin, flags); in wdm_poll()
619 if (test_bit(WDM_READ, &desc->flags)) in wdm_poll()
621 if (desc->rerr || desc->werr) in wdm_poll()
623 if (!test_bit(WDM_IN_USE, &desc->flags)) in wdm_poll()
625 spin_unlock_irqrestore(&desc->iuspin, flags); in wdm_poll()
627 poll_wait(file, &desc->wait, wait); in wdm_poll()
638 struct wdm_device *desc; in wdm_open() local
641 desc = wdm_find_device_by_minor(minor); in wdm_open()
642 if (!desc) in wdm_open()
645 intf = desc->intf; in wdm_open()
646 if (test_bit(WDM_DISCONNECTING, &desc->flags)) in wdm_open()
648 file->private_data = desc; in wdm_open()
650 rv = usb_autopm_get_interface(desc->intf); in wdm_open()
652 dev_err(&desc->intf->dev, "Error autopm - %d\n", rv); in wdm_open()
657 mutex_lock(&desc->wlock); in wdm_open()
658 if (!desc->count++) { in wdm_open()
659 desc->werr = 0; in wdm_open()
660 desc->rerr = 0; in wdm_open()
661 rv = usb_submit_urb(desc->validity, GFP_KERNEL); in wdm_open()
663 desc->count--; in wdm_open()
664 dev_err(&desc->intf->dev, in wdm_open()
671 mutex_unlock(&desc->wlock); in wdm_open()
672 if (desc->count == 1) in wdm_open()
673 desc->manage_power(intf, 1); in wdm_open()
674 usb_autopm_put_interface(desc->intf); in wdm_open()
682 struct wdm_device *desc = file->private_data; in wdm_release() local
687 mutex_lock(&desc->wlock); in wdm_release()
688 desc->count--; in wdm_release()
689 mutex_unlock(&desc->wlock); in wdm_release()
691 if (!desc->count) { in wdm_release()
692 if (!test_bit(WDM_DISCONNECTING, &desc->flags)) { in wdm_release()
693 dev_dbg(&desc->intf->dev, "wdm_release: cleanup\n"); in wdm_release()
694 kill_urbs(desc); in wdm_release()
695 spin_lock_irq(&desc->iuspin); in wdm_release()
696 desc->resp_count = 0; in wdm_release()
697 spin_unlock_irq(&desc->iuspin); in wdm_release()
698 desc->manage_power(desc->intf, 0); in wdm_release()
702 cleanup(desc); in wdm_release()
711 struct wdm_device *desc = file->private_data; in wdm_ioctl() local
716 if (copy_to_user((void __user *)arg, &desc->wMaxCommand, sizeof(desc->wMaxCommand))) in wdm_ioctl()
747 struct wdm_device *desc = container_of(work, struct wdm_device, rxwork); in wdm_rxwork() local
752 spin_lock_irqsave(&desc->iuspin, flags); in wdm_rxwork()
753 if (test_bit(WDM_DISCONNECTING, &desc->flags)) { in wdm_rxwork()
754 spin_unlock_irqrestore(&desc->iuspin, flags); in wdm_rxwork()
756 responding = test_and_set_bit(WDM_RESPONDING, &desc->flags); in wdm_rxwork()
757 spin_unlock_irqrestore(&desc->iuspin, flags); in wdm_rxwork()
759 rv = usb_submit_urb(desc->response, GFP_KERNEL); in wdm_rxwork()
761 spin_lock_irqsave(&desc->iuspin, flags); in wdm_rxwork()
762 clear_bit(WDM_RESPONDING, &desc->flags); in wdm_rxwork()
763 if (!test_bit(WDM_DISCONNECTING, &desc->flags)) in wdm_rxwork()
764 schedule_work(&desc->rxwork); in wdm_rxwork()
765 spin_unlock_irqrestore(&desc->iuspin, flags); in wdm_rxwork()
776 struct wdm_device *desc; in wdm_create() local
778 desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL); in wdm_create()
779 if (!desc) in wdm_create()
781 INIT_LIST_HEAD(&desc->device_list); in wdm_create()
782 mutex_init(&desc->rlock); in wdm_create()
783 mutex_init(&desc->wlock); in wdm_create()
784 spin_lock_init(&desc->iuspin); in wdm_create()
785 init_waitqueue_head(&desc->wait); in wdm_create()
786 desc->wMaxCommand = bufsize; in wdm_create()
788 desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber); in wdm_create()
789 desc->intf = intf; in wdm_create()
790 INIT_WORK(&desc->rxwork, wdm_rxwork); in wdm_create()
796 desc->wMaxPacketSize = usb_endpoint_maxp(ep); in wdm_create()
798 desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); in wdm_create()
799 if (!desc->orq) in wdm_create()
801 desc->irq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); in wdm_create()
802 if (!desc->irq) in wdm_create()
805 desc->validity = usb_alloc_urb(0, GFP_KERNEL); in wdm_create()
806 if (!desc->validity) in wdm_create()
809 desc->response = usb_alloc_urb(0, GFP_KERNEL); in wdm_create()
810 if (!desc->response) in wdm_create()
813 desc->command = usb_alloc_urb(0, GFP_KERNEL); in wdm_create()
814 if (!desc->command) in wdm_create()
817 desc->ubuf = kmalloc(desc->wMaxCommand, GFP_KERNEL); in wdm_create()
818 if (!desc->ubuf) in wdm_create()
821 desc->sbuf = kmalloc(desc->wMaxPacketSize, GFP_KERNEL); in wdm_create()
822 if (!desc->sbuf) in wdm_create()
825 desc->inbuf = kmalloc(desc->wMaxCommand, GFP_KERNEL); in wdm_create()
826 if (!desc->inbuf) in wdm_create()
830 desc->validity, in wdm_create()
833 desc->sbuf, in wdm_create()
834 desc->wMaxPacketSize, in wdm_create()
836 desc, in wdm_create()
840 desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE); in wdm_create()
841 desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE; in wdm_create()
842 desc->irq->wValue = 0; in wdm_create()
843 desc->irq->wIndex = desc->inum; /* already converted */ in wdm_create()
844 desc->irq->wLength = cpu_to_le16(desc->wMaxCommand); in wdm_create()
847 desc->response, in wdm_create()
850 usb_rcvctrlpipe(interface_to_usbdev(desc->intf), 0), in wdm_create()
851 (unsigned char *)desc->irq, in wdm_create()
852 desc->inbuf, in wdm_create()
853 desc->wMaxCommand, in wdm_create()
855 desc in wdm_create()
858 desc->manage_power = manage_power; in wdm_create()
861 list_add(&desc->device_list, &wdm_device_list); in wdm_create()
873 list_del(&desc->device_list); in wdm_create()
875 cleanup(desc); in wdm_create()
909 if (iface->desc.bNumEndpoints != 1) in wdm_probe()
911 ep = &iface->endpoint[0].desc; in wdm_probe()
957 struct wdm_device *desc; in wdm_disconnect() local
961 desc = wdm_find_device(intf); in wdm_disconnect()
965 spin_lock_irqsave(&desc->iuspin, flags); in wdm_disconnect()
966 set_bit(WDM_DISCONNECTING, &desc->flags); in wdm_disconnect()
967 set_bit(WDM_READ, &desc->flags); in wdm_disconnect()
968 spin_unlock_irqrestore(&desc->iuspin, flags); in wdm_disconnect()
969 wake_up_all(&desc->wait); in wdm_disconnect()
970 mutex_lock(&desc->rlock); in wdm_disconnect()
971 mutex_lock(&desc->wlock); in wdm_disconnect()
972 kill_urbs(desc); in wdm_disconnect()
973 cancel_work_sync(&desc->rxwork); in wdm_disconnect()
974 mutex_unlock(&desc->wlock); in wdm_disconnect()
975 mutex_unlock(&desc->rlock); in wdm_disconnect()
979 list_del(&desc->device_list); in wdm_disconnect()
982 if (!desc->count) in wdm_disconnect()
983 cleanup(desc); in wdm_disconnect()
985 dev_dbg(&intf->dev, "%d open files - postponing cleanup\n", desc->count); in wdm_disconnect()
992 struct wdm_device *desc = wdm_find_device(intf); in wdm_suspend() local
995 dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor); in wdm_suspend()
999 mutex_lock(&desc->rlock); in wdm_suspend()
1000 mutex_lock(&desc->wlock); in wdm_suspend()
1002 spin_lock_irq(&desc->iuspin); in wdm_suspend()
1005 (test_bit(WDM_IN_USE, &desc->flags) in wdm_suspend()
1006 || test_bit(WDM_RESPONDING, &desc->flags))) { in wdm_suspend()
1007 spin_unlock_irq(&desc->iuspin); in wdm_suspend()
1011 set_bit(WDM_SUSPENDING, &desc->flags); in wdm_suspend()
1012 spin_unlock_irq(&desc->iuspin); in wdm_suspend()
1014 kill_urbs(desc); in wdm_suspend()
1015 cancel_work_sync(&desc->rxwork); in wdm_suspend()
1018 mutex_unlock(&desc->wlock); in wdm_suspend()
1019 mutex_unlock(&desc->rlock); in wdm_suspend()
1026 static int recover_from_urb_loss(struct wdm_device *desc) in recover_from_urb_loss() argument
1030 if (desc->count) { in recover_from_urb_loss()
1031 rv = usb_submit_urb(desc->validity, GFP_NOIO); in recover_from_urb_loss()
1033 dev_err(&desc->intf->dev, in recover_from_urb_loss()
1042 struct wdm_device *desc = wdm_find_device(intf); in wdm_resume() local
1045 dev_dbg(&desc->intf->dev, "wdm%d_resume\n", intf->minor); in wdm_resume()
1047 clear_bit(WDM_SUSPENDING, &desc->flags); in wdm_resume()
1048 rv = recover_from_urb_loss(desc); in wdm_resume()
1056 struct wdm_device *desc = wdm_find_device(intf); in wdm_pre_reset() local
1064 spin_lock_irq(&desc->iuspin); in wdm_pre_reset()
1065 set_bit(WDM_RESETTING, &desc->flags); /* inform read/write */ in wdm_pre_reset()
1066 set_bit(WDM_READ, &desc->flags); /* unblock read */ in wdm_pre_reset()
1067 clear_bit(WDM_IN_USE, &desc->flags); /* unblock write */ in wdm_pre_reset()
1068 desc->rerr = -EINTR; in wdm_pre_reset()
1069 spin_unlock_irq(&desc->iuspin); in wdm_pre_reset()
1070 wake_up_all(&desc->wait); in wdm_pre_reset()
1071 mutex_lock(&desc->rlock); in wdm_pre_reset()
1072 mutex_lock(&desc->wlock); in wdm_pre_reset()
1073 kill_urbs(desc); in wdm_pre_reset()
1074 cancel_work_sync(&desc->rxwork); in wdm_pre_reset()
1080 struct wdm_device *desc = wdm_find_device(intf); in wdm_post_reset() local
1083 clear_bit(WDM_OVERFLOW, &desc->flags); in wdm_post_reset()
1084 clear_bit(WDM_RESETTING, &desc->flags); in wdm_post_reset()
1085 rv = recover_from_urb_loss(desc); in wdm_post_reset()
1086 mutex_unlock(&desc->wlock); in wdm_post_reset()
1087 mutex_unlock(&desc->rlock); in wdm_post_reset()