Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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__);
	}
}
Example #4
0
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---
}