/*
 * mc_work - PHONE_ACTIVE irq
 *  After
 *	CP Crash : PHONE_ACTIVE(L) + CP_DUMP_INT(H) (0xC9)
 *	CP Reset : PHONE_ACTIVE(L) + CP_DUMP_INT(L) (0xC7)
 *  Before
 *	CP Crash : PHONE_ACTIVE(L) + SUSPEND_REQUEST(H) (0xC9)
 *	CP Reset : PHONE_ACTIVE(L) + SUSPEND_REQUEST(L) (0xC7)
 */
static void mc_work(struct work_struct *work_arg)
{
#if 0 //it will be removed!
	struct modemctl *mc = container_of(work_arg, struct modemctl,
		work.work);
	int error;
	int susp_req;
	char *envs[2] = { NULL, NULL };

	error = modem_get_active(mc);
	if (error < 0) {
		dev_err(mc->dev, "Not initialized\n");
		return;
	}
	susp_req = gpio_get_value(mc->gpio_suspend_request);
	dev_dbg(mc->dev, "PHONE ACTIVE: %d SUSPEND_REQUEST: %d\n",
		error, susp_req);

	envs[0] = susp_req ? "MAILBOX=cp_exit" : "MAILBOX=cp_reset";

	if (error && gpio_get_value(global_mc->gpio_phone_on)) {
		mc->cpcrash_flag = 0;
		kobject_uevent(&mc->dev->kobj, KOBJ_ONLINE);
	} else {
		msleep(300);
		if (!modem_get_active(mc)) {
			mc->cpcrash_flag = 1;
			kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs);
		}
	}
#else
	struct modemctl *mc = container_of(work_arg, struct modemctl,
		work.work);
	int error;
	char *envs[2] = { NULL, NULL };

	error = modem_get_active(mc);
	if (error < 0) {
		dev_err(mc->dev, "Not initialized\n");
		return;
	}
	dev_dbg(mc->dev, "PHONE ACTIVE: %d \n", error);

	envs[0] = error ? "MAILBOX=dump_end" : "MAILBOX=dump_start";

	msleep(300);

	mc->cpcrash_flag = 1;

	//kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs);
	kobject_uevent(&mc->dev->kobj, KOBJ_OFFLINE);    

	if(error)
		printk(KERN_ERR"[%s]%d, lte crash!dump end !!!\n",__func__,__LINE__);
	else
		printk(KERN_ERR"[%s]%d, lte crash!dump start !!!\n",__func__,__LINE__);       

#endif
}
예제 #2
0
static void mc_work(struct work_struct *work_arg)
{
	struct modemctl *mc = container_of(work_arg, struct modemctl,
		work.work);
	int error;
	int cpdump_int;
	char *envs[2] = { NULL, NULL };

	if (!sprd_boot_complete)
		return;

	error = modem_get_active(mc);
	if (error < 0) {
		dev_err(mc->dev, "Not initialized\n");
		return;
	}

	cpdump_int = gpio_get_value(mc->gpio_cp_dump_int);
	dev_info(mc->dev, "PHONE ACTIVE: %d CP_DUMP_INT: %d\n",
		error, cpdump_int);

	if ((!error) && cpdump_int) {
		dev_err(mc->dev, "CP abnormal dead\n");
		dev_err(mc->dev, "(%d) send uevent to RIL [cpdump_int:%d]\n",
			__LINE__, cpdump_int);
		envs[0] = "MAILBOX=cp_reset";
		kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs);
		sprd_boot_complete = 0;
		return;
	}
	envs[0] = cpdump_int ? "MAILBOX=cp_exit" : "MAILBOX=cp_reset";

	if (error && gpio_get_value(global_mc->gpio_phone_on)) {
		mc->cpcrash_flag = 0;
		mc->boot_done = 1;
		kobject_uevent(&mc->dev->kobj, KOBJ_ONLINE);
		wake_unlock(&mc->reset_lock);
	} else if (mc->boot_done) {
		if (modem_get_active(mc)) {
			wake_unlock(&mc->reset_lock);
			return;
		}
		if (mc->cpcrash_flag > 3) {
			dev_err(mc->dev, "(%d) send uevent to RIL [cpdump_int:%d]\n",
				__LINE__, cpdump_int);
			kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs);
		} else {
			mc->cpcrash_flag++;
			schedule_delayed_work(&mc->work, msecs_to_jiffies(50));
		}
	}

	if (cpdump_int) {
		dev_err(mc->dev, "(%d) send uevent to RIL [cpdump_int:%d]\n",
			__LINE__, cpdump_int);
		kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs);
	}
}
예제 #3
0
/*
 * mc_work - PHONE_ACTIVE irq
 *  After
 *	CP Crash : PHONE_ACTIVE(L) + CP_DUMP_INT(H) (0xC9)
 *	CP Reset : PHONE_ACTIVE(L) + CP_DUMP_INT(L) (0xC7)
 *  Before
 *	CP Crash : PHONE_ACTIVE(L) + SUSPEND_REQUEST(H) (0xC9)
 *	CP Reset : PHONE_ACTIVE(L) + SUSPEND_REQUEST(L) (0xC7)
 */
