Commit a4bb2cf1 authored by Adrian Bunk's avatar Adrian Bunk Committed by Linus Torvalds

[PATCH] drivers/char/specialix.c: fix the baud conversion

Correct the following bugs introduced by commit
67cc0161:

- remove one remaining and now incorrect baud_table[] usage
- "baud +=" is no longer correct

The former bug was spotted by the Coverity checker.

Rolf Eike Beer spotted a bug in the initial version of my patch.
Signed-off-by: default avatarAdrian Bunk <bunk@stusta.de>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c60099bf
...@@ -183,11 +183,6 @@ static int sx_poll = HZ; ...@@ -183,11 +183,6 @@ static int sx_poll = HZ;
static struct tty_driver *specialix_driver; static struct tty_driver *specialix_driver;
static unsigned long baud_table[] = {
0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
9600, 19200, 38400, 57600, 115200, 0,
};
static struct specialix_board sx_board[SX_NBOARD] = { static struct specialix_board sx_board[SX_NBOARD] = {
{ 0, SX_IOBASE1, 9, }, { 0, SX_IOBASE1, 9, },
{ 0, SX_IOBASE2, 11, }, { 0, SX_IOBASE2, 11, },
...@@ -1090,9 +1085,9 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p ...@@ -1090,9 +1085,9 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
if (baud == 38400) { if (baud == 38400) {
if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
baud ++; baud = 57600;
if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
baud += 2; baud = 115200;
} }
if (!baud) { if (!baud) {
...@@ -1150,11 +1145,9 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p ...@@ -1150,11 +1145,9 @@ static void sx_change_speed(struct specialix_board *bp, struct specialix_port *p
sx_out(bp, CD186x_RBPRL, tmp & 0xff); sx_out(bp, CD186x_RBPRL, tmp & 0xff);
sx_out(bp, CD186x_TBPRL, tmp & 0xff); sx_out(bp, CD186x_TBPRL, tmp & 0xff);
spin_unlock_irqrestore(&bp->lock, flags); spin_unlock_irqrestore(&bp->lock, flags);
if (port->custom_divisor) { if (port->custom_divisor)
baud = (SX_OSCFREQ + port->custom_divisor/2) / port->custom_divisor; baud = (SX_OSCFREQ + port->custom_divisor/2) / port->custom_divisor;
baud = ( baud + 5 ) / 10; baud = (baud + 5) / 10; /* Estimated CPS */
} else
baud = (baud_table[baud] + 5) / 10; /* Estimated CPS */
/* Two timer ticks seems enough to wakeup something like SLIP driver */ /* Two timer ticks seems enough to wakeup something like SLIP driver */
tmp = ((baud + HZ/2) / HZ) * 2 - CD186x_NFIFO; tmp = ((baud + HZ/2) / HZ) * 2 - CD186x_NFIFO;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment