static void __exit diagchar_exit(void) { printk(KERN_INFO "diagchar exiting ..\n"); /* On Driver exit, send special pool type to ensure no memory leaks */ diagmem_exit(driver, POOL_TYPE_ALL); diagfwd_exit(); diagfwd_cntl_exit(); diag_sdio_fn(EXIT); diag_hsic_fn(EXIT); diagchar_cleanup(); printk(KERN_INFO "done diagchar exit\n"); }
static int __init diagchar_init(void) { dev_t dev; int error; pr_debug("diagfwd initializing ..\n"); driver = kzalloc(sizeof(struct diagchar_dev) + 5, GFP_KERNEL); if (driver) { driver->used = 0; timer_in_progress = 0; driver->debug_flag = 1; setup_timer(&drain_timer, drain_timer_func, 1234); driver->itemsize = itemsize; driver->poolsize = poolsize; driver->itemsize_hdlc = itemsize_hdlc; driver->poolsize_hdlc = poolsize_hdlc; driver->itemsize_write_struct = itemsize_write_struct; driver->poolsize_write_struct = poolsize_write_struct; driver->num_clients = max_clients; driver->logging_mode = USB_MODE; driver->mask_check = 0; mutex_init(&driver->diagchar_mutex); init_waitqueue_head(&driver->wait_q); #ifdef CONFIG_HUAWEI_FEATURE_PHUDIAG printk(KERN_INFO "Entering phudiag ..\n"); phudiag_init(); printk(KERN_INFO "diagchar initialized!\n"); #endif INIT_WORK(&(driver->diag_drain_work), diag_drain_work_fn); INIT_WORK(&(driver->diag_read_smd_work), diag_read_smd_work_fn); INIT_WORK(&(driver->diag_read_smd_cntl_work), diag_read_smd_cntl_work_fn); INIT_WORK(&(driver->diag_read_smd_qdsp_work), diag_read_smd_qdsp_work_fn); INIT_WORK(&(driver->diag_read_smd_qdsp_cntl_work), diag_read_smd_qdsp_cntl_work_fn); INIT_WORK(&(driver->diag_read_smd_wcnss_work), diag_read_smd_wcnss_work_fn); INIT_WORK(&(driver->diag_read_smd_wcnss_cntl_work), diag_read_smd_wcnss_cntl_work_fn); diagfwd_init(); diagfwd_cntl_init(); diag_sdio_fn(INIT); diag_hsic_fn(INIT); pr_debug("diagchar initializing ..\n"); driver->num = 1; driver->name = ((void *)driver) + sizeof(struct diagchar_dev); strlcpy(driver->name, "diag", 4); /* Get major number from kernel and initialize */ error = alloc_chrdev_region(&dev, driver->minor_start, driver->num, driver->name); if (!error) { driver->major = MAJOR(dev); driver->minor_start = MINOR(dev); } else { printk(KERN_INFO "Major number not allocated\n"); goto fail; } driver->cdev = cdev_alloc(); error = diagchar_setup_cdev(dev); if (error) goto fail; } else { printk(KERN_INFO "kzalloc failed\n"); goto fail; } pr_info("diagchar initialized now"); return 0; fail: diagchar_cleanup(); diagfwd_exit(); diagfwd_cntl_exit(); diag_sdio_fn(EXIT); diag_hsic_fn(EXIT); return -1; }