static void mdm_reconnect_fn(struct work_struct *work) { pr_info("mdm: check 2nd enumeration\n"); if (mdm_check_main_connect(rmnet_pm_dev)) return; mdm_silent_reset(); }
long mdm_modem_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { int status, ret = 0; if (_IOC_TYPE(cmd) != CHARM_CODE) { pr_err("%s: invalid ioctl code\n", __func__); return -EINVAL; } pr_debug("%s: Entering ioctl cmd = %d\n", __func__, _IOC_NR(cmd)); switch (cmd) { case WAKE_CHARM: pr_info("%s: Powering on mdm\n", __func__); #ifdef CONFIG_MDM_HSIC_PM request_boot_lock_set(rmnet_pm_dev); #endif mdm_drv->ops->power_on_mdm_cb(mdm_drv); break; case CHECK_FOR_BOOT: if (gpio_get_value(mdm_drv->mdm2ap_status_gpio) == 0) put_user(1, (unsigned long __user *) arg); else put_user(0, (unsigned long __user *) arg); break; case NORMAL_BOOT_DONE: pr_info("%s: check if mdm is booted up\n", __func__); get_user(status, (unsigned long __user *) arg); if (status) { pr_debug("%s: normal boot failed\n", __func__); mdm_drv->mdm_boot_status = -EIO; } else { pr_info("%s: normal boot done\n", __func__); mdm_drv->mdm_boot_status = 0; } mdm_drv->mdm_ready = 1; if (mdm_drv->ops->normal_boot_done_cb != NULL) mdm_drv->ops->normal_boot_done_cb(mdm_drv); if (!first_boot) complete(&mdm_boot); else first_boot = 0; /* If bootup succeeded, start a timer to check that the * mdm2ap_status gpio goes high. */ if (!status && gpio_get_value(mdm_drv->mdm2ap_status_gpio) == 0) schedule_delayed_work(&mdm2ap_status_check_work, msecs_to_jiffies(MDM2AP_STATUS_TIMEOUT_MS)); break; case RAM_DUMP_DONE: pr_info("%s: mdm done collecting RAM dumps\n", __func__); get_user(status, (unsigned long __user *) arg); if (status) mdm_drv->mdm_ram_dump_status = -EIO; else { pr_info("%s: ramdump collection completed\n", __func__); mdm_drv->mdm_ram_dump_status = 0; panic("CP Crash %s", mdm_read_err_report()); } complete(&mdm_ram_dumps); break; case WAIT_FOR_ERROR: pr_debug("%s: wait for mdm error\n", __func__); #if 0 ret = wait_for_completion_interruptible(&mdm_error); INIT_COMPLETION(mdm_error); #endif break; case WAIT_FOR_RESTART: pr_info("%s: wait for mdm to need images reloaded\n", __func__); ret = wait_for_completion_interruptible(&mdm_needs_reload); if (!ret) put_user(mdm_drv->boot_type, (unsigned long __user *) arg); INIT_COMPLETION(mdm_needs_reload); break; case SILENT_RESET_CONTROL: pr_info("%s: mdm doing silent reset\n", __func__); mdm_drv->mdm_ram_dump_status = 0; complete(&mdm_ram_dumps); break; case AUTOPM_LOCK: get_user(status, (unsigned long __user *) arg); pr_info("%s: mdm autopm request[%s]\n", __func__, status ? "lock" : "release"); request_autopm_lock(status); break; case GET_BOOT_PROTOCOL: pr_info("%s: mdm get boot protocol %d\n", __func__, mdm_drv->proto_is_dload); return mdm_drv->proto_is_dload; case GET_FORCE_RAMDUMP: get_user(status, (unsigned long __user *) arg); pr_info("%s: mdm get dump mode = %d\n", __func__, force_dump); if (status) mdm_force_fatal(); else mdm_silent_reset(); break; #ifdef CONFIG_SIM_DETECT case GET_SIM_DETECT: pr_info("%s: mdm get sim detect = %d\n", __func__, mdm_drv->sim_state); return mdm_drv->sim_state; #endif default: pr_err("%s: invalid ioctl cmd = %d\n", __func__, _IOC_NR(cmd)); ret = -EINVAL; break; } return ret; }