Lines Matching refs:dev

230 static inline void tower_delete (struct lego_usb_tower *dev);
236 static void tower_abort_transfers (struct lego_usb_tower *dev);
237 static void tower_check_for_read_packet (struct lego_usb_tower *dev);
256 static char *legousbtower_devnode(struct device *dev, umode_t *mode) in legousbtower_devnode() argument
258 return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev)); in legousbtower_devnode()
285 static inline void lego_usb_tower_debug_data(struct device *dev, in lego_usb_tower_debug_data() argument
289 dev_dbg(dev, "%s - length = %d, data = %*ph\n", in lego_usb_tower_debug_data()
297 static inline void tower_delete (struct lego_usb_tower *dev) in tower_delete() argument
299 tower_abort_transfers (dev); in tower_delete()
302 usb_free_urb(dev->interrupt_in_urb); in tower_delete()
303 usb_free_urb(dev->interrupt_out_urb); in tower_delete()
304 kfree (dev->read_buffer); in tower_delete()
305 kfree (dev->interrupt_in_buffer); in tower_delete()
306 kfree (dev->interrupt_out_buffer); in tower_delete()
307 kfree (dev); in tower_delete()
316 struct lego_usb_tower *dev = NULL; in tower_open() local
335 dev = usb_get_intfdata(interface); in tower_open()
337 if (!dev) { in tower_open()
344 if (mutex_lock_interruptible(&dev->lock)) { in tower_open()
352 if (dev->open_count) { in tower_open()
357 dev->open_count = 1; in tower_open()
361 result = usb_control_msg (dev->udev, in tower_open()
362 usb_rcvctrlpipe(dev->udev, 0), in tower_open()
371 dev_err(&dev->udev->dev, in tower_open()
378 dev->read_buffer_length = 0; in tower_open()
379 dev->read_packet_length = 0; in tower_open()
380 usb_fill_int_urb (dev->interrupt_in_urb, in tower_open()
381 dev->udev, in tower_open()
382 usb_rcvintpipe(dev->udev, dev->interrupt_in_endpoint->bEndpointAddress), in tower_open()
383 dev->interrupt_in_buffer, in tower_open()
384 usb_endpoint_maxp(dev->interrupt_in_endpoint), in tower_open()
386 dev, in tower_open()
387 dev->interrupt_in_interval); in tower_open()
389 dev->interrupt_in_running = 1; in tower_open()
390 dev->interrupt_in_done = 0; in tower_open()
393 retval = usb_submit_urb (dev->interrupt_in_urb, GFP_KERNEL); in tower_open()
395 dev_err(&dev->udev->dev, in tower_open()
397 dev->interrupt_in_running = 0; in tower_open()
398 dev->open_count = 0; in tower_open()
403 file->private_data = dev; in tower_open()
406 mutex_unlock(&dev->lock); in tower_open()
417 struct lego_usb_tower *dev; in tower_release() local
420 dev = file->private_data; in tower_release()
422 if (dev == NULL) { in tower_release()
428 if (mutex_lock_interruptible(&dev->lock)) { in tower_release()
433 if (dev->open_count != 1) { in tower_release()
434 dev_dbg(&dev->udev->dev, "%s: device not opened exactly once\n", in tower_release()
439 if (dev->udev == NULL) { in tower_release()
443 mutex_unlock(&dev->lock); in tower_release()
444 tower_delete (dev); in tower_release()
449 if (dev->interrupt_out_busy) { in tower_release()
450 wait_event_interruptible_timeout (dev->write_wait, !dev->interrupt_out_busy, 2 * HZ); in tower_release()
452 tower_abort_transfers (dev); in tower_release()
453 dev->open_count = 0; in tower_release()
456 mutex_unlock(&dev->lock); in tower_release()
469 static void tower_abort_transfers (struct lego_usb_tower *dev) in tower_abort_transfers() argument
471 if (dev == NULL) in tower_abort_transfers()
475 if (dev->interrupt_in_running) { in tower_abort_transfers()
476 dev->interrupt_in_running = 0; in tower_abort_transfers()
478 if (dev->udev) in tower_abort_transfers()
479 usb_kill_urb (dev->interrupt_in_urb); in tower_abort_transfers()
481 if (dev->interrupt_out_busy && dev->udev) in tower_abort_transfers()
482 usb_kill_urb(dev->interrupt_out_urb); in tower_abort_transfers()
494 static void tower_check_for_read_packet (struct lego_usb_tower *dev) in tower_check_for_read_packet() argument
496 spin_lock_irq (&dev->read_buffer_lock); in tower_check_for_read_packet()
498 || time_after(jiffies, dev->read_last_arrival + dev->packet_timeout_jiffies) in tower_check_for_read_packet()
499 || dev->read_buffer_length == read_buffer_size) { in tower_check_for_read_packet()
500 dev->read_packet_length = dev->read_buffer_length; in tower_check_for_read_packet()
502 dev->interrupt_in_done = 0; in tower_check_for_read_packet()
503 spin_unlock_irq (&dev->read_buffer_lock); in tower_check_for_read_packet()
512 struct lego_usb_tower *dev; in tower_poll() local
515 dev = file->private_data; in tower_poll()
517 if (!dev->udev) in tower_poll()
520 poll_wait(file, &dev->read_wait, wait); in tower_poll()
521 poll_wait(file, &dev->write_wait, wait); in tower_poll()
523 tower_check_for_read_packet(dev); in tower_poll()
524 if (dev->read_packet_length > 0) { in tower_poll()
527 if (!dev->interrupt_out_busy) { in tower_poll()
549 struct lego_usb_tower *dev; in tower_read() local
555 dev = file->private_data; in tower_read()
558 if (mutex_lock_interruptible(&dev->lock)) { in tower_read()
564 if (dev->udev == NULL) { in tower_read()
572 dev_dbg(&dev->udev->dev, "read request of 0 bytes\n"); in tower_read()
581 tower_check_for_read_packet (dev); in tower_read()
582 while (dev->read_packet_length == 0) { in tower_read()
587 …retval = wait_event_interruptible_timeout(dev->read_wait, dev->interrupt_in_done, dev->packet_time… in tower_read()
594 && (dev->read_buffer_length || dev->interrupt_out_busy)) { in tower_read()
602 tower_check_for_read_packet (dev); in tower_read()
606 bytes_to_read = min(count, dev->read_packet_length); in tower_read()
608 if (copy_to_user (buffer, dev->read_buffer, bytes_to_read)) { in tower_read()
613 spin_lock_irq (&dev->read_buffer_lock); in tower_read()
614 dev->read_buffer_length -= bytes_to_read; in tower_read()
615 dev->read_packet_length -= bytes_to_read; in tower_read()
616 for (i=0; i<dev->read_buffer_length; i++) { in tower_read()
617 dev->read_buffer[i] = dev->read_buffer[i+bytes_to_read]; in tower_read()
619 spin_unlock_irq (&dev->read_buffer_lock); in tower_read()
625 mutex_unlock(&dev->lock); in tower_read()
637 struct lego_usb_tower *dev; in tower_write() local
641 dev = file->private_data; in tower_write()
644 if (mutex_lock_interruptible(&dev->lock)) { in tower_write()
650 if (dev->udev == NULL) { in tower_write()
658 dev_dbg(&dev->udev->dev, "write request of 0 bytes\n"); in tower_write()
663 while (dev->interrupt_out_busy) { in tower_write()
668 retval = wait_event_interruptible (dev->write_wait, !dev->interrupt_out_busy); in tower_write()
676 dev_dbg(&dev->udev->dev, "%s: count = %Zd, bytes_to_write = %Zd\n", in tower_write()
679 if (copy_from_user (dev->interrupt_out_buffer, buffer, bytes_to_write)) { in tower_write()
685 usb_fill_int_urb(dev->interrupt_out_urb, in tower_write()
686 dev->udev, in tower_write()
687 usb_sndintpipe(dev->udev, dev->interrupt_out_endpoint->bEndpointAddress), in tower_write()
688 dev->interrupt_out_buffer, in tower_write()
691 dev, in tower_write()
692 dev->interrupt_out_interval); in tower_write()
694 dev->interrupt_out_busy = 1; in tower_write()
697 retval = usb_submit_urb (dev->interrupt_out_urb, GFP_KERNEL); in tower_write()
699 dev->interrupt_out_busy = 0; in tower_write()
700 dev_err(&dev->udev->dev, in tower_write()
708 mutex_unlock(&dev->lock); in tower_write()
720 struct lego_usb_tower *dev = urb->context; in tower_interrupt_in_callback() local
724 lego_usb_tower_debug_data(&dev->udev->dev, __func__, in tower_interrupt_in_callback()
733 dev_dbg(&dev->udev->dev, in tower_interrupt_in_callback()
741 spin_lock (&dev->read_buffer_lock); in tower_interrupt_in_callback()
742 if (dev->read_buffer_length + urb->actual_length < read_buffer_size) { in tower_interrupt_in_callback()
743 memcpy (dev->read_buffer + dev->read_buffer_length, in tower_interrupt_in_callback()
744 dev->interrupt_in_buffer, in tower_interrupt_in_callback()
746 dev->read_buffer_length += urb->actual_length; in tower_interrupt_in_callback()
747 dev->read_last_arrival = jiffies; in tower_interrupt_in_callback()
748 dev_dbg(&dev->udev->dev, "%s: received %d bytes\n", in tower_interrupt_in_callback()
754 spin_unlock (&dev->read_buffer_lock); in tower_interrupt_in_callback()
759 if (dev->interrupt_in_running && dev->udev) { in tower_interrupt_in_callback()
760 retval = usb_submit_urb (dev->interrupt_in_urb, GFP_ATOMIC); in tower_interrupt_in_callback()
762 dev_err(&dev->udev->dev, in tower_interrupt_in_callback()
768 dev->interrupt_in_done = 1; in tower_interrupt_in_callback()
769 wake_up_interruptible (&dev->read_wait); in tower_interrupt_in_callback()
778 struct lego_usb_tower *dev = urb->context; in tower_interrupt_out_callback() local
781 lego_usb_tower_debug_data(&dev->udev->dev, __func__, in tower_interrupt_out_callback()
788 dev_dbg(&dev->udev->dev, in tower_interrupt_out_callback()
793 dev->interrupt_out_busy = 0; in tower_interrupt_out_callback()
794 wake_up_interruptible(&dev->write_wait); in tower_interrupt_out_callback()
806 struct device *idev = &interface->dev; in tower_probe()
808 struct lego_usb_tower *dev = NULL; in tower_probe() local
818 dev = kmalloc (sizeof(struct lego_usb_tower), GFP_KERNEL); in tower_probe()
820 if (dev == NULL) { in tower_probe()
825 mutex_init(&dev->lock); in tower_probe()
827 dev->udev = udev; in tower_probe()
828 dev->open_count = 0; in tower_probe()
830 dev->read_buffer = NULL; in tower_probe()
831 dev->read_buffer_length = 0; in tower_probe()
832 dev->read_packet_length = 0; in tower_probe()
833 spin_lock_init (&dev->read_buffer_lock); in tower_probe()
834 dev->packet_timeout_jiffies = msecs_to_jiffies(packet_timeout); in tower_probe()
835 dev->read_last_arrival = jiffies; in tower_probe()
837 init_waitqueue_head (&dev->read_wait); in tower_probe()
838 init_waitqueue_head (&dev->write_wait); in tower_probe()
840 dev->interrupt_in_buffer = NULL; in tower_probe()
841 dev->interrupt_in_endpoint = NULL; in tower_probe()
842 dev->interrupt_in_urb = NULL; in tower_probe()
843 dev->interrupt_in_running = 0; in tower_probe()
844 dev->interrupt_in_done = 0; in tower_probe()
846 dev->interrupt_out_buffer = NULL; in tower_probe()
847 dev->interrupt_out_endpoint = NULL; in tower_probe()
848 dev->interrupt_out_urb = NULL; in tower_probe()
849 dev->interrupt_out_busy = 0; in tower_probe()
859 dev->interrupt_in_endpoint = endpoint; in tower_probe()
861 dev->interrupt_out_endpoint = endpoint; in tower_probe()
864 if(dev->interrupt_in_endpoint == NULL) { in tower_probe()
868 if (dev->interrupt_out_endpoint == NULL) { in tower_probe()
873 dev->read_buffer = kmalloc (read_buffer_size, GFP_KERNEL); in tower_probe()
874 if (!dev->read_buffer) { in tower_probe()
878 dev->interrupt_in_buffer = kmalloc (usb_endpoint_maxp(dev->interrupt_in_endpoint), GFP_KERNEL); in tower_probe()
879 if (!dev->interrupt_in_buffer) { in tower_probe()
883 dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL); in tower_probe()
884 if (!dev->interrupt_in_urb) { in tower_probe()
888 dev->interrupt_out_buffer = kmalloc (write_buffer_size, GFP_KERNEL); in tower_probe()
889 if (!dev->interrupt_out_buffer) { in tower_probe()
893 dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL); in tower_probe()
894 if (!dev->interrupt_out_urb) { in tower_probe()
898dev->interrupt_in_interval = interrupt_in_interval ? interrupt_in_interval : dev->interrupt_in_end… in tower_probe()
899dev->interrupt_out_interval = interrupt_out_interval ? interrupt_out_interval : dev->interrupt_out… in tower_probe()
902 usb_set_intfdata (interface, dev); in tower_probe()
912 dev->minor = interface->minor; in tower_probe()
915 dev_info(&interface->dev, "LEGO USB Tower #%d now attached to major " in tower_probe()
916 "%d minor %d\n", (dev->minor - LEGO_USB_TOWER_MINOR_BASE), in tower_probe()
917 USB_MAJOR, dev->minor); in tower_probe()
934 dev_info(&interface->dev, "LEGO USB Tower firmware version is %d.%d " in tower_probe()
944 tower_delete(dev); in tower_probe()
956 struct lego_usb_tower *dev; in tower_disconnect() local
959 dev = usb_get_intfdata (interface); in tower_disconnect()
963 minor = dev->minor; in tower_disconnect()
968 mutex_lock(&dev->lock); in tower_disconnect()
972 if (!dev->open_count) { in tower_disconnect()
973 mutex_unlock(&dev->lock); in tower_disconnect()
974 tower_delete (dev); in tower_disconnect()
976 dev->udev = NULL; in tower_disconnect()
978 wake_up_interruptible_all(&dev->read_wait); in tower_disconnect()
979 wake_up_interruptible_all(&dev->write_wait); in tower_disconnect()
980 mutex_unlock(&dev->lock); in tower_disconnect()
983 dev_info(&interface->dev, "LEGO USB Tower #%d now disconnected\n", in tower_disconnect()