serial: bcm283x_mu: Refactor RX buffer 54/206154/2
authorDongwoo Lee <dwoo08.lee@samsung.com>
Mon, 13 May 2019 07:33:18 +0000 (16:33 +0900)
committerDongwoo Lee <dwoo08.lee@samsung.com>
Wed, 15 May 2019 07:08:10 +0000 (16:08 +0900)
This patch changes maximum count of reading rx fifo by following
emprical test, and applies circular queue to buffer.

Change-Id: Id498ea9c0c22014f00af2b45ad64ad4c6e69a021
Signed-off-by: Dongwoo Lee <dwoo08.lee@samsung.com>
drivers/serial/serial_bcm283x_mu.c

index d8cdb1f1d4e165ba6ff904b5b05f9dc60a77e059..725aa63dd484c118b77f7ba8e8ec42014461adbc 100644 (file)
@@ -100,12 +100,15 @@ static int bcm283x_mu_serial_probe(struct udevice *dev)
 
 static inline int bcm283x_mu_rx_buffer_full(struct bcm283x_mu_priv *priv)
 {
-       return !!(priv->rx_buffer_in_pos == BCM283X_MU_RX_BUFFER_LEN - 1);
+       if (!priv->rx_buffer_out_pos)
+               return priv->rx_buffer_in_pos == BCM283X_MU_RX_BUFFER_LEN - 1;
+
+       return priv->rx_buffer_out_pos == priv->rx_buffer_in_pos + 1;
 }
 
 static inline int bcm283x_mu_rx_buffer_empty(struct bcm283x_mu_priv *priv)
 {
-       return !!(priv->rx_buffer_out_pos == BCM283X_MU_RX_BUFFER_INIT_POS);
+       return priv->rx_buffer_out_pos == BCM283X_MU_RX_BUFFER_INIT_POS;
 }
 
 static void bcm283x_mu_rx_buffer_put(struct bcm283x_mu_priv *priv, int data)
@@ -113,7 +116,10 @@ static void bcm283x_mu_rx_buffer_put(struct bcm283x_mu_priv *priv, int data)
        if (bcm283x_mu_rx_buffer_empty(priv))
                priv->rx_buffer_out_pos++;
 
-       priv->rx_buffer[++priv->rx_buffer_in_pos] = data;
+       priv->rx_buffer_in_pos++;
+       priv->rx_buffer_in_pos %= BCM283X_MU_RX_BUFFER_LEN;
+
+       priv->rx_buffer[priv->rx_buffer_in_pos] = data;
 }
 
 static int bcm283x_mu_rx_buffer_get(struct bcm283x_mu_priv *priv)
@@ -125,6 +131,7 @@ static int bcm283x_mu_rx_buffer_get(struct bcm283x_mu_priv *priv)
                priv->rx_buffer_out_pos = BCM283X_MU_RX_BUFFER_INIT_POS;
        } else {
                priv->rx_buffer_out_pos++;
+               priv->rx_buffer_out_pos %= BCM283X_MU_RX_BUFFER_LEN;
        }
 
        return data;
@@ -135,7 +142,7 @@ static int bcm283x_mu_serial_getc(struct udevice *dev)
        struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev);
        struct bcm283x_mu_priv *priv = dev_get_priv(dev);
        struct bcm283x_mu_regs *regs = priv->regs;
-       int max_count = 256;
+       int max_count = 32;
 
        if (plat->disabled)
                return -EAGAIN;
@@ -144,13 +151,13 @@ static int bcm283x_mu_serial_getc(struct udevice *dev)
                if (bcm283x_mu_rx_buffer_full(priv) || --max_count == 0)
                        break;
 
-               bcm283x_mu_rx_buffer_put(priv, readl(&regs->io));
+               bcm283x_mu_rx_buffer_put(priv, (int)readl(&regs->io));
        }
 
        if (bcm283x_mu_rx_buffer_empty(priv))
                return -EAGAIN;
 
-       return (int)bcm283x_mu_rx_buffer_get(priv);
+       return bcm283x_mu_rx_buffer_get(priv);
 }
 
 static int bcm283x_mu_serial_putc(struct udevice *dev, const char data)