static void mc_work(struct work_struct *work_arg)
{
	struct modemctl *mc = container_of(work_arg, struct modemctl,
		work.work);
	int error;
	int cpdump_int;
	char *envs[2] = { NULL, NULL };

	error = modem_get_active(mc);
	if (error < 0) {
		dev_err(mc->dev, "Not initialized\n");
		return;
	}

//	cpdump_int = gpio_get_value(mc->gpio_cp_dump_int);
//	dev_dbg(mc->dev, "PHONE ACTIVE: %d CP_DUMP_INT: %d\n",
//		error, cpdump_int);
	dev_dbg(mc->dev, "PHONE ACTIVE: %d \n", error);

//	envs[0] = cpdump_int ? "MAILBOX=cp_exit" : "MAILBOX=cp_reset";
	envs[0] = "MAILBOX=cp_exit";

	if (error /*&& gpio_get_value(global_mc->gpio_phone_on)*/) {
		mc->cpcrash_flag = 0;
		mc->boot_done = 1;
		kobject_uevent(&mc->dev->kobj, KOBJ_ONLINE);
		wake_unlock(&mc->reset_lock);
	} else if (mc->boot_done) {
		dev_dbg(mc->dev, "mc->cpcrash_flag: %d \n", mc->cpcrash_flag);

		if (modem_get_active(mc)) {
			wake_unlock(&mc->reset_lock);
			return;
		}
		if (mc->cpcrash_flag > 3) {
			dev_dbg(mc->dev, "send uevnet to RIL [cpdump_int:%d]\n",
				cpdump_int);
			mc->boot_done = 0;
			kobject_uevent_env(&mc->dev->kobj, KOBJ_OFFLINE, envs);
		} else {
			mc->cpcrash_flag++;
			schedule_delayed_work(&mc->work, msecs_to_jiffies(50));
		}
	}
}
예제 #4
0
static ssize_t show_status(struct device *d,
		struct device_attribute *attr, char *buf)
{
	char *p = buf;
	struct modemctl *mc = dev_get_drvdata(d);

	p += sprintf(p, "%d\n", modem_get_active(mc));

	return p - buf;
}
static void mc_work(struct work_struct *work_arg)
{
	struct modemctl *mc = container_of(work_arg, struct modemctl,
		work.work);
	int error;
	int cpdump_int;
	char *envs[2] = { NULL, NULL };

	error = modem_get_active(mc);
	if (error < 0) {
		dev_err(mc->dev, "Not initialized\n");
		return;
	}

	cpdump_int = gpio_get_value(mc->gpio_cp_reset_int);
	dev_info(mc->dev, "PHONE ACTIVE: %d CP_DUMP_INT: %d\n",
		error, cpdump_int);

	envs[0] = cpdump_int ? "MAILBOX=cp_exit" : "MAILBOX=cp_reset";

	if (error && gpio_get_value(global_mc->gpio_phone_on)) {
		mc->cpcrash_flag = 0;
		mc->boot_done = 1;
		crash_event(MODEM_EVENT_CONNECT);
		wake_unlock(&mc->reset_lock);
	} else if (mc->boot_done) {
		if (modem_get_active(mc)) {
			wake_unlock(&mc->reset_lock);
			return;
		}
		if (mc->cpcrash_flag > 3) {
			dev_info(mc->dev, "send uevnet to RIL [cpdump_int:%d]\n",
				cpdump_int);
			crash_event(MODEM_EVENT_CRASH);
		} else {
			mc->cpcrash_flag++;
			schedule_delayed_work(&mc->work, msecs_to_jiffies(50));
		}
	}
}