Lines Matching refs:dev

199 static void ld_usb_abort_transfers(struct ld_usb *dev)  in ld_usb_abort_transfers()  argument
202 if (dev->interrupt_in_running) { in ld_usb_abort_transfers()
203 dev->interrupt_in_running = 0; in ld_usb_abort_transfers()
204 if (dev->intf) in ld_usb_abort_transfers()
205 usb_kill_urb(dev->interrupt_in_urb); in ld_usb_abort_transfers()
207 if (dev->interrupt_out_busy) in ld_usb_abort_transfers()
208 if (dev->intf) in ld_usb_abort_transfers()
209 usb_kill_urb(dev->interrupt_out_urb); in ld_usb_abort_transfers()
215 static void ld_usb_delete(struct ld_usb *dev) in ld_usb_delete() argument
217 ld_usb_abort_transfers(dev); in ld_usb_delete()
220 usb_free_urb(dev->interrupt_in_urb); in ld_usb_delete()
221 usb_free_urb(dev->interrupt_out_urb); in ld_usb_delete()
222 kfree(dev->ring_buffer); in ld_usb_delete()
223 kfree(dev->interrupt_in_buffer); in ld_usb_delete()
224 kfree(dev->interrupt_out_buffer); in ld_usb_delete()
225 kfree(dev); in ld_usb_delete()
233 struct ld_usb *dev = urb->context; in ld_usb_interrupt_in_callback() local
245 dev_dbg(&dev->intf->dev, in ld_usb_interrupt_in_callback()
248 spin_lock(&dev->rbsl); in ld_usb_interrupt_in_callback()
253 spin_lock(&dev->rbsl); in ld_usb_interrupt_in_callback()
255 next_ring_head = (dev->ring_head+1) % ring_buffer_size; in ld_usb_interrupt_in_callback()
256 if (next_ring_head != dev->ring_tail) { in ld_usb_interrupt_in_callback()
257 …actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_head*(sizeof(size_t)+dev->interrupt_in_endp… in ld_usb_interrupt_in_callback()
260 memcpy(actual_buffer+1, dev->interrupt_in_buffer, urb->actual_length); in ld_usb_interrupt_in_callback()
261 dev->ring_head = next_ring_head; in ld_usb_interrupt_in_callback()
262 dev_dbg(&dev->intf->dev, "%s: received %d bytes\n", in ld_usb_interrupt_in_callback()
265 dev_warn(&dev->intf->dev, in ld_usb_interrupt_in_callback()
268 dev->buffer_overflow = 1; in ld_usb_interrupt_in_callback()
274 if (dev->interrupt_in_running && !dev->buffer_overflow && dev->intf) { in ld_usb_interrupt_in_callback()
275 retval = usb_submit_urb(dev->interrupt_in_urb, GFP_ATOMIC); in ld_usb_interrupt_in_callback()
277 dev_err(&dev->intf->dev, in ld_usb_interrupt_in_callback()
279 dev->buffer_overflow = 1; in ld_usb_interrupt_in_callback()
282 spin_unlock(&dev->rbsl); in ld_usb_interrupt_in_callback()
284 dev->interrupt_in_done = 1; in ld_usb_interrupt_in_callback()
285 wake_up_interruptible(&dev->read_wait); in ld_usb_interrupt_in_callback()
293 struct ld_usb *dev = urb->context; in ld_usb_interrupt_out_callback() local
300 dev_dbg(&dev->intf->dev, in ld_usb_interrupt_out_callback()
304 dev->interrupt_out_busy = 0; in ld_usb_interrupt_out_callback()
305 wake_up_interruptible(&dev->write_wait); in ld_usb_interrupt_out_callback()
313 struct ld_usb *dev; in ld_usb_open() local
329 dev = usb_get_intfdata(interface); in ld_usb_open()
331 if (!dev) in ld_usb_open()
335 if (mutex_lock_interruptible(&dev->mutex)) in ld_usb_open()
339 if (dev->open_count) { in ld_usb_open()
343 dev->open_count = 1; in ld_usb_open()
346 dev->ring_head = 0; in ld_usb_open()
347 dev->ring_tail = 0; in ld_usb_open()
348 dev->buffer_overflow = 0; in ld_usb_open()
349 usb_fill_int_urb(dev->interrupt_in_urb, in ld_usb_open()
352 dev->interrupt_in_endpoint->bEndpointAddress), in ld_usb_open()
353 dev->interrupt_in_buffer, in ld_usb_open()
354 dev->interrupt_in_endpoint_size, in ld_usb_open()
356 dev, in ld_usb_open()
357 dev->interrupt_in_interval); in ld_usb_open()
359 dev->interrupt_in_running = 1; in ld_usb_open()
360 dev->interrupt_in_done = 0; in ld_usb_open()
362 retval = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); in ld_usb_open()
364 dev_err(&interface->dev, "Couldn't submit interrupt_in_urb %d\n", retval); in ld_usb_open()
365 dev->interrupt_in_running = 0; in ld_usb_open()
366 dev->open_count = 0; in ld_usb_open()
371 file->private_data = dev; in ld_usb_open()
374 mutex_unlock(&dev->mutex); in ld_usb_open()
384 struct ld_usb *dev; in ld_usb_release() local
387 dev = file->private_data; in ld_usb_release()
389 if (dev == NULL) { in ld_usb_release()
394 if (mutex_lock_interruptible(&dev->mutex)) { in ld_usb_release()
399 if (dev->open_count != 1) { in ld_usb_release()
403 if (dev->intf == NULL) { in ld_usb_release()
405 mutex_unlock(&dev->mutex); in ld_usb_release()
407 ld_usb_delete(dev); in ld_usb_release()
412 if (dev->interrupt_out_busy) in ld_usb_release()
413 wait_event_interruptible_timeout(dev->write_wait, !dev->interrupt_out_busy, 2 * HZ); in ld_usb_release()
414 ld_usb_abort_transfers(dev); in ld_usb_release()
415 dev->open_count = 0; in ld_usb_release()
418 mutex_unlock(&dev->mutex); in ld_usb_release()
429 struct ld_usb *dev; in ld_usb_poll() local
432 dev = file->private_data; in ld_usb_poll()
434 if (!dev->intf) in ld_usb_poll()
437 poll_wait(file, &dev->read_wait, wait); in ld_usb_poll()
438 poll_wait(file, &dev->write_wait, wait); in ld_usb_poll()
440 if (dev->ring_head != dev->ring_tail) in ld_usb_poll()
442 if (!dev->interrupt_out_busy) in ld_usb_poll()
454 struct ld_usb *dev; in ld_usb_read() local
460 dev = file->private_data; in ld_usb_read()
467 if (mutex_lock_interruptible(&dev->mutex)) { in ld_usb_read()
473 if (dev->intf == NULL) { in ld_usb_read()
480 spin_lock_irq(&dev->rbsl); in ld_usb_read()
481 if (dev->ring_head == dev->ring_tail) { in ld_usb_read()
482 dev->interrupt_in_done = 0; in ld_usb_read()
483 spin_unlock_irq(&dev->rbsl); in ld_usb_read()
488 retval = wait_event_interruptible(dev->read_wait, dev->interrupt_in_done); in ld_usb_read()
492 spin_unlock_irq(&dev->rbsl); in ld_usb_read()
496 …actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_tail*(sizeof(size_t)+dev->interrupt_in_endp… in ld_usb_read()
499 dev_warn(&dev->intf->dev, "Read buffer overflow, %zd bytes dropped\n", in ld_usb_read()
507 dev->ring_tail = (dev->ring_tail+1) % ring_buffer_size; in ld_usb_read()
511 spin_lock_irq(&dev->rbsl); in ld_usb_read()
512 if (dev->buffer_overflow) { in ld_usb_read()
513 dev->buffer_overflow = 0; in ld_usb_read()
514 spin_unlock_irq(&dev->rbsl); in ld_usb_read()
515 rv = usb_submit_urb(dev->interrupt_in_urb, GFP_KERNEL); in ld_usb_read()
517 dev->buffer_overflow = 1; in ld_usb_read()
519 spin_unlock_irq(&dev->rbsl); in ld_usb_read()
524 mutex_unlock(&dev->mutex); in ld_usb_read()
536 struct ld_usb *dev; in ld_usb_write() local
540 dev = file->private_data; in ld_usb_write()
547 if (mutex_lock_interruptible(&dev->mutex)) { in ld_usb_write()
553 if (dev->intf == NULL) { in ld_usb_write()
560 if (dev->interrupt_out_busy) { in ld_usb_write()
565 retval = wait_event_interruptible(dev->write_wait, !dev->interrupt_out_busy); in ld_usb_write()
572 bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size); in ld_usb_write()
574 dev_warn(&dev->intf->dev, "Write buffer overflow, %zd bytes dropped\n",count-bytes_to_write); in ld_usb_write()
575 dev_dbg(&dev->intf->dev, "%s: count = %zd, bytes_to_write = %zd\n", in ld_usb_write()
578 if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) { in ld_usb_write()
583 if (dev->interrupt_out_endpoint == NULL) { in ld_usb_write()
585 retval = usb_control_msg(interface_to_usbdev(dev->intf), in ld_usb_write()
586 usb_sndctrlpipe(interface_to_usbdev(dev->intf), 0), in ld_usb_write()
590 dev->interrupt_out_buffer, in ld_usb_write()
594 dev_err(&dev->intf->dev, in ld_usb_write()
601 usb_fill_int_urb(dev->interrupt_out_urb, in ld_usb_write()
602 interface_to_usbdev(dev->intf), in ld_usb_write()
603 usb_sndintpipe(interface_to_usbdev(dev->intf), in ld_usb_write()
604 dev->interrupt_out_endpoint->bEndpointAddress), in ld_usb_write()
605 dev->interrupt_out_buffer, in ld_usb_write()
608 dev, in ld_usb_write()
609 dev->interrupt_out_interval); in ld_usb_write()
611 dev->interrupt_out_busy = 1; in ld_usb_write()
614 retval = usb_submit_urb(dev->interrupt_out_urb, GFP_KERNEL); in ld_usb_write()
616 dev->interrupt_out_busy = 0; in ld_usb_write()
617 dev_err(&dev->intf->dev, in ld_usb_write()
625 mutex_unlock(&dev->mutex); in ld_usb_write()
661 struct ld_usb *dev = NULL; in ld_usb_probe() local
670 dev = kzalloc(sizeof(*dev), GFP_KERNEL); in ld_usb_probe()
671 if (dev == NULL) { in ld_usb_probe()
672 dev_err(&intf->dev, "Out of memory\n"); in ld_usb_probe()
675 mutex_init(&dev->mutex); in ld_usb_probe()
676 spin_lock_init(&dev->rbsl); in ld_usb_probe()
677 dev->intf = intf; in ld_usb_probe()
678 init_waitqueue_head(&dev->read_wait); in ld_usb_probe()
679 init_waitqueue_head(&dev->write_wait); in ld_usb_probe()
688 dev_err(&intf->dev, "Couldn't allocate string buffer\n"); in ld_usb_probe()
703 dev->interrupt_in_endpoint = endpoint; in ld_usb_probe()
706 dev->interrupt_out_endpoint = endpoint; in ld_usb_probe()
708 if (dev->interrupt_in_endpoint == NULL) { in ld_usb_probe()
709 dev_err(&intf->dev, "Interrupt in endpoint not found\n"); in ld_usb_probe()
712 if (dev->interrupt_out_endpoint == NULL) in ld_usb_probe()
713 dev_warn(&intf->dev, "Interrupt out endpoint not found (using control endpoint instead)\n"); in ld_usb_probe()
715 dev->interrupt_in_endpoint_size = usb_endpoint_maxp(dev->interrupt_in_endpoint); in ld_usb_probe()
716dev->ring_buffer = kmalloc(ring_buffer_size*(sizeof(size_t)+dev->interrupt_in_endpoint_size), GFP_… in ld_usb_probe()
717 if (!dev->ring_buffer) { in ld_usb_probe()
718 dev_err(&intf->dev, "Couldn't allocate ring_buffer\n"); in ld_usb_probe()
721 dev->interrupt_in_buffer = kmalloc(dev->interrupt_in_endpoint_size, GFP_KERNEL); in ld_usb_probe()
722 if (!dev->interrupt_in_buffer) { in ld_usb_probe()
723 dev_err(&intf->dev, "Couldn't allocate interrupt_in_buffer\n"); in ld_usb_probe()
726 dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL); in ld_usb_probe()
727 if (!dev->interrupt_in_urb) { in ld_usb_probe()
728 dev_err(&intf->dev, "Couldn't allocate interrupt_in_urb\n"); in ld_usb_probe()
731dev->interrupt_out_endpoint_size = dev->interrupt_out_endpoint ? usb_endpoint_maxp(dev->interrupt_… in ld_usb_probe()
733dev->interrupt_out_buffer = kmalloc(write_buffer_size*dev->interrupt_out_endpoint_size, GFP_KERNEL… in ld_usb_probe()
734 if (!dev->interrupt_out_buffer) { in ld_usb_probe()
735 dev_err(&intf->dev, "Couldn't allocate interrupt_out_buffer\n"); in ld_usb_probe()
738 dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL); in ld_usb_probe()
739 if (!dev->interrupt_out_urb) { in ld_usb_probe()
740 dev_err(&intf->dev, "Couldn't allocate interrupt_out_urb\n"); in ld_usb_probe()
743dev->interrupt_in_interval = min_interrupt_in_interval > dev->interrupt_in_endpoint->bInterval ? m… in ld_usb_probe()
744 if (dev->interrupt_out_endpoint) in ld_usb_probe()
745dev->interrupt_out_interval = min_interrupt_out_interval > dev->interrupt_out_endpoint->bInterval … in ld_usb_probe()
748 usb_set_intfdata(intf, dev); in ld_usb_probe()
753 dev_err(&intf->dev, "Not able to get a minor for this device.\n"); in ld_usb_probe()
759 dev_info(&intf->dev, "LD USB Device #%d now attached to major %d minor %d\n", in ld_usb_probe()
766 ld_usb_delete(dev); in ld_usb_probe()
778 struct ld_usb *dev; in ld_usb_disconnect() local
781 dev = usb_get_intfdata(intf); in ld_usb_disconnect()
789 mutex_lock(&dev->mutex); in ld_usb_disconnect()
792 if (!dev->open_count) { in ld_usb_disconnect()
793 mutex_unlock(&dev->mutex); in ld_usb_disconnect()
794 ld_usb_delete(dev); in ld_usb_disconnect()
796 dev->intf = NULL; in ld_usb_disconnect()
798 wake_up_interruptible_all(&dev->read_wait); in ld_usb_disconnect()
799 wake_up_interruptible_all(&dev->write_wait); in ld_usb_disconnect()
800 mutex_unlock(&dev->mutex); in ld_usb_disconnect()
803 dev_info(&intf->dev, "LD USB Device #%d now disconnected\n", in ld_usb_disconnect()