Index: uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c
===================================================================
--- uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c	(revision a9b5b5fabe77630d44c11b4e3e9315bfc20215ce)
+++ uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c	(revision 3d9d948e378b0a89cdfe85faff72342bf5b81f1e)
@@ -57,4 +57,9 @@
 #define S3C24XX_UTRSTAT_TX_EMPTY	0x4
 #define S3C24XX_UTRSTAT_RDATA		0x1
+
+/* Bits in UFSTAT register */
+#define S3C24XX_UFSTAT_TX_FULL		0x4000
+#define S3C24XX_UFSTAT_RX_FULL		0x0040
+#define S3C24XX_UFSTAT_RX_COUNT		0x002f
 
 static irq_cmd_t uart_irq_cmds[] = {
@@ -155,6 +160,7 @@
 	(void) iid; (void) call;
 
-	if ((pio_read_32(&uart->io->utrstat) & S3C24XX_UTRSTAT_RDATA) != 0) {
+	while ((pio_read_32(&uart->io->ufstat) & S3C24XX_UFSTAT_RX_COUNT) != 0) {
 		uint32_t data = pio_read_32(&uart->io->urxh) & 0xff;
+		pio_read_32(&uart->io->uerstat);
 
 		if (uart->client_phone != -1) {
@@ -206,6 +212,6 @@
 static void s3c24xx_uart_sendb(s3c24xx_uart_t *uart, uint8_t byte)
 {
-	/* Wait for transmitter to be empty. */
-	while ((pio_read_32(&uart->io->utrstat) & S3C24XX_UTRSTAT_TX_EMPTY) == 0)
+	/* Wait for space becoming available in Tx FIFO. */
+	while ((pio_read_32(&uart->io->ufstat) & S3C24XX_UFSTAT_TX_FULL) != 0)
 		;
 
