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); wcnss_riva_dump_pmic_regs(); 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){ #if defined(CONFIG_LGE_HANDLE_PANIC) lge_set_magic_for_subsystem("riva"); msm_set_restart_mode(0x6d632130); #endif 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_dev(riva_8960_dev); }
static irqreturn_t riva_wdog_bite_irq_hdlr(int irq, void *dev_id) { riva_crash = true; if (ss_restart_inprogress) { pr_err("%s: Ignoring riva bite irq, restart in progress\n", MODULE_NAME); return IRQ_HANDLED; } if (!enable_riva_ssr) { #if defined(CONFIG_LGE_HANDLE_PANIC) lge_set_magic_for_subsystem("wcnss"); msm_set_restart_mode(0x6d632130); #endif panic(MODULE_NAME ": Watchdog bite received from Riva"); } ss_restart_inprogress = true; subsystem_restart_dev(riva_8960_dev); return IRQ_HANDLED; }