Skip to content

Commit 8d48fdf

Browse files
kwarekgregkh
authored andcommitted
USB: PL2303: correctly handle baudrates above 115200
PL2303: correctly handle baudrates above 115200 Signed-off-by: Michal Sroczynski <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 35da413 commit 8d48fdf

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

drivers/usb/serial/pl2303.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,28 @@ static void pl2303_set_termios(struct tty_struct *tty,
342342
baud = 6000000;
343343
}
344344
dbg("%s - baud set = %d", __func__, baud);
345-
buf[0] = baud & 0xff;
346-
buf[1] = (baud >> 8) & 0xff;
347-
buf[2] = (baud >> 16) & 0xff;
348-
buf[3] = (baud >> 24) & 0xff;
345+
if (baud <= 115200) {
346+
buf[0] = baud & 0xff;
347+
buf[1] = (baud >> 8) & 0xff;
348+
buf[2] = (baud >> 16) & 0xff;
349+
buf[3] = (baud >> 24) & 0xff;
350+
} else {
351+
/* apparently the formula for higher speeds is:
352+
* baudrate = 12M * 32 / (2^buf[1]) / buf[0]
353+
*/
354+
unsigned tmp = 12*1000*1000*32 / baud;
355+
buf[3] = 0x80;
356+
buf[2] = 0;
357+
buf[1] = (tmp >= 256);
358+
while (tmp >= 256) {
359+
tmp >>= 2;
360+
buf[1] <<= 1;
361+
}
362+
if (tmp > 256) {
363+
tmp %= 256;
364+
}
365+
buf[0] = tmp;
366+
}
349367
}
350368

351369
/* For reference buf[4]=0 is 1 stop bits */

0 commit comments

Comments
 (0)