/** * usb_tranzport_delete */ static void usb_tranzport_delete(struct usb_tranzport *dev) { usb_tranzport_abort_transfers(dev); /* This is just too twisted to be correct */ if(dev->intf != NULL) { device_remove_file(&dev->intf->dev, &dev_attr_LightRecord); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackrec); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackmute); device_remove_file(&dev->intf->dev, &dev_attr_LightTracksolo); device_remove_file(&dev->intf->dev, &dev_attr_LightTrackmute); device_remove_file(&dev->intf->dev, &dev_attr_LightAnysolo); device_remove_file(&dev->intf->dev, &dev_attr_LightLoop); device_remove_file(&dev->intf->dev, &dev_attr_LightPunch); device_remove_file(&dev->intf->dev, &dev_attr_wheel); device_remove_file(&dev->intf->dev, &dev_attr_enable); device_remove_file(&dev->intf->dev, &dev_attr_event); device_remove_file(&dev->intf->dev, &dev_attr_offline); device_remove_file(&dev->intf->dev, &dev_attr_compress_wheel); device_remove_file(&dev->intf->dev, &dev_attr_dump_state); } /* free data structures */ 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); }
/** * usb_tranzport_delete */ static void usb_tranzport_delete(struct usb_tranzport *dev) { usb_tranzport_abort_transfers(dev); if (dev->intf != NULL) { device_remove_file(&dev->intf->dev, &dev_attr_enable); device_remove_file(&dev->intf->dev, &dev_attr_offline); device_remove_file(&dev->intf->dev, &dev_attr_compress_wheel); } /* free data structures */ 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); }
/** * usb_tranzport_release */ static int usb_tranzport_release(struct inode *inode, struct file *file) { struct usb_tranzport *dev; int retval = 0; dev = file->private_data; if (dev == NULL) { retval = -ENODEV; goto exit; } if (mutex_lock_interruptible(&dev->mtx)) { 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 */ mutex_unlock(&dev->mtx); /* unlock here as usb_tranzport_delete frees dev */ usb_tranzport_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_tranzport_abort_transfers(dev); dev->open_count = 0; unlock_exit: mutex_unlock(&dev->mtx); exit: return retval; }