Loading drivers/usb/serial/pl2303.c +41 −49 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <linux/uaccess.h> #include <linux/usb.h> #include <linux/usb/serial.h> #include <asm/unaligned.h> #include "pl2303.h" /* Loading Loading @@ -275,51 +276,43 @@ static void pl2303_encode_baudrate(struct tty_struct *tty, struct usb_serial *serial = port->serial; struct pl2303_serial_private *spriv = usb_get_serial_data(serial); int baud; int baud_floor, baud_ceil; int k; int i; /* NOTE: Only the values defined in baud_sup are supported ! /* * NOTE: Only the values defined in baud_sup are supported! * => if unsupported values are set, the PL2303 seems to use * 9600 baud (at least my PL2303X always does) */ baud = tty_get_baud_rate(tty); dev_dbg(&port->dev, "baud requested = %d\n", baud); if (baud) { if (!baud) return; /* Set baudrate to nearest supported value */ for (k=0; k<ARRAY_SIZE(baud_sup); k++) { if (baud_sup[k] / baud) { baud_ceil = baud_sup[k]; if (k==0) { baud = baud_ceil; } else { baud_floor = baud_sup[k-1]; if ((baud_ceil % baud) > (baud % baud_floor)) baud = baud_floor; else baud = baud_ceil; } for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) { if (baud_sup[i] > baud) break; } } if (baud > 1228800) { if (i == ARRAY_SIZE(baud_sup)) baud = baud_sup[i - 1]; else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1])) baud = baud_sup[i - 1]; else baud = baud_sup[i]; /* type_0, type_1 only support up to 1228800 baud */ if (spriv->type != HX) baud = 1228800; else if (baud > 6000000) baud = 6000000; } dev_dbg(&port->dev, "baud set = %d\n", baud); baud = max_t(int, baud, 1228800); if (baud <= 115200) { buf[0] = baud & 0xff; buf[1] = (baud >> 8) & 0xff; buf[2] = (baud >> 16) & 0xff; buf[3] = (baud >> 24) & 0xff; put_unaligned_le32(baud, buf); } else { /* apparently the formula for higher speeds is: /* * Apparently the formula for higher speeds is: * baudrate = 12M * 32 / (2^buf[1]) / buf[0] */ unsigned tmp = 12*1000*1000*32 / baud; unsigned tmp = 12000000 * 32 / baud; buf[3] = 0x80; buf[2] = 0; buf[1] = (tmp >= 256); Loading @@ -329,11 +322,10 @@ static void pl2303_encode_baudrate(struct tty_struct *tty, } buf[0] = tmp; } } /* Save resulting baud rate */ if (baud) tty_encode_baud_rate(tty, baud, baud); dev_dbg(&port->dev, "baud set = %d\n", baud); } static void pl2303_set_termios(struct tty_struct *tty, Loading Loading
drivers/usb/serial/pl2303.c +41 −49 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <linux/uaccess.h> #include <linux/usb.h> #include <linux/usb/serial.h> #include <asm/unaligned.h> #include "pl2303.h" /* Loading Loading @@ -275,51 +276,43 @@ static void pl2303_encode_baudrate(struct tty_struct *tty, struct usb_serial *serial = port->serial; struct pl2303_serial_private *spriv = usb_get_serial_data(serial); int baud; int baud_floor, baud_ceil; int k; int i; /* NOTE: Only the values defined in baud_sup are supported ! /* * NOTE: Only the values defined in baud_sup are supported! * => if unsupported values are set, the PL2303 seems to use * 9600 baud (at least my PL2303X always does) */ baud = tty_get_baud_rate(tty); dev_dbg(&port->dev, "baud requested = %d\n", baud); if (baud) { if (!baud) return; /* Set baudrate to nearest supported value */ for (k=0; k<ARRAY_SIZE(baud_sup); k++) { if (baud_sup[k] / baud) { baud_ceil = baud_sup[k]; if (k==0) { baud = baud_ceil; } else { baud_floor = baud_sup[k-1]; if ((baud_ceil % baud) > (baud % baud_floor)) baud = baud_floor; else baud = baud_ceil; } for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) { if (baud_sup[i] > baud) break; } } if (baud > 1228800) { if (i == ARRAY_SIZE(baud_sup)) baud = baud_sup[i - 1]; else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1])) baud = baud_sup[i - 1]; else baud = baud_sup[i]; /* type_0, type_1 only support up to 1228800 baud */ if (spriv->type != HX) baud = 1228800; else if (baud > 6000000) baud = 6000000; } dev_dbg(&port->dev, "baud set = %d\n", baud); baud = max_t(int, baud, 1228800); if (baud <= 115200) { buf[0] = baud & 0xff; buf[1] = (baud >> 8) & 0xff; buf[2] = (baud >> 16) & 0xff; buf[3] = (baud >> 24) & 0xff; put_unaligned_le32(baud, buf); } else { /* apparently the formula for higher speeds is: /* * Apparently the formula for higher speeds is: * baudrate = 12M * 32 / (2^buf[1]) / buf[0] */ unsigned tmp = 12*1000*1000*32 / baud; unsigned tmp = 12000000 * 32 / baud; buf[3] = 0x80; buf[2] = 0; buf[1] = (tmp >= 256); Loading @@ -329,11 +322,10 @@ static void pl2303_encode_baudrate(struct tty_struct *tty, } buf[0] = tmp; } } /* Save resulting baud rate */ if (baud) tty_encode_baud_rate(tty, baud, baud); dev_dbg(&port->dev, "baud set = %d\n", baud); } static void pl2303_set_termios(struct tty_struct *tty, Loading