/* * mc_work - PHONE_ACTIVE irq * After * CP Crash : PHONE_ACTIVE(L) + CP_DUMP_INT(H) (0xC9) * CP Reset : PHONE_ACTIVE(L) + CP_DUMP_INT(L) (0xC7) * Before * CP Crash : PHONE_ACTIVE(L) + SUSPEND_REQUEST(H) (0xC9) * CP Reset : PHONE_ACTIVE(L) + SUSPEND_REQUEST(L) (0xC7) */ static void mc_work(struct work_struct *work_arg) { #if 0 //it will be removed! struct modemctl *mc = container_of(work_arg, struct modemctl, work.work); int error; int susp_req; char *envs[2] = { NULL, NULL }; error = modem_get_active(mc); if (error < 0) { dev_err(mc->dev, "Not initialized\n"); return; } susp_req = gpio_get_value(mc->gpio_suspend_request); dev_dbg(mc->dev, "PHONE ACTIVE: %d SUSPEND_REQUEST: %d\n", error, susp_req); envs[0] = susp_req ? "MAILBOX=cp_exit" : "MAILBOX=cp_reset"; if (error && gpio_get_value(global_mc->gpio_phone_on)) { mc->cpcrash_flag = 0; kobject_uevent(&mc->dev->kobj, KOBJ_ONLINE); } else { msleep(300); if (!modem_get_active(mc)) { mc->cpcrash_flag = 1; kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs); } } #else struct modemctl *mc = container_of(work_arg, struct modemctl, work.work); int error; char *envs[2] = { NULL, NULL }; error = modem_get_active(mc); if (error < 0) { dev_err(mc->dev, "Not initialized\n"); return; } dev_dbg(mc->dev, "PHONE ACTIVE: %d \n", error); envs[0] = error ? "MAILBOX=dump_end" : "MAILBOX=dump_start"; msleep(300); mc->cpcrash_flag = 1; //kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs); kobject_uevent(&mc->dev->kobj, KOBJ_OFFLINE); if(error) printk(KERN_ERR"[%s]%d, lte crash!dump end !!!\n",__func__,__LINE__); else printk(KERN_ERR"[%s]%d, lte crash!dump start !!!\n",__func__,__LINE__); #endif }
static void mc_work(struct work_struct *work_arg) { struct modemctl *mc = container_of(work_arg, struct modemctl, work.work); int error; int cpdump_int; char *envs[2] = { NULL, NULL }; if (!sprd_boot_complete) return; error = modem_get_active(mc); if (error < 0) { dev_err(mc->dev, "Not initialized\n"); return; } cpdump_int = gpio_get_value(mc->gpio_cp_dump_int); dev_info(mc->dev, "PHONE ACTIVE: %d CP_DUMP_INT: %d\n", error, cpdump_int); if ((!error) && cpdump_int) { dev_err(mc->dev, "CP abnormal dead\n"); dev_err(mc->dev, "(%d) send uevent to RIL [cpdump_int:%d]\n", __LINE__, cpdump_int); envs[0] = "MAILBOX=cp_reset"; kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs); sprd_boot_complete = 0; return; } envs[0] = cpdump_int ? "MAILBOX=cp_exit" : "MAILBOX=cp_reset"; if (error && gpio_get_value(global_mc->gpio_phone_on)) { mc->cpcrash_flag = 0; mc->boot_done = 1; kobject_uevent(&mc->dev->kobj, KOBJ_ONLINE); wake_unlock(&mc->reset_lock); } else if (mc->boot_done) { if (modem_get_active(mc)) { wake_unlock(&mc->reset_lock); return; } if (mc->cpcrash_flag > 3) { dev_err(mc->dev, "(%d) send uevent to RIL [cpdump_int:%d]\n", __LINE__, cpdump_int); kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs); } else { mc->cpcrash_flag++; schedule_delayed_work(&mc->work, msecs_to_jiffies(50)); } } if (cpdump_int) { dev_err(mc->dev, "(%d) send uevent to RIL [cpdump_int:%d]\n", __LINE__, cpdump_int); kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs); } }
/* * mc_work - PHONE_ACTIVE irq * After * CP Crash : PHONE_ACTIVE(L) + CP_DUMP_INT(H) (0xC9) * CP Reset : PHONE_ACTIVE(L) + CP_DUMP_INT(L) (0xC7) * Before * CP Crash : PHONE_ACTIVE(L) + SUSPEND_REQUEST(H) (0xC9) * CP Reset : PHONE_ACTIVE(L) + SUSPEND_REQUEST(L) (0xC7) */ static void mc_work(struct work_struct *work_arg) { struct modemctl *mc = container_of(work_arg, struct modemctl, work.work); int error; int cpdump_int; char *envs[2] = { NULL, NULL }; error = modem_get_active(mc); if (error < 0) { dev_err(mc->dev, "Not initialized\n"); return; } // cpdump_int = gpio_get_value(mc->gpio_cp_dump_int); // dev_dbg(mc->dev, "PHONE ACTIVE: %d CP_DUMP_INT: %d\n", // error, cpdump_int); dev_dbg(mc->dev, "PHONE ACTIVE: %d \n", error); // envs[0] = cpdump_int ? "MAILBOX=cp_exit" : "MAILBOX=cp_reset"; envs[0] = "MAILBOX=cp_exit"; if (error /*&& gpio_get_value(global_mc->gpio_phone_on)*/) { mc->cpcrash_flag = 0; mc->boot_done = 1; kobject_uevent(&mc->dev->kobj, KOBJ_ONLINE); wake_unlock(&mc->reset_lock); } else if (mc->boot_done) { dev_dbg(mc->dev, "mc->cpcrash_flag: %d \n", mc->cpcrash_flag); if (modem_get_active(mc)) { wake_unlock(&mc->reset_lock); return; } if (mc->cpcrash_flag > 3) { dev_dbg(mc->dev, "send uevnet to RIL [cpdump_int:%d]\n", cpdump_int); mc->boot_done = 0; kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs); } else { mc->cpcrash_flag++; schedule_delayed_work(&mc->work, msecs_to_jiffies(50)); } } }
static ssize_t show_status(struct device *d, struct device_attribute *attr, char *buf) { char *p = buf; struct modemctl *mc = dev_get_drvdata(d); p += sprintf(p, "%d\n", modem_get_active(mc)); return p - buf; }
static void mc_work(struct work_struct *work_arg) { struct modemctl *mc = container_of(work_arg, struct modemctl, work.work); int error; int cpdump_int; char *envs[2] = { NULL, NULL }; error = modem_get_active(mc); if (error < 0) { dev_err(mc->dev, "Not initialized\n"); return; } cpdump_int = gpio_get_value(mc->gpio_cp_reset_int); dev_info(mc->dev, "PHONE ACTIVE: %d CP_DUMP_INT: %d\n", error, cpdump_int); envs[0] = cpdump_int ? "MAILBOX=cp_exit" : "MAILBOX=cp_reset"; if (error && gpio_get_value(global_mc->gpio_phone_on)) { mc->cpcrash_flag = 0; mc->boot_done = 1; crash_event(MODEM_EVENT_CONNECT); wake_unlock(&mc->reset_lock); } else if (mc->boot_done) { if (modem_get_active(mc)) { wake_unlock(&mc->reset_lock); return; } if (mc->cpcrash_flag > 3) { dev_info(mc->dev, "send uevnet to RIL [cpdump_int:%d]\n", cpdump_int); crash_event(MODEM_EVENT_CRASH); } else { mc->cpcrash_flag++; schedule_delayed_work(&mc->work, msecs_to_jiffies(50)); } } }