/** * usb_alphatrack_delete */ static void usb_alphatrack_delete(struct usb_alphatrack *dev) { usb_alphatrack_abort_transfers(dev); usb_free_urb(dev->interrupt_in_urb); usb_free_urb(dev->interrupt_out_urb); kfree(dev->ring_buffer); kfree(dev->interrupt_in_buffer); kfree(dev->interrupt_out_buffer); kfree(dev); /* fixme oldi_buffer */ }
/** * usb_alphatrack_release */ static int usb_alphatrack_release(struct inode *inode, struct file *file) { struct usb_alphatrack *dev; int retval = 0; dev = file->private_data; if (dev == NULL) { retval = -ENODEV; goto exit; } if (down_interruptible(&dev->sem)) { retval = -ERESTARTSYS; goto exit; } if (dev->open_count != 1) { retval = -ENODEV; goto unlock_exit; } if (dev->intf == NULL) { /* the device was unplugged before the file was released */ up(&dev->sem); /* unlock here as usb_alphatrack_delete frees dev */ usb_alphatrack_delete(dev); retval = -ENODEV; goto exit; } /* wait until write transfer is finished */ if (dev->interrupt_out_busy) wait_event_interruptible_timeout(dev->write_wait, !dev->interrupt_out_busy, 2 * HZ); usb_alphatrack_abort_transfers(dev); dev->open_count = 0; unlock_exit: up(&dev->sem); exit: return retval; }
static int usb_alphatrack_release(struct inode *inode, struct file *file) { struct usb_alphatrack *dev; int retval = 0; dev = file->private_data; if (dev == NULL) { retval = -ENODEV; goto exit; } if (down_interruptible(&dev->sem)) { retval = -ERESTARTSYS; goto exit; } if (dev->open_count != 1) { retval = -ENODEV; goto unlock_exit; } if (dev->intf == NULL) { up(&dev->sem); usb_alphatrack_delete(dev); retval = -ENODEV; goto exit; } if (dev->interrupt_out_busy) wait_event_interruptible_timeout(dev->write_wait, !dev->interrupt_out_busy, 2 * HZ); usb_alphatrack_abort_transfers(dev); dev->open_count = 0; unlock_exit: up(&dev->sem); exit: return retval; }