| From 8d48fdf689fed2c73c493e5146d1463689246442 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Micha=C5=82=20Sroczy=C5=84ski?= <msroczyn@gmail.com> |
| Date: Tue, 5 Jul 2011 21:53:35 +0200 |
| Subject: USB: PL2303: correctly handle baudrates above 115200 |
| |
| From: Michal Sroczynski <msroczyn@gmail.com> |
| |
| commit 8d48fdf689fed2c73c493e5146d1463689246442 upstream. |
| |
| PL2303: correctly handle baudrates above 115200 |
| |
| Signed-off-by: Michal Sroczynski <msroczyn@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/usb/serial/pl2303.c | 26 ++++++++++++++++++++++---- |
| 1 file changed, 22 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/usb/serial/pl2303.c |
| +++ b/drivers/usb/serial/pl2303.c |
| @@ -616,10 +616,28 @@ static void pl2303_set_termios(struct tt |
| baud = 6000000; |
| } |
| dbg("%s - baud set = %d", __func__, baud); |
| - buf[0] = baud & 0xff; |
| - buf[1] = (baud >> 8) & 0xff; |
| - buf[2] = (baud >> 16) & 0xff; |
| - buf[3] = (baud >> 24) & 0xff; |
| + if (baud <= 115200) { |
| + buf[0] = baud & 0xff; |
| + buf[1] = (baud >> 8) & 0xff; |
| + buf[2] = (baud >> 16) & 0xff; |
| + buf[3] = (baud >> 24) & 0xff; |
| + } else { |
| + /* apparently the formula for higher speeds is: |
| + * baudrate = 12M * 32 / (2^buf[1]) / buf[0] |
| + */ |
| + unsigned tmp = 12*1000*1000*32 / baud; |
| + buf[3] = 0x80; |
| + buf[2] = 0; |
| + buf[1] = (tmp >= 256); |
| + while (tmp >= 256) { |
| + tmp >>= 2; |
| + buf[1] <<= 1; |
| + } |
| + if (tmp > 256) { |
| + tmp %= 256; |
| + } |
| + buf[0] = tmp; |
| + } |
| } |
| |
| /* For reference buf[4]=0 is 1 stop bits */ |