aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYogesh Lal <ylal@codeaurora.org>2014-06-27 12:07:51 +0530
committerMarc Jones <marc.jones@se-eng.com>2015-03-13 23:01:39 +0100
commit419fa61f370072d82c037f84d8f89d0c4c23480b (patch)
tree9ec156af538bf5f4dd761155518ba52b35e9b908
parent586d6e2a8800f29cdfb6111a91d6e8fc8f4fc43c (diff)
downloadcoreboot-419fa61f370072d82c037f84d8f89d0c4c23480b.tar.gz
coreboot-419fa61f370072d82c037f84d8f89d0c4c23480b.tar.xz
coreboot-419fa61f370072d82c037f84d8f89d0c4c23480b.zip
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. Original-Change-Id: I016afb01a77cd14764f0176f6bf144fb29796c2f Original-Signed-off-by: Yogesh Lal <ylal@codeaurora.org> Original-Reviewed-on: https://chromium-review.googlesource.com/209512 Original-Reviewed-by: Vadim Bendebury <vbendeb@chromium.org> Original-Commit-Queue: Vadim Bendebury <vbendeb@chromium.org> Original-Tested-by: Vadim Bendebury <vbendeb@chromium.org> (cherry picked from commit 61528884ad2c0a8e146054bbfeb01a3bc73b9692) Signed-off-by: Marc Jones <marc.jones@se-eng.com> Change-Id: I936af5daa52a25f62133bdf9fb44f0b68cf34e88 Reviewed-on: http://review.coreboot.org/8667 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r--payloads/libpayload/drivers/serial/ipq806x.c3
1 files changed, 0 insertions, 3 deletions
diff --git a/payloads/libpayload/drivers/serial/ipq806x.c b/payloads/libpayload/drivers/serial/ipq806x.c
index 834389ec0..912893d7e 100644
--- a/payloads/libpayload/drivers/serial/ipq806x.c
+++ b/payloads/libpayload/drivers/serial/ipq806x.c
@@ -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));