Exemple #1
0
static irqreturn_t modemctl_resume_thread(int irq, void *dev_id)
{
	struct modemctl *mc = (struct modemctl *)dev_id;
	int val = gpio_get_value(mc->gpio_ipc_host_wakeup);
	int err;

	dev_dbg(mc->dev, "svn <HOST_WUP:%d\n", val);
	if (val != HOST_WUP_LEVEL) {
		if (mc->l2_done) {
			complete(mc->l2_done);
			mc->l2_done = NULL;
		}
		gpio_set_value(mc->gpio_ipc_slave_wakeup, 0);
		dev_dbg(mc->dev, "svn >SLAV_WUP:0,%d\n",
			gpio_get_value(mc->gpio_ipc_slave_wakeup));
		mc->debug_cnt = 0;
		return IRQ_HANDLED;
	}

	if (val == HOST_WUP_LEVEL) {
		err = usbsvn_request_resume();
		if (err < 0)
			dev_err(mc->dev, "request resume failed: %d\n", err);
		mc->debug_cnt++;
	}
	if (mc->debug_cnt > 30) {
		dev_err(mc->dev, "Abnormal Host wakeup -- over 30times");
		disable_irq(irq);
		mc->debug_cnt = 0;
		crash_event(SVNET_ERROR_RESET);
		/*crash_event(SVNET_ERROR_CRASH);*/
		/*panic("HSIC Disconnected");*/
		msleep(1000);
		enable_irq(irq);
	}

	if (!val
		&& mc->wakeup_flag == HOST_WAKEUP_WAIT_RESET) {
		mc->wakeup_flag = HOST_WAKEUP_LOW;
		dev_dbg(mc->dev, "%s: wakeup flag (%d)\n",
			__func__, mc->wakeup_flag);
#ifdef CONFIG_SUPPORT_SIMDETECT
		/* SIM DETECT - default SIM status */
		if (mc->gpio_sim_detect) {
			mc->sim_prev_states =
			(gpio_get_value(mc->gpio_sim_detect))? SIM_DETACH :
			SIM_ATTACH ;
			dev_dbg(mc->dev, "%s: default SIM Status (%d)\n",
				__func__, mc->sim_prev_states);
		}
#endif
	}
	return IRQ_HANDLED;
}
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));
		}
	}
}
static irqreturn_t modem_resume_thread(int irq, void *dev_id)
{
	struct modemctl *mc = (struct modemctl *)dev_id;
	int val = gpio_get_value(mc->gpio_ipc_host_wakeup);
	int err;

	dev_err(mc->dev, "CP>>AP:  HOST_WUP:%d\n", val);
	//if(mc_get_ignore_cpirq())
		//return IRQ_HANDLED;
	if (val != HOST_WUP_LEVEL) {
		//gpio_set_value(mc->gpio_ipc_slave_wakeup, 0);
		smm6260_set_slave_wakeup(0);
		mc->debug_cnt = 0;
		return IRQ_HANDLED;
	}


	if (val == HOST_WUP_LEVEL) {
		if (mc->l2_done) {
			complete(mc->l2_done);
			mc->l2_done = NULL;
		}
		err = acm_request_resume();
		if (err < 0)
			dev_err(mc->dev, "request resume failed: %d\n", err);
		mc->debug_cnt++;
	}
	if (mc->debug_cnt > 30) {
		dev_err(mc->dev, "Abnormal Host wakeup -- over 30times");
		//disable_irq(irq);
		mc->debug_cnt = 0;
		if(mc->boot_done)
		{
			//mc->cpcrash_flag = 1;
			crash_event(MODEM_EVENT_CRASH);
		}		
		/*crash_event(SVNET_ERROR_CRASH);*/
		/*panic("HSIC Disconnected");*/
		//msleep(1000);
		//enable_irq(irq);
	}


	if (!val
		&& mc->wakeup_flag == HOST_WAKEUP_WAIT_RESET) {
		mc->wakeup_flag = HOST_WAKEUP_LOW;
		dev_err(mc->dev, "%s: wakeup flag (%d)\n",
			__func__, mc->wakeup_flag);
	}

	return IRQ_HANDLED;
}
static irqreturn_t modemctl_resume_thread(int irq, void *dev_id)
{
#if defined(CONFIG_CHN_CMCC_SPI_SPRD)
	return IRQ_HANDLED;
#else
	struct modemctl *mc = (struct modemctl *)dev_id;
	int val = gpio_get_value(mc->gpio_ipc_host_wakeup);
	int err;

	dev_dbg(mc->dev, "svn <HOST_WUP:%d\n", val);
	if (val != HOST_WUP_LEVEL) {
		if (mc->l2_done) {
			complete(mc->l2_done);
			mc->l2_done = NULL;
		}
		gpio_set_value(mc->gpio_ipc_slave_wakeup, 0);
		dev_dbg(mc->dev, "svn >SLAV_WUP:0,%d\n",
			gpio_get_value(mc->gpio_ipc_slave_wakeup));
		mc->debug_cnt = 0;
		return IRQ_HANDLED;
	}

	if (val == HOST_WUP_LEVEL)
		mc->debug_cnt++;

	if (mc->debug_cnt > 30) {
		dev_err(mc->dev, "Abnormal Host wakeup -- over 30times");
		disable_irq(irq);
		mc->debug_cnt = 0;
		crash_event(SVNET_ERROR_RESET);
		/*crash_event(SVNET_ERROR_CRASH);*/
		/*panic("HSIC Disconnected");*/
		msleep(1000);
		enable_irq(irq);
	}

	if (!val
		&& mc->wakeup_flag == HOST_WAKEUP_WAIT_RESET) {
		mc->wakeup_flag = HOST_WAKEUP_LOW;
		dev_dbg(mc->dev, "%s: wakeup flag (%d)\n",
			__func__, mc->wakeup_flag);
	}
	return IRQ_HANDLED;
#endif
}
static ssize_t store_control(struct device *d,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct modemctl *mc = dev_get_drvdata(d);

	if (!strncmp(buf, "on", 2)) {
		modem_on(mc);
		return count;
	}

	if (!strncmp(buf, "off", 3)) {
		modem_off(mc);
		return count;
	}

	if (!strncmp(buf, "reset", 5)) {
		modem_reset(mc);
		return count;
	}

	if (!strncmp(buf, "boot", 4)) {
		//modem_boot(mc);
		ignore_irq_count = 1;		
		enable_irq(mc->irq[0]);           
		return count;
	}

	if (!strncmp(buf, "daolpu", 6)) {
		kernel_upload(mc);
		return count;
	}

	if (!strncmp(buf, "silent", 6)) {
		printk(KERN_ERR "%s -LTE Silent Reset!!!\n", __func__);        
		crash_event(1);
		return count;
	}    

	return count;
}
Exemple #6
0
static void usbsvn_try_reconnect_work(struct work_struct *work)
{
	struct usbsvn *svn =
		container_of(work, struct usbsvn, try_reconnect_work.work);
/*	char *envs[2] = {"MAILBOX=hsic_disconnected", NULL };*/

	if (svn->usbsvn_connected) {
		wake_unlock_pm(svn);
		printk(KERN_INFO "svn re-connected\n");
		goto out;
	}
	if (svn->dpm_suspending) {
		wake_lock_pm(svn);
		printk(KERN_INFO "svn suspending, delay reconnection\n");
		goto retry;
	}
	if (!svn->reconnect_cnt--) {
		wake_unlock_pm(svn);
#ifdef CONFIG_SAMSUNG_PHONE_SVNET
		/*if (!mc_is_modem_active()) {
			kobject_uevent_env(&svn->netdev->dev.kobj, KOBJ_OFFLINE,
				envs); */
			/*panic("HSIC Disconnected");*/
			crash_event(0);
		/*}*/
#endif
		goto out;
	}
#ifdef CONFIG_SAMSUNG_PHONE_SVNET
	mc_reconnect_gpio();
#endif

	/*TODO: EHCI off reconnect*/

retry:
	schedule_delayed_work(&svn->try_reconnect_work, 200);
out:
	return;
}
Exemple #7
0
static int usbsvn_initiated_resume(struct net_device *ndev)
{
	int err;

	if (share_svn->usbdev) {
		struct device *dev = &share_svn->usbdev->dev;
		int spin = 10, spin2 = 30;
		int host_wakeup_done = 0;
		int _host_high_cnt = 0, _host_timeout_cnt = 0;
retry:
		switch (dev->power.runtime_status) {
		case RPM_SUSPENDED:
			if (share_svn->dpm_suspending || host_wakeup_done) {
				dev_dbg(&ndev->dev,
					"DPM Suspending, spin:%d\n", spin2);
				if (spin2-- == 0) {
					dev_err(&ndev->dev,
					"dpm resume timeout\n");
					return -ETIMEDOUT;
				}
				msleep(30);
				goto retry;
			}
#ifdef CONFIG_SAMSUNG_PHONE_SVNET
			err = mc_prepare_resume(200);
			switch (err) {
			case MC_SUCCESS:
				host_wakeup_done = 1;
				_host_timeout_cnt = 0;
				_host_high_cnt = 0;
				goto retry; /*wait until RPM_ACTIVE states*/

			case MC_HOST_TIMEOUT:
				_host_timeout_cnt++;
				break;

			case MC_HOST_HIGH:
				_host_high_cnt++;
				break;
			}
#endif
			if (spin2-- == 0) {
				dev_err(&ndev->dev,
				"svn initiated resume, RPM_SUSPEND timeout\n");
/*				share_svn->resume_debug = 1;
				err = pm_runtime_resume(dev);
				if (!err && dev->power.timer_expires == 0
				&& dev->power.request_pending == false) {
					printk(KERN_DEBUG
						"%s:run time idle\n", __func__);
					pm_runtime_idle(dev);
				}
				share_svn->resume_debug = 0;*/
#ifdef CONFIG_SAMSUNG_PHONE_SVNET
				crash_event(0);
#endif
				return -ETIMEDOUT;
			}
			msleep(20);
			goto retry;

		case RPM_SUSPENDING:
			dev_dbg(&ndev->dev,
				"RPM Suspending, spin:%d\n", spin);
			if (spin-- == 0) {
				dev_err(&ndev->dev,
				"Modem suspending timeout\n");
				return -ETIMEDOUT;
			}
			msleep(100);
			goto retry;
		case RPM_RESUMING:
			dev_dbg(&ndev->dev,
				"RPM Resuming, spin:%d\n", spin2);
			if (spin2-- == 0) {
				dev_err(&ndev->dev,
				"Modem resume timeout\n");
				return -ETIMEDOUT;
			}
			msleep(50);
			goto retry;
		case RPM_ACTIVE:
			break;
		default:
			return -EIO;
		}
	}
	return 0;
}