Lines Matching refs:dev

104 static inline void adu_debug_data(struct device *dev, const char *function,  in adu_debug_data()  argument
107 dev_dbg(dev, "%s - length = %d, data = %*ph\n", in adu_debug_data()
115 static void adu_abort_transfers(struct adu_device *dev) in adu_abort_transfers() argument
119 if (dev->udev == NULL) in adu_abort_transfers()
125 spin_lock_irqsave(&dev->buflock, flags); in adu_abort_transfers()
126 if (!dev->read_urb_finished) { in adu_abort_transfers()
127 spin_unlock_irqrestore(&dev->buflock, flags); in adu_abort_transfers()
128 usb_kill_urb(dev->interrupt_in_urb); in adu_abort_transfers()
130 spin_unlock_irqrestore(&dev->buflock, flags); in adu_abort_transfers()
132 spin_lock_irqsave(&dev->buflock, flags); in adu_abort_transfers()
133 if (!dev->out_urb_finished) { in adu_abort_transfers()
134 spin_unlock_irqrestore(&dev->buflock, flags); in adu_abort_transfers()
135 wait_event_timeout(dev->write_wait, dev->out_urb_finished, in adu_abort_transfers()
137 usb_kill_urb(dev->interrupt_out_urb); in adu_abort_transfers()
139 spin_unlock_irqrestore(&dev->buflock, flags); in adu_abort_transfers()
142 static void adu_delete(struct adu_device *dev) in adu_delete() argument
145 usb_free_urb(dev->interrupt_in_urb); in adu_delete()
146 usb_free_urb(dev->interrupt_out_urb); in adu_delete()
147 kfree(dev->read_buffer_primary); in adu_delete()
148 kfree(dev->read_buffer_secondary); in adu_delete()
149 kfree(dev->interrupt_in_buffer); in adu_delete()
150 kfree(dev->interrupt_out_buffer); in adu_delete()
151 kfree(dev); in adu_delete()
156 struct adu_device *dev = urb->context; in adu_interrupt_in_callback() local
160 adu_debug_data(&dev->udev->dev, __func__, in adu_interrupt_in_callback()
163 spin_lock_irqsave(&dev->buflock, flags); in adu_interrupt_in_callback()
168 dev_dbg(&dev->udev->dev, in adu_interrupt_in_callback()
175 if (urb->actual_length > 0 && dev->interrupt_in_buffer[0] != 0x00) { in adu_interrupt_in_callback()
176 if (dev->read_buffer_length < in adu_interrupt_in_callback()
177 (4 * usb_endpoint_maxp(dev->interrupt_in_endpoint)) - in adu_interrupt_in_callback()
179 memcpy (dev->read_buffer_primary + in adu_interrupt_in_callback()
180 dev->read_buffer_length, in adu_interrupt_in_callback()
181 dev->interrupt_in_buffer, urb->actual_length); in adu_interrupt_in_callback()
183 dev->read_buffer_length += urb->actual_length; in adu_interrupt_in_callback()
184 dev_dbg(&dev->udev->dev,"%s reading %d\n", __func__, in adu_interrupt_in_callback()
187 dev_dbg(&dev->udev->dev,"%s : read_buffer overflow\n", in adu_interrupt_in_callback()
193 dev->read_urb_finished = 1; in adu_interrupt_in_callback()
194 spin_unlock_irqrestore(&dev->buflock, flags); in adu_interrupt_in_callback()
196 wake_up_interruptible(&dev->read_wait); in adu_interrupt_in_callback()
201 struct adu_device *dev = urb->context; in adu_interrupt_out_callback() local
205 adu_debug_data(&dev->udev->dev, __func__, in adu_interrupt_out_callback()
211 dev_dbg(&dev->udev->dev, in adu_interrupt_out_callback()
218 spin_lock_irqsave(&dev->buflock, flags); in adu_interrupt_out_callback()
219 dev->out_urb_finished = 1; in adu_interrupt_out_callback()
220 wake_up(&dev->write_wait); in adu_interrupt_out_callback()
221 spin_unlock_irqrestore(&dev->buflock, flags); in adu_interrupt_out_callback()
226 struct adu_device *dev = NULL; in adu_open() local
245 dev = usb_get_intfdata(interface); in adu_open()
246 if (!dev || !dev->udev) { in adu_open()
252 if (dev->open_count) { in adu_open()
257 ++dev->open_count; in adu_open()
258 dev_dbg(&dev->udev->dev, "%s: open count %d\n", __func__, in adu_open()
259 dev->open_count); in adu_open()
262 file->private_data = dev; in adu_open()
265 dev->read_buffer_length = 0; in adu_open()
268 usb_fill_int_urb(dev->interrupt_in_urb, dev->udev, in adu_open()
269 usb_rcvintpipe(dev->udev, in adu_open()
270 dev->interrupt_in_endpoint->bEndpointAddress), in adu_open()
271 dev->interrupt_in_buffer, in adu_open()
272 usb_endpoint_maxp(dev->interrupt_in_endpoint), in adu_open()
273 adu_interrupt_in_callback, dev, in adu_open()
274 dev->interrupt_in_endpoint->bInterval); in adu_open()
275 dev->read_urb_finished = 0; in adu_open()
276 if (usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL)) in adu_open()
277 dev->read_urb_finished = 1; in adu_open()
282 dev->out_urb_finished = 1; in adu_open()
292 static void adu_release_internal(struct adu_device *dev) in adu_release_internal() argument
295 --dev->open_count; in adu_release_internal()
296 dev_dbg(&dev->udev->dev, "%s : open count %d\n", __func__, in adu_release_internal()
297 dev->open_count); in adu_release_internal()
298 if (dev->open_count <= 0) { in adu_release_internal()
299 adu_abort_transfers(dev); in adu_release_internal()
300 dev->open_count = 0; in adu_release_internal()
306 struct adu_device *dev; in adu_release() local
314 dev = file->private_data; in adu_release()
315 if (dev == NULL) { in adu_release()
322 if (dev->open_count <= 0) { in adu_release()
323 dev_dbg(&dev->udev->dev, "%s : device not opened\n", __func__); in adu_release()
328 adu_release_internal(dev); in adu_release()
329 if (dev->udev == NULL) { in adu_release()
331 if (!dev->open_count) /* ... and we're the last user */ in adu_release()
332 adu_delete(dev); in adu_release()
343 struct adu_device *dev; in adu_read() local
353 dev = file->private_data; in adu_read()
354 if (mutex_lock_interruptible(&dev->mtx)) in adu_read()
358 if (dev->udev == NULL) { in adu_read()
366 dev_dbg(&dev->udev->dev, "%s : read request of 0 bytes\n", in adu_read()
372 dev_dbg(&dev->udev->dev, "%s : about to start looping\n", __func__); in adu_read()
374 int data_in_secondary = dev->secondary_tail - dev->secondary_head; in adu_read()
375 dev_dbg(&dev->udev->dev, in adu_read()
378 dev->interrupt_in_urb->status); in adu_read()
383 i = copy_to_user(buffer, dev->read_buffer_secondary+dev->secondary_head, amount); in adu_read()
388 dev->secondary_head += (amount - i); in adu_read()
393 spin_lock_irqsave (&dev->buflock, flags); in adu_read()
394 if (dev->read_buffer_length) { in adu_read()
397 dev_dbg(&dev->udev->dev, in adu_read()
399 __func__, dev->read_buffer_length); in adu_read()
400 tmp = dev->read_buffer_secondary; in adu_read()
401 dev->read_buffer_secondary = dev->read_buffer_primary; in adu_read()
402 dev->read_buffer_primary = tmp; in adu_read()
403 dev->secondary_head = 0; in adu_read()
404 dev->secondary_tail = dev->read_buffer_length; in adu_read()
405 dev->read_buffer_length = 0; in adu_read()
406 spin_unlock_irqrestore(&dev->buflock, flags); in adu_read()
411 if (!dev->read_urb_finished) { in adu_read()
413 spin_unlock_irqrestore(&dev->buflock, flags); in adu_read()
414 dev_dbg(&dev->udev->dev, in adu_read()
419 dev_dbg(&dev->udev->dev, in adu_read()
422 dev->read_urb_finished = 0; in adu_read()
423 spin_unlock_irqrestore(&dev->buflock, flags); in adu_read()
425 usb_fill_int_urb(dev->interrupt_in_urb, dev->udev, in adu_read()
426 usb_rcvintpipe(dev->udev, in adu_read()
427 dev->interrupt_in_endpoint->bEndpointAddress), in adu_read()
428 dev->interrupt_in_buffer, in adu_read()
429 usb_endpoint_maxp(dev->interrupt_in_endpoint), in adu_read()
431 dev, in adu_read()
432 dev->interrupt_in_endpoint->bInterval); in adu_read()
433 retval = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); in adu_read()
435 dev->read_urb_finished = 1; in adu_read()
439 dev_dbg(&dev->udev->dev, in adu_read()
448 add_wait_queue(&dev->read_wait, &wait); in adu_read()
449 spin_lock_irqsave(&dev->buflock, flags); in adu_read()
450 if (!dev->read_urb_finished) { in adu_read()
451 spin_unlock_irqrestore(&dev->buflock, flags); in adu_read()
454 spin_unlock_irqrestore(&dev->buflock, flags); in adu_read()
457 remove_wait_queue(&dev->read_wait, &wait); in adu_read()
460 dev_dbg(&dev->udev->dev, in adu_read()
467 dev_dbg(&dev->udev->dev, in adu_read()
479 spin_lock_irqsave(&dev->buflock, flags); in adu_read()
480 if (should_submit && dev->read_urb_finished) { in adu_read()
481 dev->read_urb_finished = 0; in adu_read()
482 spin_unlock_irqrestore(&dev->buflock, flags); in adu_read()
483 usb_fill_int_urb(dev->interrupt_in_urb, dev->udev, in adu_read()
484 usb_rcvintpipe(dev->udev, in adu_read()
485 dev->interrupt_in_endpoint->bEndpointAddress), in adu_read()
486 dev->interrupt_in_buffer, in adu_read()
487 usb_endpoint_maxp(dev->interrupt_in_endpoint), in adu_read()
489 dev, in adu_read()
490 dev->interrupt_in_endpoint->bInterval); in adu_read()
491 if (usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL) != 0) in adu_read()
492 dev->read_urb_finished = 1; in adu_read()
495 spin_unlock_irqrestore(&dev->buflock, flags); in adu_read()
500 mutex_unlock(&dev->mtx); in adu_read()
509 struct adu_device *dev; in adu_write() local
516 dev = file->private_data; in adu_write()
518 retval = mutex_lock_interruptible(&dev->mtx); in adu_write()
523 if (dev->udev == NULL) { in adu_write()
531 dev_dbg(&dev->udev->dev, "%s : write request of 0 bytes\n", in adu_write()
537 add_wait_queue(&dev->write_wait, &waita); in adu_write()
539 spin_lock_irqsave(&dev->buflock, flags); in adu_write()
540 if (!dev->out_urb_finished) { in adu_write()
541 spin_unlock_irqrestore(&dev->buflock, flags); in adu_write()
543 mutex_unlock(&dev->mtx); in adu_write()
545 dev_dbg(&dev->udev->dev, "%s : interrupted\n", in adu_write()
552 dev_dbg(&dev->udev->dev, in adu_write()
557 remove_wait_queue(&dev->write_wait, &waita); in adu_write()
558 retval = mutex_lock_interruptible(&dev->mtx); in adu_write()
564 dev_dbg(&dev->udev->dev, in adu_write()
568 spin_unlock_irqrestore(&dev->buflock, flags); in adu_write()
570 remove_wait_queue(&dev->write_wait, &waita); in adu_write()
571 dev_dbg(&dev->udev->dev, "%s : sending, count = %zd\n", in adu_write()
575 buffer_size = usb_endpoint_maxp(dev->interrupt_out_endpoint); in adu_write()
577 dev_dbg(&dev->udev->dev, in adu_write()
581 if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write) != 0) { in adu_write()
588 dev->interrupt_out_urb, in adu_write()
589 dev->udev, in adu_write()
590 usb_sndintpipe(dev->udev, dev->interrupt_out_endpoint->bEndpointAddress), in adu_write()
591 dev->interrupt_out_buffer, in adu_write()
594 dev, in adu_write()
595 dev->interrupt_out_endpoint->bInterval); in adu_write()
596 dev->interrupt_out_urb->actual_length = bytes_to_write; in adu_write()
597 dev->out_urb_finished = 0; in adu_write()
598 retval = usb_submit_urb(dev->interrupt_out_urb, GFP_KERNEL); in adu_write()
600 dev->out_urb_finished = 1; in adu_write()
601 dev_err(&dev->udev->dev, "Couldn't submit " in adu_write()
612 mutex_unlock(&dev->mtx); in adu_write()
616 mutex_unlock(&dev->mtx); in adu_write()
621 remove_wait_queue(&dev->write_wait, &waita); in adu_write()
655 struct adu_device *dev = NULL; in adu_probe() local
662 dev = kzalloc(sizeof(struct adu_device), GFP_KERNEL); in adu_probe()
663 if (!dev) in adu_probe()
666 mutex_init(&dev->mtx); in adu_probe()
667 spin_lock_init(&dev->buflock); in adu_probe()
668 dev->udev = udev; in adu_probe()
669 init_waitqueue_head(&dev->read_wait); in adu_probe()
670 init_waitqueue_head(&dev->write_wait); in adu_probe()
674 &dev->interrupt_in_endpoint, in adu_probe()
675 &dev->interrupt_out_endpoint); in adu_probe()
677 dev_err(&interface->dev, "interrupt endpoints not found\n"); in adu_probe()
682 in_end_size = usb_endpoint_maxp(dev->interrupt_in_endpoint); in adu_probe()
683 out_end_size = usb_endpoint_maxp(dev->interrupt_out_endpoint); in adu_probe()
685 dev->read_buffer_primary = kmalloc((4 * in_end_size), GFP_KERNEL); in adu_probe()
686 if (!dev->read_buffer_primary) in adu_probe()
690 memset(dev->read_buffer_primary, 'a', in_end_size); in adu_probe()
691 memset(dev->read_buffer_primary + in_end_size, 'b', in_end_size); in adu_probe()
692 memset(dev->read_buffer_primary + (2 * in_end_size), 'c', in_end_size); in adu_probe()
693 memset(dev->read_buffer_primary + (3 * in_end_size), 'd', in_end_size); in adu_probe()
695 dev->read_buffer_secondary = kmalloc((4 * in_end_size), GFP_KERNEL); in adu_probe()
696 if (!dev->read_buffer_secondary) in adu_probe()
700 memset(dev->read_buffer_secondary, 'e', in_end_size); in adu_probe()
701 memset(dev->read_buffer_secondary + in_end_size, 'f', in_end_size); in adu_probe()
702 memset(dev->read_buffer_secondary + (2 * in_end_size), 'g', in_end_size); in adu_probe()
703 memset(dev->read_buffer_secondary + (3 * in_end_size), 'h', in_end_size); in adu_probe()
705 dev->interrupt_in_buffer = kmalloc(in_end_size, GFP_KERNEL); in adu_probe()
706 if (!dev->interrupt_in_buffer) in adu_probe()
710 memset(dev->interrupt_in_buffer, 'i', in_end_size); in adu_probe()
712 dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL); in adu_probe()
713 if (!dev->interrupt_in_urb) in adu_probe()
715 dev->interrupt_out_buffer = kmalloc(out_end_size, GFP_KERNEL); in adu_probe()
716 if (!dev->interrupt_out_buffer) in adu_probe()
718 dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL); in adu_probe()
719 if (!dev->interrupt_out_urb) in adu_probe()
722 if (!usb_string(udev, udev->descriptor.iSerialNumber, dev->serial_number, in adu_probe()
723 sizeof(dev->serial_number))) { in adu_probe()
724 dev_err(&interface->dev, "Could not retrieve serial number\n"); in adu_probe()
728 dev_dbg(&interface->dev,"serial_number=%s", dev->serial_number); in adu_probe()
731 usb_set_intfdata(interface, dev); in adu_probe()
737 dev_err(&interface->dev, "Not able to get a minor for this device.\n"); in adu_probe()
742 dev->minor = interface->minor; in adu_probe()
745 dev_info(&interface->dev, "ADU%d %s now attached to /dev/usb/adutux%d\n", in adu_probe()
746 le16_to_cpu(udev->descriptor.idProduct), dev->serial_number, in adu_probe()
747 (dev->minor - ADU_MINOR_BASE)); in adu_probe()
752 adu_delete(dev); in adu_probe()
763 struct adu_device *dev; in adu_disconnect() local
765 dev = usb_get_intfdata(interface); in adu_disconnect()
767 mutex_lock(&dev->mtx); /* not interruptible */ in adu_disconnect()
768 dev->udev = NULL; /* poison */ in adu_disconnect()
770 mutex_unlock(&dev->mtx); in adu_disconnect()
776 if (!dev->open_count) in adu_disconnect()
777 adu_delete(dev); in adu_disconnect()