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 mdm_crash_dump_dbg_info(void) { dump_mdm_related_gpio(); printk(KERN_INFO "=== Show qcks stack ===\n"); show_thread_group_state_filter("qcks", 0); printk(KERN_INFO "\n"); printk(KERN_INFO "=== Show efsks stack ===\n"); show_thread_group_state_filter("efsks", 0); printk(KERN_INFO "\n"); printk(KERN_INFO "=== Show ks stack ===\n"); show_thread_group_state_filter("ks", 0); printk(KERN_INFO "\n"); 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); }
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 mdm_status_check_fn(struct work_struct *work) { int value = 0; msleep(3000); pr_info("%s mdm_status_change notified? %c\n", __func__, mdm_status_change_notified ? 'Y': 'N'); if (!mdm_status_change_notified) { dump_mdm_related_gpio(); value = gpio_get_value(mdm_drv->mdm2ap_status_gpio); if (value == 1) queue_work_on(0, mdm_queue, &mdm_status_work); } }
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 mdm_status_fn(struct work_struct *work) { int value; //HTC+++ mutex_lock(&MDM_BOOT_STATUS_CHECK_LOCK); mdm2ap_gpio_status = gpio_get_value(mdm_drv->mdm2ap_status_gpio); value = mdm2ap_gpio_status; //HTC--- pr_info("mdm_status_fn\n"); mdm_drv->ops->status_cb(mdm_drv, value); pr_debug("%s: status:%d\n", __func__, value); if ((value == 0) && mdm_drv->mdm_ready && !device_ehci_shutdown) { //++SSD_RIL: set mdm_drv->mdm_ready before restart modem mdm_drv->mdm_ready = 0; //--SSD_RIL pr_info("%s: unexpected reset external modem\n", __func__); /* HTC added start */ dump_mdm_related_gpio(); /* HTC added end */ subsystem_restart(EXTERNAL_MODEM); } else if (value == 1) { //Sophia:0510-Change to NO_PULL extern const int gpio_to_pingroup[TEGRA_MAX_GPIO]; tegra_pinmux_set_pullupdown(gpio_to_pingroup[mdm_drv->mdm2ap_status_gpio], TEGRA_PUPD_NORMAL); pr_info("%s: status = 1: mdm is now ready\n", __func__); } //HTC+++ mutex_unlock(&MDM_BOOT_STATUS_CHECK_LOCK); //HTC--- }