/* Called by modules package when removing the driver */ void cleanup_module(void) { int i; char devname[9]; TRACE_FUN(ft_t_flow); if (devfs_unregister_chrdev(QIC117_TAPE_MAJOR, "zft") != 0) { TRACE(ft_t_warn, "failed"); } else { TRACE(ft_t_info, "successful"); } for (i = 0; i < 4; i++) { sprintf(devname, "qft%i", i); devfs_unregister(devfs_find_handle(NULL, devname, QIC117_TAPE_MAJOR, i, DEVFS_SPECIAL_CHR, 0)); sprintf(devname, "nqft%i", i); devfs_unregister(devfs_find_handle(NULL, devname, QIC117_TAPE_MAJOR, i + 4, DEVFS_SPECIAL_CHR, 0)); sprintf(devname, "zqft%i", i); devfs_unregister(devfs_find_handle(NULL, devname, QIC117_TAPE_MAJOR, i + 16, DEVFS_SPECIAL_CHR, 0)); sprintf(devname, "nzqft%i", i); devfs_unregister(devfs_find_handle(NULL, devname, QIC117_TAPE_MAJOR, i + 20, DEVFS_SPECIAL_CHR, 0)); sprintf(devname, "rawqft%i", i); devfs_unregister(devfs_find_handle(NULL, devname, QIC117_TAPE_MAJOR, i + 32, DEVFS_SPECIAL_CHR, 0)); sprintf(devname, "nrawqft%i", i); devfs_unregister(devfs_find_handle(NULL, devname, QIC117_TAPE_MAJOR, i + 36, DEVFS_SPECIAL_CHR, 0)); } zft_uninit_mem(); /* release remaining memory, if any */ printk(KERN_INFO "zftape successfully unloaded.\n"); TRACE_EXIT; }
static int mt_reset(int *dummy) { TRACE_FUN(ft_t_flow); (void)ftape_seek_to_bot(); TRACE_CATCH(ftape_reset_drive(), zft_init_driver(); zft_uninit_mem(); zft_offline = 1); /* fake a re-open of the device. This will set all flage and * allocate buffers as appropriate. The new tape condition will * force the open routine to do anything we need. */ TRACE_CATCH(_zft_open(-1 /* fake reopen */, 0 /* dummy */),); TRACE_EXIT 0; }
/* Called by modules package when removing the driver */ static void zft_exit(void) { int i; TRACE_FUN(ft_t_flow); if (unregister_chrdev(QIC117_TAPE_MAJOR, "zft") != 0) { TRACE(ft_t_warn, "failed"); } else { TRACE(ft_t_info, "successful"); } for (i = 0; i < 4; i++) { class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i)); class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 4)); class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 16)); class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 20)); class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 32)); class_device_destroy(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 36)); } class_destroy(zft_class); zft_uninit_mem(); /* release remaining memory, if any */ printk(KERN_INFO "zftape successfully unloaded.\n"); TRACE_EXIT; }