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()
150 struct iowarrior *dev = urb->context; in iowarrior_callback() local
170 spin_lock(&dev->intr_idx_lock); in iowarrior_callback()
171 intr_idx = atomic_read(&dev->intr_idx); in iowarrior_callback()
174 read_idx = atomic_read(&dev->read_idx); in iowarrior_callback()
178 && (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0)) { in iowarrior_callback()
180 offset = aux_idx * (dev->report_size + 1); in iowarrior_callback()
182 (dev->read_queue + offset, urb->transfer_buffer, in iowarrior_callback()
183 dev->report_size)) { in iowarrior_callback()
185 spin_unlock(&dev->intr_idx_lock); in iowarrior_callback()
195 atomic_set(&dev->read_idx, read_idx); in iowarrior_callback()
196 atomic_set(&dev->overflow_flag, 1); in iowarrior_callback()
200 offset = intr_idx * (dev->report_size + 1); in iowarrior_callback()
201 memcpy(dev->read_queue + offset, urb->transfer_buffer, in iowarrior_callback()
202 dev->report_size); in iowarrior_callback()
203 *(dev->read_queue + offset + (dev->report_size)) = dev->serial_number++; in iowarrior_callback()
205 atomic_set(&dev->intr_idx, aux_idx); in iowarrior_callback()
206 spin_unlock(&dev->intr_idx_lock); in iowarrior_callback()
208 wake_up_interruptible(&dev->read_wait); in iowarrior_callback()
213 dev_err(&dev->interface->dev, "%s - usb_submit_urb failed with result %d\n", in iowarrior_callback()
223 struct iowarrior *dev; in iowarrior_write_callback() local
226 dev = urb->context; in iowarrior_write_callback()
231 dev_dbg(&dev->interface->dev, in iowarrior_write_callback()
235 usb_free_coherent(urb->dev, urb->transfer_buffer_length, in iowarrior_write_callback()
238 atomic_dec(&dev->write_busy); in iowarrior_write_callback()
239 wake_up_interruptible(&dev->write_wait); in iowarrior_write_callback()
245 static inline void iowarrior_delete(struct iowarrior *dev) in iowarrior_delete() argument
247 dev_dbg(&dev->interface->dev, "minor %d\n", dev->minor); in iowarrior_delete()
248 kfree(dev->int_in_buffer); in iowarrior_delete()
249 usb_free_urb(dev->int_in_urb); in iowarrior_delete()
250 kfree(dev->read_queue); in iowarrior_delete()
251 kfree(dev); in iowarrior_delete()
258 static int read_index(struct iowarrior *dev) in read_index() argument
262 read_idx = atomic_read(&dev->read_idx); in read_index()
263 intr_idx = atomic_read(&dev->intr_idx); in read_index()
274 struct iowarrior *dev; in iowarrior_read() local
278 dev = file->private_data; in iowarrior_read()
281 if (dev == NULL || !dev->present) in iowarrior_read()
284 dev_dbg(&dev->interface->dev, "minor %d, count = %zd\n", in iowarrior_read()
285 dev->minor, count); in iowarrior_read()
288 if ((count != dev->report_size) in iowarrior_read()
289 && (count != (dev->report_size + 1))) in iowarrior_read()
294 atomic_set(&dev->overflow_flag, 0); in iowarrior_read()
295 if ((read_idx = read_index(dev)) == -1) { in iowarrior_read()
301 int r = wait_event_interruptible(dev->read_wait, in iowarrior_read()
302 (!dev->present in iowarrior_read()
305 (dev)) != in iowarrior_read()
311 if (!dev->present) { in iowarrior_read()
322 offset = read_idx * (dev->report_size + 1); in iowarrior_read()
323 if (copy_to_user(buffer, dev->read_queue + offset, count)) { in iowarrior_read()
326 } while (atomic_read(&dev->overflow_flag)); in iowarrior_read()
329 atomic_set(&dev->read_idx, read_idx); in iowarrior_read()
340 struct iowarrior *dev; in iowarrior_write() local
345 dev = file->private_data; in iowarrior_write()
347 mutex_lock(&dev->mutex); in iowarrior_write()
349 if (!dev->present) { in iowarrior_write()
353 dev_dbg(&dev->interface->dev, "minor %d, count = %zd\n", in iowarrior_write()
354 dev->minor, count); in iowarrior_write()
361 if (count != dev->report_size) { in iowarrior_write()
365 switch (dev->product_id) { in iowarrior_write()
381 retval = usb_set_report(dev->interface, 2, 0, buf, count); in iowarrior_write()
387 if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) { in iowarrior_write()
393 retval = wait_event_interruptible(dev->write_wait, in iowarrior_write()
394 (!dev->present || (atomic_read (&dev-> write_busy) < MAX_WRITES_IN_FLIGHT))); in iowarrior_write()
400 if (!dev->present) { in iowarrior_write()
405 if (!dev->opened) { in iowarrior_write()
412 atomic_inc(&dev->write_busy); in iowarrior_write()
416 dev_dbg(&dev->interface->dev, 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()
441 dev_dbg(&dev->interface->dev, in iowarrior_write()
443 retval, atomic_read(&dev->write_busy)); in iowarrior_write()
453 dev_err(&dev->interface->dev, "%s - not supported for product=0x%x\n", in iowarrior_write()
454 __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 == NULL) { in iowarrior_ioctl()
489 buffer = kzalloc(dev->report_size, GFP_KERNEL); in iowarrior_ioctl()
495 mutex_lock(&dev->mutex); in iowarrior_ioctl()
498 if (!dev->present) { in iowarrior_ioctl()
503 dev_dbg(&dev->interface->dev, "minor %d, cmd 0x%.4x, arg %ld\n", in iowarrior_ioctl()
504 dev->minor, cmd, arg); in iowarrior_ioctl()
510 if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24 || in iowarrior_ioctl()
511 dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV1 || in iowarrior_ioctl()
512 dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 || in iowarrior_ioctl()
513 dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) { in iowarrior_ioctl()
516 dev->report_size); in iowarrior_ioctl()
520 io_res = usb_set_report(dev->interface, 2, 0, in iowarrior_ioctl()
522 dev->report_size); in iowarrior_ioctl()
528 dev_err(&dev->interface->dev, in iowarrior_ioctl()
530 dev->product_id); in iowarrior_ioctl()
535 io_res = usb_get_report(dev->udev, in iowarrior_ioctl()
536 dev->interface->cur_altsetting, 1, 0, in iowarrior_ioctl()
537 buffer, dev->report_size); in iowarrior_ioctl()
541 io_res = copy_to_user(user_buffer, buffer, dev->report_size); in iowarrior_ioctl()
551 struct usb_config_descriptor *cfg_descriptor = &dev->udev->actconfig->desc; in iowarrior_ioctl()
555 info.vendor = le16_to_cpu(dev->udev->descriptor.idVendor); in iowarrior_ioctl()
556 info.product = dev->product_id; in iowarrior_ioctl()
557 info.revision = le16_to_cpu(dev->udev->descriptor.bcdDevice); in iowarrior_ioctl()
560 info.speed = le16_to_cpu(dev->udev->speed); in iowarrior_ioctl()
561 info.if_num = dev->interface->cur_altsetting->desc.bInterfaceNumber; in iowarrior_ioctl()
562 info.report_size = dev->report_size; in iowarrior_ioctl()
565 memcpy(info.serial, dev->chip_serial, in iowarrior_ioctl()
566 sizeof(dev->chip_serial)); in iowarrior_ioctl()
586 mutex_unlock(&dev->mutex); in iowarrior_ioctl()
597 struct iowarrior *dev = NULL; in iowarrior_open() local
614 dev = usb_get_intfdata(interface); in iowarrior_open()
615 if (!dev) { in iowarrior_open()
621 mutex_lock(&dev->mutex); in iowarrior_open()
625 if (dev->opened) { in iowarrior_open()
631 if ((retval = usb_submit_urb(dev->int_in_urb, GFP_KERNEL)) < 0) { in iowarrior_open()
632 dev_err(&interface->dev, "Error %d while submitting URB\n", retval); in iowarrior_open()
637 ++dev->opened; in iowarrior_open()
639 file->private_data = dev; in iowarrior_open()
643 mutex_unlock(&dev->mutex); in iowarrior_open()
653 struct iowarrior *dev; in iowarrior_release() local
656 dev = file->private_data; in iowarrior_release()
657 if (dev == NULL) { in iowarrior_release()
661 dev_dbg(&dev->interface->dev, "minor %d\n", dev->minor); in iowarrior_release()
664 mutex_lock(&dev->mutex); in iowarrior_release()
666 if (dev->opened <= 0) { in iowarrior_release()
668 mutex_unlock(&dev->mutex); in iowarrior_release()
670 dev->opened = 0; /* we're closing now */ in iowarrior_release()
672 if (dev->present) { in iowarrior_release()
677 usb_kill_urb(dev->int_in_urb); in iowarrior_release()
678 wake_up_interruptible(&dev->read_wait); in iowarrior_release()
679 wake_up_interruptible(&dev->write_wait); in iowarrior_release()
680 mutex_unlock(&dev->mutex); in iowarrior_release()
683 mutex_unlock(&dev->mutex); in iowarrior_release()
684 iowarrior_delete(dev); in iowarrior_release()
692 struct iowarrior *dev = file->private_data; in iowarrior_poll() local
695 if (!dev->present) in iowarrior_poll()
698 poll_wait(file, &dev->read_wait, wait); in iowarrior_poll()
699 poll_wait(file, &dev->write_wait, wait); in iowarrior_poll()
701 if (!dev->present) in iowarrior_poll()
704 if (read_index(dev) != -1) in iowarrior_poll()
707 if (atomic_read(&dev->write_busy) < MAX_WRITES_IN_FLIGHT) in iowarrior_poll()
732 static char *iowarrior_devnode(struct device *dev, umode_t *mode) in iowarrior_devnode() argument
734 return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev)); in iowarrior_devnode()
761 struct iowarrior *dev = NULL; in iowarrior_probe() local
768 dev = kzalloc(sizeof(struct iowarrior), GFP_KERNEL); in iowarrior_probe()
769 if (dev == NULL) { in iowarrior_probe()
770 dev_err(&interface->dev, "Out of memory\n"); in iowarrior_probe()
774 mutex_init(&dev->mutex); in iowarrior_probe()
776 atomic_set(&dev->intr_idx, 0); in iowarrior_probe()
777 atomic_set(&dev->read_idx, 0); in iowarrior_probe()
778 spin_lock_init(&dev->intr_idx_lock); in iowarrior_probe()
779 atomic_set(&dev->overflow_flag, 0); in iowarrior_probe()
780 init_waitqueue_head(&dev->read_wait); in iowarrior_probe()
781 atomic_set(&dev->write_busy, 0); in iowarrior_probe()
782 init_waitqueue_head(&dev->write_wait); in iowarrior_probe()
784 dev->udev = udev; in iowarrior_probe()
785 dev->interface = interface; in iowarrior_probe()
788 dev->product_id = le16_to_cpu(udev->descriptor.idProduct); in iowarrior_probe()
791 dev_err(&interface->dev, "Invalid number of endpoints\n"); in iowarrior_probe()
801 dev->int_in_endpoint = endpoint; in iowarrior_probe()
804 dev->int_out_endpoint = endpoint; in iowarrior_probe()
807 dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); in iowarrior_probe()
808 if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) && in iowarrior_probe()
809 (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56)) in iowarrior_probe()
811 dev->report_size = 7; in iowarrior_probe()
814 dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); in iowarrior_probe()
815 if (!dev->int_in_urb) { in iowarrior_probe()
816 dev_err(&interface->dev, "Couldn't allocate interrupt_in_urb\n"); in iowarrior_probe()
819 dev->int_in_buffer = kmalloc(dev->report_size, GFP_KERNEL); in iowarrior_probe()
820 if (!dev->int_in_buffer) { in iowarrior_probe()
821 dev_err(&interface->dev, "Couldn't allocate int_in_buffer\n"); in iowarrior_probe()
824 usb_fill_int_urb(dev->int_in_urb, dev->udev, in iowarrior_probe()
825 usb_rcvintpipe(dev->udev, in iowarrior_probe()
826 dev->int_in_endpoint->bEndpointAddress), in iowarrior_probe()
827 dev->int_in_buffer, dev->report_size, in iowarrior_probe()
828 iowarrior_callback, dev, in iowarrior_probe()
829 dev->int_in_endpoint->bInterval); in iowarrior_probe()
831 dev->read_queue = in iowarrior_probe()
832 kmalloc(((dev->report_size + 1) * MAX_INTERRUPT_BUFFER), in iowarrior_probe()
834 if (!dev->read_queue) { in iowarrior_probe()
835 dev_err(&interface->dev, "Couldn't allocate read_queue\n"); in iowarrior_probe()
839 memset(dev->chip_serial, 0x00, sizeof(dev->chip_serial)); in iowarrior_probe()
840 usb_string(udev, udev->descriptor.iSerialNumber, dev->chip_serial, in iowarrior_probe()
841 sizeof(dev->chip_serial)); in iowarrior_probe()
842 if (strlen(dev->chip_serial) != 8) in iowarrior_probe()
843 memset(dev->chip_serial, 0x00, sizeof(dev->chip_serial)); in iowarrior_probe()
846 if (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) { in iowarrior_probe()
853 dev->present = 1; in iowarrior_probe()
856 usb_set_intfdata(interface, dev); in iowarrior_probe()
861 dev_err(&interface->dev, "Not able to get a minor for this device.\n"); in iowarrior_probe()
866 dev->minor = interface->minor; in iowarrior_probe()
869 dev_info(&interface->dev, "IOWarrior product=0x%x, serial=%s interface=%d " in iowarrior_probe()
870 "now attached to iowarrior%d\n", dev->product_id, dev->chip_serial, in iowarrior_probe()
871 iface_desc->desc.bInterfaceNumber, dev->minor - IOWARRIOR_MINOR_BASE); in iowarrior_probe()
875 iowarrior_delete(dev); in iowarrior_probe()
886 struct iowarrior *dev; in iowarrior_disconnect() local
889 dev = usb_get_intfdata(interface); in iowarrior_disconnect()
893 minor = dev->minor; in iowarrior_disconnect()
898 mutex_lock(&dev->mutex); in iowarrior_disconnect()
901 dev->present = 0; in iowarrior_disconnect()
903 mutex_unlock(&dev->mutex); in iowarrior_disconnect()
906 if (dev->opened) { in iowarrior_disconnect()
911 usb_kill_urb(dev->int_in_urb); in iowarrior_disconnect()
912 wake_up_interruptible(&dev->read_wait); in iowarrior_disconnect()
913 wake_up_interruptible(&dev->write_wait); in iowarrior_disconnect()
916 iowarrior_delete(dev); in iowarrior_disconnect()
919 dev_info(&interface->dev, "I/O-Warror #%d now disconnected\n", in iowarrior_disconnect()