summaryrefslogtreecommitdiffstats
path: root/drivers/serial
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-02-18 16:32:22 -0800
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 01:13:38 -0800
commit843dfb4d99c41116601694f314092b3b6c4511f4 (patch)
tree44a5b1d757bb796466d0746d13d9fa4c49ad459a /drivers/serial
parent11fc04e46a892563d0a9bb98560339f1672e3213 (diff)
downloadlinux-843dfb4d99c41116601694f314092b3b6c4511f4.tar.bz2
[SPARC64] sunhv: Fix locking in sunhv_start_tx()
Caller takes the lock already. Also, fixup the poll loop in sunhv_break_ctl(). Just like in console write, we udelay(2) and use a loop limit of 1000000 iterations. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/sunhv.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c
index 378a1784ce9a..8537839f9abb 100644
--- a/drivers/serial/sunhv.c
+++ b/drivers/serial/sunhv.c
@@ -210,9 +210,6 @@ static void sunhv_stop_tx(struct uart_port *port)
static void sunhv_start_tx(struct uart_port *port)
{
struct circ_buf *xmit = &port->info->xmit;
- unsigned long flags;
-
- spin_lock_irqsave(&port->lock, flags);
while (!uart_circ_empty(xmit)) {
long status = hypervisor_con_putchar(xmit->buf[xmit->tail]);
@@ -223,8 +220,6 @@ static void sunhv_start_tx(struct uart_port *port)
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
port->icount.tx++;
}
-
- spin_unlock_irqrestore(&port->lock, flags);
}
/* port->lock is not held. */
@@ -259,7 +254,7 @@ static void sunhv_break_ctl(struct uart_port *port, int break_state)
{
if (break_state) {
unsigned long flags;
- int limit = 10000;
+ int limit = 1000000;
spin_lock_irqsave(&port->lock, flags);
@@ -267,6 +262,7 @@ static void sunhv_break_ctl(struct uart_port *port, int break_state)
long status = hypervisor_con_putchar(CON_BREAK);
if (status == HV_EOK)
break;
+ udelay(2);
}
spin_unlock_irqrestore(&port->lock, flags);