Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/char/amiserial.c (Version 2.6.31.13) and /linux/drivers/char/amiserial.c (Version 2.6.25.8)


  1 /*                                                  1 /*
  2  *  linux/drivers/char/amiserial.c                  2  *  linux/drivers/char/amiserial.c
  3  *                                                  3  *
  4  * Serial driver for the amiga builtin port.        4  * Serial driver for the amiga builtin port.
  5  *                                                  5  *
  6  * This code was created by taking serial.c ve      6  * This code was created by taking serial.c version 4.30 from kernel
  7  * release 2.3.22, replacing all hardware rela      7  * release 2.3.22, replacing all hardware related stuff with the
  8  * corresponding amiga hardware actions, and r      8  * corresponding amiga hardware actions, and removing all irrelevant
  9  * code. As a consequence, it uses many of the      9  * code. As a consequence, it uses many of the constants and names
 10  * associated with the registers and bits of 1     10  * associated with the registers and bits of 16550 compatible UARTS -
 11  * but only to keep track of status, etc in th     11  * but only to keep track of status, etc in the state variables. It
 12  * was done this was to make it easier to keep     12  * was done this was to make it easier to keep the code in line with
 13  * (non hardware specific) changes to serial.c     13  * (non hardware specific) changes to serial.c.
 14  *                                                 14  *
 15  * The port is registered with the tty driver      15  * The port is registered with the tty driver as minor device 64, and
 16  * therefore other ports should should only us     16  * therefore other ports should should only use 65 upwards.
 17  *                                                 17  *
 18  * Richard Lucock 28/12/99                         18  * Richard Lucock 28/12/99
 19  *                                                 19  *
 20  *  Copyright (C) 1991, 1992  Linus Torvalds       20  *  Copyright (C) 1991, 1992  Linus Torvalds
 21  *  Copyright (C) 1992, 1993, 1994, 1995, 1996     21  *  Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 
 22  *              1998, 1999  Theodore Ts'o          22  *              1998, 1999  Theodore Ts'o
 23  *                                                 23  *
 24  */                                                24  */
 25                                                    25 
 26 /*                                                 26 /*
 27  * Serial driver configuration section.  Here      27  * Serial driver configuration section.  Here are the various options:
 28  *                                                 28  *
 29  * SERIAL_PARANOIA_CHECK                           29  * SERIAL_PARANOIA_CHECK
 30  *              Check the magic number for the     30  *              Check the magic number for the async_structure where
 31  *              ever possible.                     31  *              ever possible.
 32  */                                                32  */
 33                                                    33 
 34 #include <linux/delay.h>                           34 #include <linux/delay.h>
 35                                                    35 
 36 #undef SERIAL_PARANOIA_CHECK                       36 #undef SERIAL_PARANOIA_CHECK
 37 #define SERIAL_DO_RESTART                          37 #define SERIAL_DO_RESTART
 38                                                    38 
 39 /* Set of debugging defines */                     39 /* Set of debugging defines */
 40                                                    40 
 41 #undef SERIAL_DEBUG_INTR                           41 #undef SERIAL_DEBUG_INTR
 42 #undef SERIAL_DEBUG_OPEN                           42 #undef SERIAL_DEBUG_OPEN
 43 #undef SERIAL_DEBUG_FLOW                           43 #undef SERIAL_DEBUG_FLOW
 44 #undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT             44 #undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
 45                                                    45 
 46 /* Sanity checks */                                46 /* Sanity checks */
 47                                                    47 
 48 #if defined(MODULE) && defined(SERIAL_DEBUG_MC     48 #if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT)
 49 #define DBG_CNT(s) printk("(%s): [%x] refc=%d,     49 #define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \
 50  tty->name, (info->flags), serial_driver->refc     50  tty->name, (info->flags), serial_driver->refcount,info->count,tty->count,s)
 51 #else                                              51 #else
 52 #define DBG_CNT(s)                                 52 #define DBG_CNT(s)
 53 #endif                                             53 #endif
 54                                                    54 
 55 /*                                                 55 /*
 56  * End of serial driver configuration section.     56  * End of serial driver configuration section.
 57  */                                                57  */
 58                                                    58 
 59 #include <linux/module.h>                          59 #include <linux/module.h>
 60                                                    60 
 61 #include <linux/types.h>                           61 #include <linux/types.h>
 62 #include <linux/serial.h>                          62 #include <linux/serial.h>
 63 #include <linux/serialP.h>                         63 #include <linux/serialP.h>
 64 #include <linux/serial_reg.h>                      64 #include <linux/serial_reg.h>
 65 static char *serial_version = "4.30";              65 static char *serial_version = "4.30";
 66                                                    66 
 67 #include <linux/errno.h>                           67 #include <linux/errno.h>
 68 #include <linux/signal.h>                          68 #include <linux/signal.h>
 69 #include <linux/sched.h>                           69 #include <linux/sched.h>
 70 #include <linux/kernel.h>                          70 #include <linux/kernel.h>
 71 #include <linux/timer.h>                           71 #include <linux/timer.h>
 72 #include <linux/interrupt.h>                       72 #include <linux/interrupt.h>
 73 #include <linux/tty.h>                             73 #include <linux/tty.h>
 74 #include <linux/tty_flip.h>                        74 #include <linux/tty_flip.h>
 75 #include <linux/console.h>                         75 #include <linux/console.h>
 76 #include <linux/major.h>                           76 #include <linux/major.h>
 77 #include <linux/string.h>                          77 #include <linux/string.h>
 78 #include <linux/fcntl.h>                           78 #include <linux/fcntl.h>
 79 #include <linux/ptrace.h>                          79 #include <linux/ptrace.h>
 80 #include <linux/ioport.h>                          80 #include <linux/ioport.h>
 81 #include <linux/mm.h>                              81 #include <linux/mm.h>
 82 #include <linux/seq_file.h>                    << 
 83 #include <linux/slab.h>                            82 #include <linux/slab.h>
 84 #include <linux/smp_lock.h>                    << 
 85 #include <linux/init.h>                            83 #include <linux/init.h>
 86 #include <linux/bitops.h>                          84 #include <linux/bitops.h>
 87                                                    85 
 88 #include <asm/setup.h>                             86 #include <asm/setup.h>
 89                                                    87 
 90 #include <asm/system.h>                            88 #include <asm/system.h>
 91                                                    89 
 92 #include <asm/irq.h>                               90 #include <asm/irq.h>
 93                                                    91 
 94 #include <asm/amigahw.h>                           92 #include <asm/amigahw.h>
 95 #include <asm/amigaints.h>                         93 #include <asm/amigaints.h>
 96                                                    94 
 97 #define custom amiga_custom                        95 #define custom amiga_custom
 98 static char *serial_name = "Amiga-builtin seri     96 static char *serial_name = "Amiga-builtin serial driver";
 99                                                    97 
