int diag_masks_init(void) { int err = 0; err = diag_msg_mask_init(); if (err) goto fail; err = diag_build_time_mask_init(); if (err) goto fail; err = diag_log_mask_init(); if (err) goto fail; err = diag_event_mask_init(); if (err) goto fail; if (driver->buf_feature_mask_update == NULL) { driver->buf_feature_mask_update = kzalloc(sizeof( struct diag_ctrl_feature_mask) + FEATURE_MASK_LEN, GFP_KERNEL); if (driver->buf_feature_mask_update == NULL) goto fail; kmemleak_not_leak(driver->buf_feature_mask_update); } return 0; fail: pr_err("diag: Could not initialize diag mask buffers\n"); diag_masks_exit(); return -ENOMEM; }
static void 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_masks_exit(); diag_sdio_fn(EXIT); diag_bridge_fn(EXIT); diag_debugfs_cleanup(); 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; driver->dci_state = DIAG_DCI_NO_ERROR; 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->socket_process = NULL; driver->callback_process = NULL; driver->mask_check = 0; mutex_init(&driver->diagchar_mutex); init_waitqueue_head(&driver->wait_q); init_waitqueue_head(&driver->smd_wait_q); 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_lpass_work), diag_read_smd_lpass_work_fn); INIT_WORK(&(driver->diag_read_smd_lpass_cntl_work), diag_read_smd_lpass_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); INIT_WORK(&(driver->diag_read_smd_dci_work), diag_read_smd_dci_work_fn); INIT_WORK(&(driver->diag_clean_modem_reg_work), diag_clean_modem_reg_fn); INIT_WORK(&(driver->diag_clean_lpass_reg_work), diag_clean_lpass_reg_fn); INIT_WORK(&(driver->diag_clean_wcnss_reg_work), diag_clean_wcnss_reg_fn); diag_debugfs_init(); diag_masks_init(); diagfwd_init(); diagfwd_cntl_init(); driver->dci_state = diag_dci_init(); diag_sdio_fn(INIT); diag_bridge_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: diag_debugfs_cleanup(); diagchar_cleanup(); diagfwd_exit(); diagfwd_cntl_exit(); diag_masks_exit(); diag_sdio_fn(EXIT); diag_bridge_fn(EXIT); return -1; }