static void modem_sw_fatal_fn(struct work_struct *work) { uint32_t panic_smsm_states = SMSM_RESET | SMSM_SYSTEM_DOWNLOAD; uint32_t reset_smsm_states = SMSM_SYSTEM_REBOOT_USR | SMSM_SYSTEM_PWRDWN_USR; uint32_t modem_state; pr_err("Watchdog bite received from modem SW!\n"); modem_state = smsm_get_state(SMSM_MODEM_STATE); if (modem_state & panic_smsm_states) { pr_err("Modem SMSM state changed to SMSM_RESET.\n" "Probable err_fatal on the modem. " "Calling subsystem restart...\n"); subsystem_restart("modem"); } else if (modem_state & reset_smsm_states) { pr_err("%s: User-invoked system reset/powerdown. " "Resetting the SoC now.\n", __func__); kernel_restart(NULL); } else { /* TODO: Bus unlock code/sequence goes _here_ */ subsystem_restart("modem"); } }
static void riva_fatal_fn(struct work_struct *work) { if (!enable_riva_ssr) panic(MODULE_NAME ": Watchdog bite received from Riva"); else subsystem_restart("riva"); }
static void mdm_fatal_fn(struct work_struct *work) { int i; int value = gpio_get_value(mdm_drv->mdm2ap_errfatal_gpio); if (value == 1) { for (i = HTC_MDM_ERROR_CONFIRM_TIME_MS; i > 0; i--) { msleep(1); if (gpio_get_value(mdm_drv->mdm2ap_errfatal_gpio) == 0) { pr_info("%s: mdm fatal high %d(ms) confirm failed... Abort!\n", __func__, HTC_MDM_ERROR_CONFIRM_TIME_MS); return; } } } else if (value == 0) { pr_info("%s: mdm fatal high is a false alarm!\n", __func__); return; } mdm_crash_dump_dbg_info(); pr_info("%s: Reseting the mdm due to an errfatal\n", __func__); subsystem_restart(EXTERNAL_MODEM); }
static void riva_smsm_cb_fn(struct work_struct *work) { if (!enable_riva_ssr) panic(MODULE_NAME ": SMSM reset request received from Riva"); else subsystem_restart("riva"); }
static int modem_debug_set(void *data, u64 val) { if (val == 1) subsystem_restart("modem"); return 0; }
static void delayed_subsystem_restart_work_fn(struct work_struct *work) { if (!machine_is_m7_evm()) /* SSR is not supported on EVM board */ subsystem_restart(EXTERNAL_MODEM); else pr_err("SSR is not supported on EVM board. Skip it.\n"); }
static void mdm_fatal_fn(struct work_struct *work) { int i; int value = gpio_get_value(mdm_drv->mdm2ap_errfatal_gpio); if (value == 1) { for (i = HTC_MDM_ERROR_CONFIRM_TIME_MS; i > 0; i--) { msleep(1); if (gpio_get_value(mdm_drv->mdm2ap_errfatal_gpio) == 0) { pr_info("%s: mdm fatal high %d(ms) confirm failed... Abort!\n", __func__, HTC_MDM_ERROR_CONFIRM_TIME_MS); return; } } } else if (value == 0) { pr_info("%s: mdm fatal high is a false alarm!\n", __func__); return; } dump_mdm_related_gpio(); pr_info("### Show Blocked State in ###\n"); show_state_filter(TASK_UNINTERRUPTIBLE); if (get_restart_level() == RESET_SOC) msm_rtb_disable(); if (get_restart_level() == RESET_SOC) set_mdm2ap_errfatal_restart_flag(1); pr_info("%s: Reseting the mdm due to an errfatal\n", __func__); subsystem_restart(EXTERNAL_MODEM); }
static void modem_fw_fatal_fn(struct work_struct *work) { pr_err("Watchdog bite received from modem FW!\n"); #ifdef FEATURE_PANTECH_WLAN_QCOM_PATCH //lee.eunsuk 20120423, SSR panic(MODULE_NAME "Modem crashed."); #else subsystem_restart("modem"); #endif }
/* simply declare this function as extern at test point, and call it */ void mdm_force_fatal(void) { pr_info("%s: Reseting the mdm due to AP request\n", __func__); force_dump = 1; notify_modem_fatal(); subsystem_restart(EXTERNAL_MODEM); }
static void mdm_status_fn(struct work_struct *work) { int i; int value = gpio_get_value(mdm_drv->mdm2ap_status_gpio); if (!mdm_drv->mdm_ready) return; if (value == 0) { for (i = HTC_MDM_ERROR_CONFIRM_TIME_MS; i > 0; i--) { msleep(1); if (gpio_get_value(mdm_drv->mdm2ap_status_gpio) == 1) { pr_info("%s: mdm status low %d(ms) confirm failed... Abort!\n", __func__, HTC_MDM_ERROR_CONFIRM_TIME_MS); return; } } } if ( ( get_radio_flag() & RADIO_FLAG_USB_UPLOAD ) ) { if ( value == 0 ) { int val_gpio = 0; msleep(40); val_gpio = gpio_get_value(mdm_drv->mdm2ap_hsic_ready_gpio); pr_info("%s:mdm2ap_hsic_ready_gpio=[%d]\n", __func__, val_gpio); } } mdm_status_change_notified = true; mdm_drv->ops->status_cb(mdm_drv, value); pr_debug("%s: status:%d\n", __func__, value); if (value == 0) { pr_info("%s: unexpected reset external modem\n", __func__); dump_mdm_related_gpio(); pr_info("### Show Blocked State in ###\n"); show_state_filter(TASK_UNINTERRUPTIBLE); if (get_restart_level() == RESET_SOC) msm_rtb_disable(); if (get_restart_level() == RESET_SOC) set_mdm2ap_errfatal_restart_flag(1); subsystem_restart(EXTERNAL_MODEM); } else if (value == 1) { pr_info("%s: status = 1: mdm is now ready\n", __func__); } }
static void smsm_state_cb_hdlr(void *data, uint32_t old_state, uint32_t new_state) { char *smem_reset_reason; char buffer[MAX_BUF_SIZE]; unsigned smem_reset_size; unsigned size; riva_crash = true; pr_err("%s: smsm state changed\n", MODULE_NAME); if (get_kernel_flag() & KERNEL_FLAG_ENABLE_SSR_WCNSS) { smsm_change_state_ssr(SMSM_APPS_STATE, SMSM_RESET, 0, KERNEL_FLAG_ENABLE_SSR_WCNSS); } if (!(new_state & SMSM_RESET)) return; if (ss_restart_inprogress) { pr_err("%s: Ignoring smsm reset req, restart in progress\n", MODULE_NAME); return; } if (!enable_riva_ssr) { ssr_set_restart_reason( "riva fatal: SMSM reset request received from Riva"); panic(MODULE_NAME ": SMSM reset request received from Riva"); } smem_reset_reason = smem_get_entry(SMEM_SSR_REASON_WCNSS0, &smem_reset_size); if (!smem_reset_reason || !smem_reset_size) { pr_err("%s: wcnss subsystem failure reason: %s\n", __func__, "(unknown, smem_get_entry failed)"); } else if (!smem_reset_reason[0]) { pr_err("%s: wcnss subsystem failure reason: %s\n", __func__, "(unknown, init string found)"); } else { size = smem_reset_size < MAX_BUF_SIZE ? smem_reset_size : (MAX_BUF_SIZE - 1); memcpy(buffer, smem_reset_reason, size); buffer[size] = '\0'; pr_err("%s: wcnss subsystem failure reason: %s\n", __func__, buffer); memset(smem_reset_reason, 0, smem_reset_size); wmb(); } ss_restart_inprogress = true; subsystem_restart("riva"); }
static irqreturn_t mdm_errfatal(int irq, void *dev_id) { pr_debug("%s: mdm got errfatal interrupt\n", __func__); if (mdm_drv->mdm_ready && (gpio_get_value(mdm_drv->mdm2ap_status_gpio) == 1)) { pr_info("%s: Reseting the mdm due to an errfatal\n", __func__); mdm_drv->mdm_ready = 0; subsystem_restart(EXTERNAL_MODEM); } return IRQ_HANDLED; }
static void smsm_state_cb(void *data, uint32_t old_state, uint32_t new_state) { /* Ignore if we're the one that set SMSM_RESET */ if (crash_shutdown) return; if (new_state & SMSM_RESET) { pr_err("Probable fatal error on the modem.\n"); log_modem_sfr(); subsystem_restart("modem"); } }
static void dsps_restart_handler(void) { pr_debug("%s: Restart lvl %d\n", __func__, get_restart_level()); if (atomic_add_return(1, &drv->crash_in_progress) > 1) { pr_err("%s: DSPS already resetting. Count %d\n", __func__, atomic_read(&drv->crash_in_progress)); } else { subsystem_restart("dsps"); } }
static void modem_unlock_timeout(struct work_struct *work) { pr_crit("%s: Timeout waiting for modem to unlock.\n", MODULE_NAME); /* Set MSS_MODEM_RESET to 0x0 since the unlock didn't work */ if ( hwio_modem_reset_addr ) writel_relaxed(0x0, hwio_modem_reset_addr); /* Write needs to go through before the modem is restarted. */ mb(); subsystem_restart("modem"); }
static void smsm_state_cb_hdlr(void *data, uint32_t old_state, uint32_t new_state) { char *smem_reset_reason; char buffer[MAX_BUF_SIZE]; unsigned smem_reset_size; unsigned size; riva_crash = true; pr_err("%s: smsm state changed\n", MODULE_NAME); if (!(new_state & SMSM_RESET)) return; if (ss_restart_inprogress) { pr_err("%s: Ignoring smsm reset req, restart in progress\n", MODULE_NAME); return; } pr_info(MODULE_NAME ": smsm_state_cb_hdlr, enable_riva_ssr=%d.\n", enable_riva_ssr); //ASUS_BSP+++ "for /data/log/ASUSEvtlog" ASUSEvtlog("[wcnss]: smsm_state_cb_hdlr, enable_riva_ssr=%d.\n", enable_riva_ssr); //ASUS_BSP--- "for /data/log/ASUSEvtlog" if (!enable_riva_ssr) panic(MODULE_NAME ": SMSM reset request received from Riva"); smem_reset_reason = smem_get_entry(SMEM_SSR_REASON_WCNSS0, &smem_reset_size); if (!smem_reset_reason || !smem_reset_size) { pr_err("%s: wcnss subsystem failure reason: %s\n", __func__, "(unknown, smem_get_entry failed)"); } else if (!smem_reset_reason[0]) { pr_err("%s: wcnss subsystem failure reason: %s\n", __func__, "(unknown, init string found)"); } else { size = smem_reset_size < MAX_BUF_SIZE ? smem_reset_size : (MAX_BUF_SIZE - 1); memcpy(buffer, smem_reset_reason, size); buffer[size] = '\0'; pr_err("%s: wcnss subsystem failure reason: %s\n", __func__, buffer); memset(smem_reset_reason, 0, smem_reset_size); wmb(); } ss_restart_inprogress = true; subsystem_restart("riva"); }
static int set_subsystem(const char *buf, struct kernel_param *kp) { if(!strncmp(buf, "modem",strlen(buf)-1)) { subsystem_restart("modem"); } else if(!strncmp(buf, "lpass",strlen(buf)-1)) { subsystem_restart("lpass"); } else if(!strncmp(buf, "dsps",strlen(buf)-1)) { subsystem_restart("dsps"); } else if(!strncmp(buf, "wcnss",strlen(buf)-1)) { subsystem_restart("wcnss"); } else if(!strncmp(buf, "adsp",strlen(buf)-1)) { subsystem_restart("adsp"); } else if(!strncmp(buf, "venus",strlen(buf)-1)) { subsystem_restart("venus"); } else printk("Unknown subsystem!Please check!"); return 0; }
static void mdm2ap_status_check(struct work_struct *work) { /* * If the mdm modem did not pull the MDM2AP_STATUS gpio * high then call subsystem_restart. */ if (gpio_get_value(mdm_drv->mdm2ap_status_gpio) == 0) { pr_err("%s: MDM2AP_STATUS gpio did not go high\n", __func__); mdm_drv->mdm_ready = 0; subsystem_restart(EXTERNAL_MODEM); } }
static void smsm_state_cb(void *data, uint32_t old_state, uint32_t new_state) { /* Ignore if we're the one that set SMSM_RESET */ if (crash_shutdown) return; if (new_state & SMSM_RESET) { pr_err("Modem SMSM state changed to SMSM_RESET.\n" "Probable err_fatal on the modem. " "Calling subsystem restart...\n"); subsystem_restart("modem"); } }
/* simply declare this function as extern at test point, and call it */ void mdm_force_fatal(void) { pr_info("%s: Reseting the mdm due to AP request\n", __func__); force_dump = 1; if (in_irq()) queue_work(mdm_queue, &mdm_fatal_work); else { notify_modem_fatal(); subsystem_restart(EXTERNAL_MODEM); } }
static irqreturn_t mdm_errfatal(int irq, void *dev_id) { pr_debug("%s: mdm got errfatal interrupt\n", __func__); if (mdm_drv->mdm_ready && (gpio_get_value(mdm_drv->mdm2ap_status_gpio) == 1)) { pr_info("%s: Reseting the mdm due to an errfatal\n", __func__); mdm_drv->mdm_ready = 0; #ifdef CONFIG_LGE_EMS_CH ems_mdm_crash_fatal_flag = true; #endif subsystem_restart(EXTERNAL_MODEM); } return IRQ_HANDLED; }
static void modem_sw_fatal_fn(struct work_struct *work) { uint32_t panic_smsm_states = SMSM_RESET | SMSM_SYSTEM_DOWNLOAD; uint32_t reset_smsm_states = SMSM_SYSTEM_REBOOT_USR | SMSM_SYSTEM_PWRDWN_USR; uint32_t modem_state; pr_err("Watchdog bite received from modem SW!\n"); modem_state = smsm_get_state(SMSM_MODEM_STATE); if (modem_state & panic_smsm_states) { pr_err("Modem SMSM state changed to SMSM_RESET.\n" "Probable err_fatal on the modem. " "Calling subsystem restart...\n"); #ifdef FEATURE_PANTECH_WLAN_QCOM_PATCH //lee.eunsuk 20120423, SSR panic(MODULE_NAME "Modem crashed."); #else subsystem_restart("modem"); #endif } else if (modem_state & reset_smsm_states) { pr_err("%s: User-invoked system reset/powerdown. " "Resetting the SoC now.\n", __func__); kernel_restart(NULL); } else { /* TODO: Bus unlock code/sequence goes _here_ */ #ifdef FEATURE_PANTECH_WLAN_QCOM_PATCH //lee.eunsuk 20120423, SSR panic(MODULE_NAME "Modem crashed."); #else subsystem_restart("modem"); #endif } }
wpt_status wpalRivaSubystemRestart(void) { if (vos_is_load_unload_in_progress(VOS_MODULE_ID_WDI, NULL)) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_FATAL, "%s: loading/unloading in progress," " SSR will be done at the end of unload", __func__); return eWLAN_PAL_STATUS_E_FAILURE; } if (0 == subsystem_restart("wcnss")) { return eWLAN_PAL_STATUS_SUCCESS; } return eWLAN_PAL_STATUS_E_FAILURE; }
static void modem_unlock_timeout(struct work_struct *work) { void __iomem *hwio_modem_reset_addr = ioremap_nocache(MODEM_HWIO_MSS_RESET_ADDR, 8); pr_crit("%s: Timeout waiting for modem to unlock.\n", MODULE_NAME); /* Set MSS_MODEM_RESET to 0x0 since the unlock didn't work */ writel_relaxed(0x0, hwio_modem_reset_addr); /* Write needs to go through before the modem is restarted. */ mb(); iounmap(hwio_modem_reset_addr); subsystem_restart("modem"); enable_irq(MARM_WDOG_EXPIRED); }
static void mdm_status_fn(struct work_struct *work) { int i; int value = gpio_get_value(mdm_drv->mdm2ap_status_gpio); if (!mdm_drv->mdm_ready) return; if (value == 0) { for (i = HTC_MDM_ERROR_CONFIRM_TIME_MS; i > 0; i--) { msleep(1); if (gpio_get_value(mdm_drv->mdm2ap_status_gpio) == 1) { pr_info("%s: mdm status low %d(ms) confirm failed... Abort!\n", __func__, HTC_MDM_ERROR_CONFIRM_TIME_MS); return; } } } if ( ( get_radio_flag() & RADIO_FLAG_USB_UPLOAD ) ) { if ( value == 0 ) { int val_gpio = 0; msleep(40); val_gpio = gpio_get_value(mdm_drv->mdm2ap_hsic_ready_gpio); pr_info("%s:mdm2ap_hsic_ready_gpio=[%d]\n", __func__, val_gpio); } } mdm_status_change_notified = true; mdm_drv->ops->status_cb(mdm_drv, value); pr_debug("%s: status:%d\n", __func__, value); if (value == 0) { pr_info("%s: unexpected reset external modem\n", __func__); mdm_crash_dump_dbg_info(); subsystem_restart(EXTERNAL_MODEM); } else if (value == 1) { pr_info("%s: status = 1: mdm is now ready\n", __func__); } }
static void mdm_fatal_fn(struct work_struct *work) { //HTC_Kris+++ unsigned long flags; extern bool is_mdm_hsic_phy_suspended; extern bool is_mdm_hsic_wakeup_in_progress; extern void mdm_hsic_disable_auto_suspend(void); int i; //HTC_Kris--- pr_info("%s: Reseting the mdm due to an errfatal\n", __func__); //HTC_Kris+++ pr_info("%s: mdm_hsic_disable_auto_suspend+\n", __func__); mdm_hsic_disable_auto_suspend(); pr_info("%s: mdm_hsic_disable_auto_suspend-\n", __func__); //HTC_Kris--- /* HTC added start */ dump_mdm_related_gpio(); //++SSD_RIL:20120724:delay 3 secs before call subsystem restart if ( get_radio_flag() & 0x0008 ) { mdelay(3000); } //--SSD_RIL /* HTC added end */ //HTC_Kris+++ //Before do radio restart, make sure mdm_hsic_phy is not suspended, otherwise, PORTSC will be kept at 1800 if (is_mdm_hsic_phy_suspended) { pr_info("%s(%d): is_mdm_hsic_phy_suspended:%d\n", __func__, __LINE__, is_mdm_hsic_phy_suspended); pr_info("%s(%d): wakeup hsic\n", __func__, __LINE__); spin_lock_irqsave(&mdm_hsic_wakeup_lock, flags); mdm_hsic_wakeup(); spin_unlock_irqrestore(&mdm_hsic_wakeup_lock, flags); //wait until mdm_hsic_phy is not suspended, at most 10 seconds for (i = 0; i < 100; i++) { msleep_interruptible(1000); if (!is_mdm_hsic_phy_suspended && !is_mdm_hsic_wakeup_in_progress) break; } pr_info("%s(%d): is_mdm_hsic_phy_suspended:%d\n", __func__, __LINE__, is_mdm_hsic_phy_suspended); } //HTC_Kris--- subsystem_restart(EXTERNAL_MODEM); }
static void modem_fatal_fn(struct work_struct *work) { uint32_t modem_state; uint32_t panic_smsm_states = SMSM_RESET | SMSM_SYSTEM_DOWNLOAD; uint32_t reset_smsm_states = SMSM_SYSTEM_REBOOT_USR | SMSM_SYSTEM_PWRDWN_USR; pr_err("%s: Watchdog bite received from modem!\n", MODULE_NAME); modem_state = smsm_get_state(SMSM_MODEM_STATE); pr_err("%s: Modem SMSM state = 0x%x!", MODULE_NAME, modem_state); if (modem_state == 0 || modem_state & panic_smsm_states) { subsystem_restart("modem"); enable_irq(MARM_WDOG_EXPIRED); } else if (modem_state & reset_smsm_states) { pr_err("%s: User-invoked system reset/powerdown.", MODULE_NAME); soc_restart(RESTART_MODE_MODEM_WATCHDOG_BITE, "MODEM DOG!"); } else { int ret; void *hwio_modem_reset_addr = ioremap_nocache(MODEM_HWIO_MSS_RESET_ADDR, 8); pr_err("%s: Modem AHB locked up.\n", MODULE_NAME); pr_err("%s: Trying to free up modem!\n", MODULE_NAME); /* We don't want it happens */ BUG_ON(!hwio_modem_reset_addr); writel(0x3, hwio_modem_reset_addr); /* If we are still alive after 6 seconds (allowing for * the 5-second-delayed-panic-reboot), modem is either * still wedged or SMSM didn't come through. Force panic * in that case. */ ret = schedule_delayed_work(&modem_unlock_timeout_work, msecs_to_jiffies(6000)); iounmap(hwio_modem_reset_addr); } }
static void modem_wdog_check(struct work_struct *work) { void __iomem *q6_sw_wdog_addr; u32 regval; q6_sw_wdog_addr = ioremap_nocache(Q6_SW_WDOG_ENABLE, 4); if (!q6_sw_wdog_addr) panic("Unable to check modem watchdog status.\n"); regval = readl_relaxed(q6_sw_wdog_addr); if (!regval) { pr_err("modem-8960: Modem watchdog wasn't activated!. Restarting the modem now.\n"); subsystem_restart("modem"); } iounmap(q6_sw_wdog_addr); }
void riva_subsystem_restart_by_host(void) { riva_crash = true; if (ss_restart_inprogress) { pr_err("%s: Ignoring riva restart by host, restart in progress\n", MODULE_NAME); return; } if (!enable_riva_ssr) { ssr_set_restart_reason("riva fatal: RIVA restart by host, mostly casued by WDI timeout"); panic(MODULE_NAME ": Riva restart by host. Mostly casued by WDI timeout"); } ss_restart_inprogress = true; subsystem_restart("riva"); }
static void smsm_state_cb(void *data, uint32_t old_state, uint32_t new_state) { /* Ignore if we're the one that set SMSM_RESET */ if (crash_shutdown) return; if (new_state & SMSM_RESET) { pr_err("Modem SMSM state changed to SMSM_RESET.\n" "Probable err_fatal on the modem. " "Calling subsystem restart...\n"); #ifdef FEATURE_PANTECH_WLAN_QCOM_PATCH //lee.eunsuk 20120423, SSR panic(MODULE_NAME "Modem crashed."); #else subsystem_restart("modem"); #endif } }