100 static struct tty_driver *serial_driver;           98 static struct tty_driver *serial_driver;
101                                                    99 
102 /* number of characters left in xmit buffer be    100 /* number of characters left in xmit buffer before we ask for more */
103 #define WAKEUP_CHARS 256                          101 #define WAKEUP_CHARS 256
104                                                   102 
105 static struct async_struct *IRQ_ports;            103 static struct async_struct *IRQ_ports;
106                                                   104 
107 static unsigned char current_ctl_bits;            105 static unsigned char current_ctl_bits;
108                                                   106 
109 static void change_speed(struct async_struct *    107 static void change_speed(struct async_struct *info, struct ktermios *old);
110 static void rs_wait_until_sent(struct tty_stru    108 static void rs_wait_until_sent(struct tty_struct *tty, int timeout);
111                                                   109 
112                                                   110 
113 static struct serial_state rs_table[1];           111 static struct serial_state rs_table[1];
114                                                   112 
115 #define NR_PORTS ARRAY_SIZE(rs_table)             113 #define NR_PORTS ARRAY_SIZE(rs_table)
116                                                   114 
117 #include <asm/uaccess.h>                          115 #include <asm/uaccess.h>
118                                                   116 
119 #define serial_isroot() (capable(CAP_SYS_ADMIN    117 #define serial_isroot() (capable(CAP_SYS_ADMIN))
120                                                   118 
121                                                   119 
122 static inline int serial_paranoia_check(struct    120 static inline int serial_paranoia_check(struct async_struct *info,
123                                         char *    121                                         char *name, const char *routine)
124 {                                                 122 {
125 #ifdef SERIAL_PARANOIA_CHECK                      123 #ifdef SERIAL_PARANOIA_CHECK
126         static const char *badmagic =             124         static const char *badmagic =
127                 "Warning: bad magic number for    125                 "Warning: bad magic number for serial struct (%s) in %s\n";
128         static const char *badinfo =              126         static const char *badinfo =
129                 "Warning: null async_struct fo    127                 "Warning: null async_struct for (%s) in %s\n";
130                                                   128 
131         if (!info) {                              129         if (!info) {
132                 printk(badinfo, name, routine)    130                 printk(badinfo, name, routine);
133                 return 1;                         131                 return 1;
134         }                                         132         }
135         if (info->magic != SERIAL_MAGIC) {        133         if (info->magic != SERIAL_MAGIC) {
136                 printk(badmagic, name, routine    134                 printk(badmagic, name, routine);
137                 return 1;                         135                 return 1;
138         }                                         136         }
139 #endif                                            137 #endif
140         return 0;                                 138         return 0;
141 }                                                 139 }
142                                                   140 
143 /* some serial hardware definitions */            141 /* some serial hardware definitions */
144 #define SDR_OVRUN   (1<<15)                       142 #define SDR_OVRUN   (1<<15)
145 #define SDR_RBF     (1<<14)                       143 #define SDR_RBF     (1<<14)
146 #define SDR_TBE     (1<<13)                       144 #define SDR_TBE     (1<<13)
147 #define SDR_TSRE    (1<<12)                       145 #define SDR_TSRE    (1<<12)
148                                                   146 
149 #define SERPER_PARENB    (1<<15)                  147 #define SERPER_PARENB    (1<<15)
150                                                   148 
151 #define AC_SETCLR   (1<<15)                       149 #define AC_SETCLR   (1<<15)
152 #define AC_UARTBRK  (1<<11)                       150 #define AC_UARTBRK  (1<<11)
153                                                   151 
154 #define SER_DTR     (1<<7)                        152 #define SER_DTR     (1<<7)
155 #define SER_RTS     (1<<6)                        153 #define SER_RTS     (1<<6)
156 #define SER_DCD     (1<<5)                        154 #define SER_DCD     (1<<5)
157 #define SER_CTS     (1<<4)                        155 #define SER_CTS     (1<<4)
158 #define SER_DSR     (1<<3)                        156 #define SER_DSR     (1<<3)
159                                                   157 
160 static __inline__ void rtsdtr_ctrl(int bits)      158 static __inline__ void rtsdtr_ctrl(int bits)
161 {                                                 159 {
162     ciab.pra = ((bits & (SER_RTS | SER_DTR)) ^    160     ciab.pra = ((bits & (SER_RTS | SER_DTR)) ^ (SER_RTS | SER_DTR)) | (ciab.pra & ~(SER_RTS | SER_DTR));
163 }                                                 161 }
164                                                   162 
165 /*                                                163 /*
166  * -------------------------------------------    164  * ------------------------------------------------------------
167  * rs_stop() and rs_start()                       165  * rs_stop() and rs_start()
168  *                                                166  *
169  * This routines are called before setting or     167  * This routines are called before setting or resetting tty->stopped.
170  * They enable or disable transmitter interrup    168  * They enable or disable transmitter interrupts, as necessary.
171  * -------------------------------------------    169  * ------------------------------------------------------------
172  */                                               170  */
173 static void rs_stop(struct tty_struct *tty)       171 static void rs_stop(struct tty_struct *tty)
174 {                                                 172 {
175         struct async_struct *info = tty->drive !! 173         struct async_struct *info = (struct async_struct *)tty->driver_data;
176         unsigned long flags;                      174         unsigned long flags;
177                                                   175 
178         if (serial_paranoia_check(info, tty->n    176         if (serial_paranoia_check(info, tty->name, "rs_stop"))
179                 return;                           177                 return;
180                                                   178 
181         local_irq_save(flags);                    179         local_irq_save(flags);
182         if (info->IER & UART_IER_THRI) {          180         if (info->IER & UART_IER_THRI) {
183                 info->IER &= ~UART_IER_THRI;      181                 info->IER &= ~UART_IER_THRI;
184                 /* disable Tx interrupt and re    182                 /* disable Tx interrupt and remove any pending interrupts */
185                 custom.intena = IF_TBE;           183                 custom.intena = IF_TBE;
186                 mb();                             184                 mb();
187                 custom.intreq = IF_TBE;           185                 custom.intreq = IF_TBE;
188                 mb();                             186                 mb();
189         }                                         187         }
190         local_irq_restore(flags);                 188         local_irq_restore(flags);
191 }                                                 189 }
192                                                   190 
193 static void rs_start(struct tty_struct *tty)      191 static void rs_start(struct tty_struct *tty)
194 {                                                 192 {
195         struct async_struct *info = tty->drive !! 193         struct async_struct *info = (struct async_struct *)tty->driver_data;
196         unsigned long flags;                      194         unsigned long flags;
197                                                   195 
198         if (serial_paranoia_check(info, tty->n    196         if (serial_paranoia_check(info, tty->name, "rs_start"))
199                 return;                           197                 return;
200                                                   198 
201         local_irq_save(flags);                    199         local_irq_save(flags);
202         if (info->xmit.head != info->xmit.tail    200         if (info->xmit.head != info->xmit.tail
203             && info->xmit.buf                     201             && info->xmit.buf
204             && !(info->IER & UART_IER_THRI)) {    202             && !(info->IER & UART_IER_THRI)) {
205                 info->IER |= UART_IER_THRI;       203                 info->IER |= UART_IER_THRI;
206                 custom.intena = IF_SETCLR | IF    204                 custom.intena = IF_SETCLR | IF_TBE;
207                 mb();                             205                 mb();
208                 /* set a pending Tx Interrupt,    206                 /* set a pending Tx Interrupt, transmitter should restart now */
209                 custom.intreq = IF_SETCLR | IF    207                 custom.intreq = IF_SETCLR | IF_TBE;
210                 mb();                             208                 mb();
211         }                                         209         }
212         local_irq_restore(flags);                 210         local_irq_restore(flags);
213 }                                                 211 }
214                                                   212 
215 /*                                                213 /*
216  * -------------------------------------------    214  * ----------------------------------------------------------------------
217  *                                                215  *
218  * Here starts the interrupt handling routines    216  * Here starts the interrupt handling routines.  All of the following
219  * subroutines are declared as inline and are     217  * subroutines are declared as inline and are folded into
220  * rs_interrupt().  They were separated out fo    218  * rs_interrupt().  They were separated out for readability's sake.
221  *                                                219  *
222  * Note: rs_interrupt() is a "fast" interrupt,    220  * Note: rs_interrupt() is a "fast" interrupt, which means that it
223  * runs with interrupts turned off.  People wh    221  * runs with interrupts turned off.  People who may want to modify
224  * rs_interrupt() should try to keep the inter    222  * rs_interrupt() should try to keep the interrupt handler as fast as
225  * possible.  After you are done making modifi    223  * possible.  After you are done making modifications, it is not a bad
226  * idea to do:                                    224  * idea to do:
227  *                                                225  * 
228  * gcc -S -DKERNEL -Wall -Wstrict-prototypes -    226  * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c
229  *                                                227  *
230  * and look at the resulting assemble code in     228  * and look at the resulting assemble code in serial.s.
231  *                                                229  *
232  *                              - Ted Ts'o (ty    230  *                              - Ted Ts'o (tytso@mit.edu), 7-Mar-93
233  * -------------------------------------------    231  * -----------------------------------------------------------------------
234  */                                               232  */
235                                                   233 
236 /*                                                234 /*
237  * This routine is used by the interrupt handl    235  * This routine is used by the interrupt handler to schedule
238  * processing in the software interrupt portio    236  * processing in the software interrupt portion of the driver.
239  */                                               237  */
240 static void rs_sched_event(struct async_struct    238 static void rs_sched_event(struct async_struct *info,
241                            int event)             239                            int event)
242 {                                                 240 {
243         info->event |= 1 << event;                241         info->event |= 1 << event;
244         tasklet_schedule(&info->tlet);            242         tasklet_schedule(&info->tlet);
245 }                                                 243 }
246                                                   244 
247 static void receive_chars(struct async_struct     245 static void receive_chars(struct async_struct *info)
248 {                                                 246 {
249         int status;                               247         int status;
250         int serdatr;                              248         int serdatr;
251         struct tty_struct *tty = info->tty;       249         struct tty_struct *tty = info->tty;
252         unsigned char ch, flag;                   250         unsigned char ch, flag;
253         struct  async_icount *icount;             251         struct  async_icount *icount;
254         int oe = 0;                               252         int oe = 0;
255                                                   253 
256         icount = &info->state->icount;            254         icount = &info->state->icount;
257                                                   255 
258         status = UART_LSR_DR; /* We obviously     256         status = UART_LSR_DR; /* We obviously have a character! */
259         serdatr = custom.serdatr;                 257         serdatr = custom.serdatr;
260         mb();                                     258         mb();
261         custom.intreq = IF_RBF;                   259         custom.intreq = IF_RBF;
262         mb();                                     260         mb();
263                                                   261 
264         if((serdatr & 0x1ff) == 0)                262         if((serdatr & 0x1ff) == 0)
265             status |= UART_LSR_BI;                263             status |= UART_LSR_BI;
266         if(serdatr & SDR_OVRUN)                   264         if(serdatr & SDR_OVRUN)
267             status |= UART_LSR_OE;                265             status |= UART_LSR_OE;
268                                                   266 
269         ch = serdatr & 0xff;                      267         ch = serdatr & 0xff;
270         icount->rx++;                             268         icount->rx++;
271                                                   269 
272 #ifdef SERIAL_DEBUG_INTR                          270 #ifdef SERIAL_DEBUG_INTR
273         printk("DR%02x:%02x...", ch, status);     271         printk("DR%02x:%02x...", ch, status);
274 #endif                                            272 #endif
275         flag = TTY_NORMAL;                        273         flag = TTY_NORMAL;
276                                                   274 
277         /*                                        275         /*
278          * We don't handle parity or frame err    276          * We don't handle parity or frame errors - but I have left
279          * the code in, since I'm not sure tha    277          * the code in, since I'm not sure that the errors can't be
280          * detected.                              278          * detected.
281          */                                       279          */
282                                                   280 
283         if (status & (UART_LSR_BI | UART_LSR_P    281         if (status & (UART_LSR_BI | UART_LSR_PE |
284                       UART_LSR_FE | UART_LSR_O    282                       UART_LSR_FE | UART_LSR_OE)) {
285           /*                                      283           /*
286            * For statistics only                  284            * For statistics only
287            */                                     285            */
288           if (status & UART_LSR_BI) {             286           if (status & UART_LSR_BI) {
289             status &= ~(UART_LSR_FE | UART_LSR    287             status &= ~(UART_LSR_FE | UART_LSR_PE);
290             icount->brk++;                        288             icount->brk++;
291           } else if (status & UART_LSR_PE)        289           } else if (status & UART_LSR_PE)
292             icount->parity++;                     290             icount->parity++;
293           else if (status & UART_LSR_FE)          291           else if (status & UART_LSR_FE)
294             icount->frame++;                      292             icount->frame++;
295           if (status & UART_LSR_OE)               293           if (status & UART_LSR_OE)
296             icount->overrun++;                    294             icount->overrun++;
297                                                   295 
298           /*                                      296           /*
299            * Now check to see if character sho    297            * Now check to see if character should be
300            * ignored, and mask off conditions     298            * ignored, and mask off conditions which
301            * should be ignored.                   299            * should be ignored.
302            */                                     300            */
303           if (status & info->ignore_status_mas    301           if (status & info->ignore_status_mask)
304             goto out;                             302             goto out;
305                                                   303 
306           status &= info->read_status_mask;       304           status &= info->read_status_mask;
307                                                   305 
308           if (status & (UART_LSR_BI)) {           306           if (status & (UART_LSR_BI)) {
309 #ifdef SERIAL_DEBUG_INTR                          307 #ifdef SERIAL_DEBUG_INTR
310             printk("handling break....");         308             printk("handling break....");
311 #endif                                            309 #endif
312             flag = TTY_BREAK;                     310             flag = TTY_BREAK;
313             if (info->flags & ASYNC_SAK)          311             if (info->flags & ASYNC_SAK)
314               do_SAK(tty);                        312               do_SAK(tty);
315           } else if (status & UART_LSR_PE)        313           } else if (status & UART_LSR_PE)
316             flag = TTY_PARITY;                    314             flag = TTY_PARITY;
317           else if (status & UART_LSR_FE)          315           else if (status & UART_LSR_FE)
318             flag = TTY_FRAME;                     316             flag = TTY_FRAME;
319           if (status & UART_LSR_OE) {             317           if (status & UART_LSR_OE) {
320             /*                                    318             /*
321              * Overrun is special, since it's     319              * Overrun is special, since it's
322              * reported immediately, and doesn    320              * reported immediately, and doesn't
323              * affect the current character       321              * affect the current character
324              */                                   322              */
325              oe = 1;                              323              oe = 1;
326           }                                       324           }
327         }                                         325         }
328         tty_insert_flip_char(tty, ch, flag);      326         tty_insert_flip_char(tty, ch, flag);
329         if (oe == 1)                              327         if (oe == 1)
330                 tty_insert_flip_char(tty, 0, T    328                 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
331         tty_flip_buffer_push(tty);                329         tty_flip_buffer_push(tty);
332 out:                                              330 out:
333         return;                                   331         return;
334 }                                                 332 }
335                                                   333 
336 static void transmit_chars(struct async_struct    334 static void transmit_chars(struct async_struct *info)
337 {                                                 335 {
338         custom.intreq = IF_TBE;                   336         custom.intreq = IF_TBE;
339         mb();                                     337         mb();
340         if (info->x_char) {                       338         if (info->x_char) {
341                 custom.serdat = info->x_char |    339                 custom.serdat = info->x_char | 0x100;
342                 mb();                             340                 mb();
343                 info->state->icount.tx++;         341                 info->state->icount.tx++;
344                 info->x_char = 0;                 342                 info->x_char = 0;
345                 return;                           343                 return;
346         }                                         344         }
347         if (info->xmit.head == info->xmit.tail    345         if (info->xmit.head == info->xmit.tail
348             || info->tty->stopped                 346             || info->tty->stopped
349             || info->tty->hw_stopped) {           347             || info->tty->hw_stopped) {
350                 info->IER &= ~UART_IER_THRI;      348                 info->IER &= ~UART_IER_THRI;
351                 custom.intena = IF_TBE;           349                 custom.intena = IF_TBE;
352                 mb();                             350                 mb();
353                 return;                           351                 return;
354         }                                         352         }
355                                                   353 
356         custom.serdat = info->xmit.buf[info->x    354         custom.serdat = info->xmit.buf[info->xmit.tail++] | 0x100;
357         mb();                                     355         mb();
358         info->xmit.tail = info->xmit.tail & (S    356         info->xmit.tail = info->xmit.tail & (SERIAL_XMIT_SIZE-1);
359         info->state->icount.tx++;                 357         info->state->icount.tx++;
360                                                   358 
361         if (CIRC_CNT(info->xmit.head,             359         if (CIRC_CNT(info->xmit.head,
362                      info->xmit.tail,             360                      info->xmit.tail,
363                      SERIAL_XMIT_SIZE) < WAKEU    361                      SERIAL_XMIT_SIZE) < WAKEUP_CHARS)
364                 rs_sched_event(info, RS_EVENT_    362                 rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
365                                                   363 
366 #ifdef SERIAL_DEBUG_INTR                          364 #ifdef SERIAL_DEBUG_INTR
367         printk("THRE...");                        365         printk("THRE...");
368 #endif                                            366 #endif
369         if (info->xmit.head == info->xmit.tail    367         if (info->xmit.head == info->xmit.tail) {
370                 custom.intena = IF_TBE;           368                 custom.intena = IF_TBE;
371                 mb();                             369                 mb();
372                 info->IER &= ~UART_IER_THRI;      370                 info->IER &= ~UART_IER_THRI;
373         }                                         371         }
374 }                                                 372 }
375                                                   373 
376 static void check_modem_status(struct async_st    374 static void check_modem_status(struct async_struct *info)
377 {                                                 375 {
378         unsigned char status = ciab.pra & (SER    376         unsigned char status = ciab.pra & (SER_DCD | SER_CTS | SER_DSR);
379         unsigned char dstatus;                    377         unsigned char dstatus;
380         struct  async_icount *icount;             378         struct  async_icount *icount;
381                                                   379 
382         /* Determine bits that have changed */    380         /* Determine bits that have changed */
383         dstatus = status ^ current_ctl_bits;      381         dstatus = status ^ current_ctl_bits;
384         current_ctl_bits = status;                382         current_ctl_bits = status;
385                                                   383 
386         if (dstatus) {                            384         if (dstatus) {
387                 icount = &info->state->icount;    385                 icount = &info->state->icount;
388                 /* update input line counters     386                 /* update input line counters */
389                 if (dstatus & SER_DSR)            387                 if (dstatus & SER_DSR)
390                         icount->dsr++;            388                         icount->dsr++;
391                 if (dstatus & SER_DCD) {          389                 if (dstatus & SER_DCD) {
392                         icount->dcd++;            390                         icount->dcd++;
393 #ifdef CONFIG_HARD_PPS                            391 #ifdef CONFIG_HARD_PPS
394                         if ((info->flags & ASY    392                         if ((info->flags & ASYNC_HARDPPS_CD) &&
395                             !(status & SER_DCD    393                             !(status & SER_DCD))
396                                 hardpps();        394                                 hardpps();
397 #endif                                            395 #endif
398                 }                                 396                 }
399                 if (dstatus & SER_CTS)            397                 if (dstatus & SER_CTS)
400                         icount->cts++;            398                         icount->cts++;
401                 wake_up_interruptible(&info->d    399                 wake_up_interruptible(&info->delta_msr_wait);
402         }                                         400         }
403                                                   401 
404         if ((info->flags & ASYNC_CHECK_CD) &&     402         if ((info->flags & ASYNC_CHECK_CD) && (dstatus & SER_DCD)) {
405 #if (defined(SERIAL_DEBUG_OPEN) || defined(SER    403 #if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
406                 printk("ttyS%d CD now %s...",     404                 printk("ttyS%d CD now %s...", info->line,
407                        (!(status & SER_DCD)) ?    405                        (!(status & SER_DCD)) ? "on" : "off");
408 #endif                                            406 #endif
409                 if (!(status & SER_DCD))          407                 if (!(status & SER_DCD))
410                         wake_up_interruptible(    408                         wake_up_interruptible(&info->open_wait);
411                 else {                            409                 else {
412 #ifdef SERIAL_DEBUG_OPEN                          410 #ifdef SERIAL_DEBUG_OPEN
413                         printk("doing serial h    411                         printk("doing serial hangup...");
414 #endif                                            412 #endif
415                         if (info->tty)            413                         if (info->tty)
416                                 tty_hangup(inf    414                                 tty_hangup(info->tty);
417                 }                                 415                 }
418         }                                         416         }
419         if (info->flags & ASYNC_CTS_FLOW) {       417         if (info->flags & ASYNC_CTS_FLOW) {
420                 if (info->tty->hw_stopped) {      418                 if (info->tty->hw_stopped) {
421                         if (!(status & SER_CTS    419                         if (!(status & SER_CTS)) {
422 #if (defined(SERIAL_DEBUG_INTR) || defined(SER    420 #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
423                                 printk("CTS tx    421                                 printk("CTS tx start...");
424 #endif                                            422 #endif
425                                 info->tty->hw_    423                                 info->tty->hw_stopped = 0;
426                                 info->IER |= U    424                                 info->IER |= UART_IER_THRI;
427                                 custom.intena     425                                 custom.intena = IF_SETCLR | IF_TBE;
428                                 mb();             426                                 mb();
429                                 /* set a pendi    427                                 /* set a pending Tx Interrupt, transmitter should restart now */
430                                 custom.intreq     428                                 custom.intreq = IF_SETCLR | IF_TBE;
431                                 mb();             429                                 mb();
432                                 rs_sched_event    430                                 rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
433                                 return;           431                                 return;
434                         }                         432                         }
435                 } else {                          433                 } else {
436                         if ((status & SER_CTS)    434                         if ((status & SER_CTS)) {
437 #if (defined(SERIAL_DEBUG_INTR) || defined(SER    435 #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
438                                 printk("CTS tx    436                                 printk("CTS tx stop...");
439 #endif                                            437 #endif
440                                 info->tty->hw_    438                                 info->tty->hw_stopped = 1;
441                                 info->IER &= ~    439                                 info->IER &= ~UART_IER_THRI;
442                                 /* disable Tx     440                                 /* disable Tx interrupt and remove any pending interrupts */
443                                 custom.intena     441                                 custom.intena = IF_TBE;
444                                 mb();             442                                 mb();
445                                 custom.intreq     443                                 custom.intreq = IF_TBE;
446                                 mb();             444                                 mb();
447                         }                         445                         }
448                 }                                 446                 }
449         }                                         447         }
450 }                                                 448 }
451                                                   449 
452 static irqreturn_t ser_vbl_int( int irq, void     450 static irqreturn_t ser_vbl_int( int irq, void *data)
453 {                                                 451 {
454         /* vbl is just a periodic interrupt we    452         /* vbl is just a periodic interrupt we tie into to update modem status */
455         struct async_struct * info = IRQ_ports    453         struct async_struct * info = IRQ_ports;
456         /*                                        454         /*
457          * TBD - is it better to unregister fr    455          * TBD - is it better to unregister from this interrupt or to
458          * ignore it if MSI is clear ?            456          * ignore it if MSI is clear ?
459          */                                       457          */
460         if(info->IER & UART_IER_MSI)              458         if(info->IER & UART_IER_MSI)
461           check_modem_status(info);               459           check_modem_status(info);
462         return IRQ_HANDLED;                       460         return IRQ_HANDLED;
463 }                                                 461 }
464                                                   462 
465 static irqreturn_t ser_rx_int(int irq, void *d    463 static irqreturn_t ser_rx_int(int irq, void *dev_id)
466 {                                                 464 {
467         struct async_struct * info;               465         struct async_struct * info;
468                                                   466 
469 #ifdef SERIAL_DEBUG_INTR                          467 #ifdef SERIAL_DEBUG_INTR
470         printk("ser_rx_int...");                  468         printk("ser_rx_int...");
471 #endif                                            469 #endif
472                                                   470 
473         info = IRQ_ports;                         471         info = IRQ_ports;
474         if (!info || !info->tty)                  472         if (!info || !info->tty)
475                 return IRQ_NONE;                  473                 return IRQ_NONE;
476                                                   474 
477         receive_chars(info);                      475         receive_chars(info);
478         info->last_active = jiffies;              476         info->last_active = jiffies;
479 #ifdef SERIAL_DEBUG_INTR                          477 #ifdef SERIAL_DEBUG_INTR
480         printk("end.\n");                         478         printk("end.\n");
481 #endif                                            479 #endif
482         return IRQ_HANDLED;                       480         return IRQ_HANDLED;
483 }                                                 481 }
484                                                   482 
485 static irqreturn_t ser_tx_int(int irq, void *d    483 static irqreturn_t ser_tx_int(int irq, void *dev_id)
486 {                                                 484 {
487         struct async_struct * info;               485         struct async_struct * info;
488                                                   486 
489         if (custom.serdatr & SDR_TBE) {           487         if (custom.serdatr & SDR_TBE) {
490 #ifdef SERIAL_DEBUG_INTR                          488 #ifdef SERIAL_DEBUG_INTR
491           printk("ser_tx_int...");                489           printk("ser_tx_int...");
492 #endif                                            490 #endif
493                                                   491 
494           info = IRQ_ports;                       492           info = IRQ_ports;
495           if (!info || !info->tty)                493           if (!info || !info->tty)
496                 return IRQ_NONE;                  494                 return IRQ_NONE;
497                                                   495 
498           transmit_chars(info);                   496           transmit_chars(info);
499           info->last_active = jiffies;            497           info->last_active = jiffies;
500 #ifdef SERIAL_DEBUG_INTR                          498 #ifdef SERIAL_DEBUG_INTR
501           printk("end.\n");                       499           printk("end.\n");
502 #endif                                            500 #endif
503         }                                         501         }
504         return IRQ_HANDLED;                       502         return IRQ_HANDLED;
505 }                                                 503 }
506                                                   504 
507 /*                                                505 /*
508  * -------------------------------------------    506  * -------------------------------------------------------------------
509  * Here ends the serial interrupt routines.       507  * Here ends the serial interrupt routines.
510  * -------------------------------------------    508  * -------------------------------------------------------------------
511  */                                               509  */
512                                                   510 
513 /*                                                511 /*
514  * This routine is used to handle the "bottom     512  * This routine is used to handle the "bottom half" processing for the
515  * serial driver, known also the "software int    513  * serial driver, known also the "software interrupt" processing.
516  * This processing is done at the kernel inter    514  * This processing is done at the kernel interrupt level, after the
517  * rs_interrupt() has returned, BUT WITH INTER    515  * rs_interrupt() has returned, BUT WITH INTERRUPTS TURNED ON.  This
518  * is where time-consuming activities which ca    516  * is where time-consuming activities which can not be done in the
519  * interrupt driver proper are done; the inter    517  * interrupt driver proper are done; the interrupt driver schedules
520  * them using rs_sched_event(), and they get d    518  * them using rs_sched_event(), and they get done here.
521  */                                               519  */
522                                                   520 
523 static void do_softint(unsigned long private_)    521 static void do_softint(unsigned long private_)
524 {                                                 522 {
525         struct async_struct     *info = (struc    523         struct async_struct     *info = (struct async_struct *) private_;
526         struct tty_struct       *tty;             524         struct tty_struct       *tty;
527                                                   525 
528         tty = info->tty;                          526         tty = info->tty;
529         if (!tty)                                 527         if (!tty)
530                 return;                           528                 return;
531                                                   529 
532         if (test_and_clear_bit(RS_EVENT_WRITE_    530         if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event))
533                 tty_wakeup(tty);                  531                 tty_wakeup(tty);
534 }                                                 532 }
535                                                   533 
536 /*                                                534 /*
537  * -------------------------------------------    535  * ---------------------------------------------------------------
538  * Low level utility subroutines for the seria    536  * Low level utility subroutines for the serial driver:  routines to
539  * figure out the appropriate timeout for an i    537  * figure out the appropriate timeout for an interrupt chain, routines
540  * to initialize and startup a serial port, an    538  * to initialize and startup a serial port, and routines to shutdown a
541  * serial port.  Useful stuff like that.          539  * serial port.  Useful stuff like that.
542  * -------------------------------------------    540  * ---------------------------------------------------------------
543  */                                               541  */
544                                                   542 
545 static int startup(struct async_struct * info)    543 static int startup(struct async_struct * info)
546 {                                                 544 {
547         unsigned long flags;                      545         unsigned long flags;
548         int     retval=0;                         546         int     retval=0;
549         unsigned long page;                       547         unsigned long page;
550                                                   548 
551         page = get_zeroed_page(GFP_KERNEL);       549         page = get_zeroed_page(GFP_KERNEL);
552         if (!page)                                550         if (!page)
553                 return -ENOMEM;                   551                 return -ENOMEM;
554                                                   552 
555         local_irq_save(flags);                    553         local_irq_save(flags);
556                                                   554 
557         if (info->flags & ASYNC_INITIALIZED) {    555         if (info->flags & ASYNC_INITIALIZED) {
558                 free_page(page);                  556                 free_page(page);
559                 goto errout;                      557                 goto errout;
560         }                                         558         }
561                                                   559 
562         if (info->xmit.buf)                       560         if (info->xmit.buf)
563                 free_page(page);                  561                 free_page(page);
564         else                                      562         else
565                 info->xmit.buf = (unsigned cha    563                 info->xmit.buf = (unsigned char *) page;
566                                                   564 
567 #ifdef SERIAL_DEBUG_OPEN                          565 #ifdef SERIAL_DEBUG_OPEN
568         printk("starting up ttys%d ...", info-    566         printk("starting up ttys%d ...", info->line);
569 #endif                                            567 #endif
570                                                   568 
571         /* Clear anything in the input buffer     569         /* Clear anything in the input buffer */
572                                                   570 
573         custom.intreq = IF_RBF;                   571         custom.intreq = IF_RBF;
574         mb();                                     572         mb();
575                                                   573 
576         retval = request_irq(IRQ_AMIGA_VERTB,     574         retval = request_irq(IRQ_AMIGA_VERTB, ser_vbl_int, 0, "serial status", info);
577         if (retval) {                             575         if (retval) {
578           if (serial_isroot()) {                  576           if (serial_isroot()) {
579             if (info->tty)                        577             if (info->tty)
580               set_bit(TTY_IO_ERROR,               578               set_bit(TTY_IO_ERROR,
581                       &info->tty->flags);         579                       &info->tty->flags);
582             retval = 0;                           580             retval = 0;
583           }                                       581           }
584           goto errout;                            582           goto errout;
585         }                                         583         }
586                                                   584 
587         /* enable both Rx and Tx interrupts */    585         /* enable both Rx and Tx interrupts */
588         custom.intena = IF_SETCLR | IF_RBF | I    586         custom.intena = IF_SETCLR | IF_RBF | IF_TBE;
589         mb();                                     587         mb();
590         info->IER = UART_IER_MSI;                 588         info->IER = UART_IER_MSI;
591                                                   589 
592         /* remember current state of the DCD a    590         /* remember current state of the DCD and CTS bits */
593         current_ctl_bits = ciab.pra & (SER_DCD    591         current_ctl_bits = ciab.pra & (SER_DCD | SER_CTS | SER_DSR);
594                                                   592 
595         IRQ_ports = info;                         593         IRQ_ports = info;
596                                                   594 
597         info->MCR = 0;                            595         info->MCR = 0;
598         if (info->tty->termios->c_cflag & CBAU    596         if (info->tty->termios->c_cflag & CBAUD)
599           info->MCR = SER_DTR | SER_RTS;          597           info->MCR = SER_DTR | SER_RTS;
600         rtsdtr_ctrl(info->MCR);                   598         rtsdtr_ctrl(info->MCR);
601                                                   599 
602         if (info->tty)                            600         if (info->tty)
603                 clear_bit(TTY_IO_ERROR, &info-    601                 clear_bit(TTY_IO_ERROR, &info->tty->flags);
604         info->xmit.head = info->xmit.tail = 0;    602         info->xmit.head = info->xmit.tail = 0;
605                                                   603 
606         /*                                        604         /*
607          * Set up the tty->alt_speed kludge       605          * Set up the tty->alt_speed kludge
608          */                                       606          */
609         if (info->tty) {                          607         if (info->tty) {
610                 if ((info->flags & ASYNC_SPD_M    608                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
611                         info->tty->alt_speed =    609                         info->tty->alt_speed = 57600;
612                 if ((info->flags & ASYNC_SPD_M    610                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
613                         info->tty->alt_speed =    611                         info->tty->alt_speed = 115200;
614                 if ((info->flags & ASYNC_SPD_M    612                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
615                         info->tty->alt_speed =    613                         info->tty->alt_speed = 230400;
616                 if ((info->flags & ASYNC_SPD_M    614                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
617                         info->tty->alt_speed =    615                         info->tty->alt_speed = 460800;
618         }                                         616         }
619                                                   617 
620         /*                                        618         /*
621          * and set the speed of the serial por    619          * and set the speed of the serial port
622          */                                       620          */
623         change_speed(info, NULL);                 621         change_speed(info, NULL);
624                                                   622 
625         info->flags |= ASYNC_INITIALIZED;         623         info->flags |= ASYNC_INITIALIZED;
626         local_irq_restore(flags);                 624         local_irq_restore(flags);
627         return 0;                                 625         return 0;
628                                                   626 
629 errout:                                           627 errout:
630         local_irq_restore(flags);                 628         local_irq_restore(flags);
631         return retval;                            629         return retval;
632 }                                                 630 }
633                                                   631 
634 /*                                                632 /*
635  * This routine will shutdown a serial port; i    633  * This routine will shutdown a serial port; interrupts are disabled, and
636  * DTR is dropped if the hangup on close termi    634  * DTR is dropped if the hangup on close termio flag is on.
637  */                                               635  */
638 static void shutdown(struct async_struct * inf    636 static void shutdown(struct async_struct * info)
639 {                                                 637 {
640         unsigned long   flags;                    638         unsigned long   flags;
641         struct serial_state *state;               639         struct serial_state *state;
642                                                   640 
643         if (!(info->flags & ASYNC_INITIALIZED)    641         if (!(info->flags & ASYNC_INITIALIZED))
644                 return;                           642                 return;
645                                                   643 
646         state = info->state;                      644         state = info->state;
647                                                   645 
648 #ifdef SERIAL_DEBUG_OPEN                          646 #ifdef SERIAL_DEBUG_OPEN
649         printk("Shutting down serial port %d .    647         printk("Shutting down serial port %d ....\n", info->line);
650 #endif                                            648 #endif
651                                                   649 
652         local_irq_save(flags); /* Disable inte    650         local_irq_save(flags); /* Disable interrupts */
653                                                   651 
654         /*                                        652         /*
655          * clear delta_msr_wait queue to avoid    653          * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
656          * here so the queue might never be wa    654          * here so the queue might never be waken up
657          */                                       655          */
658         wake_up_interruptible(&info->delta_msr    656         wake_up_interruptible(&info->delta_msr_wait);
659                                                   657 
660         IRQ_ports = NULL;                         658         IRQ_ports = NULL;
661                                                   659 
662         /*                                        660         /*
663          * Free the IRQ, if necessary             661          * Free the IRQ, if necessary
664          */                                       662          */
665         free_irq(IRQ_AMIGA_VERTB, info);          663         free_irq(IRQ_AMIGA_VERTB, info);
666                                                   664 
667         if (info->xmit.buf) {                     665         if (info->xmit.buf) {
668                 free_page((unsigned long) info    666                 free_page((unsigned long) info->xmit.buf);
669                 info->xmit.buf = NULL;            667                 info->xmit.buf = NULL;
670         }                                         668         }
671                                                   669 
672         info->IER = 0;                            670         info->IER = 0;
673         custom.intena = IF_RBF | IF_TBE;          671         custom.intena = IF_RBF | IF_TBE;
674         mb();                                     672         mb();
675                                                   673 
676         /* disable break condition */             674         /* disable break condition */
677         custom.adkcon = AC_UARTBRK;               675         custom.adkcon = AC_UARTBRK;
678         mb();                                     676         mb();
679                                                   677 
680         if (!info->tty || (info->tty->termios-    678         if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
681                 info->MCR &= ~(SER_DTR|SER_RTS    679                 info->MCR &= ~(SER_DTR|SER_RTS);
682         rtsdtr_ctrl(info->MCR);                   680         rtsdtr_ctrl(info->MCR);
683                                                   681 
684         if (info->tty)                            682         if (info->tty)
685                 set_bit(TTY_IO_ERROR, &info->t    683                 set_bit(TTY_IO_ERROR, &info->tty->flags);
686                                                   684 
687         info->flags &= ~ASYNC_INITIALIZED;        685         info->flags &= ~ASYNC_INITIALIZED;
688         local_irq_restore(flags);                 686         local_irq_restore(flags);
689 }                                                 687 }
690                                                   688 
691                                                   689 
692 /*                                                690 /*
693  * This routine is called to set the UART divi    691  * This routine is called to set the UART divisor registers to match
694  * the specified baud rate for a serial port.     692  * the specified baud rate for a serial port.
695  */                                               693  */
696 static void change_speed(struct async_struct *    694 static void change_speed(struct async_struct *info,
697                          struct ktermios *old_    695                          struct ktermios *old_termios)
698 {                                                 696 {
699         int     quot = 0, baud_base, baud;        697         int     quot = 0, baud_base, baud;
700         unsigned cflag, cval = 0;                 698         unsigned cflag, cval = 0;
701         int     bits;                             699         int     bits;
702         unsigned long   flags;                    700         unsigned long   flags;
703                                                   701 
704         if (!info->tty || !info->tty->termios)    702         if (!info->tty || !info->tty->termios)
705                 return;                           703                 return;
706         cflag = info->tty->termios->c_cflag;      704         cflag = info->tty->termios->c_cflag;
707                                                   705 
708         /* Byte size is always 8 bits plus par    706         /* Byte size is always 8 bits plus parity bit if requested */
709                                                   707 
710         cval = 3; bits = 10;                      708         cval = 3; bits = 10;
711         if (cflag & CSTOPB) {                     709         if (cflag & CSTOPB) {
712                 cval |= 0x04;                     710                 cval |= 0x04;
713                 bits++;                           711                 bits++;
714         }                                         712         }
715         if (cflag & PARENB) {                     713         if (cflag & PARENB) {
716                 cval |= UART_LCR_PARITY;          714                 cval |= UART_LCR_PARITY;
717                 bits++;                           715                 bits++;
718         }                                         716         }
719         if (!(cflag & PARODD))                    717         if (!(cflag & PARODD))
720                 cval |= UART_LCR_EPAR;            718                 cval |= UART_LCR_EPAR;
721 #ifdef CMSPAR                                     719 #ifdef CMSPAR
722         if (cflag & CMSPAR)                       720         if (cflag & CMSPAR)
723                 cval |= UART_LCR_SPAR;            721                 cval |= UART_LCR_SPAR;
724 #endif                                            722 #endif
725                                                   723 
726         /* Determine divisor based on baud rat    724         /* Determine divisor based on baud rate */
727         baud = tty_get_baud_rate(info->tty);      725         baud = tty_get_baud_rate(info->tty);
728         if (!baud)                                726         if (!baud)
729                 baud = 9600;    /* B0 transiti    727                 baud = 9600;    /* B0 transition handled in rs_set_termios */
730         baud_base = info->state->baud_base;       728         baud_base = info->state->baud_base;
731         if (baud == 38400 &&                      729         if (baud == 38400 &&
732             ((info->flags & ASYNC_SPD_MASK) ==    730             ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST))
733                 quot = info->state->custom_div    731                 quot = info->state->custom_divisor;
734         else {                                    732         else {
735                 if (baud == 134)                  733                 if (baud == 134)
736                         /* Special case since     734                         /* Special case since 134 is really 134.5 */
737                         quot = (2*baud_base /     735                         quot = (2*baud_base / 269);
738                 else if (baud)                    736                 else if (baud)
739                         quot = baud_base / bau    737                         quot = baud_base / baud;
740         }                                         738         }
741         /* If the quotient is zero refuse the     739         /* If the quotient is zero refuse the change */
742         if (!quot && old_termios) {               740         if (!quot && old_termios) {
743                 /* FIXME: Will need updating f    741                 /* FIXME: Will need updating for new tty in the end */
744                 info->tty->termios->c_cflag &=    742                 info->tty->termios->c_cflag &= ~CBAUD;
745                 info->tty->termios->c_cflag |=    743                 info->tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD);
746                 baud = tty_get_baud_rate(info-    744                 baud = tty_get_baud_rate(info->tty);
747                 if (!baud)                        745                 if (!baud)
748                         baud = 9600;              746                         baud = 9600;
749                 if (baud == 38400 &&              747                 if (baud == 38400 &&
750                     ((info->flags & ASYNC_SPD_    748                     ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST))
751                         quot = info->state->cu    749                         quot = info->state->custom_divisor;
752                 else {                            750                 else {
753                         if (baud == 134)          751                         if (baud == 134)
754                                 /* Special cas    752                                 /* Special case since 134 is really 134.5 */
755                                 quot = (2*baud    753                                 quot = (2*baud_base / 269);
756                         else if (baud)            754                         else if (baud)
757                                 quot = baud_ba    755                                 quot = baud_base / baud;
758                 }                                 756                 }
759         }                                         757         }
760         /* As a last resort, if the quotient i    758         /* As a last resort, if the quotient is zero, default to 9600 bps */
761         if (!quot)                                759         if (!quot)
762                 quot = baud_base / 9600;          760                 quot = baud_base / 9600;
763         info->quot = quot;                        761         info->quot = quot;
764         info->timeout = ((info->xmit_fifo_size    762         info->timeout = ((info->xmit_fifo_size*HZ*bits*quot) / baud_base);
765         info->timeout += HZ/50;         /* Add    763         info->timeout += HZ/50;         /* Add .02 seconds of slop */
766                                                   764 
767         /* CTS flow control flag and modem sta    765         /* CTS flow control flag and modem status interrupts */
768         info->IER &= ~UART_IER_MSI;               766         info->IER &= ~UART_IER_MSI;
769         if (info->flags & ASYNC_HARDPPS_CD)       767         if (info->flags & ASYNC_HARDPPS_CD)
770                 info->IER |= UART_IER_MSI;        768                 info->IER |= UART_IER_MSI;
771         if (cflag & CRTSCTS) {                    769         if (cflag & CRTSCTS) {
772                 info->flags |= ASYNC_CTS_FLOW;    770                 info->flags |= ASYNC_CTS_FLOW;
773                 info->IER |= UART_IER_MSI;        771                 info->IER |= UART_IER_MSI;
774         } else                                    772         } else
775                 info->flags &= ~ASYNC_CTS_FLOW    773                 info->flags &= ~ASYNC_CTS_FLOW;
776         if (cflag & CLOCAL)                       774         if (cflag & CLOCAL)
777                 info->flags &= ~ASYNC_CHECK_CD    775                 info->flags &= ~ASYNC_CHECK_CD;
778         else {                                    776         else {
779                 info->flags |= ASYNC_CHECK_CD;    777                 info->flags |= ASYNC_CHECK_CD;
780                 info->IER |= UART_IER_MSI;        778                 info->IER |= UART_IER_MSI;
781         }                                         779         }
782         /* TBD:                                   780         /* TBD:
783          * Does clearing IER_MSI imply that we !! 781          * Does clearing IER_MSI imply that we should disbale the VBL interrupt ?
784          */                                       782          */
785                                                   783 
786         /*                                        784         /*
787          * Set up parity check flag               785          * Set up parity check flag
788          */                                       786          */
789                                                   787 
790         info->read_status_mask = UART_LSR_OE |    788         info->read_status_mask = UART_LSR_OE | UART_LSR_DR;
791         if (I_INPCK(info->tty))                   789         if (I_INPCK(info->tty))
792                 info->read_status_mask |= UART    790                 info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
793         if (I_BRKINT(info->tty) || I_PARMRK(in    791         if (I_BRKINT(info->tty) || I_PARMRK(info->tty))
794                 info->read_status_mask |= UART    792                 info->read_status_mask |= UART_LSR_BI;
795                                                   793 
796         /*                                        794         /*
797          * Characters to ignore                   795          * Characters to ignore
798          */                                       796          */
799         info->ignore_status_mask = 0;             797         info->ignore_status_mask = 0;
800         if (I_IGNPAR(info->tty))                  798         if (I_IGNPAR(info->tty))
801                 info->ignore_status_mask |= UA    799                 info->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
802         if (I_IGNBRK(info->tty)) {                800         if (I_IGNBRK(info->tty)) {
803                 info->ignore_status_mask |= UA    801                 info->ignore_status_mask |= UART_LSR_BI;
804                 /*                                802                 /*
805                  * If we're ignore parity and     803                  * If we're ignore parity and break indicators, ignore 
806                  * overruns too.  (For real ra    804                  * overruns too.  (For real raw support).
807                  */                               805                  */
808                 if (I_IGNPAR(info->tty))          806                 if (I_IGNPAR(info->tty))
809                         info->ignore_status_ma    807                         info->ignore_status_mask |= UART_LSR_OE;
810         }                                         808         }
811         /*                                        809         /*
812          * !!! ignore all characters if CREAD     810          * !!! ignore all characters if CREAD is not set
813          */                                       811          */
814         if ((cflag & CREAD) == 0)                 812         if ((cflag & CREAD) == 0)
815                 info->ignore_status_mask |= UA    813                 info->ignore_status_mask |= UART_LSR_DR;
816         local_irq_save(flags);                    814         local_irq_save(flags);
817                                                   815 
818         {                                         816         {
819           short serper;                           817           short serper;
820                                                   818 
821         /* Set up the baud rate */                819         /* Set up the baud rate */
822           serper = quot - 1;                      820           serper = quot - 1;
823                                                   821 
824         /* Enable or disable parity bit */        822         /* Enable or disable parity bit */
825                                                   823 
826         if(cval & UART_LCR_PARITY)                824         if(cval & UART_LCR_PARITY)
827           serper |= (SERPER_PARENB);              825           serper |= (SERPER_PARENB);
828                                                   826 
829         custom.serper = serper;                   827         custom.serper = serper;
830         mb();                                     828         mb();
831         }                                         829         }
832                                                   830 
833         info->LCR = cval;                         831         info->LCR = cval;                               /* Save LCR */
834         local_irq_restore(flags);                 832         local_irq_restore(flags);
835 }                                                 833 }
836                                                   834 
837 static int rs_put_char(struct tty_struct *tty, !! 835 static void rs_put_char(struct tty_struct *tty, unsigned char ch)
838 {                                                 836 {
839         struct async_struct *info;                837         struct async_struct *info;
840         unsigned long flags;                      838         unsigned long flags;
841                                                   839 
                                                   >> 840         if (!tty)
                                                   >> 841                 return;
                                                   >> 842 
842         info = tty->driver_data;                  843         info = tty->driver_data;
843                                                   844 
844         if (serial_paranoia_check(info, tty->n    845         if (serial_paranoia_check(info, tty->name, "rs_put_char"))
845                 return 0;                      !! 846                 return;
846                                                   847 
847         if (!info->xmit.buf)                      848         if (!info->xmit.buf)
848                 return 0;                      !! 849                 return;
849                                                   850 
850         local_irq_save(flags);                    851         local_irq_save(flags);
851         if (CIRC_SPACE(info->xmit.head,           852         if (CIRC_SPACE(info->xmit.head,
852                        info->xmit.tail,           853                        info->xmit.tail,
853                        SERIAL_XMIT_SIZE) == 0)    854                        SERIAL_XMIT_SIZE) == 0) {
854                 local_irq_restore(flags);         855                 local_irq_restore(flags);
855                 return 0;                      !! 856                 return;
856         }                                         857         }
857                                                   858 
858         info->xmit.buf[info->xmit.head++] = ch    859         info->xmit.buf[info->xmit.head++] = ch;
859         info->xmit.head &= SERIAL_XMIT_SIZE-1;    860         info->xmit.head &= SERIAL_XMIT_SIZE-1;
860         local_irq_restore(flags);                 861         local_irq_restore(flags);
861         return 1;                              << 
862 }                                                 862 }
863                                                   863 
864 static void rs_flush_chars(struct tty_struct *    864 static void rs_flush_chars(struct tty_struct *tty)
865 {                                                 865 {
866         struct async_struct *info = tty->drive !! 866         struct async_struct *info = (struct async_struct *)tty->driver_data;
867         unsigned long flags;                      867         unsigned long flags;
868                                                   868 
869         if (serial_paranoia_check(info, tty->n    869         if (serial_paranoia_check(info, tty->name, "rs_flush_chars"))
870                 return;                           870                 return;
871                                                   871 
872         if (info->xmit.head == info->xmit.tail    872         if (info->xmit.head == info->xmit.tail
873             || tty->stopped                       873             || tty->stopped
874             || tty->hw_stopped                    874             || tty->hw_stopped
875             || !info->xmit.buf)                   875             || !info->xmit.buf)
876                 return;                           876                 return;
877                                                   877 
878         local_irq_save(flags);                    878         local_irq_save(flags);
879         info->IER |= UART_IER_THRI;               879         info->IER |= UART_IER_THRI;
880         custom.intena = IF_SETCLR | IF_TBE;       880         custom.intena = IF_SETCLR | IF_TBE;
881         mb();                                     881         mb();
882         /* set a pending Tx Interrupt, transmi    882         /* set a pending Tx Interrupt, transmitter should restart now */
883         custom.intreq = IF_SETCLR | IF_TBE;       883         custom.intreq = IF_SETCLR | IF_TBE;
884         mb();                                     884         mb();
885         local_irq_restore(flags);                 885         local_irq_restore(flags);
886 }                                                 886 }
887                                                   887 
888 static int rs_write(struct tty_struct * tty, c    888 static int rs_write(struct tty_struct * tty, const unsigned char *buf, int count)
889 {                                                 889 {
890         int     c, ret = 0;                       890         int     c, ret = 0;
891         struct async_struct *info;                891         struct async_struct *info;
892         unsigned long flags;                      892         unsigned long flags;
893                                                   893 
                                                   >> 894         if (!tty)
                                                   >> 895                 return 0;
                                                   >> 896 
894         info = tty->driver_data;                  897         info = tty->driver_data;
895                                                   898 
896         if (serial_paranoia_check(info, tty->n    899         if (serial_paranoia_check(info, tty->name, "rs_write"))
897                 return 0;                         900                 return 0;
898                                                   901 
899         if (!info->xmit.buf)                      902         if (!info->xmit.buf)
900                 return 0;                         903                 return 0;
901                                                   904 
902         local_irq_save(flags);                    905         local_irq_save(flags);
903         while (1) {                               906         while (1) {
904                 c = CIRC_SPACE_TO_END(info->xm    907                 c = CIRC_SPACE_TO_END(info->xmit.head,
905                                       info->xm    908                                       info->xmit.tail,
906                                       SERIAL_X    909                                       SERIAL_XMIT_SIZE);
907                 if (count < c)                    910                 if (count < c)
908                         c = count;                911                         c = count;
909                 if (c <= 0) {                     912                 if (c <= 0) {
910                         break;                    913                         break;
911                 }                                 914                 }
912                 memcpy(info->xmit.buf + info->    915                 memcpy(info->xmit.buf + info->xmit.head, buf, c);
913                 info->xmit.head = ((info->xmit    916                 info->xmit.head = ((info->xmit.head + c) &
914                                    (SERIAL_XMI    917                                    (SERIAL_XMIT_SIZE-1));
915                 buf += c;                         918                 buf += c;
916                 count -= c;                       919                 count -= c;
917                 ret += c;                         920                 ret += c;
918         }                                         921         }
919         local_irq_restore(flags);                 922         local_irq_restore(flags);
920                                                   923 
921         if (info->xmit.head != info->xmit.tail    924         if (info->xmit.head != info->xmit.tail
922             && !tty->stopped                      925             && !tty->stopped
923             && !tty->hw_stopped                   926             && !tty->hw_stopped
924             && !(info->IER & UART_IER_THRI)) {    927             && !(info->IER & UART_IER_THRI)) {
925                 info->IER |= UART_IER_THRI;       928                 info->IER |= UART_IER_THRI;
926                 local_irq_disable();              929                 local_irq_disable();
927                 custom.intena = IF_SETCLR | IF    930                 custom.intena = IF_SETCLR | IF_TBE;
928                 mb();                             931                 mb();
929                 /* set a pending Tx Interrupt,    932                 /* set a pending Tx Interrupt, transmitter should restart now */
930                 custom.intreq = IF_SETCLR | IF    933                 custom.intreq = IF_SETCLR | IF_TBE;
931                 mb();                             934                 mb();
932                 local_irq_restore(flags);         935                 local_irq_restore(flags);
933         }                                         936         }
934         return ret;                               937         return ret;
935 }                                                 938 }
936                                                   939 
937 static int rs_write_room(struct tty_struct *tt    940 static int rs_write_room(struct tty_struct *tty)
938 {                                                 941 {
939         struct async_struct *info = tty->drive !! 942         struct async_struct *info = (struct async_struct *)tty->driver_data;
940                                                   943 
941         if (serial_paranoia_check(info, tty->n    944         if (serial_paranoia_check(info, tty->name, "rs_write_room"))
942                 return 0;                         945                 return 0;
943         return CIRC_SPACE(info->xmit.head, inf    946         return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
944 }                                                 947 }
945                                                   948 
946 static int rs_chars_in_buffer(struct tty_struc    949 static int rs_chars_in_buffer(struct tty_struct *tty)
947 {                                                 950 {
948         struct async_struct *info = tty->drive !! 951         struct async_struct *info = (struct async_struct *)tty->driver_data;
949                                                   952 
950         if (serial_paranoia_check(info, tty->n    953         if (serial_paranoia_check(info, tty->name, "rs_chars_in_buffer"))
951                 return 0;                         954                 return 0;
952         return CIRC_CNT(info->xmit.head, info-    955         return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
953 }                                                 956 }
954                                                   957 
955 static void rs_flush_buffer(struct tty_struct     958 static void rs_flush_buffer(struct tty_struct *tty)
956 {                                                 959 {
957         struct async_struct *info = tty->drive !! 960         struct async_struct *info = (struct async_struct *)tty->driver_data;
958         unsigned long flags;                      961         unsigned long flags;
959                                                   962 
960         if (serial_paranoia_check(info, tty->n    963         if (serial_paranoia_check(info, tty->name, "rs_flush_buffer"))
961                 return;                           964                 return;
962         local_irq_save(flags);                    965         local_irq_save(flags);
963         info->xmit.head = info->xmit.tail = 0;    966         info->xmit.head = info->xmit.tail = 0;
964         local_irq_restore(flags);                 967         local_irq_restore(flags);
965         tty_wakeup(tty);                          968         tty_wakeup(tty);
966 }                                                 969 }
967                                                   970 
968 /*                                                971 /*
969  * This function is used to send a high-priori    972  * This function is used to send a high-priority XON/XOFF character to
970  * the device                                     973  * the device
971  */                                               974  */
972 static void rs_send_xchar(struct tty_struct *t    975 static void rs_send_xchar(struct tty_struct *tty, char ch)
973 {                                                 976 {
974         struct async_struct *info = tty->drive !! 977         struct async_struct *info = (struct async_struct *)tty->driver_data;
975         unsigned long flags;                      978         unsigned long flags;
976                                                   979 
977         if (serial_paranoia_check(info, tty->n    980         if (serial_paranoia_check(info, tty->name, "rs_send_char"))
978                 return;                           981                 return;
979                                                   982 
980         info->x_char = ch;                        983         info->x_char = ch;
981         if (ch) {                                 984         if (ch) {
982                 /* Make sure transmit interrup    985                 /* Make sure transmit interrupts are on */
983                                                   986 
984                 /* Check this ! */                987                 /* Check this ! */
985                 local_irq_save(flags);            988                 local_irq_save(flags);
986                 if(!(custom.intenar & IF_TBE))    989                 if(!(custom.intenar & IF_TBE)) {
987                     custom.intena = IF_SETCLR     990                     custom.intena = IF_SETCLR | IF_TBE;
988                     mb();                         991                     mb();
989                     /* set a pending Tx Interr    992                     /* set a pending Tx Interrupt, transmitter should restart now */
990                     custom.intreq = IF_SETCLR     993                     custom.intreq = IF_SETCLR | IF_TBE;
991                     mb();                         994                     mb();
992                 }                                 995                 }
993                 local_irq_restore(flags);         996                 local_irq_restore(flags);
994                                                   997 
995                 info->IER |= UART_IER_THRI;       998                 info->IER |= UART_IER_THRI;
996         }                                         999         }
997 }                                                 1000 }
998                                                   1001 
999 /*                                                1002 /*
1000  * ------------------------------------------    1003  * ------------------------------------------------------------
1001  * rs_throttle()                                 1004  * rs_throttle()
1002  *                                               1005  * 
1003  * This routine is called by the upper-layer     1006  * This routine is called by the upper-layer tty layer to signal that
1004  * incoming characters should be throttled.      1007  * incoming characters should be throttled.
1005  * ------------------------------------------    1008  * ------------------------------------------------------------
1006  */                                              1009  */
1007 static void rs_throttle(struct tty_struct * t    1010 static void rs_throttle(struct tty_struct * tty)
1008 {                                                1011 {
1009         struct async_struct *info = tty->driv !! 1012         struct async_struct *info = (struct async_struct *)tty->driver_data;
1010         unsigned long flags;                     1013         unsigned long flags;
1011 #ifdef SERIAL_DEBUG_THROTTLE                     1014 #ifdef SERIAL_DEBUG_THROTTLE
1012         char    buf[64];                         1015         char    buf[64];
1013                                                  1016 
1014         printk("throttle %s: %d....\n", tty_n    1017         printk("throttle %s: %d....\n", tty_name(tty, buf),
1015                tty->ldisc.chars_in_buffer(tty    1018                tty->ldisc.chars_in_buffer(tty));
1016 #endif                                           1019 #endif
1017                                                  1020 
1018         if (serial_paranoia_check(info, tty->    1021         if (serial_paranoia_check(info, tty->name, "rs_throttle"))
1019                 return;                          1022                 return;
1020                                                  1023 
1021         if (I_IXOFF(tty))                        1024         if (I_IXOFF(tty))
1022                 rs_send_xchar(tty, STOP_CHAR(    1025                 rs_send_xchar(tty, STOP_CHAR(tty));
1023                                                  1026 
1024         if (tty->termios->c_cflag & CRTSCTS)     1027         if (tty->termios->c_cflag & CRTSCTS)
1025                 info->MCR &= ~SER_RTS;           1028                 info->MCR &= ~SER_RTS;
1026                                                  1029 
1027         local_irq_save(flags);                   1030         local_irq_save(flags);
1028         rtsdtr_ctrl(info->MCR);                  1031         rtsdtr_ctrl(info->MCR);
1029         local_irq_restore(flags);                1032         local_irq_restore(flags);
1030 }                                                1033 }
1031                                                  1034 
1032 static void rs_unthrottle(struct tty_struct *    1035 static void rs_unthrottle(struct tty_struct * tty)
1033 {                                                1036 {
1034         struct async_struct *info = tty->driv !! 1037         struct async_struct *info = (struct async_struct *)tty->driver_data;
1035         unsigned long flags;                     1038         unsigned long flags;
1036 #ifdef SERIAL_DEBUG_THROTTLE                     1039 #ifdef SERIAL_DEBUG_THROTTLE
1037         char    buf[64];                         1040         char    buf[64];
1038                                                  1041 
1039         printk("unthrottle %s: %d....\n", tty    1042         printk("unthrottle %s: %d....\n", tty_name(tty, buf),
1040                tty->ldisc.chars_in_buffer(tty    1043                tty->ldisc.chars_in_buffer(tty));
1041 #endif                                           1044 #endif
1042                                                  1045 
1043         if (serial_paranoia_check(info, tty->    1046         if (serial_paranoia_check(info, tty->name, "rs_unthrottle"))
1044                 return;                          1047                 return;
1045                                                  1048 
1046         if (I_IXOFF(tty)) {                      1049         if (I_IXOFF(tty)) {
1047                 if (info->x_char)                1050                 if (info->x_char)
1048                         info->x_char = 0;        1051                         info->x_char = 0;
1049                 else                             1052                 else
1050                         rs_send_xchar(tty, ST    1053                         rs_send_xchar(tty, START_CHAR(tty));
1051         }                                        1054         }
1052         if (tty->termios->c_cflag & CRTSCTS)     1055         if (tty->termios->c_cflag & CRTSCTS)
1053                 info->MCR |= SER_RTS;            1056                 info->MCR |= SER_RTS;
1054         local_irq_save(flags);                   1057         local_irq_save(flags);
1055         rtsdtr_ctrl(info->MCR);                  1058         rtsdtr_ctrl(info->MCR);
1056         local_irq_restore(flags);                1059         local_irq_restore(flags);
1057 }                                                1060 }
1058                                                  1061 
1059 /*                                               1062 /*
1060  * ------------------------------------------    1063  * ------------------------------------------------------------
1061  * rs_ioctl() and friends                        1064  * rs_ioctl() and friends
1062  * ------------------------------------------    1065  * ------------------------------------------------------------
1063  */                                              1066  */
1064                                                  1067 
1065 static int get_serial_info(struct async_struc    1068 static int get_serial_info(struct async_struct * info,
1066                            struct serial_stru    1069                            struct serial_struct __user * retinfo)
1067 {                                                1070 {
1068         struct serial_struct tmp;                1071         struct serial_struct tmp;
1069         struct serial_state *state = info->st    1072         struct serial_state *state = info->state;
1070                                                  1073    
1071         if (!retinfo)                            1074         if (!retinfo)
1072                 return -EFAULT;                  1075                 return -EFAULT;
1073         memset(&tmp, 0, sizeof(tmp));            1076         memset(&tmp, 0, sizeof(tmp));
1074         lock_kernel();                        << 
1075         tmp.type = state->type;                  1077         tmp.type = state->type;
1076         tmp.line = state->line;                  1078         tmp.line = state->line;
1077         tmp.port = state->port;                  1079         tmp.port = state->port;
1078         tmp.irq = state->irq;                    1080         tmp.irq = state->irq;
1079         tmp.flags = state->flags;                1081         tmp.flags = state->flags;
1080         tmp.xmit_fifo_size = state->xmit_fifo    1082         tmp.xmit_fifo_size = state->xmit_fifo_size;
1081         tmp.baud_base = state->baud_base;        1083         tmp.baud_base = state->baud_base;
1082         tmp.close_delay = state->close_delay;    1084         tmp.close_delay = state->close_delay;
1083         tmp.closing_wait = state->closing_wai    1085         tmp.closing_wait = state->closing_wait;
1084         tmp.custom_divisor = state->custom_di    1086         tmp.custom_divisor = state->custom_divisor;
1085         unlock_kernel();                      << 
1086         if (copy_to_user(retinfo,&tmp,sizeof(    1087         if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
1087                 return -EFAULT;                  1088                 return -EFAULT;
1088         return 0;                                1089         return 0;
1089 }                                                1090 }
1090                                                  1091 
1091 static int set_serial_info(struct async_struc    1092 static int set_serial_info(struct async_struct * info,
1092                            struct serial_stru    1093                            struct serial_struct __user * new_info)
1093 {                                                1094 {
1094         struct serial_struct new_serial;         1095         struct serial_struct new_serial;
1095         struct serial_state old_state, *state    1096         struct serial_state old_state, *state;
1096         unsigned int            change_irq,ch    1097         unsigned int            change_irq,change_port;
1097         int                     retval = 0;      1098         int                     retval = 0;
1098                                                  1099 
1099         if (copy_from_user(&new_serial,new_in    1100         if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
1100                 return -EFAULT;                  1101                 return -EFAULT;
1101                                               << 
1102         lock_kernel();                        << 
1103         state = info->state;                     1102         state = info->state;
1104         old_state = *state;                      1103         old_state = *state;
1105                                                  1104   
1106         change_irq = new_serial.irq != state-    1105         change_irq = new_serial.irq != state->irq;
1107         change_port = (new_serial.port != sta    1106         change_port = (new_serial.port != state->port);
1108         if(change_irq || change_port || (new_ !! 1107         if(change_irq || change_port || (new_serial.xmit_fifo_size != state->xmit_fifo_size))
1109           unlock_kernel();                    << 
1110           return -EINVAL;                        1108           return -EINVAL;
1111         }                                     << 
1112                                                  1109   
1113         if (!serial_isroot()) {                  1110         if (!serial_isroot()) {
1114                 if ((new_serial.baud_base !=     1111                 if ((new_serial.baud_base != state->baud_base) ||
1115                     (new_serial.close_delay !    1112                     (new_serial.close_delay != state->close_delay) ||
1116                     (new_serial.xmit_fifo_siz    1113                     (new_serial.xmit_fifo_size != state->xmit_fifo_size) ||
1117                     ((new_serial.flags & ~ASY    1114                     ((new_serial.flags & ~ASYNC_USR_MASK) !=
1118                      (state->flags & ~ASYNC_U    1115                      (state->flags & ~ASYNC_USR_MASK)))
1119                         return -EPERM;           1116                         return -EPERM;
1120                 state->flags = ((state->flags    1117                 state->flags = ((state->flags & ~ASYNC_USR_MASK) |
1121                                (new_serial.fl    1118                                (new_serial.flags & ASYNC_USR_MASK));
1122                 info->flags = ((info->flags &    1119                 info->flags = ((info->flags & ~ASYNC_USR_MASK) |
1123                                (new_serial.fl    1120                                (new_serial.flags & ASYNC_USR_MASK));
1124                 state->custom_divisor = new_s    1121                 state->custom_divisor = new_serial.custom_divisor;
1125                 goto check_and_exit;             1122                 goto check_and_exit;
1126         }                                        1123         }
1127                                                  1124 
1128         if (new_serial.baud_base < 9600) {    !! 1125         if (new_serial.baud_base < 9600)
1129                 unlock_kernel();              << 
1130                 return -EINVAL;                  1126                 return -EINVAL;
1131         }                                     << 
1132                                                  1127 
1133         /*                                       1128         /*
1134          * OK, past this point, all the error    1129          * OK, past this point, all the error checking has been done.
1135          * At this point, we start making cha    1130          * At this point, we start making changes.....
1136          */                                      1131          */
1137                                                  1132 
1138         state->baud_base = new_serial.baud_ba    1133         state->baud_base = new_serial.baud_base;
1139         state->flags = ((state->flags & ~ASYN    1134         state->flags = ((state->flags & ~ASYNC_FLAGS) |
1140                         (new_serial.flags & A    1135                         (new_serial.flags & ASYNC_FLAGS));
1141         info->flags = ((state->flags & ~ASYNC    1136         info->flags = ((state->flags & ~ASYNC_INTERNAL_FLAGS) |
1142                        (info->flags & ASYNC_I    1137                        (info->flags & ASYNC_INTERNAL_FLAGS));
1143         state->custom_divisor = new_serial.cu    1138         state->custom_divisor = new_serial.custom_divisor;
1144         state->close_delay = new_serial.close    1139         state->close_delay = new_serial.close_delay * HZ/100;
1145         state->closing_wait = new_serial.clos    1140         state->closing_wait = new_serial.closing_wait * HZ/100;
1146         info->tty->low_latency = (info->flags    1141         info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1147                                                  1142 
1148 check_and_exit:                                  1143 check_and_exit:
1149         if (info->flags & ASYNC_INITIALIZED)     1144         if (info->flags & ASYNC_INITIALIZED) {
1150                 if (((old_state.flags & ASYNC    1145                 if (((old_state.flags & ASYNC_SPD_MASK) !=
1151                      (state->flags & ASYNC_SP    1146                      (state->flags & ASYNC_SPD_MASK)) ||
1152                     (old_state.custom_divisor    1147                     (old_state.custom_divisor != state->custom_divisor)) {
1153                         if ((state->flags & A    1148                         if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
1154                                 info->tty->al    1149                                 info->tty->alt_speed = 57600;
1155                         if ((state->flags & A    1150                         if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
1156                                 info->tty->al    1151                                 info->tty->alt_speed = 115200;
1157                         if ((state->flags & A    1152                         if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
1158                                 info->tty->al    1153                                 info->tty->alt_speed = 230400;
1159                         if ((state->flags & A    1154                         if ((state->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
1160                                 info->tty->al    1155                                 info->tty->alt_speed = 460800;
1161                         change_speed(info, NU    1156                         change_speed(info, NULL);
1162                 }                                1157                 }
1163         } else                                   1158         } else
1164                 retval = startup(info);          1159                 retval = startup(info);
1165         unlock_kernel();                      << 
1166         return retval;                           1160         return retval;
1167 }                                                1161 }
1168                                                  1162 
1169                                                  1163 
1170 /*                                               1164 /*
1171  * get_lsr_info - get line status register in    1165  * get_lsr_info - get line status register info
1172  *                                               1166  *
1173  * Purpose: Let user call ioctl() to get info    1167  * Purpose: Let user call ioctl() to get info when the UART physically
1174  *          is emptied.  On bus types like RS    1168  *          is emptied.  On bus types like RS485, the transmitter must
1175  *          release the bus after transmittin    1169  *          release the bus after transmitting. This must be done when
1176  *          the transmit shift register is em    1170  *          the transmit shift register is empty, not be done when the
1177  *          transmit holding register is empt    1171  *          transmit holding register is empty.  This functionality
1178  *          allows an RS485 driver to be writ    1172  *          allows an RS485 driver to be written in user space. 
1179  */                                              1173  */
1180 static int get_lsr_info(struct async_struct *    1174 static int get_lsr_info(struct async_struct * info, unsigned int __user *value)
1181 {                                                1175 {
1182         unsigned char status;                    1176         unsigned char status;
1183         unsigned int result;                     1177         unsigned int result;
1184         unsigned long flags;                     1178         unsigned long flags;
1185                                                  1179 
1186         local_irq_save(flags);                   1180         local_irq_save(flags);
1187         status = custom.serdatr;                 1181         status = custom.serdatr;
1188         mb();                                    1182         mb();
1189         local_irq_restore(flags);                1183         local_irq_restore(flags);
1190         result = ((status & SDR_TSRE) ? TIOCS    1184         result = ((status & SDR_TSRE) ? TIOCSER_TEMT : 0);
1191         if (copy_to_user(value, &result, size    1185         if (copy_to_user(value, &result, sizeof(int)))
1192                 return -EFAULT;                  1186                 return -EFAULT;
1193         return 0;                                1187         return 0;
1194 }                                                1188 }
1195                                                  1189 
1196                                                  1190 
1197 static int rs_tiocmget(struct tty_struct *tty    1191 static int rs_tiocmget(struct tty_struct *tty, struct file *file)
1198 {                                                1192 {
1199         struct async_struct * info = tty->dri !! 1193         struct async_struct * info = (struct async_struct *)tty->driver_data;
1200         unsigned char control, status;           1194         unsigned char control, status;
1201         unsigned long flags;                     1195         unsigned long flags;
1202                                                  1196 
1203         if (serial_paranoia_check(info, tty->    1197         if (serial_paranoia_check(info, tty->name, "rs_ioctl"))
1204                 return -ENODEV;                  1198                 return -ENODEV;
1205         if (tty->flags & (1 << TTY_IO_ERROR))    1199         if (tty->flags & (1 << TTY_IO_ERROR))
1206                 return -EIO;                     1200                 return -EIO;
1207                                                  1201 
1208         control = info->MCR;                     1202         control = info->MCR;
1209         local_irq_save(flags);                   1203         local_irq_save(flags);
1210         status = ciab.pra;                       1204         status = ciab.pra;
1211         local_irq_restore(flags);                1205         local_irq_restore(flags);
1212         return    ((control & SER_RTS) ? TIOC    1206         return    ((control & SER_RTS) ? TIOCM_RTS : 0)
1213                 | ((control & SER_DTR) ? TIOC    1207                 | ((control & SER_DTR) ? TIOCM_DTR : 0)
1214                 | (!(status  & SER_DCD) ? TIO    1208                 | (!(status  & SER_DCD) ? TIOCM_CAR : 0)
1215                 | (!(status  & SER_DSR) ? TIO    1209                 | (!(status  & SER_DSR) ? TIOCM_DSR : 0)
1216                 | (!(status  & SER_CTS) ? TIO    1210                 | (!(status  & SER_CTS) ? TIOCM_CTS : 0);
1217 }                                                1211 }
1218                                                  1212 
1219 static int rs_tiocmset(struct tty_struct *tty    1213 static int rs_tiocmset(struct tty_struct *tty, struct file *file,
1220                        unsigned int set, unsi    1214                        unsigned int set, unsigned int clear)
1221 {                                                1215 {
1222         struct async_struct * info = tty->dri !! 1216         struct async_struct * info = (struct async_struct *)tty->driver_data;
1223         unsigned long flags;                     1217         unsigned long flags;
1224                                                  1218 
1225         if (serial_paranoia_check(info, tty->    1219         if (serial_paranoia_check(info, tty->name, "rs_ioctl"))
1226                 return -ENODEV;                  1220                 return -ENODEV;
1227         if (tty->flags & (1 << TTY_IO_ERROR))    1221         if (tty->flags & (1 << TTY_IO_ERROR))
1228                 return -EIO;                     1222                 return -EIO;
1229                                                  1223 
1230         local_irq_save(flags);                   1224         local_irq_save(flags);
1231         if (set & TIOCM_RTS)                     1225         if (set & TIOCM_RTS)
1232                 info->MCR |= SER_RTS;            1226                 info->MCR |= SER_RTS;
1233         if (set & TIOCM_DTR)                     1227         if (set & TIOCM_DTR)
1234                 info->MCR |= SER_DTR;            1228                 info->MCR |= SER_DTR;
1235         if (clear & TIOCM_RTS)                   1229         if (clear & TIOCM_RTS)
1236                 info->MCR &= ~SER_RTS;           1230                 info->MCR &= ~SER_RTS;
1237         if (clear & TIOCM_DTR)                   1231         if (clear & TIOCM_DTR)
1238                 info->MCR &= ~SER_DTR;           1232                 info->MCR &= ~SER_DTR;
1239         rtsdtr_ctrl(info->MCR);                  1233         rtsdtr_ctrl(info->MCR);
1240         local_irq_restore(flags);                1234         local_irq_restore(flags);
1241         return 0;                                1235         return 0;
1242 }                                                1236 }
1243                                                  1237 
1244 /*                                               1238 /*
1245  * rs_break() --- routine which turns the bre    1239  * rs_break() --- routine which turns the break handling on or off
1246  */                                              1240  */
1247 static int rs_break(struct tty_struct *tty, i !! 1241 static void rs_break(struct tty_struct *tty, int break_state)
1248 {                                                1242 {
1249         struct async_struct * info = tty->dri !! 1243         struct async_struct * info = (struct async_struct *)tty->driver_data;
1250         unsigned long flags;                     1244         unsigned long flags;
1251                                                  1245 
1252         if (serial_paranoia_check(info, tty->    1246         if (serial_paranoia_check(info, tty->name, "rs_break"))
1253                 return -EINVAL;               !! 1247                 return;
1254                                                  1248 
1255         local_irq_save(flags);                   1249         local_irq_save(flags);
1256         if (break_state == -1)                   1250         if (break_state == -1)
1257           custom.adkcon = AC_SETCLR | AC_UART    1251           custom.adkcon = AC_SETCLR | AC_UARTBRK;
1258         else                                     1252         else
1259           custom.adkcon = AC_UARTBRK;            1253           custom.adkcon = AC_UARTBRK;
1260         mb();                                    1254         mb();
1261         local_irq_restore(flags);                1255         local_irq_restore(flags);
1262         return 0;                             << 
1263 }                                                1256 }
1264                                                  1257 
1265                                                  1258 
1266 static int rs_ioctl(struct tty_struct *tty, s    1259 static int rs_ioctl(struct tty_struct *tty, struct file * file,
1267                     unsigned int cmd, unsigne    1260                     unsigned int cmd, unsigned long arg)
1268 {                                                1261 {
1269         struct async_struct * info = tty->dri !! 1262         struct async_struct * info = (struct async_struct *)tty->driver_data;
1270         struct async_icount cprev, cnow;         1263         struct async_icount cprev, cnow;        /* kernel counter temps */
1271         struct serial_icounter_struct icount;    1264         struct serial_icounter_struct icount;
1272         void __user *argp = (void __user *)ar    1265         void __user *argp = (void __user *)arg;
1273         unsigned long flags;                     1266         unsigned long flags;
1274                                                  1267 
1275         if (serial_paranoia_check(info, tty->    1268         if (serial_paranoia_check(info, tty->name, "rs_ioctl"))
1276                 return -ENODEV;                  1269                 return -ENODEV;
1277                                                  1270 
1278         if ((cmd != TIOCGSERIAL) && (cmd != T    1271         if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
1279             (cmd != TIOCSERCONFIG) && (cmd !=    1272             (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) &&
1280             (cmd != TIOCMIWAIT) && (cmd != TI    1273             (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
1281                 if (tty->flags & (1 << TTY_IO    1274                 if (tty->flags & (1 << TTY_IO_ERROR))
1282                     return -EIO;                 1275                     return -EIO;
1283         }                                        1276         }
1284                                                  1277 
1285         switch (cmd) {                           1278         switch (cmd) {
1286                 case TIOCGSERIAL:                1279                 case TIOCGSERIAL:
1287                         return get_serial_inf    1280                         return get_serial_info(info, argp);
1288                 case TIOCSSERIAL:                1281                 case TIOCSSERIAL:
1289                         return set_serial_inf    1282                         return set_serial_info(info, argp);
1290                 case TIOCSERCONFIG:              1283                 case TIOCSERCONFIG:
1291                         return 0;                1284                         return 0;
1292                                                  1285 
1293                 case TIOCSERGETLSR: /* Get li    1286                 case TIOCSERGETLSR: /* Get line status register */
1294                         return get_lsr_info(i    1287                         return get_lsr_info(info, argp);
1295                                                  1288 
1296                 case TIOCSERGSTRUCT:             1289                 case TIOCSERGSTRUCT:
1297                         if (copy_to_user(argp    1290                         if (copy_to_user(argp,
1298                                          info    1291                                          info, sizeof(struct async_struct)))
1299                                 return -EFAUL    1292                                 return -EFAULT;
1300                         return 0;                1293                         return 0;
1301                                                  1294 
1302                 /*                               1295                 /*
1303                  * Wait for any of the 4 mode    1296                  * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1304                  * - mask passed in arg for l    1297                  * - mask passed in arg for lines of interest
1305                  *   (use |'ed TIOCM_RNG/DSR/    1298                  *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1306                  * Caller should use TIOCGICO    1299                  * Caller should use TIOCGICOUNT to see which one it was
1307                  */                              1300                  */
1308                 case TIOCMIWAIT:                 1301                 case TIOCMIWAIT:
1309                         local_irq_save(flags)    1302                         local_irq_save(flags);
1310                         /* note the counters     1303                         /* note the counters on entry */
1311                         cprev = info->state->    1304                         cprev = info->state->icount;
1312                         local_irq_restore(fla    1305                         local_irq_restore(flags);
1313                         while (1) {              1306                         while (1) {
1314                                 interruptible    1307                                 interruptible_sleep_on(&info->delta_msr_wait);
1315                                 /* see if a s    1308                                 /* see if a signal did it */
1316                                 if (signal_pe    1309                                 if (signal_pending(current))
1317                                         retur    1310                                         return -ERESTARTSYS;
1318                                 local_irq_sav    1311                                 local_irq_save(flags);
1319                                 cnow = info->    1312                                 cnow = info->state->icount; /* atomic copy */
1320                                 local_irq_res    1313                                 local_irq_restore(flags);
1321                                 if (cnow.rng     1314                                 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 
1322                                     cnow.dcd     1315                                     cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
1323                                         retur    1316                                         return -EIO; /* no change => error */
1324                                 if ( ((arg &     1317                                 if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1325                                      ((arg &     1318                                      ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1326                                      ((arg &     1319                                      ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
1327                                      ((arg &     1320                                      ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
1328                                         retur    1321                                         return 0;
1329                                 }                1322                                 }
1330                                 cprev = cnow;    1323                                 cprev = cnow;
1331                         }                        1324                         }
1332                         /* NOTREACHED */         1325                         /* NOTREACHED */
1333                                                  1326 
1334                 /*                               1327                 /* 
1335                  * Get counter of input seria    1328                  * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1336                  * Return: write counters to     1329                  * Return: write counters to the user passed counter struct
1337                  * NB: both 1->0 and 0->1 tra    1330                  * NB: both 1->0 and 0->1 transitions are counted except for
1338                  *     RI where only 0->1 is     1331                  *     RI where only 0->1 is counted.
1339                  */                              1332                  */
1340                 case TIOCGICOUNT:                1333                 case TIOCGICOUNT:
1341                         local_irq_save(flags)    1334                         local_irq_save(flags);
1342                         cnow = info->state->i    1335                         cnow = info->state->icount;
1343                         local_irq_restore(fla    1336                         local_irq_restore(flags);
1344                         icount.cts = cnow.cts    1337                         icount.cts = cnow.cts;
1345                         icount.dsr = cnow.dsr    1338                         icount.dsr = cnow.dsr;
1346                         icount.rng = cnow.rng    1339                         icount.rng = cnow.rng;
1347                         icount.dcd = cnow.dcd    1340                         icount.dcd = cnow.dcd;
1348                         icount.rx = cnow.rx;     1341                         icount.rx = cnow.rx;
1349                         icount.tx = cnow.tx;     1342                         icount.tx = cnow.tx;
1350                         icount.frame = cnow.f    1343                         icount.frame = cnow.frame;
1351                         icount.overrun = cnow    1344                         icount.overrun = cnow.overrun;
1352                         icount.parity = cnow.    1345                         icount.parity = cnow.parity;
1353                         icount.brk = cnow.brk    1346                         icount.brk = cnow.brk;
1354                         icount.buf_overrun =     1347                         icount.buf_overrun = cnow.buf_overrun;
1355                                                  1348 
1356                         if (copy_to_user(argp    1349                         if (copy_to_user(argp, &icount, sizeof(icount)))
1357                                 return -EFAUL    1350                                 return -EFAULT;
1358                         return 0;                1351                         return 0;
1359                 case TIOCSERGWILD:               1352                 case TIOCSERGWILD:
1360                 case TIOCSERSWILD:               1353                 case TIOCSERSWILD:
1361                         /* "setserial -W" is     1354                         /* "setserial -W" is called in Debian boot */
1362                         printk ("TIOCSER?WILD    1355                         printk ("TIOCSER?WILD ioctl obsolete, ignored.\n");
1363                         return 0;                1356                         return 0;
1364                                                  1357 
1365                 default:                         1358                 default:
1366                         return -ENOIOCTLCMD;     1359                         return -ENOIOCTLCMD;
1367                 }                                1360                 }
1368         return 0;                                1361         return 0;
1369 }                                                1362 }
1370                                                  1363 
1371 static void rs_set_termios(struct tty_struct     1364 static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1372 {                                                1365 {
1373         struct async_struct *info = tty->driv !! 1366         struct async_struct *info = (struct async_struct *)tty->driver_data;
1374         unsigned long flags;                     1367         unsigned long flags;
1375         unsigned int cflag = tty->termios->c_    1368         unsigned int cflag = tty->termios->c_cflag;
1376                                                  1369 
1377         change_speed(info, old_termios);         1370         change_speed(info, old_termios);
1378                                                  1371 
1379         /* Handle transition to B0 status */     1372         /* Handle transition to B0 status */
1380         if ((old_termios->c_cflag & CBAUD) &&    1373         if ((old_termios->c_cflag & CBAUD) &&
1381             !(cflag & CBAUD)) {                  1374             !(cflag & CBAUD)) {
1382                 info->MCR &= ~(SER_DTR|SER_RT    1375                 info->MCR &= ~(SER_DTR|SER_RTS);
1383                 local_irq_save(flags);           1376                 local_irq_save(flags);
1384                 rtsdtr_ctrl(info->MCR);          1377                 rtsdtr_ctrl(info->MCR);
1385                 local_irq_restore(flags);        1378                 local_irq_restore(flags);
1386         }                                        1379         }
1387                                                  1380 
1388         /* Handle transition away from B0 sta    1381         /* Handle transition away from B0 status */
1389         if (!(old_termios->c_cflag & CBAUD) &    1382         if (!(old_termios->c_cflag & CBAUD) &&
1390             (cflag & CBAUD)) {                   1383             (cflag & CBAUD)) {
1391                 info->MCR |= SER_DTR;            1384                 info->MCR |= SER_DTR;
1392                 if (!(tty->termios->c_cflag &    1385                 if (!(tty->termios->c_cflag & CRTSCTS) || 
1393                     !test_bit(TTY_THROTTLED,     1386                     !test_bit(TTY_THROTTLED, &tty->flags)) {
1394                         info->MCR |= SER_RTS;    1387                         info->MCR |= SER_RTS;
1395                 }                                1388                 }
1396                 local_irq_save(flags);           1389                 local_irq_save(flags);
1397                 rtsdtr_ctrl(info->MCR);          1390                 rtsdtr_ctrl(info->MCR);
1398                 local_irq_restore(flags);        1391                 local_irq_restore(flags);
1399         }                                        1392         }
1400                                                  1393 
1401         /* Handle turning off CRTSCTS */         1394         /* Handle turning off CRTSCTS */
1402         if ((old_termios->c_cflag & CRTSCTS)     1395         if ((old_termios->c_cflag & CRTSCTS) &&
1403             !(tty->termios->c_cflag & CRTSCTS    1396             !(tty->termios->c_cflag & CRTSCTS)) {
1404                 tty->hw_stopped = 0;             1397                 tty->hw_stopped = 0;
1405                 rs_start(tty);                   1398                 rs_start(tty);
1406         }                                        1399         }
1407                                                  1400 
1408 #if 0                                            1401 #if 0
1409         /*                                       1402         /*
1410          * No need to wake up processes in op    1403          * No need to wake up processes in open wait, since they
1411          * sample the CLOCAL flag once, and d    1404          * sample the CLOCAL flag once, and don't recheck it.
1412          * XXX  It's not clear whether the cu    1405          * XXX  It's not clear whether the current behavior is correct
1413          * or not.  Hence, this may change...    1406          * or not.  Hence, this may change.....
1414          */                                      1407          */
1415         if (!(old_termios->c_cflag & CLOCAL)     1408         if (!(old_termios->c_cflag & CLOCAL) &&
1416             (tty->termios->c_cflag & CLOCAL))    1409             (tty->termios->c_cflag & CLOCAL))
1417                 wake_up_interruptible(&info->    1410                 wake_up_interruptible(&info->open_wait);
1418 #endif                                           1411 #endif
1419 }                                                1412 }
1420                                                  1413 
1421 /*                                               1414 /*
1422  * ------------------------------------------    1415  * ------------------------------------------------------------
1423  * rs_close()                                    1416  * rs_close()
1424  *                                               1417  * 
1425  * This routine is called when the serial por    1418  * This routine is called when the serial port gets closed.  First, we
1426  * wait for the last remaining data to be sen    1419  * wait for the last remaining data to be sent.  Then, we unlink its
1427  * async structure from the interrupt chain i    1420  * async structure from the interrupt chain if necessary, and we free
1428  * that IRQ if nothing is left in the chain.     1421  * that IRQ if nothing is left in the chain.
1429  * ------------------------------------------    1422  * ------------------------------------------------------------
1430  */                                              1423  */
1431 static void rs_close(struct tty_struct *tty,     1424 static void rs_close(struct tty_struct *tty, struct file * filp)
1432 {                                                1425 {
1433         struct async_struct * info = tty->dri !! 1426         struct async_struct * info = (struct async_struct *)tty->driver_data;
1434         struct serial_state *state;              1427         struct serial_state *state;
1435         unsigned long flags;                     1428         unsigned long flags;
1436                                                  1429 
1437         if (!info || serial_paranoia_check(in    1430         if (!info || serial_paranoia_check(info, tty->name, "rs_close"))
1438                 return;                          1431                 return;
1439                                                  1432 
1440         state = info->state;                     1433         state = info->state;
1441                                                  1434 
1442         local_irq_save(flags);                   1435         local_irq_save(flags);
1443                                                  1436 
1444         if (tty_hung_up_p(filp)) {               1437         if (tty_hung_up_p(filp)) {
1445                 DBG_CNT("before DEC-hung");      1438                 DBG_CNT("before DEC-hung");
1446                 local_irq_restore(flags);        1439                 local_irq_restore(flags);
1447                 return;                          1440                 return;
1448         }                                        1441         }
1449                                                  1442 
1450 #ifdef SERIAL_DEBUG_OPEN                         1443 #ifdef SERIAL_DEBUG_OPEN
1451         printk("rs_close ttys%d, count = %d\n    1444         printk("rs_close ttys%d, count = %d\n", info->line, state->count);
1452 #endif                                           1445 #endif
1453         if ((tty->count == 1) && (state->coun    1446         if ((tty->count == 1) && (state->count != 1)) {
1454                 /*                               1447                 /*
1455                  * Uh, oh.  tty->count is 1,     1448                  * Uh, oh.  tty->count is 1, which means that the tty
1456                  * structure will be freed.      1449                  * structure will be freed.  state->count should always
1457                  * be one in these conditions    1450                  * be one in these conditions.  If it's greater than
1458                  * one, we've got real proble    1451                  * one, we've got real problems, since it means the
1459                  * serial port won't be shutd    1452                  * serial port won't be shutdown.
1460                  */                              1453                  */
1461                 printk("rs_close: bad serial     1454                 printk("rs_close: bad serial port count; tty->count is 1, "
1462                        "state->count is %d\n"    1455                        "state->count is %d\n", state->count);
1463                 state->count = 1;                1456                 state->count = 1;
1464         }                                        1457         }
1465         if (--state->count < 0) {                1458         if (--state->count < 0) {
1466                 printk("rs_close: bad serial     1459                 printk("rs_close: bad serial port count for ttys%d: %d\n",
1467                        info->line, state->cou    1460                        info->line, state->count);
1468                 state->count = 0;                1461                 state->count = 0;
1469         }                                        1462         }
1470         if (state->count) {                      1463         if (state->count) {
1471                 DBG_CNT("before DEC-2");         1464                 DBG_CNT("before DEC-2");
1472                 local_irq_restore(flags);        1465                 local_irq_restore(flags);
1473                 return;                          1466                 return;
1474         }                                        1467         }
1475         info->flags |= ASYNC_CLOSING;            1468         info->flags |= ASYNC_CLOSING;
1476         /*                                       1469         /*
1477          * Now we wait for the transmit buffe    1470          * Now we wait for the transmit buffer to clear; and we notify 
1478          * the line discipline to only proces    1471          * the line discipline to only process XON/XOFF characters.
1479          */                                      1472          */
1480         tty->closing = 1;                        1473         tty->closing = 1;
1481         if (info->closing_wait != ASYNC_CLOSI    1474         if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
1482                 tty_wait_until_sent(tty, info    1475                 tty_wait_until_sent(tty, info->closing_wait);
1483         /*                                       1476         /*
1484          * At this point we stop accepting in    1477          * At this point we stop accepting input.  To do this, we
1485          * disable the receive line status in    1478          * disable the receive line status interrupts, and tell the
1486          * interrupt driver to stop checking     1479          * interrupt driver to stop checking the data ready bit in the
1487          * line status register.                 1480          * line status register.
1488          */                                      1481          */
1489         info->read_status_mask &= ~UART_LSR_D    1482         info->read_status_mask &= ~UART_LSR_DR;
1490         if (info->flags & ASYNC_INITIALIZED)     1483         if (info->flags & ASYNC_INITIALIZED) {
1491                 /* disable receive interrupts    1484                 /* disable receive interrupts */
1492                 custom.intena = IF_RBF;          1485                 custom.intena = IF_RBF;
1493                 mb();                            1486                 mb();
1494                 /* clear any pending receive     1487                 /* clear any pending receive interrupt */
1495                 custom.intreq = IF_RBF;          1488                 custom.intreq = IF_RBF;
1496                 mb();                            1489                 mb();
1497                                                  1490 
1498                 /*                               1491                 /*
1499                  * Before we drop DTR, make s    1492                  * Before we drop DTR, make sure the UART transmitter
1500                  * has completely drained; th    1493                  * has completely drained; this is especially
1501                  * important if there is a tr    1494                  * important if there is a transmit FIFO!
1502                  */                              1495                  */
1503                 rs_wait_until_sent(tty, info-    1496                 rs_wait_until_sent(tty, info->timeout);
1504         }                                        1497         }
1505         shutdown(info);                          1498         shutdown(info);
1506         rs_flush_buffer(tty);                 !! 1499         if (tty->driver->flush_buffer)
                                                   >> 1500                 tty->driver->flush_buffer(tty);
1507                                                  1501                 
1508         tty_ldisc_flush(tty);                    1502         tty_ldisc_flush(tty);
1509         tty->closing = 0;                        1503         tty->closing = 0;
1510         info->event = 0;                         1504         info->event = 0;
1511         info->tty = NULL;                        1505         info->tty = NULL;
1512         if (info->blocked_open) {                1506         if (info->blocked_open) {
1513                 if (info->close_delay) {         1507                 if (info->close_delay) {
1514                         msleep_interruptible(    1508                         msleep_interruptible(jiffies_to_msecs(info->close_delay));
1515                 }                                1509                 }
1516                 wake_up_interruptible(&info->    1510                 wake_up_interruptible(&info->open_wait);
1517         }                                        1511         }
1518         info->flags &= ~(ASYNC_NORMAL_ACTIVE|    1512         info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
1519         wake_up_interruptible(&info->close_wa    1513         wake_up_interruptible(&info->close_wait);
1520         local_irq_restore(flags);                1514         local_irq_restore(flags);
1521 }                                                1515 }
1522                                                  1516 
1523 /*                                               1517 /*
1524  * rs_wait_until_sent() --- wait until the tr    1518  * rs_wait_until_sent() --- wait until the transmitter is empty
1525  */                                              1519  */
1526 static void rs_wait_until_sent(struct tty_str    1520 static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
1527 {                                                1521 {
1528         struct async_struct * info = tty->dri !! 1522         struct async_struct * info = (struct async_struct *)tty->driver_data;
1529         unsigned long orig_jiffies, char_time    1523         unsigned long orig_jiffies, char_time;
1530         int lsr;                                 1524         int lsr;
1531                                                  1525 
1532         if (serial_paranoia_check(info, tty->    1526         if (serial_paranoia_check(info, tty->name, "rs_wait_until_sent"))
1533                 return;                          1527                 return;
1534                                                  1528 
1535         if (info->xmit_fifo_size == 0)           1529         if (info->xmit_fifo_size == 0)
1536                 return; /* Just in case.... *    1530                 return; /* Just in case.... */
1537                                                  1531 
1538         orig_jiffies = jiffies;                  1532         orig_jiffies = jiffies;
1539                                               << 
1540         lock_kernel();                        << 
1541         /*                                       1533         /*
1542          * Set the check interval to be 1/5 o    1534          * Set the check interval to be 1/5 of the estimated time to
1543          * send a single character, and make     1535          * send a single character, and make it at least 1.  The check
1544          * interval should also be less than     1536          * interval should also be less than the timeout.
1545          *                                       1537          * 
1546          * Note: we have to use pretty tight     1538          * Note: we have to use pretty tight timings here to satisfy
1547          * the NIST-PCTS.                        1539          * the NIST-PCTS.
1548          */                                      1540          */
1549         char_time = (info->timeout - HZ/50) /    1541         char_time = (info->timeout - HZ/50) / info->xmit_fifo_size;
1550         char_time = char_time / 5;               1542         char_time = char_time / 5;
1551         if (char_time == 0)                      1543         if (char_time == 0)
1552                 char_time = 1;                   1544                 char_time = 1;
1553         if (timeout)                             1545         if (timeout)
1554           char_time = min_t(unsigned long, ch    1546           char_time = min_t(unsigned long, char_time, timeout);
1555         /*                                       1547         /*
1556          * If the transmitter hasn't cleared     1548          * If the transmitter hasn't cleared in twice the approximate
1557          * amount of time to send the entire     1549          * amount of time to send the entire FIFO, it probably won't
1558          * ever clear.  This assumes the UART    1550          * ever clear.  This assumes the UART isn't doing flow
1559          * control, which is currently the ca    1551          * control, which is currently the case.  Hence, if it ever
1560          * takes longer than info->timeout, t    1552          * takes longer than info->timeout, this is probably due to a
1561          * UART bug of some kind.  So, we cla    1553          * UART bug of some kind.  So, we clamp the timeout parameter at
1562          * 2*info->timeout.                      1554          * 2*info->timeout.
1563          */                                      1555          */
1564         if (!timeout || timeout > 2*info->tim    1556         if (!timeout || timeout > 2*info->timeout)
1565                 timeout = 2*info->timeout;       1557                 timeout = 2*info->timeout;
1566 #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT           1558 #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1567         printk("In rs_wait_until_sent(%d) che    1559         printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
1568         printk("jiff=%lu...", jiffies);          1560         printk("jiff=%lu...", jiffies);
1569 #endif                                           1561 #endif
1570         while(!((lsr = custom.serdatr) & SDR_    1562         while(!((lsr = custom.serdatr) & SDR_TSRE)) {
1571 #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT           1563 #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1572                 printk("serdatr = %d (jiff=%l    1564                 printk("serdatr = %d (jiff=%lu)...", lsr, jiffies);
1573 #endif                                           1565 #endif
1574                 msleep_interruptible(jiffies_    1566                 msleep_interruptible(jiffies_to_msecs(char_time));
1575                 if (signal_pending(current))     1567                 if (signal_pending(current))
1576                         break;                   1568                         break;
1577                 if (timeout && time_after(jif    1569                 if (timeout && time_after(jiffies, orig_jiffies + timeout))
1578                         break;                   1570                         break;
1579         }                                        1571         }
1580         __set_current_state(TASK_RUNNING);       1572         __set_current_state(TASK_RUNNING);
1581         unlock_kernel();                      << 
1582 #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT           1573 #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1583         printk("lsr = %d (jiff=%lu)...done\n"    1574         printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
1584 #endif                                           1575 #endif
1585 }                                                1576 }
1586                                                  1577 
1587 /*                                               1578 /*
1588  * rs_hangup() --- called by tty_hangup() whe    1579  * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
1589  */                                              1580  */
1590 static void rs_hangup(struct tty_struct *tty)    1581 static void rs_hangup(struct tty_struct *tty)
1591 {                                                1582 {
1592         struct async_struct * info = tty->dri !! 1583         struct async_struct * info = (struct async_struct *)tty->driver_data;
1593         struct serial_state *state = info->st    1584         struct serial_state *state = info->state;
1594                                                  1585 
1595         if (serial_paranoia_check(info, tty->    1586         if (serial_paranoia_check(info, tty->name, "rs_hangup"))
1596                 return;                          1587                 return;
1597                                                  1588 
1598         state = info->state;                     1589         state = info->state;
1599                                                  1590 
1600         rs_flush_buffer(tty);                    1591         rs_flush_buffer(tty);
1601         shutdown(info);                          1592         shutdown(info);
1602         info->event = 0;                         1593         info->event = 0;
1603         state->count = 0;                        1594         state->count = 0;
1604         info->flags &= ~ASYNC_NORMAL_ACTIVE;     1595         info->flags &= ~ASYNC_NORMAL_ACTIVE;
1605         info->tty = NULL;                        1596         info->tty = NULL;
1606         wake_up_interruptible(&info->open_wai    1597         wake_up_interruptible(&info->open_wait);
1607 }                                                1598 }
1608                                                  1599 
1609 /*                                               1600 /*
1610  * ------------------------------------------    1601  * ------------------------------------------------------------
1611  * rs_open() and friends                         1602  * rs_open() and friends
1612  * ------------------------------------------    1603  * ------------------------------------------------------------
1613  */                                              1604  */
1614 static int block_til_ready(struct tty_struct     1605 static int block_til_ready(struct tty_struct *tty, struct file * filp,
1615                            struct async_struc    1606                            struct async_struct *info)
1616 {                                                1607 {
1617 #ifdef DECLARE_WAITQUEUE                         1608 #ifdef DECLARE_WAITQUEUE
1618         DECLARE_WAITQUEUE(wait, current);        1609         DECLARE_WAITQUEUE(wait, current);
1619 #else                                            1610 #else
1620         struct wait_queue wait = { current, N    1611         struct wait_queue wait = { current, NULL };
1621 #endif                                           1612 #endif
1622         struct serial_state *state = info->st    1613         struct serial_state *state = info->state;
1623         int             retval;                  1614         int             retval;
1624         int             do_clocal = 0, extra_    1615         int             do_clocal = 0, extra_count = 0;
1625         unsigned long   flags;                   1616         unsigned long   flags;
1626                                                  1617 
1627         /*                                       1618         /*
1628          * If the device is in the middle of     1619          * If the device is in the middle of being closed, then block
1629          * until it's done, and then try agai    1620          * until it's done, and then try again.
1630          */                                      1621          */
1631         if (tty_hung_up_p(filp) ||               1622         if (tty_hung_up_p(filp) ||
1632             (info->flags & ASYNC_CLOSING)) {     1623             (info->flags & ASYNC_CLOSING)) {
1633                 if (info->flags & ASYNC_CLOSI    1624                 if (info->flags & ASYNC_CLOSING)
1634                         interruptible_sleep_o    1625                         interruptible_sleep_on(&info->close_wait);
1635 #ifdef SERIAL_DO_RESTART                         1626 #ifdef SERIAL_DO_RESTART
1636                 return ((info->flags & ASYNC_    1627                 return ((info->flags & ASYNC_HUP_NOTIFY) ?
1637                         -EAGAIN : -ERESTARTSY    1628                         -EAGAIN : -ERESTARTSYS);
1638 #else                                            1629 #else
1639                 return -EAGAIN;                  1630                 return -EAGAIN;
1640 #endif                                           1631 #endif
1641         }                                        1632         }
1642                                                  1633 
1643         /*                                       1634         /*
1644          * If non-blocking mode is set, or th    1635          * If non-blocking mode is set, or the port is not enabled,
1645          * then make the check up front and t    1636          * then make the check up front and then exit.
1646          */                                      1637          */
1647         if ((filp->f_flags & O_NONBLOCK) ||      1638         if ((filp->f_flags & O_NONBLOCK) ||
1648             (tty->flags & (1 << TTY_IO_ERROR)    1639             (tty->flags & (1 << TTY_IO_ERROR))) {
1649                 info->flags |= ASYNC_NORMAL_A    1640                 info->flags |= ASYNC_NORMAL_ACTIVE;
1650                 return 0;                        1641                 return 0;
1651         }                                        1642         }
1652                                                  1643 
1653         if (tty->termios->c_cflag & CLOCAL)      1644         if (tty->termios->c_cflag & CLOCAL)
1654                 do_clocal = 1;                   1645                 do_clocal = 1;
1655                                                  1646 
1656         /*                                       1647         /*
1657          * Block waiting for the carrier dete    1648          * Block waiting for the carrier detect and the line to become
1658          * free (i.e., not in use by the call    1649          * free (i.e., not in use by the callout).  While we are in
1659          * this loop, state->count is dropped    1650          * this loop, state->count is dropped by one, so that
1660          * rs_close() knows when to free thin    1651          * rs_close() knows when to free things.  We restore it upon
1661          * exit, either normal or abnormal.      1652          * exit, either normal or abnormal.
1662          */                                      1653          */
1663         retval = 0;                              1654         retval = 0;
1664         add_wait_queue(&info->open_wait, &wai    1655         add_wait_queue(&info->open_wait, &wait);
1665 #ifdef SERIAL_DEBUG_OPEN                         1656 #ifdef SERIAL_DEBUG_OPEN
1666         printk("block_til_ready before block:    1657         printk("block_til_ready before block: ttys%d, count = %d\n",
1667                state->line, state->count);       1658                state->line, state->count);
1668 #endif                                           1659 #endif
1669         local_irq_save(flags);                   1660         local_irq_save(flags);
1670         if (!tty_hung_up_p(filp)) {              1661         if (!tty_hung_up_p(filp)) {
1671                 extra_count = 1;                 1662                 extra_count = 1;
1672                 state->count--;                  1663                 state->count--;
1673         }                                        1664         }
1674         local_irq_restore(flags);                1665         local_irq_restore(flags);
1675         info->blocked_open++;                    1666         info->blocked_open++;
1676         while (1) {                              1667         while (1) {
1677                 local_irq_save(flags);           1668                 local_irq_save(flags);
1678                 if (tty->termios->c_cflag & C    1669                 if (tty->termios->c_cflag & CBAUD)
1679                         rtsdtr_ctrl(SER_DTR|S    1670                         rtsdtr_ctrl(SER_DTR|SER_RTS);
1680                 local_irq_restore(flags);        1671                 local_irq_restore(flags);
1681                 set_current_state(TASK_INTERR    1672                 set_current_state(TASK_INTERRUPTIBLE);
1682                 if (tty_hung_up_p(filp) ||       1673                 if (tty_hung_up_p(filp) ||
1683                     !(info->flags & ASYNC_INI    1674                     !(info->flags & ASYNC_INITIALIZED)) {
1684 #ifdef SERIAL_DO_RESTART                         1675 #ifdef SERIAL_DO_RESTART
1685                         if (info->flags & ASY    1676                         if (info->flags & ASYNC_HUP_NOTIFY)
1686                                 retval = -EAG    1677                                 retval = -EAGAIN;
1687                         else                     1678                         else
1688                                 retval = -ERE    1679                                 retval = -ERESTARTSYS;
1689 #else                                            1680 #else
1690                         retval = -EAGAIN;        1681                         retval = -EAGAIN;
1691 #endif                                           1682 #endif
1692                         break;                   1683                         break;
1693                 }                                1684                 }
1694                 if (!(info->flags & ASYNC_CLO    1685                 if (!(info->flags & ASYNC_CLOSING) &&
1695                     (do_clocal || (!(ciab.pra    1686                     (do_clocal || (!(ciab.pra & SER_DCD)) ))
1696                         break;                   1687                         break;
1697                 if (signal_pending(current))     1688                 if (signal_pending(current)) {
1698                         retval = -ERESTARTSYS    1689                         retval = -ERESTARTSYS;
1699                         break;                   1690                         break;
1700                 }                                1691                 }
1701 #ifdef SERIAL_DEBUG_OPEN                         1692 #ifdef SERIAL_DEBUG_OPEN
1702                 printk("block_til_ready block    1693                 printk("block_til_ready blocking: ttys%d, count = %d\n",
1703                        info->line, state->cou    1694                        info->line, state->count);
1704 #endif                                           1695 #endif
1705                 schedule();                      1696                 schedule();
1706         }                                        1697         }
1707         __set_current_state(TASK_RUNNING);       1698         __set_current_state(TASK_RUNNING);
1708         remove_wait_queue(&info->open_wait, &    1699         remove_wait_queue(&info->open_wait, &wait);
1709         if (extra_count)                         1700         if (extra_count)
1710                 state->count++;                  1701                 state->count++;
1711         info->blocked_open--;                    1702         info->blocked_open--;
1712 #ifdef SERIAL_DEBUG_OPEN                         1703 #ifdef SERIAL_DEBUG_OPEN
1713         printk("block_til_ready after blockin    1704         printk("block_til_ready after blocking: ttys%d, count = %d\n",
1714                info->line, state->count);        1705                info->line, state->count);
1715 #endif                                           1706 #endif
1716         if (retval)                              1707         if (retval)
1717                 return retval;                   1708                 return retval;
1718         info->flags |= ASYNC_NORMAL_ACTIVE;      1709         info->flags |= ASYNC_NORMAL_ACTIVE;
1719         return 0;                                1710         return 0;
1720 }                                                1711 }
1721                                                  1712 
1722 static int get_async_struct(int line, struct     1713 static int get_async_struct(int line, struct async_struct **ret_info)
1723 {                                                1714 {
1724         struct async_struct *info;               1715         struct async_struct *info;
1725         struct serial_state *sstate;             1716         struct serial_state *sstate;
1726                                                  1717 
1727         sstate = rs_table + line;                1718         sstate = rs_table + line;
1728         sstate->count++;                         1719         sstate->count++;
1729         if (sstate->info) {                      1720         if (sstate->info) {
1730                 *ret_info = sstate->info;        1721                 *ret_info = sstate->info;
1731                 return 0;                        1722                 return 0;
1732         }                                        1723         }
1733         info = kzalloc(sizeof(struct async_st    1724         info = kzalloc(sizeof(struct async_struct), GFP_KERNEL);
1734         if (!info) {                             1725         if (!info) {
1735                 sstate->count--;                 1726                 sstate->count--;
1736                 return -ENOMEM;                  1727                 return -ENOMEM;
1737         }                                        1728         }
1738 #ifdef DECLARE_WAITQUEUE                         1729 #ifdef DECLARE_WAITQUEUE
1739         init_waitqueue_head(&info->open_wait)    1730         init_waitqueue_head(&info->open_wait);
1740         init_waitqueue_head(&info->close_wait    1731         init_waitqueue_head(&info->close_wait);
1741         init_waitqueue_head(&info->delta_msr_    1732         init_waitqueue_head(&info->delta_msr_wait);
1742 #endif                                           1733 #endif
1743         info->magic = SERIAL_MAGIC;              1734         info->magic = SERIAL_MAGIC;
1744         info->port = sstate->port;               1735         info->port = sstate->port;
1745         info->flags = sstate->flags;             1736         info->flags = sstate->flags;
1746         info->xmit_fifo_size = sstate->xmit_f    1737         info->xmit_fifo_size = sstate->xmit_fifo_size;
1747         info->line = line;                       1738         info->line = line;
1748         tasklet_init(&info->tlet, do_softint,    1739         tasklet_init(&info->tlet, do_softint, (unsigned long)info);
1749         info->state = sstate;                    1740         info->state = sstate;
1750         if (sstate->info) {                      1741         if (sstate->info) {
1751                 kfree(info);                     1742                 kfree(info);
1752                 *ret_info = sstate->info;        1743                 *ret_info = sstate->info;
1753                 return 0;                        1744                 return 0;
1754         }                                        1745         }
1755         *ret_info = sstate->info = info;         1746         *ret_info = sstate->info = info;
1756         return 0;                                1747         return 0;
1757 }                                                1748 }
1758                                                  1749 
1759 /*                                               1750 /*
1760  * This routine is called whenever a serial p    1751  * This routine is called whenever a serial port is opened.  It
1761  * enables interrupts for a serial port, link    1752  * enables interrupts for a serial port, linking in its async structure into
1762  * the IRQ chain.   It also performs the seri    1753  * the IRQ chain.   It also performs the serial-specific
1763  * initialization for the tty structure.         1754  * initialization for the tty structure.
1764  */                                              1755  */
1765 static int rs_open(struct tty_struct *tty, st    1756 static int rs_open(struct tty_struct *tty, struct file * filp)
1766 {                                                1757 {
1767         struct async_struct     *info;           1758         struct async_struct     *info;
1768         int                     retval, line;    1759         int                     retval, line;
1769                                                  1760 
1770         line = tty->index;                       1761         line = tty->index;
1771         if ((line < 0) || (line >= NR_PORTS))    1762         if ((line < 0) || (line >= NR_PORTS)) {
1772                 return -ENODEV;                  1763                 return -ENODEV;
1773         }                                        1764         }
1774         retval = get_async_struct(line, &info    1765         retval = get_async_struct(line, &info);
1775         if (retval) {                            1766         if (retval) {
1776                 return retval;                   1767                 return retval;
1777         }                                        1768         }
1778         tty->driver_data = info;                 1769         tty->driver_data = info;
1779         info->tty = tty;                         1770         info->tty = tty;
1780         if (serial_paranoia_check(info, tty->    1771         if (serial_paranoia_check(info, tty->name, "rs_open"))
1781                 return -ENODEV;                  1772                 return -ENODEV;
1782                                                  1773 
1783 #ifdef SERIAL_DEBUG_OPEN                         1774 #ifdef SERIAL_DEBUG_OPEN
1784         printk("rs_open %s, count = %d\n", tt    1775         printk("rs_open %s, count = %d\n", tty->name, info->state->count);
1785 #endif                                           1776 #endif
1786         info->tty->low_latency = (info->flags    1777         info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1787                                                  1778 
1788         /*                                       1779         /*
1789          * If the port is the middle of closi    1780          * If the port is the middle of closing, bail out now
1790          */                                      1781          */
1791         if (tty_hung_up_p(filp) ||               1782         if (tty_hung_up_p(filp) ||
1792             (info->flags & ASYNC_CLOSING)) {     1783             (info->flags & ASYNC_CLOSING)) {
1793                 if (info->flags & ASYNC_CLOSI    1784                 if (info->flags & ASYNC_CLOSING)
1794                         interruptible_sleep_o    1785                         interruptible_sleep_on(&info->close_wait);
1795 #ifdef SERIAL_DO_RESTART                         1786 #ifdef SERIAL_DO_RESTART
1796                 return ((info->flags & ASYNC_    1787                 return ((info->flags & ASYNC_HUP_NOTIFY) ?
1797                         -EAGAIN : -ERESTARTSY    1788                         -EAGAIN : -ERESTARTSYS);
1798 #else                                            1789 #else
1799                 return -EAGAIN;                  1790                 return -EAGAIN;
1800 #endif                                           1791 #endif
1801         }                                        1792         }
1802                                                  1793 
1803         /*                                       1794         /*
1804          * Start up serial port                  1795          * Start up serial port
1805          */                                      1796          */
1806         retval = startup(info);                  1797         retval = startup(info);
1807         if (retval) {                            1798         if (retval) {
1808                 return retval;                   1799                 return retval;
1809         }                                        1800         }
1810                                                  1801 
1811         retval = block_til_ready(tty, filp, i    1802         retval = block_til_ready(tty, filp, info);
1812         if (retval) {                            1803         if (retval) {
1813 #ifdef SERIAL_DEBUG_OPEN                         1804 #ifdef SERIAL_DEBUG_OPEN
1814                 printk("rs_open returning aft    1805                 printk("rs_open returning after block_til_ready with %d\n",
1815                        retval);                  1806                        retval);
1816 #endif                                           1807 #endif
1817                 return retval;                   1808                 return retval;
1818         }                                        1809         }
1819                                                  1810 
1820 #ifdef SERIAL_DEBUG_OPEN                         1811 #ifdef SERIAL_DEBUG_OPEN
1821         printk("rs_open %s successful...", tt    1812         printk("rs_open %s successful...", tty->name);
1822 #endif                                           1813 #endif
1823         return 0;                                1814         return 0;
1824 }                                                1815 }
1825                                                  1816 
1826 /*                                               1817 /*
1827  * /proc fs routines....                         1818  * /proc fs routines....
1828  */                                              1819  */
1829                                                  1820 
1830 static inline void line_info(struct seq_file  !! 1821 static inline int line_info(char *buf, struct serial_state *state)
1831 {                                                1822 {
1832         struct async_struct *info = state->in    1823         struct async_struct *info = state->info, scr_info;
1833         char    stat_buf[30], control, status    1824         char    stat_buf[30], control, status;
                                                   >> 1825         int     ret;
1834         unsigned long flags;                     1826         unsigned long flags;
1835                                                  1827 
1836         seq_printf(m, "%d: uart:amiga_builtin !! 1828         ret = sprintf(buf, "%d: uart:amiga_builtin",state->line);
1837                                                  1829 
1838         /*                                       1830         /*
1839          * Figure out the current RS-232 line    1831          * Figure out the current RS-232 lines
1840          */                                      1832          */
1841         if (!info) {                             1833         if (!info) {
1842                 info = &scr_info;       /* Th    1834                 info = &scr_info;       /* This is just for serial_{in,out} */
1843                                                  1835 
1844                 info->magic = SERIAL_MAGIC;      1836                 info->magic = SERIAL_MAGIC;
1845                 info->flags = state->flags;      1837                 info->flags = state->flags;
1846                 info->quot = 0;                  1838                 info->quot = 0;
1847                 info->tty = NULL;                1839                 info->tty = NULL;
1848         }                                        1840         }
1849         local_irq_save(flags);                   1841         local_irq_save(flags);
1850         status = ciab.pra;                       1842         status = ciab.pra;
1851         control = info ? info->MCR : status;     1843         control = info ? info->MCR : status;
1852         local_irq_restore(flags);                1844         local_irq_restore(flags);
1853                                                  1845 
1854         stat_buf[0] = 0;                         1846         stat_buf[0] = 0;
1855         stat_buf[1] = 0;                         1847         stat_buf[1] = 0;
1856         if(!(control & SER_RTS))                 1848         if(!(control & SER_RTS))
1857                 strcat(stat_buf, "|RTS");        1849                 strcat(stat_buf, "|RTS");
1858         if(!(status & SER_CTS))                  1850         if(!(status & SER_CTS))
1859                 strcat(stat_buf, "|CTS");        1851                 strcat(stat_buf, "|CTS");
1860         if(!(control & SER_DTR))                 1852         if(!(control & SER_DTR))
1861                 strcat(stat_buf, "|DTR");        1853                 strcat(stat_buf, "|DTR");
1862         if(!(status & SER_DSR))                  1854         if(!(status & SER_DSR))
1863                 strcat(stat_buf, "|DSR");        1855                 strcat(stat_buf, "|DSR");
1864         if(!(status & SER_DCD))                  1856         if(!(status & SER_DCD))
1865                 strcat(stat_buf, "|CD");         1857                 strcat(stat_buf, "|CD");
1866                                                  1858 
1867         if (info->quot) {                        1859         if (info->quot) {
1868                 seq_printf(m, " baud:%d", sta !! 1860                 ret += sprintf(buf+ret, " baud:%d",
                                                   >> 1861                                state->baud_base / info->quot);
1869         }                                        1862         }
1870                                                  1863 
1871         seq_printf(m, " tx:%d rx:%d", state-> !! 1864         ret += sprintf(buf+ret, " tx:%d rx:%d",
                                                   >> 1865                       state->icount.tx, state->icount.rx);
1872                                                  1866 
1873         if (state->icount.frame)                 1867         if (state->icount.frame)
1874                 seq_printf(m, " fe:%d", state !! 1868                 ret += sprintf(buf+ret, " fe:%d", state->icount.frame);
1875                                                  1869 
1876         if (state->icount.parity)                1870         if (state->icount.parity)
1877                 seq_printf(m, " pe:%d", state !! 1871                 ret += sprintf(buf+ret, " pe:%d", state->icount.parity);
1878                                                  1872 
1879         if (state->icount.brk)                   1873         if (state->icount.brk)
1880                 seq_printf(m, " brk:%d", stat !! 1874                 ret += sprintf(buf+ret, " brk:%d", state->icount.brk);
1881                                                  1875 
1882         if (state->icount.overrun)               1876         if (state->icount.overrun)
1883                 seq_printf(m, " oe:%d", state !! 1877                 ret += sprintf(buf+ret, " oe:%d", state->icount.overrun);
1884                                                  1878 
1885         /*                                       1879         /*
1886          * Last thing is the RS-232 status li    1880          * Last thing is the RS-232 status lines
1887          */                                      1881          */
1888         seq_printf(m, " %s\n", stat_buf+1);   !! 1882         ret += sprintf(buf+ret, " %s\n", stat_buf+1);
                                                   >> 1883         return ret;
1889 }                                                1884 }
1890                                                  1885 
1891 static int rs_proc_show(struct seq_file *m, v !! 1886 static int rs_read_proc(char *page, char **start, off_t off, int count,
                                                   >> 1887                         int *eof, void *data)
1892 {                                                1888 {
1893         seq_printf(m, "serinfo:1.0 driver:%s\ !! 1889         int len = 0, l;
1894         line_info(m, &rs_table[0]);           !! 1890         off_t   begin = 0;
1895         return 0;                             << 
1896 }                                             << 
1897                                                  1891 
1898 static int rs_proc_open(struct inode *inode,  !! 1892         len += sprintf(page, "serinfo:1.0 driver:%s\n", serial_version);
1899 {                                             !! 1893         l = line_info(page + len, &rs_table[0]);
1900         return single_open(file, rs_proc_show !! 1894         len += l;
                                                   >> 1895         if (len+begin > off+count)
                                                   >> 1896           goto done;
                                                   >> 1897         if (len+begin < off) {
                                                   >> 1898           begin += len;
                                                   >> 1899           len = 0;
                                                   >> 1900         }
                                                   >> 1901         *eof = 1;
                                                   >> 1902 done:
                                                   >> 1903         if (off >= len+begin)
                                                   >> 1904                 return 0;
                                                   >> 1905         *start = page + (off-begin);
                                                   >> 1906         return ((count < begin+len-off) ? count : begin+len-off);
1901 }                                                1907 }
1902                                                  1908 
1903 static const struct file_operations rs_proc_f << 
1904         .owner          = THIS_MODULE,        << 
1905         .open           = rs_proc_open,       << 
1906         .read           = seq_read,           << 
1907         .llseek         = seq_lseek,          << 
1908         .release        = single_release,     << 
1909 };                                            << 
1910                                               << 
1911 /*                                               1909 /*
1912  * ------------------------------------------    1910  * ---------------------------------------------------------------------
1913  * rs_init() and friends                         1911  * rs_init() and friends
1914  *                                               1912  *
1915  * rs_init() is called at boot-time to initia    1913  * rs_init() is called at boot-time to initialize the serial driver.
1916  * ------------------------------------------    1914  * ---------------------------------------------------------------------
1917  */                                              1915  */
1918                                                  1916 
1919 /*                                               1917 /*
1920  * This routine prints out the appropriate se    1918  * This routine prints out the appropriate serial driver version
1921  * number, and identifies which options were     1919  * number, and identifies which options were configured into this
1922  * driver.                                       1920  * driver.
1923  */                                              1921  */
1924 static void show_serial_version(void)            1922 static void show_serial_version(void)
1925 {                                                1923 {
1926         printk(KERN_INFO "%s version %s\n", s    1924         printk(KERN_INFO "%s version %s\n", serial_name, serial_version);
1927 }                                                1925 }
1928                                                  1926 
1929                                                  1927 
1930 static const struct tty_operations serial_ops    1928 static const struct tty_operations serial_ops = {
1931         .open = rs_open,                         1929         .open = rs_open,
1932         .close = rs_close,                       1930         .close = rs_close,
1933         .write = rs_write,                       1931         .write = rs_write,
1934         .put_char = rs_put_char,                 1932         .put_char = rs_put_char,
1935         .flush_chars = rs_flush_chars,           1933         .flush_chars = rs_flush_chars,
1936         .write_room = rs_write_room,             1934         .write_room = rs_write_room,
1937         .chars_in_buffer = rs_chars_in_buffer    1935         .chars_in_buffer = rs_chars_in_buffer,
1938         .flush_buffer = rs_flush_buffer,         1936         .flush_buffer = rs_flush_buffer,
1939         .ioctl = rs_ioctl,                       1937         .ioctl = rs_ioctl,
1940         .throttle = rs_throttle,                 1938         .throttle = rs_throttle,
1941         .unthrottle = rs_unthrottle,             1939         .unthrottle = rs_unthrottle,
1942         .set_termios = rs_set_termios,           1940         .set_termios = rs_set_termios,
1943         .stop = rs_stop,                         1941         .stop = rs_stop,
1944         .start = rs_start,                       1942         .start = rs_start,
1945         .hangup = rs_hangup,                     1943         .hangup = rs_hangup,
1946         .break_ctl = rs_break,                   1944         .break_ctl = rs_break,
1947         .send_xchar = rs_send_xchar,             1945         .send_xchar = rs_send_xchar,
1948         .wait_until_sent = rs_wait_until_sent    1946         .wait_until_sent = rs_wait_until_sent,
                                                   >> 1947         .read_proc = rs_read_proc,
1949         .tiocmget = rs_tiocmget,                 1948         .tiocmget = rs_tiocmget,
1950         .tiocmset = rs_tiocmset,                 1949         .tiocmset = rs_tiocmset,
1951         .proc_fops = &rs_proc_fops,           << 
1952 };                                               1950 };
1953                                                  1951 
1954 /*                                               1952 /*
1955  * The serial driver boot-time initialization    1953  * The serial driver boot-time initialization code!
1956  */                                              1954  */
1957 static int __init rs_init(void)                  1955 static int __init rs_init(void)
1958 {                                                1956 {
1959         unsigned long flags;                     1957         unsigned long flags;
1960         struct serial_state * state;             1958         struct serial_state * state;
1961         int error;                            << 
1962                                                  1959 
1963         if (!MACH_IS_AMIGA || !AMIGAHW_PRESEN    1960         if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_SERIAL))
1964                 return -ENODEV;                  1961                 return -ENODEV;
1965                                                  1962 
1966         serial_driver = alloc_tty_driver(1);     1963         serial_driver = alloc_tty_driver(1);
1967         if (!serial_driver)                      1964         if (!serial_driver)
1968                 return -ENOMEM;                  1965                 return -ENOMEM;
1969                                                  1966 
1970         /*                                       1967         /*
1971          *  We request SERDAT and SERPER only    1968          *  We request SERDAT and SERPER only, because the serial registers are
1972          *  too spreaded over the custom regi    1969          *  too spreaded over the custom register space
1973          */                                      1970          */
1974         if (!request_mem_region(CUSTOM_PHYSAD !! 1971         if (!request_mem_region(CUSTOM_PHYSADDR+0x30, 4, "amiserial [Paula]"))
1975                                 "amiserial [P !! 1972                 return -EBUSY;
1976                 error = -EBUSY;               << 
1977                 goto fail_put_tty_driver;     << 
1978         }                                     << 
1979                                                  1973 
1980         IRQ_ports = NULL;                        1974         IRQ_ports = NULL;
1981                                                  1975 
1982         show_serial_version();                   1976         show_serial_version();
1983                                                  1977 
1984         /* Initialize the tty_driver structur    1978         /* Initialize the tty_driver structure */
1985                                                  1979 
1986         serial_driver->owner = THIS_MODULE;      1980         serial_driver->owner = THIS_MODULE;
1987         serial_driver->driver_name = "amiseri    1981         serial_driver->driver_name = "amiserial";
1988         serial_driver->name = "ttyS";            1982         serial_driver->name = "ttyS";
1989         serial_driver->major = TTY_MAJOR;        1983         serial_driver->major = TTY_MAJOR;
1990         serial_driver->minor_start = 64;         1984         serial_driver->minor_start = 64;
1991         serial_driver->type = TTY_DRIVER_TYPE    1985         serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
1992         serial_driver->subtype = SERIAL_TYPE_    1986         serial_driver->subtype = SERIAL_TYPE_NORMAL;
1993         serial_driver->init_termios = tty_std    1987         serial_driver->init_termios = tty_std_termios;
1994         serial_driver->init_termios.c_cflag =    1988         serial_driver->init_termios.c_cflag =
1995                 B9600 | CS8 | CREAD | HUPCL |    1989                 B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1996         serial_driver->flags = TTY_DRIVER_REA    1990         serial_driver->flags = TTY_DRIVER_REAL_RAW;
1997         tty_set_operations(serial_driver, &se    1991         tty_set_operations(serial_driver, &serial_ops);
1998                                                  1992 
1999         error = tty_register_driver(serial_dr !! 1993         if (tty_register_driver(serial_driver))
2000         if (error)                            !! 1994                 panic("Couldn't register serial driver\n");
2001                 goto fail_release_mem_region; << 
2002                                                  1995 
2003         state = rs_table;                        1996         state = rs_table;
2004         state->magic = SSTATE_MAGIC;             1997         state->magic = SSTATE_MAGIC;
2005         state->port = (int)&custom.serdatr; /    1998         state->port = (int)&custom.serdatr; /* Just to give it a value */
2006         state->line = 0;                         1999         state->line = 0;
2007         state->custom_divisor = 0;               2000         state->custom_divisor = 0;
2008         state->close_delay = 5*HZ/10;            2001         state->close_delay = 5*HZ/10;
2009         state->closing_wait = 30*HZ;             2002         state->closing_wait = 30*HZ;
2010         state->icount.cts = state->icount.dsr    2003         state->icount.cts = state->icount.dsr = 
2011           state->icount.rng = state->icount.d    2004           state->icount.rng = state->icount.dcd = 0;
2012         state->icount.rx = state->icount.tx =    2005         state->icount.rx = state->icount.tx = 0;
2013         state->icount.frame = state->icount.p    2006         state->icount.frame = state->icount.parity = 0;
2014         state->icount.overrun = state->icount    2007         state->icount.overrun = state->icount.brk = 0;
2015                                                  2008 
2016         printk(KERN_INFO "ttyS%d is the amiga    2009         printk(KERN_INFO "ttyS%d is the amiga builtin serial port\n",
2017                        state->line);             2010                        state->line);
2018                                                  2011 
2019         /* Hardware set up */                    2012         /* Hardware set up */
2020                                                  2013 
2021         state->baud_base = amiga_colorclock;     2014         state->baud_base = amiga_colorclock;
2022         state->xmit_fifo_size = 1;               2015         state->xmit_fifo_size = 1;
2023                                                  2016 
2024         local_irq_save(flags);                   2017         local_irq_save(flags);
2025                                                  2018 
2026         /* set ISRs, and then disable the rx     2019         /* set ISRs, and then disable the rx interrupts */
2027         error = request_irq(IRQ_AMIGA_TBE, se !! 2020         request_irq(IRQ_AMIGA_TBE, ser_tx_int, 0, "serial TX", state);
2028         if (error)                            !! 2021         request_irq(IRQ_AMIGA_RBF, ser_rx_int, IRQF_DISABLED, "serial RX", state);
2029                 goto fail_unregister;         << 
2030                                               << 
2031         error = request_irq(IRQ_AMIGA_RBF, se << 
2032                             "serial RX", stat << 
2033         if (error)                            << 
2034                 goto fail_free_irq;           << 
2035                                                  2022 
2036         /* turn off Rx and Tx interrupts */      2023         /* turn off Rx and Tx interrupts */
2037         custom.intena = IF_RBF | IF_TBE;         2024         custom.intena = IF_RBF | IF_TBE;
2038         mb();                                    2025         mb();
2039                                                  2026 
2040         /* clear any pending interrupt */        2027         /* clear any pending interrupt */
2041         custom.intreq = IF_RBF | IF_TBE;         2028         custom.intreq = IF_RBF | IF_TBE;
2042         mb();                                    2029         mb();
2043                                                  2030 
2044         local_irq_restore(flags);                2031         local_irq_restore(flags);
2045                                                  2032 
2046         /*                                       2033         /*
2047          * set the appropriate directions for    2034          * set the appropriate directions for the modem control flags,
2048          * and clear RTS and DTR                 2035          * and clear RTS and DTR
2049          */                                      2036          */
2050         ciab.ddra |= (SER_DTR | SER_RTS);   /    2037         ciab.ddra |= (SER_DTR | SER_RTS);   /* outputs */
2051         ciab.ddra &= ~(SER_DCD | SER_CTS | SE    2038         ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR);  /* inputs */
2052                                                  2039 
2053         return 0;                                2040         return 0;
2054                                               << 
2055 fail_free_irq:                                << 
2056         free_irq(IRQ_AMIGA_TBE, state);       << 
2057 fail_unregister:                              << 
2058         tty_unregister_driver(serial_driver); << 
2059 fail_release_mem_region:                      << 
2060         release_mem_region(CUSTOM_PHYSADDR+0x << 
2061 fail_put_tty_driver:                          << 
2062         put_tty_driver(serial_driver);        << 
2063         return error;                         << 
2064 }                                                2041 }
2065                                                  2042 
2066 static __exit void rs_exit(void)                 2043 static __exit void rs_exit(void) 
2067 {                                                2044 {
2068         int error;                               2045         int error;
2069         struct async_struct *info = rs_table[    2046         struct async_struct *info = rs_table[0].info;
2070                                                  2047 
2071         /* printk("Unloading %s: version %s\n    2048         /* printk("Unloading %s: version %s\n", serial_name, serial_version); */
2072         tasklet_kill(&info->tlet);               2049         tasklet_kill(&info->tlet);
2073         if ((error = tty_unregister_driver(se    2050         if ((error = tty_unregister_driver(serial_driver)))
2074                 printk("SERIAL: failed to unr    2051                 printk("SERIAL: failed to unregister serial driver (%d)\n",
2075                        error);                   2052                        error);
2076         put_tty_driver(serial_driver);           2053         put_tty_driver(serial_driver);
2077                                                  2054 
2078         if (info) {                              2055         if (info) {
2079           rs_table[0].info = NULL;               2056           rs_table[0].info = NULL;
2080           kfree(info);                           2057           kfree(info);
2081         }                                        2058         }
2082                                                  2059 
2083         free_irq(IRQ_AMIGA_TBE, rs_table);    << 
2084         free_irq(IRQ_AMIGA_RBF, rs_table);    << 
2085                                               << 
2086         release_mem_region(CUSTOM_PHYSADDR+0x    2060         release_mem_region(CUSTOM_PHYSADDR+0x30, 4);
2087 }                                                2061 }
2088                                                  2062 
2089 module_init(rs_init)                             2063 module_init(rs_init)
2090 module_exit(rs_exit)                             2064 module_exit(rs_exit)
2091                                                  2065 
2092                                                  2066 
2093 #if defined(CONFIG_SERIAL_CONSOLE) && !define << 
2094                                               << 
2095 /*                                               2067 /*
2096  * ------------------------------------------    2068  * ------------------------------------------------------------
2097  * Serial console driver                         2069  * Serial console driver
2098  * ------------------------------------------    2070  * ------------------------------------------------------------
2099  */                                              2071  */
                                                   >> 2072 #ifdef CONFIG_SERIAL_CONSOLE
2100                                                  2073 
2101 static void amiga_serial_putc(char c)            2074 static void amiga_serial_putc(char c)
2102 {                                                2075 {
2103         custom.serdat = (unsigned char)c | 0x    2076         custom.serdat = (unsigned char)c | 0x100;
2104         while (!(custom.serdatr & 0x2000))       2077         while (!(custom.serdatr & 0x2000))
2105                 barrier();                       2078                 barrier();
2106 }                                                2079 }
2107                                                  2080 
2108 /*                                               2081 /*
2109  *      Print a string to the serial port try    2082  *      Print a string to the serial port trying not to disturb
2110  *      any possible real use of the port...     2083  *      any possible real use of the port...
2111  *                                               2084  *
2112  *      The console must be locked when we ge    2085  *      The console must be locked when we get here.
2113  */                                              2086  */
2114 static void serial_console_write(struct conso    2087 static void serial_console_write(struct console *co, const char *s,
2115                                 unsigned coun    2088                                 unsigned count)
2116 {                                                2089 {
2117         unsigned short intena = custom.intena    2090         unsigned short intena = custom.intenar;
2118                                                  2091 
2119         custom.intena = IF_TBE;                  2092         custom.intena = IF_TBE;
2120                                                  2093 
2121         while (count--) {                        2094         while (count--) {
2122                 if (*s == '\n')                  2095                 if (*s == '\n')
2123                         amiga_serial_putc('\r    2096                         amiga_serial_putc('\r');
2124                 amiga_serial_putc(*s++);         2097                 amiga_serial_putc(*s++);
2125         }                                        2098         }
2126                                                  2099 
2127         custom.intena = IF_SETCLR | (intena &    2100         custom.intena = IF_SETCLR | (intena & IF_TBE);
2128 }                                                2101 }
2129                                                  2102 
2130 static struct tty_driver *serial_console_devi    2103 static struct tty_driver *serial_console_device(struct console *c, int *index)
2131 {                                                2104 {
2132         *index = 0;                              2105         *index = 0;
2133         return serial_driver;                    2106         return serial_driver;
2134 }                                                2107 }
2135                                                  2108 
2136 static struct console sercons = {                2109 static struct console sercons = {
2137         .name =         "ttyS",                  2110         .name =         "ttyS",
2138         .write =        serial_console_write,    2111         .write =        serial_console_write,
2139         .device =       serial_console_device    2112         .device =       serial_console_device,
2140         .flags =        CON_PRINTBUFFER,         2113         .flags =        CON_PRINTBUFFER,
2141         .index =        -1,                      2114         .index =        -1,
2142 };                                               2115 };
2143                                                  2116 
2144 /*                                               2117 /*
2145  *      Register console.                        2118  *      Register console.
2146  */                                              2119  */
2147 static int __init amiserial_console_init(void    2120 static int __init amiserial_console_init(void)
2148 {                                                2121 {
2149         register_console(&sercons);              2122         register_console(&sercons);
2150         return 0;                                2123         return 0;
2151 }                                                2124 }
2152 console_initcall(amiserial_console_init);        2125 console_initcall(amiserial_console_init);
2153                                               !! 2126 #endif
2154 #endif /* CONFIG_SERIAL_CONSOLE && !MODULE */ << 
2155                                                  2127 
2156 MODULE_LICENSE("GPL");                           2128 MODULE_LICENSE("GPL");
2157                                                  2129 
  This page was automatically generated by the LXR engine.