static irqreturn_t modemctl_resume_thread(int irq, void *dev_id) { struct modemctl *mc = (struct modemctl *)dev_id; int val = gpio_get_value(mc->gpio_ipc_host_wakeup); int err; dev_dbg(mc->dev, "svn <HOST_WUP:%d\n", val); if (val != HOST_WUP_LEVEL) { if (mc->l2_done) { complete(mc->l2_done); mc->l2_done = NULL; } gpio_set_value(mc->gpio_ipc_slave_wakeup, 0); dev_dbg(mc->dev, "svn >SLAV_WUP:0,%d\n", gpio_get_value(mc->gpio_ipc_slave_wakeup)); mc->debug_cnt = 0; return IRQ_HANDLED; } if (val == HOST_WUP_LEVEL) { err = usbsvn_request_resume(); if (err < 0) dev_err(mc->dev, "request resume failed: %d\n", err); mc->debug_cnt++; } if (mc->debug_cnt > 30) { dev_err(mc->dev, "Abnormal Host wakeup -- over 30times"); disable_irq(irq); mc->debug_cnt = 0; crash_event(SVNET_ERROR_RESET); /*crash_event(SVNET_ERROR_CRASH);*/ /*panic("HSIC Disconnected");*/ msleep(1000); enable_irq(irq); } if (!val && mc->wakeup_flag == HOST_WAKEUP_WAIT_RESET) { mc->wakeup_flag = HOST_WAKEUP_LOW; dev_dbg(mc->dev, "%s: wakeup flag (%d)\n", __func__, mc->wakeup_flag); #ifdef CONFIG_SUPPORT_SIMDETECT /* SIM DETECT - default SIM status */ if (mc->gpio_sim_detect) { mc->sim_prev_states = (gpio_get_value(mc->gpio_sim_detect))? SIM_DETACH : SIM_ATTACH ; dev_dbg(mc->dev, "%s: default SIM Status (%d)\n", __func__, mc->sim_prev_states); } #endif } return IRQ_HANDLED; }
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)); } } }
static irqreturn_t modem_resume_thread(int irq, void *dev_id) { struct modemctl *mc = (struct modemctl *)dev_id; int val = gpio_get_value(mc->gpio_ipc_host_wakeup); int err; dev_err(mc->dev, "CP>>AP: HOST_WUP:%d\n", val); //if(mc_get_ignore_cpirq()) //return IRQ_HANDLED; if (val != HOST_WUP_LEVEL) { //gpio_set_value(mc->gpio_ipc_slave_wakeup, 0); smm6260_set_slave_wakeup(0); mc->debug_cnt = 0; return IRQ_HANDLED; } if (val == HOST_WUP_LEVEL) { if (mc->l2_done) { complete(mc->l2_done); mc->l2_done = NULL; } err = acm_request_resume(); if (err < 0) dev_err(mc->dev, "request resume failed: %d\n", err); mc->debug_cnt++; } if (mc->debug_cnt > 30) { dev_err(mc->dev, "Abnormal Host wakeup -- over 30times"); //disable_irq(irq); mc->debug_cnt = 0; if(mc->boot_done) { //mc->cpcrash_flag = 1; crash_event(MODEM_EVENT_CRASH); } /*crash_event(SVNET_ERROR_CRASH);*/ /*panic("HSIC Disconnected");*/ //msleep(1000); //enable_irq(irq); } if (!val && mc->wakeup_flag == HOST_WAKEUP_WAIT_RESET) { mc->wakeup_flag = HOST_WAKEUP_LOW; dev_err(mc->dev, "%s: wakeup flag (%d)\n", __func__, mc->wakeup_flag); } return IRQ_HANDLED; }
static irqreturn_t modemctl_resume_thread(int irq, void *dev_id) { #if defined(CONFIG_CHN_CMCC_SPI_SPRD) return IRQ_HANDLED; #else struct modemctl *mc = (struct modemctl *)dev_id; int val = gpio_get_value(mc->gpio_ipc_host_wakeup); int err; dev_dbg(mc->dev, "svn <HOST_WUP:%d\n", val); if (val != HOST_WUP_LEVEL) { if (mc->l2_done) { complete(mc->l2_done); mc->l2_done = NULL; } gpio_set_value(mc->gpio_ipc_slave_wakeup, 0); dev_dbg(mc->dev, "svn >SLAV_WUP:0,%d\n", gpio_get_value(mc->gpio_ipc_slave_wakeup)); mc->debug_cnt = 0; return IRQ_HANDLED; } if (val == HOST_WUP_LEVEL) mc->debug_cnt++; if (mc->debug_cnt > 30) { dev_err(mc->dev, "Abnormal Host wakeup -- over 30times"); disable_irq(irq); mc->debug_cnt = 0; crash_event(SVNET_ERROR_RESET); /*crash_event(SVNET_ERROR_CRASH);*/ /*panic("HSIC Disconnected");*/ msleep(1000); enable_irq(irq); } if (!val && mc->wakeup_flag == HOST_WAKEUP_WAIT_RESET) { mc->wakeup_flag = HOST_WAKEUP_LOW; dev_dbg(mc->dev, "%s: wakeup flag (%d)\n", __func__, mc->wakeup_flag); } return IRQ_HANDLED; #endif }
static ssize_t store_control(struct device *d, struct device_attribute *attr, const char *buf, size_t count) { struct modemctl *mc = dev_get_drvdata(d); if (!strncmp(buf, "on", 2)) { modem_on(mc); return count; } if (!strncmp(buf, "off", 3)) { modem_off(mc); return count; } if (!strncmp(buf, "reset", 5)) { modem_reset(mc); return count; } if (!strncmp(buf, "boot", 4)) { //modem_boot(mc); ignore_irq_count = 1; enable_irq(mc->irq[0]); return count; } if (!strncmp(buf, "daolpu", 6)) { kernel_upload(mc); return count; } if (!strncmp(buf, "silent", 6)) { printk(KERN_ERR "%s -LTE Silent Reset!!!\n", __func__); crash_event(1); return count; } return count; }
static void usbsvn_try_reconnect_work(struct work_struct *work) { struct usbsvn *svn = container_of(work, struct usbsvn, try_reconnect_work.work); /* char *envs[2] = {"MAILBOX=hsic_disconnected", NULL };*/ if (svn->usbsvn_connected) { wake_unlock_pm(svn); printk(KERN_INFO "svn re-connected\n"); goto out; } if (svn->dpm_suspending) { wake_lock_pm(svn); printk(KERN_INFO "svn suspending, delay reconnection\n"); goto retry; } if (!svn->reconnect_cnt--) { wake_unlock_pm(svn); #ifdef CONFIG_SAMSUNG_PHONE_SVNET /*if (!mc_is_modem_active()) { kobject_uevent_env(&svn->netdev->dev.kobj, KOBJ_OFFLINE, envs); */ /*panic("HSIC Disconnected");*/ crash_event(0); /*}*/ #endif goto out; } #ifdef CONFIG_SAMSUNG_PHONE_SVNET mc_reconnect_gpio(); #endif /*TODO: EHCI off reconnect*/ retry: schedule_delayed_work(&svn->try_reconnect_work, 200); out: return; }
static int usbsvn_initiated_resume(struct net_device *ndev) { int err; if (share_svn->usbdev) { struct device *dev = &share_svn->usbdev->dev; int spin = 10, spin2 = 30; int host_wakeup_done = 0; int _host_high_cnt = 0, _host_timeout_cnt = 0; retry: switch (dev->power.runtime_status) { case RPM_SUSPENDED: if (share_svn->dpm_suspending || host_wakeup_done) { dev_dbg(&ndev->dev, "DPM Suspending, spin:%d\n", spin2); if (spin2-- == 0) { dev_err(&ndev->dev, "dpm resume timeout\n"); return -ETIMEDOUT; } msleep(30); goto retry; } #ifdef CONFIG_SAMSUNG_PHONE_SVNET err = mc_prepare_resume(200); switch (err) { case MC_SUCCESS: host_wakeup_done = 1; _host_timeout_cnt = 0; _host_high_cnt = 0; goto retry; /*wait until RPM_ACTIVE states*/ case MC_HOST_TIMEOUT: _host_timeout_cnt++; break; case MC_HOST_HIGH: _host_high_cnt++; break; } #endif if (spin2-- == 0) { dev_err(&ndev->dev, "svn initiated resume, RPM_SUSPEND timeout\n"); /* share_svn->resume_debug = 1; err = pm_runtime_resume(dev); if (!err && dev->power.timer_expires == 0 && dev->power.request_pending == false) { printk(KERN_DEBUG "%s:run time idle\n", __func__); pm_runtime_idle(dev); } share_svn->resume_debug = 0;*/ #ifdef CONFIG_SAMSUNG_PHONE_SVNET crash_event(0); #endif return -ETIMEDOUT; } msleep(20); goto retry; case RPM_SUSPENDING: dev_dbg(&ndev->dev, "RPM Suspending, spin:%d\n", spin); if (spin-- == 0) { dev_err(&ndev->dev, "Modem suspending timeout\n"); return -ETIMEDOUT; } msleep(100); goto retry; case RPM_RESUMING: dev_dbg(&ndev->dev, "RPM Resuming, spin:%d\n", spin2); if (spin2-- == 0) { dev_err(&ndev->dev, "Modem resume timeout\n"); return -ETIMEDOUT; } msleep(50); goto retry; case RPM_ACTIVE: break; default: return -EIO; } } return 0; }