1 diff -r -u loryg-2.2.16/drivers/char/serial.c linux-2.2.16/drivers/char/serial.c
\r
2 --- loryg-2.2.16/drivers/char/serial.c Wed Jun 7 23:26:42 2000
\r
3 +++ linux-2.2.16/drivers/char/serial.c Mon Aug 14 12:52:42 2000
\r
5 icount = &info->state->icount;
\r
7 ch = serial_inp(info, UART_RX);
\r
8 - if (tty->flip.count >= TTY_FLIPBUF_SIZE)
\r
9 + if (tty->flip.count >= tty->flip.flipbuf_size)
\r
11 *tty->flip.char_buf_ptr = ch;
\r
14 * reported immediately, and doesn't
\r
15 * affect the current character
\r
17 - if (tty->flip.count < TTY_FLIPBUF_SIZE) {
\r
18 + if (tty->flip.count < tty->flip.flipbuf_size) {
\r
20 tty->flip.flag_buf_ptr++;
\r
21 tty->flip.char_buf_ptr++;
\r
22 @@ -3137,7 +3137,8 @@
\r
23 serial_driver.init_termios = tty_std_termios;
\r
24 serial_driver.init_termios.c_cflag =
\r
25 B9600 | CS8 | CREAD | HUPCL | CLOCAL;
\r
26 - serial_driver.flags = TTY_DRIVER_REAL_RAW;
\r
27 + serial_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_SPECIAL_FLIPSIZE;
\r
28 + serial_driver.flip_size = 15000; /* use 60004 bytes */
\r
29 serial_driver.refcount = &serial_refcount;
\r
30 serial_driver.table = serial_table;
\r
31 serial_driver.termios = serial_termios;
\r
32 Only in linux-2.2.16/drivers/char: serial.c.orig
\r
33 diff -r -u loryg-2.2.16/drivers/char/tty_io.c linux-2.2.16/drivers/char/tty_io.c
\r
34 --- loryg-2.2.16/drivers/char/tty_io.c Wed Jun 7 23:26:42 2000
\r
35 +++ linux-2.2.16/drivers/char/tty_io.c Mon Aug 14 12:53:42 2000
\r
37 * Rewrote init_dev and release_dev to eliminate races.
\r
38 * -- Bill Hawes <whawes@star.net>, June 97
\r
40 + * Added support for bigger flipbuf sizes
\r
41 + * -- Pavel Machek <pavel@ucw.cz>, June 99
\r
43 * Added support for a Unix98-style ptmx device.
\r
44 * -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
\r
48 struct tty_struct * redirect = NULL;
\r
50 -static void initialize_tty_struct(struct tty_struct *tty);
\r
51 +static int initialize_tty_struct(struct tty_struct *tty, int);
\r
53 static ssize_t tty_read(struct file *, char *, size_t, loff_t *);
\r
54 static ssize_t tty_write(struct file *, const char *, size_t, loff_t *);
\r
55 @@ -800,10 +803,14 @@
\r
59 - tty = (struct tty_struct*) get_free_page(GFP_KERNEL);
\r
60 + tty = (struct tty_struct*) kmalloc(sizeof(struct tty_struct), GFP_KERNEL);
\r
63 - initialize_tty_struct(tty);
\r
64 + memset(tty, 0, sizeof(struct tty_struct));
\r
65 + if (initialize_tty_struct(tty, driver->flip_size)) {
\r
69 tty->device = device;
\r
70 tty->driver = *driver;
\r
72 @@ -826,10 +833,15 @@
\r
75 if (driver->type == TTY_DRIVER_TYPE_PTY) {
\r
76 - o_tty = (struct tty_struct *) get_free_page(GFP_KERNEL);
\r
77 + o_tty = (struct tty_struct *) kmalloc(sizeof(struct tty_struct), GFP_KERNEL);
\r
80 - initialize_tty_struct(o_tty);
\r
81 + memset(o_tty, 0, sizeof(struct tty_struct));
\r
82 + if (initialize_tty_struct(o_tty, 512)) {
\r
85 + goto free_mem_out;
\r
87 o_tty->device = (kdev_t) MKDEV(driver->other->major,
\r
88 driver->other->minor_start + idx);
\r
89 o_tty->driver = *driver->other;
\r
90 @@ -945,13 +957,16 @@
\r
93 kfree_s(o_tp, sizeof(struct termios));
\r
95 - free_page((unsigned long) o_tty);
\r
97 + kfree(o_tty->flip.char_buf);
\r
101 kfree_s(ltp, sizeof(struct termios));
\r
103 kfree_s(tp, sizeof(struct termios));
\r
104 - free_page((unsigned long) tty);
\r
105 + kfree(tty->flip.char_buf);
\r
110 @@ -982,7 +997,8 @@
\r
113 (*o_tty->driver.refcount)--;
\r
114 - free_page((unsigned long) o_tty);
\r
115 + kfree(o_tty->flip.char_buf);
\r
119 tty->driver.table[idx] = NULL;
\r
120 @@ -993,7 +1009,8 @@
\r
123 (*tty->driver.refcount)--;
\r
124 - free_page((unsigned long) tty);
\r
125 + kfree(tty->flip.char_buf);
\r
130 @@ -1865,8 +1882,8 @@
\r
133 if (tty->flip.buf_num) {
\r
134 - cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
\r
135 - fp = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
\r
136 + cp = tty->flip.char_buf + tty->flip.flipbuf_size;
\r
137 + fp = tty->flip.flag_buf + tty->flip.flipbuf_size;
\r
138 tty->flip.buf_num = 0;
\r
140 save_flags(flags); cli();
\r
141 @@ -1878,8 +1895,8 @@
\r
142 tty->flip.buf_num = 1;
\r
144 save_flags(flags); cli();
\r
145 - tty->flip.char_buf_ptr = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
\r
146 - tty->flip.flag_buf_ptr = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
\r
147 + tty->flip.char_buf_ptr = tty->flip.char_buf + tty->flip.flipbuf_size;
\r
148 + tty->flip.flag_buf_ptr = tty->flip.flag_buf + tty->flip.flipbuf_size;
\r
150 count = tty->flip.count;
\r
151 tty->flip.count = 0;
\r
152 @@ -1943,9 +1960,16 @@
\r
154 * This subroutine initializes a tty structure.
\r
156 -static void initialize_tty_struct(struct tty_struct *tty)
\r
157 +static int initialize_tty_struct(struct tty_struct *tty, int flip_size)
\r
159 memset(tty, 0, sizeof(struct tty_struct));
\r
160 + /* there was notice about buffer overrun in original code -- that's why I do +4 */
\r
161 + tty->flip.char_buf = kmalloc(flip_size * 4 + 4, GFP_KERNEL);
\r
162 + if (!tty->flip.char_buf)
\r
165 + tty->flip.flag_buf = tty->flip.char_buf + flip_size * 2;
\r
166 + tty->flip.flipbuf_size = flip_size;
\r
167 tty->magic = TTY_MAGIC;
\r
168 tty->ldisc = ldiscs[N_TTY];
\r
170 @@ -1959,6 +1983,7 @@
\r
171 sema_init(&tty->atomic_read, 1);
\r
172 sema_init(&tty->atomic_write, 1);
\r
173 spin_lock_init(&tty->read_lock);
\r
178 @@ -1978,10 +2003,14 @@
\r
180 if (driver->flags & TTY_DRIVER_INSTALLED)
\r
183 + if (!(driver->flags & TTY_DRIVER_SPECIAL_FLIPSIZE))
\r
184 + driver->flip_size = 512;
\r
186 error = register_chrdev(driver->major, driver->name, &tty_fops);
\r
191 else if(driver->major == 0)
\r
192 driver->major = error;
\r
194 Only in linux-2.2.16/drivers/char: tty_io.c.orig
\r
195 diff -r -u loryg-2.2.16/include/linux/tty.h linux-2.2.16/include/linux/tty.h
\r
196 --- loryg-2.2.16/include/linux/tty.h Thu May 4 02:16:52 2000
\r
197 +++ linux-2.2.16/include/linux/tty.h Mon Aug 14 12:52:43 2000
\r
198 @@ -130,9 +130,10 @@
\r
201 * This is the flip buffer used for the tty driver. The buffer is
\r
202 - * located in the tty structure, and is used as a high speed interface
\r
203 - * between the tty driver and the tty line discipline.
\r
204 + * kmalloced, and is used as a high speed interface between tty driver
\r
205 + * and the line discipline.
\r
207 +/* HACK for old drivers, don't include this constant in new code */
\r
208 #define TTY_FLIPBUF_SIZE 512
\r
210 struct tty_flip_buffer {
\r
211 @@ -142,9 +143,9 @@
\r
212 unsigned char *flag_buf_ptr;
\r
215 - unsigned char char_buf[2*TTY_FLIPBUF_SIZE];
\r
216 - char flag_buf[2*TTY_FLIPBUF_SIZE];
\r
217 - unsigned char slop[4]; /* N.B. bug overwrites buffer by 1 */
\r
218 + int flipbuf_size;
\r
219 + unsigned char *char_buf;
\r
223 * The pty uses char_buf and flag_buf as a contiguous buffer
\r
224 diff -r -u loryg-2.2.16/include/linux/tty_driver.h linux-2.2.16/include/linux/tty_driver.h
\r
225 --- loryg-2.2.16/include/linux/tty_driver.h Tue May 11 19:35:45 1999
\r
226 +++ linux-2.2.16/include/linux/tty_driver.h Mon Aug 14 12:52:43 2000
\r
227 @@ -176,6 +176,7 @@
\r
229 struct tty_driver *next;
\r
230 struct tty_driver *prev;
\r
234 /* tty driver magic number */
\r
235 @@ -201,6 +202,8 @@
\r
236 #define TTY_DRIVER_INSTALLED 0x0001
\r
237 #define TTY_DRIVER_RESET_TERMIOS 0x0002
\r
238 #define TTY_DRIVER_REAL_RAW 0x0004
\r
239 +/* use big flip buffers (up to [30 KB] i.e. [((max kmalloc size) - 4) / 4 )] */
\r
240 +#define TTY_DRIVER_SPECIAL_FLIPSIZE 0x0010
\r
242 /* tty driver types */
\r
243 #define TTY_DRIVER_TYPE_SYSTEM 0x0001
\r