libpayload: ipq808x: stale interrupt shall not be cleared unconditionally
The serial driver hangs in cases when FIFO has more than single word to be processed. Easiest way to reproduce is to paste a string of greater than 4 characters in cli. Clearing the RXSTALE interrupt without draining all the characters from FIFO leads to the issue as the driver is dependent on msm_boot_uart_dm_read function to reinitialize for next transfer. Logically the driver is organized in such a manner that next transfer never gets initiated till rx_data_read < total_rx_data. Clearing the RXSTALE without consideration of total number of characters (or words) unprocessed makes the msm_boot_uart_dm_read to return on the first if conditional. Thus the driver is stuck forever. A quick fix is to avoid clearing the stale interrupt. Reset is handled whenever a new transfer is initialized in msm_boot_uart_dm_init_rx_transfer. BUG=chrome-os-partner:29542 TEST=manual -Paste a string greater than 4 characters in cli. Change-Id: I016afb01a77cd14764f0176f6bf144fb29796c2f Signed-off-by: Yogesh Lal <ylal@codeaurora.org> Reviewed-on: https://chromium-review.googlesource.com/209512 Reviewed-by: Vadim Bendebury <vbendeb@chromium.org> Commit-Queue: Vadim Bendebury <vbendeb@chromium.org> Tested-by: Vadim Bendebury <vbendeb@chromium.org>
This commit is contained in:
parent
589e6415fa
commit
61528884ad
1 changed files with 0 additions and 3 deletions
|
|
@ -152,9 +152,6 @@ static unsigned msm_boot_uart_dm_read(void)
|
|||
return IPQ_UART_DM_E_RX_NOT_READY;
|
||||
}
|
||||
|
||||
/* Clear stale event. */
|
||||
writel(IPQ_UART_DM_CMD_RES_STALE_INT, IPQ_UART_DM_CR(base));
|
||||
|
||||
/* Read UART_DM_RX_TOTAL_SNAP for actual number of bytes received */
|
||||
if (total_rx_data == 0)
|
||||
total_rx_data = readl(IPQ_UART_DM_RX_TOTAL_SNAP(base));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue