static irqreturn_t modem_wdog_bite_irq(int irq, void *dev_id) { switch (irq) { case Q6SW_WDOG_EXPIRED_IRQ: pr_err("Watchdog bite received from modem software!\n"); #ifdef FEATURE_PANTECH_WLAN_QCOM_PATCH //lee.eunsuk 20120423, SSR log_modem_sfr(); panic(MODULE_NAME "Modem crashed."); #else restart_modem(); #endif break; case Q6FW_WDOG_EXPIRED_IRQ: pr_err("Watchdog bite received from modem firmware!\n"); #ifdef FEATURE_PANTECH_WLAN_QCOM_PATCH //lee.eunsuk 20120423, SSR log_modem_sfr(); panic(MODULE_NAME "Modem crashed."); #else restart_modem(); #endif break; break; default: pr_err("%s: Unknown IRQ!\n", __func__); } 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"); log_modem_sfr(); 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 { log_modem_sfr(); subsystem_restart("modem"); } }
static void restart_modem(struct modem_data *drv) { #ifdef FEATURE_LGE_MODEM_DEBUG_INFO modem_debug.modem_ssr_level = subsys_get_restart_level(drv->subsys); #endif log_modem_sfr(); drv->ignore_errors = true; subsystem_restart_dev(drv->subsys); }
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 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"); #ifdef FEATURE_PANTECH_WLAN_QCOM_PATCH //lee.eunsuk 20120423, SSR log_modem_sfr(); panic(MODULE_NAME "Modem crashed."); #else restart_modem(); #endif } }
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"); log_modem_sfr(); subsystem_restart("modem"); } iounmap(q6_sw_wdog_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"); #ifdef FEATURE_PANTECH_WLAN_QCOM_PATCH //lee.eunsuk 20120423, SSR log_modem_sfr(); panic(MODULE_NAME "Modem crashed."); #else restart_modem(); #endif } iounmap(q6_sw_wdog_addr); }
static void restart_modem(struct modem_data *drv) { log_modem_sfr(); drv->ignore_errors = true; subsystem_restart_dev(drv->subsys); }
static void restart_modem(struct q6v4_modem *drv) { log_modem_sfr(); subsystem_restart_dev(drv->subsys); }
static void restart_modem(void) { log_modem_sfr(); subsystem_restart("modem"); }
static void restart_modem(void) { log_modem_sfr(); subsystem_restart_dev(modem_8960_dev); }
static void modem_fw_fatal_fn(struct work_struct *work) { pr_err("Watchdog bite received from modem FW!\n"); log_modem_sfr(); subsystem_restart("modem"); }
static void restart_modem(void) { log_modem_sfr(); crashdebug_crash("modem"); }