]>
Commit | Line | Data |
---|---|---|
ccbf3a89 | 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 | |
4 | @@ -386,7 +386,7 @@\r | |
5 | icount = &info->state->icount;\r | |
6 | do {\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 | |
10 | break;\r | |
11 | *tty->flip.char_buf_ptr = ch;\r | |
12 | icount->rx++;\r | |
13 | @@ -439,7 +439,7 @@\r | |
14 | * reported immediately, and doesn't\r | |
15 | * affect the current character\r | |
16 | */\r | |
17 | - if (tty->flip.count < TTY_FLIPBUF_SIZE) {\r | |
18 | + if (tty->flip.count < tty->flip.flipbuf_size) {\r | |
19 | tty->flip.count++;\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 | |
36 | @@ -52,6 +52,9 @@\r | |
37 | * Rewrote init_dev and release_dev to eliminate races.\r | |
38 | * -- Bill Hawes <whawes@star.net>, June 97\r | |
39 | *\r | |
40 | + * Added support for bigger flipbuf sizes\r | |
41 | + * -- Pavel Machek <pavel@ucw.cz>, June 99\r | |
42 | + *\r | |
43 | * Added support for a Unix98-style ptmx device.\r | |
44 | * -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998\r | |
45 | */\r | |
46 | @@ -115,7 +118,7 @@\r | |
47 | */\r | |
48 | struct tty_struct * redirect = NULL;\r | |
49 | \r | |
50 | -static void initialize_tty_struct(struct tty_struct *tty);\r | |
51 | +static int initialize_tty_struct(struct tty_struct *tty, int);\r | |
52 | \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 | |
56 | tp = o_tp = NULL;\r | |
57 | ltp = o_ltp = NULL;\r | |
58 | \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 | |
61 | if(!tty)\r | |
62 | goto fail_no_mem;\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 | |
66 | + kfree(tty);\r | |
67 | + goto fail_no_mem;\r | |
68 | + }\r | |
69 | tty->device = device;\r | |
70 | tty->driver = *driver;\r | |
71 | \r | |
72 | @@ -826,10 +833,15 @@\r | |
73 | }\r | |
74 | \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 | |
78 | if (!o_tty)\r | |
79 | goto free_mem_out;\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 | |
83 | + kfree(o_tty);\r | |
84 | + o_tty = NULL;\r | |
85 | + goto free_mem_out;\r | |
86 | + }\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 | |
91 | free_mem_out:\r | |
92 | if (o_tp)\r | |
93 | kfree_s(o_tp, sizeof(struct termios));\r | |
94 | - if (o_tty)\r | |
95 | - free_page((unsigned long) o_tty);\r | |
96 | + if (o_tty) {\r | |
97 | + kfree(o_tty->flip.char_buf);\r | |
98 | + kfree(o_tty);\r | |
99 | + }\r | |
100 | if (ltp)\r | |
101 | kfree_s(ltp, sizeof(struct termios));\r | |
102 | if (tp)\r | |
103 | kfree_s(tp, sizeof(struct termios));\r | |
104 | - free_page((unsigned long) tty);\r | |
105 | + kfree(tty->flip.char_buf);\r | |
106 | + kfree(tty);\r | |
107 | \r | |
108 | fail_no_mem:\r | |
109 | retval = -ENOMEM;\r | |
110 | @@ -982,7 +997,8 @@\r | |
111 | }\r | |
112 | o_tty->magic = 0;\r | |
113 | (*o_tty->driver.refcount)--;\r | |
114 | - free_page((unsigned long) o_tty);\r | |
115 | + kfree(o_tty->flip.char_buf);\r | |
116 | + kfree(o_tty);\r | |
117 | }\r | |
118 | \r | |
119 | tty->driver.table[idx] = NULL;\r | |
120 | @@ -993,7 +1009,8 @@\r | |
121 | }\r | |
122 | tty->magic = 0;\r | |
123 | (*tty->driver.refcount)--;\r | |
124 | - free_page((unsigned long) tty);\r | |
125 | + kfree(tty->flip.char_buf);\r | |
126 | + kfree(tty);\r | |
127 | }\r | |
128 | \r | |
129 | /*\r | |
130 | @@ -1865,8 +1882,8 @@\r | |
131 | return;\r | |
132 | }\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 | |
139 | \r | |
140 | save_flags(flags); cli();\r | |
141 | @@ -1878,8 +1895,8 @@\r | |
142 | tty->flip.buf_num = 1;\r | |
143 | \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 | |
149 | }\r | |
150 | count = tty->flip.count;\r | |
151 | tty->flip.count = 0;\r | |
152 | @@ -1943,9 +1960,16 @@\r | |
153 | /*\r | |
154 | * This subroutine initializes a tty structure.\r | |
155 | */\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 | |
158 | {\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 | |
163 | + return -ENOMEM;\r | |
164 | + \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 | |
169 | tty->pgrp = -1;\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 | |
174 | + return 0;\r | |
175 | }\r | |
176 | \r | |
177 | /*\r | |
178 | @@ -1978,10 +2003,14 @@\r | |
179 | \r | |
180 | if (driver->flags & TTY_DRIVER_INSTALLED)\r | |
181 | return 0;\r | |
182 | + \r | |
183 | + if (!(driver->flags & TTY_DRIVER_SPECIAL_FLIPSIZE))\r | |
184 | + driver->flip_size = 512;\r | |
185 | \r | |
186 | error = register_chrdev(driver->major, driver->name, &tty_fops);\r | |
187 | - if (error < 0)\r | |
188 | + if (error < 0) {\r | |
189 | return error;\r | |
190 | + }\r | |
191 | else if(driver->major == 0)\r | |
192 | driver->major = error;\r | |
193 | \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 | |
199 | \r | |
200 | /*\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 | |
206 | */\r | |
207 | +/* HACK for old drivers, don't include this constant in new code */\r | |
208 | #define TTY_FLIPBUF_SIZE 512\r | |
209 | \r | |
210 | struct tty_flip_buffer {\r | |
211 | @@ -142,9 +143,9 @@\r | |
212 | unsigned char *flag_buf_ptr;\r | |
213 | int count;\r | |
214 | int buf_num;\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 | |
220 | + char *flag_buf;\r | |
221 | };\r | |
222 | /*\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 | |
228 | */\r | |
229 | struct tty_driver *next;\r | |
230 | struct tty_driver *prev;\r | |
231 | + int flip_size;\r | |
232 | };\r | |
233 | \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 | |
241 | \r | |
242 | /* tty driver types */\r | |
243 | #define TTY_DRIVER_TYPE_SYSTEM 0x0001\r |