Lines Matching refs:dev

190 static void ld_usb_abort_transfers(struct ld_usb *dev)  in ld_usb_abort_transfers()  argument
193 if (dev->interrupt_in_running) { in ld_usb_abort_transfers()
194 dev->interrupt_in_running = 0; in ld_usb_abort_transfers()
195 usb_kill_urb(dev->interrupt_in_urb); in ld_usb_abort_transfers()
197 if (dev->interrupt_out_busy) in ld_usb_abort_transfers()
198 usb_kill_urb(dev->interrupt_out_urb); in ld_usb_abort_transfers()
204 static void ld_usb_delete(struct ld_usb *dev) in ld_usb_delete() argument
207 usb_free_urb(dev->interrupt_in_urb); in ld_usb_delete()
208 usb_free_urb(dev->interrupt_out_urb); in ld_usb_delete()
209 kfree(dev->ring_buffer); in ld_usb_delete()
210 kfree(dev->interrupt_in_buffer); in ld_usb_delete()
211 kfree(dev->interrupt_out_buffer); in ld_usb_delete()
212 kfree(dev); in ld_usb_delete()
220 struct ld_usb *dev = urb->context; in ld_usb_interrupt_in_callback() local
233 dev_dbg(&dev->intf->dev, in ld_usb_interrupt_in_callback()
236 spin_lock_irqsave(&dev->rbsl, flags); in ld_usb_interrupt_in_callback()
241 spin_lock_irqsave(&dev->rbsl, flags); in ld_usb_interrupt_in_callback()
243 next_ring_head = (dev->ring_head+1) % ring_buffer_size; in ld_usb_interrupt_in_callback()
244 if (next_ring_head != dev->ring_tail) { in ld_usb_interrupt_in_callback()
245 …actual_buffer = (size_t *)(dev->ring_buffer + dev->ring_head * (sizeof(size_t)+dev->interrupt_in_e… in ld_usb_interrupt_in_callback()
248 memcpy(actual_buffer+1, dev->interrupt_in_buffer, urb->actual_length); in ld_usb_interrupt_in_callback()
249 dev->ring_head = next_ring_head; in ld_usb_interrupt_in_callback()
250 dev_dbg(&dev->intf->dev, "%s: received %d bytes\n", in ld_usb_interrupt_in_callback()
253 dev_warn(&dev->intf->dev, in ld_usb_interrupt_in_callback()
256 dev->buffer_overflow = 1; in ld_usb_interrupt_in_callback()
262 if (dev->interrupt_in_running && !dev->buffer_overflow) { in ld_usb_interrupt_in_callback()
263 retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC); in ld_usb_interrupt_in_callback()
265 dev_err(&dev->intf->dev, in ld_usb_interrupt_in_callback()
267 dev->buffer_overflow = 1; in ld_usb_interrupt_in_callback()
270 spin_unlock_irqrestore(&dev->rbsl, flags); in ld_usb_interrupt_in_callback()
272 dev->interrupt_in_done = 1; in ld_usb_interrupt_in_callback()
273 wake_up_interruptible(&dev->read_wait); in ld_usb_interrupt_in_callback()
281 struct ld_usb *dev = urb->context; in ld_usb_interrupt_out_callback() local
288 dev_dbg(&dev->intf->dev, in ld_usb_interrupt_out_callback()
292 dev->interrupt_out_busy = 0; in ld_usb_interrupt_out_callback()
293 wake_up_interruptible(&dev->write_wait); in ld_usb_interrupt_out_callback()
301 struct ld_usb *dev; in ld_usb_open() local
317 dev = usb_get_intfdata(interface); in ld_usb_open()
319 if (!dev) in ld_usb_open()
323 if (mutex_lock_interruptible(&dev->mutex)) in ld_usb_open()
327 if (dev->open_count) { in ld_usb_open()
331 dev->open_count = 1; in ld_usb_open()
334 dev->ring_head = 0; in ld_usb_open()
335 dev->ring_tail = 0; in ld_usb_open()
336 dev->buffer_overflow = 0; in ld_usb_open()
337 usb_fill_int_urb(dev->interrupt_in_urb, in ld_usb_open()
340 dev->interrupt_in_endpoint->bEndpointAddress), in ld_usb_open()
341 dev->interrupt_in_buffer, in ld_usb_open()
342 dev->interrupt_in_endpoint_size, in ld_usb_open()
344 dev, in ld_usb_open()
345 dev->interrupt_in_interval); in ld_usb_open()
347 dev->interrupt_in_running = 1; in ld_usb_open()
348 dev->interrupt_in_done = 0; in ld_usb_open()
350 retval = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); in ld_usb_open()
352 dev_err(&interface->dev, "Couldn't submit interrupt_in_urb %d\n", retval); in ld_usb_open()
353 dev->interrupt_in_running = 0; in ld_usb_open()
354 dev->open_count = 0; in ld_usb_open()
359 file->private_data = dev; in ld_usb_open()
362 mutex_unlock(&dev->mutex); in ld_usb_open()
372 struct ld_usb *dev; in ld_usb_release() local
375 dev = file->private_data; in ld_usb_release()
377 if (dev == NULL) { in ld_usb_release()
382 mutex_lock(&dev->mutex); in ld_usb_release()
384 if (dev->open_count != 1) { in ld_usb_release()
388 if (dev->disconnected) { in ld_usb_release()
390 mutex_unlock(&dev->mutex); in ld_usb_release()
392 ld_usb_delete(dev); in ld_usb_release()
397 if (dev->interrupt_out_busy) in ld_usb_release()
398 wait_event_interruptible_timeout(dev->write_wait, !dev->interrupt_out_busy, 2 * HZ); in ld_usb_release()
399 ld_usb_abort_transfers(dev); in ld_usb_release()
400 dev->open_count = 0; in ld_usb_release()
403 mutex_unlock(&dev->mutex); in ld_usb_release()
414 struct ld_usb *dev; in ld_usb_poll() local
417 dev = file->private_data; in ld_usb_poll()
419 if (dev->disconnected) in ld_usb_poll()
422 poll_wait(file, &dev->read_wait, wait); in ld_usb_poll()
423 poll_wait(file, &dev->write_wait, wait); in ld_usb_poll()
425 if (dev->ring_head != dev->ring_tail) in ld_usb_poll()
427 if (!dev->interrupt_out_busy) in ld_usb_poll()
439 struct ld_usb *dev; in ld_usb_read() local
445 dev = file->private_data; in ld_usb_read()
452 if (mutex_lock_interruptible(&dev->mutex)) { in ld_usb_read()
458 if (dev->disconnected) { in ld_usb_read()
465 spin_lock_irq(&dev->rbsl); in ld_usb_read()
466 while (dev->ring_head == dev->ring_tail) { in ld_usb_read()
467 dev->interrupt_in_done = 0; in ld_usb_read()
468 spin_unlock_irq(&dev->rbsl); in ld_usb_read()
473 retval = wait_event_interruptible(dev->read_wait, dev->interrupt_in_done); in ld_usb_read()
477 spin_lock_irq(&dev->rbsl); in ld_usb_read()
479 spin_unlock_irq(&dev->rbsl); in ld_usb_read()
482 …actual_buffer = (size_t *)(dev->ring_buffer + dev->ring_tail * (sizeof(size_t)+dev->interrupt_in_e… in ld_usb_read()
483 if (*actual_buffer > dev->interrupt_in_endpoint_size) { in ld_usb_read()
489 dev_warn(&dev->intf->dev, "Read buffer overflow, %zu bytes dropped\n", in ld_usb_read()
499 spin_lock_irq(&dev->rbsl); in ld_usb_read()
500 dev->ring_tail = (dev->ring_tail + 1) % ring_buffer_size; in ld_usb_read()
502 if (dev->buffer_overflow) { in ld_usb_read()
503 dev->buffer_overflow = 0; in ld_usb_read()
504 spin_unlock_irq(&dev->rbsl); in ld_usb_read()
505 rv = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); in ld_usb_read()
507 dev->buffer_overflow = 1; in ld_usb_read()
509 spin_unlock_irq(&dev->rbsl); in ld_usb_read()
514 mutex_unlock(&dev->mutex); in ld_usb_read()
526 struct ld_usb *dev; in ld_usb_write() local
530 dev = file->private_data; in ld_usb_write()
537 if (mutex_lock_interruptible(&dev->mutex)) { in ld_usb_write()
543 if (dev->disconnected) { in ld_usb_write()
550 if (dev->interrupt_out_busy) { in ld_usb_write()
555 retval = wait_event_interruptible(dev->write_wait, !dev->interrupt_out_busy); in ld_usb_write()
562 bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size); in ld_usb_write()
564 dev_warn(&dev->intf->dev, "Write buffer overflow, %zu bytes dropped\n", in ld_usb_write()
566 dev_dbg(&dev->intf->dev, "%s: count = %zu, bytes_to_write = %zu\n", in ld_usb_write()
569 if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) { in ld_usb_write()
574 if (dev->interrupt_out_endpoint == NULL) { in ld_usb_write()
576 retval = usb_control_msg(interface_to_usbdev(dev->intf), in ld_usb_write()
577 usb_sndctrlpipe(interface_to_usbdev(dev->intf), 0), in ld_usb_write()
581 dev->interrupt_out_buffer, in ld_usb_write()
585 dev_err(&dev->intf->dev, in ld_usb_write()
592 usb_fill_int_urb(dev->interrupt_out_urb, in ld_usb_write()
593 interface_to_usbdev(dev->intf), in ld_usb_write()
594 usb_sndintpipe(interface_to_usbdev(dev->intf), in ld_usb_write()
595 dev->interrupt_out_endpoint->bEndpointAddress), in ld_usb_write()
596 dev->interrupt_out_buffer, in ld_usb_write()
599 dev, in ld_usb_write()
600 dev->interrupt_out_interval); in ld_usb_write()
602 dev->interrupt_out_busy = 1; in ld_usb_write()
605 retval = usb_submit_urb(dev->interrupt_out_urb, GFP_KERNEL); in ld_usb_write()
607 dev->interrupt_out_busy = 0; in ld_usb_write()
608 dev_err(&dev->intf->dev, in ld_usb_write()
616 mutex_unlock(&dev->mutex); in ld_usb_write()
652 struct ld_usb *dev = NULL; in ld_usb_probe() local
660 dev = kzalloc(sizeof(*dev), GFP_KERNEL); in ld_usb_probe()
661 if (!dev) in ld_usb_probe()
663 mutex_init(&dev->mutex); in ld_usb_probe()
664 spin_lock_init(&dev->rbsl); in ld_usb_probe()
665 dev->intf = intf; in ld_usb_probe()
666 init_waitqueue_head(&dev->read_wait); in ld_usb_probe()
667 init_waitqueue_head(&dev->write_wait); in ld_usb_probe()
685 &dev->interrupt_in_endpoint); in ld_usb_probe()
687 dev_err(&intf->dev, "Interrupt in endpoint not found\n"); in ld_usb_probe()
693 &dev->interrupt_out_endpoint); in ld_usb_probe()
695 dev_warn(&intf->dev, "Interrupt out endpoint not found (using control endpoint instead)\n"); in ld_usb_probe()
697 dev->interrupt_in_endpoint_size = usb_endpoint_maxp(dev->interrupt_in_endpoint); in ld_usb_probe()
698 dev->ring_buffer = kcalloc(ring_buffer_size, in ld_usb_probe()
699 sizeof(size_t) + dev->interrupt_in_endpoint_size, in ld_usb_probe()
701 if (!dev->ring_buffer) in ld_usb_probe()
703 dev->interrupt_in_buffer = kmalloc(dev->interrupt_in_endpoint_size, GFP_KERNEL); in ld_usb_probe()
704 if (!dev->interrupt_in_buffer) in ld_usb_probe()
706 dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL); in ld_usb_probe()
707 if (!dev->interrupt_in_urb) in ld_usb_probe()
709dev->interrupt_out_endpoint_size = dev->interrupt_out_endpoint ? usb_endpoint_maxp(dev->interrupt_… in ld_usb_probe()
711 dev->interrupt_out_buffer = in ld_usb_probe()
713 dev->interrupt_out_endpoint_size, GFP_KERNEL); in ld_usb_probe()
714 if (!dev->interrupt_out_buffer) in ld_usb_probe()
716 dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL); in ld_usb_probe()
717 if (!dev->interrupt_out_urb) in ld_usb_probe()
719 dev->interrupt_in_interval = max_t(int, min_interrupt_in_interval, in ld_usb_probe()
720 dev->interrupt_in_endpoint->bInterval); in ld_usb_probe()
721 if (dev->interrupt_out_endpoint) in ld_usb_probe()
722 dev->interrupt_out_interval = max_t(int, min_interrupt_out_interval, in ld_usb_probe()
723 dev->interrupt_out_endpoint->bInterval); in ld_usb_probe()
726 usb_set_intfdata(intf, dev); in ld_usb_probe()
731 dev_err(&intf->dev, "Not able to get a minor for this device.\n"); in ld_usb_probe()
737 dev_info(&intf->dev, "LD USB Device #%d now attached to major %d minor %d\n", in ld_usb_probe()
744 ld_usb_delete(dev); in ld_usb_probe()
756 struct ld_usb *dev; in ld_usb_disconnect() local
759 dev = usb_get_intfdata(intf); in ld_usb_disconnect()
767 usb_poison_urb(dev->interrupt_in_urb); in ld_usb_disconnect()
768 usb_poison_urb(dev->interrupt_out_urb); in ld_usb_disconnect()
770 mutex_lock(&dev->mutex); in ld_usb_disconnect()
773 if (!dev->open_count) { in ld_usb_disconnect()
774 mutex_unlock(&dev->mutex); in ld_usb_disconnect()
775 ld_usb_delete(dev); in ld_usb_disconnect()
777 dev->disconnected = 1; in ld_usb_disconnect()
779 wake_up_interruptible_all(&dev->read_wait); in ld_usb_disconnect()
780 wake_up_interruptible_all(&dev->write_wait); in ld_usb_disconnect()
781 mutex_unlock(&dev->mutex); in ld_usb_disconnect()
784 dev_info(&intf->dev, "LD USB Device #%d now disconnected\n", in ld_usb_disconnect()