瀏覽代碼

[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>
David S. Miller 19 年之前
父節點
當前提交
843dfb4d99
共有 1 個文件被更改,包括 2 次插入6 次删除
  1. 2 6
      drivers/serial/sunhv.c

+ 2 - 6
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);