Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0d06d90a authored by Chandana Kishori Chiluveru's avatar Chandana Kishori Chiluveru
Browse files

serial: msm_geni_serial: Avoid manual RFR flow control for OBS



Currently UART driver making RFR to LOW during UART suspend.
In issue case external SOC is used with Out of band sleep(OBS) and
as RFR is low from UART SOC is trying to send RX data when UART
is in sleep state and leading to RX packet loss.

Fix this issue by avoiding manual RFR flow control feature for
OBS case.

Change-Id: Id9ee9cc48924bf8b70d580c7878cfdd164ed6b37
Signed-off-by: default avatarChandana Kishori Chiluveru <cchiluve@codeaurora.org>
parent 1ca91eb8
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -3553,14 +3553,20 @@ static int msm_geni_serial_runtime_suspend(struct device *dev)
							SE_GENI_STATUS);

	IPC_LOG_MSG(port->ipc_log_pwr, "%s: Start\n", __func__);
	/* Flow off from UART */
	/* Flow off from UART only for In band sleep(IBS)
	 * Avoid manual RFR FLOW ON for Out of band sleep(OBS).
	 */
	if (port->wakeup_byte && port->wakeup_irq)
		msm_geni_serial_set_manual_flow(false, port);
	ret = wait_for_transfers_inflight(&port->uport);
	if (ret) {
		IPC_LOG_MSG(port->ipc_log_pwr,
			     "%s: wait_for_transfer_inflight return ret:%d\n",
			     __func__, ret);
		/* Flow on from UART */
		/* Flow on from UART only for In band sleep(IBS)
		 * Avoid manual RFR FLOW ON for Out of band sleep(OBS)
		 */
		if (port->wakeup_byte && port->wakeup_irq)
			msm_geni_serial_allow_rx(port);
		return -EBUSY;
	}
@@ -3573,7 +3579,10 @@ static int msm_geni_serial_runtime_suspend(struct device *dev)
	if (ret) {
		IPC_LOG_MSG(port->ipc_log_pwr, "%s: stop rx failed %d\n",
							__func__, ret);
		/* Flow on from UART */
		/* Flow on from UART only for In band sleep(IBS)
		 * Avoid manual RFR FLOW ON for Out of band sleep(OBS)
		 */
		if (port->wakeup_byte && port->wakeup_irq)
			msm_geni_serial_allow_rx(port);
		return -EBUSY;
	}
@@ -3585,10 +3594,12 @@ static int msm_geni_serial_runtime_suspend(struct device *dev)
	disable_irq(port->uport.irq);

	/*
	 * Flow on from UART
	 * Flow on from UART only for In band sleep(IBS)
	 * Avoid manual RFR FLOW ON for Out of band sleep(OBS).
	 * Above before stop_rx disabled the flow so we need to enable it here
	 * Make sure wake up interrupt is enabled before RFR is made low
	 */
	if (port->wakeup_byte && port->wakeup_irq)
		msm_geni_serial_allow_rx(port);

	ret = se_geni_resources_off(&port->serial_rsc);