Lines Matching refs:dev

104 static int usb_get_report(struct usb_device *dev,  in usb_get_report()  argument
108 return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), in usb_get_report()
155 struct iowarrior *dev = urb->context; in iowarrior_callback() local
175 intr_idx = atomic_read(&dev->intr_idx); in iowarrior_callback()
178 read_idx = atomic_read(&dev->read_idx); in iowarrior_callback()
182 && (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0)) { in iowarrior_callback()
184 offset = aux_idx * (dev->report_size + 1); in iowarrior_callback()
186 (dev->read_queue + offset, urb->transfer_buffer, in iowarrior_callback()
187 dev->report_size)) { in iowarrior_callback()
198 atomic_set(&dev->read_idx, read_idx); in iowarrior_callback()
199 atomic_set(&dev->overflow_flag, 1); in iowarrior_callback()
203 offset = intr_idx * (dev->report_size + 1); in iowarrior_callback()
204 memcpy(dev->read_queue + offset, urb->transfer_buffer, in iowarrior_callback()
205 dev->report_size); in iowarrior_callback()
206 *(dev->read_queue + offset + (dev->report_size)) = dev->serial_number++; in iowarrior_callback()
208 atomic_set(&dev->intr_idx, aux_idx); in iowarrior_callback()
210 wake_up_interruptible(&dev->read_wait); in iowarrior_callback()
215 dev_err(&dev->interface->dev, "%s - usb_submit_urb failed with result %d\n", in iowarrior_callback()
225 struct iowarrior *dev; in iowarrior_write_callback() local
228 dev = urb->context; in iowarrior_write_callback()
233 dev_dbg(&dev->interface->dev, in iowarrior_write_callback()
237 usb_free_coherent(urb->dev, urb->transfer_buffer_length, in iowarrior_write_callback()
240 atomic_dec(&dev->write_busy); in iowarrior_write_callback()
241 wake_up_interruptible(&dev->write_wait); in iowarrior_write_callback()
247 static inline void iowarrior_delete(struct iowarrior *dev) in iowarrior_delete() argument
249 dev_dbg(&dev->interface->dev, "minor %d\n", dev->minor); in iowarrior_delete()
250 kfree(dev->int_in_buffer); in iowarrior_delete()
251 usb_free_urb(dev->int_in_urb); in iowarrior_delete()
252 kfree(dev->read_queue); in iowarrior_delete()
253 usb_put_intf(dev->interface); in iowarrior_delete()
254 kfree(dev); in iowarrior_delete()
261 static int read_index(struct iowarrior *dev) in read_index() argument
265 read_idx = atomic_read(&dev->read_idx); in read_index()
266 intr_idx = atomic_read(&dev->intr_idx); in read_index()
277 struct iowarrior *dev; in iowarrior_read() local
281 dev = file->private_data; in iowarrior_read()
284 if (!dev || !dev->present) in iowarrior_read()
287 dev_dbg(&dev->interface->dev, "minor %d, count = %zd\n", in iowarrior_read()
288 dev->minor, count); in iowarrior_read()
291 if ((count != dev->report_size) in iowarrior_read()
292 && (count != (dev->report_size + 1))) in iowarrior_read()
297 atomic_set(&dev->overflow_flag, 0); in iowarrior_read()
298 if ((read_idx = read_index(dev)) == -1) { in iowarrior_read()
304 int r = wait_event_interruptible(dev->read_wait, in iowarrior_read()
305 (!dev->present in iowarrior_read()
308 (dev)) != in iowarrior_read()
314 if (!dev->present) { in iowarrior_read()
325 offset = read_idx * (dev->report_size + 1); in iowarrior_read()
326 if (copy_to_user(buffer, dev->read_queue + offset, count)) { in iowarrior_read()
329 } while (atomic_read(&dev->overflow_flag)); in iowarrior_read()
332 atomic_set(&dev->read_idx, read_idx); in iowarrior_read()
343 struct iowarrior *dev; in iowarrior_write() local
348 dev = file->private_data; in iowarrior_write()
350 mutex_lock(&dev->mutex); in iowarrior_write()
352 if (!dev->present) { in iowarrior_write()
356 dev_dbg(&dev->interface->dev, "minor %d, count = %zd\n", in iowarrior_write()
357 dev->minor, count); in iowarrior_write()
364 if (count != dev->report_size) { in iowarrior_write()
368 switch (dev->product_id) { in iowarrior_write()
380 retval = usb_set_report(dev->interface, 2, 0, buf, count); in iowarrior_write()
389 if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) { in iowarrior_write()
395 retval = wait_event_interruptible(dev->write_wait, in iowarrior_write()
396 (!dev->present || (atomic_read (&dev-> write_busy) < MAX_WRITES_IN_FLIGHT))); in iowarrior_write()
402 if (!dev->present) { in iowarrior_write()
407 if (!dev->opened) { in iowarrior_write()
414 atomic_inc(&dev->write_busy); in iowarrior_write()
420 buf = usb_alloc_coherent(dev->udev, dev->report_size, in iowarrior_write()
424 dev_dbg(&dev->interface->dev, in iowarrior_write()
428 usb_fill_int_urb(int_out_urb, dev->udev, in iowarrior_write()
429 usb_sndintpipe(dev->udev, in iowarrior_write()
430 dev->int_out_endpoint->bEndpointAddress), in iowarrior_write()
431 buf, dev->report_size, in iowarrior_write()
432 iowarrior_write_callback, dev, in iowarrior_write()
433 dev->int_out_endpoint->bInterval); in iowarrior_write()
439 usb_anchor_urb(int_out_urb, &dev->submitted); in iowarrior_write()
442 dev_dbg(&dev->interface->dev, in iowarrior_write()
444 retval, atomic_read(&dev->write_busy)); in iowarrior_write()
454 dev_err(&dev->interface->dev, "%s - not supported for product=0x%x\n", in iowarrior_write()
455 __func__, dev->product_id); in iowarrior_write()
460 usb_free_coherent(dev->udev, dev->report_size, buf, in iowarrior_write()
465 atomic_dec(&dev->write_busy); in iowarrior_write()
466 wake_up_interruptible(&dev->write_wait); in iowarrior_write()
468 mutex_unlock(&dev->mutex); in iowarrior_write()
478 struct iowarrior *dev = NULL; in iowarrior_ioctl() local
484 dev = file->private_data; in iowarrior_ioctl()
485 if (!dev) in iowarrior_ioctl()
488 buffer = kzalloc(dev->report_size, GFP_KERNEL); in iowarrior_ioctl()
492 mutex_lock(&dev->mutex); in iowarrior_ioctl()
495 if (!dev->present) { in iowarrior_ioctl()
500 dev_dbg(&dev->interface->dev, "minor %d, cmd 0x%.4x, arg %ld\n", in iowarrior_ioctl()
501 dev->minor, cmd, arg); in iowarrior_ioctl()
507 if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24 || in iowarrior_ioctl()
508 dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24SAG || in iowarrior_ioctl()
509 dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV1 || in iowarrior_ioctl()
510 dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 || in iowarrior_ioctl()
511 dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) { in iowarrior_ioctl()
514 dev->report_size); in iowarrior_ioctl()
518 io_res = usb_set_report(dev->interface, 2, 0, in iowarrior_ioctl()
520 dev->report_size); in iowarrior_ioctl()
526 dev_err(&dev->interface->dev, in iowarrior_ioctl()
528 dev->product_id); in iowarrior_ioctl()
533 io_res = usb_get_report(dev->udev, in iowarrior_ioctl()
534 dev->interface->cur_altsetting, 1, 0, in iowarrior_ioctl()
535 buffer, dev->report_size); in iowarrior_ioctl()
539 io_res = copy_to_user(user_buffer, buffer, dev->report_size); in iowarrior_ioctl()
549 struct usb_config_descriptor *cfg_descriptor = &dev->udev->actconfig->desc; in iowarrior_ioctl()
553 info.vendor = le16_to_cpu(dev->udev->descriptor.idVendor); in iowarrior_ioctl()
554 info.product = dev->product_id; in iowarrior_ioctl()
555 info.revision = le16_to_cpu(dev->udev->descriptor.bcdDevice); in iowarrior_ioctl()
558 info.speed = dev->udev->speed; in iowarrior_ioctl()
559 info.if_num = dev->interface->cur_altsetting->desc.bInterfaceNumber; in iowarrior_ioctl()
560 info.report_size = dev->report_size; in iowarrior_ioctl()
563 memcpy(info.serial, dev->chip_serial, in iowarrior_ioctl()
564 sizeof(dev->chip_serial)); in iowarrior_ioctl()
584 mutex_unlock(&dev->mutex); in iowarrior_ioctl()
594 struct iowarrior *dev = NULL; in iowarrior_open() local
608 dev = usb_get_intfdata(interface); in iowarrior_open()
609 if (!dev) in iowarrior_open()
612 mutex_lock(&dev->mutex); in iowarrior_open()
615 if (dev->opened) { in iowarrior_open()
621 if ((retval = usb_submit_urb(dev->int_in_urb, GFP_KERNEL)) < 0) { in iowarrior_open()
622 dev_err(&interface->dev, "Error %d while submitting URB\n", retval); in iowarrior_open()
627 ++dev->opened; in iowarrior_open()
629 file->private_data = dev; in iowarrior_open()
633 mutex_unlock(&dev->mutex); in iowarrior_open()
642 struct iowarrior *dev; in iowarrior_release() local
645 dev = file->private_data; in iowarrior_release()
646 if (!dev) in iowarrior_release()
649 dev_dbg(&dev->interface->dev, "minor %d\n", dev->minor); in iowarrior_release()
652 mutex_lock(&dev->mutex); in iowarrior_release()
654 if (dev->opened <= 0) { in iowarrior_release()
656 mutex_unlock(&dev->mutex); in iowarrior_release()
658 dev->opened = 0; /* we're closing now */ in iowarrior_release()
660 if (dev->present) { in iowarrior_release()
665 usb_kill_urb(dev->int_in_urb); in iowarrior_release()
666 wake_up_interruptible(&dev->read_wait); in iowarrior_release()
667 wake_up_interruptible(&dev->write_wait); in iowarrior_release()
668 mutex_unlock(&dev->mutex); in iowarrior_release()
671 mutex_unlock(&dev->mutex); in iowarrior_release()
672 iowarrior_delete(dev); in iowarrior_release()
680 struct iowarrior *dev = file->private_data; in iowarrior_poll() local
683 if (!dev->present) in iowarrior_poll()
686 poll_wait(file, &dev->read_wait, wait); in iowarrior_poll()
687 poll_wait(file, &dev->write_wait, wait); in iowarrior_poll()
689 if (!dev->present) in iowarrior_poll()
692 if (read_index(dev) != -1) in iowarrior_poll()
695 if (atomic_read(&dev->write_busy) < MAX_WRITES_IN_FLIGHT) in iowarrior_poll()
720 static char *iowarrior_devnode(const struct device *dev, umode_t *mode) in iowarrior_devnode() argument
722 return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev)); in iowarrior_devnode()
749 struct iowarrior *dev = NULL; in iowarrior_probe() local
755 dev = kzalloc(sizeof(struct iowarrior), GFP_KERNEL); in iowarrior_probe()
756 if (!dev) in iowarrior_probe()
759 mutex_init(&dev->mutex); in iowarrior_probe()
761 atomic_set(&dev->intr_idx, 0); in iowarrior_probe()
762 atomic_set(&dev->read_idx, 0); in iowarrior_probe()
763 atomic_set(&dev->overflow_flag, 0); in iowarrior_probe()
764 init_waitqueue_head(&dev->read_wait); in iowarrior_probe()
765 atomic_set(&dev->write_busy, 0); in iowarrior_probe()
766 init_waitqueue_head(&dev->write_wait); in iowarrior_probe()
768 dev->udev = udev; in iowarrior_probe()
769 dev->interface = usb_get_intf(interface); in iowarrior_probe()
772 dev->product_id = le16_to_cpu(udev->descriptor.idProduct); in iowarrior_probe()
774 init_usb_anchor(&dev->submitted); in iowarrior_probe()
776 res = usb_find_last_int_in_endpoint(iface_desc, &dev->int_in_endpoint); in iowarrior_probe()
778 dev_err(&interface->dev, "no interrupt-in endpoint found\n"); in iowarrior_probe()
783 if ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || in iowarrior_probe()
784 (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || in iowarrior_probe()
785 (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || in iowarrior_probe()
786 (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) || in iowarrior_probe()
787 (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100)) { in iowarrior_probe()
789 &dev->int_out_endpoint); in iowarrior_probe()
791 dev_err(&interface->dev, "no interrupt-out endpoint found\n"); in iowarrior_probe()
798 dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); in iowarrior_probe()
804 if (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) { in iowarrior_probe()
805 switch (dev->product_id) { in iowarrior_probe()
808 dev->report_size = 7; in iowarrior_probe()
813 dev->report_size = 4; in iowarrior_probe()
817 dev->report_size = 12; in iowarrior_probe()
823 dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); in iowarrior_probe()
824 if (!dev->int_in_urb) in iowarrior_probe()
826 dev->int_in_buffer = kmalloc(dev->report_size, GFP_KERNEL); in iowarrior_probe()
827 if (!dev->int_in_buffer) in iowarrior_probe()
829 usb_fill_int_urb(dev->int_in_urb, dev->udev, in iowarrior_probe()
830 usb_rcvintpipe(dev->udev, in iowarrior_probe()
831 dev->int_in_endpoint->bEndpointAddress), in iowarrior_probe()
832 dev->int_in_buffer, dev->report_size, in iowarrior_probe()
833 iowarrior_callback, dev, in iowarrior_probe()
834 dev->int_in_endpoint->bInterval); in iowarrior_probe()
836 dev->read_queue = in iowarrior_probe()
837 kmalloc_array(dev->report_size + 1, MAX_INTERRUPT_BUFFER, in iowarrior_probe()
839 if (!dev->read_queue) in iowarrior_probe()
842 memset(dev->chip_serial, 0x00, sizeof(dev->chip_serial)); in iowarrior_probe()
843 usb_string(udev, udev->descriptor.iSerialNumber, dev->chip_serial, in iowarrior_probe()
844 sizeof(dev->chip_serial)); in iowarrior_probe()
845 if (strlen(dev->chip_serial) != 8) in iowarrior_probe()
846 memset(dev->chip_serial, 0x00, sizeof(dev->chip_serial)); in iowarrior_probe()
849 if (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) { in iowarrior_probe()
856 dev->present = 1; in iowarrior_probe()
859 usb_set_intfdata(interface, dev); in iowarrior_probe()
864 dev_err(&interface->dev, "Not able to get a minor for this device.\n"); in iowarrior_probe()
868 dev->minor = interface->minor; in iowarrior_probe()
871 dev_info(&interface->dev, "IOWarrior product=0x%x, serial=%s interface=%d " in iowarrior_probe()
872 "now attached to iowarrior%d\n", dev->product_id, dev->chip_serial, in iowarrior_probe()
873 iface_desc->desc.bInterfaceNumber, dev->minor - IOWARRIOR_MINOR_BASE); in iowarrior_probe()
877 iowarrior_delete(dev); in iowarrior_probe()
888 struct iowarrior *dev = usb_get_intfdata(interface); in iowarrior_disconnect() local
889 int minor = dev->minor; in iowarrior_disconnect()
893 mutex_lock(&dev->mutex); in iowarrior_disconnect()
896 dev->present = 0; in iowarrior_disconnect()
898 if (dev->opened) { in iowarrior_disconnect()
903 usb_kill_urb(dev->int_in_urb); in iowarrior_disconnect()
904 usb_kill_anchored_urbs(&dev->submitted); in iowarrior_disconnect()
905 wake_up_interruptible(&dev->read_wait); in iowarrior_disconnect()
906 wake_up_interruptible(&dev->write_wait); in iowarrior_disconnect()
907 mutex_unlock(&dev->mutex); in iowarrior_disconnect()
910 mutex_unlock(&dev->mutex); in iowarrior_disconnect()
911 iowarrior_delete(dev); in iowarrior_disconnect()
914 dev_info(&interface->dev, "I/O-Warror #%d now disconnected\n", in iowarrior_disconnect()