Skip to content

Commit

Permalink
serial: sh-sci: Reorder the SCxTDR write after the TDxE clear.
Browse files Browse the repository at this point in the history
Under qemu there is a race between the TDxE read-and-clear and the SCxTDR
write. While on hardware it can be gauranteed that the read-and-clear
will happen prior to the character being written out, no such assumption
can be made under emulation. As this path happens with IRQs off and the
hardware itself doesn't care about the ordering, move the SCxTDR write
until after the read-and-clear.

Signed-off-by: Vladimir Prus <vladimir@codesourcery.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Nov 13, 2008
1 parent 5d52013 commit 272966c
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 2 deletions.
2 changes: 1 addition & 1 deletion arch/sh/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,9 @@ static void scif_sercon_putc(int c)
while (((sci_in(&scif_port, SCFDR) & EPK_FIFO_BITS) >= EPK_FIFO_SIZE))
;

sci_out(&scif_port, SCxTDR, c);
sci_in(&scif_port, SCxSR);
sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40));
sci_out(&scif_port, SCxTDR, c);

while ((sci_in(&scif_port, SCxSR) & 0x40) == 0)
;
Expand Down
2 changes: 1 addition & 1 deletion drivers/serial/sh-sci.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,9 @@ static void put_char(struct uart_port *port, char c)
status = sci_in(port, SCxSR);
} while (!(status & SCxSR_TDxE(port)));

sci_out(port, SCxTDR, c);
sci_in(port, SCxSR); /* Dummy read */
sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
sci_out(port, SCxTDR, c);

spin_unlock_irqrestore(&port->lock, flags);
}
Expand Down

0 comments on commit 272966c

Please sign in to comment.